Open r-tanaka3 opened 7 months ago
:init
と:init-ending
で行っている処理の逆を行えば、cascaded-linkのjoint-listやlinksの要素を削除することは可能です。
https://github.com/euslisp/jskeus/blob/69be3cf1e6881309d0fbbd9beb0e2fdb6c975b89/irteus/irtmodel.l#L790-L802
次のようにすれば、:dissocしたリンクl3が元の位置に戻らなくなります。
(defun take-out-tray nil
(let (r l)
(setq r (instance fridge :init))
(objects (list r))
(dotimes (i 45)
(send r :angle-vector (float-vector i 0))
(send *irtviewer* :draw-objects)
(x::window-main-one))
(dotimes (i 40)
(send r :angle-vector (float-vector 45 (- 0 i)))
(send *irtviewer* :draw-objects)
(x::window-main-one))
(dotimes (i 40)
(send r :angle-vector (float-vector 45 (+ -40 i)))
(send *irtviewer* :draw-objects)
(x::window-main-one))
(setq l (elt (send r :links) 2))
(send (send l :parent) :dissoc l)
(delete (send l :joint) (send r :joint-list))
(send l :del-joint)
(send (send l :parent-link) :del-child-link l)
(send l :del-parent-link)
(delete l (send r :links))
(dotimes (i 15)
(send l :locate #f(0 0 1))
(send *irtviewer* :draw-objects)
(x::window-main-one))
(dotimes (i 45)
(send r :angle-vector (float-vector (- 45 i) 0))
(send *irtviewer* :draw-objects)
(x::window-main-one))
))
ただ、cascaded-linkのjoint-listやlinksの要素を追加・削除することはあまり想定されておらず、容易に操作できるようにはなっていないため、初めからl3をcascaded-linkとは別に定義しておいて、:assoc
/:dissoc
のみでfridgeと接続・非接続を切り替えるようにするのが簡単と思います。
できるようになりました。ありがとうございます。
cascaded-linkでは、joint-listやlinksを:init以外で追加したり、削除したりすることは可能でしょうか。 具体的には、以下のコードで、(send (send (car (cdr (cdr (send r :links)))) :parent) :dissoc (car (cdr (cdr (send r :links)))))で:dissocしたリンクl3を、:locateで移動させた後、l3をそこに残したまま残りのリンクl2だけを動かしたいです。現状では、:dissocと:locateまでは期待通りの動きができるのですが、その後に(send r :angle-vector (float-vector (- 45 i) 0))としたときに:dissocしたリンクl3が元の位置に戻ってしまいます。