(1/100) ros的plugin插件和动态参数配置dynamic_reconfigure

2023-05-16

写在前面:实际机器人开发中,往往会存在很多参数,这些参数需要在实际的调试中得出,为了更高效的开发与测试,则选择使用动态的参数配置。而在机器人功能模块层面,我们可能也需要在不同的场景动态加载不同的功能算法。比如,机器人的规划算法,不同的场景下可能会选择不同的规划算法,为了更方便的加载,将不同的规划算法以统一的接口进行封装,然后利用plugin机制进行动态的加载。
参考博客:

  1. ROS学习之路07:编写动态重配置(dynamic_reconfigure)参数的节点
  2. ROS设置plugin插件

1.动态参数配置

主要步骤:

1.1创建功能包

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

1.2.添加动态重配置文件(.cfg)

一般会像msg一样有一个头文件,但是这个文件是.cfg格式,里面一些参数的说明

#gen.add(参数名称,   参数类型,位掩码,参数描述,                        默认值,最小值,最大值)
gen.add("int_param", int_t,        0,           "An Integer parameter",  50 ,          0,             100)

1.3.修改CmakeLists.txt

#dynamic reconfigure
generate_dynamic_reconfigure_options(
    cfg/GoalAdjustInCircle.cfg
)

1.4.添加动态配置节点

主要头文件

#include <dynamic_reconfigure/server.h>
#include "goal_adjust/GoalAdjustConfig.h"
//声明
    dynamic_reconfigure::Server<::goal_adjust::GoalAdjustInCircleConfig> *server_;    dynamic_reconfigure::Server<::goal_adjust::GoalAdjustInCircleConfig>::CallbackType callbackFun;
    void reconfigureCB(::goal_adjust::GoalAdjustInCircleConfig &config, uint32_t level);
    ::goal_adjust::GoalAdjustInCircleConfig dynamic_config_;
    
//定义
      server_ = new dynamic_reconfigure::Server<::goal_adjust::GoalAdjustInCircleConfig>(ros::NodeHandle("~/" + name));
      callbackFun = boost::bind(&GoalAdjustInCircle::reconfigureCB, this, _1, _2);
      server_->setCallback(callbackFun);
 
dynamic_reconfigure::Server<dynamic_reconfigure::GoalAdjustConfig> server;
dynamic_reconfigure::Server<dynamic_reconfigure::GoalAdjustConfig>::CallbackType callbackFun;
callbackFun = boost::bind(&callback, -1, -2);//绑定实际的回调函数
Server.setCallback(callbackFun);//为服务器设置回调函数

2.plugin插件

实现一个插件主要需要以下几个步骤:
1) 创建基类,定义统一的接口
2) 创建plugin类,继承基类
3) 注册插件
4) 编译生成插件的动态链接库
5) 将插件加入ros系统

2.1 创建基类,定义统一的接口

这里利用navigation下的nav_core写了一个目标点调节的基类;

#ifndef NAV_CORE_BASE_GOAL_ADJUSTER_H
#define NAV_CORE_BASE_GOAL_ADJUSTER_H
#include <geometry_msgs/PoseStamped.h>
#include <costmap_2d/costmap_2d_ros.h>
namespace nav_core {
class BaseGoalAdjuster{
 	protected:
  		BaseGoalAdjuster(){}
 	public:
  		virtual ~BaseGoalAdjuster(){}
  		virtual void initialize(std::string name, costmap_2d::Costmap2DROS* costmap_ros) = 0;
  		virtual bool adjustGoal(const geometry_msgs::PoseStamped& goal,
                         geometry_msgs::PoseStamped& new_goal, double adjust_angle, std::string adjust_mode) = 0;       
};
}  // namespace nav_core
#endif  // GOAL_ADJUSTER_BASE_GOAL_ADJUSTER_H

2.2 创建plugin类,继承基类

class GoalAdjustInCircle : public nav_core::BaseGoalAdjuster
{
public:
	  GoalAdjustInCircle();
	  virtual ~GoalAdjustInCircle();
	  void initialize(std::string name, costmap_2d::Costmap2DROS* costmap_ros) override;
	  bool adjustGoal(const geometry_msgs::PoseStamped& goal,
		                 geometry_msgs::PoseStamped& new_goal, double adjust_angle, std::string adjust_mode) override;
};

2.3 注册插件

#include <pluginlib/class_list_macros.h>
PLUGINLIB_EXPORT_CLASS(cadmus::goal_adjust::GoalAdjustInCircle, nav_core::BaseGoalAdjuster)

