|
57 | 57 | ((:interpolator ip) (instance interpolator-class :init))
|
58 | 58 | (initial-time 0.0) (neglect-first) (vel-vector-list) (acc-vector-list))
|
59 | 59 | (let* ((data-list) (tm-list) (vel-data-list) (acc-data-list))
|
| 60 | + (assert (= (length pos-list) (1+ (length time-list))) |
| 61 | + (format nil "check length of pos-list(~A) and tm-list(~A)" |
| 62 | + (length pos-list) (length time-list))) |
| 63 | + (setq vel-vector-list |
| 64 | + (reverse |
| 65 | + (do ((i 0 (1+ i)) (vel-list)) |
| 66 | + ((> i (length time-list)) vel-list) |
| 67 | + (if (or (= i 0) (= i (length time-list))) |
| 68 | + (push (instantiate float-vector (length (car pos-list))) vel-list) |
| 69 | + (let* ((v0 (scale (/ 1.0 (elt time-list (1- i))) |
| 70 | + (v- (elt pos-list i) (elt pos-list (1- i))))) |
| 71 | + (v1 (scale (/ 1.0 (elt time-list i)) |
| 72 | + (v- (elt pos-list (1+ i)) (elt pos-list i)))) |
| 73 | + (v (scale 0.5 (v+ v0 v1)))) |
| 74 | + (dotimes (i (length v)) (if (< (* (elt v0 i) (elt v1 i)) 0) (setf (elt v i) 0))) |
| 75 | + (push v vel-list)))))) |
| 76 | + (setq acc-vector-list |
| 77 | + (reverse |
| 78 | + (do ((i 0 (1+ i)) (acc-list)) |
| 79 | + ((> i (length time-list)) acc-list) |
| 80 | + (if (or (= i 0) (= i (length time-list))) |
| 81 | + (push (instantiate float-vector (length (car vel-vector-list))) acc-list) |
| 82 | + (let* ((v0 (scale (/ 1.0 (elt time-list (1- i))) |
| 83 | + (v- (elt vel-vector-list i) (elt vel-vector-list (1- i))))) |
| 84 | + (v1 (scale (/ 1.0 (elt time-list i)) |
| 85 | + (v- (elt vel-vector-list (1+ i)) (elt vel-vector-list i)))) |
| 86 | + (v (scale 0.5 (v+ v0 v1)))) |
| 87 | + (dotimes (i (length v)) (if (< (* (elt v0 i) (elt v1 i)) 0) (setf (elt v i) 0))) |
| 88 | + (push v acc-list)))))) |
| 89 | + (format t "=INPUT~%") |
| 90 | + (format t "time ~A~%" time-list) |
| 91 | + (format t " pos ~A~%" pos-list) |
| 92 | + (format t " vel ~A~%" vel-vector-list) |
| 93 | + (format t " acc ~A~%" acc-vector-list) |
60 | 94 | (send* ip :reset
|
61 | 95 | :position-list pos-list
|
62 | 96 | :time-list (let (r) (dolist (n time-list) (push (+ n (if r (car r) 0)) r)) (nreverse r)) ;; list of time[sec] from start for each control point
|
63 | 97 | (append
|
64 |
| - (if vel-vector-list (list :vel-vector-list vel-vector-list)) |
65 |
| - (if acc-vector-list (list :acc-vector-list acc-vector-list)))) |
| 98 | + (if vel-vector-list (list :velocity-list vel-vector-list)) |
| 99 | + (if acc-vector-list (list :acceleration-list acc-vector-list)))) |
66 | 100 | (send ip :start-interpolation)
|
67 | 101 | (while (send ip :interpolatingp)
|
68 | 102 | (push (if (send ip :interpolatingp)
|
|
73 | 107 | (if (find-method ip :velocity) (push (send ip :velocity) vel-data-list))
|
74 | 108 | (if (find-method ip :acceleration) (push (send ip :acceleration) acc-data-list))
|
75 | 109 | )
|
| 110 | + (format t "=OUTPUT~%") |
| 111 | + (if (and vel-data-list acc-data-list) |
| 112 | + (mapcar #'(lambda (tm pos vel acc) |
| 113 | + (format t "~7,5f ~7,3f ~13,1f ~13,1f~%" |
| 114 | + tm (elt pos 0) (elt vel 0) (elt acc 0))) |
| 115 | + (reverse tm-list) (reverse data-list) (reverse vel-data-list) (reverse acc-data-list))) |
76 | 116 | (append
|
77 | 117 | (list :data (if neglect-first (cdr (reverse data-list)) (reverse data-list))
|
78 | 118 | :time (if neglect-first (cdr (reverse tm-list)) (reverse tm-list)))
|
|
99 | 139 | ip)))
|
100 | 140 | ))
|
101 | 141 | (ret-list2 (mapcar #'(lambda (x) (elt x 0)) (cadr (memq :data ret-list)))))
|
102 |
| - ;; (unless (or (null x::*display*) (= x::*display* 0)) |
103 |
| - ;; (graph-view |
104 |
| - ;; (list ret-list2) |
105 |
| - ;; (cadr (memq :time ret-list)) |
106 |
| - ;; :title (format nil "~A interpolator" (send ip-class :name)) |
107 |
| - ;; :xlabel "time [s]" :keylist (list ""))) |
| 142 | + (when (and (not (or (null x::*display*) (= x::*display* 0))) |
| 143 | + (functionp 'graph-view)) |
| 144 | + (let ((r-pos (mapcar #'(lambda (x) (elt x 0)) (cadr (memq :data ret-list)))) |
| 145 | + (r-vel (mapcar #'(lambda (x) (* 10 (elt x 0))) (cadr (memq :velocity ret-list)))) |
| 146 | + (r-acc (mapcar #'(lambda (x) (* 100 (elt x 0))) (cadr (memq :acceleration ret-list))))) |
| 147 | + (graph-view (list r-pos r-vel r-acc) (cadr (memq :time ret-list)) |
| 148 | + :keylist (list "position" "velocity" "acceleration") |
| 149 | + :mode "linespoints") |
| 150 | + )) |
108 | 151 |
|
109 | 152 | ;; check velocitiy
|
110 | 153 | (when (assoc :velocity (send ip-class :methods))
|
|
137 | 180 | (< (reduce #'(lambda (x y) (max x y)) ret-list2) (+ 90 *epsilon*))))
|
138 | 181 | ))
|
139 | 182 |
|
| 183 | +;; https://github.com/jsk-ros-pkg/jsk_pr2eus/issues/457 |
| 184 | +(defun test-interpolators-457 |
| 185 | + (&optional (ip-class linear-interpolator) (dt 0.0001)) |
| 186 | + (let* ((ret-list |
| 187 | + (pos-list-interpolation |
| 188 | + (list #f(0) #f(1) #f(2) #f(3) #f(4) #f(5) #f(6) #f(7) #f(8) #f(9)) |
| 189 | + (list 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001) |
| 190 | + dt |
| 191 | + :interpolator-class ip-class |
| 192 | + ))) |
| 193 | + ;; check velocitiy |
| 194 | + (let ((position (cadr (memq :data ret-list))) |
| 195 | + (velocity (cadr (memq :velocity ret-list))) |
| 196 | + real-vel calc-vel) |
| 197 | + ;; check first and last velocity |
| 198 | + (assert (eps= (norm (car velocity)) 0.0 (if (memq :word-size=64 *features*) *epsilon* 100)) |
| 199 | + (format nil "vel:~A~%" (car velocity))) |
| 200 | + (assert (eps= (norm (car (last velocity))) 0.0 (if (memq :word-size=64 *features*) *epsilon* 100)) |
| 201 | + (format nil "vel:~A~%" (car (last velocity)))) |
| 202 | + ;; check velocity of stable region |
| 203 | + (dotimes (i (1- (length position))) |
| 204 | + (when (and (> i (max 2 (* 0.3 (length position)))) |
| 205 | + (< i (min (- (length position) 3) (* 0.7 (length position))))) |
| 206 | + (setq real-vel (scale (/ 1.0 dt) (v- (elt position (1+ i)) (elt position i))) |
| 207 | + calc-vel (elt velocity i)) |
| 208 | + (assert (eps= (norm (v- real-vel calc-vel)) 0 (if (memq :word-size=64 *features*) *epsilon* 100)) |
| 209 | + (format nil "~A pos: ~A, vel:~A, vel:~A, diff:~A~%" i (elt position i) real-vel calc-vel (norm (v- real-vel calc-vel))))))) |
| 210 | + |
| 211 | + ;; check acceleration |
| 212 | + (let ((velocity (cadr (memq :velocity ret-list))) |
| 213 | + (acceleration (cadr (memq :acceleration ret-list))) |
| 214 | + real-acc calc-acc) |
| 215 | + ;; check first and last acceleration |
| 216 | + (assert (eps= (norm (car acceleration)) 0.0 (if (memq :word-size=64 *features*) *epsilon* 100)) |
| 217 | + (format nil "acc:~A~%" (car acceleration))) |
| 218 | + (assert (eps= (norm (car (last acceleration))) 0.0 (if (memq :word-size=64 *features*) *epsilon* 100)) |
| 219 | + (format nil "acc:~A~%" (car (last acceleration)))) |
| 220 | + ;; check maximum acceleration |
| 221 | + (dotimes (i (1- (length velocity))) |
| 222 | + (when (and (> i (max 2 (* 0.3 (length velocity)))) |
| 223 | + (< i (min (- (length velocity) 3) (* 0.7 (length velocity))))) |
| 224 | + (setq real-acc (scale (/ 1.0 dt) (v- (elt velocity (1+ i)) (elt velocity i))) |
| 225 | + calc-acc (elt acceleration i)) |
| 226 | + (assert (eps= (norm (v- real-acc calc-acc)) 0 (if (memq :word-size=64 *features*) *epsilon* 100)) |
| 227 | + (format nil "~A vel: ~A, acc:~A, acc:~A, diff:~A~%" i (elt velocity i) real-acc calc-acc (norm (v- real-acc calc-acc))))) |
| 228 | + )) |
| 229 | + |
| 230 | + (when (and (not (or (null x::*display*) (= x::*display* 0))) |
| 231 | + (functionp 'graph-view)) |
| 232 | + (let ((r-pos (mapcar #'(lambda (x) (elt x 0)) (cadr (memq :data ret-list)))) |
| 233 | + (r-vel (mapcar #'(lambda (x) (* 0.001 (elt x 0))) (cadr (memq :velocity ret-list)))) |
| 234 | + (r-acc (mapcar #'(lambda (x) (* 0.000001 (elt x 0))) (cadr (memq :acceleration ret-list))))) |
| 235 | + (graph-view (list r-pos r-vel r-acc) (cadr (memq :time ret-list)) |
| 236 | + :keylist (list "position" "velocity" "acceleration") |
| 237 | + :mode "linespoints") |
| 238 | + (unix:usleep (* 500 1000)) |
| 239 | + )) |
| 240 | + )) |
| 241 | + |
140 | 242 | (deftest test-linear-interpolator ()
|
141 | 243 | (let ((res (test-interpolators linear-interpolator)))))
|
142 | 244 |
|
143 | 245 | (deftest test-minjerk-absolute-interpolator ()
|
144 | 246 | (let ((res (test-interpolators minjerk-interpolator)))))
|
145 | 247 |
|
| 248 | +(deftest test-minjerk-absolute-interpolator-457 () |
| 249 | + (let ((res (test-interpolators-457 minjerk-interpolator))))) |
| 250 | + |
| 251 | +(deftest test-minjerk-absolute-interpolator-457-00013 () |
| 252 | + (let ((res (test-interpolators-457 minjerk-interpolator 0.00013))))) |
| 253 | + |
| 254 | +(deftest test-minjerk-absolute-interpolator-457-0013 () |
| 255 | + (let ((res (test-interpolators-457 minjerk-interpolator 0.0013))))) |
| 256 | + |
| 257 | +(deftest test-minjerk-absolute-interpolator-457-0005 () |
| 258 | + (let ((res (test-interpolators-457 minjerk-interpolator 0.0005))))) |
| 259 | + |
146 | 260 |
|
147 | 261 | #|
|
148 | 262 | (load "~/prog/euslib/jsk/gnuplotlib.l")
|
|
0 commit comments