|
15 | 15 | :super baxter-interface
|
16 | 16 | :slots (rarm-pressure-threshold-
|
17 | 17 | larm-pressure-threshold-
|
| 18 | + proximity-threshold- |
18 | 19 | right-hand-action-
|
19 | 20 | pressure-
|
20 | 21 | finger-flex-
|
21 | 22 | finger-load-
|
22 |
| - prismatic-load-)) |
| 23 | + prismatic-load- |
| 24 | + proximities- |
| 25 | + proximity-init-values-)) |
23 | 26 |
|
24 | 27 | (defmethod jsk_arc2017_baxter::baxter-interface
|
25 | 28 | (:init
|
|
72 | 75 | (setq finger-flex- (make-hash-table))
|
73 | 76 | (setq prismatic-load- (make-hash-table))
|
74 | 77 | (setq prismatic-vel- (make-hash-table))
|
| 78 | + (setq proximities- (make-hash-table)) |
| 79 | + (setq proximity-init-values- (make-hash-table)) |
75 | 80 | (dolist (arm (list :rarm :larm))
|
76 | 81 | (ros::subscribe (format nil "/gripper_front/limb/~a/pressure/state" (arm2str arm))
|
77 | 82 | std_msgs::Float64
|
|
87 | 92 | dynamixel_msgs::JointState
|
88 | 93 | #'send self :set-prismatic-state arm
|
89 | 94 | :groupname groupname)
|
| 95 | + (ros::subscribe (format nil "/gripper_front/limb/~a/proximity_array" |
| 96 | + (arm2str arm)) |
| 97 | + force_proximity_ros::ProximityArray |
| 98 | + #'send self :set-proximities arm |
| 99 | + :groupname groupname) |
90 | 100 | (sethash arm finger-flex- (make-hash-table))
|
| 101 | + (sethash arm proximity-init-values- (make-hash-table)) |
91 | 102 | (dolist (side (list :right :left))
|
92 | 103 | (ros::subscribe (format nil "/gripper_front/limb/~a/flex/~a/state"
|
93 | 104 | (arm2str arm) (symbol2str side))
|
|
153 | 164 | (:set-finger-flex
|
154 | 165 | (arm side msg)
|
155 | 166 | (sethash side (gethash arm finger-flex-) (send msg :data)))
|
| 167 | + (:set-proximities |
| 168 | + (arm msg) |
| 169 | + (sethash arm proximities- (send msg :proximities))) |
156 | 170 |
|
157 | 171 | ;; Hand interface
|
158 | 172 | ;; based on naoqi-interface and fetch-interface
|
|
184 | 198 | res)
|
185 | 199 | nil)
|
186 | 200 | nil))
|
| 201 | + (:cancel-move-hand() |
| 202 | + (send right-hand-action- :cancel-goal)) |
| 203 | + (:hand-interpolatingp () |
| 204 | + (eq (send right-hand-action- :get-state) ros::*simple-goal-state-active*)) |
187 | 205 | (:get-finger-flex (arm side)
|
188 | 206 | (send self :spin-once)
|
189 | 207 | (gethash side (gethash arm finger-flex-)))
|
|
196 | 214 | (:get-prismatic-vel (arm)
|
197 | 215 | (send self :spin-once)
|
198 | 216 | (gethash arm prismatic-vel-))
|
| 217 | + (:get-proximity (arm side &key (raw nil)) |
| 218 | + (send self :spin-once) |
| 219 | + (let ((rl (gethash :left (gethash arm proximity-init-values-))) |
| 220 | + (rr (gethash :right (gethash arm proximity-init-values-))) |
| 221 | + ;;(rm (gethash :middle (gethash arm proximity-init-values-))) |
| 222 | + (proximities (gethash arm proximities-))) |
| 223 | + (if (null raw) |
| 224 | + (cond |
| 225 | + ;; for sparkfun proximity sensor |
| 226 | + ((eq side :left) |
| 227 | + (/ (- (send (elt proximities 0) :average) rl) (expt (/ rl 2500.0) 1.5))) |
| 228 | + ((eq side :right) |
| 229 | + (/ (- (send (elt proximities 1) :average) rr) (expt (/ rr 2500.0) 1.5)))) |
| 230 | + (cond |
| 231 | + ((eq side :left) (send (elt proximities 0) :average)) |
| 232 | + ((eq side :right) (send (elt proximities 1) :average)))))) |
199 | 233 | (:get-real-finger-av (arm)
|
200 | 234 | (send self :update-robot-state :wait-until-update t)
|
201 | 235 | (float-vector
|
|
225 | 259 | ((eq type :pinch)
|
226 | 260 | (send self :update-robot-state :wait-until-update t)
|
227 | 261 | (let ((finger-av (send self :get-real-finger-av l/r))
|
228 |
| - (prev-av (send robot :angle-vector)) avs) |
| 262 | + prev-av av avs hand-interpolatingp) |
| 263 | + ;; rotate arm using proximity sensor |
229 | 264 | (setf (aref finger-av 1) 180)
|
230 |
| - (send self :move-hand l/r finger-av 1000) |
| 265 | + (send self :move-hand l/r finger-av 2000 :wait nil) |
| 266 | + (dotimes (x 100) |
| 267 | + (if (send self :interpolatingp) (return)) |
| 268 | + (unix::usleep 1000)) |
| 269 | + (while (and |
| 270 | + (< (max (send self :get-proximity l/r :right) |
| 271 | + (send self :get-proximity l/r :left)) |
| 272 | + proximity-threshold-) |
| 273 | + (setq hand-interpolatingp (send self :hand-interpolatingp))) |
| 274 | + (unix::usleep 1000)) |
| 275 | + (when hand-interpolatingp |
| 276 | + (send self :cancel-move-hand) |
| 277 | + (send self :update-robot-state :wait-until-update t) |
| 278 | + (setq prev-av (send robot :angle-vector)) |
| 279 | + (if (< (send self :get-proximity l/r :right) (send self :get-proximity l/r :left)) |
| 280 | + (progn |
| 281 | + (send robot l/r :wrist-r :joint-angle 45 :relative t) |
| 282 | + (setq av (send robot :angle-vector)) |
| 283 | + (send robot :angle-vector prev-av) |
| 284 | + (send self :angle-vector-raw av 2000) |
| 285 | + (send self :move-hand l/r finger-av 4000 :wait nil) |
| 286 | + (dotimes (x 100) |
| 287 | + (if (send self :interpolatingp) (return)) |
| 288 | + (unix::usleep 1000)) |
| 289 | + (while (and (< (send self :get-proximity l/r :right) |
| 290 | + (send self :get-proximity l/r :left)) |
| 291 | + (send self :interpolatingp)) |
| 292 | + (unix::usleep 1000))) |
| 293 | + (progn |
| 294 | + (send robot l/r :wrist-r :joint-angle -45 :relative t) |
| 295 | + (setq av (send robot :angle-vector)) |
| 296 | + (send robot :angle-vector prev-av) |
| 297 | + (send self :angle-vector-raw av 2000) |
| 298 | + (send self :move-hand l/r finger-av 4000 :wait nil) |
| 299 | + (dotimes (x 100) |
| 300 | + (if (send self :interpolatingp) (return)) |
| 301 | + (unix::usleep 1000)) |
| 302 | + (while (and (> (send self :get-proximity l/r :right) |
| 303 | + (send self :get-proximity l/r :left)) |
| 304 | + (send self :interpolatingp)) |
| 305 | + (unix::uleep 1000))) |
| 306 | + (send self :cancel-move-hand) |
| 307 | + (send self :cancel-angle-vector) |
| 308 | + (send self :update-robot-state :wait-until-update t) |
| 309 | + (send self :move-hand l/r finger-av 1000)) |
| 310 | + (setq prev-av (send robot :angle-vector)) |
231 | 311 | (when (> (aref finger-av 0) 45)
|
232 | 312 | ;; if cylindrical and spherical grasp, move other gripper joints
|
233 | 313 | (send robot l/r :gripper-p :joint-angle -90)
|
|
236 | 316 | (pushback (send robot :angle-vector) avs)
|
237 | 317 | (send robot :angle-vector prev-av)
|
238 | 318 | (send self :angle-vector-sequence-raw avs)
|
239 |
| - (send self :wait-interpolation))))))) |
| 319 | + (send self :wait-interpolation)))))))) |
240 | 320 | (:stop-grasp
|
241 | 321 | (&optional (arm :arms) (type :suction))
|
242 | 322 | (dolist (l/r (if (eq arm :arms) (list :rarm :larm) (list arm)))
|
|
392 | 472 | (setq rarm-pressure-threshold- (- min-pressure 15))))))
|
393 | 473 | (send self :stop-grasp arm)
|
394 | 474 | (ros::ros-info "[:calib-pressure-threshold] Threshold r: ~a l: ~a"
|
395 |
| - rarm-pressure-threshold- larm-pressure-threshold-))) |
| 475 | + rarm-pressure-threshold- larm-pressure-threshold-)) |
| 476 | + (:calib-proximity-threshold |
| 477 | + (&optional (arm :arms)) |
| 478 | + (send self :spin-once) |
| 479 | + (dolist (l/r (if (eq arm :arms) (list :rarm :larm) (list arm))) |
| 480 | + (let ((hash-table (make-hash-table))) |
| 481 | + (sethash :left hash-table (send self :get-proximity l/r :left :raw t)) |
| 482 | + (sethash :right hash-table (send self :get-proximity l/r :right :raw t)) |
| 483 | + (sethash :middle hash-table (send self :get-proximity l/r :middle :raw t)) |
| 484 | + (sethash l/r proximity-init-values- hash-table)) |
| 485 | + (setq proximity-threshold- 100)))) ;; TODO decide proper threshold 100 -> ??? |
396 | 486 |
|
397 | 487 |
|
398 | 488 | (defclass jsk_arc2017_baxter::baxter-moveit-environment
|
|
0 commit comments