同一份“数字骨架“,两种开源打法:智元 X2 URDF 与启元 Q1 URDF 的模型资产对比

同一份"数字骨架",两种开源打法:智元 X2 URDF 与启元 Q1 URDF 的模型资产对比

2024 年,两家国产人形机器人公司先后开源了各自的 URDF 模型仓库:智元机器人开源了灵犀 X2 的 agibot_x2_urdf,启元机器人开源了 Q1 的 q1-urdf。两家都选择了 URDF 格式,但"开源打法"截然不同。本文逐行拆解两份仓库的结构差异,带你看懂同一份"数字骨架"背后的两种工程哲学。

一、仓库速览:两家公司开源了什么?

打开两家仓库,第一眼看到的差异是"资产包内容"。

智元 agibot_x2_urdf:

bash 复制代码
agibot_x2_urdf-main/
├── X2_URDF-v1.3.0/     # 旗舰版
├── X2_URDF-v1.4.0/     # 旗舰焕新版 + 人人造(EDU)
│   ├── X2-Ultra.urdf
│   ├── X2-EDU.urdf
│   ├── meshes/         # STL 网格
│   └── ...
└── README.md

启元 q1-urdf:

bash 复制代码
q1-urdf/
├── urdf/               # 3 个 URDF 变体
│   ├── q1_v3.urdf
│   ├── q1_v3_no_collision.urdf
│   └── q1_v3_with_points.urdf
├── xml/                # 3 个 MJCF 变体
│   ├── q1_v3.xml
│   ├── q1_v3_full_range.xml
│   └── q1_v3_mc.xml
├── meshes/             # 24 个 STL 网格
├── config/             # 关节配置文件
├── launch/             # ROS 启动文件
├── CMakeLists.txt      # ROS 包配置
└── package.xml

差异一:智元仓库"纯模型资产"------只有 URDF、MJCF、STL 三类文件,没有一行可执行代码。启元仓库是"完整 ROS 包"------除了 URDF 和 MJCF,还带 config、launch、CMakeLists.txt,可以直接用 ROS 工具链加载。

差异二:智元按"机型版本"分目录(v1.3.0 / v1.4.0),启元按"功能变体"分文件(q1_v3 / q1_v3_no_collision / q1_v3_with_points)。

二、数字对比:26 vs 32,谁更"复杂"?

用同一个脚本统计两份 URDF 的关键数字:

指标 启元 Q1(q1_v3.urdf) 智元 X2(X2-EDU.urdf)
连杆数(link) 26 32
关节数(joint) 25 31
旋转关节(revolute) 22 29
固定关节(fixed) 3 2
独立 STL 网格 24 32
网格引用次数 29 62

X2 EDU 比 Q1 多 6 个连杆、7 个旋转关节。多在哪里?

腰部:X2 有 3 个腰部关节(yaw + pitch + roll),Q1 只有 2 个(yaw + roll,没有 pitch)。X2 多 1 个腰部自由度。

腕部:X2 每只腕有 3 个关节(yaw + pitch + roll),Q1 每只腕只有 2 个(yaw + pitch,且 yaw 是 fixed)。X2 多 2 个腕部自由度。

IMU 传感器:X2 有 2 个 IMU 连杆(imu_in_pelvis_link、imu_in_torso_link),Q1 没有。X2 多 2 个传感器连杆。

头部:X2 EDU 没有头部(精简版),Q1 有 1 个头部连杆但 fixed(不能动)。X2 Ultra 有 2 个头部关节(yaw + pitch),比 Q1 多 2 个头部自由度。

自由度总数:Q1 全身 22 个 revolute 关节,X2 EDU 全身 29 个,X2 Ultra 全身 31 个。X2 比 Q1 多 7~9 个自由度。

三、连杆树对比:腰、腕、头的三种选择

智元 X2:agibot_x2_urdf-main\X2_URDF-v1.4.0\X2-EDU.urdf

  • 29 个旋转关节(无头部)
  • 32 个连杆
  • 碰撞体用同名 STL

启元 Q1:q1-urdf\urdf\q1_v3.urdf

  • 22 个旋转关节
  • 26 个连杆
  • 碰撞体用简化几何

