二十一讲 | 第6讲:机器人感知与位姿估计:从像素到抓取位姿的完整链路(下)

Xbotics具身智能实验室 2026-10-26 11:05

📂 项目地址

GitHub:Xbotics-Embodied-AI-club/Xbotics-Embodied-AI-Handbook/tree/main

5 抓取位姿生成:从物体位姿到机器人可执行目标

第 4 节得到的 object pose 描述物体在空间中的刚体状态;机器人控制系统真正需要的,是末端执行器在机器人基座坐标系下的可执行目标。因此,抓取位姿生成不是在物体中心“放一个点”,而是将物体状态、夹爪几何、任务约束和坐标变换统一到同一个操作表征中。

如果说第 4 节解决的是“物体摆在哪里”,第 5 节解决的就是“末端执行器应如何接近并约束物体”。这两个问题看起来相近,实际差别很大。一个盒子的物体坐标原点由 CAD 或数据集约定,并不必然是几何中心或质心;即便它恰好位于中心,夹爪也不一定要去中心点。一个杯子的坐标系可以朝向杯口,但夹爪可能更适合从杯身侧面接近;一个工具的姿态估计很准确,也不代表机械臂一定能以那个方向绕过桌面和邻近物体。抓取候选生成就是把这些操作层面的因素逐一补上。

可以将该层理解为如下映射:

其中, 是相机系下的物体位姿, 是目标点云或几何模型, 表示夹爪结构参数, 表示环境、任务和可达性约束;输出  是抓取候选集合。严格说,grasp pose 指夹爪 TCP 在抓取时刻的  目标 ;夹爪开合宽度、接近方向、预抓取位姿、接触点和质量分数是抓取候选的附加参数。这个映射看起来像一个简单的坐标变换,实际上包含了任务层、几何层和运动学层的共同约束。

5.1 为什么 object pose 不等于 grasp pose

object pose 和 grasp pose 描述的是两个不同对象。前者描述物体坐标系相对于参考坐标系的刚体变换;后者描述夹爪工具中心点(TCP)相对于机器人基座坐标系的目标变换。二者相关,但不等价。

工程上可以把 object pose 看作“感知模块的状态估计”,把 grasp pose 看作“规划模块的动作候选”。前者尽量客观地描述物体,后者必须带有任务意图:是搬起、递送、倒水、插入,还是只把物体推到一侧。任务不同,即使同一个物体位姿也会对应不同抓取方式。

5.1.1 抓取点选择:物体中心不等于最佳接触点

一个直观例子是螺丝刀:object pose 可以告诉我们螺丝刀的长轴方向和空间位置,但抓取时通常不会去夹刀尖,也不会盲目夹几何中心,而要选择靠近手柄、受力稳定且不影响后续使用的位置。再比如杯子,杯子的物体坐标系可能定义在杯身中心,但抓取策略可能选择从侧面夹杯身,也可能选择抓杯柄附近。也就是说,object pose 是对“物”的描述,grasp pose 是对“手”的描述,中间必须经过抓取策略映射。

概念
描述对象
典型形式
回答的问题
尚未包含的信息
object pose
物体坐标系
 / 
物体在哪里、朝向如何
抓取点、接近方向、夹爪开口、避碰偏置
grasp pose
夹爪 TCP 坐标系
夹爪在抓取时刻应到哪里、如何对齐
仍需开合宽度、接近 / 撤离、IK、碰撞、力控和执行校验
grasp candidate
一次完整抓取尝试
{pose, width, approach, pregrasp, score, contacts...}
描述抓取动作参数集合
仍需排序、筛选和执行闭环
转换阶段
输入
输出
关键约束
状态估计
RGB-D、mask、目标点云
object pose
几何一致性、对称性、置信度
抓取生成
object pose、点云、夹爪模型
grasp candidates
接触稳定性、开合宽度、接近方向
坐标转换
相机外参、当前末端位姿
base-frame grasp pose
矩阵方向、单位、TCP 偏置
执行筛选
grasp pose、环境模型
可执行轨迹
IK、关节限位、碰撞、速度约束

5.1.2 接近方向:物体朝向不等于夹爪进入方向

即使物体姿态估计正确,夹爪也不一定沿物体坐标轴直接接近。接近方向要同时考虑桌面、邻物、夹爪形状和任务意图:顶部抓取更关心桌面法线,侧向抓取更关心局部表面法线,插拔任务则可能要求沿孔轴或工具轴运动。

5.1.3 夹爪开合尺度:物体尺寸不等于夹爪开口宽度

夹爪开口宽度来自被夹持局部的几何尺度,而不是物体整体尺寸。对杯子、工具、带把手物体等非均匀目标而言,物体 bbox 尺寸只能提供粗略上界,真正可用的开合尺度需要结合局部点云、抓取模板或学习模型估计。

5.1.4 安全余量:物体表面不等于夹爪目标位置

抓取位姿还必须包含安全偏移和预抓取姿态。机械臂通常先到达目标外侧的 pre-grasp,再沿接近方向低速进入 grasp 位姿,以减少标定误差、深度噪声和规划误差带来的碰撞风险。

若在物体坐标系下预定义抓取模板 ,Eye-to-Hand 情形下可写为:

Eye-in-Hand 情形下,由于相机随末端运动,还需引入当前末端位姿:

这两个公式说明:从 object pose 到 grasp pose 的转换,本质上是从物体状态表征到动作构型表征的映射。该映射同时受物体几何、夹爪结构、环境约束和坐标链路方向的共同影响。

本节小结: object pose 描述物体坐标系的刚体状态,grasp pose 描述夹爪 TCP 的目标刚体变换;完整抓取候选还应包含开合宽度、接近方向、预抓取位姿、评分和接触约束等附加参数。一个物体位姿可以对应多个抓取候选,不同候选又会受到夹爪结构、任务意图、周围障碍物和可达性约束的筛选。位姿估计提供的是操作所需的重要中间量,而不是机械臂可以直接执行的最终指令。真正的抓取生成,需要把物体状态、夹爪几何、运动规划和安全策略放在同一条链路中共同考虑。

5.2 抓取候选的核心要素:抓取点、接近方向、开合尺度、安全偏移与姿态匹配

一个可执行抓取候选通常包含抓取点、接近方向、姿态对齐、开合宽度和安全偏移等要素。它们共同决定夹爪如何接近目标、在哪个位置形成接触、以何种方向闭合,以及如何在执行前预留安全缓冲。MoveIt 等运动规划框架中的 grasp_pose、pre_grasp_approach、post_grasp_retreat、pre_grasp_posture 和 grasp_posture,本质上就是把 pose 与这些附加动作参数结构化成可提交给规划器的接口字段 [6][7]。

可以按一次真实抓取来理解这些参数:夹爪先要知道目标点在哪里,这是抓取点;接着要知道从哪个方向靠近,这是接近方向;靠近时手指该怎么转,这是姿态对齐;手指张多大,这是开合宽度;最后,不能直接高速冲到接触点,而要先停在目标外侧一个安全位置,这就是安全偏移和预抓取位姿。少掉这些附加参数,单独的 grasp_pose 只是一个空间刚体变换,抓取很容易从“可执行动作”退化成“空间里一个孤立的目标姿态”。

5.2.1 抓取点(Grasp Point):夹爪中心到哪里

抓取点是夹爪 TCP 或两指中心在接触时刻应该到达的位置。它可以来自物体质心、点云包围盒中心、局部平面中心、CAD 模型关键点,也可以来自学习模型预测的接触区域。抓取点并不一定等于物体几何中心:拿杯子时,抓取点可能在杯身侧壁;拿盒子时,抓取点可能接近上表面中心;拿带柄工具时,抓取点常常落在把手或细长轴上。

工程上应区分三类点:目标中心点、接触中心点和 TCP 目标点。目标中心点只表示物体大致在哪里;接触中心点表示夹爪希望夹住哪个局部结构;TCP 目标点还要考虑夹爪几何偏置。若把这三者混为一谈,就会出现“视觉上对准了物体中心,但夹爪指尖实际碰到边缘”的问题。

抓取点的常见检查方式包括:看点是否落在目标点云内部或可接触表面附近;看该点到桌面、邻物和遮挡物的距离是否足够;看以该点为中心的夹爪模型是否能容纳目标局部宽度。对于点云稀疏或遮挡严重的目标,不建议只用单帧质心直接抓取,应结合包围盒、局部法线或多候选排序做保护。

5.2.2 接近方向(Approach Direction):夹爪从哪个方向来

接近方向决定末端执行器进入目标附近的路径。它通常由桌面法线、物体侧面法线、物体主轴、局部表面法线或任务约束确定,是避碰和姿态规划中最敏感的参数之一。对桌面顶部抓取而言,接近方向常取世界系或基座系的竖直向下;对侧向抓取而言,接近方向通常沿物体侧面法线或夹爪闭合平面的法向进入;对插拔、挂取、按压等任务,接近方向还必须服从孔轴、把手方向或接触面的功能约束。

接近方向不是随便选一条看起来最短的路径。它至少要同时满足三类条件:第一,沿该方向移动时夹爪不会先碰桌面、相机支架、邻近物体或机器人本体;第二,方向要与夹爪闭合后的受力方向匹配,避免把物体推走而不是夹住;第三,pre-grasp 到 grasp 的最后一小段应尽量短、直、低速,便于把视觉误差限制在接触前的局部区域。

一个实用检查是把接近方向画成箭头,并从 pre-grasp 点到 grasp 点连成线段。如果这条线穿过桌面、穿过物体主体之外的遮挡物,或者与夹爪手指开合方向混淆,就说明候选还不能执行。许多抓取失败并不是抓取点错了,而是接近方向把夹爪带到了一个必然碰撞的位置。

5.2.3 开合尺度(Gripper Opening Width):夹爪张多大

开合尺度决定夹爪闭合前的初始宽度。它需要覆盖被夹持局部的几何尺寸,并加入安全余量;过小会导致手指在到达抓取点前提前碰撞目标,过大则会增加碰到邻物、桌沿或容器壁的风险。对两指夹爪而言,开合尺度通常与夹爪闭合方向上的局部宽度相关,而不是简单等于整个物体的最大宽度。

可以用下面的关系理解:

其中  是抓取局部在夹爪开合方向上的尺寸, 是给定位误差、点云噪声和夹爪重复定位误差预留的余量。这个余量不能无限增大,因为夹爪张得越开,进入狭窄空间时越容易碰撞邻物;也不能太小,因为真实深度、标定和物体摆放都会有误差。

开合尺度还必须受夹爪硬件限制约束。报告中应说明夹爪最小闭合宽度、最大开口宽度和本次候选使用的宽度。如果候选宽度超过夹爪行程,即使位姿完全正确也无法执行;如果宽度接近极限,闭合力和接触稳定性也可能下降。

5.2.4 安全偏移(Safety Offset):夹爪停在哪儿

安全偏移用于构造 pre-grasp,使夹爪在真正接触前先停在目标外侧。它把长距离运动规划和短距离接触动作分开,是降低执行风险的基本设计。没有 pre-grasp 的抓取,相当于让规划器直接把 TCP 送到接触位姿;一旦深度、标定或路径略有误差,就可能在高速接近阶段撞到物体或桌面。

安全偏移通常沿接近方向反向设置:

其中  是抓取点, 是从 pre-grasp 指向 grasp 的单位接近方向, 是预留距离。这个距离要大于预期定位误差和夹爪外形厚度带来的缓冲需求,但也不能过大;过大会让最后一段直线接近跨越更多障碍物,反而增加碰撞风险。

实际系统中,pre-grasp 还承担一个调试功能:机械臂可以先运动到 pre-grasp,暂停或低速观察,确认夹爪、目标和桌面的相对位置,再执行最后的 approach。对教学实验,即使没有真机,也应在可视化中画出 pre-grasp 点和 grasp 点,让读者看到“安全停靠点”和“实际接触点”的区别。

