ROS基础 - dynamic_reconfigure 动态参数

2023-05-16

ROS基础 - dynamic_reconfigure 动态参数使用 实例详解

采用 ROS::dynamic_reconfigure 的形式, 可以在程序运行过程中实时更改参数大小,C++代码通过回调函数接收数据,实在是仿真中的一件利器,强烈推荐。
注意:cfg文件要更改执行权限。

主要步骤如下:
1、src/frame_pub/cfg/paramDynamicConfig.cfg文件编写
2、src/frame_pub/src/frame_pub.cpp 文件编写
3、src/frame_pub/CMakeLists.txt 文件编写
4、src/frame_pub/package.xml 文件编写

一、src/frame_pub/cfg/paramDynamicConfig.cfg文件编写 文件采用python编写。

#!/usr/bin/env python
PACKAGE =   "frame_pub"
from dynamic_reconfigure.parameter_generator_catkin import *
gen = ParameterGenerator()

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)
gen.add("StopMove",   bool_t,   0, "A Boolean parameter",  False)

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, "frame_pub", "frame_pub"))

PACKAGE: 需要和创建的功能包名字相同,详见CMakeLists.txt文件中的 project(frame_pub)

gen.add函数: 表示添加需要修改的参数(name, type, level, description, default, min, max)。

exit: 第三个参数表示生成的头文件名称,本例子中为frame_pub,则生成的头文件名称为 frame_pubConfig.h ,生成的头文件在/devel/include下面可以查看到。
注意:通过exit生成.h文件,需要在CMakelists中增加如下代码:

generate_dynamic_reconfigure_options(cfg/paramDynamicConfig.cfg)

注意:
generate_dynamic_reconfigure_options() must be called before catkin_package()
generate_dynamic_reconfigure_options() 必须放到catkin_package()之前。

2、src/frame_pub/src/frame_pub.cpp 文件编写

#include <ros/ros.h>
#include <tf2_ros/transform_broadcaster.h>
#include <tf2/LinearMath/Quaternion.h>

#include <dynamic_reconfigure/server.h>
#include "frame_pub/frame_pubConfig.h"

float fSpeed = 0.00;

void callback(frame_pub::frame_pubConfig &config, uint32_t level)
{
    ROS_INFO("ROS INFO: Reconfigure Request: %d %f %s %s %d \n",
             config.int_param, config.double_param,
             config.str_param.c_str(),
             config.bool_param?"True":"False",
             config.size);

    printf("printf Info: Reconfigure Request: *.int_param = [%d] *.double_param[%f] *.str_param = [%s] \n",
           config.int_param, config.double_param,
           config.str_param.c_str());

    printf("printf Info: Reconfigure Request: *.bool_param =[%s], *.StopMove = [%s], *.size = [%d] \n",
           config.bool_param?"True":"False",
           config.StopMove?"True":"False",
           config.size);

    //iSpeed = config.int_param;
    fSpeed = config.StopMove ? 0.01 : 0.00;
    printf("fSpeed = %f \n", fSpeed);
}


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

  dynamic_reconfigure::Server<frame_pub::frame_pubConfig> server;
  dynamic_reconfigure::Server<frame_pub::frame_pubConfig>::CallbackType f;
  f = boost::bind(&callback,_1,_2);
  server.setCallback(f);
  ROS_INFO("spinning node \n");

  ros::NodeHandle node;

  tf2_ros::TransformBroadcaster tfb;
  geometry_msgs::TransformStamped transformStamped;

  transformStamped.header.frame_id = "base_link";
  transformStamped.child_frame_id = "fps";
  transformStamped.transform.translation.x = 16.0;
  transformStamped.transform.translation.y = 2.5;
  transformStamped.transform.translation.z = 3.0;
  tf2::Quaternion q;
  q.setRPY(0, 0, 0);
  transformStamped.transform.rotation.x = q.x();
  transformStamped.transform.rotation.y = q.y();
  transformStamped.transform.rotation.z = q.z();
  transformStamped.transform.rotation.w = q.w();
  q.x();
  transformStamped.transform.rotation.y = q.y();
  transformStamped.transform.rotation.z = q.z();
  transformStamped.transform.rotation.w = q.w();

  printf("Begin\n");
  ros::Rate rate(1000.0);
  while (node.ok())
  {
    transformStamped.header.stamp = ros::Time::now();
    transformStamped.transform.translation.x += fSpeed; //0.01;
    tfb.sendTransform(transformStamped);
    rate.sleep();
    printf("fSpeed = %f \n", fSpeed);
    //printf("sending\n");
    ros::spinOnce(); //执行回调需要此处理!!!
  }

    printf("Exit\n");
}

