前言
本人ROS小白,利用寒假时间学习ROS,在此以笔记的方式记录自己每天的学习过程。争取写满15篇(15/15)。
环境:Ubuntu20.04、ROS1:noetic
环境配置:严格按照下方学习链接的教程配置,基本一次成功。
学习链接:【Autolabor初级教程】ROS机器人入门
对应链接文档:ROS机器人入门课程《ROS理论与实践》
笔记绝大部分代码使用Python语言编写。
本期关键词:cfg文件,rqt
概念
动态参数是一种可以在运行时更新参数而无需重启节点的参数配置策略。
客户端配置
流程如下:
- 创建功能包,添加依赖:
roscpp rospy std_msgs dynamic_reconfigure
- 创建cfg目录,新建并编辑.cfg文件
- 配置CMakeLists.txt并编译
添加.cfg文件
#! /usr/bin/env python
from dynamic_reconfigure.parameter_generator_catkin import *
PACKAGE="cfg_demo" # 功能包名,下面会用到
gen = ParameterGenerator() # 创建参数生成器
# 向参数生成器添加参数:
gen.add("int_param",int_t,0,"整型参数",50,0,100)
gen.add("double_param",double_t,0,"浮点参数",1.57,0,3.14)
gen.add("string_param",str_t,0,"字符串参数","hello world ")
gen.add("bool_param",bool_t,0,"bool参数",True)
many_enum = gen.enum([gen.const("small",int_t,0,"a small size"),
gen.const("mediun",int_t,1,"a medium size"),
gen.const("big",int_t,2,"a big size")
],"a car size set")
gen.add("list_param",int_t,0,"列表参数",0,0,2, edit_method=many_enum)
# 配置节点,并退出
# generate(pkgname,nodename,name)
# 注意:以上第三个参数name,需要和本配置文件名的命名部分相同,这里是“demo.cfg”则name为demo
exit(gen.generate(PACKAGE,"dr_node","demo"))
注意:在编写.cfg文件时,可以先把.cfg文件的后缀改为.py,方便编写配置,编写完之后将.py改回.cfg,再进行编译。
服务端配置
- 示例代码如下:
#! /usr/bin/env python
import rospy
from dynamic_reconfigure.server import Server
from cfg_demo.cfg import demoConfig
def cb(demoConfig,level): # 这个回调函数一定得有两个输入参数,level虽然暂时没用上但是得有,删去会报错
rospy.loginfo("python 动态参数服务解析:%d,%.2f,%d,%s,%d",
demoConfig.int_param,
demoConfig.double_param,
demoConfig.bool_param,
demoConfig.string_param,
demoConfig.list_param
)
return demoConfig # 这里一定得有一个return
if __name__ == "__main__":
rospy.init_node("dr_p")
server=Server(demoConfig,cb)# 创建一个服务器,cb会回调函数
rospy.spin()
- 使用rosrun运行以上代码后,新开终端运行rqt,即可通过rqt工具实时修改参数值,且服务端节点不用重启即可更新参数配置。