さて、ここではセグウェイ風のロボットを作成します。これは不安定なロボットを立たせ続けるものです。 「バランスを取る」ということを比較的簡単な手法で実現しています。
1.ロボットの仕様
まず、ロボットの仕様を考えます。仕様からハードウェアとソフトウェアの方針が決まるため、まずは仕様を考えていきましょう。
- 左右にモータを1つずつ使用
- ライトセンサを1つ用いる
- 通常の状態のとき、倒れてしまうように設計する
- プログラムによりロボットが倒れないように動く
2.ロボットの作成
3.プログラムの作成
それではプログラムを作成します。
今回の動作はロボットのバランスを取って立たせることです。 一見すると難しそうですが、順序立てて考えることにより実は簡単に行えるのです。
それではプログラムの解説を行います。ここでは segway.c とします。
if文を用いた分岐で、先ほどのルールを実現させています。
このプログラムを動かす場合、今回指定した値をそのまま使用すると失敗する可能性が高いです。 そのため、自分の環境やモータに応じてマクロを適した値に書き換えて行いましょう。
今回の動作はロボットのバランスを取って立たせることです。 一見すると難しそうですが、順序立てて考えることにより実は簡単に行えるのです。
まずはこのロボットがどのような動きをするかを覚えてる必要があります。 このロボットはタイヤを前方向に回転させるとロボットは後ろ(右図でのBの方向)へ傾き、逆に後ろ方向へ回転させると前(右図でのAの方向)へ傾きます。 つまり、『ロボットはタイヤの回転方向とは逆の方向に傾く』のです。 これを踏まえてプログラムを考えていきましょう。 ロボットのバランスを取るために現在の傾きに応じてタイヤの回転を変えれば大丈夫です。 すなわち『A方向に傾いているなら正回転、B方向に傾いているなら逆回転』を行えばいいのです。 これを参考に今回は次のようなルールとします。
ただし、注意として傾きの基準は『直立した状態よりも僅かにA方向に傾いた状態』とします。 なぜなら、ライトセンサで測定を行うと「直立状態を基準とすると傾いた方向を判別できない」「B方向には大きく傾けない」からです。 また、ライトセンサを使用しているため床面の光の反射率が殆ど一定である必要があります。 途中で色が変わったり、床に模様がある場合では正常に動作できません。 |
それではプログラムの解説を行います。ここでは 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)
また、なかなかうまく倒立しないと思います。この場合はパラメータを調整しましょう。 また以下の動画のように指で意図的に突くことで立たせることもありでしょう。(実際はうまく倒立することは稀です)
保存する場合はコチラ(avi形式:8.77MB)
5.更なる改良へ
今回のプログラムではロボットのバランスを取るのが不安定です。
そのため、制御のルールを増やしてより正確にバランスを取るように改良することが考えられます。
またロボット自体の重心も傾いているため、ハードウェアの改良も十分に有効です。
さらに、あらゆる環境下でもバランスを取ることが出来るようにプログラムを改良するということも考えられるでしょう。
さらに、あらゆる環境下でもバランスを取ることが出来るようにプログラムを改良するということも考えられるでしょう。