想象一个清晨:你站在厨房台面前,想端起那杯冒着热气的马克杯。你的眼睛先“扫”一眼杯子——它是圆柱形的、有个把手、杯身占据着台面的一小片区域;你的大脑随即弹出一连串方案:握着杯身?捏住杯柄?从上方罩住杯口?与此同时,你的手臂肌肉已经悄悄绷紧,绕开了旁边的酱油瓶,计算着“手肘会不会撞到微波炉门”。最后,手指触壁、发力、稳稳提起——整个过程不到一秒,你甚至来不及察觉。 但正是这个“不值一提”的动作,浓缩了机器人学中最富挑战性的课题之一:抓取规划。它像一场无声的博弈,要在“物体几何”(杯子长什么样)、“机械手约束”(我的手能张多大、够得着吗)与“环境险阻”(障碍物在哪)之间,寻找到那个不碰撞、抓得稳、效率高的最优解。这篇文章将用“拿马克杯”这条主线,带你拆解抓取规划的完整流程:从任务定义到候选生成、从碰撞检测到稳定性评估,再到解析法与学习法两条技术路径,最后落地到工业场景的真实决策。

岗位关联

抓取规划让机器人从“会动”进化到“会干活”,是工业自动化、物流分拣、人形机器人等方向从业者的核心技术壁垒,掌握它将直接提升你在机器人学与自动化领域的项目落地能力。

目录
  1. 可视化演示
  2. 抓取任务定义
  3. 候选抓取生成
  4. 碰撞检测
  5. 稳定性评估
  6. 解析式方法
  7. 学习方法
  8. 工业应用
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

演示贝叶斯推断的核心过程:先验分布结合观测数据的似然函数,通过贝叶斯定理更新得到后验分布。

本节配有交互动效(进入视口后自动加载,约 3KB)。

先验分布 初始信念分布表示参数的先验知识,宽分布代表不确定性高 P(θ) ~ N(μ₀, σ₀²) 当前展示先验分布的形状特征

抓取任务定义

你伸手拿杯子前,大脑其实已经完成了一份“任务清单”:杯子是圆柱体、杯身直径约8厘米、把手在右侧;你的手最大张开10厘米,能握住杯身但捏不住杯柄;台面上的酱油瓶距离杯子15厘米,手肘经过时不能碰倒它;你最终的目标是“端起杯子喝一口”。这份清单,就是抓取规划的第一步——任务定义。

在机器人学中,任务定义把这份“清单”翻译成数学语言:目标物体用几何模型描述(形状、尺寸、位姿),机械手用运动学模型描述(关节范围、指尖开度、自由度),环境用障碍物模型描述,最后加上任务约束(如“必须端平”“抓取后要移动到位”)。所有信息汇成一个待求解的抓取配置。

抓取配置通常记为一个三元组:

回到杯子场景:你之所以“一眼就决定握杯身”,正是因为大脑在毫秒级完成了任务定义——明确了物体几何、手部约束、环境障碍和目标语义。任务定义定得好,后面的抓取规划才有方向;定义错了,再聪明的算法也会“南辕北辙”。

G=(p,R,λ)s.t.Φ(G)∈FG = (\mathbf{p}, \mathbf{R}, \lambda) \quad \text{s.t.} \quad \Phi(G) \in \mathcal{F}
这个公式是说:一个抓取方案由“接触点位置 p、夹爪姿态 R、附加参数 λ”共同构成,且必须满足约束集合 F(无碰撞、稳定、可达)。
  1. 接触点位置 p夹爪指尖与物体表面接触的世界坐标,相当于是“手捏在杯子的哪个位置”。
    p=(x,y,z)∈R3\mathbf{p} = (x, y, z) \in \mathbb{R}^3
  2. 姿态矩阵 R描述夹爪在空间中朝向的旋转矩阵,相当于“手掌朝哪个方向发力”。
    R∈SO(3),R⊤R=I\mathbf{R} \in SO(3), \quad \mathbf{R}^\top \mathbf{R} = \mathbf{I}
  3. 附加参数 λ夹爪开度、接触数量、抓取类型(侧握、顶握)等额外信息。
    λ=(wopen,mcontacts,type)\lambda = (w_{open}, m_{contacts}, type)
  4. 约束集合 F无碰撞、力闭合、运动学可达等条件,全部满足才算可行抓取。
    Φ(G)∈F  ⟺  无碰撞∧力闭合∧可达\Phi(G) \in \mathcal{F} \iff \text{无碰撞} \wedge \text{力闭合} \wedge \text{可达}

