🤖 roboto_origin_03 Wiki
首页 / URDF / 碰撞几何配置策略

碰撞几何(Collision Geometry)决定了机器人在物理仿真中如何与环境及其他连杆发生接触计算。与视觉几何追求外观还原不同,碰撞几何的核心诉求是在物理可信度计算效率之间取得平衡。本文档聚焦 atom01 人形机器人在 URDF 与 MJCF 两种模型格式中的碰撞配置策略,解析其设计意图、实现差异及工程 trade-off,帮助开发者在二次开发或迁移仿真平台时做出合理决策。

Sources: atom01.urdf, atom01.xml

核心设计思想:双轨策略

本项目对碰撞几何采取了双轨策略:在 ROS/Gazebo 生态使用的 URDF 中,采用混合基元近似(Hybrid Primitive Approximation)策略——以简化几何体替代高面数网格,并有选择地禁用部分连杆碰撞;而在 MuJoCo 使用的 MJCF 中,则采用统一网格碰撞(Unified Mesh Collision)策略——直接复用 STL 网格作为碰撞体,依赖 MuJoCo 的原生凸包碰撞求解器。两种策略的差异本质上源于不同物理引擎对网格碰撞的性能特征与稳定性支持。

flowchart TD
    A[碰撞几何需求] --> B{目标平台}
    B -->|ROS / Gazebo| C[URDF 混合基元近似]
    B -->|MuJoCo| D[MJCF 统一网格碰撞]
    C --> C1[视觉: STL 网格]
    C --> C2[碰撞: Box / Cylinder / Mesh]
    C --> C3[部分连杆禁用碰撞]
    D --> D1[视觉与碰撞共用 STL 网格]
    D --> D2[默认 condim=4 接触模型]
    D --> D3[通过 contype/conaffinity 过滤]

Sources: atom01.urdf, atom01.xml

URDF 中的分层近似策略

在 URDF 模型中,每个 <link> 内部通过独立的 <visual><collision> 标签分离视觉与碰撞表示。atom01 的 URDF 并未对所有连杆统一使用 STL 网格碰撞,而是依据连杆的功能位置、几何特征及自碰撞风险,采用了三种差异化处理:网格碰撞(精确接触)、基元包围盒(近似加速)以及完全禁用(规避自碰撞)。

Sources: atom01.urdf, atom01.urdf, atom01.urdf

下肢链:包围盒与选择性启用

下肢是支撑全身重量并与地面发生高频接触的关键链路,其碰撞配置体现了“该精确时精确、该简化时简化”的层次化思想。base_link(躯干主体)与两侧的 ankle_roll_link(足部末端)保留了 STL 网格碰撞,因为足部与地面的接触面形状直接影响站立稳定性与足底力分布的仿真精度。而对于大腿与小腿的主体结构,则采用轴对齐包围盒(AABB)进行近似:thigh_pitch_link 使用尺寸为 0.08 × 0.1 × 0.22 的 Box,knee_link 使用尺寸为 0.08 × 0.08 × 0.22 的 Box,二者均通过 <origin> 进行了局部坐标偏移以尽量贴合实际质心分布。

Sources: atom01.urdf, atom01.urdf, atom01.urdf, atom01.urdf

值得注意的是,大腿根部的 thigh_yaw_linkthigh_roll_link 以及踝关节的 ankle_pitch_link<collision> 标签被完全注释掉。这些连杆在机械结构上紧邻父连杆且运动范围受限,若启用网格碰撞,极易在关节运动过程中与父连杆产生虚假自碰撞(false-positive self-collision),从而干扰控制器正常运行。禁用这些次要连杆的碰撞,是提升仿真稳定性与降低计算开销的典型工程取舍。

Sources: atom01.urdf, atom01.urdf, atom01.urdf

躯干与上肢:圆柱体拟合

torso_link 的碰撞几何采用尺寸为 0.16 × 0.16 × 0.22 的 Box 近似,并将原点沿 Z 轴抬升 0.15,以覆盖躯干上半部的质量集中区域。上肢各连杆(arm_pitch、arm_roll、arm_yaw、elbow_pitch)统一使用 Cylinder 进行拟合,半径 0.03,长度根据各连杆尺寸在 0.050.10 之间调整,部分圆柱通过 rpy="0 1.57 0"rpy="0 1.57 1.57" 旋转以匹配肢体走向。圆柱体在数学上具有连续可微的碰撞表面,相比多面体网格在接触求解时梯度更为平滑,有利于减少仿真中的接触抖动。

Sources: atom01.urdf, atom01.urdf, atom01.urdf

禁用碰撞的末端关节

与下肢的 thigh_yaw、thigh_roll 逻辑一致,上肢末端的 elbow_yaw_link 同样被注释掉了碰撞标签。该连杆位于肘部末端,几何尺寸较小,启用碰撞对整体动力学行为贡献有限,却可能在小臂姿态变化时与 elbow_pitch_link 发生不必要的自碰撞干预。

Sources: atom01.urdf, atom01.urdf

URDF 碰撞配置总览

下表汇总了所有连杆的碰撞几何类型与处理策略,便于快速查阅与维护:

