沼津高専 電子制御工学科
MIRS0701 ソフトウェア詳細設計書
MIRS0701-SOFT-0001
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2007.9.12 小澤(拓)・池田・小澤(竜) 池田 初版
A02 2007.11.2 小澤(竜) 池田 4.1の訂正
A03 2007.11.26 小澤(拓)、池田 池田 2.9の変更
A04 2008.1.18 池田 池田 ドットマトリクス開発中止の文の追加



目次

1 目的
2 動作内容(ソフトウェアで行う内容)
3 主な流れ
4 主に追加される関数・変数の説明

注:ドットマトリクスは開発を中止した



1 目的

この文書ではMIRS0701基本設計書に規定されたシステムの動作規定、 状態遷移を実現する各タスクの開発(コーディング、試験等)に必要な事項を述べる。


2 動作内容(ソフトウェアで行う内容)

2.1 中心位置移動動作&ポストサーチ (int post_search1(int);)

中心位置に移動し回転し超音波センサを使い、ポストの距離と角度を記憶させる


Fig.1 フローチャート(中心位置移動動作&ポストサーチ)


2.2 ポスト接近@(int post_approach1(int x,int y))

MIRSが現在いる座標から指定された場所(ポスト等)までの接近
指定された座標の1つ手前まで移動


Fig.2 フローチャート(ポスト接近@)
Fig.3 移動距離算出


2.3 ポスト接近A(int post_approach2(int))

ポスト付近でポストをサーチさせ、ポストと正対するようにする
このとき接近する前に補正した角度を記憶させてMIRSの角度を更新する
この動作は標準プログラムを参考(correct_direction,post_search)に作成する


Fig.4 フローチャート(ポスト接近A)


2.4 ポスト判別(int post_check(int))

前面のタッチセンサが押されたとき、白線センサ4個の値からポスト番号を読み取りその情報を保存する
このときポスト情報の更新を行う


Fig.5 フローチャート(ポスト判別)


2.5 ポスト獲得(int post_get(int))

post_checkで読み取ったポスト番号によって動作を変える
モータを制御し、ポスト獲得装置を降ろして前後左右に動きポストを獲得したのち、ポスト獲得装置を上げる


Fig.6 フローチャート(ポスト獲得)


2.6 ポスト位置予測(int post_search2(void))

発見済みのポストの判別や獲得が終わったときに行う
すでにわかっているポストの位置からポストの位置を予測させる

@ 発見されたポストの位置と中心を1とし、その他を0とする。


Fig.7 ポスト位置予測(1)


A 外側の3×3マスの合計が0となる場所を検索し、その結果を変数に入れる


Fig.8 ポスト位置予測(2)


B 隣り合った変数が1になる個数で優先度を決定し、移動する位置を決める
例)上の図ではまず始めに1〜5・25〜28の固まりがもっともスペースが多いのでここを探索する


2.7 予測ポストサーチ&獲得(int post_approach3(void))

予想された範囲の近くでポストサーチを行う
この動作を行うときすでに発見しているポストを除外できるようにする
これはポスト接近Aのプログラムを元にし、距離と角度からすでに発見したポストを除外し座標を記録する
その後、獲得動作を行う


Fig.9 フローチャート(予測ポストサーチ&獲得)


2.8 MIRSの位置補正

ポストよりMIRSの位置を補正
ポストの補正をする際すでに位置が確定しているポスト(最初に行うサーチで見つけたポスト)のとき、角度と距離から自分の位置を補正する


2.9 ドットマトリクスの表示

2.9.1 ドットマトリクス関数

@ 引数を判別
A 既存のデータを送信
B END

Fig.10 フローチャート(ドットマトリクス関数)


2.9.2 バイナリエンコーダ

@ 01のファイルを読み込み
A 波形送信プログラムをファイル出力
B END

Fig.11 フローチャート(バイナリエンコーダ)


※01ファイルはLinuxのGNOMEエディタで作成。メモ帳だと改行コードの違いからか、エラーになってしまうので注意。

−01ファイルsample−
00000000000000000000000000000000
00111111111100000000000000000000
00100000000100000000000000000000
00111111111100000001100001110000
00100000000100000011110000001000
00100000000100000010010000000000
00100000000100000010010011100000
00100000000100010010010000010000
00100000000100010011110000000000
00100000000100111111111100000000
00100000000100001000010000111000
00100011100100001011010000000100
00100011100101110100101110000000
00100000000100000100100000011100
00111111111100000011000000000010
00000000000000000000000000000000


2.9.3 エンコーダ in MIRS

