int circle_adj(int ang_adj, int search_end, int target_post)
post_code_get(ポスト番号識別)やpost_get(ポスト獲得)後、次のポストに向かう前に、競技場中心とポスト中心を結ぶ直線上に移動する関数。
ang_adjが移動角度。ang_adjはcontrol.hで定義される外部変数であり、post2post_calc実行時に値が代入される。
int post_sort(int search_end, int sort_select)
ポストデータを並び替える関数。
MIRS0604は、標準プログラムのpost_selectを廃止し、代わりにこの関数でポストデータを望ましい順序に並び替えている。
ポスト探索終了時と、全ポスト番号認識完了時の2回呼び出される。
前者では角度順に、後者ではポスト番号順に並べ替える。
sort_select=1で角度昇順、sort_select=2で角度降順。
int move_centerpos(int dis)
競技開始時に、競技場の中心まで進む関数。
進路にポストがあり、MIRSがスタックしたときはそれを認識し、そのポストを避けて中心へと向かう。
ポスト回避は1回のみなので、競技場中心までの経路に2つ以上のポストがあった場合には未対応。
引数のdisには移動距離[mm]を入れる。
int post2post_calc(int target_post, int search_end)
現在ポストから目標ポストまでの距離、角度を計算する関数。
さらに、「目標ポストに向かい、番号識別/獲得を終えた後の補正動作(circle_adj)に必要な移動角度」の計算と
「目標ポストが右側・左側のどちらにあるか」の判断も行っている。
競技場中心・MIRS中心・目標ポスト中心を頂点とする三角形を考え、正弦定理・余弦定理を用いて計算している。
計算値は外部構造体p2p_dataに格納される。
「目標ポストが右側・左側のどちらにあるか」の判断結果は外部変数rotate_dir_selectに格納される。
post_crash_check()を呼び出すことにより移動時に障害となるポストの数も調べ、その数を返す。
なお、角度・距離計算の細かい理論は
技術報告書の6及び
基本設計書参照。
int post2post_move(int target_post, int search_end)
現在ポストから目標ポストまで移動する関数。
目標ポストの方を向き、正対補正をかけ、目標ポストの手前まで進んでからもう一度正対補正をかけて終了する。
ポスト獲得モードでは、最後にmoveOnCircleRadius()を呼ぶ。
void moveOnCircleRadius()
ポスト周回半径上に移動する関数。
ポストとまっすぐ接するまで前進し、その後指定量だけ下がるので結構正確。
ポスト周回前はもちろん、ポスト獲得時にも赤外線発見後に呼ばれる働き者。
int post_code_get(int num)
ポスト番号識別動作を行う関数。
前進してポストと接触後、post_code_judge()を呼び出し、後退して終了。
int post_code_judge()
ポスト番号を識別する関数。
白線センサの状態からポスト番号を判断し、それを返す。
白線センサの状態がポスト番号1〜5のどの場合にも一致しなかった場合-1を返す。
int post_search_t(int center_count)
ポストを探索する関数。
MIRS0602から提供を受けた関数なので、説明はそちらを参照。
この関数のおかげで標準プログラムのpost_checkが廃止でき、ポスト探索の大幅な時間短縮に成功した。
参照:
MIRS0602 ポスト探索プログラム仕様書
int datawrite_angdis(void)
ポストの角度・距離データと発見ポストの数をバイナリファイルに出力する関数。
低水準入出力を用いている。
int datawrite_code(void)
ポスト番号をバイナリファイルに出力する関数。
ポスト番号の出力だけ別関数なのは、この関数をポスト番号識別後に1回1回呼び出すことで、モード中予想外の動作によりプログラムを終了させてしまった場合でもそれまでの識別結果を無駄にせず、2回目の競技を1回目の競技の中断箇所から再開することができるようにするためである。
int dataread(void)
ファイルからポストデータを読み込む関数。