同一份"数字骨架",两种开源打法:智元 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/