候选抓取生成

你盯着杯子时,大脑并不会只给一个抓法,而是瞬间弹出许多备选:双手捧、单手侧握、捏杯柄、从杯口上方罩住……先不管好坏,把可能的“招数”全部列出来。机器人同样如此,这一环节叫做候选抓取生成。

候选生成的目标是为后续筛选提供“足够多的备选方案”。如果方案太少,可能漏掉最优解;如果太多,后续检查消耗巨大。常见的生成途径有三种:采样法在物体表面按一定密度撒点,两两配对形成接触点对;启发式规则借助人工经验,比如“细长物体适合包络抓取”“平板物体适合吸附抓取”;数据库检索则从预计算的抓取库中挑出与当前物体相似的样本。

采样法的候选数量可以用一个简单关系估算:

你拿起杯子时,大脑其实也在“采样”——只不过它采的是“接触手感”的经验样本。机器人没有这份经验,只能用几何手段生成大量候选,再用后续的碰撞检测与稳定性评估一重重“过筛子”。

Ncand=Aobjd2⋅ηN_{cand} = \frac{A_{obj}}{d^2} \cdot \eta
它说候选数量约等于“物体表面积除以采样间距的平方再乘一个效率系数”。采样间距越小,候选越多,计算越慢。
  1. 物体表面积 A_obj目标物体可用于接触的总表面积,单位平方米。
    Aobj=∫SdAA_{obj} = \int_S dA
  2. 采样间距 d相邻采样点之间的距离,单位米,决定采样密度。
    d↓⇒Ncand↑d \downarrow \Rightarrow N_{cand} \uparrow
  3. 候选数量 N_cand生成的接触点对总数,即“备选抓法”的个数。
    Ncand∝1d2N_{cand} \propto \frac{1}{d^2}
  4. 效率系数 η反映部分采样点因位置不佳被提前剔除的折扣因子(0 < η ≤ 1)。
    η=NvalidNraw\eta = \frac{N_{valid}}{N_{raw}}

碰撞检测

你已经想好了要握杯身,但手刚伸出去就意识到:手肘会撞到旁边的酱油瓶!你被迫调整角度,从斜上方伸过去。这个“意识到会撞”的过程,在机器人学里叫做碰撞检测。

碰撞检测的核心工具是构型空间。机器人的每个关节角度构成一个向量 q = (q₁, q₂, …),所有可能的 q 组成的空间叫构型空间。构型空间中的每个点,对应物理世界里机械手的一个姿势。碰撞检测要回答的问题是:这个姿势下,机械手的连杆、指尖是否与环境中的障碍物发生几何重叠?

一个简化的碰撞模型,是把机械手的每个连杆和每个障碍物都用一个包围球近似,然后判断球与球是否相交:

你在厨房里调整手肘角度避开酱油瓶,其实就是做了一次碰撞检测。机器人更“笨”一些,它要把每个关节的每个位置都检查一遍——这就是为什么碰撞检测常常占据抓取规划一半以上的计算时间。

