沼津高専 電子制御工学科 | ||||||
| ||||||
改訂記録 | ||||||
---|---|---|---|---|---|---|
版数 | 作成日 | 作成者 | 承認 | 改訂内容 | ||
A01 | 2003.2.14 | 花島 | 中村 |
初版 |
このMIRSプログラムは5つのライブラリ、7つのヘッダファイル、 15個の実行ファイルからなる。
ライブラリファイルではFPGAに信号を送受信し、受け取ったデータを加工することによって
FPGAと実行ファイルの橋渡しを行う。
それぞれの役割は関数説明書に記述してある。
ヘッダファイルでは主に関数の宣言と構造体の宣言を行っている。
特にmirs.hでは各実行ファイルのデータの橋渡しをするmirs構造体を記述している。
実行ファイルではMIRSの行動を分割して考え、各モードの目的を達成するための
プログラムを記述している。
このプログラムは何度も仕様を変更しているので、詳細設計書とは異なっている
可能性がある。各プログラムのソースを参考にし、注意すること。
ここから各ファイルについての説明を記述する。
mirs.h各モード、競技場の幅など全体に影響することを定義し、またMIRS構造体 等を宣言している。各行動プログラム間で直接呼出しができないために、 MIRS構造体を用いることによってデータを渡している。 グローバル変数をまとめた物とも言う。この部分も仕様変更によって 使っていない変数が存在する。
各ライブラリファイルの関数宣言を行っているだけ。
ひっそりとvector2という構造体を宣言しているほかライブラリファイルで 使用するポート番号を定義している。
超音波センサで対象との距離を測定するための関数群 initUSSでポートの使用許可を取得し、release_USSで ポートを開放する。具体的な機能は関数説明書参照。 get_USS_all関数は蛇足気味で実際には使用していない。
実際にはLCDを搭載しなかったので端末への出力とファイルへの 書きこみを同時に行う関数になっている。 搭載しなかった理由は難しい、面倒、なくてもいいじゃないか、etc
MIRSを動かす関数群と現在位置を返す関数が存在する。 現在位置を取得する方法は、直進時のみ光学マウスを用い、 他の時はロータリーエンコーダを用いた。オムニホイールが 使えなかったせいもあり、マウスはあまり役に立たなかった。
反応を自動的に返すのではなく、関数を呼び出すことによって 現在の状態を返す。MIRSを移動させる時には忘れずに呼び出して やらなければならない。
赤外線を読み取り、ナンバーを割り出して返している。 最初の値はずれていることがよくあるので、何回か値を取って 比較する必要がある。
関数の始めと終わりにライブラリの初期化と終了をさせる。 またliblcd.cで使用するファイルを作成しておく。 行動プログラムを遷移させる時にはこのプログラムを介している。
target_posで指定された位置に移動するプログラム。 X軸を移動した後にY軸を移動する。途中で障害物に当たった時は 回避してプログラムを再開する予定だったが、座標の信頼性が低いため、 問答無用でpost_centerに遷移する仕様に変更された。 shift_post_data関数は指定された座標に到着してもポストがなかった場合、 ガセネタと判断し、データを抹消する。search_ap関数はmode_findの search関数と同一の関数。
次に移動すべき場所を知っていればtarget_posにその場所を代入し、 mode_approachに遷移する。そうでなければmode_findに遷移する。 知らずにスイッチを押してしまった時でも、その次以降のポストを 獲得できるよう最初の部分に改良が施されている。
ポストを全て獲得した時にそのポストの座標などを記録する。 しかし座標の情報は信頼が低く役に立たない上に、実際に呼び出されたことは 数度しかない。
行動プログラムを個別にテストするための関数。時々使用した。
ポストを見つけるための関数。まっすぐ進み続け、競技場の端に来たら 90度右旋回する。旋回後競技場の端に沿って進むが、そのときに競技場から 出ないように角度の調整をする。それがADJUST_CORSEによって行われている。 但しこれは端から出ないようにしているだけで、端に沿って進むとは限らない。 どの位置からmode_findが始まるか判らないのでこのような仕様となっている。 移動中はTS,IRS,USSのチェックを行い、TSに反応があればmode_post_centerに、 IRSなら軸をずらし、USSならmode_judge_getを用いてポストの位置を調べ、 未知のポストならば目標座標をtarget_posに代入してmode_approachに遷移する。
ポストのスイッチを押して周回開始位置に戻る。 スイッチが押されたことを確認した後にmirs構造体のポスト情報を変更する。 なお、curve_PWMで座標体系を変えているため周回開始位置に戻る必要がある。 そのためにmode_revolveでmirs->revolve_angleに代入した周回開始位置を用いて 元の場所に戻る。
MIRS構造体、ポスト情報を初期化する。その後mode_findに遷移し、 ポストの探索を開始する。
前回終了時に記録したポスト情報をMIRS構造体に代入し、初期化を行う。 ただし、座標の信頼性が低いために使用されなかった。
とるべきポストの数を記録する。その後mode_waitに遷移。
mirsの位置とUSSの値から発見したポストの座標を割り出す。 最初は動作モードの一つだったが、複数のモードから呼び出され、かつ 呼び出されたモードに戻る必要があったために、サブ関数の一つとなった。 割り出したポストの座標から、未知のポストかどうか、競技場の外からの 反応かどうかを調べ、未知のポストだったときはmirs->total_find_postを増やして 1を返し、それ以外の時は0を返す。
ポストの中心を割り出す。端のTSに接触したときは中央のTSに接触したときの 3倍の角度で旋回する。2番と3番のTSが同時に接触したときはその時のMIRSの位置を ポストの座標に上書きし、mode_revolveに遷移する。
周回開始位置をmirs->revolve_angleに記録した後にポストを周回して赤外線を探す。 何周かしても見つからなかったときは、ポストナンバーを-1とする。ただし、既に 番号が書き込まれているときは上書きしない。これらは知らずにスイッチを押してしまったときの 対策の一つである。
プログラムが開始されてから最初に移るモードであり、押された番号によって 各モードに遷移する。