陈师傅第一次教小张拧瓶盖时说:“别小看这个动作——左手扶住瓶身,右手拧开盖子,这就是双手机器人的全部秘密。”小张试了试,发现左手要“不动”其实很难:用力大了瓶身被捏变形,用力小了瓶子跟着盖子一起转。机器人面临的处境更尴尬:它没有肌肉记忆,所谓“扶住”和“拧开”,都必须翻译成数学上可计算、控制上可执行的语言。这篇文章就带你走进这“两只手的故事”:为什么需要双手?两只手怎么用同一个脑子?从双臂运动学、力控协调,到任务规划、同步控制与碰撞避免,最终回到拧螺丝、组装零件这些精细操作。你会发现,机器人“学会双手配合”的过程,和你学会拧瓶盖的过程惊人地相似——都需要在“hold 住”与“发对力”之间找到那个精妙的平衡。

岗位关联

理解双手协作等于打开了具身智能的核心开关:任何部署双臂机器人的场景——产线装配、实验室操作、物流搬运——都需要这套运动学、力控与规划知识,它是具身智能算法工程师与机器人控制工程师的必修课。

目录
  1. 可视化演示
  2. 双手协作概述
  3. 双臂运动学
  4. 力控协调
  5. 任务规划
  6. 碰撞避免
  7. 同步控制
  8. 精细操作实现
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示双臂运动规划与避障轨迹、力/位混合控制柔顺操作、以及协调抓取力封闭持握过程。

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

'+_captions.planning+'

双手协作概述

陈师傅第一次教小张拧瓶盖时说:“别小看这个动作,你左手扶瓶身、右手拧盖子,这就是一台双手机器人的全部秘密。”小张试了试,发现左手要“不动”其实很难——用太大力瓶身会被捏变形,太小力瓶子又跟着盖子一起转。机器人的处境更尴尬:它没有触觉和肌肉记忆,所谓“扶住”与“拧开”,都必须翻译成数学上可计算、控制上可执行的语言。

从直觉到技术,第一步是承认双手协作的本质:两只手臂不是两台独立的单臂机器人,而是同一个系统的两个末端。当它们同时接触同一件物体——比如螺丝、零件——物体就把两只手“焊”成了一个闭环,任何一只手的微小运动都会通过物体传导给另一只手。这正是双手机器人区别于“两台单臂机器人挨着放”的核心。

工程上,双手协作要解决的问题可以拆成四层:双臂运动学决定两只手分别放在哪里、以什么姿态握住物体;力控协调决定手该施加多大的力,而不是简单地压过去;任务规划决定先做哪个动作、后做哪个动作;同步控制与碰撞避免保证两只手在时间上默契、在空间上不打架。这四层环环相扣,共同支撑拧螺丝、装配零件这样的精细操作。

陈师傅总结:“左手不是闲着,它在执行一个叫'约束'的任务;右手也不是乱来,它所有的力都要在这个约束下施展。”小张忽然明白,双手机器人的难点从来不在“多一只手臂”,而在“两只手臂必须被当成一个整体来思考”。

ATB=(0TA)−1  0TB{}^{A}T_{B} = ({}^{0}T_{A})^{-1}\;{}^{0}T_{B}
这个公式是“两只手之间的默契”的数学表达:无论世界坐标系怎么变,只要相对位姿已知,左手和右手就始终“心里有数”。
  1. 读懂符号0 表示世界坐标系,A 是左臂末端坐标系,B 是右臂末端坐标系,T 表示齐次变换矩阵,描述一个坐标系在另一个坐标系下的位置和姿态。
    ATB: 左臂末端看到的右臂末端位姿{}^{A}T_{B}:\ \text{左臂末端看到的右臂末端位姿}
  2. 求逆变换把“左臂末端在世界中的位姿”反过来,变成“世界在左臂末端眼中的位姿”,相当于站在左手的角度环顾四周。
    AT0=(0TA)−1{}^{A}T_{0} = ({}^{0}T_{A})^{-1}
  3. 链式相乘先从左手的角度看世界,再看右臂在世界里的位姿,两步一乘,就得到左手眼里的右手,即相对位姿。
    ATB=AT0⋅0TB{}^{A}T_{B} = {}^{A}T_{0}\cdot{}^{0}T_{B}
  4. 闭链的意义拧瓶盖时左右手握同一个瓶子,这个相对位姿必须保持不变,物体把两臂连成闭环,任何违反约束的运动都会产生内部对抗。
    约束条件: ATB=常数\text{约束条件: } {}^{A}T_{B} = \text{常数}

