Arduino二足歩行ロボットのモーションを滑らかにしてみた
- 2017/09/26
- 00:27
Arduino二足歩行ロボットのモーションを滑らかにしてみた
こんにちはRoboTakaoです。ようこそ「極力ローコスト ロボット製作 ブログ」にお越しくださいました。
最近、私の作った二足歩行ロボットを歩かせているとなぜか不安定になりすぐに転がるようになりました。
簡単二足歩行ロボット
前回はサーボホーンのガタを疑い、重心位置も微修正したりしましたが、抜本的な解決には至りませんでした。
前回の投稿
前々からモーションを単純にしているためにカクカクした動きとなるので改善したいなと思っていたのでこの機会に改善します。
現状のモーション
以前にも紹介しましたが、このロボットは6ステップでモーションを構成しています。各ステップは300msごとに進みますが各ステップごとはつながっていないので実際に動作させるとカクカクした動きとなります。
モーションの説明はこちら
例えば下の図のように1秒ごとにステップが進むあるサーボの角度を示したとすると、各ステップで切り替わるときに角度が急変するので衝撃が加わることになります。

0〜1秒は0度
→1〜2秒は10度
→2〜3秒は0度
滑らかにしたモーション
そこで今回は下の図のように各ステップ間は直線で結ぶようにして、その間を細かく刻んでサーボを回転させることにします。

このステップ間の直線は下の図のように求めます。

例えば、0〜1秒でA0度からA1度に変化するとして、
その間の直線を傾きaで切片をbとした直線とすると
A = a t + b
A1 = a+b A0 = b
a = A1 - A0
A = (A1-A0) t + A0
となります。
これを各ステップごとに計算すれば直線で結ばれた線で表すことができます。
スケッチ
実際のスケッチは次のような感じです。

#include
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;
// LU,LB,RU,RB
int ang0[4]={92,89,87,87};
int ang[6][4]={
{10,0,10,0},
{10,-12,10,-12},
{-12,-12,-12,-12},
{-12,0,-12,0},
{-12,12,-12,12},
{10,12,10,12}};
int ts=300;
int td=10;
int a[4],b[4];
int n;
void setup()
{
myservo2.attach(2);
myservo3.attach(3);
myservo4.attach(4);
myservo5.attach(5);
}
void loop()
{
for (int i=0; i <=5; i++){
for (int j=0; j <=3 ; j++){
if (i == 5) n = 0;
else n = i+1;
a[j] = ang[n][j] - ang[i][j];
b[j] = ang[i][j];
}
for (int k=0; k <=td-1 ; k++){
myservo2.write(ang0[0]+a[0]*k/td+b[0]);
myservo3.write(ang0[1]+a[1]*k/td+b[1]);
myservo4.write(ang0[2]+a[2]*k/td+b[2]);
myservo5.write(ang0[3]+a[3]*k/td+b[3]);
delay(ts/td);
}
}
}
歩行テスト
これで実際に歩かせてみましょう。
処置前はカクカクした動きで歩行も不安定ですが、処置後は滑らかな動きとなり歩行も安定したことがわかります。
下の動画は前半はスムーシング処理前で後半はスムーシング処理後になっています。
それでは今回はこの辺で失礼します!ありがとうございました。
スポンサードリンク