ROS2 + C++ 基本概念(自用笔记)

系列文章目录

留空



前言

自用
此学习笔记参考“【鱼香ROS2】动手学ROS2视频”


一、ROS2是什么?

1.ROS介绍

ROS(Robot Operating System,机器人操作系统)是一个用于编写机器人软件的灵活框架,它集成了大量的工具、库和协议,为机器人开发者提供类似操作系统所提供的功能。这些功能包括硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间的消息传递以及程序发行包管理,可以极大简化复杂且多样的机器人平台下的任务创建与稳定行为控制。

ROS提供了丰富的工具和库,涵盖了机器人的感知、运动控制、导航、仿真等多个领域。例如,ROS提供了调试工具(如roslaunch、rosbag)、可视化工具(如RViz、rqt)和仿真工具(如Gazebo)等,为机器人开发的各个方面提供了强大的支持。

在ROS出现之前,机器人软件开发面临着诸多挑战,比如缺乏统一的开发框架、难以实现模块化和复用、通信困难等。下面通过两个通俗易懂的例子来说明ROS出现前后的区别:

(1)例子1
之前:想象一下,你要建造一个复杂的机器人,需要让机器人完成多项任务,比如移动、感知环境、执行任务等。在没有ROS之前,你需要从头开始编写所有的代码,包括控制机器人的运动、处理传感器数据、与其他模块通信等。这样的开发过程就像是你要建造一个房子,但你需要亲自挖掘矿石、制作砖块、搭建房屋结构,整个过程非常繁琐和耗时。

之后:有了ROS之后,情况就完全不同了。ROS就像是一个建筑公司,为你提供了一整套现成的工具和材料,你只需要根据需要选择合适的模块和功能,然后组装起来就可以了。比如,你可以使用ROS提供的运动控制模块来控制机器人的移动,使用传感器数据处理模块来处理感知数据,使用通信模块来实现模块间的通信。

(2)例子2

之前:你和一群朋友要一起建造一个大型拼图,但每个人手里的拼图碎片形状和大小都不同,而且没有一个统一的规则来组装。大家只能不停地尝试、交流、试错,最终可能花费很长时间才能完成拼图。这就好比在没有ROS之前,开发机器人软件就像是每个人都在用自己的方式进行开发,没有一个统一的框架和规范,导致开发过程复杂且效率低下。

之后:有了ROS之后,情况就完全不同了。ROS就像是一个统一的拼图桌,每个人手里的拼图碎片都按照统一的规则和形状来设计,大家可以轻松地将自己的拼图碎片放在一起,快速地完成整个拼图。类似地,在ROS的框架下,开发者可以使用统一的工具、消息传递机制和库来构建机器人软件,实现模块化、复用性和高效率的开发。这就好比在有了ROS之后,开发机器人软件就像在一个统一的框架下进行协作,让开发过程更加简单、高效和有序。

简单来说,使用ROS类似于在一个统一的拼图桌上进行合作,而不是每个人都在用不同的方式和规则进行拼图。

2.ROS的优点

(1)模块化设计: ROS采用模块化的设计理念,将复杂的机器人软件分解为多个相互独立且可复用的模块,这些模块被称为节点。每个节点都是一个独立的进程,可以执行一些特定的功能。这种设计使得开发者可以根据自己的需求选择合适的节点来组合成一个完整的机器人应用,同时也方便了代码维护、更新以及模块之间的测试调试。

(2)跨平台兼容性: ROS支持多种主流的操作系统,如Linux、Windows、Mac OS等,以及多种硬件架构,如ARM、x86、x64等。这种跨平台兼容性使得ROS能够适用于各种机器人平台和应用场景,如导航、视觉、语音、控制等。

(3)开源与共享: ROS是一个开源项目,其代码可以免费获取和使用。这意味着任何人都可以访问、修改和贡献ROS的代码。

(4)强大的生态系统: ROS拥有庞大的生态系统,包括丰富的工具集、库和协议。这些工具可以帮助开发者更高效地构建、测试、调试和部署机器人应用。

(5)灵活性和可扩展性: ROS具有高度的灵活性和可扩展性。开发者可以根据自己的需求添加或删除功能,通过安装不同的包来增加新的功能或支持新的设备。此外,ROS还提供了丰富的API和接口,使得开发者可以轻松地与其他系统或硬件进行集成。

(6)实时通信机制: ROS提供了基于发布/订阅模式的消息传递机制,使得节点之间可以实时地进行数据交换和通信。这种通信机制确保了数据的实时性和准确性,使得机器人能够更好地适应复杂多变的环境。

3.ROS2的系统架构

在这里插入图片描述
具体区别如下:

层级ROSROS2主要改进
应用层Python2支持Python3支持升级到Python3,提高兼容性和性能
C++标准C++11标准更新到C++11,提供更多现代C++特性
catkin编译系统ament编译系统改进编译系统,编译系统改进,提供了更高效的编译和管理体验
进程间通信依赖于特定机制提供进程间和进程内通信的相同API更加统一和灵活
MiddleWare中间件层中心化的Master节点去中心化取消Master节点,节点间可1对1、1对n、n对n通信
TCP/UDP通信DDS通信机制采用DDS通信,让专业的人做专业的事,优化了通信机制;采用DDS进行通信,增强实时性、可靠性和连续性
OS层只支持Linux支持linux、Windows、Mac、嵌入式RTOS平台扩大操作系统支持范围,降低使用门槛

