沼津高専 電子制御工学科
MIRS0104ソフトウェア詳細設計書
MIRS0104-SOFT-0001
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2002.5.21 前原 森元
初版
A02 2002.6.4 前原 森元
例外、関数名、試験について追記

ソフトウェア詳細設計書

目次

  1. 概要
  2. OS(RT-Linux)の概要
  3. 開発言語(C++)の概要
  4. 行動モードの詳細
  5. クラスの構成
  6. 各クラスの詳細
  7. 試験、調整

1. はじめに

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

2. 概要

MIRS0104 ソフトウェアは、RT-Linux 上で動作するプログラム群で構成される。プログラムは、C++を用いて開発され、MIRS本体、赤外線センサ等の幾つかのクラスとヘッダ、そしてRTタスクドライバによって構成される。

本 MIRS0104 では、行動モードは MIRSクラス のメンバ変数による状態遷移により表現する。具体的なモードは、下で述べる。

超音波測定と、駆動系の制御は RT タスクとして駆動させ、赤外線センサ信号入力探知とLCD出力はデバイスドライバを用いて行う。白線センサもデバイスドライバを用いて行う予定である。デバイスドライバは標準 API のデバイスドライバを使用する。

3. OS(RT-Linux)の概要

主な内容は、本MIRS0104のMIRS0104-TECH-0012に記載する。

RT-Linuxは、標準のLinux環境でのプログラムの開発ができ、フラッシュメモリ上に収めることができるため、MIRSの開発に適したOSといえる。

4. 開発言語(C++)の概要

概要にも書いたように、本 MIRS0104 は、C++を用いて開発する。C++は、機能的には C を拡張したものであり、その位置付けとしてはオブジェクト指向言語(OOPL)である。

MIRSにおいては、制御する対象は MIRS、超音波センサ等の具体的なものであり、それらをクラスに分割することが容易である。そして、そのほうが効率がよいと考えたため、C++を採用することにした。

5. 行動モードの詳細

本MIRSでは、モードを関数として分割する、という考え方で開発をすることはない。

待機モード
開始されるまで待機するモード。
スイッチが押されると、開始直後に行うポスト探索モードに移行する。
開始直後に行うポスト探索モード
180度回転し、最短距離にあるポストの位置を取得するモード。
最短ポストが判明すると、そのポストに対して、ポストへ移動するモードに移行する。
ポストへ移動するモード
移動すべきポストへ移動するモード。移動中は常に超音波を使って距離と角度を調整する。
適当な距離(*1)まで接近した時点で、ポストを周回するモードに移行する。
ポストを周回するモード
ポストから一定距離(*1)を保ちつつ、ポストが発信している赤外線を時計周りに探査するモード。
同時に、そのポストから最短距離にあるポストを探索するモードでもある。
そのポストが取るべきならば、ポストを取得するモードに移る。そうでなければポストへ移動するモードに移行する。
ポストを取得するモード
周回モードで取るべきだと判断されたポストを取得する。
取得後、ポストへ移動するモードへ移る。

例外

各種例外はそのモード内で対処する。

開始直後に行うポスト探索モード
初期視界にポストが見つからない。
原因: ポストの偏った配置のため。
対処: 超音波センサがコースの端に届く程度の距離(*2)まで前進し、再び開始直後の探索モードに入る。
ポストへ移動するモード
予期せぬポストに衝突した。
原因: センサや駆動系の誤動作。
対処: 現在の座標と照会し、そのポストが何なのかということを確認する。
ポストを周回するモード
周回しても赤外線を感知できなかった。
原因: 過去とっていたものを未取得と判断していた。 別のポストと勘違いし、このモードに入った。
対処: 正常状態に復帰することは不可能。少しでもポストを取得するために、次のポストに移動する。
周回中に別のポストに衝突した。
原因: 調整不足。
対処: 不可能。調整を綿密に行う。
次に移動すべきポストが見つからなかった
原因: ポストの偏った配置のため。
対処: 超音波センサがコースの端に届く程度の距離まで移動し、開始直後の探索モードに入る。
白線を踏んだ
原因: ポストとの距離が遠すぎる。調整不足。
対処: 内側に寄る。調節を綿密に行う
ポストを取得するモード
取得としたはずのポストの赤外線が出つづけている。
原因: 角度がずれており、しっかりと押せなかった。
対処: 再び、ポストを周回するモード に移行する。