把两份 URDF 的连杆树画出来,差异一目了然。

腰部结构:

bash 复制代码
Q1:pelvis → waist_roll → waist_yaw → torso_link(2 个关节)
X2:pelvis → waist_yaw → waist_pitch → waist_roll → torso_link(3 个关节)

Q1 的腰部只有 roll(左右倾斜)和 yaw(左右旋转),没有 pitch(前后摆动)。X2 的腰部三个自由度全有。

腕部结构:

bash 复制代码
Q1:shoulder_pitch → shoulder_roll → shoulder_yaw → elbow → wrist_yaw(fixed)(5 个关节)
X2:shoulder_pitch → shoulder_roll → shoulder_yaw → elbow → wrist_yaw → wrist_pitch → wrist_roll(7 个关节)

Q1 的腕部 yaw 是 fixed 关节(不能动),X2 的腕部三个关节都是 revolute(能动)。

头部结构:

bash 复制代码
Q1:torso_link → head(fixed)(0 个关节)
X2 EDU:无头部
X2 Ultra:torso_link → head_yaw → head_pitch(2 个关节)

Q1 有头部但不能动,X2 EDU 没有头部,X2 Ultra 头部能动。

工程解读:

  • 腰部:X2 的三轴腰部可以做"弯腰"动作(pitch),Q1 只能"侧弯"和"扭腰"。对人形机器人来说,腰部 pitch 对弯腰捡东西、前倾行走等动作很重要。
  • 腕部:X2 的三轴腕可以做"转腕"动作(yaw + pitch + roll),Q1 只能"抬腕"和"侧摆"。对人形机器人来说,腕部 roll 对拧瓶盖、转门把手等操作很重要。
  • 头部:Q1 的头部 fixed 意味着"眼睛"永远朝前,X2 Ultra 的头部能动意味着可以"转头看"。对视觉感知来说,头部自由度很有价值。

四、关节类型对比:fixed 关节的三种用法

两份 URDF 都有 fixed 关节,但用法不同。

Q1 的 3 个 fixed 关节:

  • left_wrist_yaw_joint:腕部 yaw 固定(不能动)
  • right_wrist_yaw_joint:腕部 yaw 固定(不能动)
  • head_joint:头部固定(不能动)

X2 的 2 个 fixed 关节:

  • imu_in_pelvis_joint:把 IMU 传感器固定在骨盆上
  • imu_in_torso_joint:把 IMU 传感器固定在躯干上

差异解读:

Q1 的 fixed 关节是"砍掉自由度"------腕部和头部本来可以有电机,但 URDF 里选择 fixed,意味着这些关节被锁死。这样做的好处是简化控制、降低成本,适合教育或展示场景。

X2 的 fixed 关节是"挂传感器"------IMU 不是运动关节,而是感知设备,用 fixed 连接表示"传感器相对于连杆不动"。这样做的好处是为仿真器提供 IMU 数据读取点。

五、碰撞体策略对比:精细 vs 简化

打开两份 URDF 的 collision 段,差异更明显。

Q1 的碰撞体(以 pelvis 为例):

xml 复制代码
<collision>
  <origin xyz="0.0 0.0 0.039" rpy="1.57 0 0" />
  <geometry>
    <cylinder radius="0.045" length="0.13"/>
  </geometry>
</collision>
<collision>
  <origin xyz="0.0 0.0 0.069" rpy="0 0 0" />
  <geometry>
    <cylinder radius="0.046" length="0.055"/>
  </geometry>
</collision>

Q1 用多个圆柱体(cylinder)拼接近似骨盆的碰撞体。

X2 EDU 的碰撞体(以 pelvis 为例):

xml 复制代码
<collision>
  <origin xyz="0 0 0" rpy="0 0 0" />
  <geometry>
    <mesh filename="./meshes/pelvis.stl" />
  </geometry>
</collision>

X2 EDU 直接用同名 STL 网格作为碰撞体。

