STEP9: ヒューマノイドロボット

ODE本「簡単!実践!ロボットシミュレーション – Open Dynamics Engineによるロボットプログラミング
」のStep9です.

最終章です.ここでは,やんちゃでかわいい男の子をイメージしたヒューマノイドロボットモデル「けんせいちゃん:Kensei-Chan」の運動学,逆運動学を求め,足裏に圧力センサを取り付け,ZMPによる簡単な歩行制御により歩かせることが最終ミッションです.

シミュレータの動画を上に掲載します.ソースコードはこのページの注意事項を読み,ダウンロード,ビルドやコンパイルし実行してください.

  • EX9.3: ヒューマノイドモデル 「けんせいちゃん」 (P223)
    説明:Controlキーを押しながらpキーを押すと,kensei-chanがジャンプし着地します.ただし,ODE本では跳躍制御は全くふれていませんのでこれは単なるデモです.目標角度の時系列データを与えているだけです。「けんせいちゃん」に歩行制御を組み込み無事歩かせてください.
  • プログラム9.1: 力・トルクセンサ (P227)
    説明:ヒューマノイドロボットには欠かせない圧力,トルクセンサの実装例です.ODE本P227のプログラム32行目に誤りがありましたので訂正しました.ねぶらさんご指摘ありがとうございました.

(最終更新日 2008-7-27)

関節部がゴムのように伸び縮みするなんてありえますか?

胴体と上腕部までを表現しようとしています。
(torso,upper_arm_dummy1,upper_arm_dummy2,upper_arm)

