---
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(¶m_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>

---