首页 > 其他分享 >ROS 动态参数服务器教程

ROS 动态参数服务器教程

时间:2024-03-04 20:35:10浏览次数:34  
标签:教程 ros cfg dynamic 参数 reconfigure 服务器 ROS gen

ROS动态参数服务器

ros动态参数在官方叫做dynamic_reconfigure,这个功能的作用是用于node运行时修改内部参数,区别于静态读取本地yaml文件参数的方式(更常用),请见另一github仓库

主要用途是在调试机器人时能动态修改机器人参数,而不需要重新编译。

具体操作流程:

1、创建一个cfg文件(python文件),里面定义参数,说白了就像是一个自定义msg。

2、编译功能包,ros会帮我们生成cfg文件的cpp和py文件,以供调用。所以说和自定义msg很像。

3、编写当cfg文件参数修改时的回调函数。

4、使用rqt_reconfigure图形化界面修改cfg文件参数,查看结果。

说实话,着用起来是真的很麻烦,ros门槛是真多。

创建cfg文件

新建功能包依赖于roscpp, rospy, dynamic_reconfigure。

cfg文件支持,int,double,string,bool,枚举数据类型

创建cfg/mycar.cfg文件

"""
生成动态参数 int,double,bool,string,枚举
实现流程:
    1.导包
    2.创建生成器
    3.向生成器添加若干参数
    4.生成中间文件并退出

"""

# 1.导包
from dynamic_reconfigure.parameter_generator_catkin import *
PACKAGE = "learning_dynamic_reconfigure"

# 2.创建生成器
gen = ParameterGenerator()

# 3.向生成器添加若干参数
#add(name, paramtype, level, description, default=None, min=None, max=None, edit_method="")
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)

# 4.生成中间文件并退出
exit(gen.generate(PACKAGE,"dr_node","mycar")) #注意最后一个参数必须是cfg文件名

编译cfg文件

mycar.cfg文件其实就是一个py文件,ros编译后生成对应的cpp和py的头文件,分别在devel/include和devel/lib下面。

#cmakelists.txt修改
generate_dynamic_reconfigure_options(
  cfg/mycar.cfg
)

catkin_make编译后,会在devel/include生成对应的cpp头文件,以xxxConfig.h结尾,在devel/lib/python3下面生成python的调用文件,以xxxConfig.py结尾。

编写回调函数

当参数值发生变化时触发回调函数。

创建src/use_dr.cpp文件

#include "dynamic_reconfigure/server.h"
#include "learning_dynamic_reconfigure/mycarConfig.h"
#include "ros/ros.h"
/*
   动态参数服务端: 参数被修改时直接打印
   实现流程:
       1.包含头文件
       2.初始化 ros 节点
       3.创建服务器对象
       4.创建回调对象(使用回调函数,打印修改后的参数)
       5.服务器对象调用回调对象
       6.spin()
*/

void cb(learning_dynamic_reconfigure::mycarConfig& 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<learning_dynamic_reconfigure::mycarConfig> server;
  // 4.创建回调对象(使用回调函数,打印修改后的参数)
  dynamic_reconfigure::Server<
      learning_dynamic_reconfigure::mycarConfig>::CallbackType cbType;
  cbType = boost::bind(&cb, _1, _2);
  // 5.服务器对象调用回调对象
  server.setCallback(cbType);
  // 6.spin()
  ros::spin();
  return 0;
}

cmakelists.txt文件

add_executable(use_dr_node src/use_dr.cpp)
target_link_libraries(use_dr_node
  ${catkin_LIBRARIES}
)

catkin_make编译

rqt_reconfigure

使用图形化工具修改参数,回调函数结果。

roscore
# 启动ros节点
rosrun learning_dynamic_reconfigure use_dr_node
# 使用图形化界面
rosrun rqt_reconfigure rqt_reconfigure

或者使用launch文件启动

<launch>
  <node name="learning_dr" pkg="learning_dynamic_reconfigure" type="use_dr_node" output="screen"/>
  <node name="rqt_reconfigure" pkg="rqt_reconfigure" type="rqt_reconfigure" />