5.2.5 姿态匹配(Orientation Alignment):夹爪方向与物体姿态对齐

姿态匹配决定夹爪开合方向、接近方向和 TCP 坐标系之间的关系。规则物体可以依赖主轴或抓取模板,复杂物体则常需要学习模型生成多个候选,再由几何与运动学约束筛选。

一个夹爪姿态通常可以由三根互相正交的轴构造:接近轴、开合轴和手掌法向轴。接近轴决定夹爪从哪里进入,开合轴决定两根手指从哪两个方向夹住物体,第三根轴由右手系约束确定。仅有接近方向还不够,因为夹爪可以绕接近方向旋转;这个绕轴旋转角会决定手指是否对准物体长轴、短轴、把手、孔洞或可接触平面。

对盒子、书本、工具柄等有明显主轴的物体,夹爪开合方向通常要与局部宽度方向对齐,而不是与物体最长方向对齐。对圆柱、杯子这类存在旋转对称的物体,多个姿态可能在几何上等价,但会因为把手、遮挡或邻物而在执行上不同。对插拔和装配任务,姿态匹配比抓取点更敏感,因为几度旋转误差就可能导致插入失败或侧向卡死。

调试姿态匹配时,应同时画出物体坐标系和夹爪 TCP 坐标系,并说明每根轴的物理含义。若只显示一个 4×4 矩阵,读者很难判断夹爪到底是从上方来、从侧面来,还是绕接近方向转错了 90 度。工程报告中最好明确写出:哪根轴是 approach,哪根轴是 finger closing direction,哪根轴是 palm normal。

要素
物理含义
典型确定方式
误差后果
抓取点 
夹爪中心到达的位置
质心、局部平面中心、关键点、抓取模板
夹空、夹边、接触不稳定
接近方向 
夹爪进入目标的方向
桌面法线、表面法线、物体主轴、任务约束
提前碰撞、接近受阻
姿态矩阵 
夹爪局部坐标系与目标几何的对齐关系
由接近方向、开合方向和 TCP 定义构造
手指不贴合、姿态偏转
开合宽度 
闭合前夹爪张开尺度
被夹持部位局部尺寸 + 安全余量
无法闭合或压碰邻物
安全偏移 
预抓取点到抓取点的距离
沿接近方向反向偏移
高速接近时撞物、路径过短

5.2.6 总结:五个要素的协同关系

从接口角度看,一个抓取候选通常不是只保存 pose,而是一组随动作阶段展开的参数:

字段
对应含义
常见用途
grasp_pose
末端执行器尝试抓取时的目标位姿
作为 IK 和路径规划目标
pre_grasp_approach
抓取前的接近方向和距离
控制末端从安全位置进入目标
post_grasp_retreat
抓取后的撤离方向和距离
抬升或退出障碍区域
pre_grasp_posture
接近前夹爪姿态
通常对应张开状态
grasp_posture
抓取时夹爪姿态或闭合动作
控制闭合位置与接触力
grasp_quality
候选抓取评分
多候选排序与筛选

在代码中,建议把候选保存成结构化对象,而不是只保存一个矩阵。例如:

{
  "grasp_point": [0.12, -0.04, 0.63],
"approach_direction": [0.0, 0.0, -1.0],
"closing_direction": [1.0, 0.0, 0.0],
"gripper_width": 0.065,
"pre_grasp_distance": 0.08,
"grasp_pose": "4x4 matrix in base frame",
"score": 0.82,
"validity_checks": {
    "within_workspace": true,
    "width_in_range": true,
    "ik_solved": true,
    "collision_free": false
  }
}

这个结构的好处是失败时能快速归因:width_in_range=false 说明候选超出夹爪行程;ik_solved=false 说明空间位姿不可达;collision_free=false 说明几何候选存在但路径不可执行。相比只输出 T_base_grasp,这种表示更接近真实规划器和抓取模块需要消费的数据。

在实现上,抓取候选可以来自三种来源。第一种是模板法:对已知物体预先定义若干 ,运行时用 object pose 将模板变换到机器人坐标系;第二种是几何法:从点云中估计主轴、法线、局部宽度和可接触区域,再构造夹爪坐标系;第三种是学习法:由网络直接预测抓取候选、抓取质量分数和夹爪宽度。无论候选如何产生,最后都需要回到同一套执行参数:抓取点、接近方向、开合宽度、预抓取偏移和可达性校验。

生成方式
输入依赖
优势
风险
抓取模板
CAD / 物体坐标系 / 物体位姿
可解释、重复性好
依赖已知物体和准确位姿
点云几何
目标点云、法线、包围盒、主轴
不强依赖类别,适合规则物体
对遮挡和噪声敏感
学习预测
RGB-D / 点云 / 示教数据
可处理复杂形状和多候选
需要数据,候选仍需几何校验

本节小结: 一个完整抓取候选不是单个空间点,也不只是一个  位姿,而是一组相互约束的执行参数。抓取点决定夹爪到哪里,接近方向决定从哪条路径进入,姿态匹配决定手指如何对齐,开合宽度决定能否包住目标,安全偏移决定接近过程是否留有缓冲。任何一个要素定义不清,都会把看似合理的几何候选变成真机上的碰撞、夹偏或闭合失败。只有这些要素共同成立,并且经过坐标转换和可达性校验,抓取候选才会变成可规划、可接近、可闭合的末端目标。

5.3 典型抓取场景的位姿生成逻辑:顶部垂直接近 vs 侧面姿态匹配

桌面操作中最常见的两类构型是顶部抓取(top grasp)与侧向抓取(side grasp)。二者的区别主要体现在接近方向、姿态约束和环境碰撞条件上。

在桌面场景里,系统通常会先尝试最简单的顶部抓取:从上方下来,夹住物体,再向上抬起。如果目标较高、上方被遮挡、物体靠近货架或墙面,顶部路径就可能不可行,此时才需要考虑侧向抓取。这个决策顺序本身也是一种工程取舍:先用约束更少、风险更低的构型;当环境不允许时,再使用对姿态精度要求更高的构型。

5.3.1 桌面顶部抓取:垂直接近范式

构型
接近方向
姿态约束
适合对象
主要风险
顶部抓取
沿桌面法线向下
夹爪开合方向通常与物体长轴对齐
盒体、书本、手机、低矮工件
上方空间不足、薄物体难夹
侧向抓取
沿物体侧面法线或水平方向
夹爪开合平面需贴合目标侧面
杯、瓶、细高物体、货架物体
易撞桌面 / 隔板,姿态误差放大

顶部抓取的优势是结构简单、碰撞风险较低,通常只需准确估计目标平面位置、顶部高度和开合方向。对于规则块状物体,抓取点可取目标点云在水平面的几何中心,接近方向取桌面法线的反方向,预抓取位姿位于目标上方。它对物体绕竖直轴的旋转误差相对不敏感,因此常被用作观测退化时的保守降级策略。

5.3.2 侧面抓取:水平接近与姿态匹配

侧向抓取更依赖姿态估计和局部几何。夹爪需要从目标侧面进入,接近方向与侧面法线相关,开合方向要与可夹持区域的主方向匹配。它的优势是能处理细高物体、货架物体和上方空间受限场景;风险在于姿态误差会被夹爪长度和接近距离放大。若姿态误差为 ,指尖处的横向偏移近似为:

其中  是夹爪指尖到 TCP 或接触区域的有效距离。以 、 为例,横向偏移约为 ,足以导致侧向抓取从“夹持”变成“顶撞”。因此,侧向抓取通常需要更可靠的点云质量、位姿精化和碰撞检查。

5.3.3 预抓取位姿与安全接近路径设计

执行时,抓取动作通常拆为三段:pre-grasp → grasp → retreat / lift。这种分段并非形式化流程,而是为了将长距离运动、低速接触和撤离验证分开处理。

阶段
顶部抓取
侧向抓取
Pre-grasp
位于目标上方,夹爪张开
位于目标侧面外侧,夹爪张开
Grasp
沿竖直方向下降并闭合
沿水平方向进入并闭合
Retreat / lift
垂直抬升,验证负载
先沿接近反方向退出,再按可行方向抬升

这三段动作也对应不同的误差容忍度。到达 pre-grasp 时允许较大的路径规划余量,因为夹爪尚未接触物体;从 pre-grasp 到 grasp 的最后一段运动必须低速、短距离、方向明确,因为此时深度误差和姿态误差会直接转化为碰撞或夹空;retreat / lift 阶段则用于验证抓取是否成功,并让物体离开桌面或狭窄空间。MoveIt 等规划框架中的 pre_grasp_approach、post_grasp_retreat、grasp_pose 等字段,本质上就是对这三段动作的结构化描述。

本节小结: 顶部抓取适合开阔桌面和规则低矮物体,它的优点是约束简单、姿态要求较低、失败风险相对可控;侧向抓取适合细高物体、侧面接触和空间受限场景,但对物体姿态估计、夹爪对齐和避碰规划要求更高。两种抓取范式不是谁替代谁,而是对应不同几何条件和任务目标的策略选择。无论采用哪种构型,都应通过 pre-grasp → grasp → retreat 将接近、接触和撤离分开处理。这个三段式结构,是把视觉误差、标定误差和运动误差限制在可控范围内的基本工程手段。

5.4 坐标系转换链路:从相机坐标系到机器人基座坐标系

视觉模块通常输出相机坐标系下的点、点云或位姿;运动控制模块需要机器人基座坐标系下的夹爪目标。因此,抓取位姿生成必须显式经过坐标变换链路,并清楚区分 Eye-to-Hand 与 Eye-in-Hand 两种拓扑。

这是从“算得出来”到“机器人动得对”的关键一步。视觉算法说“目标在相机前方 0.6 米、右侧 0.1 米”,机械臂控制器并不能直接使用这句话;它需要知道这个目标在机器人基座坐标系下的位置和姿态。手眼标定的作用,就是把相机看到的空间和机器人能运动的空间对齐。如果这一步错了,前面的检测、分割、点云和位姿都可能看起来正确,但机械臂一执行就会整体偏到另一边。

5.4.1 完整的坐标转换依赖关系

从像素到执行目标,一条典型链路包含以下变换:

变换项
来源
用途
相机内参标定
像素与深度到相机三维点的恢复
Eye-in-Hand 手眼标定
相机系到末端系变换
Eye-to-Hand 手眼标定
相机系到基座系变换
机器人正运动学
末端系到基座系变换
工具标定
法兰 / 末端到夹爪 TCP 的固定偏置

坐标变换错误常见于两个层面:一是矩阵方向写反,例如把  当成  使用;二是忽略 TCP 偏置,导致机械臂法兰到位但夹爪中心未到位。真机部署中,应将每个变换矩阵的“从哪个坐标系到哪个坐标系”写入变量名或文档,避免只用 T、R、t 这类模糊命名。

一个实用的写法是始终使用“左上标表示目标坐标系,右下标表示源坐标系”的约定: 表示把相机系中的点变换到基座系, 表示把相机系中的点变换到末端系。若要把点  变到基座系,应写作 。这种记号看似繁琐,但能显著减少矩阵连乘方向错误。

5.4.2 眼在手上(Eye-in-Hand)与眼在手外(Eye-to-Hand)的物理拓扑差异

Eye-to-Hand 中,相机固定在工作空间外,待求外参通常为 。相机观测到的抓取位姿可直接通过固定外参映射到基座系:

二十一讲 | 第6讲:机器人感知与位姿估计:从像素到抓取位姿的完整链路(下)图1
图6.13 Eye-to-Hand 拓扑:相机固定于工作空间外,标定目标通常随机械臂末端运动,目标是求解相机到机器人基座的固定变换

