机器人看到的世界长什么样?
分清图像、深度、点云与本体状态,读懂一段真实的观测—动作记录。
这是《让机器人学会做事》的第 2 篇,预计阅读 15 分钟。无需编程、数学或机器人基础;准备一只空杯子,就能参加其中的小实验。
读完后,你应该能分清图像、深度、点云和机器人自身状态,知道“看到了什么”“打算怎么动”“后来发生了什么”为什么必须分别记录,并读懂一小段真实的观测—动作数据。
开场:同一只杯子,四份不一样的报告
Section titled “开场:同一只杯子,四份不一样的报告”上一课,我们请桌边的机械臂把空塑料杯放进托盘。这次先别催它动手,让我们打开它的“工作台”。
你以为里面会有一段小视频:杯子在这里,手在那边,大家一目了然。
屏幕上却可能同时出现四份报告:
| 报告 | 像什么 | 主要提供什么线索 |
|---|---|---|
| RGB 图像 | 普通彩色照片 | 颜色、纹理、画面中的形状 |
| 深度图 | 附带距离信息的照片 | 画面各处的远近 |
| 点云 | 用许多小点搭出的空间模型 | 被观测表面在三维空间中的分布 |
| 自身状态 | 机械臂的身体仪表盘 | 关节位置、夹爪开合等 |
点击图片查看大图
同一张桌子,为什么要交四份作业?
因为它们回答的问题不同。彩色照片里,杯子很好看;机械臂真正伸手时,还得关心杯子多远、自己在哪、夹爪有没有张开。
这四种信息是一份认识工具的菜单,不是每台机器人都必须配齐的套餐。 有的系统只有彩色相机和关节传感器;点云也可能由深度图计算得到,而非来自另一件独立设备。
下面的杯子情节是教学假想实验。后面会单独打开一个公开数据集,明确区分故事与真实记录。
RGB 图像:彩色照片里,没有写“杯子”两个字
Section titled “RGB 图像:彩色照片里,没有写“杯子”两个字”RGB 是红、绿、蓝三个颜色通道的缩写。你可以先把一张数字照片想成很多小格子,每个格子保存颜色数值。
人看到这些格子,很快就说:“青绿色杯子,白桌子。”
相机交出来的原始图像,却不会自动附赠“这是杯子”“这里适合抓”这些答案。识别物体、理解场景,是后续算法要做的工作。
照片还把三维世界投到了一个平面上。画面里看起来差不多大的两个杯子,可能是同样大小、离得一样远,也可能是一个小杯子离得近,一个大杯子离得远。
桌边小实验: 把空杯子放在面前,闭上一只眼睛,再用手挡住半个杯子。你仍然会觉得那是一只完整的杯子。但“被遮住的那一半还在那里”,有一部分依靠的是你的经验,而不是此刻眼睛直接看见了它。
机器人也可以借助经验作推断。不过,推断有可能错;画面没有拍到的部分,不会因为模型很自信就变成已知事实。
深度图:给照片补上“远近”,仍然会有空白
Section titled “深度图:给照片补上“远近”,仍然会有空白”深度图为画面里的像素提供深度或距离信息。常见展示会把远近涂成不同颜色:这一块近,那一块远。具体数值的定义和单位,要看设备说明。
这里的颜色通常是为了方便人看,不代表杯子本身就是那个颜色。一只青绿色杯子,在彩色图里是青绿色的,在深度图里可能被涂成蓝的。
有了这类信息,系统更容易判断杯子和桌面之间的空间关系,也更容易把“画面左边那一块”联系到手臂能接近的位置。
但深度相机不是透视眼。
- 被前面物体挡住的表面,通常无法直接测到。
- 透明、反光、太远或条件不合适的区域,可能出现不可靠或缺失的测量,具体表现取决于传感器。
- 某些深度图来自模型估计;它们也不应自动被当成没有误差的真实距离。
所以,如果一个位置没有有效深度,正确的理解是“这里没有可靠测量”。不能把它想当然地解释成“这里没有东西”,也不能把无效值当成真实的零距离。
点云:不是烟雾,是一堆空间地址
Section titled “点云:不是烟雾,是一堆空间地址”现在把杯子的可见表面想成撒满小点,每个点都记着自己在空间中的位置。很多点放在一起,就是点云。
“云”只是因为点很多,看起来像一团。它不是另一种杯子,也不一定是一张封闭、完整的三维模型。
结合相机参数,可以把深度图转换为三维点;激光雷达等设备也能提供用于构建点云的数据。点还可以附带颜色等信息。
可以用一个简化比喻记住它们的区别:
彩色图说:“这个小格子是什么颜色。”
深度图说:“这个小格子对应的表面有多远。”
点云说:“这些被观测到的表面点,在空间里大致在哪里。”
只从一个方向观察,杯子背面可能仍然是空的。把视角转到背面、融合多个时刻的信息,可以补充线索,但也需要把不同视角的位置关系处理对。
这就埋下了下一课的问题:一个点的“左边”和“前方”,究竟是相对谁说的?
本体感知:看见杯子,还要知道自己的手在哪
Section titled “本体感知:看见杯子,还要知道自己的手在哪”现在把眼睛闭上,轻轻弯一下自己的胳膊。你大概仍知道手臂弯着,而不是伸直了。
机器人也需要这类关于自身的信息,常被称为本体感知。例如,关节传感器测量关节的位置;系统还可能记录关节速度、夹爪开合或力、触觉等读数,具体取决于硬件与接口。
假如相机里杯子就在前面,机械臂却已经快伸到极限了,“再向前一点”便不是一句可以随便照办的话。
不过,自身状态也不会回答所有问题。
夹爪变窄了,可能是夹住了杯子,也可能只是合拢在空气里。要判断有没有抓住,通常还得结合画面、接触等线索。
身体仪表盘告诉系统自己的部分情况,不会自动替它宣布任务成功。
四份报告合在一起,仍然不是上帝视角
Section titled “四份报告合在一起,仍然不是上帝视角”把某个时刻得到的传感器信息放在一起,我们可以把它叫作一次观测。
观测像一份现场报告:从某个位置、在某个时间、用某些设备取得。真实世界里发生的全部事情,未必都在报告里。
比如,手挡住了杯子,杯子是否仍在夹爪里?杯壁太滑,是否即将滑落?这些情况可能还不确定。
这就是“观测”和“真实状态”的区别。前者是系统拿到的线索;后者是我们希望了解的实际情况。系统可以利用多次观测和已有经验作估计,但不能把估计和事实完全画等号。
阅读数据时还有一个名字陷阱:字段叫 observation.state,并不意味着里面装着整个世界的真相。它可能只装了几个关节的读数。字段名字要结合字段说明一起读。
有时,获取信息本身就值得采取行动:换个视角看一看,或者在条件允许时做一次小幅检查。行动除了改变物体,也可能让系统更了解眼前的情况。
别只拍一张照片:给杯子拍一部有记录的连续剧
Section titled “别只拍一张照片:给杯子拍一部有记录的连续剧”一张照片能告诉你某个时刻大概怎样,却很难讲清“机器人做了什么,之后怎样”。
我们把杯子剧情按先后顺序展开:
| 时刻 | 当前观测 | 随后发出的动作命令 | 下一次要检查什么 |
|---|---|---|---|
| 接近前 | 杯子在桌上,夹爪张开 | 让夹爪接近杯子 | 位置是否更合适了 |
| 对准后 | 杯子处于两片夹爪之间 | 合拢夹爪 | 是否出现抓住的证据 |
| 抬起后 | 手臂抬高,杯子却还在桌上 | 调整后重新尝试 | 新尝试有没有改善 |
这是一段简化教学示意,真实系统未必每一步都按这张表拆开。
把观测、动作和后续观测按时间串起来,就形成了一段轨迹。这里的“轨迹”不仅指手臂在空中划过的线,也可以指一整段交互记录。一次有起点和终点的任务尝试,常被记录为一个 episode,可以先理解为“一局”。
点击图片查看大图
图中的两次观测发生在先后两个时刻;传感器配置因系统而异。
最重要的区别是:动作记录说的是让系统怎样行动;后续观测才提供实际发生了什么的证据。
“闭合夹爪”的命令,不等于“已经抓住杯子”。动作也不总是关节目标:有的数据记末端移动量,有的记速度,有的有其他约定。读数字之前,先弄清它代表什么。
打开一份真的数据:同一行里的两个数,为什么不一样?
Section titled “打开一份真的数据:同一行里的两个数,为什么不一样?”下面换到一个真实公开样本:LeRobot 的 svla_so101_pickplace 数据集。它和前面的杯子故事是两回事;我们借它学习怎么读记录,不把它说成本文任务的实验结果。
我们实际读取了该数据集的元数据和开头三条连续记录。元数据列出了:
- 两路彩色视频,字段名是
observation.images.up和observation.images.side,每帧高 480、宽 640、3 个通道;两路都标为非深度图。 observation.state:6 个机器人自身状态值。action:6 个动作值。- 时间戳、帧号,以及区分任务尝试的
episode_index等字段。
这份真实数据没有列出深度或点云字段。前面认识了四类信息,不代表每个样本都会把四类信息凑齐。
这 6 个状态或动作分量的名字对应肩部、肘部、手腕和夹爪的位置项。我们只抽出其中一项 wrist_roll.pos,也就是手腕旋转这一项,避免一上来被整排数字淹没。
| 帧号 | 数据集时间戳(秒,约) | 观测里的这一项 | 动作里的这一项 |
|---|---|---|---|
| 0 | 0.000000 | -51.453 | -48.523 |
| 1 | 0.033333 | -51.453 | -48.523 |
| 2 | 0.066667 | -51.306 | -48.523 |
表中关节字段保留三位小数,均来自同一个 episode。元数据没有写出这些位置数值的单位,所以这里不把它们擅自读成角度、厘米或移动距离。负号也不直接意味着“往左”。
现在,你可以发现两件事:
- 同一行的观测与动作并不相等。把动作列抄到观测列,会丢掉真实记录中的区别。
- 三行里的动作值没变,第三行的观测值却有一点变化。要了解过程,需要接着看后续观测,而不是只盯着指令。
这三行还不足以判断抓取成败,也不足以诊断为什么两列有差异。数值变化、控制误差、时间延迟和任务成功,是不同的问题。
想核对原始数字,可以打开前三条记录和本次使用的固定版本元数据。视频和数值不必真的挤在同一个文件里;数据格式会规定它们怎样对应。
最容易被忽略的演员:时间
Section titled “最容易被忽略的演员:时间”假如一份记录里,照片是夹爪闭合前拍的,关节读数是闭合后测的,却被当成同一时刻,会发生什么?
它看起来像是:“夹爪已经合上,但画面里的手指还张开着。”
这不一定是机器人突然违反物理规律,也可能是几路记录没有对上时间。
相机、关节传感器和控制器可能以不同频率工作,信息还可能经过传输和缓冲。时间对齐,就是尽量把属于同一段过程的信息对应起来,并弄清它们相差多久。
读一份数据时,可以问三个很实用的问题:
- 这张图什么时候拍的,而不只是电脑什么时候收到的?
- 这一行动作对应当前观测之后的哪个阶段?
- 视频帧、状态读数和动作记录怎样匹配,有没有时钟差异或延迟?
真实样本标注了 30 帧每秒,相邻记录约隔 0.033 秒。这说明数据集时间轴的节奏;它不证明所有传感器都在完全相同的瞬间采样。
如果用错配的数据教机器人,就像给厨师看“饼还没翻面”的照片,却告诉他这是“翻完以后”的样子。老师讲得再认真,学生也容易学乱。
轮到你:当一分钟数据侦探
Section titled “轮到你:当一分钟数据侦探”先判断下面四种说法,再看参考答案。无需计算,也不用安装软件。
- 深度图里杯子变成蓝色,所以机器人认为杯子是蓝色的。对吗?
- 夹爪的动作记录显示“闭合”,能否据此宣布杯子已经抓住?
- 数据字段叫
observation.state,因此它一定包含杯子的位置、重量和是否抓稳。对吗? - 图像、状态、动作都标着“第 100 行”,能否据此确认它们已经正确对齐时间?
先停一下。试着为每一道题补一句“我还需要检查什么”。
查看参考答案
第 1 题: 不对。深度图的显示颜色通常编码远近,不能直接当成物体表面的真实颜色。要判断颜色,应查看对应的彩色图及其表示方式。
第 2 题: 不能。命令不等于结果。需要后续画面、夹爪状态、接触等信息提供抓住的证据;其中任何一种线索也可能不充分。
第 3 题: 不对。先读字段说明。它可能只有关节和夹爪的读数,并非完整的世界状态。
第 4 题: 不能。行号是组织记录的方式,不能代替对时间戳、采样、匹配规则和延迟的核查。处理过的数据可能已经对齐,但需要依据说明确认。
再做一个生活练习:用三句话记录自己拿起空杯子的过程——“拿之前看到什么”“做了什么”“拿之后看到什么”。尽量不要把第二句写成“成功拿到了”,因为那已经偷偷替第三句作了结论。
下一站:两个“前方”,可能是两个方向
Section titled “下一站:两个“前方”,可能是两个方向”现在,机器人工作台上的一排窗口应该不再神秘了:图像给外观线索,深度和点云补充空间信息,自身状态帮助它了解身体;把这些观测与动作按时间联系起来,才能看清一段交互过程。
你也已经能问出一个比“模型多大”更靠前的问题:它此刻拿到了什么信息,这些信息可信吗,动作之后又观察到了什么?
下一篇是 《“往前一点”是谁的前方?》:相机的前方、桌子的前方、机械臂的前方,为什么可能不是同一个方向?该篇目前规划中。可返回学习路线查看后续安排,或通过算法地图了解感知与数据专题的规划。
想多看一点:从图例和字段开始
Section titled “想多看一点:从图例和字段开始”这些官方资料用于核对概念,不是阅读下一篇的前置考试。现在不需要照着运行代码。
- Open3D 的 RGB-D 图像教程:看看彩色图、深度图和点云怎样联系起来;不同设备的深度单位可能不同。
- Open3D 的点云接口说明:核对“深度加上相机参数,才能转换成空间点”这一点。
- Spinning Up:状态与观测:进一步区分完整状态与系统实际拿到的观测。
- LeRobotDataset v3 官方说明:了解视频、数值记录和时间信息怎样组织为机器人数据集。
- ROS 2 时间同步示例:看看不同节奏的信息为什么需要按时间对应。
本文杯子情节与表格中的任务过程为教学示意;真实数值仅来自单独标明的公开数据集。资料核验与样本读取:2026-10-24。