∥p1−p2∥>r1+r2⇔无碰撞\|\mathbf{p}_1 - \mathbf{p}_2\| > r_1 + r_2 \quad \Leftrightarrow \quad \text{无碰撞}
意思是:两个球心的距离大于半径之和时,它们互不接触,即无碰撞;否则,就发生了碰撞。
  1. 连杆代表点 p₁机械手某段连杆的重心或关键点位置。
    p1=FK(q)\mathbf{p}_1 = \text{FK}(\mathbf{q})
  2. 障碍物代表点 p₂环境中障碍物的包围球球心。
    p2=已知常量或感知值\mathbf{p}_2 = \text{已知常量或感知值}
  3. 半径之和 r₁ + r₂两包围球的接触临界距离。
    dsafe=r1+r2d_{safe} = r_1 + r_2
  4. 不等式判断距离严格大于临界距离才安全,等于即视为相切危险。
    ∥p1−p2∥−(r1+r2)>0\|\mathbf{p}_1 - \mathbf{p}_2\| - (r_1 + r_2) > 0

稳定性评估

你的手指已握住杯身,但下意识地轻轻晃了一下——嗯,握得挺稳,不会滑。这个“会不会滑”的判断,对应抓取规划中的稳定性评估:检查候选抓取能否在接触力作用下抵抗外部扰动,保持物体不脱落、不转动。

稳定性评估最经典的指标是力闭合:如果一组接触力能够平衡物体受到的所有外力和外力矩,使得物体处于静力平衡,那么这个抓取就是力闭合的。直观理解为:无论物体往哪个方向被拉、被转,都能通过调整接触力把它“hold住”。

数学上力闭合要求同时满足如下两个条件:

回想你握住杯子的那个瞬间:你并非用了多大的蛮力,而是让手指的用力方向“恰好”形成一个自锁的平衡系统——这就是力闭合在生活中的直觉版本。机器人不能靠“感觉”,只能靠数学严格验证。

∑i=1nfi=0,∑i=1n(ri×fi)=0\sum_{i=1}^{n} \mathbf{f}_i = \mathbf{0}, \qquad \sum_{i=1}^{n} (\mathbf{r}_i \times \mathbf{f}_i) = \mathbf{0}
第一式要求所有接触力的合力为零(物体不会被推走),第二式要求所有接触力对质心的合力矩为零(物体不会旋转)。
  1. 接触力 f_i第 i 个接触点处,手指施加在物体上的力矢量。
    fi∈R3\mathbf{f}_i \in \mathbb{R}^3
  2. 力平衡条件所有接触力的矢量和为零。
    ∑i=1nfi=0\sum_{i=1}^{n} \mathbf{f}_i = \mathbf{0}
  3. 位置矢量 r_i第 i 个接触点相对于物体质心的矢量。
    ri=pi−pcm\mathbf{r}_i = \mathbf{p}_i - \mathbf{p}_{cm}
  4. 力矩平衡条件所有接触力产生的力矩总和为零,物体不旋转。
    ∑i=1n(ri×fi)=0\sum_{i=1}^{n} (\mathbf{r}_i \times \mathbf{f}_i) = \mathbf{0}

解析式方法

如果说大脑生成候选靠的是直觉,那么“验证这个抓法是不是真稳”就需要严谨推理。抓取规划中的解析式方法,就像一道力学证明题:把抓取问题转化为方程组和不等式组,然后精确求解。

解析法的核心是接触建模。现实中手指与物体的接触并非“点对点”的理想模型,而是有摩擦的。当手指按压杯壁时,摩擦力允许接触力在一个以法线方向为轴的圆锥范围内变化——这就是摩擦锥。摩擦锥的半角由摩擦系数 μ 决定,μ 越大,锥越“胖”,能提供的摩擦力越大。

摩擦锥约束写成不等式如下:

解析式方法的优点是严谨:一旦求出了满足所有约束的解,可以保证抓取在理论上绝对稳定。它的代价是建模复杂——物体的形状稍微不规则,摩擦锥约束就难以精确表达,求解规模随之失控。就像你用物理公式精确计算一个滚落桌面的杯子,理论可行,实战中却很难从头算清。