图 6.13 对应的是“眼在手外”。相机像一个固定观察员,从工作空间外持续看着桌面和机械臂。它的优势是视野稳定、容易观察全局,适合桌面分拣、上下料和多个目标的排序选择;缺点是目标可能被机械臂本体遮挡,且相机距离目标较远时,深度噪声和标定误差会更明显。

Eye-in-Hand 中,相机安装在末端并随机械臂运动,待求外参通常为 。运行时必须结合当前末端位姿:

二十一讲 | 第6讲:机器人感知与位姿估计:从像素到抓取位姿的完整链路(下)图2

图 6.14 对应的是“眼在手上”。相机随着夹爪运动,机器人可以把相机移动到目标附近做近距离复检,因此适合精细装配、局部对位和遮挡较多的场景。代价是采集图像需要机械臂先移动到合适位置,循环时间更长;相机安装在末端还会带来负载、布线和碰撞规避问题。

拓扑
固定对象
运动对象
待求外参
运行时变换形式
Eye-to-Hand
相机固定于工作区外
标定板或目标随机械臂运动
Eye-in-Hand
相机固定于末端
相机随机械臂运动

5.4.3 手眼标定的数学本质:求解  方程

手眼标定的目标,是基于多组机器人运动与相机观测求解一个固定外参矩阵 :

符号
含义
机器人侧相邻两次采样之间的相对运动
相机侧相邻两次观测之间的相对运动
待求的固定手眼外参

该方程依赖的是相对运动关系,而非单次绝对位姿。采样过程是否覆盖足够的平移和旋转激励、标定板观测是否稳定、矩阵方向是否统一,往往比具体调用哪个求解接口更重要。若采样姿态变化过小,或所有位姿近似共面,求得的  可能数值上收敛但物理上不可用。

OpenCV 的 calibrateHandEye() 提供了 Tsai-Lenz、Park-Martin、Horaud、Andreff、Daniilidis 等多种求解方法 [8]。工程上不应把“换求解器”作为第一反应:如果样本激励不足、机器人位姿方向写反、T_cam_board 来自错误 marker 尺寸,那么不同方法只是在同一批错误数据上给出不同数值。更可靠的流程是先检查输入矩阵方向和样本分布,再比较不同求解器的一致性。

采样时应避免只在一个小区域内平移机械臂,也不要让相机始终以几乎相同的角度观察标定板。更可靠的做法是覆盖工作空间内多个位置,并让末端姿态产生足够的 roll、pitch、yaw 变化。标定完成后,不应只检查算法返回的均方误差,还应做点位复现:选择相机视野中的一个已知点,经外参变换到机器人基座系,再让机械臂移动到该点附近观察是否吻合。这个验证步骤往往比单看矩阵数值更能发现方向、单位和 TCP 错误。

5.4.4 眼在手上实操和代码入口

Eye-in-Hand 的物理关系可以这样理解:相机固定在末端执行器上,机械臂每运动到一个新姿态,相机也随之改变观察角度;若标定板在世界中保持相对静止,那么每一组样本都应满足同一条坐标链:

其中  就是要求解的 T_end_camera。对应代码位于 Hand-eye calibration 目录:教学 demo 默认使用合成数据,从 T_base_end 和 T_cam_board 生成一组可复现实验样本;真实机器人实验时,则把这两个 JSON 换成实采数据。完整流程与第 3.4.4 节的点云 demo 类似,都是先准备输入,再一键运行脚本,最后查看输出报告。

环节
脚本
输出或检查项
一键流水线
pipeline_hand_eye_demo.py
合成样本、数据筛查、外参求解、闭环验证、pipeline_summary.json
合成数据
generate_synthetic_hand_eye_data.pyrobot_poses.json
、camera_poses.json、ground_truth.json
相机侧位姿生成
estimate_board_pose_aruco.pycamera_poses.json
、重投影误差报告
数据筛查
inspect_hand_eye_dataset.py
样本配对、运动激励、弱运动对
外参求解
calibrate_eye_in_hand.pyT_end_camera
、残差统计、详细报告
闭环验证
validate_hand_eye.pyT_base_board
 跨样本一致性
教学求解
solve_hand_eye_teaching.pyAX=XB
 相对运动构造与 Park 求解诊断

最小可运行命令如下:

cd "code/lecture06/Hand-eye calibration"

pip install numpy opencv-python

python pipeline_hand_eye_demo.py --topology eye_in_hand

如果默认镜像下载较慢,可使用清华 PyPI 镜像:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy opencv-python

运行后会生成 data/hand_eye_demo/eye_in_hand/,其中 eye_in_hand.json 保存求解得到的 T_end_camera,inspect_report.json 记录样本激励检查,validation_report.json 记录 T_base_board 的跨样本一致性,pipeline_summary.json 汇总残差和输出路径。在默认合成数据上,终端会同时打印与 ground_truth.json 的误差,便于确认求解结果是否落在毫米级和小角度范围内。

真实标定时,流程不变:先用 estimate_board_pose_aruco.py 或其他 PnP 程序生成 camera_poses.json,再把机器人控制器记录的 T_base_end 写入 robot_poses.json,最后用 pipeline_hand_eye_demo.py --topology eye_in_hand --demo-dir 你的数据目录 --skip-generate 复用同一套筛查、求解和验证步骤。这三步各自回答一个问题:样本是否足够好,末端到相机的固定外参是多少,以及把外参代回去以后标定板在基座系中是否近似不动。

5.4.5 眼在手外实操和代码入口

Eye-to-Hand 的核心是求解  / T_base_camera,即固定相机到机器人基座的外参。和 Eye-in-Hand 相比,Eye-to-Hand 的相机不再随机械臂运动,运动的是末端上的标定板或被末端夹持的刚性目标。因此,它的闭环关系更适合写成:

这里  在采样过程中保持固定,要求解的是 。两种拓扑可以使用同一批输入格式:机器人侧记录 T_base_end,相机侧记录 T_cam_board;区别在于构造  相对运动时,Eye-to-Hand 需要对机器人侧运动做方向改写。代码入口仍位于 Hand-eye calibration 目录,但一键命令需要把 --topology 切换为 eye_to_hand。

环节
脚本
输出或检查项
一键流水线
pipeline_hand_eye_demo.py
合成样本、数据筛查、外参求解、闭环验证、pipeline_summary.json
合成数据
generate_synthetic_hand_eye_data.py
可复现样本与 ground_truth.json
相机侧位姿生成
estimate_board_pose_aruco.py
固定相机视角下的 T_cam_board
数据筛查
inspect_hand_eye_dataset.py
使用 --topology eye_to_hand 检查运动激励
外参求解
calibrate_eye_to_hand.pyT_base_camera
、残差统计、详细报告
闭环验证
validate_hand_eye.pyT_end_board
 跨样本一致性

最小可运行命令如下:

cd "code/lecture06/Hand-eye calibration"

pip install numpy opencv-python

python pipeline_hand_eye_demo.py --topology eye_to_hand

运行后会生成 data/hand_eye_demo/eye_to_hand/,其中 eye_to_hand.json 保存求解得到的 T_base_camera,inspect_report.json 记录样本激励检查,validation_report.json 记录 T_end_board 的跨样本一致性,pipeline_summary.json 汇总残差和输出路径。

Eye-to-Hand 的验证重点不是“标定板在基座系中不动”,而是“标定板在末端坐标系中不动”。因此 validate_hand_eye.py 读取 eye_to_hand.json 后,会根据其中的 topology 字段自动选择验证链路,反推出每个样本的 T_end_board,再统计它们相对于平均参考变换的平移和旋转残差。真实标定时,可用 pipeline_hand_eye_demo.py --topology eye_to_hand --demo-dir 你的数据目录 --skip-generate 直接复用实采 robot_poses.json 和 camera_poses.json。若残差呈现随末端位置变化而系统性增大,通常应优先检查相机外参方向、机器人基座坐标定义和相机内参;若只有少数样本异常,则更可能是某几张图的 marker 检测、机器人姿态记录或样本配对出现问题。

5.4.6 真机部署中的标定误差排查

误差来源
典型表现
优先检查项
相机内参偏差
点云尺度异常、边缘畸变明显
、畸变模型
深度尺度错误
Z 向整体放大或缩小
depth_scale
、单位换算
手眼旋转误差
距离越远偏差越大
姿态激励是否充分、矩阵方向是否统一
机器人位姿解析错误
标定矩阵数值正常但复现失败
欧拉角顺序、四元数顺序、角度单位
TCP 偏置遗漏
法兰到位但夹爪中心不对
、工具坐标设定

旋转误差的任务影响应按具体坐标链路分析。若某个模型点或接触点相对旋转中心的距离为 ,小角度误差为 ,该点的位移量级约为 ;这里的  是点到相关旋转中心的几何杠杆臂,而不是物体到机器人基座的距离。因此,手眼标定验证不能只看平移残差,还必须检查旋转残差、点位复现误差以及抓取接触点处的实际偏差。

本节小结: 坐标系转换是视觉结果进入机器人控制系统的最后一道几何关口。Eye-in-Hand 与 Eye-to-Hand 的输入数据形式看起来相似,都是机器人位姿配相机观测,但固定对象、运动对象、外参含义和验证链路完全不同。工程实现中最容易出错的不是公式本身,而是矩阵方向、乘法顺序、TCP 偏置和“谁相对谁运动”的拓扑理解。只要这些关系写反,前端感知再准确,也会在执行阶段表现为稳定而危险的系统性偏差。因此,手眼标定结果必须通过点位复现、姿态复现和抓取前的坐标链路检查共同验证。

5.5 可达性校验:由几何可行到机械可行

即使  已经计算完成,也不能直接下发执行。几何上合理的抓取目标不一定满足机械臂的工作空间、关节限位、逆运动学和碰撞约束。抓取候选需要经过从粗到细的可达性筛选。

这一节要强调的是:抓取位姿“算出来”不等于“机械臂能做到”。有些目标点在相机看来很合理,但超出了机械臂工作空间;有些位置能够到达,但要求夹爪以一个机械臂无法实现的姿态进入;还有些位姿本身可达,但从当前位置过去的路径会撞到桌面或旁边物体。因此,抓取候选必须先经过可达性校验,再进入运动规划和执行。

检查项
目的
失败时的典型处理
工作空间判断
判断目标位置是否在机械臂可达范围内
丢弃候选或更换目标点
IK 可解性
判断是否存在满足目标姿态的关节解
更换抓取方向、放宽姿态或调整 pre-grasp
关节限位
防止接近奇异位形或超出机构范围
选择另一组 IK 解或重新排序候选
碰撞检查
避免与桌面、环境、本体和邻物碰撞
修改接近方向、提高过渡点、增加安全偏移
夹爪行程
判断局部尺寸是否落在夹爪开口范围内
更换抓取部位或放弃抓取
路径连续性
确保 pre-grasp → grasp → retreat 可顺序执行
分段规划或插入中间位姿

可达性校验应按顺序执行:先剔除明显超出工作空间的候选,再求解 IK,最后做碰撞和路径检查。这样可以减少规划器负担,也便于定位失败原因。对教学系统而言,建议将每个候选的失败原因显式记录为 workspace_fail、ik_fail、collision_fail 或 gripper_fail,避免调试时只看到笼统的 planning failed。

在多候选抓取中,可达性校验还承担排序作用。系统可以先生成多个抓取候选,再按照抓取质量、接近路径长度、IK 解裕量、碰撞距离和夹爪开口余量进行打分。最终被执行的候选,不一定是视觉评分最高的候选,而是综合几何稳定性和机械可行性后最可靠的候选。这样的排序机制能显著降低单一位姿估计误差对最终抓取的影响。

