ロボゼロをコンピュータ制御してみる その2
2012年9月14日


 前回はロボゼロをコンピュータ制御する前段階として付属のリモコンで制御できるか実験をしてみました。
 今回は人間が操作するのではなくパソコンでロボゼロを直接制御してみたいと思います。

・カメラによる位置検出

 ボールの位置とロボゼロの動きはWebカメラでとらえてその画像を解析します。



 Webカメラをロボゼロの上部に取り付けます。  カメラのアングルがあると高さによってカメラに映る位置がずれてしまうのでなるべく真上に取り付けます。
 カメラ画像はライブ画像として制御プログラムに表示されます。

・ボールの検出

 ボールの位置はパターンマッチという方法で画像から見つけ出します。
 そのためにまずボールの形状を制御プログラムに学習させます。



 制御プログラムの学習機能を使って表示されているカメラのライブ画像のボールをマウスでクリックします。
 ここで学習したパターンはデータに保存されますので次回からはこの作業は要りません。

・キャリブレーション

 ボールの位置を検出できるようになりましたが、この位置情報に対してロボゼロを制御する訳ですが、ロボゼロの動きとカメラ画像の関係を定義してやる必要があります。
 キャリブレーション(較正)は測定器の入力と出力の値の関係付けを行う作業で、タブレットなどでポイントした位置と実際に画面上でクリックされる位置関係もキャリブレーションを行って調整します。

 今回の場合はロボゼロに動きに対してカメラのどの位置(座標)が反応するのかを測定します。
 次の3点でロボゼロの手を動かしてその位置を検出します。

  正面で腕を一番縮めた時の手の位置
  正面で腕を一番伸ばした時の手の位置
  60度回転させて腕を一番伸ばした時の手の位置

 次の方法でロボゼロの回転軸を見つけ出します。



 腕を一番伸ばした状態で正面と60度回転させた2点で手の位置を測定します。
 この2点を結んだ線を一辺とする正三角形を描きます。
 そうするとこの辺の対角の頂点が回転軸となるはずです。
 回転軸が分かれば腕を一番伸ばした時の手の位置でロボゼロ自体の角度も計算できます。



 回転軸と腕を縮めた時と伸ばした時の手の距離を計測しておきます。
 ボールと回転軸の距離とこの2点の距離の割合によってロボゼロの腕のサーボの値を計算します。

 以上の測定結果よりロボゼロの稼働範囲を画面上に表示します。



 回転軸を中心に腕を縮めた時と伸ばした時の距離を半径とする同心円を描きます。
 腰の回転は左右90度を稼働範囲とします。

・ロボゼロの制御

 ロボゼロの制御はシリアルケーブルを通じて直接ロボゼロ本体と通信して行います。
 ロボゼロの通信コマンドはMiconoさんのサイトを参考にさせていただきました。(毎度お世話になっています)



 ボールを検出するとロボゼロが動き出すようにプログラミングしてあります。
 ボールの中心と回転軸との角度と距離をカメラ画像より計算します。
 ロボゼロ自体の角度はキャリブレーションで計算していますのでボール位置との角度の差からロボゼロの回転角度が求まります。
 ロボゼロの回転はサーボ19で行います。
 計算した角度でロボゼロを回転させます。

 手の距離はサーボ21とサーボ23の角度の組み合わせで腕を縮めたり伸ばしたりして制御します。
 腕を縮めた時と伸ばした時の回転軸からの距離はキャリブレーションで計測してあります。
 腕を縮めた時と伸ばした時の各サーボの値は予め定義してありますので、ボールの中心の回転軸の距離によりそれぞれのサーボの角度の値が計算で求められます。

 ボールを握って持ち上げ所定の位置に落とす一連の動作は前回のUFOキャッチャーと同じく予めプログラムしてあります。



 プログラムの実行動画です。

     

 キャリブレーションで測定した手の位置で計算するとボールをうまくつかめないため角度と距離を少し補正しています。
 またボールをしっかりとつかむとボールを放した時にボールが手から離れなくなるので少しずらした位置で調整しています。

目次に戻る