ft2+fo2≤μfn,fn≥0\sqrt{f_t^2 + f_o^2} \le \mu f_n, \qquad f_n \ge 0
意思是:切平面上的合成摩擦力(两个切向分量的平方和开根)不能超过法向压力乘以摩擦系数,同时法向压力必须非负——手指只能“压”物体,不能“吸”物体。
  1. 法向压力 f_n手指垂直于接触表面的压力分量,是摩擦力的来源。
    fn≥0f_n \ge 0
  2. 切向摩擦 f_t, f_o接触平面内两个正交方向的摩擦力分量。
    ftangent=(ft,fo)∈R2\mathbf{f}_{tangent} = (f_t, f_o) \in \mathbb{R}^2
  3. 摩擦系数 μ接触材料间的固有属性,反映表面“粗糙程度”。
    α=arctan⁡(μ)(α为摩擦锥半角)\alpha = \arctan(\mu) \quad (\alpha \text{为摩擦锥半角})
  4. 约束合成切向合力不得超过法向力的 μ 倍,否则滑动。
    ∥ftangent∥≤μfn\|\mathbf{f}_{tangent}\| \le \mu f_n

学习方法

你刚学开车时,教练会教你“方向盘打多少、油门踩多深”,但开了一年后,你的手似乎“自己知道”怎么操作——这就是从规则学习走向了经验直觉。抓取规划中的学习方法,走的正是这条路:不手推公式,而是让机器人从大量数据中“悟”出抓取经验。

学习方法的主流框架是端到端抓取:给机器人看一张场景的 RGB-D 图像,它直接输出每个候选抓取位姿的质量分数。网络内部不需要显式建模摩擦锥或碰撞几何,而是学会了“什么样的情况大概率抓得稳、不会撞”。训练信号来自人工标注或仿真自动生成的大量“图像—最优抓取”数据对。

学习过程的本质是优化一个抓取质量函数的参数:

你学会端杯子靠的是无数次“端起—滑落—调整”的肌肉记忆,机器人学习抓取靠的则是成千上万次仿真或真机实验的“看 + 试”。学习法的优势是无需精确几何建模、对感知噪声鲁棒;缺点是需要大量数据,且学到的策略难以提供数学上的稳定性保证——就像老司机偶尔也会判断失误。

q^=Fθ(I),θ∗=arg⁡max⁡θEI∼D[q(Fθ(I))]\hat{q} = F_\theta(I), \qquad \theta^{*} = \arg\max_{\theta} \mathbb{E}_{I \sim \mathcal{D}} [q(F_\theta(I))]
公式说明:网络 F_θ 以图像 I 为输入、输出预测的抓取质量分 q̂;训练就是不断调整参数 θ,使预测分数与真实成功率在数据集 D 上尽可能一致。
  1. 输入图像 I相机拍摄并合成的 RGB-D 图像,包含颜色与深度信息。
    I∈RH×W×4I \in \mathbb{R}^{H \times W \times 4}
  2. 网络映射 F_θ一个参数为 θ 的深度神经网络,将图像映射为质量分数。
    Fθ:RH×W×4→[0,1]F_\theta: \mathbb{R}^{H \times W \times 4} \rightarrow [0, 1]
  3. 抓取质量 q̂网络输出的 0~1 之间的小数,代表“该抓取成功的概率”。
    q^=Fθ(I)∈[0,1]\hat{q} = F_\theta(I) \in [0,1]
  4. 最优参数 θ\*在训练集上最大化期望质量的参数,需通过梯度下降迭代求解。
    θ∗=arg⁡max⁡θE[q]\theta^{*} = \arg\max_{\theta} \mathbb{E}[q]

工业应用

你家的厨房只有你一个人,但想象一个无人仓分拣流水线:传送带以每秒一件的速度送来各种包裹,机械臂必须在两三秒内完成“看清—抓稳—放入分拣格”的整套动作。这里的抓取规划不再是“能不能抓”,而是“又快又稳地抓”,这正是工业场景的真实挑战。

工业落地的典型流程是一条流水线:视觉系统先完成目标检测与位姿估计(物体在哪、朝向如何),抓取规划模块再基于当前位姿快速生成候选并筛选,最后控制器驱动机械臂执行。整个过程的耗时必须被严格预算,否则产线就要“堵车”:

工业场景与家庭场景最大的不同在于容错率:家庭里杯子掉一次可以再捡,产线上一件包裹抓空了就是分拣差错。因此工业方案普遍采用“解析法保底 + 学习法提速”的混合策略:先用学习法从图像中生成高概率候选,再用解析法对候选做严格的碰撞与稳定性验证。这正是你拿杯子时大脑的真实运作——直觉初选,理性复核,缺一不可。

Tcycle≤Tdetect+Tplan+TmoveT_{cycle} \le T_{detect} + T_{plan} + T_{move}
这条式子说明,单个工件的总节拍时间由三部分构成:视觉检测时间、抓取规划时间、机械臂运动时间。三者必须一起控制,任何一环超时都会拖慢整体节拍。
  1. 总节拍 T_cycle单个工件从进入视野到被抓取放入的目标时间。
    Tcycle≤Tbudget(如 3 秒/件)T_{cycle} \le T_{budget} \quad (\text{如 3 秒/件})
  2. 检测时间 T_detect视觉系统完成物体识别与位姿估计的耗时。
    Tdetect=f(相机帧率, 网络推理速度)T_{detect} = f(\text{相机帧率, 网络推理速度})
  3. 规划时间 T_plan候选生成、碰撞检测、稳定性评估的总耗时。
    Tplan=Ncand×(tcollision+tstability)T_{plan} = N_{cand} \times (t_{collision} + t_{stability})
  4. 运动时间 T_move机械臂从当前位置移动到抓取位姿并返回的执行时间。
    Tmove=f(路径长度, 关节速度)T_{move} = f(\text{路径长度, 关节速度})

AI 应用场景

电商物流分拣:让机械臂从“乱筐”里挑出目标

阶段:感知 → 规划 → 执行

解决的问题:传统分拣依赖人工按件扫描,劳动密集且易出错。AI 抓取规划使机械臂能在货物杂乱堆叠的料筐中,快速识别目标包裹的位姿,规划出一条避碰且稳定的抓取路径,将分拣节拍从人工的 10 秒/件压缩到 3 秒/件。

具体案例:某电商仓库采用“3D 相机 + 抓取规划”方案:相机拍摄料筐点云,视觉模块输出每件包裹的六自由度位姿,抓取规划模块在 80 毫秒内完成候选生成与碰撞检测,并从中选出抓取质量分最高的位姿。系统对尺寸不一、姿态任意的包裹均能稳定抓取,分拣准确率达 99.2%。

精密装配:轴孔配合的“毫米级手感”

阶段:规划 → 控制

解决的问题:传统轴孔装配依赖高精度夹具定位,对零件公差要求苛刻。抓取规划结合柔顺控制,使机械臂能像人手一样“边试探边调整”,在轴与孔接触后利用力反馈修正位姿,降低对定位精度的依赖。

具体案例:汽车零部件产线上,机械臂抓取一根直径 10mm 的销轴,插入孔径 10.05mm 的壳体孔中。系统先用视觉粗定位确定孔位,再以抓取规划生成多组候选插入策略,实际插入过程中根据六维力传感器数据实时调整,最终将装配成功率从 92% 提升至 99.7%。

家庭服务机器人:让“拿水杯”走进现实

阶段:感知 → 决策 → 执行

解决的问题:家庭环境非结构化的挑战远高于工厂——水杯可能被书本遮挡、茶几上有果盘、桌面反光影响视觉。学习型抓取规划让机器人能适应这种“每时每刻都不一样”的场景。

具体案例:某服务机器人通过端到端抓取模型,在仿真中学习数万次“桌面水杯抓取”,再迁移到真实环境。面对倾斜、半遮挡、光照变化的水杯,机械臂仍能以 89% 的成功率完成抓取并递送给用户——与你三岁的侄子第一次成功端稳水杯时的惊喜,如出一辙。

Python 演示

