3 ROS1通讯编程提高(2)
创始人
2025-06-01 16:30:48
0

3 ROS1通讯编程提高

  • 3.3 动态重配参数
    • 3.3.1 动态重配参数作用
    • 3.3.2 动态重配参数基本编程
      • 3.3.2.1 创建动态参数项目
      • 3.3.2.2 创建动态参数文件
      • 3.3.2.2 配置动态参数文件
      • 3.3.2.3 编译C++代码作为服务端
      • 3.3.2.4 编译Python代码作为服务端
    • 3.3.3 动态重配参数总结
  • 3.4 launch文件
    • 3.4.1 node标签
    • 3.4.2 其他标签

  • 其他ROS1学习笔记: ROS1学习笔记
  • 代码仓库:Github连接地址
  • 欢迎各位互相学习交流

3.3 动态重配参数

3.3.1 动态重配参数作用

参数服务器的数据被重新配置后时,如果节点不重新访问,那么就不能获取配置后的数据,针对这一特殊场景,ROS提出了动态重配参数(dynamic reconfigure),即参数一旦修改,能够使得节点读取修改后的数据,比如:在某些GUI界面中,可以向节点查询一组可重新配置的参数,包括它们的名称、类型和范围,并向用户呈现定制的效果。

3.3.2 动态重配参数基本编程

根据官网提供的教程:

3.3.2.1 创建动态参数项目

(一)创建功能包和ROS文件夹:

  1. 打开VS Code和工作空间,新建动作编程功能包并创建ROS文件夹结构。
    1. 打开VS Code和工作空间,在工作空间catkin_ws下输入命令code .右键工作空间catkin_ws的src目录,选择create catkin package然后在VS Code的提示下输入包名dy_reconfigure,回车之后输入依赖项roscpp rospy std_msgs即可。在功能包下新建cfg文件夹和scripts文件夹。
    1. 编写动态重配参数文件.cfg文件(类似于Python节点文件):
      动态重配参数文件相当于一个客户端文件,文件格式类似于Python。

3.3.2.2 创建动态参数文件

  1. 编写自定义动态重配参数文件myDyCfg.cfg
#!/usr/bin/env python
# -*- coding: utf-8 -*-# catkin_ws/src/dy_reconfigure/cfg/myDyCfg.cfg
# 指定功能包的位置
PACKAGE = "dy_reconfigure"# 导入包
from dynamic_reconfigure.parameter_generator_catkin import *# 2.创建动态重配参数生成器
gen = ParameterGenerator()# 使用方法add(name, type, level, description, default=None, min=None, max=None, edit_method="")
# name:一个字符串,用于指定应存储此参数的名称
# type:定义存储的值的类型,可以是int_t、double_t、str_t或bool_t中的任何一个
# level:A bitmask which will later be passed to the dynamic reconfigure callback.
# description:描述参数的字符串
# default:指定默认值
# min:指定最小值(可选,不适用于字符串和布尔值)
# max:指定最大值(可选,不适用于字符串和布尔值)gen.add("myint", int_t, 0, "整形式托拉条", 50, 0, 100)# 创建枚举类型,在rqt-gui实现下拉操作
myListobj = 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("mylist", int_t, 0, "下拉式列表", 1, 0, 3, edit_method=myListobj)# exit(gen.generate("功能包名", "节点名", "cfg文件名"))
exit(gen.generate(PACKAGE, "mydycfg_node", "myDyCfg"))

3.3.2.2 配置动态参数文件

(三)配置动态重配参数文件.cfg文件:

配置cfg文件主要包括给予cfg文件可执行权限,并且只需要在CMakeList.txt进行依赖项添加

  1. 赋予cfg文件可执行权限,在功能包的cfg文件夹下,执行命令sudo chmod +x *.cfg即可。

  2. 打开功能包的CMakeList.txt文件,主要修改两项

    1. 添加编译依赖项功能包:find_package(catkin REQUIRED COMPONENTS ..+ 依赖项功能包),大约在第10行,添加dynamic_reconfigure
# catkin_ws/src/dy_reconfigure/CMakeLists.txt
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsdynamic_reconfigure
)
    1. 添加自定义cfg文件:generate_dynamic_reconfigure_options (cfg/文件名),大约在第92行,如此时的文件名为myDyCfg.cfg
# catkin_ws/src/dy_reconfigure/CMakeLists.txt
generate_dynamic_reconfigure_options(cfg/myDyCfg.cfg
)

(四)编译cfg文件,查看中间文件:

  1. 在工作空间下编译,此时在工作空间的devel目录会多出几个文件,如
  • C++的中间文件在/home/ubuntu/catkin_ws/devel/include/功能包名/文件夹下,
  • Python的中间文件在/home/ubuntu/catkin_ws/devel/lib/python2.7/dist-packages/功能包名cfg

