STEP8: 4脚ロボット
ODE本「簡単!実践!ロボットシミュレーション – Open Dynamics Engineによるロボットプログラミング
」のStep8です.
ここでは,4脚歩行ロボットについて学びます.クロール,ウオーク,トロットなどの代表的な歩き方を学び,4脚ロボットのモデルを作り,それにクロール歩行を実装します.続きはODE本で...
以下にシミュレータの動画を掲載します.ソースコードはこのページの注意事項を読み,ダウンロード,ビルドやコンパイルし実行してください.
- プログラム8.1: 4脚ロボットの歩行制御 (P210)
- 説明:上の動画では体を左右にふって転ばないように歩いています.パラメータを調整していないので,歩き方がぎこちないです.これをスムーズに歩かせることが,あなたのミッションです.
(最終更新日 2008-7-27)
4脚歩行のモデルを少し書き換えて脚を2本増やしたのですが、脚6本ではうまく歩かず、ひざから下が飛んでってしまいます。
どのようにすれば6脚歩行できるのかわかる人教えてください。
お忙しい中,お返事ありがとうございました.
時間が空いている時,見て頂きたいのですが,
1を試そうと思ったのですが、膝しか曲がらず,できませんでした.
股関節と足首にはそれぞれヒンジジョイントで,x y z方向,x y方向に設定していたのですが,ヒンジジョイントは同じ位置では2方向以上に設定することはできないのでしょうか?
mahiさん,
ロボカップ世界大会でオーストリア出張したいたので仕事が溜まっていて詳しくアドバイスできませんが,以下のことを試してください.
1.逆運動学が正しいかは,運動学を使って確かめる.
2.1が正しい場合は,CFM, ERPの値を調整する.
3.それでもおかしい場合は,ロボットのモデルが正しい(リンクや関節の位置)か確認する.
でむ
demuさん,こんにちは.
4脚ロボットを参考に2足歩行ロボット(脚だけ)を作ったのですが,思うようにできませんでした.
地面までの高さ,最高到達点,左右の変位,歩幅,を少しずつ変えてみたのですが,振動しながら不規則に移動したり,片方の膝が曲がったまま停止したり,倒れたあと振動し移動したり,と全く歩行になりませんでした.
どういう原因が考えられるでしょうか?
因みにインバースキネマティクスの部分はこういう感じでいいのでしょうか?
void inverseKinematics(dReal x, dReal y, dReal z,dReal *ang1,dReal *ang2, dReal *ang3, dReal *ang4, dReal *ang5,dReal *ang6)
{
dReal l3=0.7,l4=0.7,l6=0.1;
dReal Px,Py,Pz;
dReal a[3],b[3];
a[0]=-cos(*ang1)*sin(*ang3+*ang4+*ang5)*cos(*ang6)-sin(*ang1)*(cos(*ang2)*sin(*ang6)+sin(*ang2)*cos(*ang3+*ang4+*ang5)*cos(*ang6));
a[1]=-sin(*ang1)*cos(*ang3+*ang4+*ang5)*cos(*ang6)+cos(*ang1)*(cos(*ang2)*sin(*ang6)+sin(*ang2)*cos(*ang3+*ang4+*ang5)*cos(*ang6));
a[2]=sin(*ang2)*sin(*ang6)-cos(*ang2)*cos(*ang3+*ang4+*ang5)*cos(*ang6);
b[0]=cos(*ang1)*cos(*ang3+*ang4+*ang5)-sin(*ang1)*sin(*ang2)*sin(*ang3+*ang4+*ang5);
b[1]=sin(*ang1)*cos(*ang3+*ang4+*ang5)+cos(*ang1)*sin(*ang2)*sin(*ang3+*ang4+*ang5);
b[2]=-cos(*ang2)*sin(*ang3+*ang4+*ang5);
Px=x-l6*a[0];
Py=y-l6*a[1];
Pz=z-l6*a[2];
dReal Ca=(l3*l3+Px*Px+Py*Py+Pz*Pz-l4*l4)/2*l3*sqrt(Px*Px+Py*Py+Pz*Pz);
dReal Cb=(l3*l3+l4*l4-Px*Px+Py*Py+Pz*Pz)/2*l3*l4;
dReal phi=atan2(Px,sqrt(Px*Px+Py*Py));
dReal alpha =-atan2(sqrt(1-Ca*Ca),Ca);
*ang1=atan2(b[1],b[0]);
*ang2=M_PI/2-atan2(sqrt(Px*Px+Py*Py),Pz);
*ang3=M_PI/2-atan2(sqrt(Px*Px+Py*Py),Pz)-atan2(sqrt(1-Ca*Ca),Ca);
*ang4=M_PI-atan2(sqrt(1-Cb*Cb),Cb);
*ang5=atan2(sqrt((x-Px)*(x-Px)+(y-Py)*(y-Py)),z-Pz)+*ang4-phi-alpha;
*ang6=atan2(sqrt(Px*Px+Py*Py),Pz)+atan2(sqrt((x-Px)*(x-Px)+(y-Py)*(y-Py)),z-Pz);
}
長々と申し訳ありません.
宜しくお願いいたします.
mahiさん,
モデルに問題があると思います.
ヒンジジョイントは同じ方向に何個でも設定可能です.
ヒンジジョイントに接続されている2つのボディは接触判定をしないようにしてみてください.また,ジョイント可動域の設定は正しいでしょうか?
でむ
歩行モデルで上記のことを気にしてやってみたのですが上手くできなかったので,簡単な例として2つの直方体をy軸に沿ってつくりx,y,z軸まわりにヒンジジョイントで接続してみました.
接触判定はなくして,可動域は-M_PI/4からM_PI/4にしました.
そして,z軸まわりにM_PI/6回転するようにしたのですが,真っ直ぐのままでした.
x,y軸まわりのジョイントをなくすと,z軸まわりにM_PI/6回転するようになりました.
やはり3方向のヒンジにすると動かなくなってしまったのですが,何が原因なのかわかりません.
モデルの作り方が間違っているのでしょうか?
もしかして,1つのボディに3つのヒンジジョイントを付けていませんか?
例えば,ボディ1とボディ2をヒンジジョイントで3軸直交するためには以下のようにします.
ボディ1-ヒンジ(ロール)-ダミィボディ1-ヒンジ(ピッチ)-ダミィボディ2-ヒンジ(ヨー)-ボディ2
なお,ダミィボディは非常に小さくしてください.
でむ
ひざから下がふっとんでしまうのは,恐らくモデルが間違っているためだと思われます.
各リンクの座標と関節の位置,回転ベクトルに矛盾がないか調べてみてください.
モデルに問題がない場合は,関節制御におかしな値が入っていないか調べると良いと考えます.
でむ
返信ありがとうございます。
何度も見直して確認はしてるんですが、まったく直らないです。
それどころかよく見ると新たな疑問点とかが出てきたり・・・
具体的な変更点って
・全脚数
・関節中心座標
・各リンクの位置
・歩行の目標座標
でいいんですよね?