詳説 風兎2005

プログラムソースリストを整理してから公開しようと思っているのですがなかなか手が進んでおりません。ご覧になりたい方は直接お申し付けください。お送りします。

  1. 機械
    1. アーム
  2. 電気電子回路
    1. ロータリーエンコーダーのカウント
    2. PSD距離センサー電源OFF回路
  3. 動作別制御プログラム解説
    1. ライントレース
    2. エンコーダーによる走行
    3. ボール探索
    4. 色の見分け方
    5. 段差越えシュート時のカメラを用いた補正

機械

アーム

アームを上下させるモータにはGWSのラジコン用サーボPARK HPXを使用しています。19gという軽量さもさることながら、回転速度が速いのがもっとも重要な点です。ボールを投げることができるようになったのはこのモーターのおかげです。

PARK HPXのケースのネジをいったん外して、穴を開けたアルミ板を一緒に止めることで固定しています。PARK HPXのネジは固いのでネジ山をつぶさないように細心の注意が必要です。

既に2脚ロボット用ので数個潰しました。

力を入れて回すためには、No.0精密ドライバーで柄が太くて握りやすいものがあると良いでしょう。細いものしかない場合は柄に両面テープを貼ると滑り止めになって若干握りやすくなります。

風兎のアームに使用したRCサーボ性能比較(6V時)
名称 トルク[kgf*cm] スピード[s/60deg.] 重さ[g] 購入価格(当時)
S3003 4.1 0.19 37.2 1869
Micro 2BBMG 6.4 0.14 28 2217
PARK HPX 4.8 0.08 19 1785

吸引装置

構造

吸引装置は一端が塞がれた短い筒(以下カップ)とカップ底部のファン、そしてそれらを支える骨格部品に分けられます。

(写真:ファン周辺)この写真はカップの底部を取り除いたところです。内部にファンが見えます。

(写真:ハンドのカップ後ろ側)実際には底部を塞いであります。

原理

カップの底部でファンが回転すると中央部では内部に、周辺部では外部に向かっての空気の流れが生じます。ここにボールが近づいてくると空気の流れがボール表面にも生じ、ベルヌーイの法則に従ってカップ側の圧力が低下するため吸い寄せられるものと思われます。

真空ポンプのように内部の空気をなくして圧力を低下させているわけではないので、カップの気密性はさほど重要ではありません。むしろファンの回転数を上げて空気の流れを高速にすることが重要です。

実装上の注意

ファンを回すモーターにはタミヤのプラズマダッシュモーターを用いました。このモーターは消費電流が大きいので、電池がボトルネックとなる可能性があります。NiMHの2セル直列を用いていますが、これを単4から単3に替えたところ明らかな性能向上が見られました。

電気電子回路

  1. ロータリーエンコーダーのカウント
  2. PSD距離センサー電源OFF回路

ロータリーエンコーダーのカウント

二輪独立駆動のロボットでは、両輪の回転角をもとに現在位置を求めることがよく行われています。風兎にもこの機能があります。 回転角の検知には、前後両方の回転を検知するために2相(orインクリメンタル型)のロータリーエンコーダーがよく用いられます。

ロボコンでよく用いられるH8/300HシリーズのCPUにはITUというカウンタ&タイマがあり、2相のロータリーエンコーダーの信号から正負両方の回転を検知してカウントを増減する機能があります。しかし残念なことに1個しかありません。そこで、CPLDを用いてエンコーダーをカウントする機能を実現しました。

エンコーダカウンタVHDLソース

以前の信号と現在の信号の組み合わせによってカウンタを増減します。詳細はELM氏による「ロータリーエンコーダの使い方」をご覧下さい。この回路は動作のためにはエンコーダーの出力信号変化よりも速いクロックが必要です。H8/3069ボードでは25MHzのシステムクロックが出力ピンに出ているので、これを用いました。

但しこの回路はクロックの変化とエンコーダーの信号変化が重なると異常な動作をしてしまうことがあります。そこで入力信号を一旦フリップフロップに記憶し、クロックのタイミングに合わせて次に送るようにします。(回路図:入力信号→D-FF→D-FF、D-FFには共通クロック入力)これは同期化回路(Synchronizer)と呼ばれるもので、非同期信号の入力による異常動作を確率的に減らすためのものです。1個だけ入れてもまだカウントミスが目立ったので2段にしました。

PSD距離センサー電源OFF回路

