目次
1. 本ドキュメントについて2. プログラム説明
3. 関数
4. 問題点
1. 本ドキュメントについて
- 本ドキュメントでは、ロータリ走行プログラム(around.c)についての説明を行う。
ロータリ走行プログラムはMIRSがロータリ中央にある柱にぶつかっている状態で開始されることを想定している。
MIRSを円を描くように周回動作させるためにMIRSの標準走行プログラム(motor.c)に含まれる周回プログラムを使用、
出口の探索には、超音波センサを用いる。
このプログラムの基本的な構成は次のようになっている。
- @走行開始時に行う準備モード
- Aロータリの出口を探す出口探索モード
- B出口発見後の通路進入モード
2. プログラム説明
- 最初で述べたように、ロータリ走行プログラムではMIRSがロータリ中央にある柱にぶつかっている状態で開始されることを想定している。
- ただし、柱にぶつかっていない状態でプログラムが始まってもそれに対応することはできる(走行精度は落ちる)。
<プログラム@>
- プログラム開始時の動作、ロータリ内を走行する周回動作の精度を上げるためにMIRSの位置を補正する。
- MIRSを左方向へ80°回転
- MIRSの位置補正(11cm直進⇒右へ20°回転)⇒⇒下図のような位置になるのが望ましい
主な動作
<プログラムA>
- ロータリ内を走行しながら出口を探す。
- 周回動作開始(出口探索はしない)、π/2だけ進む。
- MIRSが周回動作中に壁にぶつかった場合、MIRSを停止させ進行方向の補正を行う。
- MIRSの左に壁があることを確認できたら周回動作(出口探索あり)をする。
- 出口探索中にMIRS左側に壁が確認できなくなったら、出口を見つけたと判断する。
出口の探索には超音波センサを用いるが、ロータリの入り口を出口と認識してしまわないようにするため。 入り口から完全に離れるまで、超音波による出口探索は行わない。
主な動作
<プログラムB>
- ロータリ内から出口へ向かう。MIRSが完全に通路内に入ったらプログラムを終了する。
- MIRSを出口の方へ向ける(7cm後退⇒左に90°回転)
- 出口への侵入開始。このとき常にタッチセンサと超音波センサの値を監視する。
- MIRSが通路内に入り、左右の超音波センサの値が両方とも35cm以下になったらプログラム終了
主な動作
3. 関数
- このプログラムで使用した関数について説明する。
関数名 | 引数 | 説明 |
rotary(void) | なし | |
motor(char,int*) | 第一引数(char):周回動作なので'c'を入れる。 第二引数(int):角度 第三引数:走行時間 第四引数:周回半径 第五引数:出口探索(0⇒あり、1⇒なし) |
4. 問題点
- ロータリ走行プログラムを開発するうえで次のような点が問題になった。
- MIRSの標準プログラムの周回動作はπ/2進めることを指定すると、π/2進むまで途中で止めることができない(途中壁にぶつかると永久に周回動作を続けてしまう)。
- 超音波ではロータリの入り口と出口の区別をすることができない。
- 標準プログラムに少し手を加えて、タッチセンサが反応したら・MIRS左に出口があったら停止することができるようにした。
- 次のようなアルゴリズムにした。
- 最初は出口探索を行わないで周回動作開始⇒⇒周回動作終了後、MIRS左に壁があったら出口探索を開始し、壁がなかったらまた出口探索をしないで周回動作を始める。
解決策
ロータリ走行プログラムaround.c