|
| 1 | +#!/usr/bin/env roseus |
| 2 | + |
| 3 | +(ros::load-ros-manifest "roseus") |
| 4 | +(ros::load-ros-manifest "force_proximity_ros") |
| 5 | + |
| 6 | +(defclass proximity-calibrator |
| 7 | + :super propertied-object |
| 8 | + :slots (proximities-calibrated- |
| 9 | + proximities-init- |
| 10 | + proximities-param-a- |
| 11 | + topic-list-)) |
| 12 | + |
| 13 | +(defmethod proximity-calibrator |
| 14 | + (:init (&rest args &key topic-list) |
| 15 | + (ros::roseus "proximity-calibrator") |
| 16 | + ;; create subscribers and publishers |
| 17 | + (ros::subscribe "/set_init_proximities" std_msgs::Empty #'send self :set-init-proximities) |
| 18 | + (dolist (topic-name topic-list) |
| 19 | + (ros::subscribe topic-name force_proximity_ros::ProximityArray #'send self :cb topic-name) |
| 20 | + (ros::advertise (format nil "~A/init" topic-name) std_msgs::Float64MultiArray 1) |
| 21 | + (ros::advertise (format nil "~A/calibrated" topic-name) std_msgs::Float64MultiArray 1) |
| 22 | + (ros::advertise (format nil "~A/distance" topic-name) std_msgs::Float64MultiArray 1)) |
| 23 | + |
| 24 | + ;; make hash tables |
| 25 | + (setq proximities-calibrated- (make-hash-table :test #'equal)) |
| 26 | + (setq proximities-init- (make-hash-table :test #'equal)) |
| 27 | + (setq proximities-param-a- (make-hash-table :test #'equal)) |
| 28 | + |
| 29 | + ;; get default proximity parameters from rosparam |
| 30 | + (dolist (topic-name topic-list) |
| 31 | + (sethash topic-name |
| 32 | + proximities-param-a- |
| 33 | + (ros::get-param (format nil "~A/a" topic-name))) |
| 34 | + (sethash topic-name |
| 35 | + proximities-init- |
| 36 | + (ros::get-param (format nil "~A/b" topic-name)))) |
| 37 | + (ros::spin-once) |
| 38 | + self) |
| 39 | + (:cb (topic-name msg) |
| 40 | + ;; set calibrated sensor value to hash table |
| 41 | + (sethash topic-name |
| 42 | + proximities-calibrated- |
| 43 | + (mapcar #'- (mapcar #'(lambda (x) (send x :proximity)) (send msg :proximities)) |
| 44 | + (gethash topic-name proximities-init-))) |
| 45 | + ;; publish distance calculated from proximtiy values |
| 46 | + (send self :publish-proximities topic-name) |
| 47 | + ) |
| 48 | + (:publish-proximities (topic-name) |
| 49 | + (let ((float-array (instance std_msgs::Float64MultiArray :init))) |
| 50 | + (send float-array :data (gethash topic-name proximities-init-)) |
| 51 | + (ros::publish (format nil "~A/init" topic-name) float-array) |
| 52 | + (send float-array :data (gethash topic-name proximities-calibrated-)) |
| 53 | + (ros::publish (format nil "~A/calibrated" topic-name) float-array) |
| 54 | + (send float-array :data |
| 55 | + (mapcar #'(lambda (a I-b) |
| 56 | + (if (> I-b 0) |
| 57 | + (sqrt (/ a I-b)) |
| 58 | + *inf*)) |
| 59 | + (gethash topic-name proximities-param-a-) |
| 60 | + (gethash topic-name proximities-calibrated-))) |
| 61 | + (ros::publish (format nil "~A/distance" topic-name) float-array))) |
| 62 | + (:set-init-proximities (msg) |
| 63 | + (dolist (topic-name topic-list-) |
| 64 | + (sethash topic-name |
| 65 | + proximities-init- |
| 66 | + (gethash topic-name proximities-raw-)))) |
| 67 | + ) |
| 68 | + |
| 69 | + |
| 70 | +(defun init (&optional (topic-list (list "/proximity_sensor_topic1" "/proximity_sensor_topic2"))) |
| 71 | + (when (not (boundp '*pc*)) |
| 72 | + (setq *pc* (instance proximity-calibrator :init :topic-list topic-list))) |
| 73 | + (ros::spin-once)) |
0 commit comments