沼津高専 電子制御工学科
MIRS0804 プログラム関数レファレンス
MIRS0804-SOFT-0002
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2009.2.13 浦田 浦田 初版



目次
1. はじめに
2. ヘッダファイル一覧
3. ヘッダファイル解説
4. 関数一覧
5. 関数解説
6. 付録





1. はじめに

本ドキュメントは、MIRS0804 ソフトウェア詳細設計書(MIRS0804-SOFT-0001)を元に作成したプログラムで使用する関数について取りまとめたドキュメントである。
なお、本ドキュメントに記載する関数は、MIRSSTND 標準プログラム(Ver.2.1)(MIRSSTND-SOFT-0003)より変更のあったものに限る。したがって、標準機と同様の関数については、MIRSSNTD 標準動作プログラム関数レファレンス(MIRSSTND-SOFT-0002)を参照のこと。




2. ヘッダファイル一覧

table.1に、標準プログラムより変更のあるヘッダファイルの一覧を示す。

table.1 ヘッダファイル一覧
ファイル名 変更点
control.h define文・グローバル変数・post構造体メンバの追加
func_exturn.h 新しく定義した関数のextern宣言の追加



3. ヘッダファイル解説

control.h
control.hには、以下のdefine文・グローバル変数・post構造体メンバを追加した。

table.2 control.hに追加・変更したdefine文
名称 書式 説明
POST_NUM 2→5 #define POST_NUM 5 総ポスト数
USS_MAX 1500→1850 #define USS_MAX 1850 最大計測可能距離
USS_MIN 300→280 #define USS_MIN 280 最小計測可能距離
MCENTER_USS3_DIS 138→35 #define MCENTER_USS3_DIS 35 MIRS中心からUSS3までの距離
MCENTER_USS12_DIS 120→75 #define MCENTER_USS12_DIS 75 MIRS中心からUSS1,2までの距離
USS12_DIFF 0→-23 #define USS12_DIFF -23 USS1と2の誤差
AROUND_ANG 360-10→360 #define AROUND_ANG 360 ポスト一周分のアングル
STADIUM_DIS 1340 #define STADIUM_DIS 1340 競技場中心線上での競技場中央からポスト中心までの最大距離:
1800(競技場の1辺/2)-450(競技場外周からポストまでの距離)-10(ポスト半径)[mm]
MIRS2007 競技規定(MIRS07SF-CURR-0001)準拠
POST_TO_POST 450 #define POST_TO_POST 450 ポスト間の最低距離 MIRS2007 競技規定(MIRS07SF-CURR-0001)準拠

table.3 control.hに追加したグローバル変数
名称 書式 利用される関数 説明
trust_level int trust_level[POST_NUM+1] get_num(functions.c) get_numにより取得したポスト番号の信頼度



4. 関数一覧

table.4に標準プログラムより変更のある関数の一覧を、table.5に追加する関数の一覧を示す。

table.4 変更のある関数
ソースファイル名 関数名 書式 戻り値 説明
control_test.c main int main(void); 0 メイン関数
post_get.c post_get int post_get(int); 0 ポスト獲得
post_check.c post_check void post_check(int); 0 ポスト確認
post_approach.c post_approach int post_approach(int); 0 ポスト接近
functions.c correct_direction1 int correct_direction1(void); 0 ポスト接近前の角度補正
irs_code_get (削除) int irs_code_get(int); 赤外線コード or 0 赤外線のコード判別:必要がないため削除

table.5 追加する関数
ソースファイル名 関数名 書式 戻り値 説明
post_search_0.c post_search_0 int post_search_0(int); 0 開始位置でのポスト探索
functions.c (既存) get_num int get_num(void); ポストのラインの数 ポストの黒色ライン読み取り
change int change(void); 0 ポスト位置データの座標変換
arm_move int arm_move(void); 0 アーム動作
judg int judg(int); 0 有効範囲内のポストか否かの判定



5. 関数解説

変更、追加のある関数の詳細を、以下に記述する。

int post_get(int target_post)

アームを使用してポストを獲得する為に大幅の改良を加えた。
関数が始まる位置は標準機と同様である。なお、アームを動作させるタイミングでは、arm_moveを呼出している。

    1. 150[mm]後退してアームを展開する。
    2. ポストに接触するまで接近し、接触した時点でアームを閉じる。
    3. アームを閉じ終わったら(獲得失敗の例外動作はない)、アームを展開する。
    4. 300[mm]後退して、アームを収納する。
    5. get_numを呼出して、ポスト番号を取得する。
    6. ポスト番号取得後、開始位置まで戻り、プログラムを終了する。

void post_check(int center_count)

center_countが0(post_search_0の実行後)の場合に、ポスト再確認のための回転を逆向きに行うように変更。対象に遠回りせずに向き合えるようにした。