双臂运动学

陈师傅让小张回答:“拧瓶盖时,左手应该放在瓶身的哪里?”答案是:最好在盖子正下方偏下一点,那里既能让上力矩,又不会挡着右手。机器人选“抓手位”比这更讲究——它要考虑每只手臂各自够得着的范围,也就是工作空间。

每台机械臂都有自己的工作空间,两臂的“共同可达区域”才是双手协作的舞台。在这个舞台里,两只手的末端位置和姿态必须同时满足各自关节角度与末端位姿的映射关系。由于共同抓住同一物体,两个末端不能各自随便动——它们在笛卡尔空间中的速度必须完全一致,这就是闭链运动学约束。

从数学上看,每只机械臂的关节速度通过雅可比矩阵映射为末端速度,刚性抓取时两个末端速度必须相等,否则物体就会被“拽裂”或“捏歪”。这个等式把两条看似独立的机械臂硬生生绑成了一体。

小张想起杂技里用一根棍子把两只手连起来的表演——棍子不弯,两只手就不得不“同呼吸共命运”。机器人抓住工件的那一刻,相当于在数学上多了一根看不见的刚性棍子。

JA(qA) q˙A=JB(qB) q˙BJ_{A}(q_{A})\,\dot{q}_{A} = J_{B}(q_{B})\,\dot{q}_{B}
通俗理解:两只手同时握着一根米尺,无论关节怎么转,米尺两端的移动速度必须一致,米尺才不会弯。
  1. 雅可比矩阵$J(q)$ 是依赖于关节位形的矩阵,把关节转速映射到末端的线速度和角速度。
    x˙=J(q) q˙\dot{x} = J(q)\,\dot{q}
  2. 左臂末端速度由左臂雅可比矩阵与左臂关节速度相乘得到,描述左臂末端此刻的运动快慢。
    JA(qA) q˙AJ_{A}(q_{A})\,\dot{q}_{A}
  3. 右臂末端速度同理,右臂末端速度用右臂的雅可比矩阵与关节速度表达。
    JB(qB) q˙BJ_{B}(q_{B})\,\dot{q}_{B}
  4. 等式约束刚性抓取同一物体时二者必须相等,这就是闭链运动学的核心方程。
    JAq˙A−JBq˙B=0J_{A}\dot{q}_{A} - J_{B}\dot{q}_{B} = 0

力控协调

“别再跟瓶盖较劲了。”陈师傅说,“你越用力,盖子越容易滑丝。”小张换成“扶着盖子轻轻一带”,反而更顺。机器人也一样,精细操作追求的不是“大力出奇迹”,而是“合适的力”。传统的纯位置控制只盯着“到没到目标位置”,而双手协作更关心“接触时用多大的力”,于是有了力控协调。

力控协调的代表方法是阻抗控制:它不像位置控制那样硬性规定“必须到哪”,而是把机械臂末端想象成一根“弹簧加阻尼”的组合体。末端允许偏离目标位置,但偏离会产生回拉力——偏离越大回拉越狠,同时阻尼消耗速度、防止震荡。这样,机械臂既保持柔顺,又不至于“没脾气”。

双手各加一个阻抗控制器,就形成了力控协调:左手把刚度调高一点,稳稳扶住工件;右手把刚度调低并配合适当的阻尼,既能把瓶盖旋进去,又不会压坏螺纹。两只手一个偏硬、一个偏软,但都遵循同一个物理定律——力与位置偏差的关系。

