Skip to content

Commit 01e4c5f

Browse files
authored
Merge pull request #596 from k-okada/fix_minjerk_vel_acc
fix minjerk interpolation sometimes returns large acceleration
2 parents 90cece3 + 602907e commit 01e4c5f

File tree

2 files changed

+133
-12
lines changed

2 files changed

+133
-12
lines changed

irteus/irtutil.l

+11-4
Original file line numberDiff line numberDiff line change
@@ -294,11 +294,18 @@
294294
(setq position (send self :interpolation))
295295
(incf time dt)
296296
(setq segment-time (- time (if (= segment 0) 0 (nth (1- segment) time-list))))
297-
(when (> time (nth segment time-list))
298-
(setq segment-time (- time (nth segment time-list)))
299-
(incf segment))
297+
(when (eps> time (nth segment time-list) (* 0.1 dt))
298+
;; if time-segment is not aligned, need to fix the data (see https://github.com/jsk-ros-pkg/jsk_pr2eus/issues/457)
299+
(while (and (< segment segment-num) (eps> time (nth segment time-list) (* 0.1 dt)))
300+
(setq segment-time (- time (nth segment time-list)))
301+
(incf segment)))
300302
(when (>= segment segment-num)
301-
(setq position (car (last position-list)))
303+
;; adjust time and segment-time to exact position
304+
(setq segment (1- segment-num))
305+
(setq time (car (last time-list)))
306+
(setq segment-time (- time (if (= segment 0) 0 (nth (1- segment) time-list))))
307+
;; re-calculate :interpolation
308+
(setq position (send self :interpolation))
302309
(send self :reset))
303310
position))
304311
)

irteus/test/interpolator.l

+122-8
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,46 @@
5757
((:interpolator ip) (instance interpolator-class :init))
5858
(initial-time 0.0) (neglect-first) (vel-vector-list) (acc-vector-list))
5959
(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)
6094
(send* ip :reset
6195
:position-list pos-list
6296
: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
6397
(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))))
66100
(send ip :start-interpolation)
67101
(while (send ip :interpolatingp)
68102
(push (if (send ip :interpolatingp)
@@ -73,6 +107,12 @@
73107
(if (find-method ip :velocity) (push (send ip :velocity) vel-data-list))
74108
(if (find-method ip :acceleration) (push (send ip :acceleration) acc-data-list))
75109
)
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)))
76116
(append
77117
(list :data (if neglect-first (cdr (reverse data-list)) (reverse data-list))
78118
:time (if neglect-first (cdr (reverse tm-list)) (reverse tm-list)))
@@ -99,12 +139,15 @@
99139
ip)))
100140
))
101141
(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+
))
108151

109152
;; check velocitiy
110153
(when (assoc :velocity (send ip-class :methods))
@@ -137,12 +180,83 @@
137180
(< (reduce #'(lambda (x y) (max x y)) ret-list2) (+ 90 *epsilon*))))
138181
))
139182

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+
140242
(deftest test-linear-interpolator ()
141243
(let ((res (test-interpolators linear-interpolator)))))
142244

143245
(deftest test-minjerk-absolute-interpolator ()
144246
(let ((res (test-interpolators minjerk-interpolator)))))
145247

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+
146260

147261
#|
148262
(load "~/prog/euslib/jsk/gnuplotlib.l")

0 commit comments

Comments
 (0)