python69 行
import numpy as np class SimGripper:    """模拟两指平行夹爪, 可生成接触点对"""    def __init__(self, width, friction):        self.width = width          # 两指间距        self.friction = friction    # 摩擦系数        self.gc_count = 0           # 抓取尝试次数统计     def contact_pair(self, normal, point):        """以接触点为中心, 沿切向生成一对夹爪指位置"""        tangent = np.array([-normal[1], normal[0]])        return (point - tangent * self.width / 2,                point + tangent * self.width / 2) class Obstacle:    """圆形障碍物, 用于碰撞检测"""    def __init__(self, center, radius):        self.center = np.array(center)        self.radius = radius     def collides_circle(self, point, radius):        return np.linalg.norm(np.array(point) - self.center) < radius + radius * 0.3 def evaluate_grasp(contact_positions, normals, friction, obstacles):    """评估一组接触的稳定性: 要求力平衡且无碰撞"""    # 近似力平衡: 两个法向力应方向相反且大小相近    f0 = np.array([1.0, 0.0])    f1 = -f0    net_force = f0 * normals[0] + f1 * normals[1]    if np.linalg.norm(net_force) > 0.5:        return False, 0.0    # 逐个接触点检查碰撞    for contact in contact_positions:        for obs in obstacles:            if obs.collides_circle(contact, 0.02):                return False, 0.0    # 质量分 = 摩擦余量, 越大代表抓得越稳    margin = friction - np.linalg.norm(net_force)    return True, max(margin, 0.0) def main():    obj_center = np.array([1.0, 1.0])    obj_radius = 0.15    obstacles = [Obstacle([1.35, 1.15], 0.08),                 Obstacle([0.65, 0.85], 0.07)]    gripper = SimGripper(width=0.10, friction=0.8)     best = None    best_score = -np.inf    # 在物体周围均匀采样 24 个方向, 生成候选抓取    for angle in np.linspace(0, 2 * np.pi, 24):        normal = np.array([np.cos(angle), np.sin(angle)])        point = obj_center + normal * obj_radius        c1, c2 = gripper.contact_pair(normal, point)        ok, score = evaluate_grasp([c1, c2], [normal, -normal],                                   gripper.friction, obstacles)        gripper.gc_count += 1        if ok and score > best_score:            best = (point, normal)            best_score = score     print("最优抓取接触点:", np.round(best[0], 3))    print("最优抓取法向:", np.round(best[1], 3))    print("质量分:", round(best_score, 3))    print("有效尝试次数:", gripper.gc_count) if __name__ == "__main__":    main()
目的:在 2D 平面上模拟“物体 + 障碍物 + 夹爪”系统,通过采样候选、碰撞检测与稳定性评估,输出最优抓取位姿——是真实抓取规划管线的抽象教学原型。
  1. class SimGripper模拟两指平行夹爪,contact_pair 根据法向生成两个指尖接触位置。
  2. normal = np.array([np.cos(angle), np.sin(angle)])从圆心向表面某方向发出法向量,作为抓取方向。
  3. evaluate_grasp([c1, c2], [normal, -normal], ...)对一对接触点做碰撞与稳定性双重校验,返回 (是否成功,质量分)。
  4. if np.linalg.norm(net_force) > 0.5力平衡近似判据:两个方向相反的法向力合力应接近零。
  5. if obs.collides_circle(contact, 0.02)检查指尖位置是否与圆形障碍物发生碰撞。
  6. margin = friction - np.linalg.norm(net_force)质量分用“摩擦余量”衡量,余量越大越稳。
  7. gripper.gc_count += 1统计所有尝试过的抓取方案数,体现“候选生成”过程的穷举特性。
  8. best = (point, normal)记录当前最优抓取,并在循环中不断更新。

常见误区

误区抓取规划的目标是找到世界上唯一一个“绝对正确”的抓取位置,找到就万事大吉。

正解实际上抓取规划更像“从一堆可行方案里挑一个足够好的”。只要满足无碰撞、力闭合、可达性,多个抓取位姿都是合法的;工程师追求的是在节拍限制内找到可行解,而非数学上的全局最优解。就像你有时握杯身、有时捏杯柄,两种方法都能喝到水。