陈师傅看着小张若有所思的样子,补了一句:“硬手负责守住底线,软手负责见机行事——力控协调,就是给两只手分配不同的'脾气'。”

Md e¨+Bd e˙+Kd e=FextM_{d}\,\ddot{e} + B_{d}\,\dot{e} + K_{d}\,e = F_{ext}
把手臂想象成弹簧阻尼器:偏差 e 越大,“隐形弹簧”的拉力就越大;阻尼 B 像是空气阻力,防止手臂来回抖动;外力 F 则来自与工件的接触。
  1. 偏差向量期望位置与实际位置的差,是控制器的“输入信号”。
    e=xd−xe = x_{d} - x
  2. 目标惯量项$M_{d}$ 是人为设定的目标惯量,$\ddot{e}$ 是偏差的二阶导数(加速度),这一项决定系统的“惯性质量”。
    Md e¨M_{d}\,\ddot{e}
  3. 阻尼项$B_{d}$ 是阻尼系数,$\dot{e}$ 是偏差速度,它像刹车一样消耗能量,抑制震荡。
    Bd e˙B_{d}\,\dot{e}
  4. 刚度项$K_{d}$ 是刚度系数,偏差越大回拉越强,代表“弹性”。
    Kd eK_{d}\,e
  5. 外力来源右侧 $F_{ext}$ 是机械臂末端受到的接触外力,阻抗控制本质上就是调节“力与偏差”之间的动态关系。
    Fext=Mde¨+Bde˙+KdeF_{ext} = M_{d}\ddot{e} + B_{d}\dot{e} + K_{d}e

任务规划

拧瓶盖看起来只有两拍——扶稳、拧开。但小张观察后发现,真正顺畅的动作至少包含五拍:左手先就位、右手接近、试探性发力、持续旋转、最后收力。哪一步先、哪一步后,错了就会卡住。机器人把这种“先做什么、后做什么”的安排叫作任务规划。

任务规划把“拧紧螺丝”这种抽象目标,拆解成一串可执行的子任务:移动左臂到扶持位、闭合左臂夹爪、移动右臂到螺丝上方、下压并对准、旋转并监测力矩、达到阈值后停止、两臂依次撤离。每个子任务还要标注它依赖哪些前序任务——不可能还没对准就旋转,也不可能还没松开就撤离。

在数学上,任务规划就是定义任务集合和先后约束关系。时序调度算法把这些约束排出最优顺序,目标是最短时间或最小能耗;主从策略则规定:主臂负责关键的定位与施力,从臂负责保持相对位姿、配合主臂动作,避免两个“领导”打架。

陈师傅又补了一刀:“会排工序的师傅,干活又快又稳;不会排的,两只手抢一个盖子。”小张点点头——这不就是机器人界的统筹学嘛。

T={t1,t2,…,tn},ti≺tj 表示 ti 必须先于 tj\mathcal{T} = \{t_{1}, t_{2}, \dots, t_{n}\}, \quad t_{i} \prec t_{j} \ \text{表示} \ t_{i} \ \text{必须先于} \ t_{j}
就像菜谱:蒜末先爆香,再下菜,最后调味——顺序错了,菜就毁了。
  1. 任务集合$\mathcal{T}$ 表示把大目标拆出来的全部子任务的集合,这是规划的输入。
    T={t1,t2,…,tn}\mathcal{T} = \{t_{1}, t_{2}, \dots, t_{n}\}
  2. 单个子任务$t_{i}$ 是其中某个具体动作,比如“左臂移动到扶持位”,每个子任务都有明确的执行对象和完成条件。
    ti:一个可执行的原子动作t_{i}: \text{一个可执行的原子动作}
  3. 先序约束符号 $\prec$ 表示先后依赖关系,$t_{i} \prec t_{j}$ 读作“$t_{i}$ 必须在 $t_{j}$ 之前完成”。
    ti≺tj⇔先 ti 后 tjt_{i} \prec t_{j} \Leftrightarrow \text{先 } t_{i} \text{ 后 } t_{j}

碰撞避免

