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

版数 最終更新日 作成 承認 改訂記事
A01 2021.10.25 渡邊敬矢、山口卓人 真木祐弥 香川真人 第3版

目次


1.はじめに

本ドキュメントはMIRS2103のソフトウェアにおいての詳細設計書を示したものである。

2.モジュール構成

2.1 Raspberry Pi モジュール構成

C言語のプログラムのモジュール構成ををfig.1に示す。
また、fig.1の追加モジュールの詳細および、既存のモジュールの変更箇所ををTable.1に示す。

fig.1 C言語プログラムモジュール構成図



Table.1 追加モジュールの詳細、および既存モジュールの変更箇所
モジュール名 概要 関数名 引数 戻り値 備考・変更点
pilot.c WAIT,JUDGE,INSPEC,WASH,HOMING
の5つの状態を遷移させて機体全体をコントロールするモジュール。
int main()
int judge()
int inspec()
int wash()
int homing()
なし 0 特になし
number_detect.cc ナンバープレートの数字を認識し、サーバー上の数字と照合してデータを入手するモジュール。 void number_set_device()
void number_get
int number_detect()
void number_collation()
int device
int *ans
int dist
なし
なし
なし
count_num
inspec_dist
number_collation()については詳細は未定だが、
車を一周(検査)する距離を入手する
sensor.c 超音波センサや水位センサ等のI2C通信のセンサの関数を集約したモジュール。 int uss_open_l()
int uss_open_r()
int water_open()
long uss_get_l()
long uss_get_r()
long water_get()
なし 0(成功)orそれ以外(失敗)
0(成功)orそれ以外(失敗)
0(成功)orそれ以外(失敗)
測定値[cm] (不正な値は-1)
測定値[cm] (不正な値は-1)
測定値[cm] (不正な値は-1)
超音波センサのほかにタンク内の水位を測定するセンサ用関数を加えた。
motor.c 機体やアームなどモータを使う関数を集約したモジュール。 int motor() int mode
int speed
int dist
0 引数の内容についてはrun_ctrl.ino参照

2.2 Python モジュール構成

Pythonのプログラムのモジュール構成をfig.2に示す。
また、fig.2のモジュールの詳細をTable.2に示す。

fig.2 Pythonプログラムモジュール構成



Table.2 追加モジュールの詳細
モジュール名 概要 関数名 引数 戻り値 備考・変更点
com_py.c Python - C言語間のデータの受け渡し,Pythonプログラムの実行を行う。 recv_py(),send_py() int *p int get_data データの受け渡しバッファとして、txtファイルを用いる。
damage_detect.py カメラから取得した画像から、対象物の異常を検知する get_img(),send_buffer(),get_buffer(),dmg_detect() int send_data numpy.ndarray camera_image,int get_data 見本画像と対象物との差分により、異常を検知する

2.2 Arduino Mega モジュール構成

Arduino Megaのプログラムのモジュール構成をfig.3
また、fig.3のモジュールの詳細をTable.3に示す。

fig.3 Arduino Megaプログラムモジュール構成

Table.3 追加モジュールの詳細
モジュール名 概要 関数名 引数 戻り値 備考・変更点
resister.ino アームと連動したボリュームから様々な計算を行うモジュール double get_deg_arm()
double get_height()
double get_body_dist
なし
なし
なし
deg_arm
height
body_dist
可変抵抗の角度からアーム座標の座標角、アームの先端高さ、機体の位置を計算する
height_ctrl.ino アームとそれに連動する機体をPID制御するモジュール void height_ctrl_execute()
void height_ctrl_set()
void height_ctrl_get()
void height_ctrl_reset()

なし
double height_s,double height_vel_r,double height_vel_l
double *height_s
なし

なし
resister.inoで得るheightとbody_distの値に対応した引数で与えられる目標高さhとアームの角度から算出される機体位置rを用いる。
motor.ino 各モータにpwm値を渡すモジュール void motor_open()
void motor_set()
void motor_a_set

なし
int pwm_r,pwm_l :左右のPWM指令関数値(0~±255)
int pwm_a :アームのPWM指令値(0~±255)

なし
アームモータ用の関数を追加した
run_ctrl.ino 走行やアームの大元の制御を行うモジュール
void run_ctrl_execute()

void run_ctrl_set()
void run_ctrl_get()
void arm_ctrl_set()
void arm_ctrl_get()
void body_ctrl_set()
void body_ctrl_get()
なし

run_state_t state :走行モード
double speed :直進速度[cm/s]or回転速度[deg/s]
double dist :機体直進距離[cm]or機体回転角度[deg]
orアーム座標角[deg]orアーム先端高さ[cm]
なし 走行制御だけではなくstateに合わせてアーム等も制御できるようにした。
linetrace.ino ライントレース走行を行うモジュール void linetrace_open
void photoreflector
void linetrace_execute
なし
なし
way_dist :点検コースの距離
なし
なし
pwm_r, pwm_l:左右のPWM指令関数値(0~±255)
istop_linetrace:コースを走り切った際の停止信号,
ierrstop:エラーが起こった際の停止信号
特になし
deg_a_ctrl.ino アーム単体の角度をPD制御するモジュール void arm_ctrl_execute()
void deg_ctrl_a_set()
void deg_ctrl_a_get()
void deg_ctrl_a_reset()

