ROS学习记录(一) Plugin插件

2023-05-16

前言:最近在学习无人驾驶路径规划和ROS的一些基础理论,过程中遇到了一些问题,写这个系列记录一下个人的学习过程。

遇到这个问题的初衷是看了小巨同学一篇帖子

使用自定义RRT*全局规划器建图导航

文中提到了向move_base中添加全局路径规划插件RRT的过程,刚好在学习过程中对插件及插件编写的原则这一部分不是很理解,所以跟着原帖复现了一遍并在此做一下记录,如有问题或错误的地方也欢迎指出和讨论。

一、move_base节点及插件

move_base是Navigation功能包中的核心节点,它在导航的任务中处于支配地位,其他的一些package都是它的插件

 图片来源:《重德智能机器人操作系统入门》

这里就以小巨同学文章中的自定义RRT算法作为例子来进行插件的编写及添加说明。由于RRT算法属于全局路径规划部分,所以插件类型是Base Global Planner

插件的概念并不是我们抽象的描述,而是在ROS里catkin编译系统能够认出的,并且与其他节点能够耦合的C++库。插件是可以动态加载的类,也就是说插件不需要提前链接到ROS的程序上,只需在运行时加载插件就可以调用其中的功能。

关于插件具体的介绍,可以参考roswiki中的具体介绍http://wiki.ros.org/pluginlib。

二、Plugin插件添加

先在工作空间中下载自定义RRT算法源码:https://github.com/li-huanhuan/rrt_star_global_planner

git clone https://github.com/li-huanhuan/rrt_star_global_planner

下载完成并catkin_make编译后有如下几个文件:

其中src文件夹中包含了RRT算法的源码,在这由于主要介绍插件的添加过程故不对源码进行解释。

1、插件注册

在src/rrt_star_ros.cpp文件中添加插件注册指令:

PLUGINLIB_EXPORT_CLASS(RRTstar_planner::RRTstarPlannerROS, nav_core::BaseGlobalPlanner)

含义:使RRTstar_planner::RRTstarPlannerROS类注册为move_base包中nav_core::BaseGlobalPlanner类的插件

2、编译

在CMakeLists.txt中添加库文件:

add_library(${PROJECT_NAME} src/rrt_star_ros.cpp)

3、插件描述文件

插件描述文件是一个XML文件,用于以机器可读格式存储有关插件的所有重要信息。它包含有关插件库的信息,插件的名称,插件的类型等。需要创建一个新文件并将其保存在包中的某个位置(如rrt_ star_global_planner包),并给它一个名称,如本例中的rrt_star_planner_plugin.xml

文件内容如下:

<library path="lib/librrt_star_global_planner">
  <class name="RRTstar_planner/RRTstarPlannerROS" type="RRTstar_planner::RRTstarPlannerROS" base_class_type="nav_core::BaseGlobalPlanner">
    <description>This is RRT Star Global Planner Plugin by Rafael Barreto.</description>
  </class>

</library>

第一行 <library path="lib/librrt_star_global_planner">指定插件库的路径。路径是lib/librrt_star_global_planner,其中lib是目录中的文件夹 ~/catkin_ws/devel/

第2-3行指定了实现插件的类的名称,例子中是RRTstar_planner::RRTstarPlannerROS,而base_class_type指定了实现插件的基类的名称,例子中是nav_core::BaseGlobalPlanner

第4行<description> 标记提供关于插件的简要说明。

4、注册插件到ROS包系统

在package.xml中指向插件描述文件:

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

其中在${PREFIX}中确定文件完整的路径

此外package.xml文件还需添加nav_core包的依赖性

  ...  
  <build_depend>pluginlib</build_depend>

  ...
  <build_export_depend>pluginlib</build_export_depend>

  ...
  <exec_depend>pluginlib</exec_depend>

  ...

5、在ROS包系统中,查询可用插件

catkin_make编译后可以通过rospack查询ROS包系统,以查看任何给定的包可用的插件:

rospack plugins --attrib=plugin nav_core

如果插件添加成功,会在终端显示如下结果: 

