センサとして内蔵するのは、2足歩行ロボットの足裏の接地センサにしようとして、買い置きが
比較的たくさんあったオムロンのD2F-Lにしました。
地面に積もった落ち葉とか、遠景の林とか、林と空の境目とかに特徴点がたくさん出ました。
測定レンジよりも遠くの物については、移動計画という観点からは簡単に対象外に出来るため特に問題なさそうだと
思いました。落ち葉とか、地面の上に出ている木の枝の陰等は、場合によってはロボットがスタックしてしまい、避けなければ
ならない物もあるので、どうするか検討が必要だと思いました。
サンプルとしてここに貼りつけたシーンでは「池の柵」がうまく出ました。総合的には「まあ使える」かなと思いました。
11.04.17のところでオプティカルフローを計算するためにOpenCV1.0のcvCalcOpticalFlowPyrLK関数を使いましたが、この関数を使うときは、 前処理としてcvGoodFeaturesToTrackを見つけています。
この2週間ほどは上記を改善するため、オプティカルフローの計算の途中で使っていたcvGoodFeaturesToTrackという特徴点を見つける関数により、 見つけた特徴点の近傍だけ「面積相関」によるステレオマッチングを行い、確実に距離をとれるところだけ計算するようなプログラムを作っていました。
自分の部屋の床にロボットを置いてステレオ撮影した画面のイメージです。(クリックで拡大)写真の中のオレンジの四角が
取り出せた特徴点で、その下の横線(500mm間隔です)の中に赤丸が描いてある画面は、位置が測定できた場所を平面に投影したものです。
ついでに下のムービーはマッチング処理中のものです。写真の中を動く、水色の四角がマッチング処理中のエリアを示しています。
今回は計算が合っているか、見やすいように、VCで書いたプログラムでウェブカメラからの画像取り込み&bmpファイル 出力と、特徴点の座標のテキスト出力を行い、それらのファイルをVBで書いたプログラムに読み込み、どこを処理しているか 表示しながらマッチングと位置算出を行う構成にしました。(いつもの構成)
測定結果は三次元なので、平面に投影すると、何が何だかわかりにくいです。そこで、CADデータのソフト間移行などに 用いられるSTL形式で特徴点の位置にポリゴンを2枚出力し、StoneyDesignerという3D CADに表示して見てみました。
ムービーの中で大きな三角がロボットの位置、正方形はCADが基準平面を示すために描くグリッド、細かい三角が測定できた 特徴点です。まだ測定サンプルが少ないので何とも言えませんが、これくらいに測定できていれば、移動計画に使えそうかな〜と 思いました。
次はオプティカルフローの計算と組み合わせて、この中から移動物体の位置計測をやってみようかなと思います。
この際OpenCV2.1に切り替えようかな、と思い、Webで少し違いなどを調べてみましたが、この半年以上は開発環境の 変更作業が多くて、ロボット自体の製作があまり進まなかったので、また今度にして1.0でいくことにしました。
走行抵抗が大きい路面、小さい路面、上り坂、下り坂、速度は0.5km/h〜2km/hなどいろいろな条件で 走らせてみました。w6v3の時は部屋の中を、1〜2m程度の短い距離で、調子よく走る速度1つで動かしていたので 気がつかなかったのですが、速度が上限に近い時は、制御できる範囲が狭いので、進路がそれやすいことが表面化しました。
そこで、速度が高い時は、車輪の回転数を落とす方向を、速度が低い時は回転数を上げる方向を制御に使うように 改良しました。
その他、カーソルキーでリモコン操縦するルーチンも、速度のコントロールがより細かく出来、操縦しやすいように 改良しました。
ロボットのボディーとしては、だいたい思い通りに動くようになったので、画像認識系のプログラミングに戻ろうと思いました。
走行に関して速度制御の方は、だいたいこんなものかな〜といった感じで、動作の確認ができました。ということで 次は10mくらいづつ直線を走らせて様子を見ました。すると毎回だいぶ曲がりました。そういえば直進時に左右の 車輪のエンコーダのカウント数で同期をとるルーチンの実装がまだだったと思い出し、次はそれを作ることにしました。
PSD距離センサの方も「まあこんなものだろう」というかんじで動作しました。コンクリートの壁などは良く測定できましたが、 植え込みはあまり正しく測定できませんでした。隙間が多いのが良くないようです。
余談ですが、写真に写っている野良猫はロボットを無視していましたが、飼い主と通りがかった小型犬はロボットを非常に 怖がっていて、離れたところの飼い主に呼ばれた時に、ロボットから死角になる植え込みの向こう側を通って移動していました。 対照が面白かったです。
今は一定時間(具体的には0.3秒)の間にカウントしたパルスの数から速度を求めて、目標値との差で比例制御していますが、 これだと速度制御の分解能が低いので 別の方法も試してみようということで、ある速度ならばこのペースでパルスのカウントが進むはず・・・という、ベースカウンタ を用意し、それと実際に測定したカウント値の差で比例制御してみました。
結果は収束までの時間が長く発振ぎみな傾向でした。前のが良いやということで、元に戻しました。
2011/01/04の時と比べて、タイヤを幅が広いスパイク付の物に変えたので スリップが少なくなり、安定して走るようになりました。
走らせてみて、速度の制御がなんだかおかしいので改良しようと思いました。車輪の回転数とフィードバックループの
周期の組み合わせが良くないようです。ちなみに今日の具体的な制御周期の数値は0.1秒で、車輪のエンコーダから来るパルス
はだいたい20〜60Hzくらい、そして最高移動速度は1.8km/h程度でした。
走行の様子
システム全体(ロボットとネットブック)
ネットブックからUSB接続の有線で制御します。
芝生の上で記念写真
芝が伸び気味なので、ココはちょっと走るのは無理です・・・
輸送の様子
バイクのリアボックスにそのまま入れて持っていきました。
少し部屋の中で走らせて試したところ、目標位置でのモーター停止タイミングが左右で大きく違いました。 テストベンチにロボットを乗せて、車輪が空回りする状態で走行距離のセットを変えながら調べたところ、 例えば、1mの時と2mの時で、余計に回るほうの車輪が、余計に回る時間がそのままほぼ2倍になったので 「そういえば、ロボットのボディーを塗装する時に、ギアケース周辺の遮光用アルミフォイルを張り替えるために ギアボックスやフォトインタラプタをを外したあと、光軸調整をしてなかったっけ」と思い出し、 正しくパルスが出るように、改めて調整したところ直りました。
元のムービーは320×240の30fpsのwmvフォーマットの動画です。ここで公開しているムービーは何度も フォーマット変換がかかっているため、解像度が落ちていますが、cvCalcOpticalFlowPyrLK関数の処理 の結果、シーンの中の動く特徴点から、RGBの線分が出ているのが分かりました。
結果として、「動いているものを探す」用途に使えそうだと思いました。この処理の結果、ベクトルの配列が 得られるので、ベクトルの大きさと方向でフィルタをかけ、2値化イメージを作ってラベリングすれば、 ステレオマッチングの処理と組み合わせて、「どの程度の大きさのものが、ロボットから見てどの場所にあり、 どちらへ向けて移動している」みたいな情報が取れそうだと思いました。
その動くものを「自動車だ」と判定するような処理の実装も、トライしてみると面白そうだと思いました。
2バイト単位など、細かい単位でロボット側のPCに直につながっているマイコンから、マイコンの シリアルポート経由でつながっている別のマイコンにデータを中継させると、自分の書いた、いまH8/3664側に インストールしてあるプログラムは、RCサーボの制御信号を作るループを回すのを優先させる都合、データを 取りこぼすようになっているのを忘れていました。
下のビデオは、試しに全腕関節を加減速制御ありで動かしてみたものです。
プログラムをステップ実行しながらデバグしていて「なんか統合環境の動きが、微妙におかしくない?」と 感じたので、そろそろサービスパックが出ていそうだなということで調べてみると、出ていたので さっそくVisual Studio2010 SP1をインストールしました。これから調子を見てゆこうと思います。
移動や物体ハンドリングの基本的機能がまだ製作途中ですが、飽きてきたので、またしばらく画像処理/認識 系のプログラミングに戻ろうかと思いました。
mbedのプログラムの方は、移植にあたって大きく考え方を変えたコーディングが必要ならば 手間取るな〜と思っていましたが、ハードに直結する部分のみ変えれば同じ流れで行けそうなので 簡単でした。
その他の作業として、右腕のRCサーボのケーブルを胴体の中まで引き込みました。今回はW6v3まで 使わなかった分電基板を途中に入れて電源ケーブルをまとめたぶん、配線が少なくなってスッキリしました。
1.No.1サブCPUボードへのレベル変換IC追加
No.2サブCPUのシリアル端子の信号はRS232レベルなので、
mbed LPC1768のシリアル端子の信号レベルをRS232レベルに変換するため
No.1サブCPUボードにADM3202を追加しました。
2.ソフトの転用
UniのサブCPU用プログラムを転用し、RCサーボ制御用以外の機能を除いたものを作りました。
(元のままだとH8/3664の内蔵RAMでデバグできないサイズで不便なためです)
一応新しいプログラムなので、インストール済みだけれど未使用だったVisual C++2010Express Editionを使い始めました。
これから新しく作るプログラムはVisual Studio 2010 Express Editionで作ってゆく予定です。
スプレーはアサヒペンの「アクリルスプレー」です。色の種類は少ないですが安い
ので最近良く使っています。このサイズでだいたい200円で、感覚的にはプラモデル用に売っているスプレーの
1/7くらいの値段です。このスプレーはプラ板を侵す事もなく、適当な食いつきで使えました。
筆塗りのエリアはプラモデル用のMr.Colorを使いました。
移動ユニットも接着剤が付いているところなど、だいぶプラスチックが変色 しているので、この際こちらも塗装することにしました。移動ユニットは、移動用のモーター周辺に 遮光用のアルミフォイルをセロハンテープで貼った後がきたないので、これもキレイに溶剤でふき取り 塗装前の準備としました。
アースローバーを塗装したスプレーが残っていたので同じ黄色にしました。
タイヤを変更して元のカバーが付かなくなったので、ついでに新しくカバーも作りました。 バキュームフォームで・・・と、ちょっと思いましたが、面倒なので板で組んだ直線的デザインにしました。
正確に組みあがるように、フレームの肩周辺の開口部分はあとからルーターで切り抜きました。
かなり感じが変わりました。今度は広い場所用なので、胸部ユニットの旋回機構を省いて内部スペースを
広めにしました。
また、走行安定が良くなるように、重心も少し下げました。塗装の後で、腕を付けます。
前回の走行テストでは、タイヤのグリップがいまいちだったので、楽しい工作シリーズの「ピンスパイクタイヤ」と 交換してみました。タイヤのカバーが付かなくなりましたが、特に改造等の必要なく、取り付けることが出来ました。
どんな調子か、早速走らせてみました。走らせるにあたっては、腕と首を付けると約1kg 重量が増えるので、それを想定してバッテリーをウェイト代わりに載せて走らせました。
アスファルト、ブロック、土、刈ってある芝生で試してみました。転がり抵抗を少なくする様に 設計されている、細くて硬いゴムのスリックタイヤの割には良く走りました。意図したとおりに 出来たので、このまま進めようと思います。
アースローバーは比較的、走破性が高くて、NetBookを載せられるのは良いのですが、 持って歩くのが重く、だいたいはNetBookを搭載せずに、手で持って後ろをついて歩く 形で動かしています。それならば重い車体を使う必要も少ないので、W6の移動ユニットに アースローバーのセンサーヘッドを移して、しばらくこちらで画像認識関係のトライをしようか ・・・と考えています。
入力電源:7.2V/19.4Wh LiIon、または7.2V/5.04Wh NiMH電池
出力1(RCサーボ、走行用のDCモーター等駆動用):5V/4A Max、定常は0.6A程度
出力2(5Vマイコン等駆動用):5V/1A Max、定常は0.3A程度
出力3(3.3Vマイコン等駆動用):3.3V/1A Max、定常は0.3A程度
電源ユニット。3回目の組み立てなので、わりとすっきり出来ました。
本当は新調したいところですが、代替のステップダウンDC−DCコンバータを見つけられていないし W6の部品が寿命的にも問題なく使えるので再利用します。
速度制御中などもRCサーボが問題なく動くか確認するため、接続したままにしておきました。
mbedのpwmOutクラスがチップの機能をどう使っているのか知りませんが、今日試したことは問題 ありませんでした。簡単に置き換えが出来そうだし、拡張性や処理能力も高いので、アースローバー のマイコンをH8/3664からLPC1768に変えようかな〜と考えました。
プロミングの練習課題としては、W6の元の制御プログラムのアルゴリズムを踏襲しながら、 ターミナルソフトを経由しテンキー で前後左右へ操縦、その後、操縦機能はそのままに、車輪の回転を、1回転で止めるように制御する ようにしてみました。
インターフェイス対象はモーターコントローラーICのTA8440(1ピン単位のデジタル出力、 PWM出力機能)、基板の一部の 電源ON/OFF用のDIPリレー(ポートのドライブ能力)、車輪につけたフォトインタラプタ(1ピン単位のデジタル入力)、PSD距離センサ(A/D入力)そして、LPC1768にプログラムを 書き込むときに利用するUSB経由のシリアル通信(PCにドライバをインストールするとCOMポートとして見えるようになる)です。結果としては、全て問題なく動作しました。
新しいマイコンの使い初めで、毎回ひっかかる、チップの初期化がmbed任せなので、ちょこちょこクラス の機能確認をしながら、3時間ほどでロボットが動くところまで行きました。 マイコン以外の部分が、何年も使い慣れたロボットのハードとはいえ、あまりの簡単さに感動しました。
参考に回路図とソースコードを置いておきます。
上記の流れに沿って、今週はI/Oボード改造のための回路図を描きつつ新ロボットの移動ユニット (無限軌道式)の設計も進めました。