目录

一、MuJoCo 简介

二、物理引擎特性

三、建模语言:MJCF

四、应用与生态

五、正运动学与逆运动学概述

六、正运动学 FK

七、逆运动学 IK

八、两者的关系与对比

九、FK 在手眼标定与 TCP 标定中的应用

1. 两个标定任务的本质

2. 标定中的坐标系链条

3. FK 模型需要提供什么

4. 标定流程中 FK 的使用步骤

5. 关键注意事项

6. MuJoCo 下的辅助工具


摘要:本文系统介绍 MuJoCo 物理引擎的核心特性、MJCF 建模语言及其在机器人学中的应用生态,并重点讲解正运动学(FK)与逆运动学(IK)的原理、求解方法及两者关系。在此基础上,进一步阐述 FK 在手眼标定(eye-to-hand)与 TCP 标定中的关键作用,包括坐标系链条、标定流程、MuJoCo 实现方式及关键注意事项,为机器人控制与标定实践提供完整参考。

一、MuJoCo 简介

MuJoCo(Multi-Joint Dynamics with Contact)是一个免费的物理引擎,专为机器人学、生物力学等需要快速精确模拟的领域设计。它通过凸优化处理接触,具备良好的逆动力学定义,支持软体与肌肉模型,广泛应用于强化学习和机器人控制研究中。

二、物理引擎特性

MuJoCo 的核心优势在于其接触模型的平衡性。与其他刚体模拟器不同,它使用凸高斯原理求解接触力,保证解的唯一性,使逆动力学在接触存在时依然定义明确。引擎实现了完整的运动方程,能自然复现牛顿摆、贾尼别科夫效应等物理现象,而非通过捷径牺牲准确性。

它采用广义坐标进行模拟,从根本上避免关节约束违反。DOF(自由度)与关节密切相关,速度相关的属性(如摩擦损失、阻尼、电枢惯量)属于 DOF,位置相关的属性(如限制、弹簧刚度)属于关节。

三、建模语言:MJCF

MuJoCo 使用 MJCF(MuJoCo XML 格式)描述模型。其设计强调简洁性,利用级联默认值避免重复,只需最少信息即可生成完整模型——例如胶囊体仅需线段和半径定义,体帧位置从几何体推断,惯性属性可自动计算。

模型的核心元素包括:

  • Body(刚体):组成运动学树,本身无几何属性,需附加几何体
  • Joint(关节):在刚体与父体间创建 DOF,类型包括 hinge、slide、ball、free
  • Geom(几何体):3D 形状,用于碰撞、渲染和惯性推断,仅支持凸体,非凸物体需用凸体组合表示
  • Site(标记点):轻量几何体,不参与碰撞,用于传感器、肌腱路径等空间属性定义

四、应用与生态

MuJoCo 最初由 Emo Todorov 开发,2021 年被 DeepMind 收购并开源。它被 DeepMind 机器人团队作为首选模拟器,通过 dm_control Python 栈使用。在强化学习中,MuJoCo 常用于训练机器人控制策略,再将策略迁移到真实硬件。

模型可保存为二进制 MJB 或可读的 MJCF/文本格式。内置编译器自动完成大量工作——推断惯性、构建 DOF、设置碰撞规则——使 MJCF 保持简洁。

五、正运动学与逆运动学概述

在 MuJoCo 和机器人学中,正运动学(Forward Kinematics, FK)和逆运动学(Inverse Kinematics, IK)是描述关节空间与任务空间之间映射关系的两个核心概念。简单说:FK 是“已知关节角度,求末端位姿”;IK 是“已知末端位姿,求关节角度”。

六、正运动学 FK

定义:给定机器人所有关节的位置(角度或位移),计算末端执行器(或任意指定点)在笛卡尔空间中的位置和姿态。

本质:从关节空间到任务空间的映射,是一个直接、唯一的计算过程。

数学形式:对于串联机器人,末端位姿可表示为各关节变换矩阵的连乘:

Tend = T1(q1) · T2(q2) · ... · Tn(qn)

