cascaded-coordsクラスでは
前者はリンクを引数として,ルートリンクからこのリンクまでの経路を計算し, リンクのリストとして返す.後者はこのリンクのリストを引数とし, move-target座標系をに対するヤコビアンを計算する.
concatenate result-type a bは a bを 連結しresult-type型に変換し返し,scale a b はベクトルbの全ての要素をス カラーa倍し,matrix-logは行列対数関数を計算する.
(if (not (boundp '*irtviewer*)) (make-irtviewer))
(load "irteus/demo/sample-arm-model.l")
(setq *sarm* (instance sarmclass :init))
(send *sarm* :reset-pose)
(setq *target* (make-coords :pos #f(350 200 400)))
(objects (list *sarm* *target*))
(do-until-key
;; step 3
(setq c (send *sarm* :end-coords))
(send c :draw-on :flush t)
;; step 4
;; step 4
(setq dp (scale 0.001 (v- (send *target* :worldpos) (send c :worldpos))) ;; mm->m
dw (matrix-log (m* (transpose (send c :worldrot)) (send *target* :worldrot))))
(format t "dp = ~7,3f ~7,3f ~7,3f, dw = ~7,3f ~7,3f ~7,3f~%"
(elt dp 0) (elt dp 1) (elt dp 2)
(elt dw 0) (elt dw 1) (elt dw 2))
;; step 5
(when (< (+ (norm dp) (norm dw)) 0.01) (return))
;; step 6
(setq ll (send *sarm* :link-list (send *sarm* :end-coords :parent)))
(setq j (send *sarm* :calc-jacobian-from-link-list
ll :move-target (send *sarm* :end-coords)
:trnaslation-axis t :rotation-axis t))
(setq q (scale 1.0 (transform (pseudo-inverse j) (concatenate float-vector dp dw))))
;; step 7
(dotimes (i (length ll))
(send (send (elt ll i) :joint) :joint-angle (elt q i) :relative t))
;; draw
(send *irtviewer* :draw-objects)
(x::window-main-one))
実際のプログラミングでは:inverse-kinematicsというメソッドが用意されて おり,ここでは特異点や関節リミットの回避,あるいは自己衝突回避等の機能 が追加されている.