クラス図を使ってロボットの構造を把握しよう
やりたいことはプログラマーが知っている
前回は、教育用レゴ マインドストームNXTを使って製作したロボットを動かすためのプログラムを作成しました。光センサーによって黒いラインをトレースしたり、タッチセンサーの入力によって走行を停止したりできるようになりました。このロボットならば、規模がさほど大きくないこともあって、前回のようなプログラムの作り方でも、いろいろなことを試せそうです。
ここで重要なポイントがあります。それは、私たちがロボットを組み立てながらロボットの構造や動作について把握していたことです。
例えば、ロボットを前進させるためには左右のモーターが正回転すれば良いこと、また、黒いラインの上にロボットがいるときには光センサーがそのラインの上部にあることなども私たちは知っています。そして、この知識を使ってプログラムを作成していました。
言い換えれば、この知識は私たち「プログラムを作った人の頭の中」にあって、プログラム自体はこの知識を保持していないのです。つまり、これまでのプログラムは、動いたとき何が起こるのか書いた人にしか分からないプログラムなのです。
このことを確認してみましょう。前回作ったプログラムを少し詳しく見てみます。例えば、ライントレースを実行する部分は次のようなコードでした。
if(ecrobot_get_light_sensor(NXT_PORT_S3)
//明るいとき
ecrobot_set_motor_speed(NXT_PORT_B, 50);
ecrobot_set_motor_speed(NXT_PORT_C, 0);
}else{
//暗いとき
ecrobot_set_motor_speed(NXT_PORT_B, 0);
ecrobot_set_motor_speed(NXT_PORT_C, 50);
}
ここでやりたかったことは、
(A)ロボットがラインの上にいないときは左に曲がり、ラインの上にいるときは右に曲がる
ということですよね。
では、今度はコードをそのまま読んでみてください。
(B)3番ポートのライトセンサーの値がしきい値より小さいときはセンサーの下の色が明るいときで、そのときはBポートのモーターを出力50で正回転させ、Cポートのモーターは停止する。しきい値以上のときは暗いときで、Bポートのモーターは停止し、Cポートのモーターを出力50で正回転させる。
といったところでしょうか。
プログラムをわかりやすく把握するためには?
「え、それで問題ないでしょ。どこが問題なの?」という方もいるでしょう。まあ、もう少しよく見てみましょう。(A)に書いてあるのはロボットにやらせたいこと。(B)に書いてあるのは、このロボットに付随するデバイスをどのように制御するかということです。
上のプログラムには(B)にあたるとこしか記述されていませんね。要するに、このプログラムには、ロボットを(B)のように動かせとしか書いていないのです。(B)のように動かすと(A)のような動作になるという前提がわかっている人たちにしか、このプログラムを理解することはできないのです。
この例であげているロボットとプログラムはまだまだシンプルなもので、しかも私たち自身がロボットを組み立てているため、(A)と(B)の関係を「私たちの頭の中」に構築しておくことでプログラムと実際の動作のつじつまを合わせることができました。
しかし、ロボットがもう少し複雑な構造を持っていたり、もっと複雑な動作をさせたい場合、あるいはたくさんの人でプログラムを開発する場合には、より複雑な知識を「みんなの頭の中」で同じように構築しておく必要が出てくるのではないでしょうか。
今の書き方のままでは、ロボットがどのように動作するのかについて理解するのが徐々に難しくなってくると思います。