在ROS系统中,我们需要实时修改参数,并能马上看到运行效果。这一功能是通过ros dynamic_reconfigure包实现的。官网教程如下:dynamic_reconfigure/Tutorials。
具体操作流程可简述为如下:首先写一个.cfg文件,python语法。然后在CMakeLists.txt文件中添加generate_dynamic_reconfigure_options用于编译刚才写的.cfg文件,并给出正确路径,且一定记得用chmod a+x *.cfg将其变为可执行的文件,这步很关键。最后在源码中包含编译后的头文件,一般是Config.h结尾,就可以开始码代码了。
目前官网给出的例程实现dynamic_reconfigure的客户端只给出了python例程,而服务端给了c++和python两种方法的实现。在rqt_reconfigure中,其源代码也是通过python写的GUI实现的。后来查看了下dynamic_reconfigure的源码,发现在头文件中包含了client.h文件,仔细研究了下,并对比了server.h文件,发现包含该文件即可用C++实现dynamic_reconfigure的客户端。在ros indigo版本中,dynamic_reconfigure包里面可能还没有client.h头文件,建议更新至最新的dynamic_reconfigure包。
以下是具体示例:
在CMakeLists.txt中包含
find_package(catkin REQUIRED roscpp rospy dynamic_reconfigure)
generate_dynamic_reconfigure_options(cfg/config.cfg) # .cfg文件的名字
...
# make sure configure headers are built before any node using them
add_dependencies({PROJECT_NAME}_node ${PROJECT_NAME}_gencfg) #添加依赖性也很关键,否则找不到生成的*Config.h文件
服务器端具体实现的关键代码:
dynamic_reconfigure::Server<my_msgs::tutorialsConfig> server;
dynamic_reconfigure::Server<my_msgs::tutorialsConfig>::CallbackType f; //用于回调
f = boost::bind(&callback, _1, _2);
server.setCallback(f);
客户端具体实现的关键代码(C++):
dynamic_reconfigure::Client<my_msgs::tutorialsConfig> client("dynamic_srv", dynCallBack); //订阅服务,并设置回调函数
my_msgs::tutorialsConfig config;
注:用C++实现的话,如果所用版本dynamic_reconfigure包中没有client.h头文件,得从github上下载源码,然后将client.h加入到工程当中。
客户端具体实现的关键代码(python):
rospy.init_node("dynamic_client")
rospy.wait_for_service("dynamic_srv/set_parameters")
client = dynamic_reconfigure.client.Client("dynamic_srv", timeout=10, config_callback=callback)
在该客户端中,本人写了一个循环不断去改变参数的值,其效果类似于打开rqt_reconfigure去调节参数,当然也可以做一个GUI界面去改变参数的值。
代码完成后,编译,运行roscore,并设置工作空间的环境变量。
开启服务器端节点,再开启客户端节点(python和c++程序开启一个即可)。
用rqt_configure查看,可以发现里面的参数值在不断变化。截图如下:
工程源码下载地址:
https://github.com/WelinLee/ROS_dynamic_reconfig
Enjoy!