HAC入門編ブログ技術情報・開発日誌

HACフィールドでのテスト走行:HAC入門編 Part.8

HAC入門編
フローチャート

前回の記事では、RaspberryPiを搭載したロボットに向けた簡易的な開発環境構築について解説しました。今回の記事ではGitHubとの連携について導入する予定でしたが、一旦本題であるHACに戻り、今回行ったテスト走行について動画と共に説明を行います。

テスト走行動画

上の動画が今回行ったテスト走行です。HACのレギュレーションである黒色パネル6枚を少し縮小した4枚のパネル上をロボットが落ちずに移動し、目標であるオレンジボールに触れてから戻ってくる様子を見て取ることができます。

注)競技では、有線NG(足裏以外の接地とみなすため)なのと、スタートエリアにロボットがすべて入り2秒以上静止でタイムが有効となる。

動作計画

動画中のロボットの行動がどのように制御されているか、動作計画について解説を行っていきます。

本ロボットの行動の一連の流れを以下のフローチャートに示します。なお、赤ラインが引かれたフィールドの端のことをここでは「エッジ」と呼んでいます。

フローチャート

個々の物体認識、ロボットへの指令などについては後で触れますが、動画中のロボットの動作計画の流れは全てこのフローチャート中に示されています。ご覧の通り、行動決定とその戦略自体はそこまで複雑ではありません。

まずスタート時は、レギュレーション12ページに

スタート時、ロボットはスタートエリアのなかでは、重心計測時の姿勢で寝っ転がる状態であること

とあるようにロボットは横たわった状態です。この条件は常に変わらないため、スタート直後に起き上がりと、概ねボールがある方向を向くための180°旋回を行います。

その後、図中で大きく青とオレンジに区分されているように、ロボットの行動はボールへのアプローチとフィールド上を落ちずに探索する2つのループを持ちます。特徴として、両ループ中で行動決定に対しての行動は、必ず移動・旋回の一歩分のみの動作となっており、毎ループごとに行動決定と行動を繰り返すことで動作します。イメージとしては、大まかな方角しかわからない迷路で、分かれ道ごとにゴールに近そうな方向を選び続けることでゴールを目指す手法です。ゴールまでの道のりや自らの位置をロボットが把握できているわけではないので確実性は低いですが、実装の難易度も低いためまずはこの手法での完走を狙いました。

エッジ回避・ボール捜索

エッジ回避アルゴリズム

取得したカメラ画像中にボールが検出されていないときに機体はこのループに入ります。動画中0:20~1:55、ボールタッチ後の2:30~4:31までがこのループに該当します。ここでは、エッジを回避しコースアウトを防ぎながらボールを捜索、もしくは帰還することを目的としており、画角内にエッジが検出されなければロボットは直進します。

もしエッジが検出された場合、まずは機体の直進方向に対してエッジはどの様な角度となっているかを確認します。機体がエッジに向かっていく方向であれば、エッジと平行になるように一歩分の旋回を行います。一歩分の旋回ではエッジに対する角度を修正しきれない場合でも、次回の動作計画でまた旋回をすることになるので1歩にとどめています。これはこの後に行う横歩行についても同様で、前述した「行動決定と一歩分の行動」のループによって制御する原則に則っています。

旋回を繰り返し行うことでエッジと進行方向が平行になります。この時の機体位置が閾値よりもエッジに近ければ、エッジから離れる方向に1歩横歩行します。これについても、機体が十分エッジから離れるまで繰り返し行われます。

以上によってエッジとの安全な位置関係が確保できれば、次にまたエッジが進行方向に検出されるまでフィールド上を直進します。

ボールへのアプローチ

ボールアプローチアルゴリズム

カメラ画像中にボールが検出されているとき機体はこのループに入ります。動画内1:55~2:30までがこのループにおける動作です。なお、ボールに触ったかの有無はフラグ(図中の「ボールタッチステータス」)で管理しているため、すでにボールを触った後はボールを検出してもループには入りません。

