10.2.2 动态参数服务端A(C++)
需求:
编写两个节点,一个节点可以动态修改参数,另一个节点时时解析修改后的数据。
服务端实现流程:
- 新建并编辑 c++ 文件;
- 编辑CMakeLists.txt;
- 编译并执行。
0.vscode配置
需要像之前自定义 msg 实现一样配置settings.json 文件,如果以前已经配置且没有变更工作空间,可以忽略,如果需要配置,配置方式与之前相同:
{
"configurations": [
{
"browse": {
"databaseFilename": "",
"limitSymbolsToIncludedHeaders": true
},
"includePath": [
"/opt/ros/noetic/include/**",
"/usr/include/**",
"/xxx/yyy工作空间/devel/include/**" //配置 head 文件的路径
],
"name": "ROS",
"intelliSenseMode": "gcc-x64",
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17"
}
],
"version": 4
}
1.服务器代码实现
新建cpp文件,内容如下:
#include "ros/ros.h"
#include "dynamic_reconfigure/server.h"
#include "demo02_dr/drConfig.h"
/*
动态参数服务端: 参数被修改时直接打印
实现流程:
1.包含头文件
2.初始化 ros 节点
3.创建服务器对象
4.创建回调对象(使用回调函数,打印修改后的参数)
5.服务器对象调用回调对象
6.spin()
*/
void cb(demo02_dr::drConfig& config, uint32_t level){
ROS_INFO("动态参数解析数据:%d,%.2f,%d,%s,%d",
config.int_param,
config.double_param,
config.bool_param,
config.string_param.c_str(),
config.list_param
);
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
// 2.初始化 ros 节点
ros::init(argc,argv,"dr");
// 3.创建服务器对象
dynamic_reconfigure::Server<demo02_dr::drConfig> server;
// 4.创建回调对象(使用回调函数,打印修改后的参数)
dynamic_reconfigure::Server<demo02_dr::drConfig>::CallbackType cbType;
cbType = boost::bind(&cb,_1,_2);
// 5.服务器对象调用回调对象
server.setCallback(cbType);
// 6.spin()
ros::spin();
return 0;
}
2.编译配置文件
add_executable(demo01_dr_server src/demo01_dr_server.cpp)
...
add_dependencies(demo01_dr_server ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
...
target_link_libraries(demo01_dr_server
${catkin_LIBRARIES}
)
3.执行
先启动roscore
启动服务端:rosrun 功能包 xxxx
启动客户端:rosrun rqt_gui rqt_gui -s rqt_reconfigure
或rosrun rqt_reconfigure rqt_reconfigure
最终可以通过客户端提供的界面修改数据,并且修改完毕后,服务端会即时输出修改后的结果,最终运行结果与示例类似。
PS:ROS版本较新时,可能没有提供客户端相关的功能包导致rosrun rqt_reconfigure rqt_reconfigure
调用会抛出异常。