開発者向け情報
PHConstraintの整理・改良を行いました.
- 卒論・修論への影響が出なくなった頃(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));
...
- 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をいじる必要があるかも