沼津高専 電子制御工学科
MIRS0204ソフトウェア詳細設計書
MIRS0204-SOFT-0001
改訂記録
版数
作成日
作成者
承認
改訂内容
A01
2003.5.27
中西・武藤
村田
初版
A02
2003.6.17
中西・武藤
村田
API,I/Oアドレスの追加
目次
はじめに
概要
OS(RT-Linuxの概要
開発言語(C++)の概要
行動モードの詳細
クラスの構成
各クラスの詳細
試験
はじめに
本ドキュメントは、MIRS0204 基本設計書に規定されたシステムの動作規定、状態遷移を実現する各タスクの開発(コーディング、試験等)に必要な事項を述べる
概要
MIRS0204ソフトウェアはRT-Linux上で動作するプログラム群で構成される。 プログラムはC++を用いて開発され、MIRS,POST,その他センサなどのクラス、RTタスクドライバ及びヘッダで構成される。
OS(RT-Linuxの概要
主な内容はMIRS0204技術調査RT-Linux
MIRS0204-TECH-0008
を参照。
開発言語(C++)の概要
MIRS0204ではセンサなどクラスに分割してプログラミングしようと考えている。 そこで、開発言語としてC言語をオブジェクト指向(Object Oriented Programming)を 反映できるように拡張したC++を採用した。 C++はC言語のほぼ完全な上位互換の言語である。 また、コンパイラもGCC(GNU Compiler Collection)の一部として利用できるため、 特に新しく導入する必要もない。
行動モードの詳細
待機モード
メインプログラムを立ち上げ、スタートスイッチが押されるまで待機するモード。
初期動作モード
スタートスイッチが押されてから実行されるモード。スタート位置から超音波センサでmirsの前方方向にポストがあるかどうかを探索する。ポストが発見されなければ前方に1.5m進みその場所を座標原点(0,0)とする。
ポスト検索モード
mirsに搭載されているすべての超音波センサを使い、その場で360度回転して全てのポストの位置を記憶する。360度回転し終わったあとには一つのポストに対して四つのデータを得ることができる。(記憶するのはポストまでの距離(超音波センサの値)と角度(ロータリエンコーダの値とデジタルコンパスの値))。
ポスト探索モード
mirsがいる場所から、記憶したポストの中で一番近いポストへ移動する。この時、四つのデータを組み合わせポストの位置を割り出し、移動する。 <『ポスト探索モード』での移動中は常に超音波センサで進行方向にポストがないかを確認する。> ポストを発見次第、mirs前方の超音波センサでポストとの距離を測りながらモータの回転を小さくしていく。タッチセンサモード(mirs正面のタッチセンサが反応したら、後退しもう一度タッチセンサが反応するまで進む。再びタッチセンサが反応したらポストの中心線とmirsの中心線を合わせるように補正する。)を行う。
タッチセンサモード
mirs正面のタッチセンサが反応したら、後退しもう一度タッチセンサが反応するまで進む。再びタッチセンサが反応したらポストの中心線とmirsの中心線を合わせるように補正し、『ポスト周り回転モード』に移る。
タッチセンサ補正モード
ポストの中心とmirsの中心を合わせる。
ポスト周り回転モード
ポストの周りを左回転しmirs左方の赤外線センサでスイッチを探す。スイッチが見つかったらその場で停止する。『赤外線識別モード』に移る。ポスト回転中にタッチセンサが反応したら『タッチセンサ補正モード』に移る。
赤外線識別モード
赤外線の周波数からポストの番号を割り出す。『ポスト獲得モード』に入る。
ポスト獲得モード
ポストが獲得できる番号のものだった場合、左に90度回転しmirsをポストにぶつかるまで前進させる。タッチセンサ反応後、0.15m後退し赤外線センサでスイッチを押したかどうか確認する。スイッチを押していない場合は赤外線を感知しなくなるまでスイッチを押す動作を行う。スイッチを押した場合は『ポスト探索モード』に移る。ポストが獲得できない番号のものだった場合、赤外線の周波数を読み取り記憶しておく。その後『ポスト探索モード』に移る。
現在考えられる例外動作
初期動作モード
mirs前方にポストが発見された場合
・・・mirsを右90度回転させ、前方に進みながらmirs左方の超音波センサでポストを探索しポストが無い道を探す。道が見つかったらその場で90度左回転して前方に1.5m進む。その場を座標原点(0,0)とする。『ポスト検索モード』に移る。
ポスト探索モード
獲得するべきポストが発見されない場合
・・・誤って獲得してしまったか超音波センサで発見できないところにあるので一定時間経過後、次のポストを獲得する動作に移る。
タッチセンサモード
タッチセンサが一回しか反応しなかった場合
・・・タッチセンサの誤作動と考えられるので、その場から『ポスト探索モード』に移る。
ポスト獲得モード
mirsの進行方向にスイッチがある場合
・・・ポスト接近時は常に赤外線センサでスイッチがあるかどうかを検索し、スイッチを誤って押さないように停止する。mirs前方の赤外線センサで赤外線の周波数を感知できるまで進む。赤外線を感知したら停止し、周波数からポストの番号を割り出し獲得できないポストの場合は周波数を記憶し『ポスト探索モード』に移る。獲得できるポストの場合はmirsを前進させポストにぶつける。タッチセンサ反応後、0.1m後退し、赤外線センサでスイッチを押したかどうかを確認する。押した場合は『ポスト探索モード』、押していない場合は赤外線センサで赤外線を感知しなくなるまでスイッチを押す動作を続ける。
クラスの構成
クラス構成をUML図(Unified Modeling Language)を用いて示す。
各クラスの詳細
class Mirs
MIRS本体クラス
メンバ変数
int mode;
モード保持
Tss tssFront;
正面タッチセンサ
Tss tssFRight;
正面右タッチセンサ
Tss tssFLeft;
正面左タッチセンサ
Tss tssRight;
右タッチセンサ
Tss tssLeft;
左タッチセンサ
Tss tssRear;
後部タッチセンサ
Irs irsFront;
正面赤外線センサ
Irs irsLeft;
左赤外線センサ
Uss ussFront;
正面超音波センサ
Uss ussRear;
後部超音波センサ
Uss ussRight;
右超音波センサ
Uss ussLeft;
左超音波センサ
Move move;
動きに関するクラス
Place place;
位置
メンバ関数
class Tss
タッチセンサクラス
構成要素
赤外線・タッチセンサデバイスドライバ(独自開発)
I/Oポート:0140H,0142H
メンバ変数
bool value;
タッチセンサが押されていればture
メンバ関数
bool getTss(void);
値を取得
bool callBackTss(void);
タッチセンサに変化が起こると呼ばれる
class Irs
赤外線センサクラス
構成要素
赤外線・タッチセンサデバイスドライバ(独自開発)
I/Oポート:0140H,0142H
メンバ変数
int value;
赤外線の値
メンバ関数
int getIrs(void);
値を取得
int callBackIrs(void);
赤外線センサに変化が起こると呼ばれる
class Uss
超音波センサクラス
構成要素
超音波センサRTタスクモジュール(MIRS標準API)
メンバ変数
double distance;
距離
メンバ関数
double getUss(void);
距離を取得
double sendUss(void);
超音波を発信し、距離を取得
class Dcp
デジタルコンパスクラス
構成要素
デジタルコンパスデバイスドライバ(独自開発)
I/Oポート:0150H
メンバ変数
int direction;
方向
メンバ関数
int getDcp(void);
方向を取得
class Enc
ロータリーエンコーダクラス
構成要素
ロータリーエンコーダRTタスクモジュール(MIRS標準API)
メンバ変数
double speed;
速度
int direction;
回転方向(+1:反時計,-1:時計)
メンバ関数
double getSpeed(void);
速度を取得
int getDirection(void);
回転方向を取得
class Pwm
PWM制御クラス
構成要素
PWM・ロータリーエンコーダRTタスクモジュール(MIRS標準API)
メンバ変数
double speed;
速度
int direction;
回転方向
メンバ関数
void setPwm(double s, int d);
速度と回転方向を指定
int stop(void);
停止
class Move
動きに関するクラス
メンバ変数
Pwm pwmLeft;
左側PWM
Pwm pwmRight;
右側PWM
Enc encLeft;
左側ロータリーエンコーダ
Enc encRight;
右側ロータリーエンコーダ
Dcp dcp;
デジタルコンパス
Place currentPlace;
現在の位置
Place nextPlace;
次の位置
メンバ関数
class Place
位置に関するクラス
メンバ変数
double m_x;
X座標
double m_y;
Y座標
double m_r;
極座標でのR
double m_a;
極座標でのθ
double m_d;
MIRSの傾き
メンバ関数
void setPlace(double a, double b, coordinates c, double d);
位置を指定
double getPlaceX(void);
X座標を取得
double getPlaceY(void);
Y座標を取得
double getPlaceR(void);
Rを取得
double getPlaceA(void);
θを取得
double getPlaceD(void);
MIRS(or Post)の角度を取得
class Post
ポストクラス
メンバ変数
int id;
ポスト番号
bool finish;
取得してあればture
Place place;
ポストの位置
メンバ関数
void setId(void);
ポストNo.を指定
void finishPost(void);
ポスト取得を指定
class Field
競技場クラス
メンバ変数
int postNum;
ポストの数
Post post[postNum];
ポスト
メンバ関数
試験
フトウェアの面から見た必要な試験を列挙する。開発が進む間に不安点や疑問点が出てきた場合はそれらについても適宜試験をう。
各クラスが正常に動作していることの試験
全体として正常に動作していることの試験
標準MIRSにおいての赤外線センサ、超音波センサ、タッチセンサ等のセンサ類の試験
実機上での試験
直進移動の誤差を直す試験
回転半径の確認
全体を統合した試験