目次
1. 本ドキュメントについて2. 本プログラムの機能
3. テスト仕様
4. 残った課題
5. ソースプログラム
1. 本ドキュメントについて
-
本ドキュメントでは障害物攻略の1つである、小部屋攻略のためのプログラム(名称:Cosmo Break)作成に関して記す。
2. 本プログラムの機能
2.1. 入り口の判断
-
DBで小部屋があることがわかったあと、どちらかの壁が開けたことを超音波センサで感知し、その時点で小部屋に入ったと判断する。
左右の壁の有無を超音波センサで感知し、小部屋の入り口が左、中央、右のどこにあったかを判断する。
2.2. 中心の判別
-
先ほど判断した入り口の位置から中心の位置を判断し、直線的に中心まで移動する。
その後、中心で正面を向くように回転する
入り口と中心の位置は記憶しておく。
2.3. 出口探索
-
小部屋の中心で360°回転し、45°回るごとに左右のセンサで壁までの距離を測る。
左右のセンサでそれぞれの距離が2回ずつ測られるので、その平均をとり、
もっとも長い距離だったところ、あるいは値が返ってこなかったところが出口だと判断する。
もし小部屋の四隅が出口だと判断されたら、左右どちらかのタッチセンサが反応するまで直進し、
タッチセンサが反応しなかったほうを出口とする。
ここまでの動きを図に表すと次のようになる。
@ 3つのうちどれかの入口から入ったら、中心で正面を向くように真ん中まで移動する。
A 360°回転しながら左右の超音波センサで出口を探索する。
2.4. エラー検知
-
次の場合はエラーとし、もう一度出口探索を行う。
@入り口と出口が同じところだと判断された場合。
A入り口と出口がすぐ隣りあわせで平行になっていると判断された場合。
B出口と判断した方向の距離が短すぎる場合。
なお、実装が間に合ったのはBの機能のみである。
3. テスト仕様
-
センサなどがMIRSに実装され完成するまでは、パソコンの端末画面で動作するテストプログラムを使用する。
入り口の位置はキーボードにより左、中央、右から選ぶ。
各方向の壁までの距離は乱数により20〜9999までの値とし、一番大きな値が出た場所を出口と判断する。
4. 残った課題
-
エラー検知は完全な実装には至らなかった上に、エラーが起こると無限ループに陥る可能性もあるので対処を加える必要がある。
距離計測の精度はそれなりによかったが、出口の環境(たとえばシーソー)によっては壁と判断してしまうこともあった。
これに対してはセンサの向きなどを工夫すれば対処できる。
また、走行系の機能を充実させなければ回転や直進の精度が落ち、ゴールの誤検知の原因になるようである。
5. ソースプログラム
-
作成したソースプログラムを掲載する。
cosmo_break.c
なお今回、標準プログラムの中で以下の中身を改良した。
thread_func.c