名称 |
ソフトウェア詳細設計書MIRS0501-SOFT-0001 |
番号 |
版 数 |
最終更新日 |
作 成 |
承 認 |
改 訂 記 事 |
A01 |
2005.10.31 |
伊沢・木村・杉山 |
伊沢 |
初版 |
B01 |
2006.2.13 |
伊沢・木村 |
伊沢 |
改訂版 |
1.
Contents
1.
はじめに
2.
動作モード
−メインモード
−初期動作モード
−最高速モード
−左折モード
−ポスト探索モード
−判定モード
−ポスト接近モード
−ポスト番号確認
−ポスト獲得モード
−復帰モード
3.
標準機から使用する関数
4.
新たに自分たちで作る関数
5.
デバイスドライバ
6.
標準機より用いるモジュールとモードの相関図
本ドキュメントでは、MIRS0501システムステム基本設計書に規定されたシステムの動作規定、状態遷移を実現する各タスクの開発(コーディング、試験等)に必要な事項を述べる。
初期動作mode(prologue)
メインプログラムが実行されるとはじめに呼び出され各変数の初期化、各センサーの初期設定、"post_data.txt"より1回目の競技で取得したポスト情報を変数に代入する。
次に、初期位置からライントレースに最適な位置まで移動する。
最後に、競技2回目の場合にはポスト情報から1番目のポストはどちら回りのほうが近いかを判断し、その方向を向く。1回目の場合には常に+90°回転する。
最高速mode(vmax,revvmax)
ポスト探索を行わない2辺での外周移動時に用いる。白線を2つのタイヤの間に挟むようにしてライントレースを行い高速で直進するが、コーナー突入時に慣性によりMIRSが白線からはみ出てしまわないようにある程度進んだら減速する。右回りか左回りで使用するセンサーが異なるため、vmax(右回り) revvmax(左回り)に分かれ、mainによりどちらかが、呼び出される。
初期動作モードの次に呼び出された場合のみ、すでに半分の距離を進んでいる設定で開始する。
旋回mode(drift)
外周移動時、角を曲がる時に使用。現在の進行方向をモード内で判断して左旋回又は右旋回を行い、どのような角度からでも次の直線でライントレースがし易い位置に移動する。
又、曲がった角をカウントすることにより自分のいる位置を判断し、所定の位置に到着すると各ポストの位置情報を調節する処理(※1)を行う。
ポスト探索mode(search,revsearch)
ポスト探索を行う2辺での外周移動時に用いる。最高速modeと同様にライントレースと角の探知を行うが、直進中にポストの探知を行い、ポストを発見した場合判定モードに移行する。
復帰mode,判定modeからこのmodeに移行してきた場合、一度発見したポストを再度発見しないよう一定時間超音波センサの値を読まないようになっている。
最高速modeと同様右回り(search)と左回り(revsearch)用に分かれている。
判定 mode(master)
search,revsearchモードで探知したポストが番号を知っているかを判断する。
ポスト番号を知らない場合はapproachモード→
identifyモードへ移行するように変数に値を代入する。
ポスト番号を知っていて、獲得すべき場合はapproachモード→
hunterモードへ移行する。
ポスト番号を知っていて、獲得すべきでない場合はsearch,revsearchモードへ移行する。
ポスト接近mode(approach)
ポスト接近時に使用。まずポストに対して正面を向きミルス標準関数correct_direction1により相対補正を行う。
そして、currect_direction1により得られたuss情報からポストまでの距離と走行時間を割り出し、ポストに向かって直進、ポストから約30cm手前で停止する。
ポスト番号確認mode(identify)
ポスト番号確認時に使用。ポストに向かってゆっくりと直進し、ミルス正面のタッチセンサが反応したら停止する。白線センサにより、ポスト番号を確認。このときポスト情報を"post_data.txt"に書き込む。その後約30cm後退する。
ポストの発見数が4つ目だった場合、残りの1つのポストの番号を自動的に判断する。
ポスト獲得mode(hunter)
ポスト獲得時に使用。まず90°回転し、ポストの回りを円周する。このとき赤外線センサによりスイッチ部を探知したら、アームを出してポストを獲得する。ポスト獲得後、円周運動に戻りmode開始時の位置で止まり、ポストに対して正面を向き停止する。
復帰mode(leave)
ポスト接近後、外周移動に戻る際に使用。180°回転し外周に対して垂直に向き直進する。白線を探知したらライントレースし易い位置に移動する。
その後、次に取るべきポストはどちら回りに行けば近いかを判断しその方向を向く(※2)。
次に取るべきポストというのは、まず次に獲得すべきポストの場所が分かっている場合は、到達するまでの距離が近いと思われる方向から周回してたどり着くポストである。
分からない場合は、現在いるポストの位置から最も近い場所にある番号を知らないポストであります。
(※1)
今回の競技ではポストの数は5つなので、初期位置からフィールドを2つに割るように線を引くと、どちらかにはポストは2つしかない状態になります(図1)。
黒線…外周のライン
赤…MIRS
黒丸…ポスト
図1
しかし競技がスタートした時点ではMIRSにはポストがどの位置にあるか分かっていません。そのために真ん中で引いた線に加えさらにフィールドを6つに分割します。このときそれぞれの区分には最大で1つのポストしか入らないと仮定します(図2)。それぞれの区分にミルス初期位置から反時計回りに番号をつけました。
図2
このようにするとMIRSが図3の位置まで到達すると道中にポストが3つ在る訳ですから残りは2つ、つまり4,5,6の区分の内の1つにはポストが入っていないと考えられます。この場合プログラムでは区分6を削除し、左側の区分は4,5のみであると考えるようにします(図3)。
図3
右にポストが2つしかない場合は区分3を削除します(図4)。
図4
(※2)
どちらの方向から周回した方が近いのかを判断する方法を説明します。
今、仮に区分2のポストを獲得し次に区分6のポストを取りたいなと思っていたとします(図5)。
図5
まず初めに次の区分と1つ前の区分を調べます。通常では3,1となりますが、この状態ではすでに区分3が削除されていますので考えないものとし、4,1を調べます。しかし非常に残念ながら、この2つは目的のポストではありませんでした。
次にさらにその次の区分と2つ前の区分を調べます。その次の区分は5です。しかし2つ前の区分は存在しません。このような状態になったら一番最後の区分である6番を調べます。
ここでようやく目的のポストのある区分を発見しました。最後にこの区分をどちら回りで調べたかによって進む方向を決定します。この場合では、現在位置である区分から前へ前へと調べていったので、進むべき方向は時計回りとなります。
また、次に取るべき番号のポストをまだ発見していなかった場合や区分を5つに減らしていない状態でも上とほぼ同じような動作で調べることができます(図6)。
今、2番ポストを獲得しましたが、3番ポストを発見していません。さらにMIRSには区分4にポストが有るか無いか分かっていません。さてどうする?
図6
まず両隣を調べます。区分2にあるポストは次に取るべきポストではないので違います。反対に6番はまだ見に行っていません。なのでこの場合は一番近い区分6を見に行くために時計まわりで周回します。
1.
動作モード詳細(フローチャート)
1.
メインモード
2.
初期動作モード
3.
最高速モード
4.
左折モード
5.
ポスト探索モード
6.
判定モード
7.
ポスト接近モード
8.
ポスト番号確認モード
9.
ポスト獲得モード
10. 復帰モード
フローチャート内で白線センサ、超音波センサの判定を行っているので、その位置を次の外観図に示す。
1.
メインモード void
main(void)
2.
初期動作モード void
prologue(void)
※velocity : 最高速modeで用いる変数である。角から走り始める場合と初期位置から走り始める場合では走るべき距離が違うため、
あらかじめMIRSに進んでいるように認識させる必要がある。この変数は、自分が現在初期位置にいるかどうかを判断するときに用いる。
3.
最高速モード void
vmax(void) / void revvmax(void)
※encoder:最高速modeではミルスが外周の一辺を走った距離を表す変数として使用する。
※velocity : 最高速modeで用いる変数である。角から走り始める場合と初期位置から走り始める場合では走るべき距離が違うため、あらかじめMIRS
に進んでいるように認識させる必要がある。この変数は、自分が現在初期位置にいるかどうかを判断するときに用いる。
4.
左折モード void
drift(void)
※corner:曲がった角の回数を表す変数。フィールドを一周したら値を0にする。
※Pzyunvan:ポストの順番を記録する変数。
5.
ポスト探索モード void
search(void) / void research(void)
6.
判定モード void
master(void)
7.
ポスト接近モード void
approach(void)
8.
ポスト番号確認モード void
identify(void)
1.
ポスト獲得モード void
hunter(void)
※encoder:獲得modeではポストの周りを移動した距離を表す変数として使用する。
2.
復帰モード void
leave(void)
1.
モード遷移表
|
初期動作mode |
最高速mode |
左折mode |
ポスト探索mode |
ポスト接近mode |
番号確認mode |
獲得mode |
復帰mode |
初期動作mode |
× |
動作後 |
× |
× |
× |
× |
× |
× |
最高速mode |
× |
× |
白線探知後 |
× |
× |
× |
× |
× |
左折mode |
× |
角を曲がった回数が偶数の場合 |
× |
角を曲がった回数が奇数の場合 |
× |
× |
× |
× |
ポスト探索mode |
× |
× |
× |
× |
発見したポストの番号が取るべき番号か又は番号がわからない場合。 |
× |
× |
× |
ポスト接近mode |
× |
× |
× |
× |
× |
接近したポストの番号が判らない場合 |
接近したポストが取るべき番号の場合 |
× |
番号確認mode |
× |
× |
× |
× |
× |
× |
確認した番号が取るべき番号の場合 |
確認した番号が取るべき番号でない場合 |
獲得mode |
× |
× |
× |
× |
× |
ポストを獲得できなかった場合、動作終了後 |
× |
ポストを獲得できた場合、動作終了後 |
復帰mode |
× |
× |
× |
動作終了後 |
× |
× |
× |
× |
ソースファイル名 |
関数名 |
書式 |
戻り値 |
説明 |
行動系 |
||||
functions.c |
uss_get |
int uss_get(int); |
測定データ |
超音波による距離測定 |
correct_distance |
int correct_distance(void); |
0 |
ポスト接近時の距離補正 |
|
correct_direction1 |
int correct_direction1(void); |
0 |
ポスト接近前の角度補正 |
|
correct_direction2 |
int
correct_direction2(void); |
0 |
ポスト補正後の角度補正 |
|
post_approach.c |
post_approach |
int post_approach(int); |
0 |
ポスト接近 |
both.c |
pwm_enco_start |
void pwm_enco_start(int); |
なし |
RTタスクスレッドを開始 |
pwm_enco_stop |
void pwm_enco_stop(void); |
なし |
RTタスクスレッドを停止 |
|
pwm_enco_restart |
void pwm_enco_restart(void); |
なし |
RTタスクスレッドを再開 |
|
駆動系 |
||||
encoder.c |
encoder_data |
void encoder_data(float *lm, float *rm, float *lv, float *rv, int *br); |
なし |
100[ms]ごとの左右のタイヤの回転距離,速度を返す |
encoder2.c |
encoder_data2 |
void encoder_data2(float *la, float *ra, int *br); |
なし |
100[ms]ごとの左右のタイヤの回転距離,速度を返す |
encoder3.c |
encoder_data3 |
void encoder_data3(float *la, float *ra, int *br); |
なし |
左右のタイヤの回転角度の合計を返す |
pwm.c |
pwm_both_data |
void pwm_both_data(int, int); |
なし |
Duty比指定移動 |
pwm_lqr_straight |
void pwm_lqr_straight(int, int); |
なし |
LQR制御による直進移動 |
|
pwm_lqr_rotate |
void pwm_lqr_rotate(int, int); |
なし |
LQR制御によるその場回転 |
|
pwm_lqr_circle |
void pwm_lqr_circle(int, int, int); |
なし |
LQR制御によるポスト周回 |
|
functions.c |
lqr_straight |
int pwm_lqr_straight(int, int); |
0 |
pwm_lqr_straightのマクロ |
lqr_rotate |
int pwm_lqr_rotate(int, int); |
0 |
pwm_lqr_rotateのマクロ |
|
lqr_circle |
int pwm_lqr_circle(int, int, int); |
0 |
pwm_lqr_circleのマクロ |
|
スレッド系 |
||||
thread_func.c |
irs_ts_ws |
void *irs_ts_ws(void *t); |
なし |
赤外線,タッチセンサ,白線センサ読み取りスレッド |
|
encoder |
void *encoder(void *t); |
なし |
エンコーダデータ読み取りスレッド |
|
uss_read |
void *uss_read(void *t); |
なし |
超音波センサ測定スレッド |
標準動作プログラム関数レファレンス
http://www2.denshi.numazu-ct.ac.jp/mirsdoc2/mirsstnd/manu/num0002a/std-soft-reference.html より
関数名 |
書式 |
戻り値 |
説明 |
main |
void main(void) |
なし |
メイン関数 |
start |
void start(void) |
なし |
初期動作、初期値を設定 |
Vmax |
void Vmax(void) |
なし |
最高速走行 |
left |
void left(void) |
なし |
左折 |
search |
void search(void) |
なし |
ポスト探索 |
judge |
void judge(void) |
なし |
ポストへ行くか、探索を続行するか判定 |
approach |
void approach(void) |
なし |
ポストへ接近 |
identify |
void identify(void) |
なし |
ポスト番号を確認 |
get |
void get(void) |
なし |
ポスト獲得動作 |
leave |
void leave(void) |
なし |
ポストから外周の白線へ復帰 |
「白線センサデバイスドライバ」「赤外線センサデバイスドライバ」
「赤外線コード判別デバイスドライバ」「超音波デバイスドライバ」
「PWMデバイスドライバ」「ロータリーエンコーダデバイスドライバ」は標準機のものを使用する。
3.
標準機より用いるモジュールとモードの相関図
|
初期動作mode |
最高速mode |
左折mode |
ポスト探索mode |
ポスト接近mode |
番号確認mode |
獲得mode |
復帰mode |
RT起動 |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
RT停止 |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
RT再起動 |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
移動距離 |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
速度獲得 |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
タイヤ回転角獲得 |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
タイヤ回転角合計獲得 |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
LQR制御前進 |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
LQR制御自転 |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
LQR制御公転 |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
白線センサ |
○ |
○ |
○ |
○ |
× |
○ |
○ |
○ |
超音波距離測定 |
× |
× |
× |
○ |
○ |
× |
× |
× |
正対補正 |
× |
× |
× |
× |
○ |
× |
× |
× |
赤外線センサ |
× |
× |
× |
× |
× |
× |
○ |
× |