(require 'manipulator "robot/manipulator") (load "sarmmodel.l") (defjoint sarm0 :shape sarm-b0 :color 3 ) (defjoint sarm1 :shape sarm-b1 :color 3 :parent sarm0 :axis :z :offset (make-coords :pos (float-vector 0 0 0)) :high-limit (deg2rad 85) :low-limit (deg2rad -85) ) (defjoint sarm2 :shape sarm-b2 :color 4 :parent sarm1 :axis :z :offset (make-coords :pos #f(0 0 310) :rot (m* (rotation-matrix pi/2 :y) (rotation-matrix -pi/2 :x))) :low-limit (deg2rad -120) :high-limit (deg2rad -30) ) (defjoint sarm3 :shape sarm-b3 :color 4 :parent sarm2 :axis :z :offset (make-coords :pos #f(0 -300 0) :rot (rotation-matrix -pi/2 :z)) :low-limit (deg2rad -30) :high-limit (deg2rad 60) ) (defjoint sarm4 :shape sarm-b4 :color 4 :parent sarm3 :axis :z :offset (make-coords :pos #f(0 0 0) :rot (rotation-matrix -pi/2 :x)) :low-limit (deg2rad -165) :high-limit (deg2rad 165) ) (defjoint sarm5 :shape sarm-b5 :color 4 :parent sarm4 :axis :z :offset (make-coords :pos #f(0 0 400) :rot (rotation-matrix pi/2 :x) ) :low-limit (deg2rad -90) :high-limit (deg2rad 90) ) (defjoint sarm6 :shape sarm-b6 :color 1 :parent sarm5 :axis :z :offset (make-coords :pos #f(0 0 0) :rot (rotation-matrix -pi/2 :x)) :low-limit (deg2rad -180) :high-limit(deg2rad 180) ) (defjoint sarm7 :shape sarm-fr :color 2 :parent sarm6 :offset (make-coords :pos #f(0 0 140)) ) (defjoint sarm8 :shape sarm-fl :color 2 :parent sarm6 :offset (make-coords :pos #f(0 0 140)) ) (defclass sarmclass :super manipulator) (defmethod sarmclass (:park () (send self :config (float-vector 0 #d-90 0 0 0 0)) (send self :set-coords)) (:armsol (&optional (c (send self :handcoords))) (let* ( (cc (send c :copy-worldcoords)) (h-1 (make-coords :pos #f(0 0 -140) :rot (rotation-matrix pi/2 :z))) (s (send self :shoulder :worldpos)) (u6 (send cc :transform h-1)) (w (send u6 :worldpos)) (r6 (send u6 :worldrot)) (l0 (elt s 2)) (l1 300) (l2 400) (wx (elt w 0)) (wy (elt w 1)) (wz (elt w 2)) (d (distance w s)) phi3 phi2 phi1 psi2 th1 th2 th3 th4 th5 th6 u3 u4 u5 u5z u3x u3y u3z (u6x (matrix-column r6 0)) (u6y (matrix-column r6 1)) (u6z (matrix-column r6 2)) ) (setq phi3 (acos (/ (- (* d d) (* l1 l1) (* l2 l2)) (* 2 l1 l2)))) (setq psi2 (atan (* l2 (sin phi3)) (+ l1 (* (cos phi3) l2)))) (setq phi2 (atan (- wz l0) (sqrt (+ (* wx wx) (* wy wy))))) (setq phi1 (atan wy wx)) (setq th1 phi1) (setq th2 (- (+ psi2 phi2))) (setq th3 (- phi3 pi/2)) ;; (send (elt joints 0) :orient-axis th1) (send (elt joints 1) :orient-axis th2) (send (elt joints 2) :orient-axis th3) (setq u3 (send (elt joints 2) :worldrot)) (setq u3x (matrix-column u3 0)) (setq u3y (matrix-column u3 1)) (setq u3z (matrix-column u3 2)) ;; (setq th5 (- (acos (v. u3x u6z)) pi/2)) (setq th5 (acos (v. u3y u6z))) (if (< (v. u6x u3y) 0) (setq th5 (- th5))) (cond ((> th5 0) (setq th4 (atan (v. u3z u6z) (- (v. u3x u6z)))) (setq th6 (atan (- (v. u3y u6y)) (v. u3y u6x)))) (t (setq th4 (atan (- (v. u3z u6z)) (v. u3x u6z))) (setq th6 (atan (v. u3y u6y) (- (v. u3y u6x)))))) (setq newangles (float-vector th1 th2 th3 th4 th5 th6)) (send self :config newangles) (send self :set-coords) newangles) ) (:handpos nil (send (send self :handcoords) :worldpos)) (:handrot nil (send (send self :handcoords) :worldrot)) (:shoulder (&rest args) (if args (send* (elt joints 1) args) (elt joints 1)) ) (:elbow (&rest args) (if args (send* (elt joints 2) args) (elt joints 2)) ) (:wrist (&rest args) (if args (send* (elt joints 4) args) (elt joints 4)) ) ) (defmanipulator sarm :class sarmclass :base sarm0 :joints (list sarm1 sarm2 sarm3 sarm4 sarm5 sarm6) :hand sarm6 :left-finger sarm7 :right-finger sarm8 :handcoords (make-coords :pos #f(0 0 140) :rot (rotation-matrix -pi/2 :z)) :lefty nil :toolcoords (coords :pos #f(0 0 0)) :open-direction #f(0 -1 0) ) (send sarm :act t) (send sarm :park) (send sarm :open-fingers 30)