2.4 编译生成插件的动态链接库

在CmakeLists.txt中写入以下两行代码

 install(FILES goal_adjust.xml
    DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}

2.5 将插件加入ros系统

a.创建插件描述文件xml

<library path="lib/libgoal_adjust">
  <class name="goal_adjust/GoalAdjustInCircle" type="cadmus::goal_adjust::GoalAdjustInCircle" base_class_type="nav_core::BaseGoalAdjuster">
    <description>
      goal pose adjust in circle.
    </description>
  </class>
</library>

b.导出插件

在package.xml文件中添加以下代码,将创建的插件导出:

<export>
    <nav_core plugin="${prefix}/goal_adjust.xml" />
</export>

c.验证

编译完成后,输入 rospack plugins --attrib=plugin nav_core,输出结果为创建的插件的绝对路径。

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

(1/100) ros的plugin插件和动态参数配置dynamic_reconfigure 的相关文章

  • C# 4:确定动态调用中的参数传递语义

    在 C 4 中 当从 DynamicObject 派生并重写 TryInvokeMember 时 如何确定在调用站点提供的任何参数是否已在不带 out 或 ref 语义的情况下传递 我可以在提供的活页夹中看到一些包含此信息的私有字段 即 M
  • javascript:动态更改名称属性

    我正在处理这个脚本 它没有错误 但我想在上面添加一些功能 就像当我单击它添加的按钮时一样 但我希望输入文本的名称属性也被更改 这是我的脚本 javascript var a 1 function add var fContent docum
  • HTML5视频播放器:动态加载视频

    那么 使用兼容 HTML 5 的视频播放器 如 Video JS 如何动态加载视频 而无需重新加载整个页面呢 想象一下 一个链接列表 类似于播放列表 每个链接都指向一个视频 单击链接时 我想将所选视频加载到播放器中 目前 我正在使用一个包含
  • 如何根据 iPhone 中的文本大小动态增加按钮宽度?

    我以编程方式创建了 10 个按钮 并在按钮中设置了标题 现在我想动态增加按钮框架大小 它取决于文本 我给出了一些条件并设置了框架大小 但我如何设置确切的帧大小取决于文本 动态获取文本 我的示例代码是 float x 0 y 0 w h 20
  • 一个构造函数 - 多个参数

    我在一些 Java 编程竞赛中找到了一个任务 必须创建仅包含一个参数 文本 和一个构造函数的类 Sentence 这是示例测试代码 Sentence s1 new Sentence only CAT s2 new Sentence and
  • 为什么在尝试调用采用动态参数的基本构造函数/方法时会出现此编译错误?

    在重构一些代码时 我遇到了这个奇怪的编译错误 构造函数调用需要动态分派 但不能这样做 因为它是构造函数初始值设定项的一部分 考虑强制转换动态参数 当尝试调用采用动态参数的基本方法 构造函数时 似乎会发生这种情况 例如 class Class
  • Dynamic_cast 是如何工作的?

    如果您有以下情况 class Animal class Bird public Animal class Dog public Animal class Penguin public Bird class Poodle public Dog
  • 动态 SQL 示例

    我最近了解了什么是动态 sql 它对我来说最有趣的功能之一是我们可以使用动态列名和表 但我无法思考现实生活中有用的例子 我唯一想到的是统计表 假设我们有一个包含名称 类型和created data 的表 然后我们想要一个表 其列中是从cre
  • C# 4.0 中的“动态”类型有何用途?

    C 4 0 引入了一种称为 动态 的新类型 听起来不错 但是程序员会用它做什么呢 有没有什么情况可以挽救局面 The dynamic添加了关键字以及 C 4 0 的许多其他新功能 以便更轻松地与具有不同 API 的其他运行时中或来自其他运行
  • 动态服务器时间

    据我了解 我无法使用脚本中的 settimeout 在 IE 中获取动态服务器时间 我发现了这个例子 function timeExam ajax url inc clock php success function data clock
  • 将包裹的物品居中放置在弹性盒之间的空间中

    对于导航部分 我希望它使用space between理由 对于导航可能需要换行的较小显示器 我希望这些项目能够自行居中 而不是单独排成一行时粘在左侧 nav display flex width 100 flex flow row wrap
  • Laravel 模型动态属性

    我想问如何在模型类上创建动态属性 假设我有一个如下代码所示的表结构 Schema create materials function Blueprint table table gt increments id table gt strin
  • 无需外部库即可在 C# 中播放动态创建的简单声音

    我需要能够使用 C 动态生成波形并播放它 无需任何外部库 也无需在硬盘上存储声音文件 延迟不是问题 声音将在应用程序需要之前生成 实际上 如果不是微软表示 64 位版本的 Windows 不支持 Console Beep 方法 它可能会满足
  • 将按钮数组添加到 Android 应用程序中的 GridView

    我的应用程序将有 5 15 个按钮 具体取决于后端可用的内容 如何定义正确的 GridView 布局文件以包含一组按钮 每个按钮都有不同的文本和其他属性 每个按钮本质上都会将一个商品添加到购物车 因此除了添加到购物车的商品之外 onClic
  • 将动态属性映射读入 Spring 托管 bean

    我有一个像这样的属性文件 my properties file app One id 1 app One val 60 app Two id 5 app Two val 75 我将这些值读入 Spring 配置文件中 bean 的映射属性
  • 如何在 Javascript 中创建动态文件+下载链接? [复制]

    这个问题在这里已经有答案了 通常 HTML 页面可以包含可从服务器下载的文档 PDF 等 的链接 假设有一个启用 Javascript 的网页 是否可以从用户浏览器中动态创建一个文本文档 例如 并添加一个链接来下载该文档 而无需往返服务器
  • 从 PHP 中具有动态类名的类获取静态属性

    我有这个 一个保存类名的字符串变量 classname 一个字符串变量包含属性名称 propertyname 我想从该类获取该属性 问题是 该属性是静态的 我不知道该怎么做 如果该属性不是静态的 则它将是 classname gt prop
  • 在运行时执行 C# 或 VB.NET 代码

    最近在 Codility com 上花了一些时间 我突然想到了这个问题 它们如何执行您创建的代码 特别是与 C 和 VB NET 有关的代码 我基本上想知道的是 如何在表单上的文本框中输入一些代码 然后运行该代码 如果没有第三方工具 这可能
  • 如何在 JavaScript 中一次出现一个测验问题

    这里是 JavaScript 菜鸟 我正在尝试制作一个正在开发的测验应用程序 但我真的不知道如何继续 我把所有的问题都用html写出来了 情况是这样的 这个测验没有正确答案 只有答案值 该代码应该将每个问题的所有值相加 并根据累积的总分在最
  • php zlib:如何从字符串变量动态创建内存中的zip文件?

    这就是我需要的 a array folder gt anyfolder filename gt anyfilename filedata gt anyfiledata 我需要使用 a 中的压缩数据创建一个变量 zip 并将此 zip 输出到