</launch>

功能包使用方法

# 创建工作空间
mkdir ~/catkin_ws/src
cd ~/catkin_ws/src
git clone https://github.com/LadissonLai/learning_dynamic_reconfigure.git
cd ~/catkin_ws
catkin_make
source ./devel/setup.bash
roslaunch learning_dynamic_reconfigure start.launch

完整项目

完整项目查看github仓库

标签:教程,ros,cfg,dynamic,参数,reconfigure,服务器,ROS,gen
From: https://www.cnblogs.com/LadissonLai/p/18052593

相关文章

  • C++ 简易STL 教程 与 C++ 标准库
    C++STL(标准模板库)是一套功能强大的C++模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。C++标准模板库的核心包括以下三个组件:组件描述容器(Containers)容器是用来管理某一类对象的集合。C++提供了各种不......
  • ROS 加载yaml教程
    ros加载yaml文件ROS官方提供了自动加载yaml文件的功能,并且集成到了launch文件里面,只需要使用rosparam标签就能把yaml配置文件加载到ros的参数服务器里面,然后使用nodehandle.getParam()函数就可以方便的使用了。下面给出关键的使用步骤:编写yaml文件。注:避免使用-分割数组,否则......
  • ROS pluginlib使用教程
    pluginlib用法通俗一点说,plugin的用法就像是面向对象编程里面的多态。插件就是子类,插件实现父类的方法,那么系统调用父类方法时就是子类的方法,也就实现了替换。对应ROS里面只需要在launch文件中选择想要的插件,无需修改预案系统即可完成替换。这里实现一个常用的plugin场景。core......
  • ROS 同一工作空间下两个功能包如何相互调用
    如何在同一工作空间下调用另一ros功能包本项目有两个ros功能包,a_pack和b_pack,a_pack调用了b_pack的函数,本项目为了展示如何配置b_pack和a_pack功能包,让a_pack可以调用b_pack。在c++编程中,常见用法是将b_pack编译成库文件,然后b_pack对外提供头文件,a_pack对b_pack的调用就是通过引......
  • 连接服务器时出现“@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@”
    https://blog.csdn.net/qq_34629975/article/details/79672794https://blog.csdn.net/mocoll/article/details/130958725?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-130958725-blog-108189961.235%5E......
  • codeblocks两种创建文件的方式(含调试教程)
    codeblock用法以及调试教程codeblock两种创建文件的方式:1.直接建一个空白文件这种方式创建新文件的缺点是不能调试,debug是灰色的不能点第二种创建文件的方式:新建一个项目project创建一个空项目同样新建一个空白文件,只不过这种方法会提示你是否要把这个文件放在项目里先......
  • docker系列教程04---容器网络
    一、Docker不启动时默认的网络情况这里先把Docker停掉了,然后咱们ifconfig看一眼:ifconfig ens33不用多说了,lo为回环。这里可能还会有一个virbr0,在CentOS7的安装过程中如果有选择相关虚拟化的的服务安装系统后,启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡(virbr......
  • WIFI&蓝牙(ESP32)转CAN总线&串口TTL模块-B1-设备作为TCP客户端连接TCP服务器,实现RS48
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ESP32_CAN"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>说明这节测试的是让设备连接路由器,然后设备以......
  • 全网首套完整containerd容器工具教程
    1、Containerd的由来【Docker名噪一时,捐出runC】2013年docker公司在推出docker产品后,由于其对全球技术产生了一定的影响力,Google公司明显感觉到自己公司内部所使用的Brog系统江湖地位受到的威胁,希望Docker公司能够与自己联合打造一款开源的容器运行时作为Docker核心依赖,但Docker......
  • python获取服务器基本信息的脚本
     之前我发布了批量收集服务器信息脚本,本次更新优化了脚本,对脚本设置了trycatch抛出异常等等,收集信息如下:ip地址","主机名","序列号","服务器型号","系统盘数量","系统盘符","系统盘容量","系统盘分区","硬盘列表","硬盘数量","CPU核数","CP......