其中 qi 是第 i 个关节变量,Ti 是相邻连杆间的齐次变换矩阵。

特点:

  • 解唯一且确定,给定关节角必然得到唯一的末端位姿
  • 计算简单高效,适合实时应用
  • 是 IK 的基础——几乎所有 IK 数值方法都需要反复调用 FK

在 MuJoCo 中:引擎内部维护完整的运动学树,调用 mj_forward 后,所有 body、site、geom 的世界坐标位姿都会被计算出来。你可以直接读取 data.xpos、data.xquat、data.site_xpos 等数组获取 FK 结果。

七、逆运动学 IK

定义:给定末端执行器的目标位姿(位置 + 姿态),求解满足该位姿的关节变量。

本质:从任务空间到关节空间的映射,通常困难且不唯一。

难点:

  • 多解性:同一个末端位姿可能对应多组关节角(如肘部上/下、腕部翻转等),需要根据约束选择
  • 无解性:目标位姿可能超出工作空间,或姿态不可达
  • 非线性:方程通常是非线性的,解析解仅对特定结构(如 6 自由度球形腕)存在
  • 奇异位形:某些关节配置下雅可比矩阵降秩,导致求解不稳定

主要求解方法:

方法思路优点缺点
解析法几何/代数推导闭式解精确、快速、可枚举所有解仅适用于特定结构
数值法(雅可比迭代)用雅可比矩阵迭代逼近通用可能陷入局部解、奇异点问题
优化法最小化位姿误差加正则项可加约束(关节限位、避障)计算量大
学习方法神经网络直接回归快需大量数据、泛化性差

数值法核心:利用雅可比矩阵 J 建立关节速度与末端速度的关系:

ẋ = J(q) · q̇

求解时迭代更新 q,常见的有雅可比伪逆法、阻尼最小二乘(DLS)、Levenberg-Marquardt 等。阻尼最小二乘在奇异位形附近表现更稳健。

在 MuJoCo 中:

  • MuJoCo 本身没有内置通用 IK 求解器,但提供了雅可比计算(mj_jac、mj_jacSite、mj_jacBody)
  • 常见的做法是用 mj_jac 配合优化器(如 scipy、NLopt)自行迭代
  • DeepMind 的 dm_control 提供了 ik 相关工具
  • 也可以用 MuJoCo 的逆动力学加位置伺服间接实现跟踪

八、两者的关系与对比

维度正运动学 FK逆运动学 IK
输入关节变量 q末端位姿 x
输出末端位姿 x关节变量 q
解的性质唯一、确定可能多解、无解
计算难度简单复杂
典型用途仿真、碰撞检测、传感器计算轨迹规划、抓取、遥操作

实际工作中的配合:机器人控制中通常先用 IK 把笛卡尔空间的目标轨迹转换成关节轨迹,再用 FK 验证末端是否到达期望位置,形成闭环。在 MuJoCo 仿真里,如果你要控制机械臂到达某点,往往就是“IK 求目标关节角 → 位置/力矩伺服驱动 → FK 反馈实际位姿”的流程。

九、FK 在手眼标定与 TCP 标定中的应用

在手眼标定(eye-to-hand,眼在手外)和 TCP 标定中,FK 模型是连接“机器人关节读数”与“末端/TCP 在机器人基座坐标系下的位姿”的桥梁。下面按标定流程说明 FK 模型的作用、需要读取什么,以及如何与视觉/TCP 数据配合。

1. 两个标定任务的本质

标定任务待求量已知量FK 的作用
眼在手外(eye-to-hand)相机坐标系到机器人基座坐标系的变换 T_base_cam关节角、相机观测到的标定板位姿由关节角算出标定板在基座系下的位姿
TCP 标定工具坐标系到末端法兰坐标系的变换 T_flange_tcp关节角、TCP 接触/观测到的固定点由关节角算出法兰位姿,反解 TCP 偏移

两者都需要 FK 把关节角转成笛卡尔位姿,区别在于标定的是“相机相对基座”还是“工具相对法兰”。

2. 标定中的坐标系链条