有一次小张练拧瓶盖,右手使猛劲,瓶盖没转,瓶子反而带着左手撞上了桌角。陈师傅说:“这就是双手协作最头疼的事——你自己的左手和右手会打架。”对机器人来说,两只手臂的工作空间高度重叠,左手去扶螺丝时,右手旋转的动作稍不留神就会拍在左臂上。

碰撞避免的第一步是“知道自己离自己有多远”:实时计算两臂各连杆之间的最小距离,再与安全阈值比较。低于阈值就触发保护——要么减速、要么停车、要么重新规划一条绕行的轨迹。这就像双人舞中两个人随时感知对方的步伐与呼吸,永远留出半臂的安全距离。

人工势场法是一种常见的实现:给另一只手臂“涂上斥力场”,离得越近斥力越大,轨迹自然而然被“推”开。这样一来,碰撞避免不是事后补救,而是融进每一步运动指令里的“本能反应”。

小张会心一笑:“原来所谓默契,就是永远不贴着对方的脸跳舞。”

Urep(q)=12 η(1d(q)−1d0)2,d(q)<d0U_{rep}(q) = \frac{1}{2}\,\eta\left(\frac{1}{d(q)} - \frac{1}{d_{0}}\right)^{2}, \quad d(q) < d_{0}
想象左手周围有一圈看不见的“气垫”:右手靠得越近,气垫越用力把它弹开;距离足够远时则完全不受影响。
  1. 最近距离$d(q)$ 是在当前关节位形 $q$ 下,两臂所有连杆之间的最小距离。
    d(q)=min⁡i,j∥pi−pj∥d(q) = \min_{i,j} \|p_{i} - p_{j}\|
  2. 安全阈值$d_{0}$ 是人为设定的安全距离,只有小于该距离时斥力才被激活。
    d(q)<d0d(q) < d_{0}
  3. 势场强度$\eta$ 是斥力增益,决定了“弹开”的猛烈程度,取值过大会让轨迹抖动。
    η>0\eta > 0
  4. 斥力策略距离越接近 $d_{0}$,势能急剧上升,等效斥力 = 势能对位置的负梯度。
    Frep=−∇Urep(q)F_{rep} = -\nabla U_{rep}(q)

同步控制

陈师傅让小张闭上眼,两只手同时摸到桌上的瓶盖。“感觉到了吗?两只手同时到达,才有'双手'的感觉,先后差半秒都别扭。”机器人也一样,双手动作不仅要各自准确,还要在时间上同步。同步控制就是量化并消除两只手之间的这种“别扭”。

同步误差是最直白的度量:两臂当前的实际相对位姿与期望相对位姿之间的差。差为零,说明左手和右手“心有灵犀”;差不为零,说明一方快了或慢了。主从同步是最常见的策略:主臂按自己的规划走,从臂以主臂的实时状态为参考,实时修正自己以保持相对位姿;更先进的耦合控制则让两臂相互观察、相互补偿,谁也不能掉队。

一个直观的现象是:如果在仿真中关闭同步修正,只靠两臂各自的位置伺服,几百步之后工件的标称长度就会在左右手之间来回“呼吸”。原因是两臂的微小误差被闭链不断放大。加上同步补偿项后,“呼吸”幅度立刻被压下去,两只手表现得像同一个人控制的一样。

陈师傅说:“同步好坏的检验标准只有一个——让旁观者觉得,这两只手就像长在同一个人的身上。”小张知道,这背后不是玄学,是一个被严格定义并持续消除的误差。

esync=(x1−x2)−xrelde_{sync} = (x_{1} - x_{2}) - x_{rel}^{d}
同步误差 = 左臂与右臂的实际相对位置 − 期望相对位置。它就像双人舞中两人拉开距离的一把“偏差尺”。
  1. 左臂位置$x_{1}$ 表示左臂末端在协作参考系中的实际位置(可扩展到姿态)。
    x1x_{1}
  2. 右臂位置$x_{2}$ 表示右臂末端的实际位置,两者相减得到当前相对位姿。
    x1−x2x_{1} - x_{2}
  3. 期望相对位姿$x_{rel}^{d}$ 是任务给定的、双手应当保持的标称相对位姿,比如拧螺丝时两臂间距的期望值。
    xreldx_{rel}^{d}
  4. 同步误差实际与期望之差即为 $e_{sync}$,控制器把它作为补偿信号反馈到两臂的力矩指令中。
    esync=(x1−x2)−xrelde_{sync} = (x_{1} - x_{2}) - x_{rel}^{d}