本节小结: 可达性校验把“几何上合理”的抓取候选进一步筛成“机械上可执行”的目标。工作空间判断、IK、关节限位、碰撞检测和夹爪行程检查应按由粗到细的顺序执行,这样既减少规划器负担,也便于定位失败原因。可达性失败并不一定说明位姿估计错误,也可能来自机械臂构型、障碍物布局、TCP 定义或夹爪行程不足。真实系统中,记录 workspace_fail、ik_fail、collision_fail、width_fail 等失败标签,往往比只看到一句 planning failed 更有调试价值,也能指导后续候选排序和策略降级。

5.6 观测退化下的策略降级

真实场景中,6D 位姿估计可能因遮挡、反光、透明材质、低纹理或点云过稀而失效。此时系统不应继续使用低置信度姿态结果,而应根据当前可用观测信息切换到更低信息需求的策略。

降级策略可以理解为机器人系统的保守执行模式。当完整 6D 位姿可靠时,应优先使用姿态匹配抓取;但如果只剩下一个稳定的 3D 中心点,就不应构造缺乏依据的旋转姿态并直接执行。更稳妥的做法,是承认当前信息不足,退回到对姿态要求较低的顶部抓取,或者重新观测。对真实机器人来说,拒绝一次低置信度抓取通常比错误执行一次更安全。

当前可用信息
建议策略
适用条件
主要限制
6D pose 可靠
姿态匹配抓取
已知物体、点云完整、配准误差低
依赖姿态置信度与标定精度
3D 中心可靠
顶部垂直接近
桌面开阔、目标低矮、姿态不关键
不适合细长、偏心或易滚动物体
仅 bbox / mask 可靠
重新观测、近距离复检或再分割
深度质量不足、遮挡较重
需要额外时间和运动
多次复检仍失败
放弃执行或请求人工确认
安全风险高、目标不可达
任务中断,但避免错误执行

降级策略的核心,是把“精确但不可靠”的高维估计,替换为“粗糙但可验证”的低维控制目标。例如,当物体姿态不可信但目标点云中心稳定时,可以退回到基于 3D 中心的顶部抓取:接近方向固定为桌面法线方向,夹爪姿态取默认水平姿态,开合宽度由点云包围盒估计,随后仍执行可达性和碰撞检查。

触发降级的常见条件包括:位姿置信度低于阈值、配准残差过大、位姿在连续帧间跳变、有效深度像素比例过低、IK 或碰撞检查连续失败。降级不是为了保证高成功率,而是为了避免系统在感知不充分时输出看似精确、实则危险的动作。

降级策略也应当分层,而不是只有“执行 / 不执行”两种状态。若只是旋转不可靠,可以保留 3D 中心并使用顶部抓取;若深度点云也不可靠,可以移动腕部相机或改变视角重新采集;若多次重感知仍失败,则应放弃该目标或请求人工确认。对于面向真实硬件的系统,这种保守决策是安全设计的一部分。

本节小结: 抓取位姿生成是从物体状态表征到机器人动作表征的转换层。它不仅要从物体位姿推导夹爪的抓取点、接近方向与开合宽度,还要通过手眼标定和 TCP 修正完成坐标转换,并经过 IK、碰撞、夹爪行程与策略降级机制筛选。当 6D 位姿可靠时,系统可以使用姿态匹配抓取;当姿态信息不稳定时,则应退回到中心点、顶部抓取或重感知等更保守策略。到这一步,视觉输出才真正被翻译成真实机器人可以尝试执行的抓取目标,也才进入运动规划和执行闭环的责任范围。

6 感知失败分析与鲁棒性优化

在实验室理想环境下,6D 位姿估计算法往往能在标准数据集上达到很高的精度指标,但部署到真实物理场景后,遮挡堆叠、材质反光、标定误差、环境光照扰动等因素都会导致感知失效,直接拉低实际抓取成功率。感知失败并非单一环节的问题,而是贯穿从图像采集、坐标变换到位姿输出的完整链路。

本章系统梳理真实场景中典型感知失败的场景与底层成因,量化不同类型误差对抓取结果的影响程度,并从视觉输入层、位姿计算层、系统机制层三个维度给出可落地的优化方案,最终形成一套标准化的真机调试流程,帮助开发者将算法从 “实验室可用” 推进到 “工业级稳定”。

6.1 典型感知失败场景与成因

感知失败按照产生的链路环节可分为三大类:视觉类失败发生在数据输入前端,源于传感器与环境的不匹配;几何类失败发生在 2D-3D 转换与坐标变换环节,源于标定误差与坐标系定义问题;位姿类失败发生在输出端,源于算法本身的歧义性与运动学约束脱节。

二十一讲 | 第6讲:机器人感知与位姿估计:从像素到抓取位姿的完整链路(下)图3

图 6-1 感知失败全链路分类图谱

6.1.1 视觉类失败:遮挡、反光、低纹理与光照剧变

视觉类失败是最常见的前端失效模式,直接导致后续所有几何计算的输入质量下降,是真实场景中抓取失败的首要诱因。

1. 遮挡与堆叠

  • 现象:目标物体被其他物体遮挡 30% 以上,或处于多层堆叠状态,仅部分表面可见;点云呈现大面积残缺,仅能观测到物体顶面或局部侧面。

  • 成因:料箱拣选、桌面杂乱堆放等场景中,物体相互遮挡,完整几何特征不可见;堆叠状态下下层物体的边缘与轮廓被上层物体覆盖。

  • 影响机制:点云不完整导致 ICP 配准缺少足够的几何约束,算法易收敛到错误的局部最优解,表现为位姿漂移、旋转角错误,甚至完全求解失败。通常遮挡比例超过 50% 时,单视角位姿估计的准确率会下降到 30% 以下。

2. 反光与透明材质

  • 现象:金属零件、玻璃容器、光亮塑料包装等物体表面出现大面积高光,深度图对应区域出现空洞、飞点(距离值远大于真实值)或随机噪声;RGB 图像对应区域过曝,丢失纹理细节。

  • 成因:主动光深度相机的红外光线被镜面反射或穿透,无法按正常路径返回传感器:结构光相机因散斑无法正常成像形成空洞,ToF 相机因多次反射导致飞行时间计算错误产生飞点。

  • 影响:目标点云残缺不全,配准算法失去有效对应点,位姿估计结果严重偏离真值;极端情况下目标点云有效点数不足 10%,位姿求解完全失效。

3. 低纹理 / 无纹理物体

  • 现象:纯色陶瓷、哑光塑料、光滑金属等物体表面缺少明显纹理特征,基于 RGB 特征的检测与位姿算法输出结果不稳定。

  • 成因:基于特征点匹配的算法无法提取足够多的稳定关键点,模板匹配也缺少区分度,几何上多个姿态的观测特征高度相似。

  • 影响:位姿估计出现旋转歧义,姿态结果随机跳动,重复定位精度大幅下降;连续多帧输出的旋转角度波动可达 ±20°,无法用于稳定抓取。

4. 光照剧变

  • 现象:强光直射、逆光、强阴影导致 RGB 图像过曝或过暗,目标与背景对比度急剧下降,目标检测器出现大面积漏检或误检。

  • 成因:环境光照超出传感器动态范围,图像特征分布与训练数据产生显著差异,深度学习模型的特征提取能力退化。

  • 影响:目标检测漏检、误检,实例分割轮廓偏移,后续所有环节连锁失效,属于前端输入级的整体失效。

二十一讲 | 第6讲:机器人感知与位姿估计:从像素到抓取位姿的完整链路(下)图4

图 6-2 四类典型视觉失败现象对比图

6.1.2 几何类失败:深度空洞、外参偏差与坐标系错误

几何类失败的本质是 “空间换算出错”—— 即使视觉检测完全正确,二维到三维的映射或坐标系转换出现偏差,最终输出的位姿也会偏离真实位置。这类误差通常具有系统性,隐蔽性强。

1. 深度缺失与点云空洞

  • 现象:目标物体的点云存在大面积空缺,尤其是边缘、大角度斜面和高反光区域;物体边缘出现拖尾、飞点等噪声。

  • 成因:物体表面法线与相机光轴夹角过大(通常超过 60°)时,深度回波信号信噪比急剧下降;黑色吸光材质、透明材质会导致深度无返回值;传感器本身的测量盲区也会产生边缘空洞。

  • 影响:点云无法完整描述物体形状,ICP 配准易陷入局部最优,位姿的平移与旋转均出现系统性偏差;空洞集中在物体一侧时,会导致位姿向点云完整的一侧偏移。

2. 手眼外参偏差

  • 现象:所有抓取结果都呈现固定方向、固定大小的系统性偏移,偏差量不随物体位置改变而改变方向,仅随距离线性放大。

  • 成因:手眼标定样本分布不均、标定板精度不足、相机安装发生松动或碰撞,导致手眼变换矩阵存在固定的平移与旋转误差。

  • 影响:这是最隐蔽的系统性误差 —— 单看位姿估计本身结果稳定、重复性好,但转换到机器人坐标系后全部偏位;若不做标定验证,很容易误判为位姿估计算法精度不足。

3. 坐标系方向定义错误

  • 现象:抓取位姿出现镜像翻转、坐标轴方向颠倒,物体姿态完全相反,或出现量级级的位置偏差。

  • 成因:不同算法库的坐标系约定不一致,例如 OpenCV 相机系(Z 轴朝前、Y 轴朝下)与 OpenGL 相机系(Z 轴朝后、Y 轴朝上)的镜像差异;变换矩阵乘法顺序错误(左乘 / 右乘混淆);空间单位不统一(毫米 / 米混用)导致 1000 倍的量级偏差。

  • 影响:位姿结果完全不可用,直接导致撞机或抓空,属于必须优先排除的基础错误,也是新手部署时最常踩的坑。

6.1.3 位姿类失败:位姿跳变、方向翻转与目标不可达

位姿类失败发生在输出环节,算法本身给出了数值结果,但结果不稳定、存在歧义或不可被执行系统直接使用。

1. 位姿跳变

  • 现象:连续采集的多帧静态图像中,估计出的位姿没有平滑变化,而是出现无规律的突变跳动,平移跳变量可达厘米级,旋转跳变可达数十度。

  • 成因:单帧点云噪声大、特征不稳定,ICP 算法每次收敛到不同的局部最优解;低纹理物体缺少足够的几何约束,解空间存在多个局部极小值。

  • 影响:机械臂末端跟随位姿剧烈抖动,无法平稳接近物体,甚至在运动过程中碰撞环境;连续抓取的一致性极差,成功率波动剧烈。

2. 方向翻转(对称歧义)

  • 现象:旋转对称物体(如圆柱体、正立方体、螺栓)的位姿出现 180° 或 90° 的随机翻转,平移分量正确但朝向完全错误,多次重复测量结果随机跳变。

  • 成因:物体本身存在旋转对称性,几何上多个姿态对应的点云观测完全等价,算法无法区分,会随机输出一个合法解。

  • 影响:夹爪开合方向与物体长轴错位,无法形成有效夹持,抓取成功率骤降;对于需要精确朝向的装配任务,方向翻转会直接导致任务失败。

3. 目标不可达

  • 现象:位姿估计本身数值正确,但生成的抓取位姿超出机械臂工作范围,或接近路径存在碰撞,运动规划器直接报错无解。

  • 成因:位姿估计模块未考虑机械臂运动学约束,抓取点选在工作空间边缘;接近方向被障碍物或工作台阻挡;夹爪姿态超出腕部关节限位。

  • 影响:感知输出的位姿无法被执行,感知与规划环节脱节,看似正确的感知结果实际没有工程价值。

本节小结

三类失败分别对应感知链路的不同阶段:视觉类失败是 “输入坏了”,发生在最前端;几何类失败是 “换算错了”,发生在坐标变换中间环节;位姿类失败是 “输出不稳 / 不可用”,发生在最终结果端。真机排查时可按 “前端输入→几何转换→输出结果” 的顺序逐级定位,能快速锁定问题根源,避免盲目调参。

6.2 感知误差对抓取成功率的影响量化