眼在手外标定(相机固定在环境中,看机器人和标定板):

Tbase_cam = Tbase_board · Tcam_board-1

其中 Tbase_board 的获取依赖 FK:标定板通常固定在机器人末端(或由机器人持工具触碰),所以

Tbase_board = Tbase_flange(q) · Tflange_board

其中 Tbase_flange(q) 就是 FK 的输出,Tflange_board 是标定板相对法兰的固定安装变换。

TCP 标定(四点法/多点法):

Tbase_tcp(q) = Tbase_flange(q) · Tflange_tcp

让 TCP 以不同姿态对准空间中同一个固定点,则对每组关节角 qi 都有:

Tbase_flange(qi) · Tflange_tcp · ptcp = pfixed

未知量是 Tflange_tcp(含 TCP 位置和姿态),Tbase_flange(qi) 全部由 FK 提供。多组姿态联立即可解出。

3. FK 模型需要提供什么

你需要从物理模型描述中获取:

  • 连杆几何参数:各连杆长度、关节偏置、扭转角(DH 参数或 MuJoCo 的 body/joint 层级)
  • 关节类型与轴向:旋转/移动、轴向方向
  • 末端法兰坐标系定义:FK 链末端到法兰的固定变换
  • 关节零位与符号约定:与真实机器人编码器读数对齐

在 MuJoCo 中的实现方式:

import mujoco

model = mujoco.MjModel.from_xml_path("robot.xml")
data = mujoco.MjData(model)

def get_flange_pose(q):
    data.qpos[:] = q
    mujoco.mj_forward(model, data)   # 执行 FK
    # 读取末端 body 的世界位姿
    body_id = model.body("flange").id
    pos = data.xpos[body_id].copy()
    quat = data.xquat[body_id].copy()
    return pos, quat
  • mj_forward 会遍历运动学树,算出所有 body/site/geom 的世界位姿
  • data.xpos、data.xquat 给出位置和四元数
  • 若法兰上定义了 site,用 data.site_xpos、data.site_xmat 更直接
  • 需要齐次矩阵时,把四元数转成旋转矩阵再拼 4×4

4. 标定流程中 FK 的使用步骤

眼在手外标定:

  • 让机器人带标定板运动到多个位姿,每个位姿记录:关节角 qi(从编码器读取)、相机检测到的标定板位姿 Tcam_board_i
  • 对每个位姿用 FK 算 Tbase_flange(qi)
  • 结合已知的 Tflange_board 得 Tbase_board_i
  • 构造 AX = XB 形式(手眼方程),用 Tsai、Park、Daniilidis 等算法求解 Tbase_cam

TCP 标定:

  • 让 TCP 以至少 3~4 种不同姿态对准同一固定点,记录 qi
  • 对每个 qi 用 FK 算 Tbase_flange(qi)
  • 建立方程组,用最小二乘解 Tflange_tcp
  • 位置解通常 3 个姿态即可,姿态解需要更多姿态

5. 关键注意事项

  • 时间同步:关节角与相机图像/观测必须同一时刻采集,否则 FK 算出的位姿与视觉观测不对应,标定误差大。
  • FK 模型与真实机器人一致性:DH 参数误差、关节零位偏差会直接传播到标定结果。可考虑把连杆参数也作为待优化量一起标定。
  • 坐标系方向约定:MuJoCo 用四元数 (w,x,y,z),相机/视觉库常用 (x,y,z,w) 或旋转矩阵,转换时务必统一。
  • 标定板安装变换 Tflange_board:眼在手外标定中这是已知量;若未知,可与 Tbase_cam 一起作为未知量联合优化。
  • 数值稳定性:手眼方程求解时注意姿态多样性,避免所有位姿接近导致矩阵病态。

6. MuJoCo 下的辅助工具

  • mj_jacBody、mj_jacSite:算雅可比,TCP 标定中若要优化也可用
  • mujoco.mju_mat2Quat、mju_quat2Mat:旋转表示转换
  • 若模型里已定义 tool site,FK 后直接读 data.site_xpos 即为 TCP 候选位姿
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