精细操作实现

“学了这么多,你现在能给我拧一个比瓶盖难十倍的东西——螺丝。”小张接过螺丝与零件的组合体,意识到精细操作就是把前面的所有技术串成一台完整的戏:运动学决定双手位置,力控保证不伤零件,任务规划排好顺序,碰撞避免和同步控制保证全局不出乱子。

拧螺丝是双手机器人的“高考题”:右手握着电动螺丝刀旋转,左手扶持零件。螺丝每转一圈,就沿轴线前进一个导程,这个机械关系是机器人精确控制旋转圈数与进给量的换算依据;与此同时,左手的扶持点必须跟着螺丝的进给做微小调整,防止零件歪斜。组装零件、协同搬运异形件,原理完全一致——两只手各负责一部分约束,共同把一件“容易乱动”的事做得四平八稳。

陈师傅拍拍小张的肩膀:“从拧瓶盖到拧螺丝,你学的不只是控制,而是'两只手如何共享一个脑子'。把这件事想通了,具身智能的精细操作你就入门了。”

h=p2π θh = \frac{p}{2\pi}\,\theta
螺丝转一圈($2\pi$ 弧度)沿轴线前进一个螺距 $p$,转半圈就前进半个螺距。这是“拧多少角度 = 进多少距离”的换算凭证。
  1. 进给位移$h$ 是螺丝沿轴线方向的前进距离,也是扶持手需要动态跟随的补偿量。
    hh
  2. 导程参数$p$ 是螺丝的导程(螺距),由螺纹几何决定——同一转角下,导程越大进给越快。
    pp
  3. 旋转角度$\theta$ 是螺丝相对初始位置的累计转角,单位取弧度。
    θ\theta
  4. 换算关系转角与进给成正比,比例系数为 $p / 2\pi$,手指精确控制角度即可控制深度。
    h=p2π θh = \frac{p}{2\pi}\,\theta

AI 应用场景

新能源汽车动力电池装配

阶段:任务规划与力控执行

解决的问题:传统产线上电池模组装配靠人工双手配合,耗时且一致性差;单臂机器人难以同时完成“扶持对齐”与“多螺栓拧紧”。双臂机器人将任务分解为“左臂抱紧模组、右臂依次拧紧”,通过阻抗控制感知插入力,避免损坏电芯。

具体案例:某新能源电池 PACK 产线引入双臂协作机器人,左臂以 3~5 N 的恒定扶持力固定模组,右臂按力矩阈值完成 12 颗螺栓的自动拧紧,综合良率从 97% 提升到 99.5%,节拍缩短 30%。

智慧实验室自动开盖移液

阶段:精细操作与同步控制

解决的问题:医疗检验实验室每天要处理上千支试管,人工开盖费时且存在污染风险。双臂机器人采用“一手固定管身、一手旋转开盖”的主从策略,同步误差控制在毫米级,配合视觉定位实现全流程自动化。

具体案例:第三方医学检验中心部署双臂开盖移液工作站,左臂以 2 N 柔顺力夹持试管防止挤压变形,右臂按螺旋运动方程精确控制旋转角速度完成开盖,随后双针移液,处理速度达到每小时 600 支样本。

物流中心异形包裹协同搬运

阶段:碰撞避免与同步控制

解决的问题:快递分拣中的软包、异形件难以用单臂吸盘稳定抓取,人工搬运效率低。双臂协同通过闭链约束让两只手托住包裹两侧,并实时调整间距以匹配包裹尺寸,同步控制器保证包裹始终水平不倾斜。

