沼津高専 電子制御工学科
MIRS0604 ソフトウェア取扱説明書
MIRS0604-SOFT-0002
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2007.02.05 小谷田 高村 初版

1. 始めに

このドキュメントは、MIRS0604が使用した関数のうち、新規に作成した関数と、標準関数から変更を加えたものをまとめたものである。
参照:標準動作プログラム関数レファレンス

2. 新規作成関数一覧

Table.1 競技時使用関数
ソースファイル名 関数名 書式 戻り値 説明
circle_adj.c circle_adj int circle_adj(int, int, int); 0 競技場の基準点とポスト中心を結ぶ直線上に移動
functions.c post_sort int post_sort(int, int); 0 ポストデータを角度順/ポスト番号順にソート
move_centerpos.c move_centerpos int move_centerpos(int); 0 基準点に移動
post2post.c post2post_calc int post2post_calc(int, int); 邪魔なポストの数 現在ポスト⇔目標ポストの距離・角度計算
post2post_move int post2post_move(int, int); 0 目標ポストに移動
moveOnCircleRadius void moveOnCircleRadius(void); なし ポスト周回半径に移動
post_code_get.c post_code_get int post_code_get(int); 0 ポスト番号識別
post_code_judge int post_code_judge(void); ポスト番号 or -1 ポスト番号を返す
post_search_t.c post_search_t int post_search_t(int); 0 ポスト探索
readwrite.c datawrite_angdis int datawrite_angdis(void); 0 or -1 ポストの角度・距離をファイル出力
datawrite_code int datawrite_code(void); 0 or -1 ポスト番号をファイル出力
dataread int dataread(void); 0 or -1 ポストデータの読み込み

Table.2 その他関数
ソースファイル名 説明
dat_reader.c 出力バイナリファイルを読む
test_post_code_get.c post_code_getのテスト
test_post_get.c post_getのテスト

3. 変更関数一覧

Table.3 変更関数
ソースファイル名 関数名 変更箇所
control_test.c main 大部分
functions.c correct_direction1 旋回角度・秒数
initialize.c initialize 新規外部変数の初期化
post_get.c post_get 周回方向・赤外線発見時動作・ポスト獲得後動作

4. 競技時使用関数説明

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)
ファイルからポストデータを読み込む関数。


5. MIRS0604使用プログラム

変更を加えたのはcontrolフォルダ内のみなので、MIRS0604のcontrolフォルダの圧縮ファイルを公開する。
control_final.tar.gz (134,919 バイト)