3、src/frame_pub/CMakeLists.txt 文件编写

cmake_minimum_required(VERSION 3.0.2)
project(frame_pub)
find_package(catkin REQUIRED COMPONENTS
  roscpp
  tf2
  tf2_ros
  dynamic_reconfigure
)
generate_dynamic_reconfigure_options(cfg/paramDynamicConfig.cfg)
catkin_package()
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
  ../../devel/include  #note: new add
  ${catkin_INCLUDE_DIRS}
)
add_executable(frame_pub src/frame_pub.cpp)

## Specify libraries to link a library or executable target against
target_link_libraries(frame_pub
  ${catkin_LIBRARIES}
)

注意:include_directories中增加了 …/…/devel/include ,否则在编写代码时,引用头文件 “#include <frame_pub/frame_pubConfig.h>” 会显示波浪线。 且头文件中的 相关结构 也会提示红色字体,认为是未识别。但其实是可以编译通过的。 建议在CMakeList.txt中,增加 “ …/…/devel/include”

注意: 这里的 dynamic_reconfigure,否则后面的generate_dynamic_reconfigure_options会报错: Unknown CMake command “generate_dynamic_reconfigure_options”

4、src/frame_pub/package.xml 文件编写

<?xml version="1.0"?>
<package format="2">
  <name>frame_pub</name>
  <version>0.0.0</version>
  <description>The frame_pub package</description>
  <maintainer email="waytous@todo.todo">waytous</maintainer>
  <license>TODO</license>
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>tf2</build_depend>
  <build_depend>dynamic_reconfigure</build_depend>
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>tf2</build_export_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>tf2</exec_depend>
  <export>
    <!-- Other tools can request additional information be placed here -->
  </export>
</package>

注意其中的:
<build_depend>roscpp</build_depend>
<build_depend>tf2</build_depend>

5、运行

首先启动 roscore , 然后启动 rosrun 节点, 最后启动rosrun rqt_reconfigure rqt_reconfigure。

roscore
source devel/setup.bash 
rosrun frame_pub frame_pub
rosrun rqt_reconfigure rqt_reconfigure

