メモ - ライントレースの制御周期について考える

ライントレースロボットは定期的に制御を行うわけだが、その周期ついて深く考えたことはなかった。 なんとなく速いロボットは1kHzで、遅いロボットは50~100Hzで制御しているが、先日の知能ロボコンでは、カメラの30fpsで十分に安定したライントレースができてしまった。 ではどの程度が妥当なのかを考える。

大前提として、姿勢の推定周期は制御周期以上だし、姿勢の推定周期はセンサーのサンプリング周期以下である。

制御系の時定数的な限界

よくされる説明としては、「制御系の時定数よりも十分に小さい時間周期」である。 十分に小さいってなんやねんという感じだが、世間が言うには1/10くらいだと十分らしい(十分てそういう……)。 で、時定数は(厳密な定義はすっ飛ばすが)物理的にゼロヒャクにかかる時間の63%とすればいいはず。

とりあえず手元にあった適当な部品でライントレースを作って確かめてみた。 残念ながら手頃なエンコーダー付きのモーターがなかったのでエンコーダーなしのモーターでこしらえてビデオ判定する。 間違いなく正確ではないが、オーダーのあたりを付けるくらいはできるだろう。

というわけで、120fpsで9コマ目にはトップスピードに達しているように見えるので、1 / 120 x 8 x 0.63 ≒ 42msec程度が時定数で、 この1/10ということは4msec・250Hzで制御すれば良いらしい。 というわけで現実に戻してこれを見る。 以下はP制御のみ、同一比例定数で制御周期のみ変更したもの。

youtu.be

1倍に対して4倍と10倍で確かに滑らかになっていそうだ。1msecでも実験したが、見た目4msecに比べて何も変わらなかったので載っけてない。

本場のロボトレースはなんかは1~2kHzくらいで制御してそうな記述を見かける。 つまり、機械的時定数が10~20msec(ゼロヒャクが16~32msec)ということになるが、 あの応答の速いコアレスモーターで、あのトルク対重量で、このいい加減な台車に対して1/2~1/3程度の時定数でしかないというのはちょっと信じがたい。そんなもんなんだろうか? あるいは軽いから摩擦力が全然なくてスリップしてしまうから結局その程度に律速(律加速?)されてしまうんだろうか?大変そうだな……

もっと差し迫った制約

で、ここまでは「滑らかなPID制御のために」必要な周期の話をした。 ではライントレースがなんとかできる程度という話だとどうだろうか? なんか、こう、万能の推定器があって今の状態から次の状態になるまで最適な制御がわかるとして……

最もシビアなケースというのは90度(以上)のカーブで、それを読み飛ばさない速度、ということになりそう。 知能ロボコンだとR150、ロボトレースだとR100、RCJレスキューとかだと直角は……ビニールテープ幅のR19としていいんだろうか?まあそういう前提で考えると

周期 R150 R100 R19
30Hz 4500mm/s 3000mm/s 570mm/s
50Hz 7500mm/s 5000mm/s 950mm/s
100Hz 15m/s 10m/s 1900mm/s
500Hz 75m/s 50m/s 9500mm/s
1000Hz 150m/s 100m/s 19m/s
2000Hz 300m/s 200m/s 38m/s

となる。結構余裕はありそうに見えるが、そもそもが荒唐無稽な前提条件であるので、現実にはこれの数倍はないとまともにライントレースしなさそうではある。 違ってそうな気もするが、わからないのでとりあえずこれで。

十字線を読み飛ばさない周期

よくあるビニールテープの19mm幅の十字線もしくはマーカーを読み飛ばさないためには、19mm×制御周期未満になる。そうすると前述のR19と同じだ。 この場合でも斜めに進入したり、誤検知対策のために「n回連続で読んだとき」みたいな処理を入れたかったり、前後方向に正確に距離を取りたかったりすると最大速度はもっと小さくなる。 そう考えると30Hzで300mm/sだった知ロボ機はギリギリの値だったっぽいか?

要するに

結局30fpsは十分ではないらしいな……。 今後の課題といたします。