1、ROS2 为啥要同时存在 Humble、Jazzy 两套系统先打个比方Ubuntu 22.04 ≈ 手机系统安卓 12Ubuntu 24.04 ≈ 手机系统安卓 14Humble 是给安卓 12 定制的全套软件包Jazzy 是给安卓 14 定制的全套软件包核心现实约束底层操作系统不一样Humble 跑在 Ubuntu22.04Jazzy 跑在 Ubuntu24.04。 两套系统自带的编译器、Python、Qt 图形库、系统底层库全都版本不同互不兼容。不能把同一套 ROS2 程序不经修改直接同时装在 22.04 和 24.04 上。老客户要稳定新项目要新功能两者需求冲突很多工厂机器人、巡检设备已经基于 Humble 做好产品5 年内不想底层代码乱改动最怕更新之后设备突然出故障。所以 Humble 分支只修 bug不加新功能。新研发的机器人想要最新优化更快的消息调度、更好的零拷贝、更新组件这些改进很多会改动底层代码无法直接塞给 Humble一改老设备就可能崩。于是官方方案 ✅切两条独立分支风险隔离Humble守旧、稳定只打安全补丁Jazzy新版本带架构优化面向下一代产品简单一句话底层 Linux 系统分家 “老产品求稳” 和 “新项目求新” 需求冲突被迫分成两套 ROS2 发行版。2、应用程序接口API一样吗先说结论上层普通业务代码大部分接口长得一样底层核心库存在隐性差异不能直接无脑互相拷贝运行。分层通俗解释① 普通开发者用的上层 API订阅、发布、服务、参数写法几乎一模一样比如 Humble / Jazzy 写发布者cpp运行auto pub node-create_publisherstd_msgs::msg::String(topic, 10);这段代码不改动两边都能编译。 如果你只是写业务逻辑、读取传感器、控制底盘代码基本通用。② 底层高级 API执行器、内存零拷贝、消息底层接口接口不一样不兼容举例子 Jazzy 新增优化版跨进程消息 LoanedMessageHumble 没有这套完整接口。 如果你用到这类底层能力代码必须分开写。③ 二进制包【最重要分界线】在 Humble 编译出来的程序不能直接丢去 Jazzy 运行反之亦然。哪怕源代码一样也必须在对应系统 对应 ROS 版本环境下重新编译。④ 生态插件存在巨大鸿沟RViz2 Humble 使用 Qt5Jazzy 使用 Qt6。自己写的 RViz 可视化插件源代码要修改才能移植不能直接复用。3、最容易混淆的关键点大白话总结源代码 ≠ 可执行程序源码看起来差不多但编译环境不同生成的程序不能互通。通信注意默认情况下 Humble 节点 和 Jazzy 节点无法直接互相收发消息内部消息类型哈希规则更新跨版本通讯会匹配失败。不要幻想 “一套程序同时跑两个 ROS 版本” 短期简单 Demo 可以靠一堆条件编译凑合工业产品这么做维护灾难。极简一句话汇总Humble、Jazzy 绑定不同 Ubuntu 系统同时兼顾存量设备稳定性与新项目技术迭代因此分为两条独立分支 普通业务代码 API 语法大体一致但底层库、二进制程序、部分高级接口互不兼容程序不能跨版本直接运行。
[具身智能-666]:ROS2为什么需要两套系统:Humble / Jazzy? 他们的应用程序接口相同吗?
1、ROS2 为啥要同时存在 Humble、Jazzy 两套系统先打个比方Ubuntu 22.04 ≈ 手机系统安卓 12Ubuntu 24.04 ≈ 手机系统安卓 14Humble 是给安卓 12 定制的全套软件包Jazzy 是给安卓 14 定制的全套软件包核心现实约束底层操作系统不一样Humble 跑在 Ubuntu22.04Jazzy 跑在 Ubuntu24.04。 两套系统自带的编译器、Python、Qt 图形库、系统底层库全都版本不同互不兼容。不能把同一套 ROS2 程序不经修改直接同时装在 22.04 和 24.04 上。老客户要稳定新项目要新功能两者需求冲突很多工厂机器人、巡检设备已经基于 Humble 做好产品5 年内不想底层代码乱改动最怕更新之后设备突然出故障。所以 Humble 分支只修 bug不加新功能。新研发的机器人想要最新优化更快的消息调度、更好的零拷贝、更新组件这些改进很多会改动底层代码无法直接塞给 Humble一改老设备就可能崩。于是官方方案 ✅切两条独立分支风险隔离Humble守旧、稳定只打安全补丁Jazzy新版本带架构优化面向下一代产品简单一句话底层 Linux 系统分家 “老产品求稳” 和 “新项目求新” 需求冲突被迫分成两套 ROS2 发行版。2、应用程序接口API一样吗先说结论上层普通业务代码大部分接口长得一样底层核心库存在隐性差异不能直接无脑互相拷贝运行。分层通俗解释① 普通开发者用的上层 API订阅、发布、服务、参数写法几乎一模一样比如 Humble / Jazzy 写发布者cpp运行auto pub node-create_publisherstd_msgs::msg::String(topic, 10);这段代码不改动两边都能编译。 如果你只是写业务逻辑、读取传感器、控制底盘代码基本通用。② 底层高级 API执行器、内存零拷贝、消息底层接口接口不一样不兼容举例子 Jazzy 新增优化版跨进程消息 LoanedMessageHumble 没有这套完整接口。 如果你用到这类底层能力代码必须分开写。③ 二进制包【最重要分界线】在 Humble 编译出来的程序不能直接丢去 Jazzy 运行反之亦然。哪怕源代码一样也必须在对应系统 对应 ROS 版本环境下重新编译。④ 生态插件存在巨大鸿沟RViz2 Humble 使用 Qt5Jazzy 使用 Qt6。自己写的 RViz 可视化插件源代码要修改才能移植不能直接复用。3、最容易混淆的关键点大白话总结源代码 ≠ 可执行程序源码看起来差不多但编译环境不同生成的程序不能互通。通信注意默认情况下 Humble 节点 和 Jazzy 节点无法直接互相收发消息内部消息类型哈希规则更新跨版本通讯会匹配失败。不要幻想 “一套程序同时跑两个 ROS 版本” 短期简单 Demo 可以靠一堆条件编译凑合工业产品这么做维护灾难。极简一句话汇总Humble、Jazzy 绑定不同 Ubuntu 系统同时兼顾存量设备稳定性与新项目技术迭代因此分为两条独立分支 普通业务代码 API 语法大体一致但底层库、二进制程序、部分高级接口互不兼容程序不能跨版本直接运行。