jsk-ros-pkg / jsk_roseus

ROS EusLisp Client
http://wiki.ros.org/roseus/Tutorials
16 stars 56 forks source link

[roseus] add dynamic-reconfigure-server #729

Open knorth55 opened 1 year ago

knorth55 commented 1 year ago

originally written by @YoheiKakiuchi

This PR add dyamic-reconfigure-server in roseus. this code is copied from https://github.com/jsk-ros-pkg/jsk-ros-pkg-unreleased/blob/master/sandbox/dynamic_reconfigure_eus/euslisp/dynamic_reconfigure_server.l and modified a little bit.

cc. @Kanazawanaoaki

knorth55 commented 1 year ago

I added test for both

tkmtnt7000 commented 10 months ago

dynamic reconfigureの正しいカバー範囲はどこまでかきちんと把握しないといけませんが,このPRのroseusのdynamic-reconfigure実装では

となっていそうなので報告しておきます.下のサンプルコードを実行してrosrun rqt_reconfigure rqt_reconfigureとrosparam listをそれぞれ別のターミナルでたちあげるのが再現手順です.サンプルコードに誤りがあるかもしれないのでその場合は教えてくださると助かります.

サンプルコード

#!/usr/bin/env roseus

(ros::roseus "twitter_client_warning")
(load "package://roseus/euslisp/dynamic-reconfigure-server.l")

(setq *volume* (ros::get-param "~volume" 1.0))
(setq *speak-enable* (ros::get-param "~speak_enable" t))
(setq *enable* (ros::get-param "~enable" t))
(setq *reconfigure-server*
      (def-dynamic-reconfigure-server
        ;;; ((name type level description (default) (min) (max) (edit_method)) ... )
        (("volume"  double_t  0  "tweet speak volume" 1.0  0.0 1.0)
         ("speak_enable"  bool_t  0  "tweet speak enable" t)
         ("enable"  bool_t  0  "tweet enable" t))
        ;; use lamda-closure to avoid memory error
        '(lambda-closure nil 0 0 (cfg level)
            (let ((prev-volume *volume*)
                  (prev-speak-enable *speak-enable*)
                  (prev-enable *enable*))
              (setq *volume* (cdr (assoc "volume" cfg :test #'equal)))
              (setq *speak-enable* (cdr (assoc "speak_enable" cfg :test #'equal)))
              (setq *enable* (cdr (assoc "enable" cfg :test #'equal)))
              (if (null (equal *volume* prev-volume))
                (ros::ros-warn "Volume changed to: ~A" *volume*))
              (if (null (equal *enable* prev-enable))
                (ros::ros-warn "Enable changed to: ~A" *enable*))
              (if (null (equal *speak-enable* prev-speak-enable))
                (ros::ros-warn "Speak enable changed to: ~A" *speak-enable*)))
            cfg)))

(ros::rate 1.0)
(while (ros::ok)
  (ros::spin-once)
  (ros::sleep)
  )

追記: :copy-to-parameter-server, :copy-from-parameter-serverを実装すればよい