名称 MIRS1604 ソフトウェア詳細設計書
番号 MIRS1604-SOFT-0001

版数 最終更新日 作成 HTML作成 承認 改訂記事
A01 2016.12.14 梶田直哉 杉山瀬名 堀住恭平 梶田直哉 杉山瀬名 堀住恭平 初版
A02 2016.12.16 梶田直哉 杉山瀬名 堀住恭平 梶田直哉 杉山瀬名 堀住恭平 モジュール構成図の変更、モジュール一覧の修正、会場の方角の変更、Fig.4、Table2、Table3の追加、フローチャートの修正、テスト項目のレイアウトの変更

ドキュメント内目次


1.はじめに

本ドキュメントは、MIRS1604が開発するMIRSのソフトウェア詳細設計書についてのドキュメントである。

2.モジュール構成

基本設計で示した全体のモジュール構成図を以下に示す。
Fig.1 モジュール構成図
Fig.1 モジュール構成図
モジュール一覧を以下に示す。既存の変更しないモジュールについてはMG3S 標準プログラム 関数レファレンスを参考。
table1 モジュール一覧
モジュール名 機能 新規・変更関数名 開発要素 引数 戻り値
pilot MIRSの動作全体を制御する。 既存のものを使用する。
brain 動作シーケンスを管理する。 void brain() 新規に作成する。 なし なし
OpenCV 画像処理を行う。 int OpenCV_get()
(int) OpenCV_create()
新規に作成する。 なし struct{(bool) discovery,(unsigned int) size,(int) x,(int) y}
成功:1、失敗:-1
device デバイスファイルをOpen/Closeする。 int device_infrared_open()
int device_infrared_close()
int device_infrared_get()
int device_camera_open()
int device_camera_close()
int device_camera_get()
赤外線センサとwebカメラを追加する。 なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
なし
direction 正体補正をする。 int direction_correct(int dist) オムニホイールに変更するため、対応させる。 正体補正する距離[cm] 成功:1、失敗:-1
infrared 赤外線センサの信号を処理する。 int infrared_get(int infared_number)
void infrared_create()
新規に作成する。 赤外線センサ番号
なし
ある:1、ない:-1
なし
uss 超音波計測を行う。 int uss_get(int uss_port) 超音波センサの数が4個になったため、対応させる。 センサー番号 計測距離[cm]
io ON/OFF IOデバイスのデータを処理する処理する。 既存のものを使用する。
number 数字認識を行う。 int number_detect(int dist,int camera_number) カメラを増やすため対応させる。 カメラからボードまでの距離[cm]カメラ番号 成功:1,失敗:-1
comm サーバとの通信を行う。 既存のものを使用する。
distance 走行距離を管理する。 void distance_get(struct distance_data *distance_data)

void distance_reset()
オムニホイールに変更するため対応させる。 距離データ
なし
なし

なし
vel_ctrl モーターの速度制御を行う。 void vel_ctrl_set(float vel_ref_f, float vel_ref_b,float vel_ref_l,float vel_ref_r)

void vel_ctrl_mod(float vel_mod_f, float vel_mod_b,float vel_mod_l,float vel_ctrl_mod_r)

void vel_ctrl_get_speed(float *speed_f, float *speed_b,float *speed_l,float *speed_r)
オムニホイールに変更するため対応させる。 前後左右の速度指定値[cm/s]

前後左右の速度指定値[cm/s]

前後左右の速度指定値[cm/s]
なし

なし

なし
encoder エンコーダ値を管理する。 void encoder_get(struct encoder_data *encder_data)
void encoder_reset()
オムニホイールに変更するため対応させる。 エンコーダデータ
なし
なし
なし
omni_ctrl オムニホイールの制御を行う。 void omni_ctrl_set(float speed_v,float speed_w)

void omni_ctrl_dist(float dist)
void omni_ctrl_unset_dist()
void omni_ctrl_get_endflag()
void omni_ctrl_create()
void omni_ctrl_cancel()
void omni_ctrl_stop()
void omni_ctrl_reset()
新規に作成する。 縦方向の走行スピード[cm/s],横方向の走行スピード[cm/s]