具体案例:某电商智能仓在供包台部署双臂搬运机器人,视觉识别包裹轮廓后,两臂同步伸出托举,搬运过程中实时检测两臂最小距离防止碰撞,将异形件破损率从 2% 降到 0.2%。

Python 演示

python65 行
import math  class Arm:    def __init__(self, name, x0):        self.name = name          # 机械臂名称        self.x = x0               # 末端位置        self.v = 0.0              # 末端速度        self.f = 0.0              # 驱动器输出力     def update(self, dt):        self.v += self.f * dt     # 力 -> 加速度 -> 速度        self.x += self.v * dt     # 速度 -> 位移  class Impedance:    """一维阻抗控制器: 弹簧 + 阻尼, 即正文中的力控协调模型"""    def __init__(self, damping, stiffness):        self.damping = damping        self.stiffness = stiffness     def force(self, target, x, v):        err = target - x        return self.stiffness * err - self.damping * v  def reference(t):    # 期望工件中心的轨迹: 左右往返的余弦运动    return 0.2 * math.cos(2 * math.pi * 0.1 * t)  def simulate(with_sync, dt=0.01, steps=400):    left = Arm("left", -0.1)      # 左臂抓取工件左端    right = Arm("right", 0.1)     # 右臂抓取工件右端    ctrl = Impedance(damping=5.0, stiffness=40.0)    length0 = right.x - left.x    # 工件的标称长度    max_len_err = 0.0     for k in range(steps):        t = k * dt        center = reference(t)        # 主臂指令: 左臂跟踪工件中心左侧半个身位        f_left = ctrl.force(center - length0 / 2.0, left.x, left.v)        # 从臂指令: 右臂跟踪工件中心右侧半个身位        f_right = ctrl.force(center + length0 / 2.0, right.x, right.v)        if with_sync:            # 同步控制: 实测长度偏离标称长度时, 两臂反向补偿            err_len = (right.x - left.x) - length0            f_left -= 80.0 * err_len            f_right += 80.0 * err_len        left.f = f_left        right.f = f_right        left.update(dt)        right.update(dt)        max_len_err = max(max_len_err, abs((right.x - left.x) - length0))     return max_len_err  if __name__ == "__main__":    err_off = simulate(with_sync=False)    err_on = simulate(with_sync=True)    print("without sync      : max length error = %.4f m" % err_off)    print("with sync control : max length error = %.4f m" % err_on)    print("improvement ratio : %.1f x" % (err_off / err_on))
目的:用一维双机械臂仿真演示“同步控制”的价值——两只手臂各自用阻抗控制器跟踪目标,只有加上同步误差补偿项,工件的长度才不会被“拉变形”。
  1. return self.stiffness * err - self.damping * v阻抗控制方程:弹簧项把偏差拉回来,阻尼项消耗速度、防震荡。
  2. left = Arm("left", -0.1)创建左臂并放在工件左端,工件初始长度为 0.2 米。
  3. f_left = ctrl.force(center - length0 / 2.0, left.x, left.v)主臂跟踪“工件中心 − 半长”这个期望位置。
  4. err_len = (right.x - left.x) - length0计算同步误差:两臂实际间距与标称长度的差。
  5. f_left -= 80.0 * err_len` / `f_right += 80.0 * err_len同步补偿:误差为正(工件被拉长)时左臂左拉、右臂右推,把变形纠正回来。
  6. left.update(dt)对加速度做数值积分更新速度与位置,模拟物理世界。
  7. err_off / err_on对比有无同步控制的误差倍数,直观展示同步控制的效果。

常见误区

误区两只手臂的控制器各写各的,只要各自跟踪自己的轨迹非常准,合在一起就一定配合得好。我在仿真里把两条轨迹分别调到 99% 精度,结果实物一跑就出问题,完全找不到原因。

正解双手抓同一工件时会形成闭链,各自独立控制会产生内力对抗——一个往前推、一个往后拉,工件被挤压甚至脱手。就像拧瓶盖时左手“稳住”也是主动控制,不是不管;两臂必须通过闭链约束把彼此绑成一个系统,任何一端的微小误差都会被另一端放大。

