FC2ブログ

爪車

ヒト型ロボット 36 歩行パターン生成ほぼ完成

線形倒立振子に基づいた歩行パターンを実際のロボットの運動に適用させるため、歩行動作開始、停止、方向転換のパターン生成ができるようにしました。これで、歩行パターン生成はほぼ完成です。

以前は歩行開始時に片脚を上げた状態からだったのを、両脚が接地している状態から始められるようにしました。
両脚支持時の重心の運動を、片脚支持になるときの重心位置、速度に滑らかに接続できるようにしています。
歩行動作停止時には、両脚で支持できる状態で停止するようにしています。
重心の位置の運動を4次関数で計算しているだけなので、動力学等は考慮していないのですが、十分にゆっくり動かせば大丈夫だと思います。

方向転換は本の通りにしただけです。
実際の着地点が目標着地点とけっこうずれています。

xy平面の重心の軌跡
gnuplot091227-1.gif

y方向の速度
gnuplot091227-2.gif

青い部分は両脚支持期間。赤い丸が実際の着地点です。

« ヒト型ロボット 37 ODEにて動作確認|Top|ヒト型ロボット 35 両脚支持期間の導入 »

コメント

方向転換について

tsumehashi 様

お世話になります。

線形倒立振子を用いた歩行パターンで

方向転換を行う軌道が作成できず困っています。

「ヒューマノイドロボット」に記載されている

式(4.58),(4.59),(4.60)と記載されている歩幅データをそのまま流用し歩行軌道を作成しましたが記載されているものと同じ軌道を作成できません。

アドバイスを頂けないでしょうか?


Re: 方向転換について

tsumehashiです。

当方でも確認したのですが、「ヒューマノイドロボット」に記載されている軌道を再現できませんでした。
この記事(ヒト型ロボット 36 歩行パターン生成ほぼ完成)の歩行パターン生成プログラム(c++)は、消失してしまいました(2010/2/6の記事)ので、どうなっていたかは、もはや分からないです。
ただ、この時も目標着地点と修正された着地点は、結構ずれていた気がします。

参考までに、確認用に作成したScilabプログラムを記載します。

// Scilab用プログラム
clf();
clear();

Zc = 0.8; // 重心高さ
g = 9.8; // 重力加速度
Tsup = 0.8; //
dT = 0.02;

n = 5; // 歩数

// Pattern 1
//Sx = [0.0, 0.3, 0.3, 0.3, 0, 0, 0]; // n+2
//Sy = [0.2, 0.2, 0.2, 0.2, 0.2, 0, 0];
//St = [0, 0, 0, 0, 0, 0, 0];

// Pattern 2
//Sx = [0.0, 0.3, 0.3, 0.3, 0, 0, 0];
//Sy = [0.2, 0.3, 0.1, 0.3, 0.2, 0, 0];
//St = [0, 0, 0, 0, 0, 0, 0];

// Pattern 3
Sx = [0.0, 0.25, 0.25, 0.25, 0, 0, 0];
Sy = [0.2, 0.2, 0.2, 0.2, 0.2, 0, 0];
St = [0, 20, 40, 60, 60, 0, 0]; // (degree)

deg2rad = %pi / 180;

Tc = sqrt(Zc/g);
C = cosh(Tsup/Tc);
S = sinh(Tsup/Tc);

a = 10;
b = 1;
D = a*((C-1)^2) + b*((S/Tc)^2);

// Step. 1
x = 0.0; y = 0.01;
dx = 0; dy = 0;

xi = x; yi = y;
dxi = dy; dyi = dy;

px = 0.0; py = 0.0;
pxa = px; pya = py;

// Step. 2
T = 0;

plot2d(px, py, rect=[-0.2, -0.8, 1, 0.8]);
plot(px, py, ".r");

for i = 1:n+1

// Step. 3
for t=0:dT:Tsup
x = (xi-pxa)*cosh(t/Tc) + Tc*dxi*sinh(t/Tc) + pxa;
y = (yi-pya)*cosh(t/Tc) + Tc*dyi*sinh(t/Tc) + pya;
dx = (xi-pxa)/Tc*sinh(t/Tc) + dxi*cosh(t/Tc);
dy = (yi-pya)/Tc*sinh(t/Tc) + dyi*cosh(t/Tc);
plot(x,y, ".b");
end

// Step. 4
T = T + Tsup;

xi = x;
yi = y;

dxi = dx;
dyi = dy;

// Step. 5
// (4.48)
//px = px + Sx(i);
//py = py - ((-1)^i) * Sy(i);

// (4.58)
theta = deg2rad * St(i);
px = px + cos(theta) * Sx(i) - sin(theta) * (- ((-1)^i) * Sy(i));
py = py + sin(theta) * Sx(i) + cos(theta) * (- ((-1)^i) * Sy(i));

// Step. 6
// (4.49)
//xb = Sx(i+1)/2;
//yb = ((-1)^i)*Sy(i+1)/2;
// (4.50)
//vxb = (C+1)/(Tc*S)*xb;
//vyb = (C-1)/(Tc*S)*yb;

// (4.59)
theta = deg2rad * St(i+1);
xb = cos(theta) * Sx(i+1)/2 - sin(theta) * ((-1)^i) * Sy(i+1)/2;
yb = sin(theta) * Sx(i+1)/2 + cos(theta) * ((-1)^i) * Sy(i+1)/2;

// (4.60)
vxb = cos(theta) * (1+C)/(Tc*S)*xb - sin(theta) * (C-1)/(Tc*S)*yb;
vyb = sin(theta) * (1+C)/(Tc*S)*xb + cos(theta) * (C-1)/(Tc*S)*yb;

// Step. 7
// (4.55)
xd = px + xb;
dxd = vxb;
yd = py + yb;
dyd = vyb;

// Step. 8
// (4.57)
pxa = -a*(C-1)/D*(xd - C*xi - Tc*S*dxi) - b*S/(Tc*D)*(dxd - S/Tc*xi - C*dxi);
pya = -a*(C-1)/D*(yd - C*yi - Tc*S*dyi) - b*S/(Tc*D)*(dyd - S/Tc*yi - C*dyi);

printf("%i : px = %f, py = %f, pxa = %f, pya = %f\n", i, px, py, pxa, pya);

plot(px, py, ".r");
plot(pxa, pya, ".g");

end

方向転換に関して

改めて計算までして頂いて、本当にありがとうございます。

ヒューマノイドロボットに記載されている方法では

方向転換軌道に必要なものが不足しているのでしょうか?

他にも回転行列を掛ける必要がある要素が有るのではなどと考えてみたのですが、すっきりいかないです。

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://tsumeguruma.blog46.fc2.com/tb.php/94-b181427e

Top

HOME

tsumehashi

Author:tsumehashi
FC2ブログへようこそ!

06 | 2019/07 | 08
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -