作成中の多指ハンドの軸の設定がよくわからないので応急措置として指ごとにそれぞれ座標系の原点が異なるモデルを作成する.

問題点
各指の命名第2指の構造

各指を親指側から順に第1指,第2指,第3指とよぶことにします.第2指について述べます.
第2指のIK chain(本モデルではmanip2とよぶ)はBase-(Left_dummy)-Left0-(Left1_hinge)-Left1-(Left2_hinge)-Left2-(Left3_hinge)-Left3で構成しています.
()内は節(リンク)をつなぐ関節(ジョイント)を表しています.

第2指のIKを考えるとき,解くべきIKの根本となる回転軸はLeft1_hingeです.(上図の青い軸)
しかし,試しにIKを解いてみるとIK chainの記述の関係からかBaseの原点を通る軸(上図の赤い軸)を根本としてIKを計算してしまっています.
時間を掛けたくないので各指のみのモデルを作りIKを解き,Baseの原点との間を平行移動することにします.

モデルの記述は大まかにはリンクの情報を<body>で,その形状を<geom>で記述していきます.
第2指,第3指の記述
第2指,第3指は同じ形状なのでこれらをfingerというモデルで記述します.
リンクの名前と位置関係を以下の図のようにします.
ここで<body>の要素名をFinger〜(先頭大文字),<geom>の要素名をfinger〜(先頭小文字)で命名しています.
<body>の原点をorg,<geom>の中心点をcogで記述しています.



まずはこの指をRobotとして記述します.
上図のようにリンクFinger0の原点をリンクFinger1との関節軸上とし,原点を基準にfinger0を配置します.

Finger0の記述

同様にリンクFinger1,Finger2を記述します.
リンクFinger3は3つのboxで描いています.一番Finger2に近いboxの中心をFinger3の原点としています.
そこから指先とそれを取り付けるプレートを記述します.

Finger3の記述(Finger3のみ抜粋)

そしてIKの範囲を<Manipulator>で記述します.
IKの終端を指先の中央にするために<Translation>を入れています.
ここではIKの終端を終端のリンクの原点,今回はFinger3の原点(上図のfinger3_link_cog)から指先の中央に平行移動しています.

Manipulatorの記述(Manipulatorのみ抜粋)



第2指,第3指の<robot>モデルはこちら,あとで作る手のひら部からの読み込みのための<kinbody>ファイルはこちらです.

第1指の記述
つぎに第1指,つまり親指にあたるthumbの記述です.
thumbもfingerと同様の手順で記述します.
というわけで各リンクとジョイントを記述し,Manipulatorを記述したものがこちらになります.
<kinbody>ファイルはこちらです.
Baseの記述
手の平にあたるBaseの記述です.
Baseはアングル材とプレートで構成されているためbox2つでアングル材を,もう1つのboxでプレートを描きます.

加えて各指を追加します.
他ファイルの<KinBody>を読み込むには以下のように記述します.
<KinBody file="thumb.kinbody.xml"></KinBody>
読み込む<KinBody>に設定を加えたい場合は更に<KinBody>タグで囲んで以下のように記述します.
   <KinBody>
     <KinBody file="thumb.kinbody.xml"></KinBody>
     <RotationAxis>1 0 0 0</RotationAxis>
     <translation>-0.018 -0.0707 0.017</translation>
     <!--<translation>-0.0055-0.0125 -0.0707 0.017</translation>-->
   </KinBody>

<KinBody>を記述した後に読み込んだ<KinBody>とBaseの接合のJointを記述します.
今回は<KinBody>とBaseが固定されているためにJointを動かない設定にします.
以下のようにenableオプションを"false"にすることでダミーのジョイントを設定することができます.
  <Joint name="Sum_dummy" type="hinge" enable="false">
    <Body>Base</Body>
    <Body>Sum0</Body>
    <limits>0 0</limits>
  </Joint>
なお,接合はリンク同士で行われます.
今回は自作のファイルを読み込んでいますが,他から持ってきたファイルを読み込む場合はそのリンク構造を把握しておく必要があります.

第2指と第3指のように同じファイルを複数回読み込む場合はprefixオプションを使うと区別することができます.
prefixオプションは以下のように記述します.
<KinBody prefix="l_" file="finger.kinbody.xml"></KinBody>
上の例のように記述すると読み込んだfinger.kinbodyのモデルの各リンク名の先頭にl_が加えられます.
例えばFinger0というリンクはl_Finger0というリンクとして扱われます.

最後にfinger.robot.xmlとthumb.robot.xmlからManipulatorを持ってきて完成です.

各指を読み込んだbaseのファイルがこちらです.

実行は各指以下のコマンドで実行します.
openrave.py --database inversekinematics --robot=base.xml --iktype=Direction3D --manipname=manip1
openrave.py --database inversekinematics --robot=base.xml --iktype=Translation3D --manipname=manip2
openrave.py --database inversekinematics --robot=base.xml --iktype=Translation3D --manipname=manip3

親指のmanip1に関しては自由度が足りないためTranslation3Dを解くことはできず,Direction3Dで解いています.



ikfast moduleを使う場合
python `openrave-config --python-dir`/openravepy/_openravepy_/ikfast.py --robot=righthand.zae --baselink=0 --eelink=5 --savefile=ik_manip1_t3d.cpp --iktype=translation3d
python `openrave-config --python-dir`/openravepy/_openravepy_/ikfast.py --robot=righthand.zae --baselink=0 --eelink=13 --savefile=ik_manip2_t3d.cpp --iktype=translation3d
python `openrave-config --python-dir`/openravepy/_openravepy_/ikfast.py --robot=righthand.zae --baselink=0 --eelink=9 --savefile=ik_manip3_t3d.cpp --iktype=translation3d

旧版

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます