プログラムを改善してもっとうまく走ろう
何かが違う上位者たちの走り
前回は、ETロボコンを通じて、チャレンジャーがどのようなことを学び、どんな風に仕事に活用しているのかを紹介しました。また、仮想的なチャレンジでは、2輪倒立振子のロボットを倒立させながらライントレースすることができました。
チャンピオンシップチャレンジャーの走り
ほかのチームは、どのような走りをしているのでしょうか?ETロボコンのWebサイトをたずねると、昨年のチャンピオンシップ大会のビデオを見ることができます(右側の「ETロボコン09」という2つの動画です)。どんな走りをしているかご覧ください。
ぜ、全然違う!!
さすがにチャンピオンシップ大会だけあって、どのチームもすばらしい走りです。特に走っている様子が実に滑らかですよね。彼らはこの滑らかな走りをどのようにして実現したのでしょう?そのことについて少し考えてみたいと思います。
ロボットを構成するハードウエアや機構は同じなので、走行の様子の違いは、そのまま彼らと私たちのプログラムの違いということになります。ソフトウエアの構造が違うのでしょうか?前回のクラス図を見てみると、私たちは、ロボットの動作を担う部分(ロボットを構成するユニット)とロボットが競技をこなすための処理を担う部分で責務を分担する構造にしています。
図1:前回作成したクラス図(クリックで拡大) |
走行方法に関する部分はライントレース用のユニットであるTracerクラスに集約したのですから、競技のこなし方で走行方法の違いがあっても、これ以外の部分の構造的な違いが走行の滑らかさに与えている影響は小さいと見てよいでしょう。
それでは、ステートマシン図を見てみましょう。このステートマシン図のアクションでは、何が起きたらライントレースを開始し、何が起きたらライントレースを止めるかを指示しているだけです。肝心の「どんな風にライントレースするか」については記述していません。
図2:前回作成したステートマシン図(クリックで拡大) |
つまり走行方法の違いは、「どんな風にライントレースすればよいのか」について予めアイデアを出して設計しているのか、またはプログラムを書く時点で場当たり的に対処しているか、という違いだと考えられます。実際には、Tracerクラスの「ライントレースする」という振る舞いの内容に違いがありそうです。
最初のプログラムを振り返る
私たちのライントレースのプログラムを追ってみると、ライン上ならば左に曲がり、ライン外ならば右に曲がるということを繰り返すことで、黒い線に沿って走る方法になっています。このプログラムは、左右に曲がるために駆動系へ出す指示のパラメータとして、最小値の-100と最大値の100を使って曲がっています。この変化が急なので、左右のブレが大きく走行時にカクカクしてしまうのかもしれません。もしそうならば、パラメータの値を小さくすることでもう少し滑らかに走行するはずです。実際に試してみましょう。
曲がるためのパラメータ値を小さくすると、けっこう滑らかに走るようになりました。しかしその代わりに、ときどきラインを外れてしまうようになりました。特に、コースの半径が小さくなると、曲がりきれなくなってしまうことがわかりました。これは問題です。
曲がるためのパラメータ値を小さくするということは、車に例えると、ハンドルを回せる角度が小さい状態と同じです。あまりハンドルを回せないので、直線は揺れが少ないのですが、急カーブは曲がりきれなくなってしまいます。結果として、カーブの所で不安定になってしまいました。
図3:パラメータの違いによって走り方も変わる |
私たちが今までやっていた制御方法は、ラインの上かどうかを判断するしきい値を決めて(これを目標値といいます)、目標値に対して値が大きいとき(ライン上)か、値が小さいとき(ライン外)かで処理を分けていました。ライン上かライン外かの「2つの場合」に分けているので、このような制御方法を「2値制御」または「ON/OFF制御」と呼んでいます。
つまり、必ず「右に曲がろうとする」か「左に曲がろうとする」処理をしているわけで、どちらにも振られないで安定して前進している状態がありません。その結果、ロボットの動作が常に左右に振れて走行していたというわけです。
どうやら、滑らかに走行できていない(そして滑らかにしようとすると不安定になる)のは、私たちのライントレース方法が「ON/OFF制御」になっていることと関係がありそうです。