为何常见:初学者容易把“规划”类比成“求解方程”,认为有个唯一答案;但真实抓取是约束满足问题,解往往是成片存在的。

误区只要机械手末端不与障碍物接触,就算通过了碰撞检测。

正解碰撞检测覆盖机械手全体的每根连杆、每个关节,甚至要考虑机械手自身的“自碰撞”(比如两根手指互相撞到)。此外还有运动学可达性问题:位置不碰撞,但关节角度限位导致根本到不了那个姿势,同样算“不可行”。好比你的手不会撞到柜门,但手不够长就是够不着杯子。

为何常见:直觉上只关注“末端”和“障碍物”的碰撞,忽略了机械臂是一整条连杆链的复杂几何集合。

误区抓取稳定性只取决于夹爪的夹紧力,夹得越紧越不可能掉。

正解力闭合关注的是“能否抵抗任意方向的外力扰动”,关键在于接触力方向与摩擦锥的配置,而非单纯的压力大小。如果接触点与法向安排不合理,即使死命夹紧,遇到侧向力依然会滑脱。就像你拿一根竖直的筷子,捏得再紧,一碰就歪——因为没有形成几何上的“锁死”。

为何常见:“夹紧=稳”来自日常拧瓶盖的经验,它忽略了摩擦锥和力平衡的几何本质。

误区深度学习这么强,训练好模型后就不需要摩擦锥、力闭合这些传统理论了。

正解学习法擅长“从感知到候选”的泛化,但在稳定性、安全性有硬性要求的工业场景,解析法的严格约束不可替代。实践中普遍采用“学习法生成候选、解析法验证筛选”的混合架构。就像老司机开车靠直觉,但刹车系统依然由物理规则保障。

为何常见:学术界对端到端学习的宣传让人误以为“数据能解决一切”,忽略了工业对可证明安全的刚性需求。

误区在仿真环境里测到 95% 抓取成功率的策略,直接装到真实机器人上就能用。

正解仿真模型与真实物理存在“差距”(摩擦系数偏差、连杆质量误差、视觉位姿噪声),导致“仿真很好、真机翻车”的 sim-to-real gap。可靠方案是仿真粗筛 + 真机微调的迁移流程。好比你在驾校开教练车很熟练,换一辆方向盘虚位不同的车,还得先适应几圈。

为何常见:仿真环境提供完美状态观测和精确动力学,让人误以为真实的噪声和误差不存在。

面试题

Q1. 抓取规划流程的第一步通常是?

单选题 · easy

  • A.直接控制机械臂沿预定轨迹运动
  • B.确定抓取任务与各类约束条件← 正确答案
  • C.训练深度神经网络学习抓取策略
  • D.计算机械臂逆运动学并执行插补

答案:B。抓取规划要从任务定义开始,明确物体几何、机械手约束与环境约束,就像拿杯子前先看清杯子和手。其余选项都是后续环节或依赖任务定义才可进行的工作。

Q2. 摩擦锥的半角大小主要由哪个因素决定?

单选题 · easy

  • A.目标物体的颜色与表面纹理
  • B.接触面之间的摩擦系数← 正确答案
  • C.机械臂关节的最大转速
  • D.视觉相机的标定精度

答案:B。摩擦锥半角 α = arctan(μ),只由摩擦系数 μ 决定。材料越粗糙 μ 越大,锥越“胖”,能提供的摩擦力越大。颜色、转速、标定精度都与此无关。

Q3. 以下哪个不属于候选抓取生成的常见途径?

单选题 · easy

  • A.在物体表面按密度采样接触点对
  • B.利用启发式规则预选抓取方式
  • C.从预计算的抓取数据库中检索
  • D.直接求解逆运动学得到关节角← 正确答案

答案:D。候选生成关注“在哪些位置、以什么姿势抓”,而不涉及关节角求解。逆运动学属于执行阶段,将末端抓取位姿转化为关节角,是候选确定之后的事。

Q4. 力闭合抓取条件要求接触力满足什么?