差异解读:

  • Q1 策略:collision 用简化几何(圆柱/盒/球),visual 用精细 STL。好处是碰撞检测快(简单几何计算量小),坏处是碰撞体与外观不完全贴合。
  • X2 EDU 策略:collision 直接用同名 STL,visual 也是同一个 STL。好处是碰撞体与外观完全一致,坏处是碰撞检测慢(精细网格有上万个三角面)。
  • X2 MJCF 策略:X2 的 MJCF 文件(X2-EDU.xml)里,collision 用简化几何,与 Q1 策略一致。这说明智元团队"知道"精细碰撞体慢,所以在 MJCF 里做了优化。

工程启示:URDF 是"通用格式",collision 用 STL 是为了"保真";MJCF 是"仿真专用格式",collision 用简化几何是为了"跑得快"。Q1 的 URDF 直接用了 MJCF 的策略,说明启元团队从一开始就为仿真性能做了优化。

六、开源资产包对比:两种"交付"哲学

把两份仓库的"交付物"列出来:

智元 agibot_x2_urdf:

  • 纯模型资产(URDF + MJCF + STL)
  • 无 ROS 包结构(没有 CMakeLists.txt、package.xml)
  • 无 launch 文件(不能直接 ros launch)
  • 无 config 文件(关节配置需要自己写)
  • 优点:轻量、跨平台、不绑定 ROS
  • 缺点:上手门槛高(需要自己搭环境)

启元 q1-urdf:

  • 完整 ROS 包(CMakeLists.txt + package.xml)
  • launch 文件(可以直接 ros launch 在 RViz 里看模型)
  • config 文件(关节名称配置)
  • 3 个 URDF 变体(带碰撞 / 无碰撞 / 带附加点)
  • 3 个 MJCF 变体(标准 / 全范围 / MuJoCo 专用)
  • 优点:开箱即用、ROS 生态友好
  • 缺点:绑定 ROS、文件多、选择复杂

哲学差异:

  • 智元:开源"最小资产包"------只给你 URDF 和网格,其他自己搭。这样做的好处是"不绑定技术栈"------你可以用 ROS、ROS 2、MuJoCo、Isaac Sim、PyBullet,任何仿真器都能用。坏处是上手慢。
  • 启元:开源"完整工具链"------给你 ROS 包、launch 文件、config 文件,直接能用。这样做的好处是"开箱即用"------ros launch 一下就能在 RViz 里看到模型。坏处是绑定 ROS,换仿真器需要自己改。

七、总结:两种打法,两种场景

维度 智元 X2 URDF 启元 Q1 URDF
自由度 29(EDU)/ 31(Ultra) 22
腰部 3 轴(yaw + pitch + roll) 2 轴(yaw + roll)
腕部 3 轴(yaw + pitch + roll) 2 轴(yaw fixed + pitch)
头部 0(EDU)/ 2(Ultra) 0(fixed)
碰撞体 URDF 用 STL / MJCF 用简化几何 URDF 用简化几何
IMU 传感器 2 个 0 个
ROS 包 无 有
launch 文件 无 有
URDF 变体 按机型分目录 按功能分文件
开源哲学 最小资产包、不绑定技术栈 完整工具链、开箱即用

谁更"好"? 没有绝对答案,只有适用场景:

  • 选智元 X2 URDF:如果你需要高自由度(腰部 pitch、腕部 roll、头部转动)、如果你用 MuJoCo 或 Isaac Sim、如果你不绑定 ROS。
  • 选启元 Q1 URDF:如果你需要快速上手(ros launch 一下就能看)、如果你用 ROS 工具链、如果你对自由度要求不高(教育/展示场景)。

共同点:两家都选择了 URDF 格式,都开源了 STL 网格,都提供了 MJCF 变体。这说明 URDF 已经成为人形机器人"数字骨架"的事实标准,MJCF 是仿真加速的通用方案。

差异点:智元开源"模型资产",启元开源"工具链"。前者给你"骨架",后者给你"骨架 + 血肉 + 衣服"。两种打法没有高下之分,只有目标用户不同。

访问启元机器人开发者社区,获取 SDK、仿真工具、开发文档,完成从代码仿真到真机落地的全流程开发:https://dev.primebot.com/