简述
这里是我有关ROS2工具部分内容的相关笔记,这里所包括的内容有:
- launch 文件及其实现
- rosbag2 工具的介绍与使用(实现话题消息的录制与回放)
具体软硬件以及技术背景等细节请参考ROS2学习笔记集简述
这里是我有关ROS2工具部分内容的相关笔记,这里所包括的内容有:
具体软硬件以及技术背景等细节请参考ROS2学习笔记集简述
上半部分见ROS2-014-通信机制补完:通信机制工具(一)综述与命令行工具
RQt 是一个基于 Qt 框架 开发的 GUI 框架。它通过应用各种 “以插件形式存在的工具与接口” 实现在单个页面开发、调试与监控机器人系统,其允许用户通过配置插件灵活地与 ROS2 系统进行交互。作为通信机制工具只是其中的一种功能,在这里仅会做一些简要的入门介绍。
上一章内容,我们学习了ROS2中的多种通信机制,了解了不同通信模型的实现流程、相关API以及各自的特点。在实际开发当中,我们可能会遇到一些问题:
假设有一个机器人,在机器人上有一个雷达。该雷达有一相关节点会发布雷达探测到的各种信息,且会被机器人内部一导航模块所属节点订阅并接收。为了减少机器人移动过程中由于通信延迟在路径规划上产生相关误差,当二者进行数据交互时,必然需要保证信息的实时性。
因此我们需要使用 时间类 API,在传输数据时提供相关数据产生时的时间戳使接收方能够进行相关数据时效性的判断。除此之外,雷达坐标变换或多消息融合等也需要该类 API。
时间类 API 一共有以下几种:
咱在之前聊到节点重名,那么有话题重名吗?
有的,dude,有的☝🤓
与节点重名相同,在 ROS2 中,话题名称也可能重名。在不同的节点之间,通信都依赖于话题,当话题重名时,系统虽然不会抛出异常,但是通过 相同话题名称 关联到一起的节点可能 并不属于 同一通信逻辑,从而导致通信错乱,甚至出现异常。这种情况下可能就需要将相同的话题名称设置为不同。
在 ROS2 中,不同的节点可以有相同的节点名称,比如你可以启动多个节点的名称都是 turtlesim 的 turtlesim_node 节点。
虽然节点重名是被 允许 的,但是开发者应该 主动避免 这种情况,因为节点重名可能会导致操作上的混淆。
仍以启动了多个 turtlesim_node 节点为例,当使用 计算图(rqt_graph) 查看节点运行状态时,由于这些节点的名称一致,它们在计算图上会被显示为同一个节点,而实际上是有多个节点。并且节点名称也会和话题名称、服务名称、动作名称、参数等多种变量产生关联,届时也可能会导致通信逻辑上的混乱。
在 ROS2 中编写功能包时,一般会在单个空间内进行编写与编译。但是当程序员需要经由多个工作空间进行不同的功能包的编写式,很可能会出现在不同的工作空间下将不同的功能包命名为同一个名字的情况。例如在 工作空间A 和 工作空间B 中都创建了一个名字叫 “C” 的功能包,假设该功能包里都有一个 “C_node” 节点,那么当我们新建终端并直接执行
ros2 run C C_node
在 ROS2 中编写一个大的模块时,一般需要依照不同的功能分成多个子包。例如对于一个机器人导航模块,该模块可能被分为定位、路径规划、离线地图等多个子包进行分别编写。那么当我们需要安装该模块时,需要一个个安装这些子包才可以应用全部功能吗?
在 ROS2 中,其提供了一种可以将多个不同的功能子包打包成一个大的功能包的方式,当我们需要安装某个功能模块时,只需要直接调用安装这个大的功能包即可。该包又被称为 元功能包 ,即 MetaPackage。
这里是我有关ROS2通信机制补充内容的相关笔记,这里的内容比起核心内容而言知识密度比较松散,包括的内容有:
具体软硬件以及技术背景等细节请参考ROS2学习笔记集简述
在之前的核心内容中,我们系统地学习了四种通信机制。这四种通信机制在当时的应用场景都为单个ROS设备内相关节点、话题之间的相互沟通。那么当我们涉及到多台 ROS2 设备之间的相互通信时,我们应该如何实现?
分布式通信就是这样一种 通过网络 在不同主机之间实现 数据交互 的通信策略。
首先我们应该了解, ROS2 本身就是一个分布式通信框架,它可以通过中间件很方便的实现不同设备之间的通信。