不同类型的感知误差对抓取结果的破坏程度并不相同。量化误差与成功率的对应关系,有助于设定合理的精度指标、判断误差来源,以及评估优化效果。

6.2.1 平移误差:从毫米级偏差到厘米级失效

平移误差指估计出的物体质心位置与真实位置的欧氏距离偏差,是最直观的误差形式,主要影响夹爪与物体的横向对准。

对于两指平行夹爪,平移容错量与夹爪开口宽度、物体宽度直接相关,近似满足:

其中为夹爪开口宽度,为物体夹持处的宽度。当物体宽度远小于夹爪开口时,容错空间更大,反之则对平移精度要求极高。

按照误差量级对抓取成功率的影响,可分为四个等级:

  1. 1-3mm 轻微偏差:对平行夹爪抓取几乎无影响,夹持位置略有偏移但仍能形成稳定夹持,成功率接近 100%;仅对高精度装配任务有影响。

  2. 3-5mm 中度偏差:夹持位置偏离最佳受力点,物体受力不均,抓取成功率下降至 70%-90%;表面光滑的物体易在提升过程中滑落。

  3. 5-10mm 较大偏差:夹爪仅能夹住物体边缘,或部分手指落空,抓取成功率降至 30%-50%;夹爪接近时易碰倒物体。

  4. 10mm 以上(厘米级)严重偏差:夹爪大概率完全错过物体,直接抓空,或撞击物体导致其移位,抓取成功率低于 20%,基本失效。

平移误差的主要来源是点云提取偏差、深度噪声与标定误差,它是抓取系统最基础的精度指标。

6.2.2 旋转误差:角度偏差的空间放大效应

旋转误差指估计姿态与真实姿态的角度差,其最核心的特点是误差会随操作距离被空间放大 —— 离旋转中心越远,同样的角度偏差造成的末端位置偏移越大。这一特性使得旋转误差对长臂展机器人的影响远大于桌面机械臂。

二十一讲 | 第6讲:机器人感知与位姿估计:从像素到抓取位姿的完整链路(下)图5

图 6-3 旋转误差空间放大效应示意图

旋转误差的放大效应满足几何关系:

其中:

  • 为末端位置偏移量;

  • L为末端到旋转中心的距离(臂展长度);

  • 为旋转误差角度(弧度制)。

小角度下(),,偏移量与角度近似成正比。例如在 1 米臂展处,1° 的旋转误差会带来约 17.5mm 的位置偏移;5° 的旋转误差则会带来约 87mm 的偏移,足以让夹爪完全错过物体。

按照误差量级对抓取成功率的影响,可分为四个等级:

  1. 2° 以内:平行夹爪可完全容忍,夹持面仍能有效接触物体,抓取稳定性不受明显影响。

  2. 2°-5°:夹爪与物体的接触面积减小,摩擦力下降,抓取成功率降至 60%-80%;提升物体时易倾斜滑落。

  3. 5°-15°:夹爪以侧面接触物体,无法形成有效夹持面,抓取力大幅衰减,成功率通常低于 30%。

  4. 15° 以上:夹爪端面直接撞向物体侧面,无法形成夹持动作,抓取基本失败,甚至可能损坏物体或夹爪。

正因旋转误差存在空间放大效应,位姿估计的旋转精度往往比平移精度更重要,也是真机调试的重点优化对象。

6.2.3 深度误差:接近方向的致命影响

深度误差是沿夹爪接近方向的平移误差,它比平面内的平移误差更致命 —— 夹爪在接近方向上几乎没有容错空间,偏差直接决定 “抓不到” 还是 “撞上去”。

深度误差的特殊性在于:夹爪沿接近方向运动时,在接触物体前通常没有力觉反馈,属于开环运动,深度偏差会直接导致夹爪停止位置错误。对于吸盘式末端,深度误差的容忍度更低,通常要求 ±2mm 以内,否则无法形成有效密封负压。

按照误差量级对抓取成功率的影响,可分为四个等级:

  1. 1-2mm 轻微偏差:无明显影响,夹爪闭合后仍能稳定夹持。

  2. 3-5mm 中度偏差:夹持深度不足,物体仅被夹住前端一小部分,搬运过程中易脱落;或夹爪深入过多,顶推物体导致移位。

  3. 5-10mm 较大偏差:要么夹爪没够到物体、完全抓空,要么夹爪撞击物体表面,将物体推走。

  4. 10mm 以上 严重偏差:几乎 100% 出现抓空或撞物,抓取完全失败,甚至存在撞坏传感器或工作台的风险。

二十一讲 | 第6讲:机器人感知与位姿估计:从像素到抓取位姿的完整链路(下)图6

图 6-4 三类感知误差与抓取成功率关系曲线

本节小结

三类误差对抓取的影响各有特点:平移误差影响横向对准,误差与成功率近似线性下降;旋转误差存在空间放大效应,长臂展场景下危害远大于平移误差;深度误差沿接近方向作用,容错空间最小,最为致命。其中标定误差带来的是系统性偏差,决定了整个系统的精度上限;单帧位姿的随机误差决定了单次抓取的波动范围。

6.3 三类优化方向

针对上述失败场景与误差来源,可从视觉输入层、位姿计算层、系统机制层三个维度分层优化,实现从 “单次准确” 到 “长期稳定” 的鲁棒性提升。三者并非替代关系,而是层层递进、互为补充。

二十一讲 | 第6讲:机器人感知与位姿估计:从像素到抓取位姿的完整链路(下)图7

图 6-5 三层鲁棒性优化体系架构图

6.3.1 视觉层面:光照、反光、透明物体的处理

视觉层面的优化目标是提升输入数据质量,从源头减少噪声与缺失,是所有优化的基础。前端输入质量提升带来的收益,远大于后端算法的调优。

1. 光照环境标准化

  • 采用漫射环形补光方案,光源与相机光轴呈 30°-45° 斜射,避免点光源垂直正射,减少物体表面高光与硬阴影;

  • 针对高反光金属零件,搭配同轴光源与偏振镜头,通过偏振片过滤镜面反射光,保留漫反射光,大幅提升深度成像质量;

  • 封闭工作空间,隔绝环境光干扰,保证光照条件长期稳定,避免检测分割精度随昼夜、天气波动。

2. 多模态数据互补

  • 融合 RGB、深度、红外三个通道的信息,单一模态失效时其他模态兜底;例如反光物体 RGB 过曝,但红外灰度通道仍能提供有效轮廓,可用于辅助目标定位;

  • 针对透明玻璃、塑料等普通深度相机无法测量的物体,补充线激光模组或红外结构光传感器,替代普通 RGB-D 相机,获取稳定的深度数据;

  • 多通道数据做空间对齐与时间同步,保证不同模态的像素级对应。

3. 图像与深度后处理

  • 对实例分割掩膜做形态学开运算(先腐蚀后膨胀)与边缘平滑处理,减少边缘锯齿,降低点云边缘噪声,避免背景像素混入目标点云;

  • 对深度图做空洞补全:小范围空洞采用双边滤波保留边缘的同时填充,大面积空洞可使用轻量级深度补全网络修复,提升点云完整性;

  • 增加边缘深度滤波,剔除物体边缘的飞点与拖尾噪声,通过统计滤波去除距离均值过远的离群点。

6.3.2 位姿层面:多帧融合与时序平滑

位姿层面的优化目标是抑制单帧波动、提升绝对精度,让输出的位姿既准又稳,是提升抓取一致性的核心手段。

二十一讲 | 第6讲:机器人感知与位姿估计:从像素到抓取位姿的完整链路(下)图8

图 6-6 两阶段粗到精位姿优化流程图

1. 时序滤波平滑

  • 引入卡尔曼滤波或滑动窗口平均,对连续多帧的位姿结果做时序滤波:平移分量采用线性卡尔曼滤波,旋转分量采用四元数球面线性插值(SLERP),抑制单帧跳变,输出平稳的位姿序列;

  • 设置位姿变化阈值,单帧平移变化超过 10mm、旋转变化超过 5° 时判定为异常帧,丢弃该帧并沿用历史平滑结果,避免机械臂跟随异常位姿抖动;

  • 对于静态场景,可采用多帧点云累加融合的方式,提升点云密度与完整性,再进行单次位姿求解。

2. 粗到精的两阶段位姿精修

  • 第一阶段粗估计:用深度学习网络输出粗位姿,提供较好的初始值,兼顾泛化性与速度;要求初始平移误差小于物体直径的 20%,旋转误差小于 30°,保证后续 ICP 不陷入局部最优。

  • 第二阶段精配准:用点到平面 ICP 做几何精配准,在粗位姿基础上迭代优化,提升位姿绝对精度;点到平面 ICP 的收敛速度比传统点到点 ICP 快 3-5 倍,且对噪声更鲁棒。

  • 这是当前工业界的主流方案,兼顾了深度学习的泛化性与几何方法的高精度,性价比最高。

3. 多视角融合

  • 针对遮挡严重的场景,控制机械臂带动腕部相机移动到 2-3 个不同角度观测物体,或部署多台固定相机从不同视角采集;

  • 融合多视角的位姿估计结果,采用加权平均策略,权重由各视角的点云有效率、配准残差共同决定,配准残差越小、点云越完整的视角权重越高;

  • 多视角融合可大幅降低遮挡带来的误差,使严重遮挡场景下的位姿准确率提升 40% 以上。

6.3.3 系统层面:失败检测与重感知机制

系统层面的优化目标是建立容错兜底机制,即使感知出错,也能避免无效抓取,通过重试与闭环迭代提升整体成功率。这是成本最低、见效最快的优化手段。

1. 前置失败检测

抓取执行前设置三重校验门槛,任一不达标则判定为感知失败,不执行抓取,避免无效动作与碰撞风险:

  • 点云有效率校验:目标点云的有效点数占完整模型点数的比例低于阈值(通常 < 40%),判定为点云质量不足;

  • 位姿置信度校验:ICP 配准的均方根误差(RMSE)大于 2mm,或重投影误差大于 3 像素,判定为位姿不可信;

  • 可达性校验:通过运动学逆解验证抓取位姿与预抓取位姿是否存在有效解,且接近路径无碰撞,判定为不可执行。

2. 重感知重试机制

  • 单次感知失败后,系统自动调整策略重新采集,采用分级升级策略:第一次失败仅重新采集单帧计算;第二次失败调整相机曝光、增益与滤波参数;第三次失败控制机械臂移动到侧方视角进行多视角重试;

  • 通常设置 2-3 次重试机会,可在不增加硬件成本的前提下,将整体抓取成功率提升 10%-20%;

  • 设置最大重试次数上限,避免无限循环导致系统卡死。

3. 失败样本闭环回流

  • 自动记录所有失败场景的原始数据(RGB、深度图、位姿结果、失败类型、机器人状态),形成结构化失败样本库;

  • 定期将样本标注后用于模型微调或参数优化,形成 “部署 - 失败 - 优化” 的闭环迭代机制;典型情况下每月迭代一次,可使场景内成功率持续提升 5%-10%;

  • 这是系统长期稳定性提升的核心机制,也是工业部署与实验室演示的核心区别。

本节小结

三个层面的优化各有侧重:视觉层面是 “治本”,提升输入质量,从源头减少错误;位姿层面是 “求精”,提升输出精度与平滑度,让结果更可靠;系统层面是 “兜底”,建立容错与重试机制,保证极端情况下仍能正常工作。三者结合,才能实现从实验室精度到真机鲁棒性的跨越。

6.4 真机部署中的感知调试流程

真机调试切忌一上来就跑全链路抓取,否则出现失败时无法定位是哪个环节出了问题。正确的调试路径遵循先基础后上层、先单步后全链路的原则,逐级验证、逐级排查,可大幅提升调试效率。

二十一讲 | 第6讲:机器人感知与位姿估计:从像素到抓取位姿的完整链路(下)图9

