TOP
2.2足歩行ロボットの開発2

1.2足歩行ロボットの開発1

ここまで学んできた技術を生かして実際に何か作ってみましょう。ここではMINDSTORMSを使って簡単な2足歩行ロボットを作ってみます。工夫次第でいろいろなものが作成できることを理解してください。

1.ロボットの仕様

今回作成するロボットは以下のようなものとします。

2.ロボットの作成

今回はオリジナルのロボットなので設計図をもとに作成してもらいます。
2足歩行ロボットの設計図

3.プログラムの作成

 ロボットを動かすプログラムを作成しましょう。
次のプログラムを作成してください。ここでは作成ファイル名をbiped_walker.cとします。
作成したプログラムbiped_walker.c
#include <unistd.h>
#include <dsensor.h>
#include <dmotor.h>
#include <conio.h>

wakeup_t rfoot_off_wakeup(wakeup_t data); // right foot ts off wakeup func
wakeup_t lfoot_off_wakeup(wakeup_t data); // left foot ts off wakeup func
wakeup_t rfoot_on_wakeup(wakeup_t data); // right foot ts on wakeup func
wakeup_t lfoot_on_wakeup(wakeup_t data); // left foot ts on wakeup func
wakeup_t rotation_sensor_wakeup(wakeup_t data); // rotation sensor wakeup func

int main(int argc, char *argv[]){

	motor_a_speed(MAX_SPEED);
	motor_c_speed(MAX_SPEED);

	ds_active(&SENSOR_2);
	ds_rotation_on(&SENSOR_2);

	while(1) {
		cputs("waist");
		ds_rotation_set(&SENSOR_2,0);  // move waist joint
		motor_a_dir(fwd);
		wait_event(&rotation_sensor_wakeup,0);
		motor_a_dir(brake);
		cls();

		cputs("right");
		motor_c_dir(rev);  // move ankle joint
		wait_event(&lfoot_off_wakeup,0);
		motor_c_dir(fwd);
		wait_event(&rfoot_on_wakeup,0);
		sleep(1);
		motor_c_dir(brake);
		cls();

		cputs("waist");
		ds_rotation_set(&SENSOR_2,0);  // move waist joint
		motor_a_dir(fwd);
		wait_event(&rotation_sensor_wakeup,0);
		motor_a_dir(brake);
		cls();

		cputs("left");
		motor_c_dir(rev);  // move ankle joint
		wait_event(&rfoot_off_wakeup,0);
		motor_c_dir(fwd);
		wait_event(&lfoot_on_wakeup,0);
		sleep(1);
		motor_c_dir(brake);
		cls();
	}
}

wakeup_t rfoot_off_wakeup(wakeup_t data){ // right foot ts off wakeup func
	return SENSOR_1>0xf000;
}

wakeup_t lfoot_off_wakeup(wakeup_t data){ // left foot ts off wakeup func
	return SENSOR_3>0xf000;
}

wakeup_t rfoot_on_wakeup(wakeup_t data){ // right foot ts on wakeup func
	return SENSOR_1<0xf000;
}

wakeup_t lfoot_on_wakeup(wakeup_t data){ // left foot ts on wakeup func
	return SENSOR_3<0xf000;
}

wakeup_t rotation_sensor_wakeup(wakeup_t data){ // rotation sensor wakeup func
	return ROTATION_2<-192;
}

次に簡単なフローチャートを示します。
左のフローチャートを見てください。
このうち、条件分岐文はプログラム内ではウェイクアップ関数を用いて書かれています。また、フローチャートをよく見ると判ると思いますが、プログラム開始時は左足から振り出すようにしてあります。一番最初の条件分岐である『腰関節ギヤの回転検出』にはロータリーエンコーダーを用いています。プログラム内の"-192"という値は腰関節ギヤ半回転文のカウント値です。その他、条件分岐の『足が着いた・離れた』の検出には左右の足の裏のタッチセンサーを用いています。また、プログラム文中にsleep文が2回だけ使われていますが、これはいわば遊びで、足首の角度に余裕を持たせるために設けてあります。モーターのスピードによってこれを変えてください。(RCXの電池の減り具合によっても変化します。)ここでは、ほぼ新品の電池を使ったときの値(1秒)としてあります。

3.プログラムの実行

プログラムを実行する前に、二つほど調整する点があります。
  1. 腰関節について
    左脚が一番後ろにきていること(右脚が一番前にきていること)。下図はロボットから見て左側から見た図。
  2. 足首関節について
    左右の足首の傾きが同一になっていること。両足とも一番傾いた状態(下図は右脚)にする。

ではこれらのプログラムをコンパイル、ダウンロードしてください。それではいよいよ動かしてみましょう。うまく動くでしょうか?
動いているムービーを乗せておきます。参考にして下さい。

撮影したムービーbiped_walker.avi(AVI形式)

4.まとめ

 この章では2足歩行ロボットを作成しました。RCXを使えば、いろいろなものができることがお判りいただけたかと思います。
TOP
2.2足歩行ロボットの開発2