2024年11月18日
004-4.アルゴリズム入門-第2回「最高を求めるロボット」
「アルゴリズム」とは英語で書くと「Algorithm」、プログラムにおける「考え方」を表した言葉です。この連載では、ロボットのプログラミングの中で、アルゴリズムを活用する方法を紹介していきたいと思います。(文/松原拓也)
◆ 30cm前進するロボット

前回からの続きです。前回は「光センサの最低値と最高値を求めるプログラム」を作って終わっていました。
今回は、それを引き継いでいこうと思ったのですが、ちょっとプログラムが長すぎて、説明しにくくなってしまったので、最低値を出す処理を削って、「最高値を求めるだけのプログラム」に直しました。あと、用語の話ですが、今回から「最大値」ではなくて、「最高値」という言葉に統一します。
[Download]最高値を求めるプログラム(NXTソフトウェア2.0で作成)

ループの中身を拡大してみました。光センサの値を「比較ブロック」を使って比べて、「スイッチブロック」の中で変数に代入しています。

ここでは新しい試みとして、このプログラムをロボットに取り入れてみます。使用するのは、おなじみの「モバイルカラー識別」用ロボットです。このロボットの作り方は教育用NXTソフトウェアの「ロボット・エデュケーター」に収録されていますので、そちらを参照してください。
今回、作ってみたいのは、「30cmほど前進して、途中で検出した光センサの最高値を求める」というプログラムです。

まず、下準備として「30cm前進するだけのプログラム」を作ってみました。
これを見て気が付くかもしれませんが、ブロックの数が普通より多いです。本来なら「移動ブロック」1個で済むところですが、ブロックを6個も使っています。なぜこうするかというと、ロボットの移動中に光センサの処理もいっしょに行いたいので、「ループブロック」を使ってモータの角度を判定しているためです。
[Download]30cm前進するプログラム(NXTソフトウェア2.0で作成)

30cmの定規をロボットの進行方向に沿って置いてみました。うまくいけば、30cmの付近で停止するはずです。
床面にはデスクロボのミッション編のフィールドを敷いてみました。このフィールドを使うと「黒地に白」と同じ環境を作ることができます。
◆ ロボットで最大値を求める1

最高値を求めるプログラムと、ロボットを30cm前進させるプログラムを合体させました。
さらに最高値を検出した時のモータの角度を記憶しておくようにしました。

比較ブロックの部分を拡大しました。モータの角度と光センサの値をそれぞれの変数に代入しています。
[Download]ロボットで最高値を求めるプログラム(NXTソフトウェア2.0で作成)

変数の「角度」というのは、モータの角度=ロボットの位置を表しています。使用しているタイヤの半径が56mmなので、これを計算すると、30cm前進するためには613度ほど回転させることになります。そこで、モータの角度さえ分かれば、スタートからの距離を求めることができます。

プログラムを実行した様子です。

プログラムを実行すると、ロボットは30cm前進して、止まりました。とりあえず、移動に関しては成功です。

液晶ディスプレイを見てみましょう。2つの値が表示されています。画面上の「57」というのは、光センサの最高値。そして、画面下の「506」というのは、検出時のモータの角度です。最高値を求める処理もうまく動作しているようです。
◆ ロボットで最大値を求める2

さらにプログラムを改造して、最高値の場所にロボットを向かわせるようにしました。
先のプログラムの後半にブロックを4個ほど追加しています。
[Download]ロボットで最高値を求めるプログラム最終版(NXTソフトウェア2.0で作成)

追加部分のブロックです。変数の「角度」を元に計算をして、モータを逆方向に回転させています。

図にすると、このようになります。 30cm前進が終わった場所から、検出した角度の差だけモータを回しているわけです。

それでは実行してみましょう。

ロボットはいったん、30cmほど前進してから、バックして写真の位置で停止しました。

ここが「光センサが最高値を示した場所」ということになります。
これらの方法は何か面白いことに活用できるかもしれません。たとえば、ロボット競技でセンサの調整を自動的にできるようにするとか、、、。いろいろ考えてみてください。
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。