图 6-7 真机感知调试逐级验证流程图

6.4.1 基础校验:标定与坐标系正确性验证

标定与坐标系是所有感知的基础,基础错了,上层算法再准也没用。调试第一步必须先排除系统性误差,这一步跳过后患无穷。

1. 校验内容

  • 相机内参:确认相机内参标定的重投影误差小于 0.5 像素,畸变校正正确,深度与 RGB 图像的像素对齐误差小于 1 像素;

  • 手眼外参:确认手眼标定矩阵的平移与旋转精度,排除固定方向的系统性偏移;

  • TCP 工具标定:确认夹爪工具中心点标定准确,无偏心偏差,TCP 误差应小于 0.5mm;

  • 坐标系约定:确认像素坐标系、相机坐标系、机器人基座坐标系的轴方向与单位统一,排除镜像、翻转与量级错误。

2. 验证方法

固定高精度棋盘格标定板,控制机械臂移动到 5-8 个覆盖工作空间的不同位姿,分别对比 “视觉计算的标定板位姿” 与 “机器人正运动学计算的位姿”。

  • 合格标准:全工作空间内平移误差 RMSE≤2mm,旋转误差 RMSE≤1°。

3. 常见问题排查

  • 固定方向的系统性偏移:优先检查手眼标定与 TCP 标定;

  • 镜像 / 翻转错误:优先检查坐标系方向约定与变换矩阵乘法顺序;

  • 误差随深度线性变化:优先检查相机内参标定精度;

  • 误差随位置变化大:优先检查标定样本是否覆盖了完整工作空间。

6.4.2 单步验证:检测分割效果与静态位姿精度测试

基础校验通过后,逐个验证每个感知模块的输出质量,确保单模块性能达标,再进行全链路联调。

1. 检测分割验证

  • 固定目标物体,连续采集 20 帧 RGB 图像,统计目标检测的召回率与准确率,工业场景要求召回率≥99.5%,无漏检、无误检;

  • 对比实例分割掩膜与物体真实轮廓,要求边缘平均误差小于 2 像素,无大面积空洞或溢出;

  • 改变光照角度、背景复杂度、遮挡程度,验证检测分割的鲁棒性,找出最易失效的边界场景。

2. 静态位姿精度验证

  • 使用标准立方体、标定球等已知尺寸的高精度物体(尺寸精度优于 ±0.01mm)作为真值基准;

  • 连续采集 30 帧数据,对比感知输出的位姿与真值,分别统计平移误差与旋转误差的均值、标准差、最大值;

  • 合格参考标准:桌面抓取场景平移误差 RMSE≤3mm,旋转误差 RMSE≤2°;精密装配场景需相应提高要求。

3. 点云质量验证

  • 可视化目标点云,观察完整性、边缘平滑度与噪声水平;

  • 调整滤波参数(体素降采样尺寸、统计滤波阈值),在保留几何细节与去除噪声之间找到平衡点;

  • 验证不同材质、不同角度下的点云有效率,评估点云质量的边界。

6.4.3 全链路验证:动态抓取评测与迭代优化

单模块全部达标后,再打通完整抓取链路,进行成功率评测与问题迭代。

1. 固定场景基准测试

  • 同一物体、同一摆放位置与姿态,重复执行 10-20 次完整抓取,统计基准成功率;

  • 对每一次失败进行归因分类:检测失败、分割失败、位姿失败、标定误差、运动规划失败、执行失败;

  • 绘制失败原因帕累托图,找到占比最高的失败原因,针对性优先优化,遵循 80/20 法则。

2. 泛化场景压力测试

  • 改变物体的摆放角度、位置、堆叠状态,调整光照条件,测试不同工况下的抓取成功率;

  • 评估系统的鲁棒性边界,找出最容易失效的场景,作为后续优化重点;

  • 记录每个工况的成功率,形成系统的性能指标手册。

3. 闭环迭代优化

  • 针对占比最高的失败类型,对应优化对应模块:反光失败多就优化补光方案,位姿跳变就加时序滤波,标定不准就重新标定;

  • 每轮优化后重新测试成功率,验证优化效果,避免无效调参;

  • 持续积累失败样本,定期迭代模型与参数,逐步逼近目标成功率。

本节小结

真机感知调试的核心逻辑是 “逐级验证、逐级排查”:先搞定标定与坐标系这个基础,排除系统性误差;再逐个验证检测、分割、位姿等单模块性能;最后做全链路的成功率评测与迭代优化。遵循这个流程,可以避免盲目调参,高效定位并解决问题,快速将系统从 “能跑” 优化到 “稳定好用”。

7 位姿估计抓取实战实验与作业解析

前面几节分别讲了检测、分割、深度反投影、点云清洗、6D 位姿、抓取候选和手眼标定。本节把这些内容组织成一次完整实验。实验的目标不是让所有同学都在同一套硬件上完成抓取,而是让每个同学都能交付一条可复现、可检查、可归因的链路:

RGB-D 输入
  -> 目标 mask
  -> 目标点云
  -> 几何位姿或抓取候选
  -> 手眼转换后的机器人基座系目标
  -> 可视化、日志与误差分析

因此,本节的作业评价重点不是“是否刚好抓起来一次”,而是学生能否讲清楚每个中间量从哪里来、单位是什么、坐标系是什么、失败时应该检查哪一层。有 SO101 真机的同学可以继续做低速执行验证;没有硬件的同学也可以用 Open3D、合成手眼数据和可视化报告完成同等核心能力训练。

当前仓库第 6 讲已经落地了两个稳定代码入口:

目录
作用
主要入口
code/lecture06/Visual_Perception/
RGB-D、mask、点云滤波与可视化
pipeline_from_syllabus.py
code/lecture06/Hand-eye calibration/
Eye-in-Hand / Eye-to-Hand 手眼标定教学流水线
pipeline_hand_eye_demo.py

YOLO 检测、真实 SAM2 后端、ManiSkill 抓取执行在本讲中作为扩展接口处理。也就是说,文档会说明它们应该接在哪个位置、输入输出是什么、报告中应如何解释,但不会把尚未在仓库中提供的外部系统写成基础必做命令。这样可以保证基础实验可复现,同时给进阶同学保留扩展空间。

7.1 有硬件版与无硬件仿真版实验流程

建议把本讲实验分成四个层级。课堂最低要求是 A;想训练交互式感知的同学可以做 B;有 SO101 或等价机械臂的同学可以做 C;希望衔接后续仿真和强化学习内容的同学可以做 D。

层级
实验版本
是否需要硬件
核心目标
主要证据
A
基础离线版
否
跑通 RGB-D + mask 到 clean point cloud,再跑通手眼标定示例
终端日志、.pcd、阶段截图、summary JSON
B
交互分割版
否
用交互式 prompt 或 SAM 接口生成 mask,再接入同一条点云流水线
RGB、prompt、mask overlay、点云输出
C
SO101 真机版
是
用真实相机和机器人位姿完成手眼转换,并做低速抓取验证
标定数据、基座系目标、规划截图、执行记录
D
仿真扩展版
否
把抓取候选导入 ManiSkill 或其他仿真环境做可达性 / 碰撞验证
仿真场景、候选位姿、成功 / 失败判据

这四个版本共享同一条主线:前端感知只负责产生目标区域,点云模块负责把目标区域变成三维几何,位姿或抓取模块负责定义 TCP 应到达的位置和方向,手眼标定负责把相机系结果转换到机器人可执行的坐标系。

7.1.1 有硬件版(SO101):真机全流程操作步骤

有硬件版不要一开始就追求全自动抓取成功率。更稳妥的做法是先证明数据可信、坐标可信、目标可信,再让机械臂低速执行。推荐按下面顺序完成。

第一步:采集前检查。 固定相机安装方式,明确是 Eye-in-Hand 还是 Eye-to-Hand;确认 RGB 与深度图已经对齐;确认相机内参中的 fx、fy、cx、cy 与图像分辨率匹配;确认深度单位。如果深度图以毫米保存,depth_scale 通常取 1000.0;如果相机 SDK 已经输出米,则不能再按毫米缩放。

第二步:准备目标前景。 初期可以用人工 mask 或数据集 mask 跑通流程;真机扩展时,可以由 YOLO 给出 bbox,再由 SAM / SAM2 或交互式分割工具输出 mask。无论前端模型如何变化,传给点云流水线的文件都应整理成同一套约定:

rgb.png
depth.png
mask.png
intrinsics.json

这个约定很重要。它把“用什么模型分割”与“后端如何做三维几何”解耦,使后续代码不必关心 mask 是人工画的、数据集给的,还是模型预测的。

第三步:运行点云流水线。 在 code/lecture06/Visual_Perception/ 目录下运行:

python pipeline_from_syllabus.py --demo-dir data/rgbd_object_demo --no-vis

脚本会一次性完成掩膜筛选、反投影、直通滤波、统计滤波、体素降采样和点云导出。真机实验中,先检查 syllabus_masked_depth.png 是否只保留目标,再检查 syllabus_target_clean.pcd 的空间范围是否符合桌面物体的真实尺寸。若一个杯子的点云宽度显示成几米,通常是深度尺度或相机内参错了;若点云只剩零散碎片,通常是 mask 或滤波参数过激。

第四步:完成手眼标定。 若相机固定在末端,运行 Eye-in-Hand 链路;若相机固定在工作空间外,运行 Eye-to-Hand 链路:

cd "code/lecture06/Hand-eye calibration"
python pipeline_hand_eye_demo.py --topology eye_in_hand
python pipeline_hand_eye_demo.py --topology eye_to_hand

真实数据接入时,把实采 robot_poses.json 和 camera_poses.json 放入自己的数据目录,再使用:

python pipeline_hand_eye_demo.py --topology eye_in_hand --demo-dir 你的数据目录 --skip-generate

或:

python pipeline_hand_eye_demo.py --topology eye_to_hand --demo-dir 你的数据目录 --skip-generate

真实数据接入时,重点检查三件事:机器人位姿是否与相机观测一一对应,旋转矩阵或四元数的方向是否使用一致,标定板或目标的坐标系定义是否前后一致。手眼标定结果不是一个孤立矩阵,而是后续所有抓取目标转换的基础。

第五步:构造抓取候选。 基础版可以从目标点云中计算包围盒、主轴、顶部中心点或局部平面中心,构造一个保守的顶部抓取候选。进阶版可以接入 GraspNet / 6-DoF GraspNet 类方法生成多个 grasp candidates,再由 IK、碰撞检测和夹爪开口范围筛选 [11]。

第六步:低速执行前验证。 不建议第一次就把视觉输出直接交给机械臂执行。应先把候选抓取点转换到机器人基座系,在 RViz / MoveIt 或厂商示教界面中显示目标位姿,确认接近方向、单位、TCP 偏置和安全高度无误后,再低速执行:

pre-grasp -> approach -> close gripper -> lift -> retreat

以下情况应禁止直接执行:目标点云空间范围明显异常;手眼标定残差没有记录;TCP 坐标系方向无法解释;抓取候选没有 pre-grasp 安全位姿;规划路径穿过桌面、相机支架或机器人本体。

本节小结: 有硬件实验要按“相机数据可信 → 点云可信 → 手眼可信 → 候选抓取可信 → 低速执行”的顺序推进。最危险的做法是直接把视觉输出交给机械臂执行,因为一旦坐标方向、深度尺度或 TCP 偏置写错,前端结果越稳定,后端偏差反而越具有迷惑性。

7.1.2 无硬件仿真版:Open3D 与 ManiSkill 离线实验

无硬件版的目标是完成同样的数据闭环,只是不驱动真实机械臂。基础要求使用 Open3D 完成点云生成、滤波、截图和 .pcd 导出;进阶要求可以把干净目标点云和抓取候选导入 ManiSkill 或其他仿真环境进行可视化验证。