为何常见:单臂控制经验里“轨迹精度就是一切”,人们下意识把双手当成两个互不相关的单臂系统,忽略了闭链耦合。

误区精细操作当然要硬碰硬,把阻抗控制的刚度调到最大,位置才不会有偏差,拧螺丝才拧得准。

正解双手协作中刚度过大,接触时的微小误差会转化为巨大内力,轻则划伤工件,重则损坏机器人。阻抗控制刻意引入柔顺——降低刚度并配合阻尼,相当于手上垫了一层海绵,才能做到“手下留情”。精准来自“合适的力”,不是“最大的力”。

为何常见:生活直觉里“硬 = 稳 = 准”,但忽略了接触场景下力与位置天然存在矛盾,越硬越容易把误差变成破坏力。

误区碰撞避免就是避开桌子、墙壁这些环境障碍,两只机械臂各占一边,平时很难碰到一起,不用专门防。

正解双臂工作空间高度重叠,自碰撞恰恰是最常见的风险——左手正在扶螺丝,右手旋转动作稍大就会拍在左臂上。必须实时计算两臂所有连杆之间的最小距离,低于安全阈值立刻减速或重规划,把另一只手臂当成“会动的危险障碍”来防。

为何常见:习惯了单臂避障思维,默认把另一只手臂当静态物体看待,没意识到它也在运动且轨迹相互耦合。

误区主从控制嘛,就是主臂怎么动,从臂照着抄一遍,跟影子一样,简单得很。

正解从臂不是复制主臂位置,而是通过闭链约束计算“保持相对位姿不变”所需要的自身关节运动。左右臂长度、安装位置都不同,同样维持相对位姿,两手需要的关节轨迹完全不一样。主从只是“谁来定参考”,不是“谁模仿谁”。

为何常见:把主从直觉理解成“影子跟随”,忽略了双臂构型差异与闭链运动学方程。

误区任务规划做好了,把轨迹离线算一遍存下来,运行的时候照着放就行,机器人哪有那么多意外。

正解工件尺寸公差、抓取位置漂移、环境扰动都会让预设轨迹失效。精细操作必须在线监测力和位置误差,实时调整——同步补偿纠偏差、碰撞检测触发重规划、阻抗修正柔顺接触,缺一不可。规划只是开场,反馈才是全场。

为何常见:仿真环境太理想,没经历过实物误差的人容易高估离线规划的可靠性。

面试题

Q1. 双机械臂共同抓取同一工件时,两臂末端与工件形成的运动学结构是?

单选题 · easy

  • A.开环运动链
  • B.闭链运动链← 正确答案
  • C.并联机构链
  • D.齿轮传动链

答案:B。双手同时接触同一物体,物体把两臂末端连成回路,形成闭链运动链,这正是双手协作区别于单臂的核心。开环指末端自由不连成环;并联机构是底座固定的另一类结构;齿轮传动与运动学结构无关。就像拧瓶盖时左右手通过瓶身连成一个环。

Q2. 阻抗控制中,增大刚度参数 Kd 会带来什么直接效果?

单选题 · mid

  • A.位置偏差减小← 正确答案
  • B.阻尼振荡增强
  • C.接触力变柔和
  • D.跟踪速度加快

答案:A。Kd 是阻抗模型里的弹簧刚度,刚度越大,同等外力下位置偏差越小,所以“位置偏差减小”正确。阻尼项 B 负责抑制震荡,与刚度无关;接触力变柔和是降低刚度的效果;跟踪速度与刚度没有直接关系。就像弹簧越硬越难被拉偏。

Q3. 主从协同策略中,从臂(跟随臂)的核心任务是?

单选题 · mid

  • A.独立规划最优路径
  • B.保持相对位姿约束← 正确答案
  • C.承担全部接触力
  • D.复制主臂全部动作

