■
[工作]ロボットプログラム三要素
(「id:ohguma:20170302」の続き)
ロボット作成時にプログラムは三要素 S・C・A
- S(Sensor) センサ:感じて知らせる!
- C(Computer) コンピュータ:判断して命令!
- A(Actuator) アクチュエータ:目的をはたす!
を分けるとよいと思う理由の1つが、デバッグのしやすさにある。
(なお、開発環境はC-Styleを想定。他の環境ならまた別の方法もあると思う)
三要素に分かれているプログラムの「S(Sensor) センサ」部分のデバッグをする場合、私は「C(Computer) コンピュータ」部分の前に次のようなチェック行を追加しておくことが多い。
この場合、「if」の条件「"C"code:TRUE」では、「if」〜「end if」間が常に実行され、
- 「"C"code」printfで変数AとBをシリアルモニタに表示し、
- 「continue」で無条件ループの「while」行に戻る。
ため、「C(Computer) コンピュータ」部分以降は実行されずに「S(Sensor) センサ」のみのデバッグができる。
(時間待ちを入れるのは、デバッグ表示を見やすくするため)
デバッグが終わったら条件を「"C"code:FALSE」にすれば「if」〜「end if」間が無視され、「C(Computer) コンピュータ」部分以降が実行される。
条件が「TRUE」ならデバッグ処理あり、「FALSE」ならデバッグ処理なし、と簡単にデバッグ処理の有無を設定できるので、改めてデバッグする場合でも設定変更に手間がかからない。
また、「C(Computer) コンピュータ」部分のデバッグをする場合には、「S(Sensor) センサ」部分のデバッグ処理をなしにしておき、「C(Computer) コンピュータ」部分で決定する変数を直接指定する。
こうすることで、実際のセンサの値とは無関係に「C(Computer) コンピュータ」部分をデバッグすることができる。
三要素 S・C・Aのそれぞれの作業分担を次のように考えるとよいと思う。
- S(Sensor) センサ:感じて知らせる!
- センサ値から状態変数を決定する
- (状態変数の例)
- 距離センサの状態(遠い、近い など)
- ラインセンサの状態(ラインあり、なし など)
- センサの値を直接状態とする必要はない。計測値は後の処理で必要とする状態に加工しておく。
- 異常な計測値への対応も考慮する
- 異常な計測値が取得された場合は、それを無視して前回ループ時の値を使う とか
- 突発的な値の変動をなだらかにするために、前回ループ時の値と平均を取る とか
- C(Computer) コンピュータ:判断して命令!
- 状態変数から行動変数を決定する
- (行動変数の例)進行方向、スピード など
- A(Actuator) アクチュエータ:目的をはたす!
- 行動変数から実際の動きを決定する。
- (実際の動きの例)各モーターへのPWM値 など
(状態変数、行動変数というのは私が勝手にそう呼んでるだけです)