基础流程如下:

  1. 从 University of Washington RGB-D Object Dataset 下载一组 RGB-D 数据,例如 https://rgbd-dataset.cs.washington.edu/dataset/rgbd-dataset_full/coffee_mug_1.tar,按代码目录 README 的说明整理为 data/rgbd_object_demo/。作业中应记录下载源和整理命令,不应依赖某台电脑上已有的本地数据。
  2. 执行 pipeline_from_syllabus.py,得到 syllabus_target_clean.pcd、阶段截图和 syllabus_pipeline_summary.json。
  3. 在 Open3D 中查看目标点云,检查点数、XYZ 范围、体素降采样前后变化是否合理。
  4. 使用 pipeline_hand_eye_demo.py 跑通 Eye-in-Hand 或 Eye-to-Hand 合成数据,理解 T_end_camera 与 T_base_camera 的区别。
  5. 编写一段简化抓取候选生成说明:例如“顶部抓取候选取点云包围盒中心上方,接近方向沿负 Z,夹爪开口取包围盒短边加安全余量”。

离线版的报告要重点检查以下输出:

输出文件或结果
说明
应检查的问题
syllabus_masked_depth.png
mask 作用后的深度图
是否只保留目标区域,是否混入桌面或遮挡物
syllabus_target_raw.pcd
反投影后的原始目标点云
深度尺度是否正确,点云是否在相机前方
syllabus_target_passthrough.pcd
直通滤波后点云
Z 范围是否误删目标
syllabus_target_statistical.pcd
统计滤波后点云
离群点是否减少,主体结构是否保留
syllabus_target_clean.pcd
体素降采样后的最终点云
点数是否适中,几何轮廓是否仍可辨认
syllabus_pipeline_summary.json
流水线统计摘要
点数变化、XYZ 范围、参数是否可复现

进阶仿真版可以把第 5 步生成的候选转成仿真环境中的末端目标位姿。此时 ManiSkill 的角色不是替代感知算法,而是验证候选动作在一个物理环境中是否可达、是否碰撞、是否能完成 grasp / lift。作业中只要说明坐标系映射、动作接口和成功判据即可,不要求所有同学都完成完整仿真控制器。

本节小结: 无硬件版不是“弱化版”,而是把真机风险替换成可观察的离线证据。只要能保存输入数据、点云中间结果、手眼标定报告、抓取候选定义和失败分析,就已经覆盖了位姿驱动抓取最核心的工程链路。

7.2 核心代码逐层解析:从检测分割到抓取生成

参考第 10 讲 3.3 代码解析:LeRobot 源码逐层拆解 的写法,本节不只给命令,而是沿数据流拆解代码。入口脚本负责串流程,数据加载层负责统一格式,算法函数负责单步处理,输出层负责保存可复现证据。读代码时要始终追问三个问题:这一层输入是什么,输出是什么,失败时看哪个中间文件。

7.2.1 检测分割模块:YOLO 检测与 SAM 分割的调用逻辑

当前仓库没有内置 YOLO 权重,也没有绑定具体 SAM2 predictor;它提供的是可替换的分割接口。真实系统中,YOLO 的作用是从 RGB 图中找出目标候选,SAM / SAM2 的作用是把 bbox、点击点或文本提示转成像素级 mask。接口关系可以抽象为:

# 伪代码:真实 YOLO 后端输出 bbox
bbox_xyxy = detector.detect(rgb, text_or_class="coffee_mug")

# SAM / SAM2 或当前 fallback 接口把 bbox 转成 mask
segmentation = segmenter.segment(rgb, box_xyxy=bbox_xyxy)
mask = segmentation.mask

对应到仓库代码,交互式入口是 interactive_depth_pipeline.py。它做了三层封装:

  1. create_depth_source():统一 file、usb、network 三种输入源,使后续代码只面对 RGB-D 帧。
  2. InteractiveMaskSelector:用点击点或框选区域生成 prompt,降低课堂实验对检测模型权重的依赖。
  3. Sam2Segmenter.segment():把 prompt 转成二值 mask。当前实现包含 fallback 逻辑,点提示生成圆形 mask,框提示生成矩形 mask;安装真实 SAM2 后,可以在同一类中补齐 predictor 调用。

这一层的关键不是模型名字,而是输出契约:后续点云模块只需要一个与深度图同尺寸的二值 mask。因此,只要 YOLO、Grounding DINO、SAM、人工点击或数据集标注最终能产出同样格式的 mask,就可以接入同一条点云流水线。

调试这一层时,不要只看模型置信度。更可靠的检查是:mask 尺寸是否与深度图一致,前景像素比例是否合理,mask overlay 是否漏掉目标关键部位,是否把桌面、遮挡物或邻近物体一起选进来。前端 mask 的错误会直接变成点云污染,后端滤波通常无法完全补救。

7.2.2 点云处理模块:滤波预处理与目标点云提取

点云主入口是 pipeline_from_syllabus.py。它对应课堂 5 步法:

  1. load_depth() / load_mask() / load_intrinsics():加载深度图、mask 和相机内参,并检查尺寸、字段和深度尺度。
  2. step1_mask_filtering():执行 depth × mask,把非目标像素置零,保存 syllabus_masked_depth.png。
  3. step2_backprojection():用 Open3D create_from_depth_image() 根据内参反投影为相机坐标系下的目标点云。
  4. step3_passthrough():用 numpy 布尔切片按 Z 范围做直通滤波,去掉工作空间外点。
  5. step4_denoise_and_downsample():先做统计离群点滤波,再做体素降采样。
  6. step5_export():导出 syllabus_target_clean.pcd,并记录点数和 XYZ 范围。

可以把这个脚本理解为第 6 讲的“最小可复现几何核心”。它的各层输入输出可以整理如下:

阶段
输入
输出
主要检查
加载数据
RGB、Depth、mask、intrinsics
numpy 数组与相机参数
尺寸一致、深度单位正确
掩膜筛选
depth
、mask
masked depth
前景是否只覆盖目标
反投影
masked depth、内参
camera-frame point cloud
点云是否在相机前方,尺度是否合理
直通滤波
raw point cloud
Z 裁剪后的点云
是否去掉工作空间外点
统计滤波
裁剪后点云
去飞点点云
是否保留主体结构
体素降采样
去飞点点云
clean point cloud
点数是否降低,轮廓是否仍可辨认
导出记录
clean point cloud
.pcd
、截图、summary JSON
是否能支撑报告复现

如果某次结果不对,排查顺序应是:先看 syllabus_masked_depth.png 是否只保留目标,再看原始点云尺度是否合理,再看直通滤波有没有误删目标,最后检查统计滤波和体素降采样是否过强。不要一开始就调最后的抓取候选参数,因为前面任何一步出错,后面的候选都会建立在错误几何上。

7.2.3 位姿生成模块:6D 位姿解算与抓取候选生成

本仓库当前没有强行绑定某个 6D 位姿网络,因为不同方法输入条件差异很大:ICP 需要 CAD 和初值,SAM-6D 需要 RGB-D、内参和 CAD,FoundationPose 需要 CAD 或少量 RGB-D 参考图像,直接抓取检测则可能跳过 object pose。课程基础作业可以使用一个几何近似版本理解数据流:

pcd = o3d.io.read_point_cloud("data/rgbd_object_demo/output/syllabus_target_clean.pcd")
obb = pcd.get_oriented_bounding_box()
center = obb.center
R_obj = obb.R

# 简化 object pose:用 OBB 中心和主轴构造候选物体坐标系
T_cam_object = np.eye(4)
T_cam_object[:3, :3] = R_obj
T_cam_object[:3, 3] = center

这个 OBB 结果不能等价于严肃的 6D object pose benchmark。它没有 CAD 语义约束,主轴方向可能存在正负号翻转,对圆柱、盒体、对称物体也可能给出多个等价姿态。但它足以说明“点云几何如何变成一个局部坐标系”。随后可以定义保守顶部抓取候选:

T_object_grasp = np.eye(4)
T_object_grasp[:3, 3] = [0.0, 0.0, z_offset]
T_cam_grasp = T_cam_object @ T_object_grasp

抓取候选建议不要只保存一个 4×4 矩阵,而应至少包含以下字段:

{
  "grasp_pose": "4x4 homogeneous matrix",
"frame_id": "camera or base",
"approach": "unit vector",
"width": "gripper opening in meters",
"pre_grasp_distance": "offset before closing",
"score": "heuristic or model confidence",
"checks": ["workspace", "ik", "collision", "width_limit"]
}

如果是 Eye-to-Hand,相机固定在外部,抓取目标转换为:

如果是 Eye-in-Hand,相机固定在末端,转换链路通常写成:

其中  是感知模块输出的相机系物体位姿, 是在物体坐标系中定义的抓取模板, 或  来自手眼标定, 才是提交给运动规划器的抓取目标。由此可见,6D 位姿不是链路终点,而是连接视觉几何与抓取动作的中间状态。

本节小结: 代码解析要沿数据流读,而不是按文件名背功能。检测分割层输出 mask,点云层输出 clean point cloud,位姿层输出 object frame 或 grasp candidates,手眼层负责把相机系结果变到机器人基座系。每一层都必须留下可检查的中间文件,否则全链路失败时很难定位责任环节。

7.3 可视化输出规范:多维度结果的 Open3D 展示

位姿估计和抓取实验不能只交终端日志。机器人系统的错误常常来自坐标方向、尺度和遮挡,这些问题必须靠图像、点云和坐标轴可视化发现。

7.3.1 前端感知结果可视化:边界框与实例掩膜

前端结果至少应包含三张图:原始 RGB、bbox 或交互提示位置、mask overlay。mask overlay 应使用半透明颜色叠加在 RGB 上,让读者能看出是否混入桌面、邻物或背景。若使用 YOLO / Grounding DINO,还应保存类别、置信度、bbox 坐标和阈值;若使用人工 mask 或数据集 mask,也要说明来源。

7.3.2 几何结果可视化:点云与物体 6D 位姿

几何结果至少应包含 raw point cloud、passthrough point cloud、clean point cloud 三个阶段。Open3D 可视化时建议统一坐标轴颜色:X 红、Y 绿、Z 蓝;若绘制物体坐标系或 OBB,应在图注中说明它是 CAD / ICP / OBB / 学习模型中的哪一种来源。仅凭一张最终点云截图不足以说明流程正确,必须同时报告点数变化、XYZ 范围和滤波参数。

7.3.3 抓取结果可视化:夹爪模型与接近路径

抓取结果可视化应至少画出三个元素:grasp_pose 的 TCP 坐标系、pre-grasp 到 grasp 的接近线段、夹爪开口方向。若没有真实夹爪网格,可以用两条平行线段表示手指,用一条箭头表示接近方向。图中应标注该抓取候选是否已经过 IK、碰撞和夹爪行程检查;如果只是几何候选,应明确写为“未执行候选”,避免读者误以为已经能直接发给机器人。

建议报告中的可视化材料按下面方式组织:

可视化
证明什么
常见问题
RGB + mask overlay
前端目标是否选对
mask 漏分、过分割、选中桌面
masked depth
深度是否只保留目标
深度空洞、单位错误、边缘噪声
点云阶段对比
滤波是否合理
点云过稀、主体被删、离群点残留
物体坐标系 / OBB
几何位姿是否可解释
轴方向翻转、对称歧义、坐标轴画反
抓取候选与接近路径
TCP 是否能接近目标
接近方向穿桌、开口不足、pre-grasp 太近
手眼坐标链路图
相机系结果如何到基座系
矩阵顺序错、左右乘混淆、单位不一致

本节小结: 可视化不是装饰,而是机器人感知实验的证据链。前端看 mask 是否选对目标,几何看点云是否干净和尺度是否合理,抓取看 TCP、接近方向和开口是否符合物理直觉。没有这些可视化,单独报告“成功 / 失败”很难形成可复现的技术结论。

