--- tags : DIT 2023寒假 -- ROS教學 --- {%hackmd BJrTq20hE %} # rqt_reconfigure > 動態調參工具 ## 設置 cfg 檔 1. <font color="FF9900">在 package 底下生成 cfg 資料夾放置動態調參的設定</font> ```bash=1 $ roscd [PACKAGE_NAME] $ mkdir cfg ``` 2. <font color="FF9900">建立 cfg 檔,並放置想要動態調整的參數</font> ```cfg=1 #!/usr/bin/env python3 # Import dynamic reconfigure tool from dynamic_reconfigure.parameter_generator_catkin import * # Set parameter generator freq_params = ParameterGenerator() # Add param "freq_pub" # type : int # range : 1 ~ 10 # original : 5 freq_params.add("freq_pub", int_t, 0, "Publish frequency", 5, 1, 10) # Add param "data_pub" # type : string # original : "Nothing" freq_params.add("data_pub", str_t, 0, "Publish data", "Nothing") # [PACKAGE NAME] [NAMESPACE NAME] [GENERATE FILE NAME] exit(freq_params.generate("reconf_test", "reconf_test", "dynamic_freq")) ``` 3. <font color="FF9900">設置 CMakeList.txt</font> ```cmake=7 ## Find catkin macros and libraries ## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) ## is used, also find other catkin packages find_package(catkin REQUIRED COMPONENTS dynamic_reconfigure # ADD this roscpp rospy std_msgs ) ``` ```cmake=93 ## Generate dynamic reconfigure parameters in the 'cfg' folder generate_dynamic_reconfigure_options( cfg/reconf_params.cfg ) ``` 4. <font color="FF9900">設置 package.xml</font> ```xml=1 <build_depend>dynamic_reconfigure</build_depend> <exec_depend>dynamic_reconfigure</exec_depend> ``` 5. <font color="FF9900">catkin_make 以生成需要的標頭檔</font> ```bash=1 $ # In your top CMakeList.txt folder $ catkin_make ``` ## 設置監聽 server ```cpp=1 #include <ros/ros.h> #include <dynamic_reconfigure/server.h> #include "reconf_test/dynamic_freqConfig.h" int current_freq = 1; std::string data = "HELLO"; void param_cb(reconf_test::dynamic_freqConfig &config, uint32_t level){ current_freq = config.freq_pub; data = config.data_pub; } int main(int argc, char** argv){ ros::init(argc, argv, "publisher_node"); dynamic_reconfigure::Server<reconf_test::dynamic_freqConfig> param_srv; dynamic_reconfigure::Server<reconf_test::dynamic_freqConfig>::CallbackType callback; // If the function is a class member : // boost::bind(&function, class instance, _1, _2) callback = boost::bind(&param_cb, _1, _2); // Set callback function to param server param_srv.setCallback(callback); while(ros::ok()){ ros::Rate rate(current_freq); ROS_INFO_STREAM("Current : " << current_freq << "HZ, Data : " << data); ros::spinOnce(); rate.sleep(); } } ``` - <font color="FF9900">在欲使用 dynamic parameter 的 node 上需額外增加 ```${PROJECT_NAME}_gencfg``` dependency</font> ```cmake=148 add_dependencies(param_server ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_gencfg) ``` ## 執行 1. <font color="FF9900">執行剛剛寫好的 param_server.cpp</font> ```bash=1 $ rosrun [PACKAGE NAME] [NAME_NAME] ``` 2. <font color="FF9900">執行 rqt_reconfigure</font> ```bash=1 $ rqt -s rqt_reconfigure ``` 3. <font color="FF9900">使用圖形界面調整參數,並觀察終端的輸出變化</font> ![](https://i.imgur.com/ZnxeTR9.png) ---