Mobot#
記事の著者:Cosku Acay、Edwin Cho、Kenneth Li、Nishant Pol。PDF。
プロジェクトの説明#
カーネギーメロンのMobot大会では、ロボットは屋外の歩道上の255フィートの曲がった白い線の上に配置された、一連の14個のゲートを通過しなければなりません。コースには2つの急な傾斜と、ロボットが14個のゲートを順番に通過するために正しいルートを選択しなければならない決定ポイント領域が含まれます。線は屋外にあり、ピッツバーグの天候の下にあるため、ロボットはさまざまな条件で機能しなければなりません。今年は大会当日、雨で風が強かったです。詳細は http://www.cs.cmu.edu/mobot/mobot.html でご覧いただけます


CMUcam4 での解決策#
私たちは、ライントレースのタスクに CMUcam4 を使うことを選びました。これは最小限のハードウェアで済み、ラインの追跡に適したインターフェースを備えていたためです。

CMUcam4 は 30 フレーム/秒でラインの画像を取得し、3本のシリアルラインのうち1本を介してカラートラッキング画像を Arduino Mega に送ります。次に Arduino Mega がこの画像を処理し(後述の「ソフトウェアの説明」を参照)、別のシリアルラインを介してモーター速度と旋回コマンドを PID コントローラに送ります。PID コントローラは、左右両方の車輪のエンコーダカウントを Arduino Mega に返し、これにより gate 0 に対する位置と方位を追跡できます。
PID コントローラ(MD-25)は英国の Robot-Electronics 社製です。モーターシャフト磁気エンコーダ付きの2つのギヤード DC ブラシモーターを駆動します。LCD 画面はデバッグ目的です。モーター用の 12V とロジック用の 5V の2つの電源レールがあり、同じグランドを共有し、どちらも単一の 12V 充電式バッテリーから供給されていました。
当初は、プログラミング段階にすばやく入るために木製ベースからプロトタイプを作り、その後 RC カーのようなより高速で信頼性の高いベースに取り組む予定でした。しかし、プロトタイプが非常に信頼性が高く扱いやすいことがわかったので、最終設計にもそれを使い続けました。ボディの防水は、梱包テープの層の下にセロファンラップの層を重ねたものでした。しかし雨は梱包テープを通して漏れましたが、幸いセロファンラップは通しませんでした。カメラは Ziploc バッグのプラスチックの正方形で覆いました。この「フィルター」が、カメラにとって背景のコンクリートのように見えるラインの小さな斑点を無視するカメラの能力を向上させることがわかったためです。
アルゴリズムの説明#
背景#
私たちは、YUV モードを有効にしたカラートラッキングモードで CMUcam4 を使用しており、これによりラインのバイナリ画像表現が得られます。カメラソフトウェアは白(つまり背景)でないものをすべて除去し、ラインがある(白い)ところに「オン」ピクセルを置きます。カラートラッキングが光の強度に鈍感になるように YUV モードを使用しており、これによりロボットは屋内外を含むさまざまな条件下で機能できます。
ライン追従#
CMUcam4 は Arduino チップに 80x60 のバイナリ画像を提供します。画像から等間隔の10行のピクセルをサンプリングし、「オン」ピクセルの重心を計算します(こちらを参照: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points)。次に、ラインが重心上にあると仮定します。これを画像内の10の異なる行で行うことで、点を結ぶことでラインの良好な近似が得られます。次に、このデータを使用して、ライン上の各点が画像中心にある垂直線からどれだけ離れているかを求め、ラインがどれだけ曲がっているかを表す値を得ることができます。これは、接線と曲線の間の面積を求め、その面積を使ってどれだけ旋回する必要があるかを決定するようなものと見なせます。符号が旋回が左か右かを決定し、大きさがどれだけ旋回してラインに追従する必要があるかを決定します。予想どおり、面積がゼロと測定されれば、ラインはロボットの真正面にあり直線です。面積の大きさが大きければ、ロボットはこの面積の大きさを最小化しようとするために旋回する必要があります。
決定ポイント#
ロボットが分岐点にいるかどうかを判断するために、ライントレースからカメラが収集したデータを取り、黒い空間に何個の平均中心点が現れるかを確認します。これは、2本のライン間の平均点が、それらのラインが同じラインでない限り、どちらのライン上にもないはずだという仮定に基づいて動作します。ロボットが黒い空間内に複数の平均点を検出した場合、ここには2本のラインがあるに違いないと結論づけることができます。次に、適切な旋回を選択し、1本のラインだけが見えるようになるまでその方向に旋回をバイアスします。
私たちのコードの簡略版を見るには https://github.com/cacay/Mobot にアクセスするか、ローカルコピーは こちら をご覧ください。

