ソフトウェア詳細設計書 |
MIRS0601-SOFT-0001 |
版数 |
最終更新日 |
作成 |
承認 |
改訂記事 |
A01 |
2006/10/13 |
杉山 |
平口 |
初版 |
B01 |
2007/2/10 |
杉山 |
平口 |
動作概要など多数 |
|
|
|
|
|
1.はじめに
本ドキュメントは、MIRS0601 基本設計書に規定されたシステムの動作規定、状態遷移を実現する各タスクの開発(コーディング、試験等)に必要な事項を述べる。
2.概要
MIRS0601 ソフトウェアは、RT-Linux上で動作するプログラム群で構成される。プログラムはC言語でかかれ、Linux の標準の API とともに、行動モードに対応したプログラム、一つの機能を複数のプログラム群で提供する機能モジュール、および、RTタスク、ドライバと、補助関数と独自に定義したヘッダファイルから構成される。
3.動作モード
全部で6個のモードを定義する。
後退動作モード (back)
白線のある位置まで後退する。
斜めに進入している場合も考え補正動作を行う。さらに、右に90度回転し、白線をトレースできる状態にする。
ポスト探索モード (post_search)
直進走行しながら、超音波を出してポストがあるか探索する。
ポストを発見したらさらに進み、超音波センサの値が最小値を返したら停止する。
同じポストを複数回発見してしまわないように以下のようにする。
まず、競技場半分付近まで超音波センサで探索する。
角で90度回転する。先ほど超音波で探索した部分は探索動作を行わず進み、その地点からまた探索を開始する。
その動作を1周するまで繰り返す。
ポスト接近モード (post_approach)
その場で左に90度回転し、ポストに接近する。その際は、超音波センサを用いて正しい角度で接近できるように調整する。 ポストとの距離が近くなったら停止する。
ポスト判別モード (post_check)
コンベアの白線センサでポスト番号を判別する。コンベアのタッチセンサが押されるまで少しずつ前進し、押されたらコンベアの モーターを正転させる。番号を読み取ったら停止しコンベアを逆転させる。判別が正しく行われていない場合はもう一回繰り返し、それでもダメならば、赤外線センサの値を読み取る。
ポスト獲得モード (post_get)
右に90度回転し、ポストの周りを公転する。赤外線センサの位置を確認して左に90度回転して、タッチセンサが反応するまで 前進し獲得する。獲得後、赤外線センサを再度確認し、本当に獲得したか確かめる。このモードの始めにいた位置まで戻っていたら停止して、すこし後退する。
ポスト番号保存モード (post_number)
スタートしてからポストを発見した順番と、そのポスト番号を書き込む。これをもとにして2回目の競技では、判別動作をなしに順番 どおりにポストを獲得する
4.モード区分
1回目の競技で使用するモード
Ø 後退動作モード
Ø ポスト探索モード
Ø ポスト接近モード
Ø ポスト判別モード
Ø ポスト獲得モード
Ø ポスト番号保存モード
2回目の競技で使用するモード
Ø 後退動作モード
Ø ポスト探索モード
Ø ポスト接近モード
Ø ポスト獲得モード
5.モード遷移表
1回目の競技時
|
後退 |
ポスト 探索 |
ポスト 接近 |
ポスト 判別 |
ポスト 獲得 |
ポスト 保存 |
後退 |
× |
動作 終了後 |
× |
× |
× |
× |
ポスト探索 |
× |
× |
動作 終了後 |
× |
× |
× |
ポスト接近 |
× |
× |
× |
動作 終了後 |
× |
× |
ポスト判別 |
すでに 判別していたとき |
× |
× |
判別できなかった場合 |
× |
動作 終了後 |
ポスト獲得 |
× |
× |
× |
× |
獲得できなかった場合 |
動作 終了後 |
ポスト保存 |
動作 終了後 |
× |
× |
× |
× |
× |
2回目の競技時
|
後退 |
ポスト 探索 |
ポスト 接近 |
ポスト 獲得 |
後退 |
× |
動作 終了時 |
× |
× |
ポスト探索 |
× |
× |
動作 終了時 |
× |
ポスト接近 |
× |
× |
× |
動作 終了時 |
ポスト獲得 |
動作 終了時 |
× |
× |
獲得できなかったとき |
6.動作モード詳細
MIRS0601の核となる部分の動作概要を示す。
<後退モード>
図、底面の白線センサの位置
このままだと実際は、白線センサの感知が遅れてしまい、飛び出してしまう可能性が高いため白線で一時停止してから、少し前進し
非常に遅い速度で後退しながら、以下の動作に移る。
<ポスト探索モード>
超音波センサの機構上20度ぐらい早くポストを感知してしまうので、超音波センサが最小値を返した地点で停止するようにする。
誤差や、不都合でおかしな値を返すこともあるのでそれも考慮する。
<ポスト判別モード>
forループを用い、一定時間コンベアが回転するようにした。
MIRSの前方にTSを2個つけコンベアとMIRSが確実に正対するようにして、精度を高める。
前進の部分にもTSが片方だけ”1”の場合などに分けて考える。
正確に読み取れなかった場合の動作は、2回やる予定。判別不可なら赤外線の値を読む。
<ポスト番号保存モード>
読み出す部分は2回目のmainにあり、関数として分けているのではないが書いておく。
配列post_num[ ]に各ポスト番号が入る。要素にはポストの順番が入る。
たとえば1番目にポスト3を、2番目にポスト1を、3番目にポスト2を発見した場合は、
post_num[0]=3 ,post_num[1]=1 ,post_num[2]=2のように代入され、ファイル”post.log”に書き出される。
post_num[ ]の値の順番に別の変数post_get[ ]に値を代入しなおし、その値を元にして2回目の競技を行う。
ポストを発見する度にカウンタの値を増やし、カウンタの値とpost_get[ ]の値が一致したらポストを獲得する。
競技場を1周したらカウンタの値を0に戻し、すべてのポストを探索するまで行う。
7.使用する関数
ファイル名 |
関数名 |
書式 |
説明 |
main.c |
main |
int main(void) |
1回目の競技時に使用 |
try2.c |
main |
int main(void) |
2回目の競技時に使用 記憶したポストの順番に獲得 |
initialize.c |
initialize |
int initialize(void) |
初期化 |
mirs_back.c |
mirs_back |
int back(void) |
後退 |
post_get.c |
post_get |
int post_get(void) |
ポスト周回及び獲得 |
post_search |
post_search |
int post_search(int search) |
ポスト探索 ポストを発見したら戻り値searchは1 |
post_check |
post_check |
int post_check(void) |
ポスト判別 判別できたポスト番号を グローバル変数に格納 |
post_get.c |
post_get |
int post_get(void) |
ポスト獲得 |
post_approch.c |
post_approach |
int post_approach(void) |
ポストに接近 |
function.c |
correct_direction1 |
int correct_direction1(void) |
ポスト接近前の角度補正 |
correct_direction2 |
int correct_direction2(void) |
ポスト補正後の角度補正 |
|
irs_code_get |
int irs_code_get(void) |
赤外線のコード判別 |
|
uss_get |
int uss_get(void) |
超音波による距離測定 |
initialize、post_approach,post_get
correct_direction1, correct_direction2,irs_code_get,uss_get
以上は標準機のプログラムをそのまま、もしくは改良して使用する。
そのほか駆動系とスレッド系の使用する関数は標準機と同じ。
pwm_stopは少し変更し、文中にpwm_both_data(0,0)を追加する。(main中で一連ではないpwm_lqr_straightなどを多用するため)