[[開発者向け情報>devel]]

~

**拘束処理の流れ [#h22031e9]
***StepPart1 [#j060c879]
-ギア
-接触判定

***StepPart2 [#bae41515]
-UpdateCacheLCP(剛体のローカル系での加速度を計算?)
-UpdateState(ContactPointとJointについて)
--ヤコビアンを計算したり

-(関節の場合)PHBallJoint等のSetupLCP
--SetConstrainedIndex(どの軸を拘束するかの決定:軸IDを設定)
---numCondition(拘束する軸ID)とtargetAxis(拘束軸の数)を決める
--ModifyJacobian
---PathJointが使っているらしい

-PHBallJointLimitのSetupLCP
--joint.SetupLCP(関節を作るためのLCPの準備)
--limit.SetupLCP(可動域のためのLCPの準備)
---(PHBallJoint has_a PHBallJointLimit)
---PHBallJointLimit等のCompResponseMatrix
---PHBallJoint等別に定義がある

-1Dの場合
--fMaxDt = FLT_MAX, fMinDt = 0, 
--axisIndexは自由度をもっている軸ID
--1軸の関節は可動軸,拘束軸が同じになる
--A, dAなどはrangeSpring, rangeDamplerから計算される
--diffは拘束を違反している量(侵入量)
--joint1DのiterateLCPはconstraintのiterateLCPに統合できているので,呼ばない

-BallJointの場合
--まず,Joint作成時に可動域の指定SetConstLineをしておく
--SetConstLineについて
---ファイルをロードして,関節のスイング角が0の時のツイスト角の可動域を読む
---次に,スイング方位角に対してスイング角が並ぶ,スプラインの傾き,ツイスト角の範囲
---最初と最後はスイング方位角とスイング角が一致するように
---ロードした後,最初と最後のスイング方位角とスイング角が一致してなかったら,ポイントを一個増やして一致させる
---ここで拘束がかかっていると,発振してしまうので,この時点では拘束はかけない

--SetupLCP
---拘束は可動軸と同じ向きに設定できないので,constNumConditionとtargetaxisを変更しないといけない
--CheckLimit(関節が可動域に入ってるかどうか)
---剛体の姿勢をオイラー角に変換
---可動域制限にかかっているかの判定のところ
---SwingTwistでLimitするかSplineでLimitかで分岐

-SwingTwistの場合
--それぞれの軸に対して,最大,最小をチェックして,違反していたら,numConditionに軸IDを入れて拘束をかける

-Splineの場合
--前回のswing方位角と今回のを比較して,差分の小さい方へ回るようにしている
--可動域との交点を確認する
---Line[0] 前回から今回のswing方位角とswing角の差分ベクトル
---Line[0]とLine[1]は直線の傾きと切片
---媒介変数で定式化したスプラインと直線との交点をもとめる
---交点でのスプラインの法線をもとめ,拘束の向きをきめる
---侵入量は繰り返し計算でやっている(内積でやったほうがいいことになった)
--twist角の違反のチェック
---スプライン指定しているポイントに設定されているtwist角の可動域を取ってきて,ポイント間内で重みを計算し,可動域を求める

-motor.SetupLCP(バネダンパのためのLCPの準備)
-PHBallJointのIterateLCP
--joint.IterateLCP
--motor.IterateLCP
---limitより先に行う必要がある(でないとバネダンパによる運動が可動域を逸脱する)
が,現在は6x3のヤコビアンを用いることでjoint.IterateLCPの中でまとめて計算している(これが可能になるようjoint.SetupLCPもそのための準備をしている).
--limit.IterateLCP

-pointPool : 謎


-IterateLCP
--numCondition : 何番目の軸に拘束をかけるかのidが収まった配列
---変数名は直したほうがいい
---VMatrixで試したら遅かったのでintの固定長配列になっているが,vectorにはしてみてもいいかもしれない
--numConditionの要素ごとにfの更新式を走らせる.→fnewへ.
--fnewに対して
---摩擦の場合は静止摩擦・動摩擦を考慮したプロジェクション
---それ以外の場合は軸ごとにmax, minでクリッピング
(バネダンパや,関節可動域を実現するためのクリッピングがこれで実現される)~
-ヤコビアンの計算
--movableAxesは拘束されることもある。可動域、モータ、バネダンパ~


TO DO:
-constrを消す
-jointLimit1DのiterateLCPは消す
-motor全部についてiterateLCPは消す
-numCondition→constrainedAxes の型をvectorにする
-targetAxis→nConstrainedAxes いらなくなる
-axisIndex→movableAxes
-拘束がない場合にすぐにループを抜けるようにする
-treejointで対応しているか  要検討