*1, *2: 調整段階にて、適正な値を探す。

6. クラスの構成

従来はモジュールの構成を示す個所だが、MIRS0104ではC++を用いて、オブジェクト指向開発をするため、モジュール構成のかわりにクラス構成について解説する。ここではクラス構成を、UML図を用いて表す。

図において、◇は関連を表している。MIRS本体と各種センサの関連は MIRS 本体が各種センサを包含する、ということである。

7. 各クラスの詳細

class MIRS
MIRS本体クラス
メンバ変数
MIRS本体クラスは各種センサクラスを包含する。
double m_x;
MIRSのX座標を保持する変数。開始点は 0 とする。
double m_y;
MIRSのY座標を保持する変数。開始点を 0 とする。
double m_direction;
MIRSの方向を保持する変数。開始点から正面を 0 とする。左を角度:正として、右を角度:負として扱う。
int m_state;
MIRSのモードを保持する。現在は詳細に記した5つのモードに対応するように、0 - 4までの値を想定しているが、開発/設計段階で、まだ増える可能性はある。
IRS irs_forward;
IRS irs_right;
超音波センサクラスを包含する。
TS ts;
タッチセンサクラスを包含する。
USS uss_left;
USS uss_right;
USS uss_forward_center;
USS uss_forward_left;
USS uss_forward_right;
超音波センサクラスを包含する。
ENC enc_left;
ENC enc_right;
ロータリエンコーダクラスを包含する。
WLS wls_forward_left;
WLS wls_forward_right;
WLS wls_behind_left;
WLS wls_behind_right;
白線センサクラスを包含する。
メンバ関数
double get_xpos(void);
double get_ypos(void);
double get_direction(void);
MIRSのx座標、y座標、方向を取得する。
void do(void);
現在のモードに対応する動作を行う。
class ENC
ロータリエンコーダクラス)
メンバ変数
double m_speed;
車輪の回転速度を表す。
double m_direction
車輪の回転方向を表す。
メンバ関数
void set_speed(double speed);
車輪の回転速度を設定する。
void set_direction(double direction);
車輪回転方向を設定する。
double get_speed(void);
車輪の回転速度を設定する。
double get_direction(void);
車輪回転方向を設定する。
void wheel(void);
車輪を回転させる。
void stop(void);
車輪を停止させる。
class IRS
赤外線センサクラス
メンバ関数
int get_irs(void);
現在入っている赤外線の番号を調べる。入っていない場合は IRS_NODATA(他のデータと被らない定数) を返す。
class TS
タッチセンサ
メンバ関数
int get_ts(void);
現在タッチセンサが押されているか調べる。
class USS
超音波センサ
メンバ関数
double get_uss(void);
超音波を送信し、帰ってくるまでにかかった時間を返す。
class WLS
白線センサ
今後の状況により、決定する。
class Post
ポスト
メンバ変数
int m_state;
取得/未取得の状態を保持する。
int m_id
ポストの識別番号を保持する。
double m_x
ポストのX座標を保持する。
double m_y
ポストのY座標を保持する。
メンバ関数
void push_switch(void);
MIRSがポストを取得する際に呼ぶ。
void reset(void);
取得された状態になっているポストを、未取得状態に戻す
double get_xpos(void);
double get_ypos(void);
ポストのx座標、y座標を取得する。

試験、調整

以下に、ソフトウェアの面から見た必要な試験や調整について列挙する。開発が進む間に不安点や疑問点が出てきた場合、それについても試験、調整を行う。


関連文書