Bakulog

獏の夢日記的な何か。

人型じゃないロボットでも手をトラッキングすると可愛い

自分のツイートを自分でブログ記事化するやつです。

概要

こういうのをしました。

https://twitter.com/baku_dreameater/status/1043515031214669824

構成

そんなに複雑ではないです。

ちなみに「ロボットの手にカメラ相当のモノを取り付ける」という構成は、 実際の産業用ロボットでも使われています。

詳細

※ソースは本記事の時点では公開していません。 以下にあるのはコンセプトの紹介だけです。

まず大前提は以下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が無いと再現できないんですが。


  1. 固定具を3Dプリンタとかで作れたほうが確実だしカッコいいと思います。 
  2. 普通ビジュアルサーボと言う場合はもっと高速高精度なものを指すハズです。本ブログで紹介しているのは「なんちゃってビジュアルサーボ」だと思ってください。