int post_approach(int target_code)

標準機ではポストの角度(post.ang)を+180度〜-180度の間で計算している。センサ取り付け位置が逆になったため、角度に180度を加算して計算するように修正。
また、MIRS0804は周回動作はせずにアームによってポストを獲得するため、ポスト正対後の停止位置をアーム展開の邪魔にならないよう調整した。


int correct_direction1(void)

動作試験の正対動作時に、向き直る角度が足りないことが多かったため、片方のセンサが完全にポストから外れている場合(9999を返した場合)の移動量を増やした。


int irs_code_get(int dumy)

赤外線センサは使用しないため、削除。


int post_search_0(int center_count)

競技開始位置からポスト探索を行う関数。center_countが0のとき(競技場中心に移動前)に実行される。まず、超音波センサを使いながら左に180度回転し、その後180度右回転して正面に向き直る。右回転の際、超音波センサは使用しない。ポストを発見した場合には、そのデータをpost構造体に入れる。


int get_num(void)

ポスト獲得後、ポストから300[mm]離れた地点でpost_getより呼出される。
この関数は、白線センサタワー(製造時仕様書(MIRS0804-MECH-000)参照)を使用してポスト番号を取得する。 以下の手順でポストへアプローチする。

    1. ポストへ向かって200[mm]直進する。
    2. その場で180[deg]回転する。
    3. 100[mm]後退しながら、白線センサタワーに取り付けられたタッチセンサの反応を確認する。
    4. 後退が終了するまでにタッチセンサに反応があった場合、ポスト番号識別に移る。
    5. 反応がなかった場合、若干の補正動作を行う。
    6. 補正動作によりタッチセンサに反応があった場合、ポスト番号識別に移る。
    7. 反応がなかった場合、未取得のポスト番号を5から順に割り当てる。

ポスト番号識別の手順
get_numでは、以下の手順でポスト番号の識別を行う。なお、白線センサの番号は、白線センサタワーの上に取り付けられているものから順にws[3]→ws[2]→ws[1]→ws[0]として扱っている。

fig.1 白線センサの番号とポスト番号

    1. ws[3]から順に値を参照して、始めに白を見付けた位置より下の白線センサが全て白を見付けていたら該当するポスト番号(fig.1参照)とする。そうでなければエラー。functions.c内で定義されているCHECK_LOOP回までリトライする。
    2. 1でポスト番号を取得できなかった場合、一番上の白のみでポスト番号を判断する。判断した番号が既にポスト構造体のcodeに登録されていた場合ときは取得を失敗する。
    3. 1,2でポスト番号を取得できなかった場合、ポスト構造体のcodeに登録されていないポスト番号を5から順に割り当てる。

1でポスト番号を獲得できた場合、この番号の信頼度をtrust_level1とする。同様に、手順2,3でポスト番号を獲得した場合は、trust_level2,3とする。信頼度はtrust_level1>2>3の順で高い。
ただし、白線センサに反応がない場合、白線センサはすべて1を返す(黒と判断する)ため、5番は常にtrust_level3となる。
獲得したポスト番号が以前獲得したものと重複した場合、trust_levelの高いものを正しいと判断し、該当ポストの番号には未取得のものを割り当てる。これで割り当てられた番号の信頼度はtrust_level3とする。


int arm_move(void)

get_numから呼び出される。デバイスドライバを通じてPICへ信号を送り、アームを動作させる。アームの動作はPICが制御しているため、異なる動作を行う場合でも同様の信号を送信するのみである。
ハンドシェアリング機能はついているが、現在例外動作を組み込んでいないため、PICから反応がない場合は反応を待ち続ける仕様である。


int change(void)

post_search_0で探索を行ったときに、ポストの判定、post構造体への書き込み等は標準機のものを使用しているため、得られたデータは全て「MIRSが競技場中央で右回転を行い」取得したものとして記録される。それを、三角関数を用いて正しいデータに直すための関数。


int judg(int target_post)

取得したポストデータが正しいものかどうかを判断する関数。競技場の範囲、競技場縁からポストまでの最小距離等、規定を基にして有効なポストであるか否かを決める。発見しても場外と思われる対象のデータは、post構造体から削除される。




6. 付録

名称 ファイル名 (ファイル容量) download
MIRS0804プログラムパッケージ (contorlディレクトリのみ) mirs_std_v2.1_0804.zip (64,136 byte)


関連文書
・ MIRS0804 ソフトウェア詳細設計書(MIRS0804-SOFT-0001
・ MIRSSTND 標準動作プログラム関数レファレンス(MIRSSTND-SOFT-0002
・ MIRSSTND 標準プログラム(Ver.2.1)(MIRSSTND-SOFT-0003