什么是去中心化?
从图中可以看出,对比ROS,ROS2去掉了Master。
引用小鱼的一个例子
比如用ROS搭建一个避障小机器人,小机器人中所有节点的通信,都要先经过主节点。如避障检测节点需要经过主节点获取激光雷达节点的数据,然后避障检测节点又得经过主节点控制底盘驱动节点
在这里插入图片描述
如果主节点挂掉了,整个系统不能正常通信,此时避障检测节点就不能控制底盘驱动节点,如果机器人正在运行,碰到障碍物就会径直撞上去。ROS2取消了Master节点,节点间可1对1、1对n、n对n通信,避免了这些问题的出现。

二、ROS2的基本概念

1.节点

ROS2中的每个节点(Node)都是负责一个单一的模块化功能。我们可以把ROS2的节点想象成一个个小工人,每个工人负责一项具体的工作。一个完整的机器人系统由许多协同工作的节点组成,ROS2中的每个节点就像是一个专注于自己工作的工人,通过与其他节点的协作,共同实现复杂的机器人任务。

例子

比如在一个拥有轮子、摄像头和手臂的机器人系统中,每个硬件组件通常会由一个独立的节点控制且每个节点只负责一个特定的任务或功能。

  • 轮子控制节点: 这个节点负责轮子的驱动、转向和速度监控。

  • 摄像头处理节点: 这个节点专门用于处理来自摄像头的图像数据,识别环境中的障碍物、追踪物体或进行视觉定位。

  • 手臂控制节点: 这个节点用于控制机器人的手臂,抓取物品。

在ROS2中,节点是执行特定任务的最小单元。每个节点都遵循“做一件事并做好”的原则,即每个程序或节点只专注于执行好一件事情
ROS2的作用类似于人体的神经系统,通过神经系统将身体的各个部分连接到大脑。ROS2提供了一个统一的框架,使得机器人的各个组件可以相互通信和协作,从而实现复杂的任务。

2.节点之间的通信方式

ROS2节点之间的通信方式主要基于发布/订阅模型,这种模型允许节点之间以松耦合的方式进行消息交换。以下是几种主要的通信方式:

(1) 话题(Topic):话题是ROS中最基本的通信机制之一,它允许节点之间进行异步通信。发布者节点可以发布消息到特定的话题上,而不需要知道谁在接收这些消息;同样,订阅者节点可以订阅感兴趣的话题并接收消息,而不需要知道消息的来源。话题通信适用于高频率单向数据流,如传感器数据和状态更新等,因为它可以实现发布者和订阅者之间的解耦,提高了系统的可维护性和灵活性。
(2) 服务(Service):服务是一种同步的通信机制,允许一个节点向另一个节点请求执行特定的操作或任务,并等待响应。服务通常用于那些需要即时处理的请求,例如启动或停止某个操作,或者查询节点状态。
(3) 动作(Action):动作是一种更复杂的通信机制,它允许节点执行长时间运行的任务,并在任务执行过程中随时提供反馈。与服务不同之处在,可以在执行过程中提供反馈和直接取消操作。动作特别适用于那些需要长时间运行并且需要实时反馈的任务,如移动机器人到一个目标位置。
(4) 参数(Parameter):参数服务器是ROS2中用于存储全局参数的服务,节点可以通过参数服务器获取或设置参数值。这种方式适合于配置设置和共享常量值,使得节点可以在运行时动态地调整参数。

每种方式都有其特定的应用场景和优势。话题适合异步数据传输,服务和动作分别用于同步操作和长时间运行任务,而参数则用于全局参数管理。

举个通俗易懂的例子,在汉堡店中,每个工作人员都可以当作一个一个的ROS2节点,如收银员节点、大厨节点、服务员节点和顾客节点。

  • 收银员节点: 这个节点负责处理顾客的订单和支付。
  • 大厨节点: 这个节点负责准备食物,例如烹饪肉饼、组装汉堡等。
  • 服务员节点: 这个节点负责将准备好的食物送到顾客手中。
  • 顾客节点: 这个节点负责吃。

(1)话题:一个节点可以发布一个话题,在话题上发布消息,而其他节点可以订阅这个话题,接收这些消息。
收银员节点可以发布一个话题“订单信息”,大厨节点和服务员节点都可以订阅这个订单话题。大厨节点看见订单后,开始准备食物;服务员节点知道有新的订单需要服务,可以准备送餐。

(2) 服务:这是一种请求/响应模式的通信方式,一个节点可以向另一个节点发送请求,并等待响应。
服务员节点可以向大厨节点发送一个“请给我一个汉堡”的服务请求,大厨节点接收到请求后会返回“给你一个汉堡”的响应。

(3) 动作:动作是一种更复杂的通信机制,它允许节点执行长时间运行的任务,并在任务执行过程中随时提供反馈。
顾客节点想要知道他们的食物准备和送达的进度。顾客节点可以通过发送一个“送餐进度”的动作请求给服务员节点。服务员节点在收到这个请求后,会向顾客节点不断发送“食物进度和送餐进度”的反馈,如“汉堡的肉饼开始煎了”,“前面还有三个顾客就到您送餐”。

(4) 参数:这是一种节点间共享信息的通信方式,一个节点可以设置参数,其他节点可以读取这些参数。
收银员节点可以根据顾客需求设置“辣度”的参数,大厨节点可以读取“辣度”信息,制作相应的口味。


总结

自用

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值