自分のツイートを自分でブログ記事化するやつです。
概要
こういうのをしました。
https://twitter.com/baku_dreameater/status/1043515031214669824
構成
そんなに複雑ではないです。
- ロボット本体: uArm Swift
- Leap Motion→ロボットの手につける
- Unity→ソフト統合
- ふつうのWindows PC
- Leap Motionをロボットに固定するセロテープ1
ちなみに「ロボットの手にカメラ相当のモノを取り付ける」という構成は、 実際の産業用ロボットでも使われています。
詳細
※ソースは本記事の時点では公開していません。 以下にあるのはコンセプトの紹介だけです。
まず大前提は以下2点です。
- uArm SwiftはUSBのシリアル通信で制御できる
- Leap MotionはUnity上であれば簡単に扱える
uArmのUnity用ライブラリは前の記事の時点で作成済みなので、 これを使ってUnity上でアプリケーションを統合すればよくなります。
やりたいことは3ステップくらいに分かれます。これを順に繰り返せばOKです。
- Step1: uArmからロボットの現在位置を取得し、Unity座標に直す
- Step2: Leap Motionで手の位置を取得してUnity座標に直す
- Step3: 次にロボットが動く場所を計算して動かす
Step1とStep2は技術的な難所はあまりなく、単にやれば動きます。 一つだけ注意としてuArmとUnityとLeapはXYZ座標の向きが全部違うので、 ドキュメントを見つつ、実物の動きも踏まえて適宜直します。
- Unity(左手系): XYZ=右、上、前
- uArm(右手系): XYZ=前、左、上
- Leap(右手系): XYZ=右、法線方向、下
そしてStep3では移動先を決めるために以下の2ポイントを考慮します。
- ポイント1: ロボットは手の正面に向かっていってほしい
- ポイント2: ロボットにとって無理のない範囲で動いてほしい
ポイント1については、 「Leap Motionからみて手が正面からズレていたら、 ズレがなくなる方向にロボットを移動させる」 という方針で計算します。いわゆるビジュアルサーボのアプローチです。2 あえて箇条書きで書くならこうです。
- 手のひらの位置をLeap座標で取得
- 左右方向については、手が左右中央に来る(=Leap座標でXの値が0になる)よう移動
- 上下方向についても、手が上下中央に来る(=Leap座標でZの値が0になる)よう移動
ポイント2については、今回はとても簡単なアプローチとして、 ロボットの先端部が動けるエリアを円柱状の狭い範囲に制限しています。
XY
(水平面)方向は、ロボットの中心から半径15cmの円上を動くZ
(高さ)方向は、ロボットの台から5~15cmの範囲内で動く
この制限はちょっとキツすぎるので改善の余地がありますが、 「ここまで動きを制限しても結構よく動いてるように見える」 という点では知見が得られたように思います。
(※再掲) https://twitter.com/baku_dreameater/status/1043515031214669824
反響とまとめとか
「可愛い」系のコメントをいくつか頂いてます。 私としても可愛げがあると感じられることを期待していたので、 現状でそう言ってもらえると嬉しいです。
もう少し可愛くしたらソース込みで公開したいなあと思います。 …まあuArm Swiftが無いと再現できないんですが。