なし
double deg_a :目標座標角
double *deg_a
なし


なし
resister.inoで得るdeg_armと引数で与えられる目標角を用いる。
state_light.ino raspiで制御する状態をLEDライトで判別するモジュール void init_Status_indicator()
void off_Status_indicator()
void set_Status_indicator()
なし
なし
int state
なし 特になし

3.画像処理モジュール詳細

画像処理モジュールでは、openCVを用いて傷などの以上を検出する。
openCVライブラリで使用するモジュールの詳細を以下のTable.4に示す。 また、本モジュールでの画像処理の流れを以下の順番の通りに行う。

1.画像を取得する
2.画像を2値化処理する
3.保存しておいた正常時の画像と取得した画像をcv2.matching()で比較する。
4.2枚の画像を重ね、差分を傷として検出する。

Table.4 openCVライブラリ内使用モジュールの詳細
モジュール名 概要 備考・変更点
cv2.VideoCapture カメラ画像を取得する
cv2.copyMakeBorder 画像に黒色の枠領域を追加する
cv2.matchTemplate 2枚の画像の一致座標捜索
cv2.ORB_create / drawMatches 特徴点マッチングを実装するためのモジュール 特徴点検出ORBアルゴリズムを使用する
cv2.blur 精度向上のための画像のぼかし
cv2.absdiff 画像の差分取得
cv2.threshold 差分画像の2値化
cv2.cvtColor BGR -> RGBの変換
cv2.findContours 輪郭取り出し
cv2.boundingRect / cv2.rectangle 正方形領域の抽出

4.洗浄動作アーム制御詳細

アーム単体の制御はPD位置制御を行い、アームの座標角度を入力として、アーム用モータのpwm値を出力するようにした。
アームと機体の同時制御では、アーム先端の垂直動作と機体の平行移動を実現するにあたり、 アーム先端の高さhを入力としたアームのPD位置制御を行い、同時にアーム先端に取り付けられた圧力センサの値が逸脱したら(if文)、
現在の高さhから逆運動学を用いて駆動モーターの移動距離rを取得し、そのPD位置制御とエンコーダの値を計算した速度をI制御した値 を左右モータのpwm値を出力する制御を行う。

また、アーム単体の制御器と、機体とアームの同時制御器、その動作のイメージをそれぞれfig.4、fig.5、fig.6に示す。


fig.4 アーム単体の制御器のイメージ図

fig.5 アームと機体の制御器のイメージ図

fig.6 アーム洗浄動作のイメージ図


5.ライントレース制御詳細

Parcleは走行をライントレース制御で行う。
7個あるフォトリフレクタを用いて、白線を踏んでいるフォトリフレクタの数と位置から状況を判断し、PD制御のライントレースを行う。
処理の流れをいかに示す。

0.(準備)フォトリフレクタで白線と線の外の値を読んで、足し合わせた平均をとり、白線を踏んでいるか判断する閾値にする。
1.ロータリーエンコーダの値を読んで得た走行距離と点検のルートの距離を比較して、ライントレースを続けるか判断する。
2.フォトリフレクタの値を読んで、そこから閾値の値を引き、負のフォトリフレクタがいくつあるかで白線を踏んでいるフォトリフレクタの数を判断する。
3.白線を踏んでいるフォトリフレクタの数で場合分けしたなかで、どのフォトリフレクタが白線を踏んでいるのかによってさらに場合分けし、それぞれの状態に応じたPD制御のライントレースを行う。

フォトリフレクタの配置および識別するための番号付けについて、下の図に示す。

fig.7 フォトリフレクタの配置と番号

状態は直進、回転、復帰の3つに分けられる。
ライントレース制御の大まかな流れとライントレース制御のブロック線図を以下に示す。

fig.8 ライントレース制御の大まかな流れ

fig.9 ライントレース制御のブロック線図
直進、回転、復帰それぞれの状態の詳細を以下に示す。

直進
点検のルートを直進するときの状態。
直進は踏んでいるフォトリフレクタの数が2個以上で、復帰、回転動作の条件に当てはまらなかった場合の状態。
直進に分類される場合の例を以下の図に示す。

fig.10 直進時のラインとフォトリフレクタの位置

回転
点検のルートの角で左折するとき及び、洗浄動作からライントレースに復帰する右回転の状態。
0番、3番、5番or6番が白線を踏んでいた場合(fig.11)に左折。
0,3,4が白線を踏んでいた場合(fig.12)に右回転する。
回転に分類される場合の例を以下の図に示す。

fig.11 左折時のラインとフォトリフレクタの位置 fig.12 右回転時のラインとフォトリフレクタの位置

復帰
洗浄動作の後、点検のライントレースに復帰するための回転動作の準備の状態。
白線を踏んでいるフォトリフレクタが無い場合、5,6が白線を踏んでいる場合(fig.13)、0,1,3,4が白線を踏んでいる場合、0,2,3,4が白線を踏んでいる場合に後退。
1,2が白線を踏んでいる場合、0,3が白線を踏んでいる場合、0,4が白線を踏んでいる場合に前進する。 復帰に分類される場合の例を以下の図に示す。

fig.13 復帰時のラインとフォトリフレクタの位置



MIRS 2103 ドキュメント管理台帳

MIRS DATABASE