对于ROS中配置动态参数
针对于文件为例
该文件名称为:pose_detection.cfg
#!/usr/bin/env python
PACKAGE = "pole_based_localization" #名称需要相同
#导包过程
from dynamic_reconfigure.parameter_generator_catkin import * #引入dynamic_reconfigure的头文件 使用/usr/bin/env下的python编译器进行解析
gen = ParameterGenerator() #用于创建生成一个参数生成器 并通过下面的.add函数增加动态配置的参数
gen.add("use_gps", bool_t, 0, "Toggle use of gps sensor", True)
gen.add("max_positional_correction", double_t, 0, "max applied positional correction per step [m]", 0.2, 0.0, 1.0)
gen.add("max_angular_correction", double_t, 0, "max applied angular correction per step [rad]", 0.0002, 0.0, 0.05)
gen.add("pose_correction_dampening", double_t, 0, "dampening of cached positional correction [%]", 2.5, 0, 10)
exit(gen.generate(PACKAGE, "pole_based_localization", "pole_position_correction"))
ROS-dynamic_reconfigure动态参数可以使程序在运行中实时的更改参数的大小——使用cfg需要更改文件的读写权限
cfg文件与yaml文件的区别:
能够在调试机器人的时候动态的修改机器人的参数,不需要重新进行编译,这也是区别于在静态读取本地yaml文件的参数的区别
chmod a+x ./pose_detection.cfg
创建cfg动态参数配置文件
PACKAGE: PACKAGE = “pole_based_localization”。这里需要明确:这里双引号中的package name需要与CMAKELIST中的package的名称相同,也就是project(pole_based_localization)
gen = ParameterGenerator(): 用于创建动态参数的生成器,方便后面能够通过**.add**函数添加动态配置的参数信息。
.add函数的格式:
.add(name,parmeterType,level,description,default,min,max)
gen.add("max_positional_correction", double_t, 0, "max applied positional correction per step [m]", 0.2, 0.0, 1.0)
//创建的动态参数名称为name(max_positional_correction)
//动态参数的存储值类型为parmeterType(double_t)
//level - 稍后将传递给动态重新配置回调的位掩码。当回调被调用时,所有已更改参数的级别值将被或运算在一起,并将结果值传递给回调。
//这个参数是一个位掩码(bitmask),用于指定参数的行为。在这个例子中,0表示没有任何特殊的行为。位掩码是一种用于启用或禁用某些特性的方法,每个位代表一个特性,可以通过设置不同的位来启用或禁用相应的特性。
//description 对应于:这是参数的描述,它会在动态重配置的界面中显示,帮助用户理解这个参数的作用。
// default对应于:这是参数的默认值,如果用户没有修改它,那么这个参数就会使用这个值。
//min: 这是参数的最小值,用户不能将参数设置得低于这个值。
//max: 这是参数的最大值,用户不能将参数设置得高于这个值。
**gen.generate函数:**第一个参数是pakcage功能包的名称(生成的config文件的命名空间,用来调用相关的参数),第二个参数是可以在其中运行的节点的名称,第三个参数是生成的文件名称的前缀
第二个是对应于launch中的name运行节点的名称,第三个就是我们在.cpp中用来饮用condig编译生成后的.h头文件的前缀名称
实现在CMakeList中成功编译.cfg文件
首先需要在对应的cmakelist文件中的find_package函数以及catkin_package中加入dynamic_reconfigure包的依赖,用来成功找到dynamic_reconfigure包以及在catkin_make中调用dynamic_reconfigure包,同时需要在package.xml文件中添加dynamic_reconfigure包的依赖
find_package(catkin REQUIRED COMPONENTS
geometry_msgs
rospy
sensor_msgs
std_msgs
visualization_msgs
roscpp
geodesy
pcl_ros
pcl_conversions
message_generation
tf2
tf2_ros
tf2_msgs
dynamic_reconfigure
)
catkin_package(
CATKIN_DEPENDS
message_runtime
sensor_msgs
dynamic_reconfigure
)
调用generate_dynamic_reconfigure_options函数,在括号内加入我们自定义的.cfg信息,其实原理与msg相同,该函数用来生成动态配置参数的配置信息
generate_dynamic_reconfigure_options(
cfg/pole_detection.cfg
cfg/pole_recognition.cfg
cfg/pole_position_correction.cfg
)
然后在add_dependencies中添加依赖项,也就是针对于通过add_executable中的可执行文件的节点,添加依赖项目信息
add_library(${PROJECT_NAME}_recognizer_nodelet
src/pole_recognition/Recognizer.cpp
)
add_dependencies(${PROJECT_NAME}_recognizer_nodelet ${PROJECT_NAME}_gencfg)
最后在.cpp主函数文件中引入通过dynamic_reconfigure参数服务器生成的动态参数头文件
#include <dynamic_reconfigure/server.h>
#include <pole_based_localization/pole_recognitionConfig.h>
代码的第一行:第一个是dynamic_reconfigure服务器的头文件,用于创建服务器
代码的第二行:我们自己写的.cfg文件生成的头文件,用于使用我们定义的参数(config名称空间/gen.generate第三个参数的头文件文件名前缀.h)
boost::shared_ptr<dynamic_reconfigure::Server<pole_based_localization::pole_position_correctionConfig> > mConfigServer;
exit(gen.generate(PACKAGE, "pole_based_localization", "pole_position_correction"))
pole_based_localization::pole_position_correctionConfig的由来来自于PACKAGE::pole_position_correctionConfig
使用rqt_reconfigure需要调用调试参数的回调函数,因此需要自己编写。
顶一下
参考
这里注意,在CLION中即使在terminal编译通过的项目,可能在clion中打开,仍然显示找不到msg以及cfg生成的头文件,此时需要找到对应的窗口,根据cmakelist中的gencfg以及genmsg的package node的名称编译一下,就可以排除报错!!!
点小锤子build一下即可