動く人形キボウちゃんを支える技術


動く人形キボウちゃん(以後キボウちゃん)とは現在 Segawa が開発中の機械が内蔵された人形です。ソフトウェアは OpenSiv3D を基本として、動きの情報の入力、関節角度の計算、サーボモータへの出力の三段階で構成されています。これから各段階で使用したライブラリ等について紹介します。

入力

動きの情報の入力として、モーションキャプチャのトラッキングデータを活用します。
現在は OpenVR によってトラッキングデータを取得しています。
https://github.com/ValveSoftware/openvr

OpenSiv3D からかんたんに使えるように OpenVRManager と呼ばれるラッパーを作りました。

//VR Device
OpenVRDevice device;
device.init();

//略

if(device.isActive())
{
    device.update();
    targetPos1 = GetTargetPos(device.getRightControllerPos());

//略

また、MMD のモーションデータ(.vmd)の再生や Switch のコントローラ、ゲームパッドにも対応しています。
近いうち OpenSiv3D に LeapMotion、Kinect、Realsense、顔認識が実装されると思われますので基本全てに対応します。

処理

リンク機構のシミュレーションや逆運動学 (IK) 処理には線形代数ライブラリ Eigen を使用しています。
目標とする姿勢を入力すると、それを実現する角度を算出する処理を実装しました。
http://eigen.tuxfamily.org/index.php?title=Main_Page

出力

サーボモータはすべて Robotis の Dynamixel シリーズを用いているため、サーボモータへの角度制御には Dynamixel SDK を使用しています。
https://github.com/ROBOTIS-GIT/DynamixelSDK

これも OpenSiv3D からかんたんに使えるように DynamixelManager と呼ばれるラッパーを作りました。

//Dynamixel
Dynamixel dyna1;
dyna1.connectPort(U"COM3", Dynamixel::BaudRate::Rate1000000, ham::ProtocolType::Protocol2);

//略

dyna1.setWriteRequest(ham::XL320_GoalPosition(4), GetXL320ValueFromRad(motorAngles1.x));
dyna1.sendData();

おわりに

今回紹介した機能は将来的に OpenSiv3D の機能の一部として実装される予定です。
キボウちゃんのプロジェクトは、小規模の量産と普及を一つの目標として取り組んでいます。

また、本プロジェクトは現在は個人で進めており、応援してくださる方を募集しています。
よろしくおねがいします。
https://www.pixiv.net/fanbox/creator/44998054
(最新情報もこちらで公開しています。)