前回に引き続き四足ロボットを歩かせてみます。とりあえずですが・・歩けました。やるぅ~♬
Arduino Nanoを使って、サーボ8軸(8個)を制御します。PCA9685 16チャネルPWMサーボモータドライバをI2C通信でやりとりしながら、四足歩行ということで、クリーピングゲイトという歩き方で歩かせました。
1.歩くための考え方~クリーピングゲイト~
まずは、どんな感じになったか、ご覧ください。
すごい!自分で言うのも変ですが、歩いてますよね。初めて歩けた時は、ちょっと感動でした。
ただ、実験ということで、見栄えはご容赦下さい。この歩き方は、クリーピングゲイトで歩いています。(クリーピングゲイト:creeping gait とは、はって歩くような様子(歩容)です)背が高いので、はって歩くというイメージではありませんね。
2本足を作るのは正直大変ですが、4本足は歩行時安定させやすく、作りやすいので、4本足で作ることにしました。通常、3点あれば、モノを支えることが出来ます。ですから、4本足であれば、1本を浮かせたとしても安定して支持することができるということです。
クリーピングゲイトの特徴は常に3本の足で支えます。その足が作る三角形の中に重心があればロボットは安定しています。しかし、この三角形の外に重心が長い時間出てしまうと、ロボットは転んでしまいます。
参考にさせて頂きました。ありがとうございました。
Arduino搭載四足歩行ロボットのプログラム
5000円で四足歩行ロボットしてみた。
他にも動的にバランスを取りながら速く歩く、若しくは走る方法があり「トロット」「ペース」「ギャロップ」と呼ばれています。
0:39くらいから、起き上がるガンダム、サーベルアクションなど動くガンダム見れます。(あ、私が作ったのではないです)カッコイイ!
歩行に関する詳しい資料
2.歩くための実験1(前進)
次は、歩くためのクリーピングゲイトの動きです。先ほどのように、重心が支ええている足の三角形から外れないように、準備としての動作が何回か必要になります。そのあと、一気に全部の足を動かして、前へ進みます。滑らかな動きのクロールではなく、エネルギーを貯めて一気に爆発させる平泳ぎに似ている感じがしました。下の図がその動きです。
6個の動きを繰り返すことになります。
3.歩くためのプログラム(スケッチ)
続いてプログラム(Arduinoで言うスケッチ)です。ほんとは、0°と180°にしたいのですが、サーボモーターの性能にバラツキがあり、両端の角度を指定してもモーターによってその角度にならないものもあるので、端の値は使わないようにして、10°~170°としています。
#include <Wire.h> #include <Adafruit_PWMServoDriver.h> Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); #define SERVOMIN 102 // this is the 'minimum' pulse length count (out of 4096) #define SERVOMAX 492 // this is the 'maximum' pulse length count (out of 4096) void setup(){ pwm.begin(); pwm.setPWMFreq(50); // Analog servos run at 50 Hz updates servo_write(0,90); } void servo_write(int n, int ang){ // 動かすサーボと角度を引数に持つ ang = map(ang, 0, 180, SERVOMIN, SERVOMAX); // 角度(0~180)をPWMのパルス幅(102~492)へ変換 pwm.setPWM(n, 0, ang); } void loop(){ //①-----<<初期位置>>----- delay(1000); //②-----<<準備動作>>----- //3番ピンのサーボに角度10度を指示、7番ピンのサーボを少し持ち上げ servo_write(7,70); delay(500); servo_write(3,10); delay(1000); servo_write(7,90); delay(1000); //③-----<<移動、前進>>----- // 0番ピンのサーボに角度10度を指示 servo_write(0,10); // 1番ピンのサーボに角度135度を指示 servo_write(1,135); // 2番ピンのサーボに角度90度を指示 servo_write(2,90); // 3番ピンのサーボに角度45度を指示 servo_write(3,45); delay(1000); //④-----<<準備動作>>----- servo_write(4,70); delay(500); servo_write(0,90); delay(1000); servo_write(4,90); delay(1000); //⑤-----<<準備動作>>----- servo_write(6,110); delay(500); servo_write(2,170); delay(1000); servo_write(6,90); delay(1000); //⑥-----<<移動、前進>>----- // 0番ピンのサーボに角度45度を指示 servo_write(0,45); // 1番ピンのサーボに角度170度を指示 servo_write(1,170); // 2番ピンのサーボに角度135度を指示 servo_write(2,135); // 3番ピンのサーボに角度90度を指示 servo_write(3,90); delay(1000); //⑦-----<<準備動作①と同じ形にする>>----- servo_write(5,110); delay(500); servo_write(1,90); delay(1000); servo_write(5,90); delay(1000); }
一度、動きをチェックしてみます。実際の動きはこんな感じになります。
4.歩くための実験(実機)
あとは、実際に歩行できるか確認してみます。
尚、今回は、クリーピングゲイトで歩行できるか確認することが目的なので、完成品は違う形を考えています。
調整しきれていないので、少し横へスライドする動きが入っています。完成品の時には調整する予定です。
また、地面に接地する足を本体の下側ではなく、外側す構造にしてみたのですが、地面に接する関節(サーボモーター)が本体側のサーボモーターの中心からずれると横にスライドする動きがさらに大きくなったので、出来るだけ回転中心に近い位置に地面に接する関節をもっていくため、今回のような形になっています。
5.まとめ
- 四足歩行の歩容として、クリーピングゲイトという3本の足を止めて支えている間に、残りの1本の足を動かすことで進む、歩行アルゴリズムがある。
(そういう決まったものがあるんですね) - 具体的には、6種類の足の配置があり、その配置に動かせば、実際にロボットを前に進めることができた。
- 前進させる動きの詳細までは分からないが、今回は一旦、クリーピングゲイトで動くことの確認までとした。(本体の回転軸からずらした位置の接地足では、横滑りがひどく、うまく前に進まなかった。研究が必要!)
今回は簡易的にやろうとするあまり、条件がぼやけたものとなり結果も曖昧なものになってしまいました。次回は足の接続部品をキチンと製作して、条件をハッキリさせることで、不具合の部分を解析したいと思います。心配ナイサー♬。
見栄えはおいといて、自分も作ってみたいなぁと思って頂けると嬉しいです。
つづく。