ROS / ROS2 到底是什么?写给第一次接触机器人开发的人

最近在接触机器人项目时,经常会看到 ROS、ROS1、ROS2 这些词。

如果以前没做过机器人开发,很容易先产生一个疑问:ROS、ROS1、ROS2 到底是什么关系?

刚开始我也很容易把它理解成一个“机器人操作系统”,甚至会下意识地认为:

ROS2 是不是像 Windows、Ubuntu 一样的系统?
是不是需要单独部署一台 ROS2 服务器?
雷达、摄像头、导航程序是不是通过 IP 地址访问 ROS2?

实际上都不是。

如果之前主要接触的是 Web、Java、Go、Docker、Kubernetes 这些技术,那么理解 ROS2 最困难的地方,不是代码,而是它的工作方式和传统 Web 系统不太一样。

这篇文章不深入 ROS2 底层,只用比较通俗的方式介绍:

  • ROS、ROS1、ROS2 分别是什么
  • ROS1 和 ROS2 是什么关系
  • 为什么机器人需要 ROS2
  • ROS2 是软件还是环境
  • ROS2 有没有 IP 地址
  • 雷达、导航、机器人控制程序是怎么通过 ROS2 配合工作的
  • ROS2 和 Windows、Linux、Kubernetes 有什么区别

一、先说结论:ROS、ROS1、ROS2 分别是什么?

先把三个名字分清楚。

ROS 的全称是:

Robot Operating System

中文一般翻译为:

机器人操作系统

不过这个名字很容易让人误解。虽然名字里有 Operating System(操作系统),但 ROS 并不是 Windows、Ubuntu 这种真正意义上的操作系统。

更准确地说:

ROS 是一整套专门用于机器人开发的软件框架、通信机制、开发工具和生态。

可以先粗略理解为:

ROS 是机器人软件的基础平台。

后来,ROS 发展出了两代主要体系:

ROS
├── ROS1:第一代
└── ROS2:第二代

其中:

ROS1 = 第一代 ROS
ROS2 = 第二代 ROS

ROS2 的全拼就是:

Robot Operating System 2

中文一般翻译为:

机器人操作系统 2

所以,平时如果别人只说“ROS”,有时候是在泛指整个 ROS 生态;如果进入实际开发,就要进一步确认说的是 ROS1 还是 ROS2

机器人里面可能同时存在很多程序:

雷达程序
摄像头程序
定位程序
建图程序
导航程序
机械臂控制程序
底盘控制程序

这些程序需要不断交换数据、互相配合。

ROS 最核心的价值,就是让这些程序能够按照统一的方式进行通信和协作。


三、ROS1 和 ROS2 是什么关系?

可以把它们理解成:

ROS1 是第一代,ROS2 是面向新一代机器人场景重新设计的第二代。

但 ROS2 并不是简单地在 ROS1 后面“升级一个版本号”。

它在很多基础设计上都做了重新设计,例如更重视:

  • 多机器人协作
  • 分布式通信
  • 实时性
  • 安全性
  • 跨平台能力
  • 工业和产品化场景

如果用熟悉的软件技术来类比,可以把它理解成:

ROS1
≈ 老一代机器人软件架构

ROS2
≈ 为现代机器人重新设计的新一代架构

因此,今天新做机器人项目时,通常会优先关注 ROS2。

这篇文章后面也会以 ROS2 为主,因为对于第一次接触机器人开发的人来说,先理解 ROS2 的工作方式更有实际意义。


三、为什么机器人需要 ROS2?

假设现在要开发一个非常简单的移动机器人。

机器人身上有:

激光雷达
摄像头
电机
控制器

同时还有几个软件:

雷达程序
建图程序
导航程序
电机控制程序

机器人运行的时候,大概会发生这样的事情:

雷达扫描周围环境
        ↓
告诉建图程序:
“前面有一堵墙”
        ↓
建图程序生成地图
        ↓
导航程序读取地图
        ↓
导航程序计算:
“应该往左走”
        ↓
控制程序收到命令
        ↓
真正控制机器人左转

问题来了。

这些程序是不同人开发的,甚至可能来自不同公司。

那么:

雷达程序怎么把数据交给建图程序?

建图程序怎么把地图交给导航程序?

导航程序又怎么把运动命令交给机器人?

如果没有统一的体系,每两个程序之间都可能需要单独设计通信方式。

最后很容易变成:

雷达 → 自己写 TCP
地图 → 自己写接口
导航 → 再设计一套协议
机器人控制 → 又写一套通信

系统会越来越复杂。

ROS2 就是为了解决这个问题。


四、可以把 ROS2 理解成“机器人内部的公共通信平台”

一个比较容易理解的类比是:

ROS2 有点像机器人内部的“企业微信 + 公共通信规则”。

假设机器人里面有几个“部门”:

雷达部门
地图部门
导航部门
控制部门

雷达部门不停发布:

我刚刚扫描到了这些障碍物。

地图部门需要这些数据,于是直接接收。

地图生成以后又发布:

最新地图已经生成。

导航部门接收到地图以后,开始计算路线。