3.3.2.3 编译C++代码作为服务端

(五)编译C++代码作为服务端:

  1. 创建C++程序作为服务端,并在CMakeList.txt配置C++文件。
    1. 创建客户端程序。创建客户端程序dyconfig_cpp.cpp
// catkin_ws/src/dy_reconfigure/src/dyconfig_cpp.cpp
#include 
#include 
#include void callback(dy_reconfigure::myDyCfgConfig &config, uint32_t level) {ROS_INFO("终端打印输出,整型数值是 %d,下拉条层级是 %d",config.myint,config.mylist);
}int main(int argc, char **argv) {setlocale(LC_ALL,"");ros::init(argc, argv, "dy_configure");dynamic_reconfigure::Server server;dynamic_reconfigure::Server::CallbackType f;f = boost::bind(&callback, _1, _2);server.setCallback(f);ros::spin();return 0;
}
    1. 在CMakeList.txt文件中设置C++,主要包括三项
# catkin_ws/src/dy_reconfigure/CMakeLists.txt
add_executable(dyconfig_cpp_node src/dyconfig_cpp.cpp)add_dependencies(dyconfig_cpp_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})target_link_libraries(dyconfig_cpp_node ${catkin_LIBRARIES})
    1. 编译运行,并且使用rqt-gui动态调整数值。启动客户端rosrun dy_reconfigure dyconfig_cpp_node,启动rqt工具实现动态重调参数rosrun rqt_gui rqt_gui -s rqt_reconfigure

在这里插入图片描述

3.3.2.4 编译Python代码作为服务端

(六)编译Python代码作为服务端:

  1. 编写Python文件实现客户端

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# catkin_ws/src/dy_reconfigure/scripts/dyconfig_py.pyimport rospy
from dynamic_reconfigure.server import Server
from dy_reconfigure.cfg import myDyCfgConfigdef callback(config, level):rospy.loginfo("终端打印输出,整型数值是 %d,下拉条层级是 %d",config.myint,config.mylist)return configif __name__ == "__main__":rospy.init_node("dynamic_myDyCfg", anonymous = False)srv = Server(myDyCfgConfig, callback)rospy.spin()
    1. 给Python文件赋予可执行权限,在script文件夹下输入命令sudo chmod +x *.py即可赋予所有Python可执行权限。
    1. 运行py文件,打开rqt工具

在这里插入图片描述

3.3.3 动态重配参数总结

查考文献:

  • ROS-WIKI:dynamic_reconfigure/Tutorials

3.4 launch文件

launch文件能够在ROS中一次启动多个节点。下面主要介绍launch文件的常用启动参数和作用

3.4.1 node标签

  1. node主标签
    启动文件的核心是启动ROS节点,采用标签定义,语法如下:

从上面的定义规则可以看出,在启动文件中启动一个节点至少需要三个属性关键字: pkgtypename

    1. pkg定义节点所在的功能包名称;
    1. type定义节点的可执行文件名称,这两个属性等同于在终端中使用rosrun命令执行节点时的输入参数;
    1. name属性用来定义节点运行的名称,将覆盖编程节点文件中init()赋予节点的名称。
    1. output = "log/screen":将节点的标准输出打印到终端屏幕;
    1. respawn = "true/false":复位属性,该节点停止运行,则会自动重启,默认为false;
    1. required = "true/false":必要节点,当该节点终止时,launch文件中的其他节点也被终止;
    1. ns = "namespace":命名空间,为节点内的相对名称添加命名空间前缀。
    1. args = "arguments":节点需要的输入参数。

node存在子集标签env 环境变量设置remap 重映射节点名称param 参数设置和rosparam 参数设置,下面对其依次介绍。

  1. remap子标签:
    remap标签允许以更结构化的方式将名称重新映射参数传递给ROS节点,而不是直接设置的参数属性,使用用法如下所示:
             

其中from="原始话题名称" to "目标名称"

  1. param子标签
    parameter是ROS系统运行中的参数,存储在参数服务器中

在 launch文件中通过元素加载parameterlaunch文件执行后,parameter就加载到ROS的参数服务器上了。每个活跃的节点都可以通过ros::param:get()接口来获取parameter的值,用户也可以在终端中通过rosparam命令获得parameter的值。的使用方法如下:


parameter的参数主要入下:

    1. name="命名空间/参数名",参数名称,可以包含命名空间
    1. value="xxx" (可选),定义参数值,如果此处省略,必须指定外部文件作为参数源
    1. type="int" (可选),指定参数类型,如果未指定,roslaunch会尝试自动确定参数类型。
  1. rosparam子标签
    在很多复杂的系统中参数的数量很多,如果这样一个一个地设置会非常麻烦,ROS也为我们提供了另外一种类似的参数()加载方式帮助我们将一个YAML格式文件中的参数全部加载到ROS参数服务器中,需要设置command属性为“load”,还可以选择设置命名空间“ns”,如下所示:

3.4.2 其他标签

  1. arg:
    argument是另外一个概念,类似于launch 文件内部的局部变量,仅限于launch文件使用,便于launch文件的重构,与ROS节点内部的实现没有关系。

设置argument使用标签元素,语法如下:


其中包括的参数有(rgument标签不存在子集标签):

    1. name="参数名称"
    1. default="默认值" (可选)
    1. value="数值" (可选),不可以与 default 并存
    1. doc="描述"

launch文件中需要使用到argument时,可以使用如下方式调用:



  1. include标签:
    include标签用于将另一个 xml 格式的 launch 文件导入到当前文件,例如


其中属性包括:

    1. file="$(find 包名)/xxx/xxx.launch",要包含的文件路径
    1. ns="xxx" (可选),在指定命名空间导入文件

其中包含的子集标签有env环境变量和arg 将参数传递给被包含的文件。

相关内容

热门资讯

日常等车时看到的行业细节 干了五年户外广告投放,养成了一个职业病:但凡路过公交候车亭,总会多看两眼——不是看广告好不好看,而是...
黄金回收行业标准制定有哪些核心... 贵金属回购市场的需求背景 近年来随着黄金投资和消费市场的发展,黄金回收相关需求持续攀升。不同群体的诉...
全球黑色星期二!AI交易“崩盘... 【导读】AI交易为何“崩盘”? 中国基金报记者 泰勒 大家,你们今天还好吗?! AI交易在全球范围内...
原创 6... 年初抢金条的人还在站岗,如今金店柜台前冷冷清清 黄金又跌了。 6月23日,伦敦现货黄金价格日内急跌逾...
狂融294亿美元!SK海力士冲... 韩国股市再度迎来重磅消息。 周三,韩国存储芯片龙头SK海力士宣布,计划在7月10日登陆纳斯达克,通过...
比特币跌破6万!AI吸走资金、... 比特币正在为机构化转型付出代价。散户买盘萎缩、ETF资金持续外流、企业持仓者潜在抛售压力上升,加之A...
原创 默... 欧洲近期试图复刻1985年广场协议的剧本,德国总理默茨呼吁欧盟27国联合行动,要求中国签订类似协议以...
怎么选 泛娱乐赛道直播公司孵化... 泛娱乐直播创业的行业发展背景 近年来泛娱乐直播赛道持续保持增长态势,据公开数据资料显示,2024年国...
原创 腰... 最近黄金市场凉得彻底。各大品牌足金饰品克价跌破1300元关口,北京菜百6月21日报价已经掉到1260...
ST中装:公司主要银行账户已全... 证券之星消息,ST中装(002822)06月24日在投资者关系平台上答复投资者关心的问题。 投资者提...
2026年开窗机行业趋势与战略... 一、开篇引言:市场格局重塑下的选择逻辑 步入2026年,全球建筑智能化与绿色节能政策的叠加驱动,使开...
资金全面转向科技,传统消费企业... 近期 A 股出现明显风格切换,老牌消费资金持续流出,机构与传统上市公司纷纷加码半导体、算力赛道。 先...
合肥保利翡翠天奕具体交房时间是... 对于众多购房者而言,“合肥保利翡翠天奕具体交房时间是什么时候?能按时交房吗?”是心中最关切的问题。根...
港股风向标|恒指连续杀跌后企稳... 财联社6月24日讯(编辑 冯轶)今日港股短线企稳,三大指数集体收涨。截至收盘,恒生指数涨0.33%,...
瑞众人寿达州中支被罚17万,涉... 蓝鲸新闻6月24日讯,近日,国家金融监督管理总局达州监管分局发布行政处罚决定书,剑指瑞众人寿保险有限...
美国最担心的事还是来了,中国加... 最近这段时间,国际金融圈子里有一笔账,算得各家央行心里都不太踏实。 截至2026年春季,美国国债总规...
马斯克,不是万亿富豪了 资产历史性超过万亿美元不到两周,特斯拉、SpaceX掌门人埃隆·马斯克的身价近日快速下跌。 据中新经...
突发!金价跌破4000美元,近... 每经记者:杜宇 记者|杜宇 编辑|何小桃 杜恒峰 校对|金冥羽 金银价格大跳水。 6月24日晚,现货...
粗粮吃越多越好?很多糖友吃错升... 控糖圈一直流传多吃粗粮稳血糖,不少糖友直接三餐全吃粗粮、顿顿杂粮,不仅胃胀消化不良,餐后血糖反而不降...
持续大跌!刚刚,黄金跌破400... 潮新闻客户端 记者 吴恩慧 6月24日,贵金属再次大跌。 截至发稿时,现货黄金大跌近3%,跌破400...