@ 仮想マップをロード
A ロードしたデータを波形作成用に変更
B 波形作成
C 波形送信
D END

Fig.12 フローチャート(エンコーダ in MIRS)


2.10 座標変換(int change(int dis,int ang))

ポストサーチなどで得られたデータから曲座標を直交座標に直し保存する

直交座標に直すプログラム例
py[i]=dis*sin(ang/180*PI)/ONE_B;
px[i]=dis*cos(ang/180*PI)/ONE_B;
j=10*py[i]+px[i];
num[i]=1;

※ONE_Bは仮想競技場一ブロック分の長さ


Fig.13 座標変換


2.11 MIRS&postの位置保存

MIRS自身の座標を保存することで仮想マップ上の位置や角度を確認する
この動作はMIRSが移動したとき随時行う
m[i] i=1のときMIRSのY軸の値、i=2のときMIRSのX軸の値、i=3のときMIRSの角度を入れる
ポストの番号を読み取ったときにpost.x[i]とpost.y[i]にポスト番号に対応させて座標を保存する
またpostの位置情報が更新される毎にテキストファイルに保存する(二回目に使用)


3 主な流れ

3.1 競技1回目(int main1(void))

最初に初期化を行い中心まで行ってサーチを行い、近いポストから獲得開始
発見しているポストが全て調べ終わった時点でわかっているポストの位置から見つかっていないポストの位置を予測し、優先度の高いエリアから調べる
ポストを調べたときにテキストファイルに位置とポスト番号を記録させておく


Fig.14 フローチャート(競技1回目)


3.2 競技2回目(int main2(void))

最初に初期化を行う
その後、競技一回目のデータから若い番号のポストから獲得してゆく
そして、発見していないポストがあった場合はポスト探索を始める


Fig.15 フローチャート(競技2回目)


4 主に追加される関数・変数の説明

4.1 行動制御系関数

最初に初期化を行う
その後、競技一回目のデータから若い番号のポストから獲得してゆく
そして、発見していないポストがあった場合はポスト探索を始める

書式引数説明概要
int main1(void);
競技1回目のmain
int main2(void)
競技2回目のmain
int post_search1(void);
中心位置で最初のサーチ
int post_approach1(int x,int y)x,y xy軸の値座標を使って目的の位置に行くための関数
int post_approach2(int)取るべきポストの番号ポスト付近での正対補正と獲得
int post_check(int)取るべきポストの番号ポスト番号のチェック
int post_get(int)取るべきポストの番号ポスト獲得動作
int post_search2(void)
ポストの予想を行う
int post_approach3(void)
予想されたポストの範囲をサーチし、獲得を行う
int change(int,int)
距離と角度からポストの座標を割り当てる


4.2 数値演算関数(math.hに定義されている関数)

プログラムで使用する演算関数の定義

     double sqrt(double z);
          数値zの平方根を計算する

     double sin(double radian);
          radianのサインを計算する。角度の単位はラジアン(-180〜180)

     double cos(double radian);
          radianのコサインを計算する。角度の単位はラジアン(-180〜180)

     double atan2(double num,double den);
          atan(num/den)を計算する−PIからPIまでの範囲で計算する


4.3 変数

グローバル変数の構造体はできる限りcharで定義して使用する際にint,doubleにキャストする

グローバル変数

     post(構造体)

          char post.dis[9]
               中心位置からのポストサーチを行ったときのポストまでの距離

          int post.ang[9]
               中心位置からのポストサーチを行ったときのポストのある位置の角度

          char post.code[9]
               ポスト番号を保存しておく

          char post.got_post[9]
               取ったポストを記憶

          char post.number
               見つけたポストの数

          char post.y[9]
               ポスト番号に対応する場所に座標を入れる
          char post.x[9]
               ポスト番号に対応する場所に座標を入れる

     int m[2]
          m[0]にmirsのy軸、m[1]にmirsのx軸、m[2]にmirsの角度

     int px[5],int py[5]
          発見したポストのx軸・y軸の値を記憶させる

     int num[N^2]
          架空競技場でのポスト位置を記憶させる(Nは仮想マップの分割数)





関連文書

・ MIRS0701 システム提案書(MIRS0701-DSGN-0001
・ MIRS0701 開発計画書(MIRS0701-DSGN-0003
・ MIRS0701 技術調査書(MIRS0701-TECH-0001
・ MIRS0701 メカニクス詳細設計書(MIRS0701-MECH-0001
・ MIRS0701 エレクトロニクス詳細設計書(MIRS0701-ELEC-0001