バッテリーの持ちを良くするためにマイコンからの命令でPSD距離センサーの電源を切れるようにしました。特に難しいことはなく、Pch-MOSFETでON/OFFしているだけです。NchでGND側を切っても良い気がしますが、FETのON抵抗の影響で電圧が変動するのではないかと考えてこのように+側のレギュレータ入力の時点で切っています。

動作別制御プログラム解説

  1. ライントレース
  2. エンコーダーによる走行
  3. ボール探索
  4. 色の見分け方
  5. 段差越えシュート時のカメラを用いた補正

ライントレース

コーナーでもラインに沿ってスムーズに走れるのが風兎の特徴の一つです。 原理は単純なPD制御ですが、走行距離計測に基づくコーナー前での減速と、交差点での処理の工夫が加えられています。

ラインセンサー

車体前方にアナログ式ラインセンサーを装備しています。 ラインセンサーは15.24mm間隔で横一列に並ぶように4個設置されています。 これはユニバーサル基板の穴の間隔6個分であり、 2個のセンサーが同時に19mm幅のガイドライン上に乗るようにしたものです。 センサー素子はシャープのGP2L02という、赤外LEDとフォトトランジスタが組になったものです。名古屋大須のタケイムセンで20個200円でした。一般的なLEDとフォトトランジスタの組み合わせでも応用できると思います。

センサーの反応強度はセンサーのLEDを消灯したときの出力と点灯したときの出力との差をA/Dコンバーターで読み取ります。この処理はタイマ割り込みで行われ、下記のように交互にON時、OFF時を読みます。2回の割り込みで1セットです。

センサーの信号の扱い

知能ロボコンのラインは白地に黒ですから、反応強度が低い部分がラインです。 このままではわかりづらいので、適当な定数から反応強度を引いて得た値、いわば「ラインへの近さ」を用います。

ライントレースに必要なのは、ロボットから見てラインがどの方向にあるかです。 センサーから得られる4つの変数を、次に示すような操作で1つの変数=ラインの位置に変換します。 各センサーごとに位置を持たせておき、ラインへの近さで重みを付けた加重平均をとることで、ロボットから見たラインの位置が1つの変数として得られます。

実際はラインへの近さと反応強度は比例しないので、単純な加重平均では線形性が悪くなります。パラメータの調整によってなんとか走れるようにしましたが、 データを取って区分線形近似などの補正を行うか、反応強度の対数をとるなどすると改善するかも知れません。

基本走行

ラインの方向が0(中央にラインを捉えた状態)になるように車体を左右に回転させるという定値制御を行います。手法は比例微分(PD)制御で、ゲインは手動で適当に与えました。あとは前に進めば勝手にラインに沿って走ります。

交差点の走行

交差点の横線であることは、3つ以上のセンサーが黒を検出していることで判別します。黒か白かは閾値をヒステリシス付きで適当に設定してセンサーの反応強度から判定します。 交差点ではラインの方向が得られないので、真っ直ぐ走ります。このとき、どの方向に走れば「まっすぐ」であるかが問題となります。というのも、交差点に入る直前や出た直後はラインの向きが一瞬乱れることが多く、交差点に気づいたときは既に正しい向きからずれてしまっているということがあるためです。

そこで、通常走行時には常に一定距離走行するごとに車体の向きを記録しておきます。この記録はリングバッファで行われ、交差点に入ったときは少し過去(数cm)にさかのぼって正しい向きを得ます。 なお、ラインが真ん中に捉えられていないときはこの記録を行いません。 弱点として、コーナーでの姿勢制御が甘いと直後の交差点でコーナーに入る前の方向へ向かってしまったりします。これはコーナーでの速度を十分抑えて姿勢が乱れないようにすることで解決しました。

ライン上の現在位置の推定

ラインに沿って走行中、両輪の回転量(エンコーダーのカウント数)の合計から進んだ距離を推定します。進んだ距離をもとに現在いる位置(基準点からのラインに沿った距離)を計算します。この位置情報は大きく分けて2通りに使われます。

まず、位置情報からコーナーが近いことがわかるので、コーナーの前から減速することができます。

また、交差点を検出したときにどの交差点かを推定します。本来あるはずのない場所に交差点を検出したときは無視します。これにより台の継ぎ目の段差などでセンサーが浮いて交差点を誤検出することを防ぎます。 また、どこの交差点か分かったときは位置情報を交差点の位置にリセットして誤差を補正します。

エンコーダーによる走行

対象物エリアや緑ゴールの前などラインのない場所では車軸に直結されたロータリーエンコーダーの情報のみを用いて走ったり旋回したりします。

エンコーダーを用いた旋回