距離[cm]
なし
なし
なし
なし
なし
なし
なし

なし
なし
なし
なし
なし
なし
なし
motor モーターの管理を行う。 void motor_drive(int u_f,int u_b,int u_l,int u_r) モーターの数を4個に変更するため対応させる。 前後左右のモータに与えるpwm値(pwm値範囲:-128~127) なし

3.フローチャート

競技フィールドの方角を下の図のように取る。動作シナリオはMIRS1604システム基本設計書を参照。
Fig.2 現場急行
Fig.2 会場の方角

左側、右側スタートはそれぞれ以下に示す図のような方向にMIRSを置く。このMIRSの向きは競技中に回転しないため変わらない。
Webカメラとモータを以下の右側スタートを基準とした表のように対応させる。この時モータの回転方向は対応させると丁度巡回などが逆になるのでそのままにする。
Fig.3 左側スタート時のカメラとモータの対応関係
Fig.3 左側スタート時のカメラとモータの対応関係
Fig.4 右側スタート時のカメラとモータの対応関係
Fig.4 右側スタート時のカメラとモータの対応関係
Table 2 Webカメラの対応関係
A B
B A
Table 3 モータの対応関係
モータの出力の変更
2 1 なし
4 3 なし
1 4 なし
3 2 なし

以下に示すフローチャートはスタートがFig.2の左側のスタートの場合である。
Fig.5 現場急行
Fig.5 現場急行

Fig.6 数字認識
Fig.6 数字認識
Fig.7 入場
Fig.7 入場
Fig.8 巡回A
Fig.8 巡回A
Fig.9 巡回B
Fig.9 巡回B
Fig.10 追従
Fig.10 追従
Fig.11 巡回復帰行動
Fig.11 巡回復帰行動


4.スレッド構成

Fig.12 スレッドの構成
Fig.13 走行制御におけるシーケンス図

5.テスト項目

ソフトウェアのテスト項目を以下に示す。
単体試験
test_omni_ctrl
進む方向と速度値を指定し、正しく行われているか確認する。
test_infared
赤外線を受信できているかディスプレイ上に表示できるようにし、確認する。
test_OpenCV
画像を取得し、画像処理により数字認識か赤色検出ができるか確認する。
機能試験
現場急行
スタート位置から数字ボードまで、直進走行により右スタートでも左スタートでも確実に急行できるか確認する。
数字認識
スタート位置から数字ボードまで、直進走行により右スタートでも左スタートでも確実に急行できるか確認する。
巡回1
右スタートの場合、左に1.0m直進走行した後右に1.5m直進走行する。左スタートの場合、右に1.0m直進走行した後左に1.5m直進走行する。この動作がただし行われているか確認する。
巡回2
競技フィールドを時計回り、反時計回りで安定した走行で巡回できるか確認する。
追従
Webカメラによる画像処理、赤外線センサにより検知した怪盗機の方向に直進走行し、追いかけられるか確認する。
結合試験
全てのプログラムを結合し、状態遷移が正しく行われるか確認する。

6.コーディングルール

必要に応じて見やすくなるよう、インデントしておく。
可読性をあげるために適切にコメントをつける。
プログラムにはバージョンをつける。
プログラムを更新する場合は更新前のファイルを保存しておく。
プログラムのはじめに、作成者、更新日、更新内容をコメントしておく。

プログラム統合の前に、単体テスト・機能テストを行う。

モジュールごとにファイルを分割し、ヘッダファイルは必要に応じて作成する。

グローバル変数の使用は必要最小限にする
同一モジュール内で共通して使用する変数は関数の外で static 宣言する。
同一モジュール内でのみ使用する関数は static 宣言する。
関数名は新規作成するものに限り、内容のわかる単語を用いる。
マクロの名前は全て大文字にする。
プリプロセッサよりコンパイラを使用する

値を変更してはいけないということを明確にする。
goto文で条件分岐などは禁止する。
goto文を使うことによりコードが見やすく書ける時のみ。
名前空間による曖昧さ防止の恩恵を受けるためにusing宣言は使用しない。
多少面倒でもスコープ解決演算子を使用する。



MIRS DATABASE