ソフトウェア詳細設計書

MIRS0601-SOFT-0001

 

 版数

最終更新日

作成

承認

改訂記事

A01

2006/10/13

杉山

平口

初版

B01

 2007/2/10

杉山

平口

 動作概要など多数

 

 

 

 

 

 


 1.はじめに

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

2.概要

MIRS0601 ソフトウェアは、RT-Linux上で動作するプログラム群で構成される。プログラムはC言語でかかれ、Linux の標準の API とともに、行動モードに対応したプログラム、一つの機能を複数のプログラム群で提供する機能モジュール、および、RTタスク、ドライバと、補助関数と独自に定義したヘッダファイルから構成される。

3.動作モード

全部で6個のモードを定義する。

           後退動作モード             (back)

                      白線のある位置まで後退する。

斜めに進入している場合も考え補正動作を行う。さらに、右に90度回転し、白線をトレースできる状態にする。

 

           ポスト探索モード           (post_search)

                      直進走行しながら、超音波を出してポストがあるか探索する。

ポストを発見したらさらに進み、超音波センサの値が最小値を返したら停止する。

同じポストを複数回発見してしまわないように以下のようにする。

                      まず、競技場半分付近まで超音波センサで探索する。

           角で90度回転する。先ほど超音波で探索した部分は探索動作を行わず進み、その地点からまた探索を開始する。

           その動作を1周するまで繰り返す。

 

           ポスト接近モード           (post_approach)

                      その場で左に90度回転し、ポストに接近する。その際は、超音波センサを用いて正しい角度で接近できるように調整する。                    ポストとの距離が近くなったら停止する。

 

           ポスト判別モード           (post_check)

コンベアの白線センサでポスト番号を判別する。コンベアのタッチセンサが押されるまで少しずつ前進し、押されたらコンベアの  モーターを正転させる。番号を読み取ったら停止しコンベアを逆転させる。判別が正しく行われていない場合はもう一回繰り返し、それでもダメならば、赤外線センサの値を読み取る。

 

ポスト獲得モード           (post_get)

右に90度回転し、ポストの周りを公転する。赤外線センサの位置を確認して左に90度回転して、タッチセンサが反応するまで   前進し獲得する。獲得後、赤外線センサを再度確認し、本当に獲得したか確かめる。このモードの始めにいた位置まで戻っていたら停止して、すこし後退する。

 

ポスト番号保存モード     (post_number)

スタートしてからポストを発見した順番と、そのポスト番号を書き込む。これをもとにして2回目の競技では、判別動作をなしに順番 どおりにポストを獲得する

 

4.モード区分

           1回目の競技で使用するモード

Ø        後退動作モード

Ø        ポスト探索モード

Ø        ポスト接近モード

Ø        ポスト判別モード

Ø        ポスト獲得モード

Ø        ポスト番号保存モード

 

2回目の競技で使用するモード

Ø        後退動作モード

Ø        ポスト探索モード

Ø        ポスト接近モード

Ø        ポスト獲得モード

5.モード遷移表

1回目の競技時

 

 

後退

ポスト 探索

ポスト 接近

ポスト 判別

ポスト 獲得

ポスト 保存

後退

×

動作 終了後

×

×

×

×

ポスト探索

×

×

動作  終了後

×

×

×

ポスト接近

×

×

×

動作  終了後

×

×

ポスト判別

すでに 判別していたとき

×

×

判別できなかった場合

  ×

動作  終了後  

ポスト獲得

×

×

×

×

獲得できなかった場合

動作  終了後

ポスト保存

動作 終了後

×

×

×

×

×

 

2回目の競技時

 

後退

ポスト  探索

ポスト 接近

ポスト  獲得

後退

×

動作 終了時

×

×

ポスト探索

×

×

動作  終了時

×

ポスト接近

×

×

×

動作  終了時

ポスト獲得

動作 終了時

×

×

獲得できなかったとき

 

6.動作モード詳細

           MIRS0601の核となる部分の動作概要を示す。

         <後退モード>

図、底面の白線センサの位置

         このままだと実際は、白線センサの感知が遅れてしまい、飛び出してしまう可能性が高いため白線で一時停止してから、少し前進し

非常に遅い速度で後退しながら、以下の動作に移る。

         <ポスト探索モード>

         超音波センサの機構上20度ぐらい早くポストを感知してしまうので、超音波センサが最小値を返した地点で停止するようにする。

         誤差や、不都合でおかしな値を返すこともあるのでそれも考慮する。

         <ポスト判別モード>

         forループを用い、一定時間コンベアが回転するようにした。

         MIRSの前方にTSを2個つけコンベアとMIRSが確実に正対するようにして、精度を高める。

         前進の部分にもTSが片方だけ”1”の場合などに分けて考える。

         正確に読み取れなかった場合の動作は、2回やる予定。判別不可なら赤外線の値を読む。

         <ポスト番号保存モード>

         読み出す部分は2回目のmainにあり、関数として分けているのではないが書いておく。

         配列post_num[ ]に各ポスト番号が入る。要素にはポストの順番が入る。

         たとえば1番目にポスト3を、2番目にポスト1を、3番目にポスト2を発見した場合は、

         post_num[0]=3 ,post_num[1]=1 ,post_num[2]=2のように代入され、ファイル”post.log”に書き出される。

        

         post_num[ ]の値の順番に別の変数post_get[ ]に値を代入しなおし、その値を元にして2回目の競技を行う。

         ポストを発見する度にカウンタの値を増やし、カウンタの値とpost_get[ ]の値が一致したらポストを獲得する。

         競技場を1周したらカウンタの値を0に戻し、すべてのポストを探索するまで行う。

 

7.使用する関数

 

ファイル名

関数名

書式

説明

main.c

main

int main(void)

1回目の競技時に使用

try2.c

main

int main(void)

2回目の競技時に使用

記憶したポストの順番に獲得

initialize.c

initialize

int initialize(void)

初期化

mirs_back.c

mirs_back

int back(void)

後退

post_get.c

post_get

int post_get(void)

ポスト周回及び獲得

post_search

post_search

int post_search(int search)

ポスト探索

ポストを発見したら戻り値searchは1

post_check

post_check

int post_check(void)

ポスト判別

判別できたポスト番号を   グローバル変数に格納

post_get.c

post_get

int post_get(void)

ポスト獲得

post_approch.c

post_approach

int post_approach(void)

ポストに接近

function.c

correct_direction1

int correct_direction1(void)

ポスト接近前の角度補正

correct_direction2

int correct_direction2(void)

ポスト補正後の角度補正

irs_code_get

int irs_code_get(void)

赤外線のコード判別

uss_get

int uss_get(void)

超音波による距離測定

       

 

initialize、post_approach,post_get

 correct_direction1, correct_direction2,irs_code_get,uss_get

以上は標準機のプログラムをそのまま、もしくは改良して使用する。

そのほか駆動系とスレッド系の使用する関数は標準機と同じ。

           pwm_stopは少し変更し、文中にpwm_both_data(0,0)を追加する。(main中で一連ではないpwm_lqr_straightなどを多用するため)