追加拘束の設定

概要

Choreonoidのボディモデルにおいて、リンクは関節によって木構造として接続されます。一方で、閉リンク機構のように、木構造では表現できない接続をもつメカニズムも存在します。また、シミュレーションにおいて物体同士を連結したい場合もあります。

このような接続・連結を実現するための機能が「追加拘束(Extra Joint)」です。追加拘束は任意の2つのリンク間に追加する拘束で、これを設定しておくと、シミュレーション実行時にシミュレータアイテムがこれを読み込み、対応する拘束力が働くようになります。

拘束の種類

追加拘束では以下の種類の拘束を利用できます。

  • ball

2つのリンクに設定した拘束点の位置を一致させます。拘束点まわりの相対回転は自由に行える、球面関節に相当する拘束です。

  • hinge

2つのリンクに設定した拘束軸の軸線を一致させ、軸まわりの相対回転のみを許容します。回転関節に相当する拘束です。

  • piston

拘束軸に直交する方向の並進を拘束し、軸方向の相対並進と軸まわりの相対回転を許容します。円筒関節に相当する拘束です。

  • fixed

2つのリンクの相対位置・姿勢を完全に固定します。

モデルファイルでの記述

同一モデル内のリンク間の追加拘束は、Body形式のモデルファイルにおいて、トップレベルの extra_joints キーのリストとして記述します。以下は閉リンク機構のサンプルモデル(share/model/misc/ClosedLinkSample.body)における記述に対応する例です。

extra_joints:
  -
    link1_name: J1
    link2_name: J3
    joint_type: hinge
    axis: [ 0, 0, 1 ]
    translation_in_link1: [ 0.2, 0, 0 ]
    translation_in_link2: [ 0, 0.1, 0 ]

各項目では以下のキーを設定できます。

キー

意味

link1_name

拘束する一方のリンクの名前です。

link2_name

拘束する他方のリンクの名前です。

joint_type

拘束の種類を「ball」「hinge」「piston」「fixed」から指定します。

axis

拘束軸です。joint_typeがhingeまたはpistonのときに使用します。

translation_in_link1 / translation_in_link2

各リンクのローカル座標における拘束点の位置です。

rotation_in_link1 / rotation_in_link2

各リンクのローカル座標における拘束フレームの姿勢です。軸・角度形式([x, y, z, θ])で指定します(省略可)。

モデルファイルの記述の詳細については ExtraJointノード も参照してください。

シミュレータアイテムごとの対応状況

追加拘束は多くのシミュレータアイテムで利用できますが、対応する拘束の種類はシミュレータアイテムによって異なります。対応状況は以下のとおりです。

拘束タイプ

AIST

PhysX

MuJoCo

Bullet

ODE

AGX

ball

hinge

piston

×

fixed

×

異なるボディ間の拘束

×

対応していない拘束タイプが設定されていた場合、その拘束は無視されます。

異なるボディ間の拘束

追加拘束は、異なるボディモデルのリンク間に設定することもできます(上表の対応シミュレータのみ)。これにより、例えばロボットのリンクと環境中の物体を連結するといったことが可能となります。

モデルファイルの extra_joints で記述できるのは同一モデル内のリンク間の拘束のみであるため、異なるボディ間の拘束は、PythonスクリプトやC++のプログラムからExtraJointオブジェクトを生成し、対象のボディに登録することで設定します。具体的な方法は後述のExtraJointSampleを参考にしてください。

サンプル

追加拘束を利用したサンプルとして以下のプロジェクトが用意されています。いずれのサンプルにも各物理エンジンのシミュレータアイテムが含まれており、エンジンごとの挙動を比較することもできます。

ClosedLinkSample

sample/general/ClosedLinkSample.cnoid は、閉リンク機構のサンプルです。モデルファイル(share/model/misc/ClosedLinkSample.body)のトップレベルに extra_joints を記述して、hingeタイプの拘束によりリンク機構のループを閉じています。モデルファイルでの追加拘束の記述例として参考になります。

ExtraJointSample

sample/general/ExtraJointSample.cnoid は、異なるボディ間の追加拘束のサンプルです。プロジェクトに含まれるPythonスクリプト(ExtraJoint.py)により、SR1ロボットの手首リンクとボックスモデルのリンクの間にballタイプの拘束を動的に設定しており、ロボットがボックスを吊り下げた状態でシミュレーションが行われます。スクリプトやプログラムから追加拘束を設定する方法の例として参考になります。

このほか、Choreonoid付属の実際のロボットモデルにおいて追加拘束を使用している例として、以下のモデルがあります。いずれもモデルファイル内の記述例として参考になります。

  • Robotiq 2F-85グリッパ (share/model/Robotiq/2F-85.body)

平行リンク機構で構成されるグリッパのフィンガー部について、リンク機構の閉ループをhingeタイプの追加拘束で実現しています。

  • 双腕建機ロボット DoubleArmV7 (share/model/DoubleArmV7/。DoubleArmV7A.body等から読み込まれるDoubleArmV7-Upper.bodyに記述)

グリッパ部のリンク機構の閉ループをballタイプの追加拘束で実現しています。 World Robot Summit 2018 のサンプルで使用されているモデルです。

  • 四輪車モデル FourWheelCar (share/model/misc/FourWheelCar.body)

ステアリング機構の閉リンクをhingeタイプの追加拘束で実現しています。