6、在launch文件中的movebase添加新的规划器添加为全局规划器的参数

我这里以《ROS机器人开发实践》中的例程为例进行插件的添加,在mrobot_navigation功能包下的launch文件中找到运行move_base节点的文件,并将注册好的插件添加进来:

…

<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true">
    <param name="base_global_planner" value="RRTstar_planner/RRTstarPlannerROS" />

…

三、测试插件功能

在终端中运行导航功能包:

roslaunch mrobot_navigation fake_nav_demo.launch

在rviz中找到Global Plan,并选择话题:/move_base/RRTstarPlannerROS/plan

 这样就将全局路径规划选中了我们自己添加的RRT算法,最终效果如下:

写在最后

ros中的插件功能方便我们添加自己写的算法,学会插件文件的编写及添加过程对后续在ros平台验证算法很有帮助。

此外由于是第一次写博客,可能有出错或者疏忽地方,还请各位海涵。

PS:我学习ROS主要是参考古月老师的教材:《ROS机器人开发实践》(若有需要PDF书籍的可以在评论区留下邮箱),在这特别感谢周_云川同学提供的电子教材。

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

ROS学习记录(一) Plugin插件 的相关文章

随机推荐

  • linux源码安装python3

    python3源码安装 前置环境解压提前解决依赖性源码编译三部曲验证安装 前置环境 先要准备好源码包 xff0c 去官网下载自己想要的版本https www python org ftp python 我下的是3 9 7的直接下到了要安装p
  • 【shell】用 grep 查找包含字符串的文件|grep 过滤|取匹配行的前后n行

    目录 即可即用 grep 匹配多个关键字 与find的不同 grep检索文件内容详解 grep指定搜索的文件类型 grep 不起作用 xff1f 过滤了还是显示 匹配特定的列 指定在哪些文件 哪类文件 哪个目录里搜索 搜索时包含 排除哪类文
  • 基于FreeRTOS+STM32实践-01

    目的 xff1a 复习FreeRTOS以及STM32的使用 xff0c 完成51单片机到stm32的过渡 该项目会与传感器以及其他种类的外设相联系 xff0c 以提升代码管理能力和逻辑能力 在51单片机中我们使用了很多传感器和外设 xff0
  • C++点亮stm32LED灯

    目的 xff1a 引导初学者使用C 43 43 对STM32进行编程 1 xff1a 在C语言中我们没有封装 继承 多态的概念 xff0c 没有面向对象的程序思想 这些思想一般是源于C 43 43 语言的 xff0c C语言是面向过程的语言
  • 基于FreeRTOS+STM32实践-02

    按键学习 按键常见的为独立按键和行列按键 stm32中不存在Bit类型数据 而在51内核中存在bit类型的 按键引脚分配 开发板自带3个独立按键 xff1a KEY0 PC5 KEY1 PA15 WK UP PA0 行列键盘引脚分配 xff
  • 基于FreeRTOS+STM32实践-03

    03 xff1a 按键的扫描 资源 xff1a 软件定时器 43 信号量 43 消息队列 在51单片机中的按键扫描是 xff1a 标志位在10ms定时器1的中断中置一 xff0c 在while 1 中写一个如下的按键扫描程序 xff0c 目
  • 【正点原子】手把手教你学FreeRTOS-01

    内容为 xff1a 正点原子FreeRTOS的视频前1 8 目的 xff1a 简单的回忆一下 xff0c 加深印象和理解 单片机的发展趋势 操作系统的核心就是 任务调度器 xff0c 关于这些特点 xff0c 也是我们学习FreeRTOS的
  • 【正点原子】手把手教你学FreeRTOS-02

    内容为 xff1a 正点原子FreeRTOS的视频第9 10节 一个任务所需要的资源这些东西在标准库需要我们自己写 xff0c 但是在MX软件中可以自己生成 四项基本 xff1a 优先级 堆栈大小 句柄 任务函数声明 一个XXX任务需要的资
  • 【正点原子】手把手教你学FreeRTOS-03

    基本内容 xff1a 任务的创建 控制块 删除 挂起 恢复的使用 创建任务函数的核心 栈的增长方向为向下的则portSTACK GROWTH gt 0 而我们stm32使用的就是向下因此执行这个 xff0c 下面的就是向上不执行 核心函数p
  • 【正点原子】手把手教你学FreeRTOS-04

    FreeRTOS的中断配置是一个很重要的内容 xff0c 需要根据所使用的MCU来具体配置 重点 xff1a 不同的MCU所在FreeRTOS的配置是不一样的 xff0c 当你使用了其他芯片 xff0c 配置就有所不同了 xff0c 不要固
  • 千锋教育+计算机四级网络-计算机网络学习-01

    目录 课程链接 最早的广域网 计算机网络发展阶段 计算机网络的定义与要点 英文单词网络术语与解释 计算机网络分类 广域网技术 城域网 局域网 个人局域网 五种基本的网络拓扑结构 误码率 电路交换网特点 分组交换 交换方式 TCP IP协议族
  • Keil + STM32学习嵌入式数据结构-01

    视频链接 初识数据结构 xff0c 十天搞定嵌入式数据结构 哔哩哔哩 bilibili 课程目的 学会嵌入式经常使用的数据结构 具备基础知识 具有C语言基础 xff08 结构体 指针 内存 xff08 malloc xff09 具有数据结构
  • 【网络】nmcli 网络管理工具|ip命令|ethtool 命令|centOS 8 重启网络服务 / 重启网卡

    目录 nmcli 命令 前提 重启网络服务 重启网卡 实例 nmcli输出说明 3种网络配置方法 nmcli的命令参数 Tips ethtool 命令 IP命令 添加网卡到配置文件 Linux系统怎么查看网卡的UUID nmcli 命令 原
  • 正点原子【第四期】手把手教你学 Linux之驱动开发篇-01

    学习目的 了解驱动开发和应用开发的过程 xff0c 具有一定的基础就行 第一讲 xff1a linux驱动开发与裸机开发区别 刚开始听不懂很正常 xff0c 等之后学了一点你就会知道它说啥了 第二讲 xff1a 字符设备驱动开发基础 字符设
  • 普中科技手把手教你学ESP32--基于MicroPython-02

    第四讲 xff1a LED灯实验 MicroPython函数使用 本来需要加入machine 的 xff0c 但是我引入了form machine import Pin就可以直接省略了 machine是一个模块 xff0c Pin是mach
  • 千锋教育嵌入式物联网教程之系统编程篇学习-05

    目录 无名管道 无名管道创建 pipe 管道重点问题 无名管道读写规律 fcntl设置文件阻塞特性 文件描述符概述 文件描述符的复制 dup和dup2 dup函数 dup2 无名管道 进程间的通信 xff0c 大部分都是使用内核空间进行操作
  • 黑马程序员-Linux系统编程-01

    课程链接 01 Linux命令基础习惯 Linux系统编程 哔哩哔哩 bilibili 课程重点笔记 01 linux命令基础习惯 终端 终端 xff1a 一切输入 输出的总称 xff0c 因此终端并不是一定指的是命令行 xff0c 只要是
  • RT-Thread初识学习-04-GPIO操作

    前言 xff1a 在裸机开发和FreeRTOS开发过程中 xff0c 我们使用的GPIO操作函数都是由stm32库函数提供 xff0c 如GPIO SetBits GPIO Init GPIO结构体对端口进行初始化 模式 速度 管脚号等操作
  • RT-Thread初识学习-05-设备操作

    IO设备模型 IO设备的理解 xff0c 比如我们使用了一款传感器 xff0c 但是RTT并没有提供软件包给我们使用 xff0c 并且我们不需要使用HAL库进行开发 xff0c 而是想使用RTT给我们的函数 xff0c 比如下面的rt de
  • ROS学习记录(一) Plugin插件

    前言 xff1a 最近在学习无人驾驶路径规划和ROS的一些基础理论 xff0c 过程中遇到了一些问题 xff0c 写这个系列记录一下个人的学习过程 遇到这个问题的初衷是看了小巨同学一篇帖子 使用自定义RRT 全局规划器建图导航 文中提到了向