肩関節でダミー1と(ダミー2+上腕部)の間が離れてしまっており、いろいろためしていたところ上腕部の質量を軽くしたら、結合しました。

  • shinさん,

    ご自分が作成したヘッダファイルの読み込みに失敗した時に,どのようなエラーメッセージが出たのでしょうか?

    詳しく教えて頂けるとわかるかもしれません.

    CodeBlocksをお使いですか?

    でむ

  • 先ほどの疑問は解決したと思われます。
    ただ、自分で作成したヘッダーファイルの読み込みに失敗してしまいます。

    「プロジェクト」→「ファイルの追加」からヘッダーファイルを追加してみましたがだめでした。どうしたらよいのでしょうか?

  • Code::Blocksをインストールして試そうとしたのですが、ビルドする際に必要なcbpファイルはどうすればよいのでしょうか?

    http://demura.net/wordpress/9ode/548.htmlで作ったhello.cbpをoriginal.cbpに名前を変更してoriginalフォルダ内に移動してプロジェクトタイトルをoriginalにすればよいのでしょうか?

    My Documents\src\ode\roboSimu\originalフォルダ内は
    original.cpp と original.h だけです。

  • shinさん、

    ODE0.10.1, 新しいOPCODEで試してもらえますか? それでもエラー出る場合は、ボディや関節を少しずつ増やしていき、どこのボディまたは関節でエラーが出るか調べ、そこの部分の位置などを変更すると直るかもしれません。

    バグを取る作業はとても時間がかかるので、ソースコードを送ってもらい、バグを直して送り返すというサービスを提供することは難しいです。なんとかご自分で解決をお願いします。

    でむ

  • 書き忘れがあったので付け足します。

    お手数をおかけします。
    [ODE INTERNAL ERROR 1]
    assertion “bNormalizationResult” failed in _dNormalize4() [../../include/ode/odemath.h]

    [Microsoft Visual C++ Runtime Library]
    Runtime Error!
    Program ..0\home\Shingo\src\ode-0.9\myprog\original\original.exe

    This application has requested the Runtime to terminate it an unusual way.Please contact the application’s support team for more infomation.

    このようなエラーがでます。
    もしよろしければ、直接プログラムを見てもらうことは可能でしょうか?
    可能でしたら、メールで連絡をいただきたいのですが。

    ちなみに環境は、
    Windows XP
    ODE Ver 0.9
    MSYS + MinGW
    となっております。

  • shinさん,

    すみません.

    完全なエラーメッセージをカットアンドペーストして見せてください.
    何かわかるかもしれませんので

    でむ

  • 何度も質問すみません。

    今気づいたのですが、LCP internal error 1というエラーが発生してました。

    これにおける原因はなんでしょうか?

    よろしくお願いします。

  • shinさん、

    ソースコードを詳細に読んで頂きありがとうございます。makeRobot関数はご指摘のとおり正確ではないので変更しました。また、足の位置が脛に対してやや前方にあり後方に転倒しやすかったので、やや後方に変更しました。

    新しいソースコードはkensei081026.zipです。

    また、何か問題があればご指摘ください。

    でむ

  • shinさん、

    個別ファイルをmakeするためのmakefileを私は作っていませんのでコメントできません。簡単にするためにcodeblocksを使っています。http://demura.net/wordpress/tutorials/ode2の自作ODEプログラムのビルド法にその方法を書いています。

    OPCODEは衝突検出に使われているライブラリ、dInitODE()はODE0.8から導入されています。

    でむ

  • Ver 0.10 ではコンパイルの方法は(original/original.cppというファイルをコンパイルするとき)
    /myprog/original>make  CONFIG=DebugLib
    でいいのでしょうか?

    また、OPCODEというのは?
    たとえばdInitODE()などのことですか?
    Ver0.10から使えるものになったもの。

  • shinさん、

    LCP Internal Errorが同時に発生しないなら原因が違います。

    ODE0.10.1と新しいOPCODEを試してください。demura.netのインストール法では新しいOPCODEを使うように設定しています。

    なお、以下はMSVCコンパイラの4244番と4305番のワーニング(警告)を出ないようにしています。

    #ifdef MSVC
    #pragma warning(disable:4244 4305) // for VC++, no precision loss complaints
    #endif

  • kensei.cpp内のmakeRobot関数でsphereを表示させるときもdMassSetBoxTotalを使っているようなのですが、大丈夫なのでしょうか?
    dMassSetSphereTotalではないのですか?

  • そのようなエラーは表示されていません。
    以下のようなことも表示されます。

    Runtime Error!
    Program ..0/home/(省略)/original.exe

    This application has requested the Runtime to terminate it an unusual way.
    Please contact the application’s support team for more infomation.

    試してみましたが、結果は変わりませんでした。
    ODEのVerが原因というのはありえますか?
    ちなみにVer 0.9です。

    kensei.cpp内の
    —————————————-
    #ifdef MSVC
    #pragma warning(disable:4244 4305) // for VC++, no precision loss complaints
    #endif
    —————————————-
    とは何を行っているのですか?

  • shinさん、

    以下のエラーも表示されますか?
    ODE Message 3: LCP internal error

    この場合、エラーの原因は数値計算の誤差、モデルの間違い、その他に理由により、システムを記述する行列が特異行列になり計算できない状態です。

    まず、shinさんのロボットモデルは正しいですか?ボディやジョイントの位置関係が現実ではありえない場合にこのエラーが発生する場合があります。

    以下を試して、その結果を教えてもらえますか?

    1. 単精度インストールなら倍精度に変更
    2. dWorldStep()からdWorldQuickStep()に変更
    3. ERP、CFMの値をいろいろ変更する。CFMは大きい値(1e-3以上)、ERPはモデルによりますが大きい場合(0.8以上)にエラーが消える場合があります。

    でむ

  • kensei.cpp と leg.cpp を参考にして二足歩行をさせようとしています。

    コンパイルは通るのですが、実行すると以下のようなエラー文がでます。
    原因は何なんでしょうか?
    また、解決法はどうなりますか?

    (エラー文)
    assertion “bNormalizationResult” failed in _dNormalize4() [../../include/ode/odemath.h]

  • kensei.cpp と leg.cpp を参考に二足歩行をさせようとしています。

    コンパイルは通るのですが、実行すると以下のようなエラーがでてしまいます。
    原因はなんなんでしょうか?
    また、解決策はどのようになりますか?

    (エラー文)
    assertion “bNormalizationResult” failed in _dNormalize4() [../../include/ode/odemath.h]

    プログラムを見てもらえれば、わかりやすいとおもうのですが・・・・

  • kensei.cpp と leg.cpp を参考に二足歩行をさせようとしています。

    コンパイルは通るのですが、実行すると以下のようなエラーが出てしまいます。
    どのようなことが原因なのでしょうか?
    解決策はどのようになりますか?

    (エラー文)
    assertion “bNormalizationResult” failed in _dNormalize4() [../../include/ode/odemath.h]

  • shinさん、

    ご指摘ありがとうございます。数年前に作ったプログラムなので何故このようなミスをしたかわかりません。おそらくカットアンドペーストで間違えたのだと思います。また、nearCallback関数もどうみてもおかしいので訂正しました。

    さらに、けんせいちゃんの初期位置STARTX, STARTYを変更するとバラバラ事件になるバグも訂正しました。

    おかげさまで、プログラムを見直すことができました。また、何かおかしいと思ったらご連絡ください。

    でむ

  • わかりにくいのでもう一度。

    kensei.cppのnearCallback関数のなかでひとつのif文の中に同じ条件が出てくるのはなぜですか? ||で区切っているので意味を成すのか疑問に思いました。

    例)if ((b1 == rlink[LEFT_UPPER_ARM_DUMMY1].id) || ←
        (b1 == rlink[LEFT_UPPER_ARM_DUMMY2].id) ||   
        (b1 == rlink[LEFT_UPPER_ARM_DUMMY1].id) || ←
        (b1 == rlink[LEFT_UPPER_ARM_DUMMY2].id) ||  
        (b1 == rlink[LEFT_THIGH_DUMMY1].id)    ||
        (b1 == rlink[LEFT_THIGH_DUMMY2].id)    ||      
    (b1 == rlink[LEFT_THIGH_DUMMY1].id) ||
    (b1 == rlink[LEFT_THIGH_DUMMY2].id) ||      
    (b1 == rlink[LEFT_FOOT_DUMMY].id) ||
    (b1 == rlink[LEFT_FOOT_DUMMY].id)) return;

    *←が重複してるとこです。

  • kensei.cppのnearCallback関数のなかでひとつのif文の中に同じ条件が出てくるのはなぜですか? ||で区切っているので意味を成すのか疑問に思いました。

    例)if ((b1 == rlink[LEFT_UPPER_ARM_DUMMY1].id) || ←
        (b1 == rlink[LEFT_UPPER_ARM_DUMMY2].id) ||   ←
        (b1 == rlink[LEFT_UPPER_ARM_DUMMY1].id) || ←
        (b1 == rlink[LEFT_UPPER_ARM_DUMMY2].id) ||   ←
    (b1 == rlink[LEFT_THIGH_DUMMY1].id)    || ←
        (b1 == rlink[LEFT_THIGH_DUMMY2].id)    ||       ←
    (b1 == rlink[LEFT_THIGH_DUMMY1].id) || ←
    (b1 == rlink[LEFT_THIGH_DUMMY2].id) ||       ←
    (b1 == rlink[LEFT_FOOT_DUMMY].id) || ←
    (b1 == rlink[LEFT_FOOT_DUMMY].id)) return; ←

    *←が重複してるとこです。

  • Yasuさん,

    どういたしまして.

    このサンプルプログラムの問題点はロボットのモデルとODEのコードが混在している点です.本来は,ロボットモデルは何らかの3次元モデルフォーマットで表現して,それ以外のコードと完全に分けるべきです.

    ただ,ドロースタッフでは3次元モデルファイルのローダーがないので,ODEのライブラリだけを使ったサンプルプログラムとしては仕方がないかなと考えています.

    でむ

  • Yasuさん,

    御指摘ありがとうございます.

    ウェブサイトリニューアルに伴い,リンクが切れていました.
    ODE0.10でビルド,コンパイルできるように変更しましたので,ダウンロードコーナーからダウンロードしてください.

    http://demura.net/dl

    でむ

  • 質問です。
    ODE本の223ページ脚注に書かれている「kensei.zip」はどこからダウンロードできるのでしょうか。
    教えていただけると助かります。

  • コメントを残す

    メールアドレスが公開されることはありません。