TOPへ 2.ホッケーロボットの作成

1.セグウェイ風ロボットの作成


この応用編では様々なロボットを作成とその制御を行うプログラムの学習をします。 これまでの基礎編とは異なり、実践的な内容になりますが、基礎編の内容をしっかりと学習していれば十分に理解できると思います。

さて、ここではセグウェイ風のロボットを作成します。これは不安定なロボットを立たせ続けるものです。 「バランスを取る」ということを比較的簡単な手法で実現しています。


1.ロボットの仕様

まず、ロボットの仕様を考えます。仕様からハードウェアとソフトウェアの方針が決まるため、まずは仕様を考えていきましょう。
この仕様に基づいてロボットの作成を行う。


2.ロボットの作成

以下のようなロボットを作成します。
seg.png(113054 byte)
作り方は、こちらのページを参照してください。
今回はモータをそれぞれ出力ポートのBとCに、ライトセンサを入力ポート3に接続します。


3.プログラムの作成

それではプログラムを作成します。
今回の動作はロボットのバランスを取って立たせることです。 一見すると難しそうですが、順序立てて考えることにより実は簡単に行えるのです。

まずはこのロボットがどのような動きをするかを覚えてる必要があります。
このロボットはタイヤを前方向に回転させるとロボットは後ろ(右図でのBの方向)へ傾き、逆に後ろ方向へ回転させると前(右図でのAの方向)へ傾きます。 つまり、『ロボットはタイヤの回転方向とは逆の方向に傾く』のです。

これを踏まえてプログラムを考えていきましょう。
ロボットのバランスを取るために現在の傾きに応じてタイヤの回転を変えれば大丈夫です。 すなわち『A方向に傾いているなら正回転、B方向に傾いているなら逆回転』を行えばいいのです。
これを参考に今回は次のようなルールとします。
  • A方向に傾いているとき、モータを正回転させる。 このとき傾き具合に比例してモータのパワーを上げる。
  • B方向に傾いているとき、モータを逆回転させる。 傾き具合に比例してモータのパワーを上げる。
  • 傾いていないとき、モータを弱いパワーで回転させる。
これによりロボットの直立を実現させます。

ただし、注意として傾きの基準は『直立した状態よりも僅かにA方向に傾いた状態』とします。 なぜなら、ライトセンサで測定を行うと「直立状態を基準とすると傾いた方向を判別できない」「B方向には大きく傾けない」からです。
また、ライトセンサを使用しているため床面の光の反射率が殆ど一定である必要があります。 途中で色が変わったり、床に模様がある場合では正常に動作できません。
seg-rule.jpg(17344 byte)



それではプログラムの解説を行います。ここでは segway.c とします。
segway.c
#include "nxtlib.h"

#define THRESHOLD 50	// 基準の角度時のライトセンサの値
#define POWER1 -40	// 基準よりも傾いているとき(B)のパワー
#define POWER2 20	// 基準値のときのパワー
#define POWER3 40	// 基準よりも直立に近いとき(A)のパワー
#define POWER_P 3	// 基準値からのズレに対するパワーの増加率

task main(){
	int power;
	SetSensorLight(S3,Active);

	while(true){
		if(SensorValue(S3) < THRESHOLD){
			power = POWER1 - POWER_P*(THRESHOLD - SensorValue(S3));
		}else if(SensorValue(S3) > THRESHOLD){
			power = POWER3 + POWER_P*(SensorValue(S3) - THRESHOLD);
		}else{
			power = POWER2;
		}
		motor[motorB] = power;
		motor[motorC] = power;
		nxtDisplayTextLine(3,"LIGHT:%3d",SensorValue(S3));
		wait10Msec(1);
	}
}

if文を用いた分岐で、先ほどのルールを実現させています。
このプログラムを動かす場合、今回指定した値をそのまま使用すると失敗する可能性が高いです。 そのため、自分の環境やモータに応じてマクロを適した値に書き換えて行いましょう。


4.プログラムの実行

それではプログラムを実行します。初期位置は出来るだけ立った状態にしておきましょう。
また、なかなかうまく倒立しないと思います。この場合はパラメータを調整しましょう。 また以下の動画のように指で意図的に突くことで立たせることもありでしょう。(実際はうまく倒立することは稀です)

保存する場合はコチラ(avi形式:8.77MB)


5.更なる改良へ

今回のプログラムではロボットのバランスを取るのが不安定です。 そのため、制御のルールを増やしてより正確にバランスを取るように改良することが考えられます。 またロボット自体の重心も傾いているため、ハードウェアの改良も十分に有効です。
さらに、あらゆる環境下でもバランスを取ることが出来るようにプログラムを改良するということも考えられるでしょう。



TOPへ 2.ホッケーロボットの作成