Manual

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 81

軌道最適化による動作生成
リファレンスマニュアル
平成 31 211
室岡雅樹
murooka@jsk.t.u-tokyo.ac.jp
目 次
1軌道最適化による動作生成の基礎 1
1.1 タスク関数のノルムを最小にするコンフィギュレーションの探索 ................. 1
1.2 コンフィギュレーション二次形式の正則化項の追加 ........................ 2
1.3 コンフィギュレーション更新量の正則項の追加 ........................... 3
1.4 ソースコードと数式の対応 ...................................... 3
1.5 章の構成 ................................................ 4
2コンフィギュレーションとタスク関数 4
2.1 瞬時コンフィギュレーションと瞬時タスク関数 ........................... 4
2.2 軌道コンフィギュレーションと軌道タスク関数 ........................... 21
3勾配を用いた制約付き非線形最適化 28
3.1 逐次二次計画法 ............................................ 28
3.2 複数解候補を用いた逐次二次計画法 ................................. 30
3.2.1 複数解候補を用いた逐次二次計画法の理論 ......................... 30
3.2.2 複数解候補を用いた逐次二次計画法の実装 ......................... 34
4動作生成の拡張 35
4.1 マニピュレーションの動作生成 ................................... 35
4.2 B スプラインを用いた関節軌道生成 ................................. 46
4.2.1 B スプラインを用いた関節軌道生成の理論 ......................... 46
4.2.2 B スプラインを用いた関節軌道生成の実装 ......................... 55
5補足 67
5.1 既存のロボット基礎クラスの拡張 .................................. 67
5.2 環境と接触するロボットの関節・リンク構造 ............................ 70
5.3 irteus inverse-kinematics 互換関数 ................................ 72
i
ii
5.4 関節トルク勾配の計算 ........................................ 76
1
1軌道最適化による動作生成の基礎
1.1 タスク関数のノルムを最小にするコンフィギュレーションの探索
qRnqを設計対象のコンフィギュレーションとする.例えば一般の逆運動学計算では,qはある瞬間のロ
ボットの関節角度を表すベクトルで,コンフィギュレーションの次元 nqはロボットの関節自由度数となる.
動作生成問題を,所望のタスクに対応するタスク関数 e(q) : RnqRneについて,次式を満たす qを得る
こととして定義する.
e(q) = 0(1.1)
例えば一般の逆運動学計算では,e(q)はエンドエフェクタの目標位置姿勢と現在位置姿勢の差を表す 6次元
ベクトルである.非線形方程式 (1.1) の解を解析的に得ることは難しく,反復計算による数値解法が採られる.
(1.1) が解をもたないときでも最善のコンフィギュレーションを得られるように一般化すると,式 (1.1)
求解は次の最適化問題として表される 1
min
qF(q) (1.2a)
where F(q)def
=1
2e(q)2(1.2b)
コンフィギュレーションが最小値 qmin 最大値 qmax 間に含まれる必要があるとき,逆運動学計算は次の制
約付き非線形最適化問題として表される.
min
qF(q) s.t.qmin qqmax (1.3)
計算qmin ,qmax の最(1.3)
制約を,より一般の形式である線形等式制約,線形不等式制約として次式のように表す 2
min
qF(q) (1.4a)
s.t.Aq =¯
b(1.4b)
Cq ¯
d(1.4c)
制約付き非線形最適化問題の解法のひとつである逐次二次計画法では,次の二次計画問題の最適解として得
られる q
kを用いて,qk+1 =qk+ ∆q
kとして反復更新することで,式 (1.4) の最適解を導出する 3
min
qk
F(qk) + F(qk)Tqk+1
2qT
k2F(qk)∆qk(1.5a)
s.t.Aqk=¯
bAqk(1.5b)
Cqk¯
dCqk(1.5c)
1任意の半正定値行列 Wに対して,e(q)2
W=e(q)TW e(q) = e(q)TSTSe(q) = Se(q)2を満たす Sが必ず存在するので,
(1.2b) は任意の重み付きノルムを表現可能である.
2(1.3) における関節角度の最小値,最大値に関する制約は次式のように表される.
qmin qqmax
(I
I)q(qmin
qmax )
3(1.5a) F(q)qkの周りでテーラー展開し三次以下の項を省略したものに一致する.逐次二次計画法については,以下の書籍
18 章で詳しく説明されている.
Numerical optimization, S. Wright and J. Nocedal, Springer Science, vol. 35, 1999, http://www.xn--vjq503akpco3w.top/
literature/Nocedal_Wright_Numerical_optimization_v2.pdf.
2
F(qk),2F(qk)はそれぞれ,F(qk)の勾配,ヘッセ行列 4で,次式で表される.
F(q) = e(q)
qT
e(q) (1.6a)
=J(q)Te(q) (1.6b)
2F(q) =
m
i=1
ei(q)2ei(q) + e(q)
qTe(q)
q(1.6c)
e(q)
qTe(q)
q(1.6d)
=J(q)TJ(q) (1.6e)
ただし,ei(q) (i= 1,2,··· , m)e(q)i番目の要素である.(1.6c) から式 (1.6d) への変形では e(q)
二階微分がゼロであると近似している.J(q)def
=e(q)
qRne×nqe(q)のヤコビ行列である.
(1.6a) , (1.6d) から式 (1.5a) の目的関数は次式で表される 5
1
2eT
kek+eT
kJkqk+1
2qT
kJT
kJkqk(1.7a)
=1
2ek+Jkqk2(1.7b)
ただし,ek
def
=e(qk),Jk
def
=J(qk)とした.
結局,逐次二次計画法で反復的に解かれる二次計画問題 (1.5) は次式で表される.
min
qk
1
2qT
kJT
kJkqk+eT
kJkqk(1.8a)
s.t.Aqk=b(1.8b)
Cqkd(1.8c)
ここで,
b=¯
bAqk(1.9)
d=¯
dCqk(1.10)
とおいた.
1.2 コンフィギュレーション二次形式の正則化項の追加
(1.2a) の最適化問題の目的関数を,次式の ˆ
F(q)で置き換える.
ˆ
F(q) = F(q) + Freg (q) (1.11)
where Freg (q) = 1
2qT¯
Wreg q(1.12)
目的関数 ˆ
F(q)の勾配,ヘッセ行列は次式で表される.
ˆ
F(q) = F(q) + Freg (q) (1.13a)
=J(q)Te(q) + ¯
Wreg q(1.13b)
2ˆ
F(q) = 2F(q) + 2Freg (q) (1.13c)
J(q)TJ(q) + ¯
Wreg (1.13d)
4(1.5a) 2F(qk)の部分は一般にはラグランジュ関数の qkに関するヘッセ行列であるが,等式・不等式制約が線形の場合は
F(qk)のヘッセ行列と等価になる.
5(1.7b) は,以下の論文で紹介されている二次計画法によってコンフィギュレーション速度を導出する逆運動学解法における目的
数と一致する.
Feasible pattern generation method for humanoid robots, F. Kanehiro et al., Proceedings of the 2009 IEEE-RAS International
Conference on Humanoid Robots, pp. 542-548, 2009.
3
したがって,式 (1.8) の二次計画問題は次式で表される.
min
qk
1
2qT
kJT
kJk+¯
Wreg qk+JT
kek+¯
Wreg qkT
qk(1.14a)
s.t.Aqk=b(1.14b)
Cqkd(1.14c)
1.3 コンフィギュレーション更新量の正則項の追加
Gauss-Newton 法と Levenberg-Marquardt 法の比較を参考に(1.14a) の二次形式項の行列に,次式のよ
うに微小な係数をかけた単位行列を加えると,一部の適用例について逐次二次計画法の収束性が改善された 6
min
qk
1
2qT
kJT
kJk+¯
Wreg +λIqk+JT
kek+¯
Wreg qkT
qk(1.15a)
s.t.Aqk=b(1.15b)
Cqkd(1.15c)
改良誤差減衰最小二乗法 7を参考にすると,λは次式のように決定される.
λ=λrF(qk) + wr(1.16)
λrwrは正の定数である.
1.4 ソースコードと数式の対応
Wreg
def
=¯
Wreg +λI(1.17a)
vreg
def
=¯
Wreg qk(1.17b)
とすると,式 (1.15) は次式で表される.
min
qk
1
2qT
kJT
kJk+Wqk+JT
kek+vreg T
qk(1.18a)
s.t.Aqk=b(1.18b)
Cqkd(1.18c)
2節や第 4章で説明する***-configuration-task ラスのメソッドは式 (1.18) 中の記号と以下のように対
応している.
:config-vector get q
:set-config set q
:task-value get e(q)
:task-jacobian get J(q)def
=e(q)
q
:config-equality-constraint-matrix get A
:config-equality-constraint-vector get b
:config-inequality-constraint-matrix get C
:config-inequality-constraint-vector get d
:regular-matrix get Wreg
:regular-vector get vreg
6これは,最適化における信頼領域 (trust region) に関連している.
7Levenberg-Marquardt 法による可解性を問わない逆運動学,杉原 知道,日本ロボット学会誌, vol. 29, no. 3, pp. 269-277, 2011.
4
1.5 章の構成
2章では,コンフィギュレーション qの取得・更新,タスク関数 e(q)の取得,タスク関数のヤコビ行列
J(q)def
=e(q)
qの取得,コンフィギュレーションの等式・不等式制約 A,b,C,dの取得のためのクラスを説明
する.第 2.1 節ではコンフィギュレーション qが瞬時の情報,第 2.2 節ではコンフィギュレーション qが時系
列の情報を表す場合をそれぞれ説明する.
3章では,第 2章で説明されるクラスを用いて逐次二次計画法により最適化を行うためのクラスを説明
する.
4章では,用途に応じて拡張されたコンフィギュレーションとタスク関数のクラスを説明する.第 4.1
では,マニピュレーションのために,ロボットに加えて物体のコンフィギュレーションを計画する場合を説明
する.4.2 節では,ロボットの関節位置の軌道を Bスプライン関数でパラメトリックに表現する場合を説明
する.いずれにおいても,最適化では第 3章で説明された逐次二次計画法のクラスが利用される.
5章では,その他の補足事項を説明する.第 5.1 節では,jskeus で定義されているクラスの拡張について
説明する.第 5.2 節では,環境との接触を有するロボットの問題設定を記述するためのクラスについて説明す
る.第 5.4 節では,関節トルクを関節角度で微分したヤコビ行列を導出するための関数について説明する.
2コンフィギュレーションとタスク関数
2.1 瞬時コンフィギュレーションと瞬時タスク関数
instant-configuration-task [class]
:super propertied-object
:slots ( robot-env robot-environment instance)
( theta-vector θ[rad] [m])
( wrench-vector ˆw[N] [Nm])
( torque-vector τ[Nm])
( phi-vector ϕ[rad] [m])
( num-kin Nkin := |T kin-trg |=|T kin-att |)
( num-contact Ncnt := |T cnt-trg |=|T cnt-att |)
( num-variant-joint Nvar-joint := |Jvar |)
( num-invariant-joint Ninvar -joint := |Jinvar |)
( num-drive-joint Ndrive-joint := |Jdrive |)
( num-posture-joint Nposture-joint := |Jposture |)
( num-external Nex := number of external wrenches)
( num-collision Ncol := number of collision check pairs)
( dim-theta dim(θ) = Nvar-joint )
( dim-wrench dim(ˆw) = 6Ncnt )
( dim-torque dim(τ) = Ndrive-joint )
( dim-phi dim(ϕ) = Ninvar -joint )
( dim-variant-config dim(qvar ))
( dim-invariant-config dim(qinvar ))
( dim-config dim(q))
( dim-task dim(e))
( kin-scale-mat-list Kkin )
( target-posture-scale kposture )
5
( norm-regular-scale-max kmax )
( norm-regular-scale-offset koff )
( torque-regular-scale ktrq )
( variant-joint-list Jvar )
( invariant-joint-list Jinvar )
( drive-joint-list Jdrive )
( kin-target-coords-list Tkin-trg )
( kin-attention-coords-list Tkin-att )
( contact-target-coords-list Tcnt-trg )
( contact-attention-coords-list Tcnt -att )
( variant-joint-angle-margin margin of θ[deg] [mm])
( invariant-joint-angle-margin margin of ϕ[deg] [mm])
( delta-linear-joint trust region of linear joint configuration [mm])
( delta-rotational-joint trust region of rotational joint configuration [deg])
( contact-constraint-list list of contact-constraint instance)
( posture-joint-list Jposture )
( posture-joint-angle-list ¯
θtrg )
( external-wrench-list {wex
1,wex
2,· · · ,wex
Nex })
( external-coords-list {Tex
1, T ex
2,· · · , T ex
Nex })
( collision-pair-list list of bodyset-link or body pair)
( collision-distance-margin-list list of collision distance margin)
( only-kinematics? whether to consider only kinematics or not)
( variant-task-jacobi buffer for e
qvar )
( invariant-task-jacobi buffer for e
qinvar )
( task-jacobi buffer for e
q)
( collision-theta-inequality-constraint-matrix buffer for Ccol )
( collision-phi-inequality-constraint-matrix buffer for Ccol )
( collision-inequality-constraint-vector buffer for Ccol )
瞬時コンフィギュレーション q(l)と瞬時タスク関数 e(l)(q(l))のクラス.
このクラスの説明で用いる全ての変数は,時間ステップ lを表す添字をつけて x(l)と表されるべきだが,
のクラスの説明で省略して x表すた,降では,文やメソド名で,“instant”
を省略する.
コンフィギュレーショqの取得更新,タスク関e(q)の取得,タスク関数のヤコビ行列 e(q)
qの取
得,コンフィギュレーションの等式・不等式制約 A,b,C,dの取得のためのメソッドが定義されている.
コンフィギュレーション・タスク関数を定めるために,初期化時に以下を与える
ロボット・環境
robot-environment ロボット・環境を表す robot-environment クラスのインスタンス
variant-joint-list Jvar 時変関節
invariant-joint-list Jinvar 時不変関節 (与えなければ時不変関節は考慮されない)
drive-joint-list Jdrive 駆動関節 (与えなければ関節駆動トルクは考慮されない)
幾何拘束
kin-target-coords-list Tkin-trg 幾何到達目標位置姿勢リスト
6
kin-attention-coords-list Tkin-att 幾何到達着目位置姿勢リスト
kin-scale-mat-list Kkin 幾何拘束の座標系,重みを表す変換行列のリスト
接触拘束
contact-target-coords-list Tcnt-trg 接触目標位置姿勢リスト
contact-attention-coords-list Tcnt-att 接触着目位置姿勢リスト
contact-constraint-list 接触レンチ制約リスト
コンフィギュレーション拘束 (必要な場合のみ)
posture-joint-list Jposture 着目関節リスト
posture-joint-angle-list ¯
θtrg 着目関節の目標関節角
target-posture-scale kposture コンフィギュレーション拘束の重み
干渉回避拘束 (必要な場合のみ)
collision-pair-list 干渉回避する bodyset-link もしくは body のペアのリスト
collision-distance-margin 干渉回避の距離マージン (全てのペアで同じ値の場合)
collision-distance-margin-list 干渉回避の距離マージンのリスト (ペアごとに異なる値の場合)
外レンチ (必要な場合のみ)
external-wrench-list 外レンチのリスト (ワールド座標系で表す)
external-coords-list 外レンチの作用点座標のリスト (位置のみを使用)
目的関数の重み
norm-regular-scale-max kmax コンフィギュレーション更新量正則化の重み最大値
norm-regular-scale-offset koff コンフィギュレーション更新量正則化の重みオフセット
torque-regular-scale ktrq トルク正則化の重み
コンフィギュレーション qは以下から構成される.
q:= θTˆwTτTϕTT
(2.1)
θRNvar-joint 時変関節角度 [rad] [m]
ˆwR6Ncnt 接触レンチ [N] [Nm]
τRNdrive-joint 関節駆動トルク [Nm] [N]
ϕRNinvar-joint 時不変関節角度 [rad] [m]
ˆwは次式のように,全接触部位でのワールド座標系での力・モーメントを並べたベクトルである.
ˆw=wT
1wT
2· · · wT
Ncnt T
(2.2)
=fT
1nT
1fT
2nT
2· · · fT
Ncnt nT
Ncnt T
(2.3)
タスク関数 e(q)は以下から構成される.
e(q) := ekinT(q)eeom-transT(q)eeom-rotT(q)etrqT(q)epostureT(q)T
(2.4)
ekin (q)R6Nkin 幾何到達拘束 [rad] [m]
eeom -trans (q)R3力の釣り合い [N]
eeom -rot (q)R3モーメントの釣り合い [Nm]
etrq (q)RNdrive -joint 関節トルクの釣り合い [rad] [m]
7
eposture (q)RNposture-joint 関節角目標 [rad] [m]
:init &key (name) [method]
(robot-env)
(variant-joint-list (send robot-env :variant-joint-list))
(invariant-joint-list (send robot-env :invariant-joint-list))
(drive-joint-list (send robot-env :drive-joint-list))
(only-kinematics?)
(kin-target-coords-list)
(kin-attention-coords-list)
(contact-target-coords-list)
(contact-attention-coords-list)
(variant-joint-angle-margin 3.0)
(invariant-joint-angle-margin 3.0)
(delta-linear-joint)
(delta-rotational-joint)
(contact-constraint-list (send-all contact-attention-coords-list :get :contact-constraint))
(posture-joint-list)
(posture-joint-angle-list)
(external-wrench-list)
(external-coords-list)
(collision-pair-list)
(collision-distance-margin 0.01)
(collision-distance-margin-list)
(kin-scale 1.0)
(kin-scale-list)
(kin-scale-mat-list)
(target-posture-scale 0.001)
(norm-regular-scale-max (if only-kinematics? 0.001 1.000000e-05))
(norm-regular-scale-offset 1.000000e-07)
(torque-regular-scale 1.000000e-04)
&allow-other-keys
Initialize instance
:robot-env [method]
return robot-environment instance
:variant-joint-list [method]
return Jvar
:invariant-joint-list [method]
return Jinvar
:drive-joint-list [method]
return Jdrive
:only-kinematics? [method]
return whether to consider only kinematics or not
8
:theta [method]
return θ
:wrench [method]
return ˆw
:torque [method]
return τ
:phi [method]
return ϕ
:num-kin [method]
return Nkin := |T kin-trg |=|T kin-att |
:num-contact [method]
return Ncnt := |T cnt-trg |=|T cnt -att |
:num-variant-joint [method]
return Nvar-joint := |Jvar |
:num-invariant-joint [method]
return Ninvar-joint := |Jinvar |
:num-drive-joint [method]
return Ndrive-joint := |Jdrive |
:num-posture-joint [method]
return Ntarget -joint := |Jtarget |
:num-external [method]
return Nex := number of external wrench
:num-collision [method]
return Ncol := number of collision check pairs
:dim-variant-config [method]
dim(qvar ) := dim(θ) + dim(ˆw) + dim(τ) (2.5)
=Nvar-joint + 6Ncnt +Ndrive-joint (2.6)
return dim(qvar )
:dim-invariant-config [method]
return dim(qinvar ) := dim(ϕ) = Ninvar -joint
:dim-config [method]
return dim(q) := dim(qvar ) + dim(qinvar )
:dim-task [method]
dim(e) := dim(ekin ) + dim(eeom-trans ) + dim(eeom-rot ) + dim(etrq ) + dim(eposture ) (2.7)
= 6Nkin + 3 + 3 + Ndrive-joint +Nposture-joint (2.8)
9
return dim(e)
:variant-config-vector [method]
return qvar :=
θ
ˆw
τ
:invariant-config-vector [method]
return qinvar := ϕ
:config-vector [method]
return q:= qvar
qinvar =
θ
ˆw
τ
ϕ
:set-theta theta-new &key (relative? nil) [method]
(apply-to-robot? t)
Set θ.
:set-wrench wrench-new &key (relative? nil) [method]
Set ˆw.
:set-torque torque-new &key (relative? nil) [method]
Set τ.
:set-phi phi-new &key (relative? nil) [method]
(apply-to-robot? t)
Set ϕ.
:set-variant-config variant-config-new &key (relative? nil) [method]
(apply-to-robot? t)
Set qvar .
:set-invariant-config invariant-config-new &key (relative? nil) [method]
(apply-to-robot? t)
Set qinvar .
:set-config config-new &key (relative? nil) [method]
(apply-to-robot? t)
Set q.
:kin-target-coords-list [method]
Tkin-trg
m={pkin-trg
m,Rkin-trg
m}(m= 1,2,··· , Nkin ) (2.9)
return Tkin-trg := {Tkin-trg
1, T kin-trg
2,· · · , T kin-trg
Nkin }
:kin-attention-coords-list [method]
Tkin-att
m={pkin-att
m,Rkin-att
m}(m= 1,2,··· , Nkin ) (2.10)
10
return Tkin-att := {Tkin-att
1, T kin-att
2,· · · , T kin -att
Nkin }
:contact-target-coords-list [method]
Tcnt-trg
m={pcnt-trg
m,Rcnt-trg
m}(m= 1,2,· · · , Ncnt ) (2.11)
return Tcnt-trg := {Tcnt -trg
1, T cnt-trg
2,··· , T cnt-trg
Ncnt }
:contact-attention-coords-list [method]
Tcnt-att
m={pcnt-att
m,Rcnt-att
m}(m= 1,2,· · · , Ncnt ) (2.12)
return Tcnt-att := {Tcnt-att
1, T cnt-att
2,··· , T cnt-att
Ncnt }
:contact-constraint-list [method]
return list of contact-constraint instance
:wrench-list [method]
return {w1,w2,· · · ,wNcnt }
:force-list [method]
return {f1,f2,· · · ,fNcnt }
:moment-list [method]
return {n1,n2,· · · ,nNcnt }
:external-wrench-list [method]
return {wex
1,wex
2,··· ,wex
Nex }
:external-force-list [method]
return {fex
1,fex
2,· · · ,fex
Nex }
:external-moment-list [method]
return {nex
1,nex
2,· · · ,nex
Nex }
:mg-vec [method]
return mg
:cog &key (update? t) [method]
return pG(q)
:kinematics-task-value &key (update? t) [method]
ekin (q) = ekin (θ,ϕ) (2.13)
=
ekin
1(θ,ϕ)
ekin
2(θ,ϕ)
.
.
.
ekin
Nkin (θ,ϕ)
(2.14)
ekin
m(θ,ϕ) = Kkin pkin-trg
m(θ,ϕ)pkin-att
m(θ,ϕ)
aRkin-trg
m(θ,ϕ)Rkin-att
m(θ,ϕ)TR6(m= 1,2,· · · , Nkin ) (2.15)
11
a(R)は姿勢行列 Rの等価角軸ベクトルを表す
return ekin (q)R6Nkin
:eom-trans-task-value &key (update? t) [method]
eeom -trans (q) = eeom-trans (ˆw) (2.16)
=
Ncnt
m=1
fmmg+
Nex
m=1
fex
m(2.17)
return eeom -trans (q)R3
:eom-rot-task-value &key (update? t) [method]
eeom -rot (q) = eeom-rot (θ,ˆw,ϕ) (2.18)
=
Ncnt
m=1 pcnt-trg
m(θ,ϕ)pG(θ,ϕ)×fm+nm
+
Nex
m=1
{(pex
m(θ,ϕ)pG(θ,ϕ)) ×fex
m+nex
m}(2.19)
return eeom -rot (q)R3
:torque-task-value &key (update? t) [method]
etrq (q) = etrq (θ,ˆw,τ,ϕ) (2.20)
=τ+
Ncnt
m=1
τcnt
m(θ,ϕ)τgrav (θ,ϕ) +
Nex
m=1
τex
m(θ,ϕ) (2.21)
=τ+
Ncnt
m=1
Jcnt-att
drive-joint ,m(θ,ϕ)Twmτgrav (θ,ϕ) +
Nex
m=1
Jex
drive-joint ,m(θ,ϕ)Twex
m(2.22)
τcnt
m(θ,ϕ)m番目の接触部位にかかる接触レンチ wmによる関節トルτgrav
m(θ,ϕ)は自重による関
節トルクを表す
return etrq (q)RNdrive -joint
:posture-task-value &key (update? t) [method]
eposture (q) = eposture (θ) (2.23)
=kposture ¯
θtrg ¯
θ(2.24)
¯
θtrg ,¯
θは着目関節リスト Jposture の目標関節角と現在の関節角.
return eposture (q)RNposture-joint
:task-value &key (update? t) [method]
return e(q) :=
ekin (q)
eeom -trans (q)
eeom -rot (q)
etrq (q)
eposture (q)
=
ekin (θ,ϕ)
eeom -trans (ˆw)
eeom -rot (θ,ˆw,ϕ)
etrq (θ,ˆw,τ,ϕ)
eposture (θ)
12
:kinematics-task-jacobian-with-theta [method]
ekin
θ=
ekin
1
θ
ekin
2
θ
.
.
.
ekin
Nkin
θ
(2.25)
ekin
m
θ=Kkin Jkin-trg
θ,m (θ,ϕ)Jkin -att
θ,m (θ,ϕ)(m= 1,2,· · · , Nkin ) (2.26)
return ekin
θR6Nkin ×Nvar-joint
:kinematics-task-jacobian-with-phi [method]
ekin
ϕ=
ekin
1
ϕ
ekin
2
ϕ
.
.
.
ekin
Nkin
ϕ
(2.27)
ekin
m
ϕ=Kkin Jkin-trg
ϕ,m (θ,ϕ)Jkin-att
ϕ,m (θ,ϕ)(m= 1,2,· · · , Nkin ) (2.28)
return ekin
ϕR6Nkin ×Ninvar-joint
:eom-trans-task-jacobian-with-wrench [method]
eeom -trans
ˆw=eeom-trans
f1
eeom-trans
n1· · · eeom-trans
fNcnt
eeom-trans
nNcnt (2.29)
=I3O3· · · I3O3(2.30)
return eeom-trans
ˆwR3×6Ncnt
:eom-rot-task-jacobian-with-theta [method]
eeom -rot
θ=
Ncnt
m=1 [fm×]Jcnt-trg
θ,m (θ,ϕ)J (θ,ϕ)
+
Nex
m=1 [fex
m×]Jex
θ,m(θ,ϕ)J(θ,ϕ) (2.31)
=Ncnt
m=1
fm+
Nex
m=1
fex
m×J(θ,ϕ)
Ncnt
m=1
[fm×]Jcnt-trg
θ,m (θ,ϕ)
Nex
m=1
[fex
m×]Jex
θ,m(θ,ϕ) (2.32)
Ncnt
m=1 fm+Nex
m=1 fex
m=mgつまりeom-trans-task が成立すると仮定すると次式が成り立つ.
eeom -rot
θ= [mg×]J(θ,ϕ)
Ncnt
m=1
[fm×]Jcnt-trg
θ,m (θ,ϕ)
Nex
m=1
[fex
m×]Jex
θ,m(θ,ϕ) (2.33)
13
return eeom-rot
θR3×Nvar-joint
:eom-rot-task-jacobian-with-wrench [method]
eeom -rot
ˆw=eeom-rot
f1
eeom-rot
n1··· eeom-rot
fNcnt
eeom-rot
nNcnt (2.34)
eeom -rot
fm
=pcnt-trg
m(θ,ϕ)pG(θ,ϕ)×(m= 1,2,· · · , Ncnt ) (2.35)
eeom -rot
nm
=I3(m= 1,2,· · · , Ncnt ) (2.36)
return eeom-rot
ˆwR3×6Ncnt
:eom-rot-task-jacobian-with-phi [method]
eeom -rot
ϕ=
Ncnt
m=1 [fm×]Jcnt-trg
ϕ,m (θ,ϕ)J(θ,ϕ)
+
Nex
m=1 [fex
m×]Jex
ϕ,m(θ,ϕ)J(θ,ϕ) (2.37)
=Ncnt
m=1
fm+
Nex
m=1
fex
m×J(θ,ϕ)
Ncnt
m=1
[fm×]Jcnt-trg
ϕ,m (θ,ϕ)
Nex
m=1
[fex
m×]Jex
ϕ,m(θ,ϕ) (2.38)
Ncnt
m=1 fm+Nex
m=1 fex
m=mgつまりeom-trans-task が成立すると仮定すると次式が成り立つ.
eeom -rot
ϕ= [mg×]J(θ,ϕ)
Ncnt
m=1
[fm×]Jcnt-trg
ϕ,m (θ,ϕ)
Nex
m=1
[fex
m×]Jex
ϕ,m(θ,ϕ) (2.39)
return eeom-rot
ϕR3×Ninvar-joint
:torque-task-jacobian-with-theta [method]
etrq
θ=
Ncnt
m=1
τcnt
m
θτgrav
θ+
Nex
m=1
τex
m
θ(2.40)
return etrq
θRNdrive-joint ×Nvar -joint
:torque-task-jacobian-with-wrench [method]
etrq
ˆw=etrq
w1
etrq
w2· · · etrq
wNcnt (2.41)
etrq
wm
=Jcnt-att
drive-joint ,m(θ,ϕ)T(m= 1,2,· · · , Ncnt ) (2.42)
return etrq
ˆwRNdrive-joint ×6Ncnt
:torque-task-jacobian-with-phi [method]
14
etrq
ϕ=
Ncnt
m=1
τcnt
m
ϕτgrav
m
ϕ+
Nex
m=1
τex
m
ϕ(2.43)
return etrq
ϕRNdrive-joint ×Ninvar -joint
:torque-task-jacobian-with-torque [method]
etrq
τ=INdrive-joint (2.44)
return etrq
τRNdrive-joint ×Ndrive-joint
:posture-task-jacobian-with-theta &key (update? nil) [method]
eposture
θi,j
=kposture (Jposture,i=Jvar ,j)
0 otherwise (2.45)
return eposture
θRNposture-joint ×Nvar -joint
:variant-task-jacobian [method]
e
qvar
=
Nvar-joint 6Ncnt Ndrive-joint
6Nkin ekin
θ
3eeom-trans
ˆw
3eeom-rot
θ
eeom-rot
ˆw
Ndrive-joint etrq
θ
etrq
ˆw
etrq
τ
Nposture-joint eposture
θ
(2.46)
return e
qvar R(6Nkin +3+3+Ndrive-joint +Nposture-joint )×(Nvar -joint +6Ncnt +Ndrive-joint )
:invariant-task-jacobian [method]
e
qinvar
=
Ninvar-joint
6Nkin ekin
ϕ
3
3eeom-rot
ϕ
Ndrive-joint etrq
ϕ
Nposture-joint
(2.47)
return e
qinvar R(6Nkin +3+3+Ndrive-joint +Nposture-joint )×Ninvar -joint
:task-jacobian [method]
15
e
q=e
qvar
e
qinvar (2.48)
=
Nvar-joint 6Ncnt Ndrive-joint Ninvar -joint
6Nkin ekin
θ
ekin
ϕ
3eeom-trans
ˆw
3eeom-rot
θ
eeom-rot
ˆw
eeom-rot
ϕ
Ndrive-joint etrq
θ
etrq
ˆw
etrq
τetrq
ϕ
Nposture-joint eposture
θ
(2.49)
return e
qR(6Nkin +3+3+Ndrive-joint +Nposture-joint )×(Nvar -joint +6Ncnt +Ndrive-joint +Ninvar-joint )
:theta-max-vector &key (update? nil) [method]
return θmax RNvar-joint
:theta-min-vector &key (update? nil) [method]
return θmin RNvar-joint
:delta-theta-limit-vector &key (update? nil) [method]
get trust region of θ
return ∆θlimit
:theta-inequality-constraint-matrix &key (update? nil) [method]
θmin θ+ ∆θθmax
θlimit θθlimit (if ∆θlimit is set) (2.50)
I
I
I
I
θ
θmin θ
(θmax θ)
θlimit
θlimit
(2.51)
Cθθdθ(2.52)
return Cθ:=
I
I
I
I
R4Nvar-joint ×Nvar -joint
:theta-inequality-constraint-vector &key (update? t) [method]
return dθ:=
θmin θ
(θmax θ)
θlimit
θlimit
R4Nvar-joint
:wrench-inequality-constraint-matrix &key (update? t) [method]
接触レンチ wR6が満たすべき制約(非負制約,摩擦制約,圧力中心制約)が次式のように表される
とする.
Cwwdw(2.53)
16
Ncnt 箇所の接触部位の接触レンチを並べたベクトル ˆwの不等式制約は次式で表される.
Cw,m(wm+ ∆wm)dw,m (m= 1,2,· · · , Ncnt ) (2.54)
Cw,mwmdw,m Cw,mwm(m= 1,2,· · · , Ncnt ) (2.55)
Cw,1
Cw,2
...
Cw,Ncnt
w1
w2
.
.
.
wNcnt
dw,1Cw,1w1
dw,2Cw,2w2
.
.
.
dw,Ncnt Cw,Ncnt wNcnt
(2.56)
Cˆwˆwdˆw(2.57)
return Cˆw:=
Cw,1
Cw,2
...
Cw,Ncnt
RNwrench-ineq ×dim(ˆw)
:wrench-inequality-constraint-vector &key (update? t) [method]
return dˆw:=
dw,1Cw,1w1
dw,2Cw,2w2
.
.
.
dw,Ncnt Cw,Ncnt wNcnt
RNwrench-ineq
:torque-max-vector &key (update? nil) [method]
return τmax RNdrive-joint
:torque-min-vector &key (update? nil) [method]
return τmin RNdrive-joint
:torque-inequality-constraint-matrix &key (update? nil) [method]
τmin τ+ ∆ττmax (2.58)
I
Iττmin τ
(τmax τ)(2.59)
Cττdτ(2.60)
return Cτ:= I
IR2Ndrive-joint ×Ndrive-joint
:torque-inequality-constraint-vector &key (update? t) [method]
return dτ:= τmin τ
(τmax τ)R2Ndrive-joint
:phi-max-vector &key (update? nil) [method]
return ϕmax RNinvar-joint
:phi-min-vector &key (update? nil) [method]
return ϕmin RNinvar-joint
:delta-phi-limit-vector &key (update? nil) [method]
get trust region of ϕ
return ∆ϕlimit
17
:phi-inequality-constraint-matrix &key (update? nil) [method]
ϕmin ϕ+ ∆ϕϕmax
ϕlimit ϕϕlimit (if ∆ϕlimit is set) (2.61)
I
I
I
I
ϕ
ϕmin ϕ
(ϕmax ϕ)
ϕlimit
ϕlimit
(2.62)
Cϕϕdϕ(2.63)
return Cϕ:=
I
I
I
I
R4Ninvar-joint ×Ninvar -joint
:phi-inequality-constraint-vector &key (update? t) [method]
return dϕ:=
ϕmin ϕ
(ϕmax ϕ)
ϕlimit
ϕlimit
R4Ninvar-joint
:variant-config-inequality-constraint-matrix &key (update? nil) [method]
Cθθdθ
Cˆwˆwdˆw
Cττdτ
(2.64)
Cθ
Cˆw
Cτ
θ
ˆw
τ
dθ
dˆw
dτ
(2.65)
Cvar qvar dvar (2.66)
return Cvar :=
Cθ
Cˆw
Cτ
RNvar-ineq ×dim(qvar )
:variant-config-inequality-constraint-vector &key (update? t) [method]
return dvar :=
dθ
dˆw
dτ
RNvar-ineq
:invariant-config-inequality-constraint-matrix &key (update? nil) [method]
Cϕϕdϕ(2.67)
Cinvar qinvar dinvar (2.68)
return Cinvar := CϕRNinvar-ineq ×dim(qinvar )
:invariant-config-inequality-constraint-vector &key (update? t) [method]
18
return dinvar := dϕRNinvar-ineq
:config-inequality-constraint-matrix &key (update? nil) [method]
(update-collision? nil)
Cvar qvar dvar
Cinvar qinvar dinvar
Ccol qvar
qinvar dcol
(2.69)
Cvar
Cinvar
Ccol
qvar
qinvar
dvar
dinvar
dcol
(2.70)
Cqd(2.71)
return C:=
Cvar
Cinvar
Ccol
RNineq ×dim(q)
:config-inequality-constraint-vector &key (update? t) [method]
(update-collision? nil)
return d:=
dvar
dinvar
dcol
RNineq
:variant-config-equality-constraint-matrix &key (update? nil) [method]
return Avar R0×dim(qvar )(no equality constraint)
:variant-config-equality-constraint-vector &key (update? t) [method]
return bvar R0(no equality constraint)
:invariant-config-equality-constraint-matrix &key (update? nil) [method]
return Ainvar R0×dim(qinvar )(no equality constraint)
:invariant-config-equality-constraint-vector &key (update? t) [method]
return binvar R0(no equality constraint)
:config-equality-constraint-matrix &key (update? nil) [method]
return AR0×dim(q)(no equality constraint)
:config-equality-constraint-vector &key (update? t) [method]
return bR0(no equality constraint)
:torque-regular-matrix &key (update? nil) [method]
(only-variant? nil)
二次形式の正則化項として次式を考える.
Ftau (q) =
τ
τmax
2
(ベクトルの要素ごとの割り算を表す) (2.72)
=τT¯
Wtrq τ(2.73)
19
ここで,
¯
Wtrq :=
1
τ2
max ,1
1
τ2
max ,2
...
1
τ2
max ,Ndrive-joint
Rdim(τ)×dim(τ)(2.74)
only-variant? is true:
Wtrq :=
dim(θ)dim(ˆw)dim(τ)
dim(θ)
dim(ˆw)
dim(τ)¯
Wtrq
Rdim(qvar )×dim(qvar )(2.75)
otherwise:
Wtrq :=
dim(θ)dim(ˆw)dim(τ)dim(ϕ)
dim(θ)
dim(ˆw)
dim(τ)¯
Wtrq
dim(ϕ)
Rdim(q)×dim(q)(2.76)
return Wtrq
:torque-regular-vector &key (update? t) [method]
(only-variant? nil)
¯vtrq := ¯
Wtrq τ(2.77)
=
τ1
τ2
max ,1
τ2
τ2
max ,2
.
.
.
τdim(τ)
τ2
max ,dim(τ)
Rdim(τ)(2.78)
only-variant? is true:
vtrq :=
1
dim(θ)
dim(ˆw)
dim(τ)¯vtrq
Rdim(qvar )(2.79)
otherwise:
vtrq :=
1
dim(θ)
dim(ˆw)
dim(τ)¯vtrq
dim(ϕ)
Rdim(q)(2.80)
return vtrq
20
:torque-ratio [method]
return τ
τmax :=
τ1
τmax ,1
τ2
τmax ,2
.
.
.
τNdrive-joint
τmax ,Ndrive-joint
:regular-matrix [method]
Wreg := min(kmax ,e2+koff )I+ktrq Wtrq (2.81)
return Wreg Rdim(q)×dim(q)
:regular-vector [method]
vreg := ktrq vtrq (2.82)
return vreg Rdim(q)
:update-collision-inequality-constraint [method]
リンク 1とリンク 2の最近点を p1,p2とする.リンク 1とリン2が干渉しない条件を,最近p1,p2
の距離が dmargin 以上である条件に置き換えて考える.これは次式で表される.
dT
12(p1p2)dmargin (2.83)
where d12 =p1p2(2.84)
コンフィギュレーションが qだけ更新されてもこれが成立するための条件は次式で表される.
dT
12 {(p1+ ∆p1)(p2+ ∆p2)} ≥ dmargin (2.85)
where ∆p1=Jθ,1θ+Jϕ,1ϕ(2.86)
p2=Jθ,2θ+Jϕ,2ϕ(2.87)
Jθ,i =pi
θ,Jϕ,i =pi
ϕ(i= 1,2) (2.88)
これは以下のように変形される.
dT
12 {(p1+Jθ,1θ+Jϕ,1ϕ)(p2+Jθ,2θ+Jϕ,2ϕ)} ≥ dmargin (2.89)
dT
12(Jθ,1Jθ,2)∆θ+dT
12(Jϕ,1Jϕ,2)∆ϕ≥ −(dT
12(p1p2)dmargin ) (2.90)
cT
col ,var θ+cT
col ,invar ϕdcol (2.91)
where cT
col ,var =dT
12(Jθ,1Jθ,2) (2.92)
cT
col ,invar =dT
12(Jϕ,1Jϕ,2) (2.93)
dcol =(dT
12(p1p2)dmargin ) (2.94)
i番目の干渉回避リンクペアに関する行列,ベクトルをそれぞcT
col ,var ,i,cT
col ,invar ,i, dcol,iとする.i=
21
1,2,· · · , Ncol の全てのリンクペアにおいて干渉が生じないための条件は次式で表される.
Ccol Ccolθ
ϕdcol (2.95)
Ccol :=
cT
col ,var ,1
.
.
.
cT
col ,var ,Ncol
RNcol ×dim(θ)(2.96)
Ccol :=
cT
col ,invar ,1
.
.
.
cT
col ,invar ,Ncol
RNcol ×dim(ϕ),(2.97)
dcol :=
dcol ,1
.
.
.
dcol ,Ncol
RNcol (2.98)
update inequality matrix Ccol,Ccol and inequality vector dcol for collision avoidance
:collision-theta-inequality-constraint-matrix [method]
return Ccol RNcol ×dim(θ)
:collision-phi-inequality-constraint-matrix [method]
return Ccol RNcol ×dim(ϕ)
:collision-inequality-constraint-matrix &key (update? nil) [method]
Ccol :=
dim(θ)dim(ˆw)dim(τ)dim(ϕ)
Ncol CcolO O Ccol (2.99)
return Ccol RNcol ×dim(q)
:collision-inequality-constraint-vector &key (update? nil) [method]
return dcol RNcol
:update-viewer [method]
Update viewer.
:print-status [method]
Print status.
2.2 軌道コンフィギュレーションと軌道タスク関数
trajectory-configuration-task [class]
:super propertied-object
:slots ( instant-config-task-list list of instant-config-task instance)
( num-instant-config-task L)
( dim-variant-config dim(qvar ))
( dim-invariant-config dim(qinvar ))
22
( dim-config dim(q))
( dim-task dim(e))
( norm-regular-scale-max kmax )
( norm-regular-scale-offset koff )
( adjacent-regular-scale kadj )
( torque-regular-scale ktrq )
( task-jacobi buffer for e
q)
軌道コンフィギュレーション qと軌道タスク関数 e(q)のクラス.
以降では,説明文やメソッド名で,軌道“trajectory” を省略する.
コンフィギュレーショqの取得更新,タスク関e(q)の取得,タスク関数のヤコビ行列 e(q)
qの取
得,コンフィギュレーションの等式・不等式制約 A,b,C,dの取得のためのメソッドが定義されている.
コンフィギュレーション・タスク関数を定めるために,初期化時に以下を与える
瞬時のコンフィギュレーション・タスクのリスト
instant-config-task-list instant-configuration-task のリスト
目的関数の重み
norm-regular-scale-max kmax コンフィギュレーション更新量正則化の重み最大値
norm-regular-scale-offset koff コンフィギュレーション更新量正則化の重みオフセット
adjacent-regular-scale kadj 隣接コンフィギュレーション正則化の重み
torque-regular-scale ktrq トルク正則化の重み
コンフィギュレーション qは以下から構成される.
q:= q(1)T
var q(2)T
var · · · q(L)T
var qT
invar T
(2.100)
ここで,
qinvar := q(1)
invar =q(2)
invar =· · · =q(L)
invar (2.101)
q(l)
var ,q(l)
invar (l= 1,2,· · · , L)l番目の瞬時の時変,時不変コンフィギュレーションを表す
タスク関数 e(q)は以下から構成される.
e(q) := e(1)T(q(1)
var ,qinvar )e(2)T(q(2)
var ,qinvar )··· e(L)T(q(L)
var ,qinvar )T
(2.102)
e(l)(q(l)
var ,qinvar ) (l= 1,2,· · · , L)l番目の瞬時のタスク関数を表す
:init &key (name) [method]
(instant-config-task-list)
(norm-regular-scale-max 1.000000e-04)
(norm-regular-scale-offset 1.000000e-07)
(adjacent-regular-scale 0.005)
(torque-regular-scale 0.001)
Initialize instance
:instant-config-task-list [method]
return instant-config-task-list
23
:dim-variant-config [method]
return dim(qvar ) := L
l=1 dim(q(l)
var )
:dim-invariant-config [method]
return dim(qinvar ) := dim(q(l)
invar ) (l= 1,2,· · · , L で同じ)
:dim-config [method]
return dim(q) := dim(qvar ) + dim(qinvar )
:dim-task [method]
return dim(e) := L
l=1 dim(e(l))
:variant-config-vector [method]
return qvar :=
q(1)
var
q(2)
var
.
.
.
q(L)
var
:invariant-config-vector [method]
return qinvar := q(l)
invar (l= 1,2,· · · , L で同じ)
:config-vector [method]
return q:= qvar
qinvar =
q(1)
var
q(2)
var
.
.
.
q(L)
var
qinvar
:set-variant-config variant-config-new &key (relative? nil) [method]
(apply-to-robot? t)
Set qvar .
:set-invariant-config invariant-config-new &key (relative? nil) [method]
(apply-to-robot? t)
Set qinvar .
:set-config config-new &key (relative? nil) [method]
(apply-to-robot? t)
Set q.
:task-value &key (update? t) [method]
return e(q) :=
e(1)(q(1)
var ,qinvar )
e(2)(q(2)
var ,qinvar )
.
.
.
e(L)(q(L)
var ,qinvar )
:variant-task-jacobian [method]
24
e
qvar
=
e(1)
q(1)
var
O
e(2)
q(2)
var
...
Oe(L)
q(L)
var
(2.103)
return e
qvar Rdim(e)×dim(qvar )
:invariant-task-jacobian [method]
e
qinvar
=
e(1)
qinvar
e(2)
qinvar
.
.
.
e(L)
qinvar
(2.104)
return e
qinvar Rdim(e)×dim(qinvar )
:task-jacobian [method]
e
q=e
qvar
e
qinvar (2.105)
=
e(1)
q(1)
var
Oe(1)
qinvar
e(2)
q(2)
var
e(2)
qinvar
...
Oe(L)
q(L)
var
e(L)
qinvar
(2.106)
return e
qRdim(e)×dim(q)
:variant-config-inequality-constraint-matrix &key (update? nil) [method]
Cvar :=
C(1)
var O
C(2)
var
...
O C(L)
var
(2.107)
return Cvar RNvar-ineq ×dim(qvar )
:variant-config-inequality-constraint-vector &key (update? t) [method]
dvar :=
d(1)
var
d(2)
var
.
.
.
d(L)
var
(2.108)
return dvar RNvar-ineq
25
:invariant-config-inequality-constraint-matrix &key (update? nil) [method]
Cinvar := C(l)
invar (l= 1,2,· · · , L で同じ) (2.109)
return Cinvar RNinvar-ineq ×dim(qinvar )
:invariant-config-inequality-constraint-vector &key (update? t) [method]
dinvar := d(l)
invar (l= 1,2,· · · , L で同じ) (2.110)
return dinvar RNinvar-ineq
:config-inequality-constraint-matrix &key (update? nil) [method]
(update-collision? nil)
C:=
Cvar
Cinvar
Ccol
RNineq ×dim(q)(2.111)
return CRNineq ×dim(q)
:config-inequality-constraint-vector &key (update? t) [method]
(update-collision? nil)
d:=
dvar
dinvar
dcol
(2.112)
return dRNineq
:variant-config-equality-constraint-matrix &key (update? nil) [method]
Avar :=
A(1)
var O
A(2)
var
...
O A(L)
var
(2.113)
return Avar RNvar-eq ×dim(qvar )
:variant-config-equality-constraint-vector &key (update? t) [method]
bvar :=
b(1)
var
b(2)
var
.
.
.
b(L)
var
(2.114)
return bvar RNvar-eq
26
:invariant-config-equality-constraint-matrix &key (update? nil) [method]
Ainvar := A(l)
invar (l= 1,2,· · · , L で同じ) (2.115)
return Ainvar RNinvar-eq ×dim(qinvar )
:invariant-config-equality-constraint-vector &key (update? t) [method]
binvar := b(l)
invar (l= 1,2,· · · , L で同じ) (2.116)
return binvar RNinvar-eq
:config-equality-constraint-matrix &key (update? nil) [method]
A:= Avar
Ainvar RNeq ×dim(q)(2.117)
return ARNeq ×dim(q)
:config-equality-constraint-vector &key (update? t) [method]
b:= bvar
binvar (2.118)
return bRNeq
:update-collision-inequality-constraint [method]
update inequality matrix C(l)
col ,C(l)
col and inequality vector d(l)
col for collision avoidance (l= 1,2,· · · , L)
:collision-inequality-constraint-matrix &key (update? nil) [method]
ˆ
C(l)
col :=
dim(θ(l))dim(ˆw(l))dim(τ(l))
N(l)
col C(l)
col O O (2.119)
Ccol :=
ˆ
C(1)
col C(1)
col
ˆ
C(2)
col C(2)
col
....
.
.
ˆ
C(L)
col C(L)
col
(2.120)
return Ccol RNcol ×dim(q)
:collision-inequality-constraint-vector &key (update? nil) [method]
dcol :=
d(1)
col
d(2)
col
.
.
.
d(L)
col
(2.121)
return dcol RNcol
27
:adjacent-regular-matrix &key (update? nil) [method]
二次形式の正則化項として次式を考える.
Fadj (q) =
L1
l=1
θl+1 θl2(2.122)
=qTWadj q(2.123)
ここで,
¯
Iadj :=
dim(θ(l))dim(ˆw(l))dim(τ(l))
dim(θ(l))I
dim(ˆw(l))
dim(τ(l))
Rdim(q(l)
var )×dim(q(l)
var )(2.124)
¯
Wadj :=
¯
Iadj ¯
Iadj
¯
Iadj 2¯
Iadj ¯
Iadj O
...
¯
Iadj 2¯
Iadj ¯
Iadj
O¯
Iadj ¯
Iadj
Rdim(qvar )×dim(qvar )
(2.125)
Wadj := ¯
Wadj
O(2.126)
return Wadj Rdim(q)×dim(q)
:adjacent-regular-vector &key (update? t) [method]
vadj := Wadj q(2.127)
return vadj Rdim(q)
:torque-regular-matrix &key (update? nil) [method]
¯
Wtrq :=
W(1)
trq O
W(2)
trq
...
O W (L)
trq
Rdim(qvar )×dim(qvar )(2.128)
Wtrq := ¯
Wtrq
O(2.129)
return Wtrq Rdim(q)×dim(q)
:torque-regular-vector &key (update? t) [method]
¯vtrq :=
v(1)
trq
v(2)
trq
.
.
.
v(L)
trq
Rdim(qvar )(2.130)
vtrq := ¯vtrq
0(2.131)
28
return vtrq Rdim(q)
:regular-matrix [method]
Wreg := min(kmax ,e2+koff )I+kadj Wadj +ktrq Wtrq (2.132)
return Wreg Rdim(q)×dim(q)
:regular-vector [method]
vreg := kadj vadj +ktrq vtrq (2.133)
return vreg Rdim(q)
:update-viewer [method]
Update viewer.
:print-status [method]
Print status.
:play-animation &key (robot-env) [method]
(loop? t)
(visualize-callback-func)
Play motion.
:generate-robot-state-list &key (robot-env) [method]
(joint-name-list (send-all (send robot-env :robot :joint-list) :name))
(root-link-name (send (car (send robot-env :robot :links)) :name))
(step-time 0.004)
(divide-num 100)
(limb-list (list :rleg :lleg :rarm :larm))
Generate and return robot state list.
3勾配を用いた制約付き非線形最適化
3.1 逐次二次計画法
sqp-optimization [class]
:super propertied-object
:slots ( config-task instance of configuration-task)
( qp-retval buffer for QP return value)
( qp-status buffer for QP status)
( qp-int-status QP status)
( task-value buffer for task value e(q))
( task-jacobian buffer for task jacobian e
q)
29
( dim-config-buf-matrix matrix buffer)
( convergence-check-func function to check convergence)
( failure-callback-func callback function of failure)
( pre-process-func pre-process function)
( post-process-func post-process function)
( i buffer for iteration count)
( status status of sqp optimization)
( no-visualize? whether to supress visualization)
( no-print? whether to supress print)
逐次二次計画法のクラス.
instant-configuration-task trajectory-configuration-task instance (configuration-
task と呼ぶ)が与えられた時に,configuration-task のタスク関数ノルム二乗 e(q)2を最小にするコン
フィギュレーション qを反復計算により求める.
:init &key (config-task) [method]
(convergence-check-func)
(failure-callback-func)
(pre-process-func)
(post-process-func)
(no-visualize?)
(no-print?)
&allow-other-keys
Initialize instance
:config-task [method]
Return configuration-task instance
:optimize &key (loop-num 100) [method]
(loop-num-min)
(update-viewer-interval 1)
(print-status-interval 10)
Optimize
In each iteration, do following:
1. check convergence
2. call pre-process function
3. print status
4. solve QP and update configuration
5. call post-process function
30
Solve following QP:
min
q(k)
1
2q(k)TWq(k)+vTq(k)(3.1)
s.t.Aq(k)=b(3.2)
Cq(k)d(3.3)
where W=e(q(k))
q(k)Te(q(k))
q(k)+Wreg (3.4)
v=e(q(k))
q(k)T
e(q(k)) + vreg (3.5)
and update configuration:
q(k+1) =q(k)+ ∆q(k)(3.6)
:iteration [method]
Return iteration index.
:status [method]
Return status of sqp optimization.
3.2 複数解候補を用いた逐次二次計画法
3.2.1 複数解候補を用いた逐次二次計画法の理論
(1.4a) の最適化問題に逐次二次計画法などの制約付き非線形最適化手法を適用すると,初期値から勾配方
向に進行して至る局所最適解が得られると考えられる.したがって解は初期値に強く依存する.
(1.4a) の代わりに,以下の最適化問題を考える.
min
ˆq
i∈I F(q(i)) + kmsc Fmsc (ˆq;i)(3.7)
s.t.Aq(i)=¯
bi∈ I (3.8)
Cq(i)¯
di∈ I (3.9)
where ˆqdef
=q(1)Tq(2)T· · · q(Nmsc )TT
(3.10)
Idef
={1,2,· · · , Nmsc }(3.11)
Fmsc (ˆq;i)def
=1
2
j∈I
j̸=i
log d(q(i),q(j))2(3.12)
d(q(i),q(j))def
=q(i)q(j)(3.13)
Nmsc は解候補の個数で,事前に与えるものとする.msc は複数解候補 (multiple solution candidates) を表
これは,複数の解候補を同時に探索し,それぞれの解候補 q(i)が本来の目的関数 F(q(i))を小さくして,なお
かつ,解候補どうしの距離が大きくなるように最適化することを表している.これにより,初期値に依存した
唯一の局所解だけでなく,そこから離れた複数の局所解を得ることが可能となり,通常の最適化に比べてより
良い解が得られることが期待される.以降では,解候補どうしの距離のコストを表す項 Fmsc (ˆq;i)を解候補
散項と呼ぶ 8
8解分散項の log を無くすことは適切ではない.なぜなら,d=d(q(i),q(j))として,解分散項の勾配は,
d (1
2log d2)=1
d→ −∞ (d+0)
d (1
2log d2)=1
d0 (d→ ∞) (3.14)
31
解候補分散項のヤコビ行列,ヘッセ行列の各成分は次式で得られる 9
iFmsc (ˆq;i) = Fmsc (ˆq;i)
q(i)(3.16a)
=1
2
j∈I
j̸=i
q(i)log d(q(i),q(j))2(3.16b)
=
j∈I
j̸=i
1
d(q(i),q(j))2d(q(i),q(j))
q(i)T
d(q(i),q(j)) (3.16c)
=
j∈I
j̸=i
d(q(i),q(j))
d(q(i),q(j))2(3.16d)
(3.16e)
kFmsc (ˆq;i) = Fmsc (ˆq;i)
q(k)k I k̸=i(3.17a)
=1
2
j∈I
j̸=i
q(k)log d(q(i),q(j))2(3.17b)
=1
2
q(k)log d(q(i),q(k))2(3.17c)
=1
d(q(i),q(k))2d(q(i),q(k))
q(k)T
d(q(i),q(k)) (3.17d)
=d(q(i),q(k))
d(q(i),q(k))2(3.17e)
(3.17f)
2
iiFmsc (ˆq;i) = 2Fmsc (ˆq;i)
q(i)2 (3.18a)
=
j∈I
j̸=i
q(i)d(q(i),q(j))21
d(q(i),q(j))(3.18b)
=
j∈I
j̸=i2d(q(i),q(j))22
d(q(i),q(j))d(q(i),q(j))T+d(q(i),q(j))21
I
(3.18c)
=
j∈I
j̸=i2
d(q(i),q(j))4d(q(i),q(j))d(q(i),q(j))T+1
d(q(i),q(j))2I(3.18d)
=
j∈I
j̸=i
H(q(i),q(j)) (3.18e)
となり,最適化により,コンフィギュレーションが近いときほど離れるように更新し,遠くなるとその影響が小さくなる効果が期待され
る.それに対し,log がない場合の勾配は,
d (1
2d2)=d0 (d+0)
d (1
2d2)=d→ −∞ (d→ ∞) (3.15)
となり,コンフィギュレーションが遠くなるほど離れるように更新し,近いときはその影響が小さくなる.これは,コンフィギュレーショ
ンが一致する勾配ゼロの点と,無限に離れ発散する最適値をもち,これらは最適化において望まない挙動をもたらす
9ヘッセ 行 列 の 導 出 は 以 下 を 参 考 に し た .https://math.stackexchange.com/questions/175263/
gradient-and-hessian-of-general-2-norm
32
ただし,
H(q(i),q(j))def
=2
d(q(i),q(j))4d(q(i),q(j))d(q(i),q(j))T+1
d(q(i),q(j))2I(3.19)
2
ikFmsc (ˆq;i) = 2Fmsc (ˆq;i)
q(i)q(k)k I k̸=i(3.20a)
=
j∈I
j̸=i
q(k)d(q(i),q(j))21
d(q(i),q(j))(3.20b)
=
q(k)d(q(i),q(k))21
d(q(i),q(k))(3.20c)
=2d(q(i),q(k))22
d(q(i),q(k))d(q(i),q(k))Td(q(i),q(k))21
I
(3.20d)
=2
d(q(i),q(k))4d(q(i),q(k))d(q(i),q(k))T+1
d(q(i),q(k))2I(3.20e)
=H(q(i),q(k)) (3.20f)
2
kk Fmsc (ˆq;i) = 2Fmsc (ˆq;i)
q(k)2 k I k̸=i(3.21a)
=
q(k)d(q(i),q(k))21
d(q(i),q(k))(3.21b)
=2
d(q(i),q(k))4d(q(i),q(k))d(q(i),q(k))T+1
d(q(i),q(k))2I(3.21c)
=H(q(i),q(k)) (3.21d)
2
klFmsc (ˆq;i) = 2Fmsc (ˆq;i)
q(k)q(l)k I l I k̸=il̸=ik̸=l(3.22a)
=
q(l)d(q(i),q(k))21
d(q(i),q(k))(3.22b)
=O(3.22c)
33
したがって,解候補分散項のヤコビ行列,ヘッセ行列は次式で表される.
Fmsc (ˆq;i) = Fmsc (ˆq;i)
ˆq(3.23a)
=
d(q(i),q(1))
d(q(i),q(1))2
.
.
.
d(q(i),q(i1))
d(q(i),q(i1))2
j∈I
j̸=i
d(q(i),q(j))
d(q(i),q(j))2
d(q(i),q(i+1))
d(q(i),q(i+1))2
.
.
.
d(q(i),q(Nmsc ))
d(q(i),q(Nmsc ))2
(3.23b)
vmsc
def
=
i∈I
Fmsc (ˆq;i) (3.23c)
= 2
j∈I
j̸=1
d(q(1),q(j))
d(q(1),q(j))2
.
.
.
j∈I
j̸=Nmsc
d(q(Nmsc ),q(j))
d(q(Nmsc ),q(j))2
(3.23d)
2Fmsc (ˆq;i) = 2Fmsc (ˆq;i)
ˆq2(3.24a)
=
1· · · i1i i + 1 ··· Nmsc
1Hi,1Hi,1
.
.
.....
.
.
i1Hi,i1Hi,i1
iHi,1· · · Hi,i1j∈I
j̸=i
Hi,j Hi,i+1 ··· Hi,Nmsc
i+ 1 Hi,i+1 Hi,i+1
.
.
..
.
....
Nmsc Hi,Nmsc Hi,Nmsc
(3.24b)
Wmsc
def
=
i∈I
2Fmsc (ˆq;i) (3.24c)
= 2
j∈I
j̸=i
H1,j H1,2· · · H1,Nmsc
H2,1j∈I
j̸=i
H2,j H2,Nmsc
.
.
.....
.
.
HNmsc ,1HNmsc ,2· · · j∈I
j̸=i
HNmsc ,j
(3.24d)
ただし,H(q(i),q(j))Hi,j と略して記す.また,d(q(i),q(j)) = d(q(j),q(i)),Hi,j =Hj,i を利用した.
解候補分散項 i∈I Fmsc (ˆq;i)による二次計画問題の目的関数 ((1.5a) ) は次式で表される.
i∈I Fmsc (ˆqk;i) + Fmsc (ˆqk;i)Tˆqk+1
2ˆqT
k2Fmsc (ˆqk;i)∆ˆqk(3.25)
=
i∈I
Fmsc (ˆqk;i) +
i∈I
Fmsc (ˆqk;i)T
ˆqk+1
2ˆqT
k
i∈I
2Fmsc (ˆqk;i)ˆqk(3.26)
=
i∈I
Fmsc (ˆqk;i) + vT
msc ˆqk+1
2ˆqT
kWmsc ˆqk(3.27)
34
Wmsc が必ずしも半正定値行列ではないことに注意する必要がある.以下のようにして Wmsc に近い正定
値行列を計算し用いることで対処する 10Wmsc が次式のように固有値分解されるとする.
Wmsc =Vmsc Dmsc V1
msc (3.28)
Dmsc 固有値をつ対角行列,Vmsc ベクトルを並べた行列である.このとき Wmsc
に近い正定値行列 ˜
Wmsc は次式で得られる.
˜
Wmsc =Vmsc D+
msc V1
msc (3.29)
ただし,D+
msc Dmsc の対角成分のうち,負のものを 0で置き換えた対角行列である.
(3.7) において,解候補を分散させながら,最終的に本来の目的関数を最小にする解を得るために,SQP
のイテレーションごとに,解候補分散項のスケール kmsc を次式のように更新することが有効である.
kmsc min(γmsc kmsc , kmsc-min ) (3.30)
γmsc 0< γmsc <1なるスケール減少率,kmsc-min はスケール最小値を表す
3.2.2 複数解候補を用いた逐次二次計画法の実装
sqp-msc-optimization [class]
:super sqp-optimization
:slots ( num-msc number of multiple solution candidates Nmsc )
( config-task-list list of configuration-task instance)
( dispersion-scale kmsc )
( dispersion-scale-min kmsc-min , minimum of kmsc )
( dispersion-scale-decrease-ratio γmsc , decrease ration of kmsc )
( config-vector-dist2-min minimum squared distance of configuration vector)
( dispersion-matrix buffer for Wmsc )
複数回候補を用いた逐次二次計画法のクラス.
instant-configuration-task trajectory-configuration-task instance (configuration-
task と呼ぶ)が与えられた時に,configuration-task のタスク関数ノルム二乗 e(q)2を最小にするコン
フィギュレーション qを,複数の解候補を同時に考慮しながら反復計算により求める.
:init &rest args &key (num-msc 3) [method]
(dispersion-scale 0.01)
(dispersion-scale-min 0.0)
(dispersion-scale-decrease-ratio 0.5)
(config-vector-dist2-min 1.000000e-10)
&allow-other-keys
Initialize instance
:config-task-list [method]
Return list of configuration-task instance
10Wmsc が対称行列であることから,以下を参考にした.https://math.stackexchange.com/questions/648809/
how-to-find-closest-positive-definite-matrix-of-non-symmetric-matrix#comment1689831_649522
35
:dispersion-matrix [method]
(3.23d) 参照.
return Wmsc RNmsc dim(q)×Nmsc dim(q)
:dispersion-vector [method]
(3.24d) 参照.
return vmsc RNmsc dim(q)
4動作生成の拡張
4.1 マニピュレーションの動作生成
robot-object-environment [class]
:super robot-environment
:slots ( obj O)
( obj-with-root-virtual ˆ
O)
ロボットと物体とロボット・環境間の接触のクラス.
以下を合わせた関節・リンク構造に関するメソッドが定義されている.
1. 浮遊ルートリンクのための仮想関節付きのロボットの関節
2. 物体位置姿勢を表す仮想関節
3. 接触位置を定める仮想関節
関節・リンク構造を定めるために,初期化時に以下を与える
robot Rロボット (cascaded-link クラスのインスタンス)
object O物体 (cascaded-link クラスのインスタンス).関節をもたないことを前提とする.
contact-list {C1,C2,· · · ,CNC}接触 (2d-planar-contact クラスなどのインスタンス)のリスト
ロボッRに,浮遊ルートリンクの変位に対応する仮想関節を付加した仮想関節付きロボッˆ
Rを内部
で保持する.同様に,物体 Oに,物体の変位に対応する仮想関節を付加した仮想関節付き物体 ˆ
Oを内部
で保持する.
:init &key (robot) [method]
(object)
(contact-list)
(root-virtual-mode :6dof)
(root-virtual-joint-class-list)
(root-virtual-joint-axis-list)
Initialize instance
:object &rest args [method]
return O
:object-with-root-virtual &rest args [method]
36
return ˆ
O
instant-manipulation-configuration-task [class]
:super instant-configuration-task
:slots ( robot-obj-env robot-object-environment instance)
( wrench-obj-vector ˆwobj [N] [Nm])
( num-contact-obj Ncnt-obj := |T cnt -trg-obj |)
( num-act-react Nact-react := |Pact -react |)
( dim-wrench-obj dim(ˆwobj ) = 6Ncnt -obj )
( contact-target-coords-obj-list Tcnt-trg-obj )
( contact-constraint-obj-list list of contact-constraint instance for object)
( act-react-pair-list Pact -react )
マニピュレーションにける瞬時コンフィギュレーション q(l)と瞬時タスク関数 e(l)(q(l))のクラス.マニ
ピュレーション対象の物体の瞬時コンフィギュレーションや瞬時タスク関数を含む.
このクラスの説明で用いる全ての変数は,時間ステップ lを表す添字をつけて x(l)と表されるべきだが,
のクラスの説明で省略して x表すまた降では,文やメソド名で,“instant”
を省略する.
コンフィギュレーショqの取得更新,タスク関e(q)の取得,タスク関数のヤコビ行列 e(q)
qの取
得,コンフィギュレーションの等式・不等式制約 A,b,C,dの取得のためのメソッドが定義されている.
コンフィギレーションタスク関数を定めるために,instant-configuration-task 設定に加えて,初期
化時に以下を与える
ロボット・物体・環境
robot-object-environment ロボット・物体・環境を表す robot-object-environment クラスのイ
ンスタンス
物体の接触拘束
contact-target-coords-obj-list Tcnt-trg-obj 物体の接触目標位置姿勢リスト
contact-constraint-obj-list 物体の接触レンチ制約リスト
作用・反作用の拘束
act-react-pair-list Pact-react ・反作用の関係にあるロボッ物体の接触目標位置姿勢ペア
のリスト
コンフィギュレーション qは以下から構成される.
θRNvar-joint 時変関節角度 [rad] [m]
ˆwR6Ncnt ロボットの接触レンチ [N] [Nm]
ˆwobj R6Ncnt -obj 物体の接触レンチ [N] [Nm]
τRNdrive-joint 関節駆動トルク [Nm] [N]
ϕRNinvar-joint 時不変関節角度 [rad] [m]
ˆwは次式のように,全接触部位でのワールド座標系での力・モーメントを並べたベクトルである.
ˆw=wT
1wT
2· · · wT
Ncnt T
(4.1)
=fT
1nT
1fT
2nT
2· · · fT
Ncnt nT
Ncnt T
(4.2)
37
タスク関数 e(q)は以下から構成される.
ekin (q)R6Nkin 幾何到達拘束 [rad] [m]
eeom -trans (q)R3ロボットの力の釣り合い [N]
eeom -rot (q)R3ロボットのモーメントの釣り合い [Nm]
eeom -trans-obj (q)R3物体の力の釣り合い [N]
eeom -rot-obj (q)R3物体のモーメントの釣り合い [Nm]
etrq (q)RNdrive -joint 関節トルクの釣り合い [rad] [m]
eposture (q)RNposture-joint 関節角目標 [rad] [m]
:init &rest args &key (contact-target-coords-obj-list) [method]
(contact-constraint-obj-list)
(act-react-pair-list)
&allow-other-keys
Initialize instance
:robot-obj-env [method]
return robot-object-environment instance
:wrench-obj [method]
return ˆwobj
:num-contact-obj [method]
return Ncnt-obj := |T cnt-trg-obj |
:dim-variant-config [method]
dim(qvar ) := dim(θ) + dim(ˆw) + dim(ˆwobj ) + dim(τ) (4.3)
=Nvar-joint + 6Ncnt + 6Ncnt-obj +Ndrive-joint (4.4)
return dim(qvar )
:dim-task [method]
dim(e) := dim(ekin ) + dim(eeom-trans ) + dim(eeom-rot ) + dim(eeom-trans-obj )
+dim(eeom-rot-obj ) + dim(etrq ) + dim(eposture ) (4.5)
= 6Nkin +3+3+3+3+Ndrive-joint +Nposture-joint (4.6)
return dim(e)
:variant-config-vector [method]
return qvar :=
θ
ˆw
ˆwobj
τ
:config-vector [method]
38
return q:= qvar
qinvar =
θ
ˆw
ˆwobj
τ
ϕ
:set-wrench-obj wrench-obj-new &key (relative? nil) [method]
Set ˆwobj .
:set-variant-config variant-config-new &key (relative? nil) [method]
(apply-to-robot? t)
Set qvar .
:contact-target-coords-obj-list [method]
Tcnt-trg-obj
m={pcnt-trg-obj
m,Rcnt-trg-obj
m}(m= 1,2,··· , Ncnt-obj ) (4.7)
return Tcnt-trg-obj := {Tcnt-trg-obj
1, T cnt-trg-obj
2,· · · , T cnt-trg-obj
Ncnt-obj }
:contact-constraint-obj-list [method]
return list of contact-constraint instance for object
:wrench-obj-list [method]
return {wobj ,1,wobj ,2,· · · ,wobj ,Nobj }
:force-obj-list [method]
return {fobj ,1,fobj ,2,· · · ,fobj ,Ncnt-obj }
:moment-obj-list [method]
return {nobj ,1,nobj ,2,· · · ,nobj ,Ncnt-obj }
:mg-obj-vec [method]
return mobj g
:cog-obj &key (update? t) [method]
return pGobj (q)
:eom-trans-obj-task-value &key (update? t) [method]
eeom -trans-obj (q) = eeom-trans-obj (ˆwobj ) (4.8)
=
Ncnt-obj
m=1
fobj ,mmobj g(4.9)
return eeom -trans-obj (q)R3
:eom-rot-obj-task-value &key (update? t) [method]
eeom -rot-obj (q) = eeom -rot-obj (θ,ˆwobj ,ϕ) (4.10)
=
Ncnt-obj
m=1 pcnt-trg-obj
m(θ,ϕ)pGobj (θ,ϕ)×fobj ,m+nobj ,m(4.11)
39
return eeom -rot-obj (q)R3
:task-value &key (update? t) [method]
return e(q) :=
ekin (q)
eeom -trans (q)
eeom -rot (q)
eeom -trans-obj (q)
eeom -rot-obj (q)
etrq (q)
eposture (q)
=
ekin (θ,ϕ)
eeom -trans (ˆw)
eeom -rot (θ,ˆw,ϕ)
eeom -trans-obj (ˆwobj )
eeom -rot-obj (θ,ˆwobj ,ϕ)
etrq (θ,ˆw,τ,ϕ)
eposture (θ)
:eom-trans-obj-task-jacobian-with-wrench-obj [method]
eeom -trans-obj
ˆwobj
=eeom-trans-obj
fobj ,1
eeom-trans-obj
nobj ,1··· eeom-trans-obj
fobj ,Ncnt-obj
eeom-trans-obj
nobj ,Ncnt-obj (4.12)
=I3O3· · · I3O3(4.13)
return eeom-trans-obj
ˆwobj
R3×6Ncnt-obj
:eom-rot-obj-task-jacobian-with-theta [method]
eeom -rot-obj
θ=
Ncnt-obj
m=1 [fobj ,m×]Jcnt-trg-obj
θ,m (θ,ϕ)JGobj θ(θ,ϕ) (4.14)
=
Ncnt-obj
m=1
fobj ,m
×
JGobj θ(θ,ϕ)
Ncnt-obj
m=1
[fobj ,m×]Jcnt-trg-obj
θ,m (θ,ϕ) (4.15)
Ncnt-obj
m=1 fobj ,m=mobj gつまりeom-trans-obj-task が成立すると仮定すると次式が成り立つ.
eeom -rot-obj
θ= [mobj g×]JGobj θ(θ,ϕ)
Ncnt-obj
m=1
[fobj ,m×]Jcnt-trg-obj
θ,m (θ,ϕ) (4.16)
return eeom-rot-obj
θR3×Nvar-joint
:eom-rot-obj-task-jacobian-with-wrench-obj [method]
eeom -rot-obj
ˆwobj
=eeom-rot-obj
fobj ,1
eeom-rot-obj
nobj ,1· · · eeom-rot-obj
fobj ,Ncnt-obj
eeom-rot-obj
nobj ,Ncnt-obj (4.17)
eeom -rot-obj
fobj ,m
=pcnt-trg-obj
m(θ,ϕ)pGobj (θ,ϕ)×(m= 1,2,··· , Ncnt-obj ) (4.18)
eeom -rot-obj
nobj ,m
=I3(m= 1,2,· · · , Ncnt-obj ) (4.19)
return eeom-rot-obj
ˆwobj R3×6Ncnt-obj
:eom-rot-obj-task-jacobian-with-phi [method]
40
eeom -rot-obj
ϕ=
Ncnt-obj
m=1 [fobj ,m×]Jcnt-trg-obj
ϕ,m (θ,ϕ)JGobj ϕ(θ,ϕ) (4.20)
=
Ncnt-obj
m=1
fobj ,m
×
JGobj ϕ(θ,ϕ)
Ncnt-obj
m=1
[fobj ,m×]Jcnt-trg-obj
ϕ,m (θ,ϕ)(4.21)
Ncnt-obj
m=1 fobj ,m=mobj gつまりeom-trans-obj-task が成立すると仮定すると次式が成り立つ.
eeom -rot-obj
ϕ= [mobj g×]JGobj ϕ(θ,ϕ)
Ncnt-obj
m=1
[fobj ,m×]Jcnt-trg-obj
ϕ,m (θ,ϕ) (4.22)
return eeom-rot-obj
ϕR3×Ninvar-joint
:variant-task-jacobian [method]
e
qvar
=
Nvar-joint 6Ncnt 6Ncnt-obj Ndrive-joint
6Nkin ekin
θ
3eeom-trans
ˆw
3eeom-rot
θ
eeom-rot
ˆw
3eeom-trans-obj
ˆwobj
3eeom-rot-obj
θ
eeom-rot-obj
ˆwobj
Ndrive-joint etrq
θ
etrq
ˆw
etrq
τ
Nposture-joint eposture
θ
(4.23)
return e
qvar R(6Nkin +3+3+3+3+Ndrive-joint +Nposture-joint )×(Nvar -joint +6Ncnt +6Ncnt-obj +Ndrive-joint )
:invariant-task-jacobian [method]
e
qinvar
=
Ninvar-joint
6Nkin ekin
ϕ
3
3eeom-rot
ϕ
3
3eeom-rot-obj
ϕ
Ndrive-joint etrq
ϕ
Nposture-joint
(4.24)
return e
qinvar R(6Nkin +3+3+3+3+Ndrive-joint +Nposture-joint )×Ninvar -joint
:task-jacobian [method]
41
e
q=e
qvar
e
qinvar (4.25)
=
Nvar-joint 6Ncnt 6Ncnt-obj Ndrive-joint Ninvar -joint
6Nkin ekin
θ
ekin
ϕ
3eeom-trans
ˆw
3eeom-rot
θ
eeom-rot
ˆw
eeom-rot
ϕ
3eeom-trans-obj
ˆwobj
3eeom-rot-obj
θ
eeom-rot-obj
ˆwobj
eeom-rot-obj
ϕ
Ndrive-joint etrq
θ
etrq
ˆw
etrq
τetrq
ϕ
Nposture-joint eposture
θ
(4.26)
return e
qR(6Nkin +3+3+3+3+Ndrive-joint +Nposture-joint )×(Nvar -joint +6Ncnt +6Ncnt-obj +Ndrive-joint +Ninvar -joint )
:wrench-obj-inequality-constraint-matrix &key (update? t) [method]
物体の接触レンチ wobj R6が満たすべき制約(非負制約,摩擦制約,圧力中心制約)が次式のよう
表されるとする.
Cwobj wobj dwobj (4.27)
Ncnt-obj 箇所の接触部位の接触レンチを並べたベクトル ˆwobj の不等式制約は次式で表される.
Cwobj ,m(wobj ,m+ ∆wobj ,m)dwobj ,m (m= 1,2,··· , Ncnt -obj ) (4.28)
Cwobj ,mwobj ,mdwobj ,m Cwobj ,mwobj ,m(m= 1,2,··· , Ncnt-obj ) (4.29)
Cwobj ,1
Cwobj ,2
...
Cwobj ,Ncnt-obj
wobj ,1
wobj ,2
.
.
.
wobj ,Ncnt-obj
dwobj ,1Cwobj ,1wobj ,1
dwobj ,2Cwobj ,2wobj ,2
.
.
.
dwobj ,Ncnt-obj Cwobj ,Ncnt -obj wobj ,Ncnt-obj
(4.30)
Cˆwobj ˆwobj dˆwobj (4.31)
return Cˆwobj :=
Cwobj ,1
Cwobj ,2
...
Cwobj ,Ncnt-obj
RNwrench-obj -ineq ×6Ncnt-obj
:wrench-obj-inequality-constraint-vector &key (update? t) [method]
return dˆwobj :=
dwobj ,1Cwobj ,1wobj ,1
dwobj ,2Cwobj ,2wobj ,2
.
.
.
dwobj ,Ncnt-obj Cwobj ,Ncnt -obj wobj ,Ncnt-obj
RNwrench-obj -ineq
:variant-config-inequality-constraint-matrix &key (update? nil) [method]
42
Cθθdθ
Cˆwˆwdˆw
Cˆwobj ˆwobj dˆwobj
Cττdτ
(4.32)
Cθ
Cˆw
Cˆwobj
Cτ
θ
ˆw
ˆwobj
τ
dθ
dˆw
dˆwobj
dτ
(4.33)
Cvar qvar dvar (4.34)
return Cvar :=
Cθ
Cˆw
Cˆwobj
Cτ
RNvar-ineq ×dim(qvar )
:variant-config-inequality-constraint-vector &key (update? t) [method]
return dvar :=
dθ
dˆw
dˆwobj
dτ
RNvar-ineq
:act-react-equality-constraint-matrix &key (update? nil) [method]
43
ロボット・物体間の接触レンチに関する作用・反作用の法則は次式のように表される.
ˆwi(m)+ˆwobj ,j(m)=0(m= 1,2,· · · , Nact -react ) (4.35)
Aact-react,robot ,mˆw+Aact-react,obj ,mˆwobj =0(m= 1,2,· · · , Nact-react ) (4.36)
where Aact-react,robot ,m=
i(m)番目
O6O6· · · I6· · · O6O6R6×6Ncnt (4.37)
Aact-react,obj ,m=
j(m)番目
O6O6· · · I6· · · O6O6R6×6Ncnt -obj
(4.38)
Aact-react,robot ˆw+Aact-react,obj ˆwobj =0(4.39)
where Aact-react,robot =
Aact-react,robot ,1
.
.
.
Aact-react,robot ,Nact -react
R6Nact-react ×6Ncnt (4.40)
Aact-react,obj =
Aact-react,obj ,1
.
.
.
Aact-react,obj ,Nact-react
R6Nact-react ×6Ncnt -obj (4.41)
Aact-react ˆw
ˆwobj =0R6Nact -react (4.42)
where Aact-react =Aact-react ,robot Aact-react,obj R6Nact-react ×(6Ncnt +6Ncnt-obj )(4.43)
Aact-react ˆw+ ∆ ˆw
ˆwobj + ∆ ˆwobj =0(4.44)
Aact-react ˆw
ˆwobj =bact-react (4.45)
where bact-react =Aact-react ˆw
ˆwobj (4.46)
i(m), j(m)は作用・反作用の関係にある接触レンチの m番目の対におけるロボッ,物体の接触レンチ
のインデックスである.
return Aact-react R6Nact-react ×(6Ncnt +6Ncnt-obj )
:act-react-equality-constraint-vector &key (update? t) [method]
return bact-react R6Nact-react
:variant-config-equality-constraint-matrix &key (update? nil) [method]
Aact-react ˆw
ˆwobj =bact-react (4.47)
O Aact-react O
θ
ˆw
ˆwobj
τ
=bact-react (4.48)
Avar qvar =bvar (4.49)
return Avar := O Aact-react OR6Nact-react ×dim(qvar )
44
:variant-config-equality-constraint-vector &key (update? t) [method]
return bvar := bact-react R6Nact-react
:invariant-config-equality-constraint-matrix &key (update? nil) [method]
return Ainvar R0×dim(qinvar )(no equality constraint)
:invariant-config-equality-constraint-vector &key (update? t) [method]
return binvar R0(no equality constraint)
:config-equality-constraint-matrix &key (update? nil) [method]
Avar qvar =bvar (4.50)
Avar Oqvar
qinvar =bvar (4.51)
Aq=b(4.52)
return A:= Avar ORNeq ×dim(q)
:config-equality-constraint-vector &key (update? t) [method]
return b:= bvar RNeq
:torque-regular-matrix &key (update? nil) [method]
(only-variant? nil)
二次形式の正則化項として次式を考える.
Ftau (q) =
τ
τmax
2
(ベクトルの要素ごとの割り算を表す) (4.53)
=τT¯
Wtrq τ(4.54)
ここで,
¯
Wtrq :=
1
τ2
max ,1
1
τ2
max ,2
...
1
τ2
max ,Ndrive-joint
Rdim(τ)×dim(τ)(4.55)
only-variant? is true:
Wtrq :=
dim(θ)dim(ˆw)dim(ˆwobj )dim(τ)
dim(θ)
dim(ˆw)
dim(ˆwobj )
dim(τ)¯
Wtrq
Rdim(qvar )×dim(qvar )(4.56)
otherwise:
Wtrq :=
dim(θ)dim(ˆw)dim(ˆwobj )dim(τ)dim(ϕ)
dim(θ)
dim(ˆw)
dim(ˆwobj )
dim(τ)¯
Wtrq
dim(ϕ)
Rdim(q)×dim(q)(4.57)
45
return Wtrq
:torque-regular-vector &key (update? t) [method]
(only-variant? nil)
¯vtrq := ¯
Wtrq τ(4.58)
=
τ1
τ2
max ,1
τ2
τ2
max ,2
.
.
.
τdim(τ)
τ2
max ,dim(τ)
Rdim(τ)(4.59)
only-variant? is true:
vtrq :=
1
dim(θ)
dim(ˆw)
dim(ˆwobj )
dim(τ)¯vtrq
Rdim(qvar )(4.60)
otherwise:
vtrq :=
1
dim(θ)
dim(ˆw)
dim(ˆwobj )
dim(τ)¯vtrq
dim(ϕ)
Rdim(q)(4.61)
return vtrq
:collision-inequality-constraint-matrix &key (update? nil) [method]
Ccol :=
dim(θ)dim(ˆw)dim(ˆwobj )dim(τ)dim(ϕ)
Ncol CcolO O O Ccol (4.62)
return Ccol RNcol ×dim(q)
:update-viewer [method]
Update viewer.
:print-status [method]
Print status.
46
4.2 B スプラインを用いた関節軌道生成
4.2.1 B スプラインを用いた関節軌道生成の理論
一般の Bスプライン基底関数の定義
Bスプライン基底関数は以下で定義される.
bi,0(t)def
=1 if tit < ti+1
0 otherwise (4.63)
bi,n(t)def
=tti
ti+nti
bi,n1(t) + ti+n+1 t
ti+n+1 ti+1
bi+1,n1(t) (4.64)
tiはノットと呼ばれる.
使用区間を指定してノットを一様とする場合の Bスプライン基底関数
ts, tfBスプラインの使用区間の初期,終端時刻とする.
n < m とする.
tn=ts(4.65)
tm=tf(4.66)
とする.ti(0 in+m)が等間隔に並ぶとすると,
ti=in
mn(tfts) + ts(4.67)
=hi +mtsntf
mn(4.68)
ただし,
hdef
=tfts
mn(4.69)
(4.68) を式 (4.63) , (4.64) に代入すると,Bスプライン基底関数は次式で得られる.
bi,0(t) = 1 if tit < ti+1
0 otherwise (4.70)
bi,n(t) = (tti)bi,n1(t)+(ti+n+1 t)bi+1,n1(t)
nh (4.71)
以降では,nBスプラインの次数,mを制御点の個数と呼ぶ.
Bスプラインの凸包性
(4.70) , (4.71) で定義される Bスプライン基底関数 bi,n(t)は次式のように凸包性を持つ.
m1
i=0
bi,n(t) = 1 (tsttf) (4.72)
0bi,n(t)1 (i= 0,1,· · · , m 1, tsttf) (4.73)
47
Bスプラインの微分
Bスプライン基底関数の微分に関して次式が成り立つ 11
˙
bn(t) = dbn(t)
dt =Dbn1(t) (4.74)
ただし,
bn(t)def
=
b0,n(t)
b1,n(t)
.
.
.
bm1,n(t)
Rm(4.75)
Ddef
=1
h
11O
11
......
...1
O1
Rm×m(4.76)
したがって,k階微分に関して次式が成り立つ.
b(k)
n(t) = d(k)bn(t)
dt(k)=Dkbnk(t) (4.77)
Bスプラインによる関節角軌道の表現
j番目の関節角軌道 θj(t)を次式で表す
θj(t)def
=
m1
i=0
pj,ibi,n(t) = pT
jbn(t)R(tsttf) (4.78)
ただし,
pj=
pj,0
pj,1
.
.
.
pj,m1
Rm,bn(t) =
b0,n(t)
b1,n(t)
.
.
.
bm1,n(t)
Rm(4.79)
以降では,pjを制御点,bn(t)を基底関数と呼ぶ.制御点 pjを決定すると関節角軌道が定まる.制御点 pj
動作計画の設計変数とする.
j= 1,2,· · · , Njoint 番目の関節角軌道を並べたベクトル関数は,
θ(t)def
=
θ1(t)
θ2(t)
.
.
.
θNjoint (t)
=
pT
1bn(t)
pT
2bn(t)
.
.
.
pT
Njoint bn(t)
=
pT
1
pT
2
.
.
.
pT
Njoint
bn(t) = P bn(t)RNjoint (4.80)
ただし,
Pdef
=
pT
1
pT
2
.
.
.
pT
Njoint
RNjoint ×m(4.81)
11数学的帰納法で証明できる.http://mat.fsv.cvut.cz/gcg/sbornik/prochazkova.pdf
48
(4.80) は,制御点を縦に並べたベクトルとして分離して,以下のようにも表現できる.
θ(t) =
θ1(t)
θ2(t)
.
.
.
θNjoint (t)
=
bT
n(t)p1
bT
n(t)p2
.
.
.
bT
n(t)pNjoint
=
bT
n(t)O
bT
n(t)
...
O bT
n(t)
p1
p2
.
.
.
pNjoint
=Bn(t)pRNjoint (4.82)
ただし,
Bn(t)def
=
bT
n(t)O
bT
n(t)
...
O bT
n(t)
RNjoint ×mNjoint ,pdef
=
p1
p2
.
.
.
pNjoint
RmNjoint (4.83)
Bスプラインによる関節角軌道の微分
(4.80) と式 (4.74) から,関節角速度軌道は次式で得られる.
˙
θ(t) = P˙
bn(t) (4.84)
=P Dbn1(t) (4.85)
=
pT
1
.
.
.
pT
Njoint
Dbn1(t) (4.86)
=
pT
1Dbn1(t)
.
.
.
pT
Njoint Dbn1(t)
(4.87)
=
bT
n1(t)DTp1
.
.
.
bT
n1(t)DTpNjoint
(4.88)
=
bT
n1(t)DTO
...
O bT
n1(t)DT
p1
.
.
.
pNjoint
(4.89)
=
bT
n1(t)O
...
O bT
n1(t)
DTO
...
O DT
p1
.
.
.
pNjoint
(4.90)
=Bn1(t)ˆ
D1p(4.91)
ただし,
ˆ
D1=
DTO
DT
...
O DT
RmNjoint ×mNjoint (4.92)
49
同様にして,関節角軌道の k階微分は次式で得られる.
θ(k)(t) = d(k)θ(t)
dt(k)(4.93)
=P Dkbnk(t) (4.94)
=Bnk(t)ˆ
Dkp(4.95)
ただし,
ˆ
Dk=
(Dk)TO
...
O(Dk)T
= ( ˆ
D1)kRmNjoint ×mNjoint (4.96)
計算時間は式 (4.94) のほうが式 (4.95) より速い.
エンドエフェクタ位置姿勢拘束のタスク関数
関節角 θRNjoint からエンドエフェクタ位置姿勢 rR6への写像を f(θ)で表す
r=f(θ) (4.97)
関節角軌道が式 (4.82) で表現されるとき,エンドエフェクタ軌道は次式で表される.
r(t) = f(θ(t)) = f(Bn(t)p) (4.98)
l= 1,2,··· , Ntm について,時刻 tlでエンドエフェクタの位置姿勢が rlであるタスクのタスク関数は次式
で表される.以降では,tlをタイミングと呼ぶ.
e(p,t)def
=
e1(p,t)
e2(p,t)
.
.
.
eNtm (p,t)
=
r1f(θ(t1))
r2f(θ(t2))
.
.
.
rNtm f(θ(tNtm ))
=
r1f(Bn(t1)p)
r2f(Bn(t2)p)
.
.
.
rNtm f(Bn(tNtm )p)
R6Ntm (4.99)
ただし,
el(p,t)def
=rlf(θ(tl)) = rlf(Bn(tl)p)R6(l= 1,2,· · · , Ntm ) (4.100)
tdef
=
t1
t2
.
.
.
tNtm
RNtm (4.101)
このタスクを実現する関節角軌道は,次の評価関数を最小にする制御点 p,タイミング tを求めることで導
出することができる.
F(p,t)def
=1
2e(p,t)2(4.102)
=1
2
Ntm
l=1
rlf(θ(tl))2(4.103)
=1
2
Ntm
l=1
rlf(Bn(tl)p)2(4.104)
50
また,l番目の幾何拘束の許容誤差を etol,l 0R6とする場合,タスク関数 ˜el(p,t)は次式で表される.
˜el,i(p,t)def
=
el,i(p,t)etol ,l,i el,i(p,t)> etol,l,i
el,i(p,t) + etol ,l,i el,i(p,t)<etol,l,i
0 otherwise
(i= 1,2,· · · ,6) (4.105)
˜el,i(p,t)˜el(p,t)i番目の要素である.el,i(p,t)e(p,t)i番目の要素である.
タスク関数を制御点で微分したヤコビ行列
(4.104) を目的関数とする最適化問題を Gauss-Newton 法,Levenberg-Marquardt 法や逐次二次計画法で
解く場合,タスク関数 (4.99) のヤコビ行列が必要となる.
各時刻でのエンドエフェクタ位置姿勢拘束のタスク関数 el(p,t)の制御点 pに対するヤコビ行列は次式で求
められる.
el(p,t)
p=
p{rlf(Bn(tl)p)}(4.106)
=
pf(Bn(tl)p) (4.107)
=f
θθ=θ(tl)
θ
p(4.108)
=J(θ(tl))
p{Bn(tl)p}(4.109)
=J(θ(tl))Bn(tl) (4.110)
途中の変形で,θ(p;t) = Bn(t)pであることを利用した.ただし,
Jdef
=f
θ(4.111)
タスク関数をタイミングで微分したヤコビ行列
各時刻でのエンドエフェクタ位置姿勢拘束のタスク関数 el(p,t)のタイミング tに対するヤコビ行列は次式
で求められる.
el(p,t)
tl
=
tl
{rlf(P bn(tl))}(4.112)
=
tl
f(P bn(tl)) (4.113)
=f
θθ=θ(tl)
θ
tl
(4.114)
=J(θ(tl))
tl
{P bn(tl)}(4.115)
=J(θ(tl))P˙
bn(tl) (4.116)
=J(θ(tl))P Dbn1(tl) (4.117)
途中の変形で,θ(p;t) = P bn(t)であることを利用した.
51
初期・終端関節速度・加速度のタスク関数とヤコビ行列
初期,終端時刻の関節速度,加速度はゼロであるべきである.タスク関数は次式となる.
esv(p,t)def
=˙
θ(ts) (4.118)
=Bn1(ts)ˆ
D1p(4.119)
=P Dbn1(ts) (4.120)
efv (p,t)def
=˙
θ(tf) (4.121)
=Bn1(tf)ˆ
D1p(4.122)
=P Dbn1(tf) (4.123)
esa(p,t)def
=¨
θ(ts) (4.124)
=Bn2(ts)ˆ
D2p(4.125)
=P D2bn2(ts) (4.126)
efa(p,t)def
=¨
θ(tf) (4.127)
=Bn2(tf)ˆ
D2p(4.128)
=P D2bn2(tf) (4.129)
制御点で微分したヤコビ行列は次式で表される.
esv(p,t)
p=Bn1(ts)ˆ
D1(4.130)
efv (p,t)
p=Bn1(tf)ˆ
D1(4.131)
esa(p,t)
p=Bn2(ts)ˆ
D2(4.132)
efa(p,t)
p=Bn2(tf)ˆ
D2(4.133)
初期時刻,終端時刻で微分したヤコビ行列は次式で表される.
esv(p,t)
ts
=P D bn1(ts)
ts
=P D2bn2(ts) (4.134)
efv (p,t)
tf
=P D bn1(tf)
tf
=P D2bn2(tf) (4.135)
esa(p,t)
ts
=P D2bn2(ts)
ts
=P D3bn3(ts) (4.136)
efa(p,t)
tf
=P D2bn2(tf)
tf
=P D3bn3(tf) (4.137)
関節角上下限制約
(4.78) の関節角軌道定義において,
pjθmax,j 1m(4.138)
のとき,Bスプラインの凸包性 ((4.72) , (4.73) ) より次式が成り立つ.ただし,1mRmは全要素が 1
52
m次元ベクトルである.
θj(t) =
m1
i=0
pj,ibi,n(t) (4.139)
m1
i=0
θmax,j bi,n(t) (4.140)
=θmax,j
m1
i=0
bi,n(t) (4.141)
=θmax,j (4.142)
同様に,θmin,j 1mpjとすれば,θmin,j θj(t)が成り立つ.
したがってj番目の関節角の上下限を θmax,j , θmin,j すると,次式の制約を制御点に課すことで,関節角
上下限制約を満たす関節角軌道が得られる.
θmin,j 1mpjθmax,j 1m(j= 1,2,· · · , Njoint ) (4.143)
つまり
ˆ
Eθmin pˆ
Eθmax (4.144)
I
Ipˆ
Eθmin
ˆ
Eθmax(4.145)
ただし,
ˆ
Edef
=
1m0m
1m
...
0m1m
RmNjoint ×Njoint (4.146)
これは,逐次二次計画法の中で,次式の不等式制約となる.
I
Ipˆ
Eθmin p
ˆ
Eθmax +p(4.147)
関節角速度・角加速度上下限制約
(4.78) と式 (4.74) より,関節角速度軌道,角加速度軌道は次式で表される.
˙
θj(t) = pT
j˙
bn(t) = pT
jDbn1(t) = (DTpj)Tbn1(t)R(tsttf) (4.148)
¨
θj(t) = pT
j¨
bn(t) = pT
jD2bn2(t) = ((D2)Tpj)Tbn2(t)R(tsttf) (4.149)
j番目の関節角速度,角加速度の上限を vmax,j , amax,j とする.関節角上下限制約の導出と同様に考えると,
次式の制約を制御点に課すことで,関節角速度・角加速度上下限制約を満たす関節角軌道が得られる.
vmax,j 1mDTpjvmax,j 1m(j= 1,2,· · · , Njoint ) (4.150)
amax,j 1m(D2)Tpjamax,j 1m(j= 1,2,· · · , Njoint ) (4.151)
53
つまり
ˆ
Evmax ˆ
D1pˆ
Evmax (4.152)
ˆ
D1
ˆ
D1pˆ
Evmax
ˆ
Evmax(4.153)
ˆ
Eamax ˆ
D2pˆ
Eamax (4.154)
ˆ
D2
ˆ
D2pˆ
Eamax
ˆ
Eamax(4.155)
これは,逐次二次計画法の中で,次式の不等式制約となる.
ˆ
D1
ˆ
D1pˆ
Evmax ˆ
D1p
ˆ
Evmax +ˆ
D1p(4.156)
ˆ
D2
ˆ
D2pˆ
Eamax ˆ
D2p
ˆ
Eamax +ˆ
D2p(4.157)
タイミング上下限制約
タイミングが初期,終端時刻の間に含まれる制約は次式で表される.
tstltf(l= 1,2,··· , Ntm ) (4.158)
ts1ttf1(4.159)
I
Itts1
tf1(4.160)
これは,逐次二次計画法の中で,次式の不等式制約となる.
I
Itts1t
tf1+t(4.161)
(4.162)
また,タイミングの順序が入れ替わることを許容しない場合,その制約は次式で表される.
tltl+1 (l= 1,2,· · · , Ntm 1) (4.163)
⇔ −tl+tl+1 0 (l= 1,2,· · · , Ntm 1) (4.164)
Dtm t0(4.165)
ただし,
Dtm =
1 1 O
1 1
...
O1 1
R(Ntm 1)×Ntm (4.166)
これは,逐次二次計画法の中で,次式の不等式制約となる.
Dtm t≥ −Dtm t(4.167)
54
関節角微分二乗積分最小化
関節角微分の二乗積分は次式で得られる.
Fsqr,k(p) = tf
ts
θ(k)(t)
2dt (4.168)
=tf
ts
Bnk(t)ˆ
Dkp
2dt (4.169)
=tf
tsBnk(t)ˆ
DkpTBnk(t)ˆ
Dkpdt (4.170)
=pTtf
tsBnk(t)ˆ
DkT
Bnk(t)ˆ
Dkdtp(4.171)
=pTHkp(4.172)
ただし,
Hk=tf
tsBnk(t)ˆ
DkT
Bnk(t)ˆ
Dkdt (4.173)
Bnk(t)ˆ
Dk=
bT
nk(t)O
...
O bT
nk(t)
(Dk)TO
...
O(Dk)T
(4.174)
=
bT
nk(t)(Dk)TO
...
O bT
nk(t)(Dk)T
(4.175)
=
Dkbnk(t)T
O
...
ODkbnk(t)T
(4.176)
Bnk(t)ˆ
DkT
Bnk(t) =
Dkbnk(t)T
O
...
ODkbnk(t)T
T
Dkbnk(t)T
O
...
ODkbnk(t)T
(4.177)
=
Dkbnk(t)Dkbnk(t)T
O
...
ODkbnk(t)Dkbnk(t)T
(4.178)
これを逐次二次計画問題において,二次形式の正則化項として目的関数に加えることで,滑らかな動作が生成
されることが期待される.
動作期間の最小化
動作期間 (tfts)の二乗は次式で表される.
Fduration (t) = |t1tNtm |2(4.179)
=tT
11
1 1
t(4.180)
55
ただし,初期時刻 ts=t1終端時刻 tf=tNtm がタイミングベクトル tの最初,最後の要素であるとする.
れを逐次二次計画問題において,二次形式の正則化項として目的関数に加えることで,短時間でタスクを実現
する動作が生成されることが期待される.
4.2.2 B スプラインを用いた関節軌道生成の実装
bspline-configuration-task [class]
:super propertied-object
:slots ( robot robot instance)
( control-vector p)
( timing-vector t)
( num-kin Nkin := |T kin-trg |=|T kin-att |)
( num-joint Njoint := |J |)
( num-control-point Nctrl )
( num-timing Ntm )
( bspline-order B-spline order, n)
( dim-control-vector dim(p))
( dim-timing-vector dim(t))
( dim-config dim(q))
( dim-task dim(e))
( num-collision Ncol := number of collision check pairs)
( stationery-start-finish-task-scale kstat )
( first-diff-square-integration-regular-scale ksqr,1)
( second-diff-square-integration-regular-scale ksqr,2)
( third-diff-square-integration-regular-scale ksqr,3)
( motion-duration-regular-scale kduration )
( norm-regular-scale-max kmax ,p)
( norm-regular-scale-offset koff ,p)
( timing-norm-regular-scale-max kmax ,t)
( timing-norm-regular-scale-offset koff ,t)
( joint-list J)
( start-time ts)
( finish-time tf)
( kin-time-list {tkin -tm
1, tkin-tm
2,· · · , tkin-tm
Nkin })
( kin-variable-timing-list list of bool. t for variable timing.)
( kin-target-coords-list Tkin -trg )
( kin-attention-coords-list Tkin -att )
( kin-pos-tolerance-list list of position tolerance etol ,pos [m])
( kin-rot-tolerance-list list of rotation tolerance etol ,rot [rad])
( joint-angle-margin margin of θ[deg] [mm])
( collision-pair-list list of bodyset-link or body pair)
( keep-timing-order? whether to keep order of timing tor not)
( bspline-matrix buffer for Bn(t))
56
( diff-mat buffer for Dk)
( diff-mat-list buffer for {D1,D2,· · · ,DK})
( extended-diff-mat-list buffer for {ˆ
D1,ˆ
D2,· · · ,ˆ
DK})
( task-jacobi buffer for e
q)
( regular-mat buffer for Wreg )
( regular-vec buffer for vreg )
Bスプラインを利用した軌道生成のためのコンフィギュレーション qとタスク関数 e(q)のクラス.
コンフィギュレーショqの取得更新,タスク関e(q)の取得,タスク関数のヤコビ行列 e(q)
qの取
得,コンフィギュレーションの等式・不等式制約 A,b,C,dの取得のためのメソッドが定義されている.
コンフィギュレーション・タスク関数を定めるために,初期化時に以下を与える
ロボット
robot ロボットのインスタンス
joint-list J関節
Bスプラインのパラメータ
start-time tsBスプラインの使用区間の初期時刻
finish-time tfBスプラインの使用区間の終端時刻
num-control-point Nctrl 制御点の個数
bspline-order nBスプラインの次数
幾何拘束
kin-target-coords-list Tkin-trg 幾何到達目標位置姿勢リスト
kin-attention-coords-list Tkin-att 幾何到達着目位置姿勢リスト
kin-time-list {tkin-tm
1, tkin-tm
2,· · · , tkin-tm
Nkin }幾何到達タイミングリスト
kin-variable-timing-list 幾何到達タイミングが可変か (t)固定か (nil) のリスこのリスト内
tの個数がタイミング tの次元 Ntm となる.
コンフィギュレーション qは以下から構成される.
q:= p
t(4.181)
pRNctrl Njoint 制御点 (B スプライン基底関数の山の高さ) [rad] [m]
tRNtm タイミング (幾何拘束タスクの課される時刻) [sec]
タスク関数 e(q)は以下から構成される.
e(q) := ekin (q)
estat (q)R6Nkin +4Njoint (4.182)
ekin (q)R6Nkin 幾何到達拘束 [rad] [m]
estat (q)R4Njoint 初期,終端時刻静止拘束 [rad][rad/s][rad/s2][m][m/s][m/s2]
57
:init &key (name) [method]
(robot)
(joint-list (send robot :joint-list))
(start-time 0.0)
(finish-time 10.0)
(num-control-point 10)
(bspline-order 3)
(kin-time-list)
(kin-variable-timing-list (make-list (length kin-time-list) :initial-element nil))
(kin-target-coords-list)
(kin-attention-coords-list)
(kin-pos-tolerance-list (make-list (length kin-time-list) :initial-element 0.0))
(kin-rot-tolerance-list (make-list (length kin-time-list) :initial-element 0.0))
(joint-angle-margin 3.0)
(collision-pair-list)
(keep-timing-order? t)
(stationery-start-finish-task-scale 0.0)
(first-diff-square-integration-regular-scale 0.0)
(second-diff-square-integration-regular-scale 0.0)
(third-diff-square-integration-regular-scale 0.0)
(motion-duration-regular-scale 0.0)
(norm-regular-scale-max 1.000000e-05)
(norm-regular-scale-offset 1.000000e-07)
(timing-norm-regular-scale-max 1.000000e-05)
(timing-norm-regular-scale-offset 1.000000e-07)
Initialize instance
:robot [method]
return robot instance
:joint-list [method]
return J
:num-kin [method]
return Nkin := |T kin-trg |=|T kin-att |
:num-joint [method]
return Njoint := |J |
:num-control-point [method]
return Nctrl
:num-timing [method]
return Ntm
:num-collision [method]
return Ncol := number of collision check pairs
:dim-config [method]
return dim(q) := dim(p) + dim(t) = Nctrl Njoint +Ntm
58
:dim-task [method]
return dim(e) := dim(ekin ) + dim(estat ) = 6Nkin + 4Njoint
:control-vector [method]
return control vector p
:timing-vector [method]
return timing vector t
:config-vector [method]
return q:= p
t
:set-control-vector control-vector-new &key (relative? nil) [method]
Set p.
:set-timing-vector timing-vector-new &key (relative? nil) [method]
Set t.
:set-config config-new &key (relative? nil) [method]
Set q.
:bspline-vector tm &key (order-offset 0) [method]
bn(t) :=
b0,n(t)
b1,n(t)
.
.
.
bNctrl 1,n(t)
RNctrl (4.183)
return bn(t)
:bspline-matrix tm &key (order-offset 0) [method]
Bn(t) :=
bT
n(t)O
bT
n(t)
...
O bT
n(t)
RNjoint ×Nctrl Njoint (4.184)
return Bn(t)
:differential-matrix &key (diff-order 1) [method]
D:= 1
h
11O
11
......
...1
O1
RNctrl ×Nctrl (4.185)
return Dk
59
:extended-differential-matrix &key (diff-order 1) [method]
ˆ
Dk:=
(Dk)TO
...
O(Dk)T
RNctrl Njoint ×Nctrl Njoint (4.186)
return ˆ
Dk
:bspline-differential-matrix tm &key (diff-order 1) [method]
return Bnk(t)ˆ
DkRNjoint ×Nctrl Njoint
:control-matrix [method]
P:=
pT
1
pT
2
.
.
.
pT
njoint
RNjoint ×Nctrl (4.187)
return P
:theta tm [method]
return θ(t) = Bn(t)p[rad][m]
:theta-dot tm &key (diff-order 1) [method]
return θ(k)(t) = d(k)θ(t)
dt(k)=P Dkbnk(t) [rad/sk][m/sk]
:theta-dot-numerical tm &key (diff-order 1) [method]
(delta-time 0.05)
return θ(k)(t) = d(k)θ(t)
dt(k)=θ(k1)(t+ ∆t)θ(k1)(t)
t[rad/sk][m/sk]
:apply-theta-to-robot tm [method]
apply θ(t) to robot.
:kin-target-coords-list [method]
Tkin-trg
m={pkin-trg
l,Rkin-trg
l}(l= 1,2,··· , Nkin ) (4.188)
return Tkin-trg := {Tkin-trg
1, T kin-trg
2,· · · , T kin-trg
Nkin }
:kin-attention-coords-list [method]
Tkin-att
m={pkin-att
l,Rkin-att
l}(l= 1,2,· · · , Nkin ) (4.189)
return Tkin-att := {Tkin-att
1, T kin-att
2,· · · , T kin -att
Nkin }
:kin-start-time [method]
return tkin
s:= tkin-tm
1
60
:kin-finish-time [method]
return tkin
f:= tkin-tm
Nkin
:motion-duration [method]
return (tkin-tm
Nkin tkin-tm
1)
:kinematics-task-value &key (update? t) [method]
ekin (q) = ekin (p,t) (4.190)
=
ekin
1(p,t)
ekin
2(p,t)
.
.
.
ekin
Nkin (p,t)
(4.191)
ekin
l(p,t) = pkin-trg
lpkin-att
l(p,t)
aRkin-trg
lRkin-att
l(p,t)TR6(l= 1,2,· · · , Nkin ) (4.192)
a(R)は姿勢行列 Rの等価角軸ベクトルを表す
return ekin (q)R6Nkin
:stationery-start-finish-task-value &key (update? t) [method]
estat (q) = estat (p,t) (4.193)
=
estat
sv (p,t)
estat
fv (p,t)
estat
sa (p,t)
estat
fa (p,t)
(4.194)
estat
sv (p,t) := ˙
θ(tkin
s) (4.195)
estat
fv (p,t) := ˙
θ(tkin
f) (4.196)
estat
sa (p,t) := ¨
θ(tkin
s) (4.197)
estat
fa (p,t) := ¨
θ(tkin
f) (4.198)
return estat (q)R4Njoint
:task-value &key (update? t) [method]
return e(q) := ekin (q)
kstat estat (q)R6Nkin +4Njoint
:kinematics-task-jacobian-with-control-vector [method]
(4.110) より,タスク関数 ekin を制御点 pで微分したヤコビ行列は次式で得られる.
ekin
p=
ekin
1
p
ekin
2
p
.
.
.
ekin
Nkin
p
(4.199)
ekin
l
p=Jkin-att (θ(tkin-tm
l))Bn(tkin-tm
l) (l= 1,2,· · · , Nkin ) (4.200)
61
return ekin
pR6Nkin ×Nctrl Njoint
:kinematics-task-jacobian-with-timing-vector [method]
(4.117) より,タスク関数 ekin をタイミング tで微分したヤコビ行列は次式で得られる.
ekin
t=
ekin
1
t
ekin
2
t
.
.
.
ekin
Nkin
t
(4.201)
ekin
l
ti番目の列ベクトル ekin
l
tiR6は次式で表される (i= 1,2,· · · , Ntm )
ekin
l
ti
=Jkin-att (θ(tkin-tm
l))P Dbn1(tkin-tm
l)tkin-tm
land tiis identical
0otherwise (4.202)
return ekin
tR6Nkin ×Ntm
:stationery-start-finish-task-jacobian-with-control-vector [method]
(4.130) , (4.131) , (4.132) , (4.133) より,タスク関数 estat を制御点 pで微分したヤコビ行
列は次式で得られる.
estat
p=
estat
sv
p
estat
f v
p
estat
sa
p
estat
f a
p
(4.203)
estat
sv (p,t)
p=Bn1(tkin
s)ˆ
D1(4.204)
estat
fv (p,t)
p=Bn1(tkin
f)ˆ
D1(4.205)
estat
sa (p,t)
p=Bn2(tkin
s)ˆ
D2(4.206)
estat
fa (p,t)
p=Bn2(tkin
f)ˆ
D2(4.207)
return estat
pR4Njoint ×Nctrl Njoint
:stationery-start-finish-task-jacobian-with-timing-vector [method]
(4.134) , (4.135) , (4.136) , (4.137) より,タスク関数 estat をタイミング tで微分したヤコ
ビ行列は次式で得られる.
estat
t=
estat
sv
t
estat
f v
t
estat
sa
t
estat
f a
t
(4.208)
62
estat
x
tiクトestat
x
tiRNjoint れる (x∈ {sv, fv, sa, fa}, i = 1,2,· · · , Ntm )
estat
sv (p,t)
ti
=P D2bn2(tkin
s)tkin
sand tiis identical
0otherwise (4.209)
estat
fv (p,t)
ti
=P D2bn2(tkin
f)tkin
fand tiis identical
0otherwise (4.210)
estat
sa (p,t)
ti
=P D3bn3(tkin
s)tkin
sand tiis identical
0otherwise (4.211)
estat
fa (p,t)
ti
=P D3bn3(tkin
f)tkin
fand tiis identical
0otherwise (4.212)
return estat
tR4Njoint ×Ntm
:task-jacobian [method]
e
q=
Nctrl Njoint Ntm
6Nkin ekin
pekin
t
4Njoint kstat estat
pkstat estat
t
(4.213)
return e
q=R(6Nkin +4Njoint )×(Nctrl Njoint +Ntm )
:theta-max-vector &key (update? nil) [method]
return θmax RNjoint
:theta-min-vector &key (update? nil) [method]
return θmin RNjoint
:theta-inequality-constraint-matrix &key (update? nil) [method]
(4.144) より,関節角度上下限制約は次式で表される.
ˆ
Eθmin p+ ∆pˆ
Eθmax (4.214)
I
Ipˆ
Eθmin p
ˆ
Eθmax +p(4.215)
Cθpdθ(4.216)
ただし,
ˆ
E:=
1Nctrl 0Nctrl
1Nctrl
...
0Nctrl 1Nctrl
RNctrl Njoint ×Njoint (4.217)
1Nctrl RNctrl は全要素が 1Nctrl 次元ベクトルである.
return Cθ:= I
IR2Nctrl Njoint ×Nctrl Njoint
:theta-inequality-constraint-vector &key (update? t) [method]
return dθ:= ˆ
Eθmin p
ˆ
Eθmax +pR2Nctrl Njoint
63
:velocity-max-vector &key (update? nil) [method]
return vmax RNjoint
:velocity-inequality-constraint-matrix &key (update? nil) [method]
(4.152) より,関節速度上下限制約は次式で表される.
ˆ
Evmax ˆ
D1(p+ ∆p)ˆ
Evmax (4.218)
ˆ
D1
ˆ
D1pˆ
Evmax ˆ
D1p
ˆ
Evmax +ˆ
D1p(4.219)
C˙
θpd˙
θ(4.220)
return C˙
θ:= ˆ
D1
ˆ
D1R2Nctrl Njoint ×Nctrl Njoint
:velocity-inequality-constraint-vector &key (update? t) [method]
return d˙
θ:= ˆ
Evmax ˆ
D1p
ˆ
Evmax +ˆ
D1pR2Nctrl Njoint
:acceleration-max-vector &key (update? nil) [method]
return amax RNjoint
:acceleration-inequality-constraint-matrix &key (update? nil) [method]
(4.154) より,関節加速度上下限制約は次式で表される.
ˆ
Eamax ˆ
D2(p+ ∆p)ˆ
Eamax (4.221)
ˆ
D2
ˆ
D2pˆ
Eamax ˆ
D2p
ˆ
Eamax +ˆ
D2p(4.222)
C¨
θpd¨
θ(4.223)
return C¨
θ:= ˆ
D2
ˆ
D2R2Nctrl Njoint ×Nctrl Njoint
:acceleration-inequality-constraint-vector &key (update? t) [method]
return d¨
θ:= ˆ
Eamax ˆ
D2p
ˆ
Eamax +ˆ
D2pR2Nctrl Njoint
:control-vector-inequality-constraint-matrix &key (update? nil) [method]
Cθpdθ
C˙
θpd˙
θ
C¨
θpd¨
θ
(4.224)
Cθ
C˙
θ
C¨
θ
p
dθ
d˙
θ
d¨
θ
(4.225)
Cppdp(4.226)
return Cp:=
Cθ
C˙
θ
C¨
θ
RNp-ineq ×dim(p)
:control-vector-inequality-constraint-vector &key (update? t) [method]
64
return dp:=
dθ
d˙
θ
d¨
θ
RNp-ineq
:timing-vector-inequality-constraint-matrix &key (update? nil) [method]
(4.159) より,タイミングが Bスプラインの初期,終端時刻の間に含まれる制約は次式で表される.
ts1t+ ∆ttf1(4.227)
I
Itts1t
tf1+t(4.228)
また,式 (4.165) より,タイミングの順序が入れ替わることを許容しない場合,その制約は次式で表さ
れる.
Dtm (t+ ∆t)0(4.229)
Dtm t≥ −Dtm t(4.230)
ただし,
Dtm =
1 1 O
1 1
...
O1 1
R(Ntm 1)×Ntm (4.231)
これらを合わせると,
I
I
Dtm
t
ts1t
tf1+t
Dtm t
Ctpdt(4.232)
return Ct:=
I
I
Dtm
R(3Ntm 1)×dim(t)
:timing-vector-inequality-constraint-vector &key (update? t) [method]
return dt:=
ts1t
tf1+t
Dtm t
R(3Ntm 1)
:config-inequality-constraint-matrix &key (update? nil) [method]
(update-collision? nil)
Cppdp
Cttdt
(4.233)
Cp
Ctp
tdp
dt(4.234)
Cqd(4.235)
return C:= Cp
CtRNineq ×dim(q)
65
:config-inequality-constraint-vector &key (update? t) [method]
(update-collision? nil)
return d:= dp
dtRNineq
:config-equality-constraint-matrix &key (update? nil) [method]
return AR0×dim(q)(no equality constraint)
:config-equality-constraint-vector &key (update? t) [method]
return bR0(no equality constraint)
:square-integration-regular-matrix &key (diff-order 1) [method]
(delta-time (/ (- finish-time start-time) 100.0))
(4.172) より,関節角微分の二乗積分は次式で得られる.
Fsqr,k(p) = tf
ts
θ(k)(t)
2dt (4.236)
=pTHsqr,kp(4.237)
ただし,
Hsqr,k=tf
tsBnk(t)ˆ
DkT
Bnk(t)ˆ
Dkdt (4.238)
=tf
ts
Dkbnk(t)Dkbnk(t)T
O
...
ODkbnk(t)Dkbnk(t)T
dt(4.239)
これは二次形式の正則化項である.
return Hsqr,kRdim(p)×dim(p)
:first-differential-square-integration-regular-matrix &key (delta-time (/ (- finish-time start-time)
100.0)) [method]
return Hsqr,1Rdim(p)×dim(p)
:second-differential-square-integration-regular-matrix &key (delta-time (/ (- finish-time start-time)
100.0)) [method]
return Hsqr,2Rdim(p)×dim(p)
:third-differential-square-integration-regular-matrix &key (delta-time (/ (- finish-time start-time)
100.0)) [method]
return Hsqr,3Rdim(p)×dim(p)
:control-vector-regular-matrix [method]
Wreg,p:= min(kmax ,p,e2+koff ,p)I+ksqr ,1Hsqr ,1+ksqr ,2Hsqr ,2+ksqr,3Hsqr ,3(4.240)
return Wreg,pRdim(p)×dim(p)
:control-vector-regular-vector [method]
66
vreg,p:= (ksqr ,1Hsqr ,1+ksqr ,2Hsqr ,2+ksqr,3Hsqr ,3)p(4.241)
return vreg,pRdim(p)
:motion-duration-regular-matrix [method]
(4.180) より,動作期間の二乗は次式で得られる.
Fduration (t) = |t1tNtm |2(4.242)
=tT
11
1 1
t(4.243)
=tTHduration t(4.244)
これは二次形式の正則化項である.
return Hduration Rdim (t)×dim(t)
:timing-vector-regular-matrix [method]
Wreg,t:= min(kmax ,t,e2+koff ,t)I+kduration Hduration (4.245)
return Wreg,tRdim(t)×dim(t)
:timing-vector-regular-vector [method]
vreg,t:= kduration Hduration t(4.246)
return vreg,tRdim(t)
:regular-matrix [method]
Wreg := Wreg,p
Wreg,t(4.247)
return Wreg Rdim(q)×dim(q)
:regular-vector [method]
vreg := vreg,p
vreg,t(4.248)
return vreg Rdim(q)×dim(q)
:update-collision-inequality-constraint [method]
Not implemented yet.
:update-viewer &key (trajectory-delta-time (/ (- finish-time start-time) 10.0)) [method]
Update viewer.
67
:print-status [method]
Print status.
:print-motion-information [method]
Print motion information.
:play-animation &key (robot) [method]
(delta-time (/ (- finish-time start-time) 100.0))
(only-motion-duration? t)
(loop? t)
(visualize-callback-func)
Print motion animation.
:plot-theta-graph &key (joint-id nil) [method]
(divide-num 200)
(plot-numerical? nil)
(only-motion-duration? t)
(dat-filename /tmp/bspline-configuration-task-plot-theta-graph.dat)
(dump-pdf? nil)
(dump-filename (ros::resolve-ros-path package://eus qp/optmotiongen/logs/bspline-configuration-task-graph.pdf))
Plot graph.
:generate-angle-vector-sequence &key (divide-num 100) [method]
Generate angle-vector-sequence.
get-bspline-knot i n m x min x max h [function]
ti=in
mn(tfts) + ts(4.249)
=hi +mtsntf
mn(4.250)
return knot tifor B-spline function
bspline-basis-func x i n m x min x max &optional (n-orig n) (m-orig m) [function]
bi,0(t) = 1 if tit < ti+1
0 otherwise (4.251)
bi,n(t) = (tti)bi,n1(t) + (ti+n+1 t)bi+1,n1(t)
nh (4.252)
return B-spline function value bi,n(t).
5補足
5.1 既存のロボット基礎クラスの拡張
joint [class]
68
:super propertied-object
:slots (parent-link)
(child-link)
(joint-angle)
(min-angle)
(max-angle)
(default-coords)
(joint-velocity)
(joint-acceleration)
(joint-torque)
(max-joint-velocity)
(max-joint-torque)
(joint-min-max-table)
(joint-min-max-target)
:child-link &rest args [method]
Returns child link of this joint. If any arguments is set, it is passed to the child-link.
Override to support the case that child-link is cascaded-link instantiate. Return the root link of child
cascaded-link instantiate in that case.
:axis-vector [method]
Return joint axis vector. Represented in world coordinates.
return aiR3
:pos [method]
Return joint position. Represented in world coordinates.
return piR3
bodyset-link [class]
:super bodyset
:slots (rot)
(pos)
(parent)
(descendants)
(worldcoords)
(manager)
(changed)
(geometry::bodies)
(joint)
(parent-link)
(child-links)
(analysis-level)
(default-coords)
(weight)
(acentroid)
69
(inertia-tensor)
(angular-velocity)
(angular-acceleration)
(spacial-velocity)
(spacial-acceleration)
(momentum-velocity)
(angular-momentum-velocity)
(momentum)
(angular-momentum)
(force)
(moment)
(ext-force)
(ext-moment)
:mg [method]
return mg =mg
:mg-vec [method]
return mg
cascaded-link [class]
:super cascaded-coords
:slots (rot)
(pos)
(parent)
(descendants)
(worldcoords)
(manager)
(changed)
(links)
(joint-list)
(bodies)
(collision-avoidance-links)
(end-coords-list)
:calc-jacobian-from-joint-list &key (union-joint-list) [method]
(move-target)
(joint-list (mapcar #’(lambda (mt) (send-all (send self :link-list (send mt :parent)) :joint)) move-target))
(transform-coords (mapcar #’(lambda (mt) (make-coords)) move-target))
(translation-axis (mapcar #’(lambda (mt) t) move-target))
(rotation-axis (mapcar #’(lambda (mt) t) move-target))
union-joint-list list of all joints considered in jacobian. column num of jacobian is same with length of
70
union-joint-list.
move-target list of move-target.
joint-list list of joint-list which is contained in each chain of move-target.
transform-coords list of transform-coords of each move-target.
translation-axis list of translation-axis of each move-target.
rotation-axis list of rotation-axis of each move-target.
Get jacobian matrix from following two information: (1) union-joint-list and (2) list of move-target.
One recession compared with :calc-jacobian-from-link-list is that child-reverse is not supported. (Only
not implemented yet because I do not need such feature in current application.)
:calc-cog-jacobian-from-joint-list &key (union-joint-list) [method]
(update-mass-properties t)
(translation-axis :z)
union-joint-list list of all joints considered in jacobian. column num of jacobian is same with length of
union-joint-list.
Get CoG jacobian matrix from union-joint-list.
:find-link-route to &optional from [method]
Override to support the case that joint does not exist between links. Change from (send to :parent-link)
to (send to :parent).
5.2 環境と接触するロボットの関節・リンク構造
2d-planar-contact [class]
:super cascaded-link
:slots ( contact-coords Tcnt )
( contact-pre-coords Tcnt -pre )
二次元平面上の長方形領域での接触座標を表す仮想の関節・リンク構造.
:init &key (name contact) [method]
(contact-pre-offset 100)
Initialize instance
:contact-coords &rest args [method]
return Tcnt := {pcnt ,Rcnt }
:contact-pre-coords &rest args [method]
return Tcnt-pre := {pcnt -pre ,Rcnt-pre }
:set-from-face &key (face) [method]
(margin 150.0)
set coords and min/max joint angle from face.
71
robot-environment [class]
:super cascaded-link
:slots ( robot R)
( robot-with-root-virtual ˆ
R)
( root-virtual-joint-list list of root virtual joint)
( contact-list {C1,C2,··· ,CNC})
( variant-joint-list Jvar )
( invariant-joint-list Jinvar )
( drive-joint-list Jdrive )
ロボットとロボット・環境間の接触のクラス.
以下を合わせた関節・リンク構造に関するメソッドが定義されている.
1. 浮遊ルートリンクのための仮想関節付きのロボットの関節
2. 接触位置を定める仮想関節
関節・リンク構造を定めるために,初期化時に以下を与える
robot Rロボット (cascaded-link クラスのインスタンス)
contact-list {C1,C2,· · · ,CNC}接触 (2d-planar-contact クラスなどのインスタンス)のリスト
ロボッRに,浮遊ルートリンクの変位に対応する仮想関節を付加した仮想関節付きロボッˆ
Rを内部
で保持する.
:init &key (robot) [method]
(contact-list)
(root-virtual-mode :6dof)
(root-virtual-joint-class-list)
(root-virtual-joint-axis-list)
Initialize instance
:dissoc-root-virtual [method]
dissoc root virtual parent/child structure.
:init-pose [method]
set zero joint angle.
:robot &rest args [method]
return R
:robot-with-root-virtual &rest args [method]
return ˆ
R
:contact-list &rest args [method]
return {C1,C2,· · · ,CNC}
:contact name &rest args [method]
return Ci
:variant-joint-list &optional (jl :nil) [method]
72
return Jvar
:invariant-joint-list &optional (jl :nil) [method]
return Jinvar
:drive-joint-list &optional (jl :nil) [method]
return Jdrive
:root-virtual-joint-list [method]
return list of root virtual joint
5.3 irteus inverse-kinematics 互換関数
cascaded-link [class]
:super cascaded-coords
:slots (rot)
(pos)
(parent)
(descendants)
(worldcoords)
(manager)
(changed)
(links)
(joint-list)
(bodies)
(collision-avoidance-links)
(end-coords-list)
:inverse-kinematics-optmotiongen target-coords &key (stop 50) [method]
(link-list)
(move-target)
(debug-view)
(revert-if-fail t)
(transform-coords target-coords)
(translation-axis (cond ((atom move-target) t) (t (make-list (length move-target) :initial-element t))))
(rotation-axis (cond ((atom move-target) t) (t (make-list (length move-target) :initial-element t))))
(thre (cond ((atom move-target) 1) (t (make-list (length move-target) :initial-element 1))))
(rthre (cond ((atom move-target) (deg2rad 1)) (t (make-list (length move-target) :initial-element (deg2rad 1)))))
(collision-avoidance-link-pair :nil)
(collision-distance-limit 10.0)
(obstacles)
(min-loop)
(root-virtual-mode :fix)
73
(joint-angle-margin 0.0)
(posture-joint-list)
(posture-joint-angle-list)
(target-posture-scale 0.001)
(norm-regular-scale-max 0.01)
(norm-regular-scale-offset 1.000000e-07)
(pre-process-func)
(post-process-func)
&allow-other-keys
Solve inverse kinematics problem with sqp optimization. ;; target-coords, move-target, rotation-axis,
translation-axis ;; -¿ both list and atom OK. target-coords : The coordinate of the target that returns
coordinates. Use a list of targets to solve the IK relative to multiple end links simultaneously. Function
is not available to target-coords. link-list : List of links to control. When the target-coords is list, this
should be a list of lists. move-target : Specify end-effector coordinate. When the target-coords is list,
this should be list too. stop : Maximum number for IK iteration. Default is 50. debug-view : Set t
to show debug message and visualization. Use :no-message to just show the irtview image. Default is
nil. revert-if-fail : Set nil to keep the angle posture of IK solve iteration. Default is t, which return
to original position when IK fails. translation-axis : :x :y :z for constraint along the x, y, z axis. :xy
:yz :zx for plane. Default is t. rotation-axis : Use nil for position only IK. :x, :y, :z for the constraint
around axis with plus direction. When the target-coords is list, this should be list too. Default is t.
thre : Threshold for position error to terminate IK iteration. Default is 1 [mm]. rthre : Threshold for
rotation error to terminate IK iteration. Default is 0.017453 [rad] (1 deg).
cascaded-link [class]
:super cascaded-coords
:slots (rot)
(pos)
(parent)
(descendants)
(worldcoords)
(manager)
(changed)
(links)
(joint-list)
(bodies)
(collision-avoidance-links)
(end-coords-list)
:inverse-kinematics-trajectory-optmotiongen target-coords-list &key (stop 50) [method]
(move-target-list)
(debug-view)
(revert-if-fail t)
(transform-coords-list :nil)
(translation-axis-list :nil)
74
(rotation-axis-list :nil)
(thre 1.0)
(rthre (deg2rad 1))
(thre-list :nil)
(rthre-list :nil)
(collision-avoidance-link-pair :nil)
(collision-distance-limit 10.0)
(obstacles)
(min-loop)
(root-virtual-mode :fix)
(root-virtual-joint-invariant? nil)
(joint-angle-margin 0.0)
(posture-joint-list (make-list (length target-coords-list) :initial-element nil))
(posture-joint-angle-list (make-list (length target-coords-list) :initial-element nil))
(norm-regular-scale-max 0.001)
(norm-regular-scale-offset 1.000000e-07)
(adjacent-regular-scale 0.0)
(pre-process-func)
(post-process-func)
&allow-other-keys
Solve inverse kinematics problem with sqp optimization. target-coords-list : The coordinate of the
target that returns coordinates. Use a list of targets to solve the IK relative to multiple end links
simultaneously. Function is not available to target-coords. move-target-list : Specify end-effector
coordinate. When the target-coords is list, this should be list too. stop : Maximum number for IK
iteration. Default is 50. debug-view : Set t to show debug message and visualization. Use :no-message
to just show the irtview image. Default is nil. revert-if-fail : Set nil to keep the angle posture of IK
solve iteration. Default is t, which return to original position when IK fails. translation-axis-list : :x :y
:z for constraint along the x, y, z axis. :xy :yz :zx for plane. Default is t. rotation-axis-list : Use nil for
position only IK. :x, :y, :z for the constraint around axis with plus direction. When the target-coords is
list, this should be list too. Default is t. thre : Threshold for position error to terminate IK iteration.
Default is 1 [mm]. rthre : Threshold for rotation error to terminate IK iteration. Default is 0.017453
[rad] (1 deg).
robot-model [class]
:super cascaded-link
:slots (rot)
(pos)
(parent)
(descendants)
(worldcoords)
(manager)
(changed)
(links)
(joint-list)
(bodies)
(collision-avoidance-links)
75
(end-coords-list)
(larm-end-coords)
(rarm-end-coords)
(lleg-end-coords)
(rleg-end-coords)
(head-end-coords)
(torso-end-coords)
(larm-root-link)
(rarm-root-link)
(lleg-root-link)
(rleg-root-link)
(head-root-link)
(torso-root-link)
(larm-collision-avoidance-links)
(rarm-collision-avoidance-links)
(larm)
(rarm)
(lleg)
(rleg)
(torso)
(head)
(force-sensors)
(imu-sensors)
(cameras)
(support-polygons)
:limb limb method &rest args [method]
Extend to support to call :inverse-kinematics-optmotiongen.
contact-ik-arg [class]
:super cascaded-link
:slots ( contact-coords Tcnt )
inverse-kinematics-optmotiongen target-coords, translation-axis, rotation-axis, transform-coords
数に対応する接触座標を表す仮想の関節・リンク構造.
:init &key (target-coords) [method]
(translation-axis)
(rotation-axis)
(transform-coords target-coords)
(name (send target-coords :name))
Initialize instance
:contact-coords &rest args [method]
76
return Tcnt := {pcnt ,Rcnt }
ik-arg-axis->axis-list ik-arg-axis [function]
Convert translation-axis / rotatoin-axis to axis list.
generate-contact-ik-arg-from-rect-face &key (rect-face) [function]
(name (send rect-face :name))
(margin (or (send rect-face :get :margin) 0))
Generate contact-ik-arg instance from rectangle face.
generate-contact-ik-arg-from-line-segment &key (line-seg) [function]
(name (send line-seg :name))
(margin (or (send line-seg :get :margin) 0))
Generate contact-ik-arg instance from line segment.
axis->index axis [function]
axis->sgn axis [function]
5.4 関節トルク勾配の計算
get-link-jacobian-for-contact-torque &key (robot) [function]
(drive-joint-list)
(contact-coords)
(contact-parent-link)
contact-coords に対応する接触部位の番号を mするcontact-coords の位置姿勢を rmR6drive-
joint-list の関節角度ベクトルを ψRNdrive-joint として,次式を満たすヤコビ行列 Jmを返す
˙rm=Jm˙
ψ(5.1)
=
Ndrive-joint
i=1
j(i)
m˙
ψi(5.2)
j(i)
m=aψi×(pmpψi)
aψi(5.3)
Jm=j(1)
mj(2)
m··· jNdrive-joint
m(5.4)
aψi,pψiR3i番目の関節の回転軸ベクトルと位置である.
return JmR6×Ndrive-joint
get-contact-torque &key (robot) [function]
(drive-joint-list)
(wrench-list)
(contact-target-coords-list)
(contact-attention-coords-list)
ロボットの接触部位に加わる接触レンチによって生じる関節トルク τcnt は,以下で得られる.
τcnt =
Ncnt
m=1
JT
mwm(5.5)
wmm番目の接触部位で受ける接触レンチである.
return τcnt RNdrive-joint
77
get-contact-torque-jacobian &key (robot) [function]
(joint-list)
(drive-joint-list)
(wrench-list)
(contact-target-coords-list)
(contact-attention-coords-list)
(5.4) Jmを以下のように分解して利用する.
Jm=
jT
x,m
jT
y,m
jT
z,m
jT
R,m
jT
P,m
jT
Y,m
=
rx,m
ψT
ry,m
ψT
rz,m
ψT
rR,m
ψT
rP,m
ψT
rY,m
ψT
(5.6)
これを式 (5.5) に代入すると,
τcnt =
Ncnt
m=1
JT
mwm(5.7)
=
Ncnt
m=1 jx,m jy,m jz,m jR,m jP,m jY,m
fx,m
fy,m
fz,m
nx,m
ny,m
nz,m
(5.8)
=
Ncnt
m=1 jx,mfx,m +jy,mfy,m +jz,mfz,m +jR,mnx,m +jP,mny,m +jY,mnz,m(5.9)
=
Ncnt
m=1 rx,m
ψfx,m +ry,m
ψfy,m +rz,m
ψfz,m +rR,m
ψnx,m +rP,m
ψny,m +rY,m
ψnz,m
(5.10)
joint-list の関節角度ベクトルを θRNjoint drive-joint-list の関節角度ベクトルを ψRNdrive-joint とす
る.トルク勾配行列 τcnt
θは次式で得られる.
τcnt
θ=
Ncnt
m=1 Jm
θT
wm(5.11)
=
Ncnt
m=1 fx,m
2rx,m
ψθ+fy,m
2ry,m
ψθ+fz,m
2rz,m
ψθ+nx,m
2rR,m
ψθ+ny,m
2rP,m
ψθ+nz,m
2rY,m
ψθ
(5.12)
=
M
m=1 fx,m fy,m fz,m nx,m ny,m nz,m
2rx,m
ψiθj
2ry,m
ψiθj
2rz,m
ψiθj
2rR,m
ψiθj
2rP,m
ψiθj
2rY,m
ψiθj
i=1,··· ,Ndrive-joint ,j=1,··· ,Njoint
(5.13)
return τcnt
θRNdrive-joint ×Njoint
78
get-link-jacobian-for-gravity-torque &key (robot) [function]
(drive-joint-list)
(gravity-link)
gravity-link のリンク番号を kとする.gravity-link の重心位置を pcog,kR3drive-joint-list の関節角
度ベクトルを ψRNdrive-joint として,次式を満たすヤコビ行列 Jcog,kを返す
˙pcog ,k=Jcog ,k˙
ψ(5.14)
=
Nk
i=1
j(i)
cog,k˙
ψi(5.15)
j(i)
cog,k=aψi×(pcog ,kpψi) (1 iNk)
03(Nk+ 1 iNdrive-joint )(5.16)
aψi,pψiR3i番目の関節の回転軸ベクトルと位置である.gravity-link よりもルート側にある関節の
番号を 1,· · · , Nkgravity-link よりも末端側にある関節の番号を Nk+ 1,· · · , Ndrive-joint とする.リ
クの重心位置と関節角度の依存関係から,ヤコビ行列の右には次式のように零ベクトルが並ぶ.
Jcog,k=j(1)
cog,k· · · j(Nk)
cog,kj(Nk+1)
cog,k· · · jNdrive-joint
cog,k(5.17)
=j(1)
cog,k· · · j(Nk)
cog,k0· · · 0(5.18)
return Jcog,kR3×Ndrive -joint
get-gravity-torque &key (robot) [function]
(drive-joint-list)
(gravity-link-list)
ロボットのリンク自重によって生じる関節トルク τgrav は,ロボットモーション P111 (3.3.22) より以
下で得られる.
τgrav =
Ngravity-link
k=1
mkJT
cog,k
g(5.19)
mkk番目のリンクの質量である.
return τgrav RNdrive -joint
get-gravity-torque-jacobian &key (robot) [function]
(joint-list)
(drive-joint-list)
(gravity-link-list)
(5.18) Jcog,kを以下のように分解して利用する.
Jcog,k=
jT
cog,x,k
jT
cog,y,k
jT
cog,z,k
=
pcog ,x,k
ψT
pcog ,y,k
ψT
pcog ,z,k
ψT
(5.20)
79
これを式 (5.19) に代入すると,
τgrav =
Ngravity-link
k=1
mkJT
cog,k
g(5.21)
=
Ngravity-link
k=1
mkjcog,x,kjcog ,y,kjcog,z,k
0
0
g
(5.22)
=
Ngravity-link
k=1
mkgjcog,z,k(5.23)
=
Ngravity-link
k=1
mkgpcog,z,k
ψ(5.24)
joint-list の関節角度ベクトルを θRNjoint drive-joint-list の関節角度ベクトルを ψRNdrive-joint とす
る.トルク勾配行列 τgrav
θは次式で得られる.これは対称行列である.
τgrav
θ=
Ngravity-link
k=1
mkg2pcog,z,k
ψθ(5.25)
2pcog,z,k
ψθ=2pcog,z,k
ψiθji=1,··· ,Ndrive-joint ,j=1,··· ,Njoint
(5.26)
つまり
τgrav
θ=
Ngravity-link
k=1
mkg2pcog,z,k
ψiθj
i=1,··· ,Ndrive-joint ,j=1,··· ,Njoint
(5.27)
return τgrav
θRNdrive-joint ×Njoint

Navigation menu