開発者向け情報


PHConstraintの整理・改良を行いました.

  • 作業用ブランチ:
    svn+ssh://springhead.info/home/svn/spr2/Springhead2/branches/JointRefactoring2011
  • 卒論・修論への影響が出なくなった頃(2月中旬?)にTrunkへのマージを予定しています.

APIの仕様変更

  • JointのLimitをAPIクラスとし,If / Desc / Stateを付けました.
    • これに伴い,Limitを使用するにはjointのCreateLimitを呼ぶ必要が生じます.
      /* PH1DJointIf* jo; */
      jo = phScene->CreateJoint(/* ・・・ */)
      PH1DJointLimitDesc descLimit;
      descLimit.range = Vec2d(Rad(-10), Rad(20));
      jo->CreateLimit(desc);
    • また,Limitのパラメータを変更するにはGetLimit()を用いることになります.
      jo->GetLimit()->SetRange(Vec2d(0, Rad(90)));
  • PHJoint1D*** → PH1DJoint*** に名称変更しました.
  • PHBallJointの円錐可動域とSpline曲線可動域が別クラスとなり,If/Desc/Stateも別となりました.
    • これにより,SplineLimitが実用可能となりました.
      /* PHBallJointIf* jo */
      PHBallJointSplineLimitDesc descLimit;
      limit = jo->CreateLimit(descLimit)
      limit->AddNode( Rad(90),   Rad(0), Rad(10), Rad(50), Rad(-85), Rad(0));
      ...
  • FWSceneにJointLimitを描画する機能が付きました.
    // JointLimitの描画を有効にする
    fwScene->EnableRenderLimit(true);
  • IKActuatorのSpring/Damperがなくなりました.
    • これはJointのリファクタリングとは直接関係ないのですが,同時期に行いました.

実装上の主要な変更

  • PHConstraintに,拘束軸を管理するAxisIndexクラス(axes)を導入しました.
    • SetupLCP()から呼ばれるSetupAxisIndex()においてaxes.Enable(i)により使用する軸を有効にし,
    • SetupLCP()の中で axes.CreateList() が呼ばれた時点でEnableされていた軸を並べたリストaxes[n]を作成
    • IterateLCP()の中ではaxes[n]に従って計算
  • (なお,SetupAxisIndexは従来のSetConstrainedIndexに相当する機能ですが,Set-だとSetter/Getterだと勘違いすること,軸管理クラスの名前をAxisIndexクラスとしたことから名前を変えました.)
  • Limit/Motor の f を,基本的にはPHConstraintのfに統合しました.
    • このため,Limit/MotorからSetupLCP/IterateLCPが撤廃されました.基本的にはSetupAxisIndex / CompBiasのみを持ちます.
    • BallJointLimitは独自の座標系を持つため,独自にfを持っています.そのためSetupLCP/IterateLCPも独自です.
  • Motorの機能をクラステンプレート一つにまとめました.
    • N自由度関節用モーター PHNDJointMotor<NDOF>
    • PHSpringについても実装はPHSpringMotor(PHNDJointMotor<6>を継承)に委譲する構造としました.

サンプル

  • Samples/Physics/Joints の Scene:0(Chain) と Scene:1(Link) と Scene:2(Arm)
  • Samples/EmbPython/PythonSpr (main.pyに記述されています)

未確認の機能

以下の機能は整理しましたが動作を確認していません.

  • PathJoint
  • 3要素モデル(機能自体はNDJointMotorに組み込まれています)
  • ContactSurface

既知の未実装(メモ)

  • MotorのsecondMoment
  • SplineLimitのlimitDir
  • ABA時のSliderJointのbConstraintRollX=false
    • movableAxesを変更すれば解決すると思われる
  • LimitのSaveStateがされてない可能性がある
    • PHConstraintEngineをいじる必要があるかも