随机推荐

  • 32位单片机 一个32位地址代表一个字节而不是4个字节(32位)

    在数据手册上 xff0c BSRR的偏移地址为0X18 xff0c 然后手册讲完BSRR后直接讲LCKR了 xff0c 并且LCKR的偏移地址是 OX1C 所以根据 OX1C 0X18 61 0X04 就知道BSRR是32位寄存器了 因为一
  • μC/OS-Ⅲ系统的任务切换和任务调度

    C OS 系统的任务切换和任务调度 一 任务切换 在操作系统中当任务需要从一个任务切换到另外一个任务时 xff0c 要将当前任务的现场保存到当前任务的堆栈中 xff08 当前任务现场主要指CPU相关寄存器 xff09 xff0c 然后回复新
  • 反射系数、驻波比、S参数之间的关系

    反射系数 驻波比 S参数之间的关系 xff01 转载 回波损耗 Return Loss 入射功率 反射功率 为dB数值 反射系数 反射电压 入射电压 为标量 电压驻波比 Voltage Standing Wave Ration 波腹电压 波
  • 浅谈PWM控制电机

    先简单说说这几种模式 1 双极模式 xff0c 即电枢电压极性是正负交替的 xff0c 优点 xff1a 能正反转运行 xff0c 启动快 xff0c 调速精度高 xff0c 动态性能好 xff0c 调速静差小 xff0c 调速范围大 xf
  • Nuttx系统学习笔记(三)——使用Nuttx操作STM32F429外设

    在上一篇 xff0c 我们已经学会了如何将Nuttx进行烧录 xff0c 以及学会了如何部署这个操作系统 xff0c 接下来我们就要使用这个操作系统来实现我们对嵌入式设备的控制 xff0c 当然也是从点灯开始的 这个基于Posix架构的操作
  • .NetCore 5.0 WebAPI 发布到iis时访问api出现404的解决方案

    情况介绍 xff1a 新建了个 NetCore 5 0 的 WebAPI项目 xff0c 发布部署到WINDOWS10 的 IIS后 xff0c 默认打开 http 127 0 0 1 swagger 出现404找不到页面的错误 原因 xf
  • 新手如何快速入门人工智能?

    网上有很多关于 新手如何快速入门人工智能 的文章 xff0c 但是对于真正的小白来说并没有太多的指导作用 作为新手想进入人工智能领域 xff0c 首先是要明确需要掌握哪些基础知识 xff0c 其次是掌握一套行之有效的学习方法 xff0c 最
  • 人工智能入门需要学习哪些课程?AI基础知识

    要入门人工智能 xff0c 需要掌握一些基础知识和技能 以下是一些入门人工智能需要学习的课程和基础知识 xff1a 人工智能入门需要学习哪些课程 xff1f AI基础知识 数学基础 xff1a 人工智能需要用到许多数学知识 xff0c 包括
  • 模块学习2:基于PELCO-D协议对云台进行定点控制

    开发手上的一个云台 xff0c 使用的就是PELCO D协议 这个协议开始网上找了一圈 xff0c 发现下载完整版的协议大多是还都要收费 xff0c 后面在官方下载了一份原版完整版协议的协议内容 xff0c 配合网上搜索到的资料完成对手上这
  • C语言和C++的区别(函数重载)

    C和C 43 43 的区别主要分为三部分 xff1a 接下来详细介绍一下函数部分的区别 1 返回类型 2 参数列表 此外 xff0c 在C 43 43 中还支持缺省参数 xff0c 而C语言不支持 什么是缺省参数呢 xff1f 缺省参数是声
  • 动态创建二维数组的两种方法

    首先来讲解一下什么是二维数组 其实二维数组也可以说是一个一维数组 xff0c 只是这个一维数组比较特别 xff0c 它的每一个元素都是一个一维数组 虽然二维数组在底层是按照一维数组的存储方式来存储的 xff0c 即存完第一行 xff0c 紧
  • 什么是进程?

    程序 xff1a 完成特定任务的一系列指令集合 代码段 43 数据段 放在磁盘中的程序 进程 xff1a 进行就是正在进行中的程序 1 用户角度 xff1a 进程是程序的一次动态执行过程 2 操作系统 xff1a 进程是操作系统分配资源的基
  • 死锁的四个必要条件和解决办法

    死锁概念及产生原理 概念 xff1a 多个并发进程因争夺系统资源而产生相互等待的现象 原理 xff1a 当一组进程中的每个进程都在等待某个事件发生 xff0c 而只有这组进程中的其他进程才能触发该事件 xff0c 这就称这组进程发生了死锁
  • 编译和链接的过程

    程序要运行起来 xff0c 必须要经过四个步骤 xff1a 预处理 编译 汇编和链接 接下来通过几个简单的例子来详细讲解一下这些过程 对于上边用到的几个选项需要说明一下 使用 gcc 命令不跟任何的选项的话 xff0c 会默认执行预处理 编
  • vim常用的功能

    vim是vi 的升级版本 xff0c 它兼容vi的所有指令 xff0c 而且还有一些新的特性 xff0c 比如说预付高亮 可视化操作不仅可以在终端进行 xff0c 还可以在 x Window mac os windows vim 有多种模式
  • vscode electron安装环境

    1 安装nodejs Node js 安装18 12 1LTS版本 安装完成后确认 node version 2 安装electron npm install electron g 验证是否安装成功 electron v 没成功 xff01
  • Debug和Release的区别以及obj文件的作用

    Debug和Release的区别 Debug xff1a 调试版本 xff0c 包含调试信息 xff0c 所以容量比release大很多 xff0c 并且不进行任何优化 xff0c xff08 优化会使调试复杂化 xff0c 因为进行优化肯
  • python中的import、from import以及import as的区别

    首先介绍一下import和include的区别或者说import相对include的好处 xff1a import导入的内容只会被包含一次 xff0c 在引入之前会检测是否已经存在该模块 xff0c 不存在才会被引入 xff0c 而incl
  • error while loading shared libraries: lib*.so: cannot open shared object file: No such file

    linux在编译文件时报错 xff1a slam sample error span class token keyword while span loading shared libraries libslam common so can
  • (1/100) ros的plugin插件和动态参数配置dynamic_reconfigure

    写在前面 xff1a 实际机器人开发中 xff0c 往往会存在很多参数 xff0c 这些参数需要在实际的调试中得出 xff0c 为了更高效的开发与测试 xff0c 则选择使用动态的参数配置 而在机器人功能模块层面 xff0c 我们可能也需要