以下のようなテーマに取り組む機会があった。
『家庭用ロボットが自動で物体を認識して片付けできるようにすること』
このテーマをクリアするために、以下のような要点での実装を行った。
- ディープラーニングフレームワークのYOLOを用いて対象物を検出
- 正投影を用いて物体の相対位置・物体の大きさを推定
- 動的計画法を用いて物体に最速経路で接近
- 移動中は、カルマンフィルターを用いて物体との相対位置を更新
- DCモーターで作ったアームの電流値変動から物体の把持・挙上の状況を認識
- 以上をRobot OS(ROS)を用いて統合的に制御
各点について工夫した点、課題等を列挙しておく。
1. ディープラーニングYOLOを用いた対象物の検出
当時最新のフレームワークであったことと、Ubuntu 12 Trustyとの互換性からYOLOが採用された。YOLOとは、パフォーマンス(FPS)に優れた画像検出のDNNで、通常You Only Live Onceを意味するYOLOに、You Only Look Onceが当て字されている。Cベースのdarknetというフレームワーク上に構築されているため、CaffeやTensorflowなどのライブラリに依存しない。
YOLOの対象物の学習の上では、ロボット視点で撮影された対象物の写真が数百枚ほど必要となる。200枚ほどでも対象物が明確、類似物がない環境であれば検出は可能であった。YOLOのトレーニング方法については、公式のWebページに記載されている。
ロボットにおける物体検出の難点は、ロボットが常時動いていることである。そのため、物体を色んな角度、明るさ、背景、障害物といった条件下で検出する必要がある。
そこで検出率を上げるため、取り付けられた2台のカメラ両方の映像から対象物を検出し、統計的処理により物体の存在確率を推定した。具体的には、YOLOで検出した確率(評価値)を推定位置における位置の分散とした。
また今回はTX1搭載の機体であったためYOLOの並列稼働に耐えたが、ロボットの処理能力がそれ相応に求められるので注意が必要である。
2. 正投影を用いた物体の相対位置・大きさの推定
ロボット上のカメラの位置・高さ・角度が固定されていたため、正投影で物体の位置の取得が可能であった。具体的にはピクセル上の位置を、カメラ内座標、グローバル座標、ロボットとの相対座標に順次行列演算をしていくだけである。
また物体の位置情報が推定されることで、物体検出ボックスのサイズから物体の高さ・横幅の推定が可能である。その情報を物体の把持位置に利用した。
正投影においては、ピクセル上の少しの数値のずれで大きく物体の推定位置が変わってしまう。そのため、カメラのキャリブレーションが重要になる。これは単に歪み係数等の内部パラーメーターだけでなく、2つのカメラ間の距離、焦点軸の仰角・方位角をキャリブレーションする必要がある。(ここは手計算で行った。)
また正投影以外にも、赤外線レーダー、LIDAR、三角測量法、depthマップの利用等の方法が考えられた。しかし、赤外線レーダーでは推定距離の分解能が低く大きさの推定できないこと、LIDARでは遠距離においては他の障害物との区別がつかないこと、depthマップは床面という色や形状の区別がなくdepthマップが作成しにくい環境であったことから採用をやめた。三角測量法を用いれば物体との距離の精度が上がると思われるが、十分近距離に接近してからLIDARで位置推定に切り替えるほうが容易だと考え、正射影とLIDARをそれぞれ遠距離・近距離によって使い分けることにした。
3. 動的計画法を用いた対象物への接近
(更新予定)
4. カルマンフィルターを用いた相対位置の更新
カメラでの物体検出の結果は、必ずしも正確でない。検出ボックスがずれていたり、重複して検出されていたり、想定外の場所に誤検知も発生する。そのため全ての物体検出結果をそのまま利用していては、ロボットの行き先が定まらない。そこで対象物の位置推定にカルマンフィルターを用いた。カルマンフィルターとは、誤差のある観測値を用いてある動的システムの状態を推定あるいは制御するための、無限インパルス応答フィルターの一種であり、マルコフモデルと過程して線形での推定状態の更新を行っていく。
ロボットではodometryやtfといった自己位置に関する情報が使用可能であることが多い。その位置情報の変化分で想定される物体との相対位置を事前状態、新たな検出を観測値として更新したものを事後状態として、対象物の位置が確率分布で表されるようにした。
また2つのカメラからの検出結果の統合もカルマンフィルターによって行った。
5. DCモーターの電流値を用いた把持状態の認識
物体が所定の位置に接近したあと実際に物体を掴むアームは、人の腕と同じように2関節2本のアームで構成となった。サーボとセンサーを位置制御を行うのが通常であるが、実装の容易性・軽量化からDCモーターが採択された。しかしそこで課題になるのが、いかにDCモーターで物体の把持状況の認識を正確に行うかである。
エンコーダーとモーターコントローラーを用いることでモーターの位置や電流値が取得可能である。そこで、この電流値の通常時と物体把持時の分布に関するデータを収集する。そこから統計的に物体把持の状態を区別する電流値と最小時間を算出し、それを閾値を超えるものを把持状態とした。(今考えると機械学習でその他の特徴量も含めた分類問題とすると、より正確な状態推定が可能であったかもしれない。)
ただし実用上の難点として、必ずしも想定されたアームの挙動とならず、思いも寄らぬ負荷がかかることがあることである。両アームの位置がずれるために、片アームに極端に強い負荷がかかったり、物体の形状や置き方による違いもある。それらをカバーするには、制御の機構のみならずハードウェア設計の要素も大きく寄与してくると思われる。
6. Robot OS(ROS)を用いた統合的な制御
Robot OSとは、オープンソースのロボット開発用のミドルウェアであり、世界的に最も標準なプラットフォームとなっている。ROSを用いることで、上記の内容は、自己位置情報、カメラ情報、LIDAR、アーム等多岐にわたるが、ROSを用いることで、ノードやトピック、メッセージといった統一された規格でそれぞれの機能のインタラクションを記述することが可能となる。
またYOLOについては、すでにROSのIFが開発・公開されていた。
ROSでは別のプロセスで動くノート間の通信によってやりとりするため、リアルタイム性が問題視されることもあるが、現在はnodeletといい同プロセス内のスレッド間でやりとりさせることで高速化を行うツールも組み込まれている。
結果
(掲載可否の確認中。)
課題
実装の中で出てきた課題を列挙しておく。
・ディープラーラニングを用いるのであれば、物体の位置や大きさに止まらず、重さの推定やそれによる把持位置の調整、適切な把持方向の調整などに改善の余地が大きい。今盛んに研究が進んでいるロボットラーニングの領域であろう。
・家庭内という実用環境との乖離。突出した2本腕を持っているとなると、衝突・破損も起きやすい。対象物周囲の環境も様々な悪条件が発生しうる。必ずしも2本腕アームである必要はなく、家庭という環境に沿ったアームのデザイン根本から考慮の余地が大いにある。