注意:source 命令要在 代码根目录下,通常与devel、src同级目录

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS基础 - dynamic_reconfigure 动态参数 的相关文章

  • 正则 ^ , \G , \A 区别

    正则 G A 区别 如图
  • c的string库常用函数记录

    1 strcat x xff0c y 将字符串y拼接在字符串x后面 2 strlen xff08 x xff09 返回字符串x的长度 3 strcopy xff08 x xff0c y xff09 将y复制给x xff08 类似于x 61
  • ROS发行版列表完整版

    官方原文 xff1a http wiki ros org Distributions Distro Release date EOL date ROS Melodic Morenia Recommended May 23rd 2018 Ma
  • React styled-components(三)—— 高级特性

    styled components 高级特性 样式继承嵌套设置主题 样式继承 新建 Demo js 文件 xff1a span class token keyword import span React span class token p
  • (九)Java算法:快速排序(详细图解)

    目录 一 前言1 1 概念1 2 算法过程 二 maven依赖三 流程解析3 1 全部数据分区3 2 左边数据分区3 3 右边数据分区 四 编码实现结语 一 前言 1 1 概念 快速排序 xff1a 用数组的第一个数作为基准数据 xff0c
  • 【Linux】树莓派控制光强传感器(C、python手把手教学)

    本文分为三个部分 xff1a 1 光强传感器说明 2 程序解读 3 前期准备 xff08 放在最后一部分 xff0c 供小白查阅借鉴 xff0c 包括本文需要用到的wiringPi库函数 xff09 一 光强传感器说明 1 TSL256x
  • Ubuntu安装VNC,配置多用户vnc连接Ubuntu,开机自启vnc命令

    Ubuntu安装VNC span class token function sudo span span class token function apt span update span class token function sudo
  • 解决登陆github慢的问题

    解决方法 首先本文解决的问题是Github网站可以访问 xff0c 但是由于网络代理商的原因 xff0c 造成访问速度很慢 Ping www github com 时 xff0c 速度只有200多ms 解决思路 xff1a 1 可以花钱购买
  • 什么是反卷积(快速理解)

    什么是反卷积 参考博客 我们知道输入图像通过卷积神经网络 xff08 CNN xff09 提取特征后 xff0c 输出的尺寸往往会变小 xff0c 而又是我们需要将图像恢复到原来的尺寸以便进行进一步的计算 xff0c 整个扩大图像尺寸 xf
  • 李雅普诺夫稳定(内部稳定)与BIBO稳定(外部稳定)的关系

  • 情绪识别论文阅读

    情绪识别论文阅读 情感脑机接口研究综述一种基于情感脑电信号时 频 空特征的3D密集连接网络 1 吕宝粮 张亚倩 郑伟龙 情感脑机接口研究综述 J 智能科学与技术学报 2021 3 01 36 48 情感脑机接口研究综述 情感脑机接口研究面临
  • 一文详细介绍情绪识别常用的数据集

    一文详细介绍情绪识别常用的数据集 SEED采集情况文件介绍 SEED IV采集情况文件介绍 CIAIC多模态情感识别数据采集情况文件介绍 DEAP采集情况文件情况 SEED V采集情况文件情况 本文详细介绍了脑机接口情绪识别常用的数据集 x
  • 父子进程虚拟地址空间情况

    父子进程虚拟地址空间情况 笔记来源于牛客网 Linux多进程开发 The child process and the parent process run in separate memory spaces At the time of f
  • Pytorch中nn.Module中的self.register_buffer解释

    self register buffer作用解释 今天遇到了这样一种用法 xff0c self register buffer name Tensor xff0c 该方法的作用在于定义一组参数 该组参数在模型训练时不会更新 xff08 即调
  • leetcode_回溯算法

    回溯算法刷题总结 回溯法理论基础回溯算法的模板组合问题77 组合优化版本 216 组合总和III17 电话号码的字母组合组合总和组合总和II 分割131 分割回文串93 复原IP地址 子集78 子集90 子集II491 递增子序列 xff0
  • React styled-components(二)—— props、attrs属性

    styled components props attrs属性 96 props 96 96 props 96 穿透添加 96 attrs 96 属性获取 96 state 96 中的样式 变量控制样式通过 96 props 96 控制样式
  • leetcode_贪心算法

    贪心算法相关题 简单题目455 分发饼干1005 K次取反后最大化的数组和860 柠檬水找零 序列问题376 摆动序列法一 xff1a 贪心法法二 xff1a 动态规划 单调递增的数字简化版本 有点难度53 最大子序和贪心算法动态规划 13
  • leetcode_动态规划

    leetcode 动态规划 基础题目509 斐波那契数70 爬楼梯62 不同路径63 不同路径II343 整数拆分96 不同的二叉搜索树 01背包分割等和子集1049 最后一块石头的重量II494 目标和474 一和零 完全背包518 零钱
  • 北东地/东北天两种导航坐标系与姿态转换

    一 坐标系 1 导航坐标系 常用的导航坐标系有北东地和东北天两种 两种坐标系的指向分别定义如下 xff1a 1 1 北东地坐标系 X轴 xff1a 指北 Y轴 xff1a 指东 Z轴 xff1a 指地 1 2 东北天坐标系 X轴 xff1a
  • 如何消除CACHE对DMA的影响?

    各位看官 xff0c 阅读之前 xff0c 请帮忙点击这里一下 xff0c 多谢 xff01 嵌入式系统中的CACHE 问题 郑州解放军信息工程大学 xff08 450002 xff09 陈曦 李汉宁 随着社会的发展 人们生活水平的提高 x