まずはボールの位置を取得します。カメラにボールが検出されているときボールは常に機体前方に位置するため、ボールが画角内右にあれば右に、左にあれば左に横歩行を行うことでボールの正面に位置どることができます。

ボールが正面(画角内の座標の閾値の範囲中)に存在すれば、一歩ずつ前進します。一つ前の、ボールに対しての左右方向の位置調整も同じループ内にあるため、前進する過程でボールとの位置関係がずれてしまった場合には再度横歩行を行い調整します。

ボールに触れたらボールタッチステータスを更新し、スタート時と同じく180°旋回することで概ねスタートエリア方向を向きます。エッジ回避・探索ループに入り、スタートエリアまで帰還することができれば完走です。

カメラ画像からの物体検出

ここまでで、動画中のロボットが行っている行動計画についてざっと解説を行いました。本機体では、行動計画に必要な情報は全て頭部に搭載のカメラ画像から得ています。ボールの有無、位置や、エッジの角度など必要な情報の取得方法について少しだけ触れます。

だいぶ前の記事「Humanoid Autonomous Challengeに出場するには:HAC入門編 Part.2」でフィールドの要件の確認をしましたが、HACフィールド上で、認識が必要である要素は全て別々の色を持ちます。

これはつまり、カメラ画像から色ごとに領域を抽出することで、画角内の認識したい対象の有無、位置、向き、大きさなどを得られるということです。

参考にボールについて、オレンジ色の領域のみを取得した画像を示します。元画像は、ロボットの頭に搭載のカメラで取得した画像のレンズ歪みを補正し、さらに鳥瞰図変換を行ったものを用いています。この工程についてはこの記事が詳しいです。(別サイトに飛びます)

その後、ボールの色に相当するオレンジ色の領域を抽出し、最後にその領域の重心座標を得ています。鳥瞰図変換を行っているので、画角下端中心から重心への距離はロボットとボールの位置関係を示す(鳥瞰図変換の特性上誤差はあります)ことになります。

ボールの位置情報を取得する流れ

またここで用いた色による領域抽出は、認識対象の画角内の存在の判定にも用いています。画角内にボールが存在しなくても、ノイズや光の加減で、下の画像の様にオレンジ色の領域が検出されてしまうことがあります。

オレンジ色の誤検出

しかしこのような場合では、その色の領域はごくわずかとなるため、領域の画素数を閾値に用いることで簡便に認識対象の存在判定を行うことができます。他の手法では特徴量やテンプレートマッチングを用いるものもありますが、今回は各要素がしっかり色分けされているためこの手法を取ることができます。

エッジの検出についても色領域の抽出を用い、それにHough変換による直線認識を組み合わせることでエッジ位置、向きを取得しています。Hough変換についてはこの記事を参考にしています。(別サイトに飛びます)

エッジの情報を取得する

まとめと改善点

ここまで、今回の動画のテスト走行におけるアルゴリズムと画像からの物体検出の方法について解説を行ってきました。動画中で最後にコースアウトし転倒してしまっていることからも分かりますが、現在の状態はまだ途中であり、改善すべき点が多々あります。そのいくつかを以下に列挙します。

  • 直線コースにしか対応できない
  • スタート・ゴールライン検出が未実装
  • フィールド上での自己位置をロボットが把握できていない
  • 時間がかかりすぎ(ゴールまで4分半かかり競技時間を使い切ってしまう)
  • 歩行時の意図しないドリフト(横滑り)によってカメラ画角の外からエッジに接近、落下してしまう
  • 複数ボールがある場合に未対応

今後、これらの改善を行い、レギュレーションにもあるような様々な形状のコース、複数ボールがある状況での完走を達成できるサンプルコードの公開を目指していきます。

引き続きよろしくお願いします。

タイトルとURLをコピーしました