1、ROS2简介与说明 一、ROS2 简介不止是升级而是重生1.1 什么是ROS2ROS2Robot Operating System 2是面向机器人应用的第二代开源元操作系统。请注意“元操作系统”这个词很关键它意味着ROS2并非像Windows或Ubuntu那样传统意义上的独立操作系统而是一套运行在现有操作系统Linux, Windows, macOS之上的分布式通信框架、软件工具集和开发规范。它为机器人软件的开发提供了硬件抽象、底层驱动管理、消息传递、包管理等一系列标准化的服务。其核心使命是让机器人软件开发者不必重复造轮子能够快速、稳健地构建复杂的机器人行为。1.2 诞生的背景与动机为什么要重写ROS1诞生于2007年的斯坦福大学它的设计初衷是服务于学术研究场景下的单机器人如PR2。随着机器人技术从实验室走向工业、从单机走向集群、从非结构化环境走向安全攸关的场景ROS1的架构局限变得不可逾越这正是ROS2完全重写的根本原因。ROS1的局限主要体现在单点故障的Master节点ROS1依赖一个中心化的roscore进行节点注册和通信发现。一旦roscore崩溃整个系统瘫痪且机器人重启后无法自动重连。非实时通信ROS1的底层通信协议TCPROS不具备实时性。节点间通信的延迟和抖动不可控无法满足机器人关节控制、安全急停等硬实时要求。安全性缺失网络上传输的数据没有加密任何节点都可以随意发布和订阅任何话题也没有健全的身份验证机制。这对于工业机械臂或自动驾驶汽车是不可接受的。多机器人支持羸弱由于所有机器人都需连接同一个roscore跨多个机器人系统的分布式通信实现起来异常复杂且脆弱。跨平台能力差ROS1深度绑定Ubuntu Linux对Windows和macOS的支持始终是实验性的更别提在微控制器MCU上运行。架构的非理想特性如非必要的序列化/反序列化带来的延迟内存拷贝开销大Python与C节点性能差异巨大等。为了解决这些根深蒂固的问题Open Robotics决定从零开始借鉴ROS1的成熟API和概念重构一个全新的框架这便是ROS2。1.3 设计目标与核心特性ROS2的设计目标直接回应了ROS1的痛点去中心化彻底移除Master节点采用自发现机制。实时性通过恰当的配置可为关键任务通路提供确定性的延迟保障。安全性支持通信加密、节点身份验证和访问控制。多机器人原生支持任何两个ROS2节点只要在同一网络无需任何额外配置即可发现并通信完美支撑多机器人集群。跨平台原生且一等公民级别地支持Linux、Windows和macOS。嵌入式系统支持通过micro-ROS可将ROS2节点直接运行在微控制器MCU上实现端到云的统一架构。产品质量级更稳健的错误处理、更清晰的API、更长的长期支持LTS版本适合商业产品。1.4 核心概念与架构的彻底进化ROS2从内到外进行了重新设计其核心架构分层如下------------------- (用户代码层) | rclcpp / rclpy | (C/Python客户端库提供面向对象API) ------------------- | rcl | (RCL: ROS客户端库C语言实现核心逻辑) ------------------- | rmw | (RMW: ROS中间件接口一个抽象层) ------------------- | DDS (eProsima | (DDS: 数据分发服务具体实现) | Fast DDS, | | Cyclone DDS, | | RTI Connext) | -------------------DDS数据分发服务这是ROS2通信的灵魂。DDS是一个成熟的工业级、去中心化的数据分发协议标准。ROS2通过它实现了分布式发现节点启动时会自发地在网络上组播/单播自身信息并发现其他节点全程无需Master。这就像每个节点都拿了一个对讲机自己喊话并听到别人喊话从而知道对方的存在。丰富的服务质量QoS策略这是ROS2最强大的功能之一。你可以为每条通信链路精细配置可靠性 (Reliability)RELIABLE类似TCP确保送达或BEST_EFFORT类似UDP尽力而为用于实时传感器数据流。持久性 (Durability)VOLATILE新订阅者只收新消息或TRANSIENT_LOCAL新订阅者能收到最后几条消息对于静态参数至关重要。截止时间 (Deadline)设置消息到达的最大允许间隔超时则触发报警回调。生命线 (Liveliness)监控发布者是否存活。历史记录 (History)KEEP_LAST只保留最近N条或KEEP_ALL保留所有消息。多供应商可替换性通过rmw抽象层你可以随时切换底层的DDS实现如从Fast DDS切换到Cyclone DDS无需修改上层业务代码这为不同场景的性能调优提供了极大灵活性。其他核心概念节点 (Node)与ROS1类似是程序的基本单元。但它在创建时可被赋予一个命名空间更易管理。组件节点 (Composable Node)ROS1的Nodelet的进化版。允许将多个节点编译进同一个共享库然后在同一个进程中加载运行从而实现零拷贝通信极大提升性能且降低资源消耗。生命周期管理 (Managed/Lifecycle Node)ROS1节点启动后就是“活”的没有明确的状态。ROS2引入了标准的状态机未配置、未激活、激活中、已激活、停用中、已完成、错误处理等允许系统精细地控制一个节点的启停与重置这对于真实机器人系统的安全启动和关闭至关重要。执行器 (Executor)决定回调函数订阅、服务、定时器何时以何种方式被调用。支持SingleThreadedExecutor和MultiThreadedExecutor还出现了能避免饿死现象的EventsExecutor。构建系统从ROS1的catkin全面迁移至ament并用colcon作为统一的构建工具支持纯Python包依赖管理更清晰。启动系统 (Launch System)从ROS1的XML格式全面转向了Python脚本。你几乎可以用编程的方式做任何事条件判断、循环、动态传递参数、读取环境变量、甚至声明事件处理复杂系统的启动和配置能力有了质的飞升。二、ROS1 与 ROS2关系与对比2.1 继承与革新的关系ROS2并不是ROS1的“补丁”而是一次面向未来的重写。但它们之间的关系可以总结为“核心理念一脉相承内部实现脱胎换骨”。继承ROS1的核心通信范式——话题Publish/Subscribe、服务Service/Client、动作Action——在ROS2中不仅被完美继承还进行了强化。如果你熟悉这些概念理解ROS2的基础使用会很顺畅。革新为了实现前述目标从通信层DDS取代TCPROS、架构去中心化、API到构建系统都彻底改变了。因此ROS1的包和代码不能直接在ROS2上运行必须经过迁移和适配。2.2 核心区别深度对比特性ROS1ROS2影响与说明通信协议自研的TCPROS/UDPROS工业标准 DDS/RTPSROS2通信更可靠、功能更强大。但DDS依赖组播在某些复杂的网络硬件环境下可能需要额外配置。系统架构中心化必须运行roscore去中心化节点间自发现ROS2无单点故障系统鲁棒性质的提升。机器人系统重启后其余部分可动态重连。实时性基本不具备原生支持实时计算ROS2适用于关节控制等硬实时场景。这需要RTOS/实时内核支持并谨慎使用QoS和内存管理API。安全性无数据明文传输完整支持 DDS-SecurityROS2满足工业级安全需求可实现加密、身份验证和访问控制。跨平台主要支持UbuntuLinux, Windows, macOSROS2开发环境更灵活可直接在开发主力机如Windows上进行开发仿真。节点组合有Nodelet但接口复杂原生组件节点 (Component)ROS2实现零拷贝通信极其简洁性能和资源利用率远超ROS1的Nodelet。参数系统全局参数服务器每个节点自有参数服务ROS2避免了全局变量污染和命名冲突参数的生命周期由节点自身管理支持异步更新回调。启动文件XML 格式功能有限Python 脚本功能强大ROS2的launch系统几乎无所不能可以写复杂的启动逻辑这是体验上提升最明显的地方。客户端库roscpp(C03),rospy(Py2)rclcpp(C14/17),rclpy(Py3)ROS2拥抱现代语言标准代码更简洁安全。例如rclcpp大量使用智能指针。消息生成依赖genmsg/gencpp等统一由rosidl生成ROS2的消息生成流程更加标准化支持生成C/C/Python/等目标语言的代码。构建系统catkin(基于CMake)ament_cmakecolconcolcon提供了统一的包构建、测试、安装体验对于混合C/Python的工作空间尤为友好。2.3 迁移与桥接你无需立即放弃ROS1。Open Robotics提供了ros1_bridge包它像一个实时翻译官可以动态地在ROS1和ROS2的话题/服务间建立双向转换允许你在一个系统中同时运行ROS1和ROS2节点实现渐进式迁移。这对于继承庞大ROS1代码库的团队来说是最可行的路线图。总而言之ROS2是一个功能极其强大且很值得去学习的工具如果你只是想使用这个工具去开发机器人的话你不需要去看懂上边所说的东西只需要了解就可以。三、最后的废话进行ROS2的学习和开发建议使用Ubuntu系统因为这是最普遍的也是最稳定的如果你遇到了任何关于环境的问题都很大可能的可以在网上找到相应的解决方法。你可以安装虚拟机或者双系统如果仅是学习使用的话建议去安装虚拟机这样不会对你的原始系统产生什么不可逆的影响安装双系统可能会出现一系列的问题尤其是刚上大学的同志们买最新的设备很多不兼容的东西在网上也找不到相应的解决方案。安装双系统或者虚拟机的教程你可以在各个地方找到所以这里我不进行详细的介绍本笔记使用的是虚拟机系统用的Ubuntu24.04jazzy如果你想跟着本课程进行我建议你跟我的配置是一样的这样咱们具有相同的选择。最后请保持耐心。从ROS1转向ROS2或从零学习ROS2初期都会因复杂的概念如DDS、QoS、Composable Node和繁琐的编译配置感到挫败这是正常的。一旦你越过那道坎你所收获的将是一个能支撑你从简单原型走向可靠商业产品的强大框架。祝学习顺利