单选题 · mid

  • A.每个接触力都在摩擦锥内即可
  • B.合力为零且合力矩同时为零← 正确答案
  • C.只要求夹爪与物体接触面积最大
  • D.无需考虑摩擦力方向的分布

答案:B。力闭合要求物体在接触力作用下处于静力平衡,即合力为零(不滑走)且合力矩为零(不转动)。摩擦锥约束是前提之一,但两者缺一不可。

Q5. 碰撞检测中的“构型空间(C-space)”指的是?

单选题 · mid

  • A.机械臂末端执行器的可达工作空间
  • B.由机器人所有关节角度构成的空间← 正确答案
  • C.目标物体表面点云的几何特征空间
  • D.视觉图像经特征编码器后的隐空间

答案:B。构型空间中每个点代表一组关节角度,对应机械臂的一个姿势。碰撞检测逐点判断该姿势下是否与障碍物重叠,是将物理空间碰撞问题转化为参数空间搜索问题的关键抽象。

Q6. 基于学习的方法相比解析式方法的特点包括?

多选题 · mid

  • A.需要大量标注或仿真数据来训练← 正确答案
  • B.能直接处理非结构化的真实场景← 正确答案
  • C.数学上严格保证抓取最优解
  • D.对视觉感知误差具有一定鲁棒性← 正确答案

答案:ABD。学习方法依赖数据驱动,擅长从原始图像直接感知场景,且对噪声有一定鲁棒性(B、D 正确),但代价是需要大量数据(A 正确)。它无法像解析法那样提供严格的最优性证明,C 错。

Q7. 在工业分拣中要兼顾准确率与节拍,合理的策略是?

单选题 · mid

  • A.每件都运行全局暴力优化保证最优
  • B.预建常见品类抓取库并在线快速匹配← 正确答案
  • C.完全依赖随机尝试碰运气抓取
  • D.所有物体统一使用同一固定位姿

答案:B。工业场景强调整体节拍,预计算抓取库 + 在线快速匹配能在毫秒级获得高质量候选,再辅以轻量校验。暴力优化太慢,随机抓取不可靠,固定位姿无法适应多样化物件。

Q8. 关于抓取稳定性评估,下列说法正确的是?

多选题 · hard

  • A.摩擦锥内的接触力方向是防止滑动的前提← 正确答案
  • B.接触力需同时满足力平衡与力矩平衡← 正确答案
  • C.稳定性越高说明抓取规划时间一定越长
  • D.力闭合是判定抓取能否稳定的重要依据← 正确答案

答案:ABD。摩擦锥约束防止接触点滑动(A 对),力/力矩平衡保证物体静止(B 对),力闭合综合两者作为稳定性判定条件(D 对)。稳定性与规划耗时无必然关系,C 错。

Q9. 抓取位姿 G=(p, R, λ) 中 R 的物理含义是什么?

单选题 · hard

  • A.夹爪坐标系在世界坐标系中的朝向← 正确答案
  • B.目标物体表面的曲率半径分布
  • C.接触点处的表面法向量集合
  • D.相机到夹爪坐标系的变换矩阵

答案:A。R 是描述夹爪在空间中朝向的旋转矩阵(SO(3) 元素),决定手指发力方向。它不描述物体曲率,也不等于接触法向量,更不是相机外参。

Q10. 关于解析式方法与学习方法的结合方式,下列说法正确的是?

多选题 · extreme

  • A.学习法生成高概率候选,解析法验证稳定性← 正确答案
  • B.解析法提供约束模型,学习法处理视觉感知← 正确答案
  • C.结合方案能兼顾大规模筛选与可行性保证← 正确答案
  • D.结合后抓取规划可以完全省略碰撞检测

答案:ABC。典型的混合架构是“学习法从图像中快速生成候选 + 解析法严格验证”,两者互补(A、B 对),既能覆盖大量候选又保证物理可行(C 对)。碰撞检测是抓取规划的硬性安全底线,任何方案都不可省略,D 错。