连杆类别 连杆名称示例 碰撞几何类型 尺寸/说明 策略意图
躯干 base_link Mesh (STL) 原始网格 保持主体外形精度
躯干 torso_link Box 0.16 × 0.16 × 0.22 简化包围盒
大腿偏航/翻滚 left_thigh_yaw_link (注释) 规避根部自碰撞
大腿俯仰 left_thigh_pitch_link Box 0.08 × 0.1 × 0.22 简化小腿以上结构
小腿 left_knee_link Box 0.08 × 0.08 × 0.22 简化膝部以下结构
脚踝俯仰 left_ankle_pitch_link (注释) 规避踝部自碰撞
脚踝翻滚/足部 left_ankle_roll_link Mesh (STL) 原始网格 保持足底接触精度
肩部/上臂 left_arm_pitch_link Cylinder r=0.03, l=0.05 圆柱拟合平滑接触
小臂 left_arm_yaw_link Cylinder r=0.03, l=0.05 圆柱拟合平滑接触
肘部偏航 left_elbow_yaw_link (注释) 规避肘部自碰撞

Sources: atom01.urdf, atom01.urdf, atom01.urdf, atom01.urdf, atom01.urdf

MuJoCo MJCF 的统一网格策略

与 URDF 的视觉-碰撞分离不同,MJCF 中的 <geom> 同时承担渲染与物理碰撞职责。atom01.xml 对所有连杆统一使用 <geom type="mesh" ...>,直接引用 ../meshes/ 目录下的 STL 文件,未像 URDF 那样将碰撞体替换为 Box 或 Cylinder。这一选择的底层逻辑在于 MuJoCo 的碰撞检测管线对凸网格(convex mesh)具有原生优化支持,其性能与稳定性足以在强化学习等需要高频采样的场景中胜任。

Sources: atom01.xml, atom01.xml, atom01.xml

在接触参数层面,MJCF 通过 <default> 全局定义了碰撞属性:condim="4" 启用四维接触空间(法向 + 切向摩擦力),contype="1"conaffinity="0" 构成基础碰撞过滤掩码,friction="0.9 0.2 0.2" 设定了滑动与扭转摩擦系数,solref="0.001 2" 控制接触约束的软化与阻尼。尽管模型中预留了 <default class="visualgeom">contype="0" conaffinity="0" 的纯视觉几何类),但实际 worldbody 中并未使用该类,所有连杆均以默认碰撞体形式存在。

Sources: atom01.xml, atom01.xml

两种策略的对比与选型逻辑

维度 URDF (Gazebo/ROS) MJCF (MuJoCo)
碰撞表示 视觉与碰撞分离;碰撞体独立简化 视觉与碰撞合一;共用网格
几何基元 Mesh、Box、Cylinder 混合使用 统一 Mesh
自碰撞控制 注释掉次要连杆的 <collision> 依赖 contype / conaffinity 掩码
接触模型 由 Gazebo 底层 ODE/Bullet 决定 显式 condim="4" + solref
性能优化方向 减少碰撞对数量、降低几何复杂度 依赖 MuJoCo 原生凸包加速
适用场景 ROS 导航、传统控制器验证 强化学习训练、高频仿真

当开发者需要将模型从 URDF 迁移至 MJCF,或反向导出时,需特别注意二者在碰撞表示上的根本差异:URDF 中“禁用碰撞”等价于移除 <collision> 标签,而 MJCF 中则需要显式设置 contype="0" 或利用 conaffinity 掩码过滤,否则 MuJoCo 会对所有网格启用完整碰撞检测,可能导致在 URDF 中被刻意规避的自碰撞问题重新浮现。

Sources: atom01.urdf, atom01.xml

维护注意事项与常见陷阱

首先,在审查 URDF 时应关注基元命名的准确性。left_knee_link 内部的 Box 碰撞体被赋予了 name="right_knee_link",这显然是一处复制粘贴遗留的命名错误。虽然 URDF 标准中 <box>name 属性对物理引擎通常无实质语义影响,但会在代码解析、调试日志或自动化工具链中造成左右混淆,建议在维护时统一修正。

Sources: atom01.urdf

其次,若计划在 Gazebo 中复现 MuJoCo 的仿真行为,或反之,需要重新评估碰撞简化策略。URDF 中的 Box/Cylinder 近似会改变接触点的局部曲率,进而影响足底力矩与摩擦锥的计算;而 MJCF 的原始网格在 Gazebo 中若使用 ODE 默认引擎,可能因凹网格分解问题导致性能骤降。跨平台迁移时,建议以 URDF 到 MJCF 的映射与差异 为参考,系统性复核碰撞几何配置。

Sources: atom01.urdf, atom01.xml

延伸阅读与导航

本文档聚焦于碰撞几何的配置策略与工程权衡。若需进一步了解运动学链路的完整构成与各关节自由度的详细参数,请参阅 运动学链路与自由度分析;若关注质量与惯性张量的设定逻辑,请参阅 惯性参数与质量分布。对于计划在 MuJoCo 中开展强化学习训练的开发者,建议继续阅读 MJCF 模型设计原理仿真稳定性优化指南,以深入理解 condimsolref 等接触参数对训练稳定性的影响。