PD制御により前後方向への移動距離を0に保ちつつ、 PID制御により回転方向を目標値に合わせます。 Iゲインは、目標値近くでしばらく止まったときにだけ効いてくるようにするため できるだけ小さくかつ0にならない値にしました。 教科書どおりのワインドアップ対策として、出力が飽和するときは積分値を0にリセットします。

直進

旋回とは逆に、回転方向をPD制御で一定に保ちながら 前後方向への移動距離を目標値にPID制御で合わせます。 立ち上がりの差などで左右にずれた場合の補正はしていません。そのため、目的地点に着いたと思ってもずれている場合があります。回転方向の制御ゲインを適当に調節することで、短距離の移動では問題にならない範囲に収めることができました。

使用センサー

PSD測距センサーを使用しています。正面にGP2D120(短距離用)1個、両側面にGP2D12(長距離用)1個づつの合計3個を搭載しています。

対象物エリアの戦略

次に述べる扇状探索と側方探索の2種類を使い分けて探します。

扇状探索

車体を左右に回転させ、自分を中心とする扇状の領域を前方センサーで走査。センサーの仕様では半径30cmの範囲が検出可能です。

後述する側方探索の際に、ライン近くのボールが邪魔になるので これらを優先的に取ります。

開始時に向いている方法を中心に、左右それぞれ約70度の範囲を前方のPSD測距センサーでスキャンし、最も強い反応(最も近くの物体)があった場所を求めます。これが一定値(約25cm)より近ければ取りに行きます。

このとき、PSD測距センサーを高速で振り回すためにプログラムの処理が追いつかず、反応があったと思った方向と実際に物体がある方向がずれます。また、タイヤのスリップにより車体の方向自体も若干ずれます。そのため、反応があったはずの向きを向いてもボールが捉えられず、見失ってしまうことがあります。 そこで、このような場合に対処する方法を考えました。 反応があった方向を向いたはずなのにボールがみえない場合、ちょっと右を見てみます。それでもなければ、ちょっと左を見ます。それでもなければ諦めます。たったこれだけのことですが、面白いように成功率が上がりました。

オーバーランする側にずれるのがわかっているので本当は左右の順序はどちら向きにスキャンしたかで変えた方が良いはずです。

側方探索

車体を前進させ、左右のセンサーで両脇を走査。壁際一杯まで検出可能です。

ロボット前方側面のPSD測距センサーを用い、対象物エリア中央のラインに沿って走りながらボールを探します。センサーが反応したら直角に曲がって直進することでボールを正面に捉えます。 行き過ぎてしまうことがあるので、前項同様 ボールを取れなかったときは車体を少し左右に振ってみます。 それでも取れなければ壁際まで前進します。

直角に曲がった後はPSD測距センサーをまったく使っていません。ボールが吸いつけられたかどうかを検知するフォトセンサーのみ用いています。

色の見分け方

イメージセンサTrevaを使って色を見分けます。ボールを吸い付けた後にアームを上げるとカメラの前にボールが来るので、このときの 画像中の特定の点の色をNN法でクラス分けします。 詳しくは2004年版の風兎の解説をご覧下さい。

Trevaはオートホワイトバランスの機能を持っており、マイコン側からホワイトバランスを制御することが出来ません。そのため同じ色を撮影しても同じ信号が得られるとは限りません。 そこで、ボールの色によってホワイトバランスが変化してしまうのを防げるのではないかと考え、カップ部分の白色が映りこむようにしました。気休めかもしれませんが、ボールしか映らない場合に比べて間違いが減ったように思います。

段差越えシュート時のカメラを用いた補正

黄色ゴール前にはゴール位置を示すマーカーラインがあります。段差をはさんでこれの反対側の地点から投げます。

ゴールそのものではなく、ゴール前のマーカーを狙って投げます。知能ロボコンの競技台は床が白、ラインが黒で、それ以外のものが何もないという理想的な環境ですので、ごく単純な方法で実現できました。

Trevaからは上のような画像が得られます。中央の段差を挟んで黄色ゴール向かい側の地点から見るとゴール前のマーカーが縦方向の線に見えるので、この線を縦エッジとして抽出して目印にします。 確実性を高めるため、 画像の下の方から探索し最も左のエッジ点のx座標を求めます。5ライン以上に渡ってこのx座標がほぼ同じであれば、その位置をゴールの方向とします。

ゴールの方向が図中Aで示した定数に一致するように、Aとの差に比例した角度だけ車体を回転させます。ここではピボットターンを使うことで精度を上げようとしてみました。 なお、Aの値は動作を見ながら手動で調節します。

山口 辰久

Valid HTML 4.01! Valid CSS!