ROS学习之路07:编写动态重配置(dynamic_reconfigure)参数的节点

本文介绍如何在ROS中实现动态重配置,包括创建ROS工作空间、功能包,并详细讲解了如何定义动态重配置参数及其实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键术语

动态重配置参数:就是动态地调整、设置正在运行的节点的参数值,通过动态重配置,可以更加高效地开发和测试节点,特别是机器人硬件调试的时候,使用动态重配置参数是一个很不错的选择.


创建工作空间(workspace)

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ..
catkin_make

创建功能包(package)

cd ~/catkin_ws/src
catkin_create_pkg custom_dynamic_reconfigure roscpp dynamic_reconfigure
cd ..
catkin_make
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

向功能包添加动态重配置文件(.cfg)

roscd custom_dynamic_reconfigure
mkdir cfg && cd cfg
gedit Tutorials.cfg

向custom_dynamic_reconfigure.cfg文件输入如下的内容:

#!/usr/bin/env python
PACKAGE = "dynamic_reconfigure"

from dynamic_reconfigure.parameter_generator_catkin import *

gen = ParameterGenerator() #创建一个参数生成器对象

#gen.add(参数名称,         参数类型,  位掩码,   参数描述,               默认值,   最小值,   最大值)
gen.add( "int_param",    int_t,     0,     "An Integer parameter", 50,      0,       100)
gen.add( "double_param", double_t,  0,     "A double parameter",   .5,      0,       1)
gen.add( "str_param",    str_t,     0,     "A string parameter",   "Hello World")
gen.add( "bool_param",   bool_t,    0,     "A Boolean parameter",  True)

size_enum = gen.enum([ gen.const("Small",      int_t, 0, "A small constant"),
                       gen.const("Medium",     int_t, 1, "A medium constant"),
                       gen.const("Large",      int_t, 2, "A large constant"),
                       gen.const("ExtraLarge", int_t, 3, "An extra large constant")],
                       "An enum to set size")

gen.add("size", int_t, 0, "A size parameter which is edited via an enum", 1, 0, 3, edit_method=size_enum)

exit(gen.generate(PACKAGE, "custom_dynamic", "Tutorials")) 
#first parameter is namespace's name
#second parameter is node's name
#third parameter is the current file's name

修改CMakeLists.txt文件

将CMakeLists.txt文件的内容修改为如下所示:

cmake_minimum_required(VERSION 2.8.3)
project(custom_dynamic_reconfigure)
find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
  dynamic_reconfigure
)
generate_dynamic_reconfigure_options(
  cfg/Tutorials.cfg
)
catkin_package(
  LIBRARIES custom_dynamic_reconfigure
  CATKIN_DEPENDS roscpp std_msgs dynamic_reconfigure
)
include_directories(${catkin_INCLUDE_DIRS})

构建功能包,生成相关头文件

cd ~/catkin_ws
catkin_make

向功能包添加动态重配置节点

server.cpp
这里写代码片

#include <ros/ros.h>

#include <dynamic_reconfigure/server.h>
#include "custom_dynamic_reconfigure/TutorialsConfig.h"

void callback(dynamic_reconfigure::TutorialsConfig &config)
{
  ROS_INFO("Reconfigure Request: %d %f %s %s %d",
           config.int_param,
           config.double_param,
           config.str_param.c_str(),
           config.bool_param?"True":"False",
           config.size);
}

int main(int argc, char **argv) {
  ros::init(argc, argv, "custom_dynamic_server");

  dynamic_reconfigure::Server<dynamic_reconfigure::TutorialsConfig> server;
  dynamic_reconfigure::Server<dynamic_reconfigure::TutorialsConfig>::CallbackType f;

  f = boost::bind(&callback, _1); //绑定回调函数
  server.setCallback(f); //为服务器设置回调函数, 节点程序运行时会调用一次回调函数来输出当前的参数配置情况

  ROS_INFO("Spinning node");
  ros::spin(); //服务器循环监听重配置请求,当服务器收到重配置请求的时候,就会自动调用回调函数
  return 0;
}

修改CMakeLists.txt文件

将CMakeLists.txt文件的内容修改为如下:

cmake_minimum_required(VERSION 2.8.3)
project(custom_dynamic_reconfigure)
find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
  dynamic_reconfigure
)
generate_dynamic_reconfigure_options(
  cfg/Tutorials.cfg
)
catkin_package(
  LIBRARIES custom_dynamic_reconfigure
  CATKIN_DEPENDS roscpp std_msgs dynamic_reconfigure
)
include_directories(${catkin_INCLUDE_DIRS})
add_executable(custom_dynamic_server src/server.cpp)
add_dependencies(custom_dynamic_server ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(custom_dynamic_server ${catkin_LIBRARIES})

构建功能包,运行动态重配置服务器节点程序

打开终端,输入:

rosrun custom_dynamic_reconfigure custom_dynamic_server

打开另一个终端,输入:

rosrun rqt_reconfigure rqt_reconfigure

至此,编写动态重配置节点的完成了.
Enjoy It!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值