最終更新: yan_balk17 2014年10月07日(火) 21:42:00履歴
作成中の多指ハンドの軸の設定がよくわからないので応急措置として指ごとにそれぞれ座標系の原点が異なるモデルを作成する.
各指を親指側から順に第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指の構造 |
各指を親指側から順に第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指は同じ形状なのでこれらをfingerというモデルで記述します.
リンクの名前と位置関係を以下の図のようにします.
ここで<body>の要素名をFinger〜(先頭大文字),<geom>の要素名をfinger〜(先頭小文字)で命名しています.
<body>の原点をorg,<geom>の中心点をcogで記述しています.
まずはこの指をRobotとして記述します.
上図のようにリンクFinger0の原点をリンクFinger1との関節軸上とし,原点を基準にfinger0を配置します.
同様にリンクFinger1,Finger2を記述します.
リンクFinger3は3つのboxで描いています.一番Finger2に近いboxの中心をFinger3の原点としています.
そこから指先とそれを取り付けるプレートを記述します.
そしてIKの範囲を<Manipulator>で記述します.
IKの終端を指先の中央にするために<Translation>を入れています.
ここではIKの終端を終端のリンクの原点,今回はFinger3の原点(上図のfinger3_link_cog)から指先の中央に平行移動しています.
第2指,第3指の<robot>モデルはこちら,あとで作る手のひら部からの読み込みのための<kinbody>ファイルはこちらです.
リンクの名前と位置関係を以下の図のようにします.
ここで<body>の要素名をFinger〜(先頭大文字),<geom>の要素名をfinger〜(先頭小文字)で命名しています.
<body>の原点をorg,<geom>の中心点をcogで記述しています.
まずはこの指をRobotとして記述します.
上図のようにリンクFinger0の原点をリンクFinger1との関節軸上とし,原点を基準にfinger0を配置します.
同様にリンクFinger1,Finger2を記述します.
リンクFinger3は3つのboxで描いています.一番Finger2に近いboxの中心をFinger3の原点としています.
そこから指先とそれを取り付けるプレートを記述します.
そしてIKの範囲を<Manipulator>で記述します.
IKの終端を指先の中央にするために<Translation>を入れています.
ここではIKの終端を終端のリンクの原点,今回はFinger3の原点(上図のfinger3_link_cog)から指先の中央に平行移動しています.
第2指,第3指の<robot>モデルはこちら,あとで作る手のひら部からの読み込みのための<kinbody>ファイルはこちらです.
手の平にあたるBaseの記述です.
Baseはアングル材とプレートで構成されているためbox2つでアングル材を,もう1つのboxでプレートを描きます.
加えて各指を追加します.
他ファイルの<KinBody>を読み込むには以下のように記述します.
<KinBody>を記述した後に読み込んだ<KinBody>とBaseの接合のJointを記述します.
今回は<KinBody>とBaseが固定されているためにJointを動かない設定にします.
以下のようにenableオプションを"false"にすることでダミーのジョイントを設定することができます.
今回は自作のファイルを読み込んでいますが,他から持ってきたファイルを読み込む場合はそのリンク構造を把握しておく必要があります.
第2指と第3指のように同じファイルを複数回読み込む場合はprefixオプションを使うと区別することができます.
prefixオプションは以下のように記述します.
例えばFinger0というリンクはl_Finger0というリンクとして扱われます.
最後にfinger.robot.xmlとthumb.robot.xmlからManipulatorを持ってきて完成です.
各指を読み込んだbaseのファイルがこちらです.
実行は各指以下のコマンドで実行します.
親指のmanip1に関しては自由度が足りないためTranslation3Dを解くことはできず,Direction3Dで解いています.
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で解いています.
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
コメントをかく