随机推荐

  • 12种性格导致贫穷

    每个人都有不同的性格和个性 有的性格对于挣钱是有帮助的 有的性格却容易导致贫困 大量的研究表明 至少有十二种性格容易导致贫困和失败 第一 知足 只要有吃有穿 腹饱体暖 就感到满足 对于财富没有追求 第二 自满 自己的总是最好的 这种人不愿与
  • 上海房地产市场救市14条政策出台

    值得纪念的一天 http www sina com cn 2008年10月23日05 53 东方网 东方网10月22日消息 xff1a 为促进本市房地产市场健康发展 xff0c 根据财政部 国家税务总局 中国人民银行等部门有关文件精神 xf
  • 天涯上各大公司裁员应对金融危机的强帖,不断更新中……

    http www tianya cn publicforum content no20 1 171416 shtml 俺的东家赫然在列 xff0c 俺作证 xff0c 裁员是真的 活过冬天就会在春天复苏 xff0c 如果死在冬天 xff0c
  • 学习笔记-Semihosting

    如何理解Semihosting xff08 老帖重发 xff0c 写得比较久了 xff09 Semihosting xff0c 顾名思义 xff0c 就是 34 半主控 34 xff0c 意思就是说 xff0c 运行在target boar
  • 开发笔记-NAND Flash Bad Block Management

    1 xff09 为什么会出现坏块 由于NAND Flash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠 xff0c 因此 xff0c 在NAND的生产中及使用过程中会产生坏块 坏块的特性是 xff1a 当编程
  • ThreadX 实时操作系统

    ThreadX 实时操作系统 xff08 RTOS xff09 Express Logic日前發佈了支援Altera Nios II軟式核心嵌入處理器的ThreadX即時作業系統 RTOS xff0c 全新的ThreadX具備快速軟體計時器
  • React 条件渲染组件

    组件通常需要根据不同的条件显示不同的内容 xff0c 以及根据应用的状态变化只渲染其中的一部分 在 React 中 xff0c 可以使用 JavaScript 语法有条件地呈现 JSX xff0c 比如 if 语句 amp amp 和 操作
  • BDM的禅义

    2006 4 13 13 16 00 BDM的禅义 这片文章译自 the zen of bdm xff0c 翻译的不好 xff0c 还请大家多提意见 介绍 你可能感到奇怪 xff0c 为什么说BDM的禅义 BDM xff08 背景调试模式
  • RTOS基本原理:多任务和调度-FreeRTOS是如何工作的

    FreeRTOS是如何工作的 RTOS基本原理 多任务和调度 作者 xff1a Gavin Lee 来源 xff1a upsdn net 更新日期 xff1a 2006 04 12 RTOS基本原理 多任务 调度 上下文切换 实时应用 实时
  • 上下文切换-FreeRTOS是如何工作的

    FreeRTOS是如何工作的 上下文切换 作者 xff1a Gavin Lee 来源 xff1a upsdn net 更新日期 xff1a 2006 04 13 上下文切换 跟任何其他程序一样 xff0c 一个任务执行时 xff0c 它使用
  • 国产手机操作系统艰难探索

    4大阵营纷争劲起 国产手机操作系统艰难探索 作者 xff1a 连晓东 出处 xff1a 中国电子报 2005 7 13 13 07 52 阅读 lt script src 61 34 http service donews com numb
  • 嵌入式系统和嵌入式操作系统

    嵌入式系统和嵌入式操作系统 西南交通大学电气学院 张湘 肖建 2004 10 2 文章从概念 特点 种类等不同方面就嵌入式系统和嵌入式操作系统做了介绍 一 什么是嵌入式系统 嵌入式系统一般指非PC系统 xff0c 有计算机功能但又不称之为计
  • FPGA与SRAM相结合完成大容量数据存储

    FPGA与SRAM相结合完成大容量数据存储 作者 xff1a 安莎莎 赖伟林 张辉 阅读 xff1a 248 引用 xff1a 0 发布时间 xff1a 2006 05 25 20 01 出处 xff1a 电子产品世界 西安电子科技大学 通
  • Git客户端(Windows系统)的使用

    分类 xff1a Ubuntu 2013 09 03 02 15 212人阅读 评论 0 收藏 举报 本文环境 xff1a 操作系统 xff1a Windows XP SP3 Git客户端 xff1a TortoiseGit 1 8 5 0
  • PX4飞控-自定义发送MavLink消息

    PX4飞控 自定义发送MavLink消息 一 自定义XML文件 如图所示 这相当于定义了一个结构体 xff0c 结构体里面就有一个类型为uint8 t的u8元素 使用的id端口为150 xff0c 这里注意不要与已经存在的id重复 二 使用
  • IPv4和IPv6何去何从

    一 缘起 某一天 xff0c 在公司技术群内运维大佬们发了这么一条消息 这条消息瞬间勾起了我的好奇心 什么是IPv6 xff1f 为什么要切IPv6 xff1f 于是在上班时多去了几次去卫生间之后 xff0c 对IPv6有了一些初步认识 x
  • 利用kalibr工具进行camera-IMU标定

    camera IMU标定 一 camera IMU标定 简述 1标定目的 xff1a 我们进行camera IMU的目的是为了得到IMU和相机坐标系的相对位姿矩阵T 2标定工具 xff1a 我们利用Kalibr标定工程对camera IMU
  • React State 状态

    React State 状态 React 把组件看成是一个状态机 xff08 State Machines xff09 通过与用户的交互 xff0c 实现不同状态 xff0c 然后渲染 UI xff0c 让用户界面和数据保持一致 React
  • C#实现窗体内容随着窗体的缩放而缩放

    private float X private float Y 获取控件的width height left top 字体大小的值 存放在控件的Tag属性中 private void setTag Control cons 遍历窗体中的控件
  • ROS基础 - dynamic_reconfigure 动态参数

    ROS基础 dynamic reconfigure 动态参数使用 实例详解 采用 ROS dynamic reconfigure 的形式 xff0c 可以在程序运行过程中实时更改参数大小 xff0c C 43 43 代码通过回调函数接收数据