答案:B。从臂的核心是协调约束——实时跟随主臂并保持两臂之间的相对位姿,使闭链不被破坏。从臂不独立规划路径,“独立规划”违背协同本质;接触力由双臂共同承担;“复制主臂全部动作”忽略了双臂构型差异。就像双人舞中的跟随者,任务是保持与领舞者的相对位置,而不是照搬对方的脚步。

Q4. 先分解任务、再安排两只手先后顺序的方法是?

单选题 · easy

  • A.力位混合控制
  • B.任务时序规划← 正确答案
  • C.阻抗参数整定
  • D.闭链快速成型

答案:B。把“拧紧螺丝”拆成“扶持、对准、旋转、撤离”等子任务并排定先后顺序,属于任务规划中的时序调度。力位混合控制与阻抗参数整定属于力控层的手段,闭链快速成型不是标准术语。就像菜谱必须先爆香再下菜,顺序错了整道菜就毁了。

Q5. 双手机器人运行中,最需要专门防范的碰撞来源是?

单选题 · mid

  • A.外部环境障碍物
  • B.双臂工作空间重叠← 正确答案
  • C.传感器采样噪声
  • D.末端工具重量过大

答案:B。双臂工作空间高度重叠,两臂互相碰撞是双手协作特有的高频风险,因此自碰撞检测是标配。环境障碍物是单臂也要处理的一般问题,传感器噪声和工具重量属于负载与感知问题,都不是“双臂特有”的碰撞来源。

Q6. 双臂同步控制中,同步误差通常定义为?

单选题 · mid

  • A.两臂实际相对位姿与期望相对位姿之差← 正确答案
  • B.单臂实际轨迹与参考轨迹之差
  • C.目标力矩与输出力矩之差
  • D.规划时间与实际时间之差

答案:A。同步误差衡量的是“两只手之间的默契”,即实际相对位姿与期望相对位姿的差。单臂轨迹偏差是跟踪精度问题,力矩偏差是力控问题,时间差是调度问题——它们衡量的对象都与“双手相对关系”无关。

Q7. 双手拧螺丝时,螺丝进给位移 h 与转角 θ 的换算由什么决定?

单选题 · hard

  • A.电机额定功率
  • B.螺丝导程参数← 正确答案
  • C.臂杆长度尺寸
  • D.视觉相机帧率

答案:B。螺旋运动的基本公式是 h = p·θ/(2π),其中 p 是导程。导程决定“转一圈前进多少”,电机功率只决定能否转动,臂杆长度影响运动学但不参与换算,视觉帧率影响感知精度也不参与换算。

Q8. 以下哪些属于双手机器人的典型应用场景?

多选题 · easy

  • A.汽车产线零件装配← 正确答案
  • B.双臂协同搬运异形件← 正确答案
  • C.扫地机器人自主充电
  • D.手机屏幕触控上报

答案:AB。汽车产线装配需要一手扶持一手拧紧,协同搬运需要两臂同步托举,都属于双手协作典型场景。扫地机器人回充是单体机器人的行为决策,手机触控上报是软件交互,都不涉及双臂运动与力控。

Q9. 保证双臂协调操作需要哪些关键技术?

多选题 · mid

  • A.双臂运动学约束← 正确答案
  • B.力控柔顺算法← 正确答案
  • C.红外遥控技术
  • D.任务时序规划← 正确答案

答案:ABD。双臂协作依赖闭链运动学约束确定相对位姿,依赖阻抗控制等力控算法实现柔顺接触,依赖任务规划排出两手先后顺序。红外遥控是外部通信手段,与双臂协调控制没有关系。

Q10. 关于双臂协作中的内力控制,下列说法正确的是?

多选题 · hard

  • A.内力不改变工件整体运动← 正确答案
  • B.内力过大会损坏工件← 正确答案
  • C.内力应与负载大小无关
  • D.内力控制需补偿同步误差← 正确答案

答案:ABD。内力是两臂互相推挤产生的一对大小相等、方向相反的内部力系,它们相互抵消、不改变物体整体运动,但过大时会把工件挤压变形或损坏,因此必须通过补偿同步误差来抑制。内力与负载大小相关,说“无关”是错误的。