ロボットのスピード

ロボットのスピードと言えば移動速度が注目されているが、個人的にはプログラムの処理速度も注目するべきだ思う。


C-Styleでロボットを作る場合、プログラムの初期化後に「while:無条件ループ」〜「endwhile」で繰り返し処理を行うパターンが多いと考えるが、ここでは無条件ループの1周分の処理時間が異なる3つのプログラムがあると仮定する。

  • Aのプログラムは毎秒5周
  • Bのプログラムは毎秒10周
  • Cのプログラムは毎秒20周

の無条件ループを処理できる場合、それぞれ1周の処理に要する時間は

  • Aのプログラムは0.2秒=200ミリ秒
  • Bのプログラムは0.1秒=100ミリ秒
  • Cのプログラムは0.05秒=50ミリ秒

となる。
ロボットの移動速度が秒速1m(1m/秒)としたとき、1周の処理中に移動する距離は

  • Aのプログラムは 1m/秒 × 0.2秒 = 0.2m = 20cm
  • Bのプログラムは 1m/秒 × 0.2秒 = 0.1m = 10cm
  • Cのプログラムは 1m/秒 × 0.2秒 = 0.05m = 5cm

となる。

プログラム中で床に書かれた2cm幅のラインをチェックしようとしても、例えばAのプログラムであれば、ロボットが移動する20cmごとのチェックになるため、床センサの計測範囲が狭い場合は見逃す可能性が高く、見逃さないよう動かすには1度に20cmの範囲がチェックできる床センサを用意するか、移動速度を落とす必要がある。

しかし、Cのプログラムならば、移動5cmごとのチェックになるため、1度に5cmの範囲がチェックできる床センサがあれば見逃しは理論上はなくなる。
プログラムの処理速度が高ければ、狭い範囲しかチェックできないセンサでも見逃しをなくせる。特に同じ処理をするなら、どうすれば速く処理できるかを工夫することが大切になる。


C-Styleでは「Timer1:Start」とC-Code「printf("%ld", gT[T1]);」を使うことでシリアルモニタ上で経過時間をミリ秒単位で確認できる。
(printfの処理時間も考慮すると「Timer1:Start」、「A=Timer1」、C-Code「printf("%ld", gV[VAR_A]);」が望ましいかも)

printfの出力結果は、センサーモニタの「センサーモニタ&出力チェック」の見出し部分をダブルクリックしてシリアルモニタが開いた状態で、プログラムをスタートさせて確認する(もしくは、TeraTermなどソフトでCOMポートを開いた状態でプログラムをスタートさせる)。