センサーを使ったロボットの自律制御
プログラムの中身をのぞいてみよう
前回は、教育用レゴ マインドストームNXTを動かすために、環境構築と、「2秒前進して止まる」という簡単なプログラムを作成しました。このプログラムを応用して、モータのパワーとタイマの時間を組み合わせると、ロボットを時間で制御することができるようになります。
「2秒前進して止まる」プログラムは、4つのファイル( 1)forward.c、2)forward.h、3)forward.cfg、4)makefile)で構成されていました。それぞれ詳しく見ていきましょう。
1)forward.cには、タスク(tsk0)の実装が記述されています。
ここではecrobot_set_motor_speed(出力ポート,パワー)という関数で、教育用レゴ マインドストームNXTの左右のモータを順方向に回転させています。
また、パワーをマイナスにして逆回転させることもできます。systick_wait_ms(ミリ秒数)という関数は、実行中のタスクを、指定したミリ秒数だけ待たせます。タスク(tsk0)は、これらの組み合わせによって、2秒前進して止まるという動きを実現しています。
2)forward.h には、タスク(tsk0)が宣言されています。
3)forward.cfgには、タスク(tsk0)を実行するタイミングや優先度、最大スタックサイズなどを記述して、これを元にタスクを生成しています。
「2秒前進して止まる」プログラムでは、プログラムを実行したときに、タスク(tsk0)を実行可能状態(TA_ACT)にして、タスクの優先度を最高優先度(1)に設定しています。スタックサイズは、1024バイトにしています。
●forward.cfgから抜粋
============
CRE_TSK(TSK0, { TA_HLNG | TA_ACT, TSK0, tsk0, 1, 1024, NULL });
============
4)makefileでは、コンパイルするターゲットファイル名( 1)forward.c)と、タスクのカーネルオブジェクトを生成するときに参照する静的コンフィギュレーションファイル( 3)forward.cfg)を指定し、コンパイルして生成されるファイル名(forward_jsp)を定義しています。これにより、forward.cに記述されているタスクがforward.cfgファイルで定義されている方法によって生成されます。
このようにnxtJSP環境でのC言語プログラムは、ソースファイルとヘッダファイルだけでは成り立たず、静的コンフィギュレーションファイルとの関係にも注意する必要があります。各ファイルの関係は図1-2をご覧ください。
※本記事で紹介しているソースファイルはここからダウンロードできます→(sample_code_090610.zip)。
解凍したzipファイルの中の「forward」フォルダを参照ください。
また、教育用レゴ マインドストームNXTを制御するための関数は、nxtOSEK/JSPをインストールしたフォルダ配下にあるecrobotというフォルダのecrobot_interface.h に宣言されています。
リモコンロボットか自律型ロボットか
ロボットを制御する方法は2つあります。1つ目は、リモコンやラジコンのように人間の判断によってコントロールする方法、2つ目は、ロボット自身が判断して自律型でコントロールする方法です。制御ループの中に、人間の判断が入っているかいないかという点が大きな違いです。
やはりロボットなら、自律型制御にしたいですよね。モータをタイマ制御で動かすだけでは「自律型」とは言えません。外界の情報を取得し、その情報を元にロボット自身が判断をして、自分自身をコントロールできるようにする必要があります。そのためには、センサーを使う必要があります。
教育用レゴ マインドストームNXTには、タッチセンサー、光センサー、音センサー、超音波センサーが含まれていますが、まずは光センサーを使ってみましょう。