[工作]ロボットプログラム三要素

(「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) センサ:感じて知らせる!
    • センサ値から状態変数を決定する
    • (状態変数の例)
      • 距離センサの状態(遠い、近い など)
      • ラインセンサの状態(ラインあり、なし など) 
    • センサの値を直接状態とする必要はない。計測値は後の処理で必要とする状態に加工しておく。
      • 1つのしきい値であり・なしの2値化する とか
      • 複数のしきい値で階層化する とか
      • %への換算する
      • 複数のセンサの計測結果を1つの変数にまとめる とか
        • 左ラインありなら +100,中ラインありなら+10、右ラインありなら+1を1つの状態変数に加算していくと、以後の処理で110なら左と中、11(=011)なら中と右があると1つの「if 〜 elseif 〜 else 〜 end if」判断できる。
    • 異常な計測値への対応も考慮する
      • 異常な計測値が取得された場合は、それを無視して前回ループ時の値を使う とか
      • 突発的な値の変動をなだらかにするために、前回ループ時の値と平均を取る とか
  • C(Computer) コンピュータ:判断して命令!
    • 状態変数から行動変数を決定する
    • (行動変数の例)進行方向、スピード など
  • A(Actuator) アクチュエータ:目的をはたす!
    • 行動変数から実際の動きを決定する。
    • (実際の動きの例)各モーターへのPWM値 など


(状態変数、行動変数というのは私が勝手にそう呼んでるだけです)