导航程序最后又发布:

机器人向前走,速度 0.5m/s。

控制程序接收到以后,再真正驱动机器人。

整个过程可以理解成:

雷达程序
    ↓
发布雷达数据
    ↓
ROS2
    ↓
建图程序
    ↓
发布地图
    ↓
ROS2
    ↓
导航程序
    ↓
发布运动命令
    ↓
ROS2
    ↓
机器人控制程序

ROS2 本身不会替你“识别障碍物”或者“规划路线”。

它更重要的作用是:

让这些不同的软件能够方便地连接起来。


五、ROS2 到底是“软件”还是“环境”?

这个问题其实两个说法都可以。

ROS2 本身是一整套软件。

安装以后,它又会在电脑上形成一个机器人开发和运行环境。

可以类比 JDK。

例如:

Ubuntu
  ↓
安装 JDK
  ↓
运行 Java 程序

ROS2 类似:

Ubuntu
  ↓
安装 ROS2
  ↓
运行各种机器人程序

因此一台机器人上的计算机可能是:

Ubuntu
│
├── ROS2
│
├── 雷达程序
├── 建图程序
├── 导航程序
└── 机器人控制程序

所以可以简单理解:

ROS2 是安装在操作系统上的机器人软件基础环境。


六、ROS2 是不是需要单独部署一台服务器?

通常不是。

这也是刚接触 ROS2 时特别容易误解的地方。

传统 Web 系统经常是:

服务器
↓
启动一个服务
↓
监听 8080 端口
↓
其他系统通过
http://192.168.1.10:8080
访问

ROS2 通常不是这种思路。

例如一台机器人身上可能有一块 NVIDIA Jetson 小电脑。

可以直接在 Jetson 上安装:

Ubuntu
+
ROS2
+
雷达驱动
+
建图程序
+
导航程序
+
机器人控制程序

这些程序都运行在同一台电脑里。

ROS2 不需要再单独找一台机器作为“ROS2服务器”。


七、ROS2 有地址吗?

通常没有所谓:

http://ros2:8080

这样的地址。

因为 ROS2 本身不是一个 Web 服务。

机器人程序也不是通过 HTTP 请求:

GET /ros2/lidar

去获取雷达数据。

ROS2 使用的是另外一套通信机制。

可以简单理解成:

所有 ROS2 程序进入同一个通信体系以后,可以互相发现和交换数据。

例如:

雷达程序:
“我要发布雷达数据”

导航程序:
“我要接收雷达数据”

只要它们运行在合适的 ROS2 环境和网络中,就可以建立通信。

所以 ROS2 和传统的:

客户端 → IP + 端口 → 服务端

这种思维方式不完全一样。


八、ROS2 里面经常说的 Node 是什么?

Node 中文一般叫“节点”。

听起来很复杂,其实可以直接理解成:

一个正在运行的机器人小程序。

例如:

雷达驱动
= 一个 Node

摄像头程序
= 一个 Node

导航程序
= 一个 Node

机器人控制程序
= 一个 Node

所以一台机器人运行起来以后,可能同时运行很多 Node。

例如:

ROS2
│
├── 雷达节点
├── 摄像头节点
├── 地图节点
├── 定位节点
├── 导航节点
└── 机器人控制节点

大家各自负责自己的事情。


九、Topic 又是什么?

Topic 是 ROS2 非常核心的概念。

可以简单理解成:

消息频道。

比如定义一个频道:

/scan

专门发布激光雷达数据。

雷达程序不断往 /scan 里面发布数据。

建图程序和导航程序如果需要雷达数据,就订阅 /scan

可以想象成微信群:

微信群:雷达数据群

雷达:
不停往群里发数据

SLAM:
关注这个群

导航:
也关注这个群

雷达不需要知道:

到底是谁在使用我的数据。

它只负责发布。

需要的人自己订阅。

这就是 ROS2 很重要的一种工作方式。


十、为什么这种方式特别适合机器人?

因为机器人里面很多数据都是实时不断产生的。

例如激光雷达可能一直在产生:

第1帧数据
第2帧数据
第3帧数据
第4帧数据
……

摄像头也是不断产生图像。

机器人当前位置也在不断变化。

这些数据不像普通 Web 接口:

请求一次,返回一次。

更像:

数据源一直在不停地产生数据。

因此“发布 / 订阅”的方式非常适合机器人。


十一、雷达驱动是怎么使用 ROS2 的?

假设购买了一个激光雷达。

雷达厂家通常会提供一个程序:

ROS2 Driver

也就是 ROS2 驱动。

这个程序负责:

真实雷达
   ↓
读取雷达数据
   ↓
转换成ROS2通用的数据格式
   ↓
发布到ROS2

于是后面的 SLAM 建图程序就不用研究:

这个雷达内部到底是什么通信协议。

SLAM 只需要获取 ROS2 中的雷达数据。

整个链路大概是:

激光雷达
   ↓
雷达ROS2驱动
   ↓
ROS2
   ↓
SLAM

十二、SLAM 又是什么?

SLAM 可以先简单理解成:

机器人一边走,一边建立地图,同时判断自己在地图中的位置。

例如机器人第一次进入一个办公室:

开始不知道周围环境
        ↓
雷达不断扫描
        ↓
发现墙
        ↓
发现走廊
        ↓
发现房间
        ↓
慢慢建立地图

最终可能得到一张类似这样的地图:

┌────────办公室────────┐
│                      │
│                      │
└────────┐             │
         │   走廊      │
         │             │
         ├────会议室───┤
         │             │
         └────仓库─────┘

ROS2 本身并不是 SLAM。

SLAM 是运行在 ROS2 体系中的另外一个程序。


十三、Nav2 又是什么?

地图建立以后,接下来就要让机器人自己走。

例如告诉机器人:

从办公室去仓库。

Nav2 会根据地图计算:

当前位置
    ↓
走廊
    ↓
左转
    ↓
继续前进
    ↓
仓库

然后不断产生机器人运动命令。

所以可以简单记:

SLAM
=
建地图

Nav2
=
在地图上导航

它们都可以运行在 ROS2 体系中。


十四、ROS2 和 Windows、Ubuntu、K8s 有什么区别?

可以这样对比:

技术 主要解决的问题
Windows / Ubuntu 让计算机能够运行各种软件
Docker 把应用和运行环境打包起来
Kubernetes 管理很多服务器和容器应用
ROS2 让机器人中的硬件和软件模块协同工作

例如:

Kubernetes 更关心:

服务部署在哪里?
运行几个副本?
容器挂了怎么办?

ROS2 更关心:

雷达数据怎么交给导航?
地图怎么交给定位?
导航命令怎么交给机器人?

两者解决的是完全不同的问题。


十五、可以把 ROS2 理解成“机器人软件的数据高速公路”

如果一定要找一个最容易理解的比喻,我觉得:

ROS2 就像机器人内部的数据高速公路。

机器人里的各种程序分别是不同的车辆和站点:

雷达
摄像头
SLAM
导航
机器人控制

ROS2 提供了一套统一的道路和交通规则。

于是:

雷达 ───────┐
            │
摄像头 ─────┤
            ↓
          ROS2
            ↓
      ┌─────┼─────┐
      ↓     ↓     ↓
    建图   导航   控制

不同程序不用每次都重新设计一套通信方式。


十六、为什么机器人行业大量使用 ROS2?

ROS2 真正有价值的地方不只是通信。

更重要的是背后已经形成了一个很大的机器人软件生态。

很多公司、学校和开源开发者都会提供 ROS2 版本的软件,例如:

激光雷达驱动
摄像头驱动
机械臂驱动
SLAM
导航
定位
路径规划
机器人模型
可视化调试工具

因此开发一个机器人时,很多东西不需要完全从零开始。

例如:

买一个支持ROS2的雷达
        ↓
使用厂家的ROS2驱动
        ↓
获得标准雷达数据
        ↓
接入现成SLAM
        ↓
生成地图
        ↓
接入Nav2
        ↓
实现自主导航

这也是 ROS2 最重要的价值之一:

把不同厂商、不同算法、不同机器人软件连接到同一个生态里。


十七、那 ROS2 是全球标准吗?

严格来说不是。

ROS2 并不是类似 ISO、国家标准这样的强制标准。

更准确地说:

ROS2 是全球机器人领域非常主流的一套开源软件框架和生态。

可以类比 Kubernetes。

Kubernetes 也不是“全球法律规定必须使用的标准”,但是云原生领域已经有大量公司和产品围绕它构建生态。

ROS2 在机器人领域有一点类似。

因此会看到很多机器人厂商介绍:

支持ROS
支持ROS2
提供ROS2 SDK
提供ROS2 Driver

本质上是在告诉开发者:

我的硬件可以比较方便地接入 ROS2 机器人生态。


十八、最终应该怎么理解 ROS2?

如果只记一句话:

ROS2 是一套安装在计算机上的机器人软件框架和通信平台,用来让雷达、摄像头、建图、导航、机器人控制等不同程序按照统一方式互相通信和协作。

如果用技术人员比较熟悉的方式概括:

Ubuntu
解决:
计算机怎么运行软件

Kubernetes
解决:
服务怎么部署和管理

ROS2
解决:
机器人中的各种硬件和软件怎么互相配合

所以第一次接触 ROS2 时,并不需要马上学习它底层用了什么通信协议,也不用马上研究复杂的机器人算法。

先建立这个认识就足够了:

ROS2 本身不是机器人,它更像机器人软件世界里的“公共基础设施”。

后面的雷达、SLAM、导航、机械臂、机器狗等不同能力,都是在这个基础设施上逐渐连接起来的。

理解了这一点,再去看机器人项目里的 Node、Topic、SLAM、Nav2、DDS 等概念,就会容易很多。

最后再记一句:ROS 是整个机器人软件生态的名字,ROS1 是第一代,ROS2 是第二代;对于现在的新项目,重点理解 ROS2 即可。

posted @ 2026-09-14 20:45  人艰不拆_zmc  阅读(16)  评论(0)    收藏  举报