沼津高専 電子制御工学科 |
||||||
|
||||||
改訂記録 |
||||||
版数 |
作成日 |
作成者 |
承認 |
改訂内容 |
||
A01 |
2005.11.11 |
佐々木、渡邊 |
鈴木 |
初版 |
||
A02 |
2005.11.14 |
佐々木、渡邊 |
鈴木 |
遷移表を改定、プログラムの流れを追加 |
||
A03 |
2005/11/28 |
渡邊 |
鈴木 |
ポストまで移動モードを改正 |
||
A04 |
2006/01/20 |
渡邊 |
鈴木 |
6.カメラ断念によるプログラムの変更の追加 |
||
A05 |
2006/02/01 |
渡邊 |
鈴木 |
上記に追加事項 |
目次
1. はじめに
2. 概要
3. 動作モード
4. モード遷移表
5. 使用する関数について
6. カメラ断念によるプログラムの変更について
1.はじめに
本ドキュメントは、MIRS0505 基本設計書に規定されたシステムの動作規定、状態遷移を実現する各タスクの開発(コーディング、試験等)に必要な事項を述べる。
2.概要
MIRS0505 ソフトウェアは、RT-Linux上で動作するプログラム群で構成される。プログラムはC言語でかかれ、Linux の標準の API とともに、行動モードに対応したプログラム、一つの機能を複数のプログラム群で提供する機能モジュール、および、RTタスク、ドライバと、補助関数と独自に定義したヘッダファイルから構成される。
3.動作モードは次の個であり文章の下に詳細な説明とフローチャートをしめす。
(1)待機モード
(2)垂直補正モード
(3)コース探索モード
(4)ポスト探索モード
(5)カメラモード
(6)ポスト判定モード
(7)ポスト獲得モード
(8)帰路モード
(9)ポスト選択モード
(10)ポストまで移動モード
(1)待機モード
モードの定義
メインプログラムを立ち上げ、スタートスイッチが押されるまで待機状態を続ける。
スタートスイッチが押されたら『コース探索モード』に移る。
(2)垂直補正モード
モードの定義 関数int p_revision(int) 戻り値 0か1
MIRSが白線と垂直になるように補正を行う。
(3)コース探索モード
モードの定義 関数 int c_serch(int) 戻り値 1
その場で左に90°回転し、前後しながら右側の超音波センサでポストがないルートを探す。ルートが決定したら右に90°回転し、その方向をMIRSの進行方向として『ポスト探索モード』に移る。
(2)
(4)ポスト探索モード
モードの定義 関数 int p_serch(int) 戻り値 0か1
直進しながら左右の超音波センサでポストの探索を行う。
超音波センサに反応があった場合は、"何番目に発見したポストか?"と"進行方向の左右どちらにポストがあったか?"を記憶して『ポスト接近モード』に移る。
競技場端まで到達した場合(=白線を感知した場合)は『垂直補正モード』に移る。
(5)カメラモード
モードの定義 関数 int camera(int) 戻り値 0か1
ポスト検索モードでポストを見つけた方向へ90度回転しポストから80cmの距離まで移動、もしポストまでの距離が80cm未満の場合は一端100cmになるところまで後退し、そして80cmの距離まで移動、カメラを起動しポストを判別する。判別できない場合距離を10cmずつ縮めて、撮りなおす。
(6)ポスト判定モード
モードの定義 関数 int p_judge(int) 戻り値 0か1
カメラモードでカメラでのポスト判別が成功したとき、そのポストが何番であるかを記憶し、そのポストが今とるべきポスであるのかを判別する。
(7)ポスト獲得モード
モードの定義 関数int p_get(int) 戻り値0か1
ポストへ接近し、その周りを時計回りに周回、赤外線センサが反応した
ら、90度回転し、ポストをとり、周回の開始地点まで戻り80cmバック
する。
(8)帰路モード
モードの定義 関数int goback(int) 戻り値0か1
カメラモードで記憶していた分の距離を後進して90度回転してポスト検索
モードへ移行する。
(9)ポスト選択モード
モードの定義 関数int p_choice(int) 戻り値 1
折り返しの時点でポスト1は取れているので、その他のポストのどれを撮りにい
くかを選択するモード
(10)ポストまで移動モード
モードの定義 関数int p_move(int) 戻り値1
取りに行くポストの座標にそって移動してそのポストまで移動するモード
5.使用する関数について
このプログラムでは標準MIRSから以下の関数を用いる。
関数名 |
書式 |
戻り値 |
説明 |
Main |
int main(void); |
0 |
メイン |
Initialize |
int initialize(void); |
0 |
初期化 |
post_get |
int post_get(int); |
0 |
ポスト周回及び獲得 |
post_search |
int post_search(int); |
0 |
ポスト探索 |
post_approach |
int post_approach(int); |
0 |
ポスト接近 |
post_select |
int post_select(int); |
-1 or 次のポスト番号 |
次ポスト選択 |
correct_distance |
int correct_distance(void); |
0 |
ポスト接近時の距離補正 |
correct_direction1 |
int correct_direction1(void); |
0 |
ポスト接近前の角度補正 |
correct_direction2 |
int correct_direction2(void); |
0 |
ポスト補正後の角度補正 |
uss_get |
int uss_get(int); |
測定データ |
超音波による距離測定 |
関数名 |
書式 |
戻り値 |
説明 |
pwm_enco_start |
void pwm_enco_start(int); |
なし |
RTタスクスレッドを開始 |
pwm_enco_stop |
void pwm_enco_stop(void); |
なし |
RTタスクスレッドを停止 |
pwm_enco_restart |
void pwm_enco_restart(void); |
なし |
RTタスクスレッドを再開 |
encoder_data |
void encoder_data(float *lm, float *rm, float *lv,
float *rv, int *br); |
なし |
100[ms]ごとの左右のタイヤの回転距離,速度を返す |
encoder_data2 |
void encoder_data2(float *la, float *ra, int *br); |
なし |
100[ms]ごとの左右のタイヤの回転角度を返す |
encoder_data3 |
void encoder_data3(float *la, float *ra, int *br); |
なし |
左右のタイヤの回転角度の合計を返す |
pwm_both_data |
void pwm_both_data(int, int); |
なし |
Duty比指定移動 |
pwm_straight |
void pwm_straight(int, int); |
なし |
PID制御による移動 |
pwm_rotate |
void pwm_rotate(int); |
なし |
PID制御によるその場回転 |
pwm_lqr_straight |
void pwm_lqr_straight(int, int); |
なし |
LQR制御による直進移動 |
pwm_lqr_rotate |
void pwm_lqr_rotate(int, int); |
なし |
LQR制御によるその場回転 |
pwm_lqr_circle |
void pwm_lqr_circle(int, int, int); |
なし |
LQR制御によるポスト周回 |
lqr_straight |
int pwm_lqr_straight(int, int); |
0 |
pwm_lqr_straightのマクロ |
lqr_rotate |
int pwm_lqr_rotate(int, int); |
0 |
pwm_lqr_rotateのマクロ |
lqr_circle |
int pwm_lqr_circle(int, int, int); |
0 |
pwm_lqr_circleのマクロ |
関数名 |
書式 |
戻り値 |
説明 |
irs_ts_ws |
void *irs_ts_ws(void *t); |
なし |
赤外線,タッチセンサ,白線センサ読み取りスレッド |
encoder |
void *encoder(void *t); |
なし |
エンコーダデータ読み取りスレッド |
uss_read |
void *uss_read(void *t); |
なし |
超音波センサ測定スレッド |
6.遷移表
遷移前/遷移後 |
待機 モード |
垂直補正 モード |
コース探索 モード |
ポスト探索 モード |
カメラ モード |
ポスト判定 モード |
ポスト獲得 モード |
帰路 モード |
ポスト選択 モード |
ポストまで 移動モード |
終了 |
待機モード |
− |
スタートスイッチがON 戻り値 1 |
× |
× |
× |
× |
× |
× |
× |
× |
× |
垂直補正モード |
× |
− |
ポスト獲得数が1つでない場合 戻り値 0 |
× |
× |
× |
× |
× |
ポスト獲得数が1つの場合 戻り値 1 |
× |
× |
コース探索 モード |
× |
× |
− |
コース(座標原点)を設定した後 戻り値 1 |
× |
× |
× |
× |
× |
× |
× |
ポスト探索 モード |
× |
競技場端に到達後 戻り値 1 |
× |
− |
ポストを発見後 戻り値 0 |
× |
× |
× |
× |
× |
× |
カメラ モード |
× |
× |
× |
× |
− |
ポストと判別後 戻り値 1 |
× |
ポストと判別できなかった場合 戻り値 0 |
× |
× |
× |
ポスト判定 モード |
× |
× |
× |
× |
× |
− |
獲得すべきポストだった場合 戻り値 0 |
獲得すべきポストでなかった場合 戻り値 1 |
× |
× |
× |
ポスト獲得 モード |
× |
× |
× |
× |
× |
× |
− |
ポストを獲得後 戻り値 1 |
× |
× |
全てのポストを獲得後 戻り値 0 |
帰路モード |
× |
× |
× |
全てのポストが発見できていない場合 戻り値 0 |
× |
× |
× |
− |
全てのポストが発見済みの場合 戻り値 1 |
× |
× |
ポスト選択 モード |
× |
× |
× |
× |
× |
× |
× |
× |
− |
獲得すべきポストの座標を読む 戻り値 1 |
× |
ポストまで 移動モード |
× |
× |
× |
× |
× |
× |
獲得すべきポストまで移動後 戻り値 1 |
× |
× |
− |
× |
7.プログラムの流れ
6.カメラ断念によるプログラムの変更について
1月20日 … MIRSにカメラを載せることを完全に断念。その対応策としてソフトウェアではカメラモード、ポスト判別モードを破棄し、その代わりにポスト接近モードを作り、それで補うことにする。ポスト接近モードはカメラモードのカメラに関する操作をすべてなくし、ポストまで接近するのみとする。そのほかにもカメラを用いてポストを判別していたのでこの際ポストの番号にこだわらずに順番に関係なく一つずつポストをとりに行くというプログラムに変更し、時間がある限り2週目にはポストを順番に取りにいくというプログラムに変更する.また垂直補正モード、コース検索モードは必要ないという判断に至り(垂直補正は各動作ごとに行い、コース検索モードはポスト探索モードの途中の例外処理によって対応)省略するとことにし、ポストまで移動モードは2週目にポストを順番にとりにいくというプログラムが組める時間がある場合にのみ用いることにした.またプログラムに分岐がなくなってしまったので各モードの関数の戻り値の必要がなくなったためすべて返り値を0のみとすることで対応した.またポスト探索モードで超音波を左右に出してポストを探索と上に書いてあるが超音波センサー4の調子が悪いため左側のみに超音波を出すということになった.
2月1日 … 2週目にはポストを順番に取りにいくというプログラムを時間があれば作るということであったが、MIRSのパラメータがしっかりと設定されていないため90度回転やポスト周りの周回時にかなりの誤差が出るということがわかり、私たちのプログラムでは基本的に直交する2軸に沿った動きのみを予定していたためこの誤差を直すことが最優先と判断し、ポストを順番に取りに行くというプログラムもあきらめるということになった。またポストを順番に取りにいくプログラムをあきらめることにより帰路モードを単独で作っておくよりもポスト獲得モードの一部として組み込んでも変わらないと考えポスト獲得モードに組み込むことにした.
モード移動の流れ