7.4 作业交付标准与评分细则

7.4.1 8 项交付物清单与要求

本讲作业建议采用分层交付。所有同学都应完成基础项;有能力的同学可以继续提交进阶项或真机项。

层级
要求
基础合格
离线 RGB-D 数据、点云流水线、手眼示例、抓取候选说明、可视化报告
进阶优秀
接入交互式分割或真实 SAM / YOLO,补充多个物体姿态或多个场景的对比
真机扩展
使用 SO101 或等价机械臂完成真实标定、基座系抓取目标转换和低速执行记录

具体交付物按 8 项组织:

序号
交付物
要求
1
输入数据说明
数据来源、下载链接或采集方式;说明 RGB、Depth、mask、intrinsics 的单位、尺寸和坐标约定
2
环境与命令记录
Python 环境、依赖安装命令、运行目录、运行命令和关键参数
3
前端感知结果
RGB、bbox / prompt、mask overlay;说明 mask 来自数据集、人工标注还是模型输出
4
点云阶段输出
masked depth、各阶段 .pcd、阶段截图、点数变化表、XYZ 范围
5
位姿 / 几何候选结果
说明使用 CAD / ICP / OBB / 学习模型中的哪种方式,给出坐标系定义和局限
6
手眼标定或坐标转换报告
Eye-in-Hand / Eye-to-Hand 拓扑、输入 JSON、外参结果、残差或一致性检查
7
抓取候选说明
grasp_pose
、frame_id、width、approach、pre_grasp_distance、筛选规则
8
误差与失败分析
至少列出 3 类失败原因,并说明复现方式、定位证据和改进方向

7.4.2 评分维度与量化细则

评分不应只看最终是否“抓起来”。建议按以下维度评估:

评分维度
占比
关注点
数据与复现性
20%
输入文件齐全、来源清楚、命令可复现、单位明确
点云与几何质量
25%
mask 是否干净、点云尺度是否合理、滤波参数是否解释清楚
位姿 / 抓取候选逻辑
25%
坐标系定义、变换链路、候选参数是否自洽
可视化与报告
15%
图像、点云、坐标轴、抓取候选是否能支撑结论
失败分析
15%
是否能把失败归因到检测、分割、深度、点云、标定、规划或执行

为了避免评分只看演示效果,可以进一步使用下面的检查标准:

等级
判断标准
及格
能按文档跑通基础命令,输出 clean point cloud 和手眼标定示例,并能解释主要文件含义
良好
能解释点数变化、滤波参数、坐标变换链路,并能指出至少一种失败样例
优秀
能完成多场景对比、真实分割接口或真机 / 仿真扩展,并有清晰的误差归因
不合格
只有截图或视频,缺少输入数据、运行命令、中间文件和坐标系解释

对于无硬件同学,不扣“真机抓取”分,但必须提供更完整的中间结果和解释;对于有硬件同学,不应只交成功视频,也要提交失败样本和坐标链路检查。真正重要的是学生能否说明:输入是什么,经过哪些变换,输出为什么可信,失败时该查哪里。

本节小结: 本讲作业的核心不是堆模型,而是建立一条可复现、可检查、可归因的感知到抓取链路。交付物应覆盖输入、代码、点云、位姿、手眼、抓取候选、可视化和失败分析。评分也应围绕工程证据展开,而不是只看单次演示是否成功。

8 本讲小结

8.1 两条技术主线回顾

8.1.1 模块化感知路线:工程落地的主流范式

模块化路线把抓取问题拆成检测、分割、深度反投影、点云滤波、位姿估计、抓取候选生成、手眼转换和运动规划。它的优势是每一步都有明确输入输出,便于保存中间结果、调试误差和做安全检查。它尤其适合教学实验、工业部署、已知物体和需要严格复现的任务。

但模块化路线也有成本:链路长、接口多、标定要求高,任何一步的坐标方向或单位错误都会传导到后端。因此,模块化不是“简单路线”,而是一种把复杂系统拆成可验证环节的工程方法。

8.1.2 端到端感知路线:前沿发展的重要方向

端到端路线试图从图像、点云或机器人状态直接预测 grasp pose、grasp candidates 或动作分布。它减少了显式中间接口,适合开放场景、复杂形状和大规模数据驱动策略学习。直接 6-DoF 抓取检测、点云抓取候选网络、VLA / 模仿学习策略都属于这条思想的不同形态。

它的挑战是数据成本高、失败归因困难、安全边界不易证明。真实机器人系统常采用混合架构:前端利用大模型或学习方法提高泛化能力,后端仍保留点云几何、手眼标定、IK、碰撞检测和失败检测等硬约束。

本节小结: 模块化路线和端到端路线不是非此即彼。前者提供可解释、可调试、可验证的工程骨架;后者提供更强的泛化和动作生成能力。理解二者的边界,才能在真实系统中做出稳妥组合。

8.2 感知 - 位姿 - 抓取的完整链路梳理

8.2.1 从像素输入到抓取指令的全链路映射

本讲从 RGB-D 输入出发,依次完成了以下映射:

RGB-D + intrinsics
  -> bbox / mask
  -> target depth
  -> target point cloud
  -> object pose 或几何候选坐标系
  -> grasp candidate
  -> base-frame grasp target
  -> IK / collision / execution check

每个箭头都对应一个可能出错的工程环节:mask 会影响点云纯净度,深度尺度会影响三维尺寸,点云滤波会影响几何结构,位姿估计会影响夹爪姿态,手眼标定会影响基座系目标,运动规划会决定候选是否真的可执行。

8.2.2 机器人感知的核心目标:生成可执行操作指令

机器人感知的最终目标不是在图像上画框,也不是单独输出一个漂亮的 6D 位姿矩阵,而是为机器人生成可执行、可验证、可回退的操作目标。这个目标可以是显式抓取候选,也可以是策略动作,但必须接受坐标、碰撞、可达性、安全和任务成功标准的检验。

本节小结: 本讲的主线可以概括为“像素证据进入三维,三维几何进入位姿,位姿和任务约束进入抓取候选,抓取候选再进入机器人控制系统”。掌握这条链路后,读者就能把一次抓取失败拆解为可定位的问题,而不是笼统归因于“模型不准”。

8.3 通向下一讲:从感知结果到抓取动作执行

8.3.1 本讲的能力边界与遗留问题

本讲解决的是“目标在哪里、如何摆放、夹爪候选应如何表达”。它还没有完整展开运动规划、抓取执行状态机、接触检测、力控闭环和失败恢复策略。也就是说,本讲把视觉结果推进到了机器人可以消费的候选目标,但候选目标能否安全执行,还需要下一讲继续处理。

遗留问题包括:如何从多个抓取候选中排序,如何做 IK 和碰撞检测,如何设计 pre-grasp / grasp / lift 状态机,如何在接触失败时重试,如何把一次失败记录成可训练数据。

8.3.2 第 7 讲核心内容预告

下一讲将从“候选抓取”进入“动作执行”:重点讨论末端执行器、抓取技能、运动规划、接近路径、夹爪控制、状态机和执行反馈。第 6 讲输出的 grasp candidate 会成为第 7 讲的输入,后者负责把它变成真实机器人上的动作序列。

本节小结: 第 6 讲把视觉世界和机器人控制世界接起来,但只走到了“可执行目标”的门口。第 7 讲继续回答:目标给定以后,机械臂怎样安全接近、闭合、抬升、检测失败并恢复。两讲合起来,才构成从“看见目标”到“完成抓取”的完整操作闭环。

参考资料

[1] HE K, GKIOXARI G, DOLLAR P, et al. Mask R-CNN[EB/OL]. (2017-03-20)[2026-07-26]. arxiv.org/abs/1703.06870.

[2] BOLYA D, ZHOU C, XIAO F, et al. YOLACT: real-time instance segmentation[EB/OL]. (2019-04-04)[2026-07-26]. arxiv.org/abs/1904.02689.

[3] RAVI N, GABEUR V, HU Y T, et al. SAM 2: segment anything in images and videos[EB/OL]. (2024-08-01)[2026-07-26]. arxiv.org/abs/2408.00714.

[4] Open3D. Point cloud outlier removal[EB/OL]. [2026-07-26]. open3d.org/docs/release/tutorial/geometry/pointcloud_outlier_removal.html.

[5] Stanford Computer Graphics Laboratory. The Stanford 3D Scanning Repository: Stanford Bunny[EB/OL]. [2026-07-26]. graphics.stanford.edu/data/3Dscanrep/.

[6] MoveIt. Pick and Place[EB/OL]. [2026-07-26]. moveit.picknik.ai/main/doc/examples/pick_place/pick_place_tutorial.html.

[7] ROS. moveit_msgs/Grasp Message[EB/OL]. [2026-07-26]. docs.ros.org/lunar/api/moveit_msgs/html/msg/Grasp.html.

[8] OpenCV. Camera Calibration and 3D Reconstruction: calibrateHandEye[EB/OL]. [2026-07-26]. docs.opencv.org/master/d9/d0c/group__calib3d.html.

[9] WEN B, YANG W, KAUTZ J, et al. FoundationPose: Unified 6D Pose Estimation and Tracking of Novel Objects[EB/OL]. (2024)[2026-07-26]. nvlabs.github.io/FoundationPose/.

[10] LIN J, LIU L, LU D, et al. SAM-6D: Segment Anything Model Meets Zero-Shot 6D Object Pose Estimation[EB/OL]. (2023-11-27)[2026-07-26]. arxiv.org/abs/2311.15707.

[11] MOUSAVIAN A, EPPNER C, FOX D. 6-DOF GraspNet: Variational Grasp Generation for Object Manipulation[EB/OL]. (2019)[2026-07-26]. research.nvidia.com/labs/srl/publication/mousavian-20196-dof/.


往期回顾


-END-

点击下方卡片,关注【Xbotics具身智能实验室】公众号

你想要的这里都有~~

Ask Me Anything|提问箱

对文章有疑惑,或想聊更深?欢迎把你的问题丢给我们:技术方案、实操踩坑、课程与资料、项目合作、职业发展,都可以问。

怎么问:在评论区留言,或私信公众号

我们会做什么:每周集中整理高质量问题并公开回复,重点问题邀请作者或嘉宾深度解答;典型问题会加入知识库并持续更新。

提问小提示:尽量说明「你的目标—当前做法—期望产出」,附上必要信息(硬件/软件版本、数据规模等),能更快获得有用答案。

一起把问题变成知识,推动社区进步 🚀

关于科技区角:国内科技展会垂直内容策划服务商,提供从论坛内容全案策划、会展市场化IP打造到精准专业观众一站式邀约服务,以产业内容吸引高质量B端人群,打通展会从议题设计、演讲嘉宾邀约、宣传预热、精准邀观到供需对接全链路。
声明:内容取材于网络,仅代表作者观点,如有内容违规问题,请联系处理。
机器人
more
机器人的o1时刻来了!哈佛、伯克利、英伟达推出探索Scaling Law,五大基准平均领先37.4个点
年产10万台关节模组产线于佛山投产;上市公司10亿元投建机器人零部件基地落户苏州 | 市场观察
机器人芯片融资的钱,开始流向“关节”
特斯拉的一万台人形机器人,卡在哪?
宇树机器人侧空翻表演甩断腿
Chem Eng J: 仿指尖功能梯度互锁应变传感器用于可穿戴运动监测与智能软体机器人
脑机接口遇上机器人!强脑科技亮相2026宇树合作伙伴生态大会
机器人会自己攒Skill了!复旦提出具身自进化新框架
涌进中小学的机器人草台班子
整厂方案越做越大,中小场景怎么办?海康机器人给出了另一种答案
Copyright © 2025-成都区角科技有限公司
蜀ICP备2025143415号-1
  
川公网安备51015602001305号