---
title: RSReBot MuJoCo 轨迹控制复现
description: 使用 DeDeUrdf 导出的 RSReBot 模型，在 MuJoCo 中补齐控制参数、执行位置控制轨迹并录制视频。
---

## 目标

这一页说明如何把 DeDeUrdf 导出的 RSReBot MuJoCo URDF ZIP，转成可执行位置控制的 MuJoCo 模型，并跑一个“抬起、伸展到较远、再回到初始位”的六关节轨迹。

RSReBot 控制示例推荐直接使用这个 MuJoCo URDF ZIP：

| 文件 | 用途 | 下载 |
| --- | --- | --- |
| `RSReBot_fluxweave_dm_mujoco_urdf.zip` | 包含 `urdf/` 和 `meshes/`，可用于生成 MuJoCo 控制 XML 并跑轨迹 | [下载](https://pub-6c1e280a27614b05891bfd818585735e.r2.dev/RSReBot/RSReBot_fluxweave_dm_mujoco_urdf.zip) |

如果要回到 DeDeUrdf 或 CAD 检查模型来源，可以下载完整资产：

| 文件 | 用途 | 下载 |
| --- | --- | --- |
| `RSReBot_accurate_web_project.zip` | DeDeUrdf 可继续编辑项目 | [下载](https://pub-6c1e280a27614b05891bfd818585735e.r2.dev/RSReBot/RSReBot_accurate_web_project.zip) |
| `RSReBot.f3z` | Fusion 360 原始项目归档 | [下载](https://pub-6c1e280a27614b05891bfd818585735e.r2.dev/RSReBot/RSReBot.f3z) |
| `RSReBot.step` | 通用 CAD 交换格式 | [下载](https://pub-6c1e280a27614b05891bfd818585735e.r2.dev/RSReBot/RSReBot.step) |

示例效果：

![RSReBot 轨迹控制截图](/images/robotics/rsrebot-all-joints-lift-extend-return.png)

<video src="/videos/robotics/rsrebot-all-joints-lift-extend-return.mp4" controls width="100%" />

## 控制策略概览

当前示例使用的是 MuJoCo 的位置控制模式：

```xml
<actuator>
  <position name="joint1_position" joint="joint1" kp="150" kv="24" ctrlrange="-2.8 2.8" forcerange="-180 180" />
  ...
</actuator>
```

轨迹脚本每隔固定时间给 `data.ctrl` 写入一个目标关节角：

```python
data.ctrl[:6] = q_target
mujoco.mj_step(model, data)
```

MuJoCo 的 position actuator 会根据当前关节角和目标关节角之间的误差产生力矩，让关节跟踪目标。

这里不是逆运动学，也不是笛卡尔空间控制，而是关节空间位置控制：

| 层级 | 当前示例是否包含 |
| --- | --- |
| 关节空间轨迹 | 包含 |
| 最小加加速度插值 | 包含 |
| 位置执行器 | 包含 |
| 惯量和关节限位 | 从 DMReBot 参考模型补齐 |
| 逆运动学 | 不包含 |
| 碰撞接触控制 | 示例里关闭接触 |
| 真实电机通信 | 不包含 |

## 为什么所有电机会同时到达

脚本不是让某个电机先动完再动下一个，而是给每个关节都生成同样时间长度的轨迹。

例如一个 16 秒轨迹，joint1 到 joint6 都会在 0 秒、3.2 秒、6.4 秒、9.6 秒、12.8 秒、16 秒这些时间点经过各自的 waypoint。

每个关节的角度变化量可以不同，但归一化进度相同：

```text
第 0 秒：所有关节在起点
第 8 秒：所有关节都完成 50% 的插值进度
第 16 秒：所有关节都到终点
```

插值函数使用 minimum jerk：

```text
s(t) = 10t^3 - 15t^4 + 6t^5
```

这个函数在段首和段尾速度、加速度都比较平滑，适合做演示轨迹。

## 运行环境

建议 Python 3.10 或更新版本。

安装依赖：

```bash
python -m pip install mujoco numpy imageio[ffmpeg]
```

如果你使用 `uv`：

```bash
uv venv
source .venv/bin/activate
uv pip install mujoco numpy imageio[ffmpeg]
```

## 第 1 步：下载 RSReBot 示例资产

在 ReBotMono 仓库根目录执行：

```bash
python examples/rsrebot-mujoco-control/scripts/download_rsrebot_assets.py \
  --output-dir build/rsrebot-assets
```

输出：

```text
build/rsrebot-assets/
  RSReBot_fluxweave_dm_mujoco_urdf.zip
  source/
    project.fluxweave.json
    urdf/RSReBot_fluxweave_dm_mujoco.urdf
    meshes/base.stl
    meshes/link1.stl
    ...
```

如果你已经有网页端导出的 ZIP，例如 `~/Downloads/RSReBot_fluxweave_dm_mujoco_urdf.zip`，可以跳过下载脚本，后续直接把 `--source-zip` 指到自己的 ZIP。也可以直接下载公开 MuJoCo ZIP：

```bash
mkdir -p build/rsrebot-assets
curl -L -o build/rsrebot-assets/RSReBot_fluxweave_dm_mujoco_urdf.zip \
  https://pub-6c1e280a27614b05891bfd818585735e.r2.dev/RSReBot/RSReBot_fluxweave_dm_mujoco_urdf.zip
```

## 第 2 步：生成 MuJoCo 控制模型

执行：

```bash
python examples/rsrebot-mujoco-control/scripts/build_rsrebot_control_model.py \
  --source-zip build/rsrebot-assets/RSReBot_fluxweave_dm_mujoco_urdf.zip \
  --output-dir build/rsrebot-mujoco-control
```

生成结果：

```text
build/rsrebot-mujoco-control/
  RSReBot_fluxweave_dm_control.xml
  RSReBot_fluxweave_dm_control.mjb
  urdf/
    RSReBot_fluxweave_dm_mujoco.urdf
  meshes/
    base.stl
    link1.stl
    link2.stl
    link3.stl
    link4.stl
    link5.stl
    link6.stl
    end.stl
```

`RSReBot_fluxweave_dm_control.xml` 是后续控制脚本真正加载的模型。

## 第 3 步：跑轨迹并录视频

执行：

```bash
python examples/rsrebot-mujoco-control/scripts/run_rsrebot_control_demo.py \
  --source-zip build/rsrebot-assets/RSReBot_fluxweave_dm_mujoco_urdf.zip \
  --output-dir build/rsrebot-mujoco-control \
  --motion all-joints-lift-extend-return \
  --duration 16 \
  --dt 0.04 \
  --record-video
```

输出：

```text
build/rsrebot-mujoco-control/
  RSReBot_all-joints-lift-extend-return.png
  RSReBot_all-joints-lift-extend-return.mp4
```

脚本会打印类似信息：

```text
RSReBot MuJoCo trajectory demo
  model: .../RSReBot_fluxweave_dm_control_video_damped.xml
  motion: all-joints-lift-extend-return
  samples: 401
  time range: 0.000s -> 16.000s
  final q target: [0.0, -0.66, -0.92, 0.18, 0.04, 0.0]
  final qpos: [...]
  final tracking error: ... rad
  max tracking error: ... rad
  render: .../RSReBot_all-joints-lift-extend-return.png
  video: .../RSReBot_all-joints-lift-extend-return.mp4
```

## 可选轨迹

脚本内置三种轨迹：

| `--motion` | 效果 |
| --- | --- |
| `all-joints-lift-extend-return` | 推荐演示，六个关节都会动，抬起、伸展、返回 |
| `lift-extend-return` | 小范围抬起、伸展、返回，主要动肩肘 |
| `wide` | 较大范围扫动，适合检查关节限位和模型稳定性 |

如果想做更小幅度轨迹，可以编辑 `run_rsrebot_control_demo.py` 里的 waypoint 数组，把每个关节角变化量减小。

## 关键脚本说明

### `download_rsrebot_assets.py`

这个脚本从 DeDeUrdf 线上示例下载项目 JSON 和 STL，并重新打包成 MuJoCo URDF ZIP。

常用参数：

| 参数 | 默认值 | 说明 |
| --- | --- | --- |
| `--output-dir` | `build/rsrebot-assets` | 输出目录 |
| `--base-url` | `https://dedeurdf.vercel.app/examples/rsrebot-mujoco` | 示例资产 URL |
| `--zip-name` | `RSReBot_fluxweave_dm_mujoco_urdf.zip` | 输出 ZIP 文件名 |

### `build_rsrebot_control_model.py`

这个脚本把 DeDeUrdf ZIP 转成 MuJoCo 控制 XML。

它会从 `reference/reBot-DevArm_fixend_control.xml` 复制这些参数：

| 参数 | 说明 |
| --- | --- |
| inertial | 每个 body 的质量、质心和惯量 |
| joint range | 每个 joint 的运动范围 |
| actuatorfrcrange | 每个 joint 的力矩范围 |
| actuator | 6 个 position actuator 的 `kp/kv/ctrlrange/forcerange` |

它不会自动推导真实惯量。如果你的实物机械臂和 DMReBot 不完全一致，应在 CAD 或实测后替换这些参数。

### `run_rsrebot_control_demo.py`

这个脚本负责生成轨迹、写入 `data.ctrl`、推进 MuJoCo 仿真并录制视频。

关键参数：

| 参数 | 默认值 | 说明 |
| --- | --- | --- |
| `--motion` | `all-joints-lift-extend-return` | 轨迹类型 |
| `--duration` | `16` | 轨迹总时长，单位秒 |
| `--dt` | `0.04` | 控制目标更新间隔 |
| `--demo-control` | `damped` | 为视频演示生成无重力/阻尼版本 |
| `--record-video` | 关闭 | 打开后输出 MP4 |
| `--width` | `960` | 渲染宽度 |
| `--height` | `720` | 渲染高度 |

`--demo-control damped` 会生成一个视频演示用 XML：

```text
RSReBot_fluxweave_dm_control_video_damped.xml
```

它会把重力设为 `0 0 0`，并给关节加一点 damping。这样做是为了让演示视频更稳定、更容易看清楚轨迹。真实动力学评估时，应回到原始 `RSReBot_fluxweave_dm_control.xml`，并使用正确质量、惯量、重力和控制器参数。

## 当前 MuJoCo 控制 XML 参数

示例 XML 中的位置执行器：

| actuator | joint | kp | kv | ctrlrange | forcerange |
| --- | --- | --- | --- | --- | --- |
| `joint1_position` | `joint1` | `150` | `24` | `-2.8 2.8` | `-180 180` |
| `joint2_position` | `joint2` | `180` | `28` | `-3.14 0` | `-220 220` |
| `joint3_position` | `joint3` | `160` | `24` | `-3.14 0` | `-180 180` |
| `joint4_position` | `joint4` | `80` | `12` | `-1.87 1.57` | `-90 90` |
| `joint5_position` | `joint5` | `70` | `10` | `-1.57 1.57` | `-80 80` |
| `joint6_position` | `joint6` | `60` | `8` | `-3.14 3.14` | `-70 70` |

这些参数是演示级位置控制参数，用于让仿真模型能稳定跟踪关节角。它们不是实机电机参数。

## 和 reBotArm_control_py 的关系

之前 `vectorBH6/reBotArm_control_py` 项目里的控制逻辑，本质上也是给多个关节同时规划目标位置，让每个电机在同一个总时长内走完自己的角度变化。

本仓库这个 MuJoCo 示例做了一个简化版：

| 对比项 | reBotArm_control_py | 本示例 |
| --- | --- | --- |
| 控制对象 | 实机/SDK 或项目里的机械臂控制接口 | MuJoCo 仿真模型 |
| 控制模式 | 位置目标为主 | MuJoCo position actuator |
| 同步方式 | 同一时间轴内插值 | 同一时间轴内 minimum jerk 插值 |
| 反馈 | 取决于 SDK/硬件接口 | MuJoCo `qpos` |
| 输出 | 实机运动或项目可视化 | PNG/MP4/仿真状态 |

因此，它适合作为“URDF 是否正确、关节方向是否正确、基本控制是否能跑”的验证环节。

## 给 Codex 的复制任务块

下面这段可以直接复制给 Codex，让它自动完成下载、生成、仿真和结果汇报。

```md
请在 ReBotMono 仓库根目录复现 RSReBot MuJoCo 轨迹控制：

1. 确认当前目录是 ReBotMono。
2. 安装依赖：`python -m pip install mujoco numpy imageio[ffmpeg]`。
3. 下载公开 MuJoCo URDF ZIP：
   `mkdir -p build/rsrebot-assets && curl -L -o build/rsrebot-assets/RSReBot_fluxweave_dm_mujoco_urdf.zip https://pub-6c1e280a27614b05891bfd818585735e.r2.dev/RSReBot/RSReBot_fluxweave_dm_mujoco_urdf.zip`
4. 生成控制模型：
   `python examples/rsrebot-mujoco-control/scripts/build_rsrebot_control_model.py --source-zip build/rsrebot-assets/RSReBot_fluxweave_dm_mujoco_urdf.zip --output-dir build/rsrebot-mujoco-control`
5. 跑轨迹并录视频：
   `python examples/rsrebot-mujoco-control/scripts/run_rsrebot_control_demo.py --source-zip build/rsrebot-assets/RSReBot_fluxweave_dm_mujoco_urdf.zip --output-dir build/rsrebot-mujoco-control --motion all-joints-lift-extend-return --duration 16 --dt 0.04 --record-video`
6. 汇报生成的 XML、MJB、PNG、MP4 路径。
7. 汇报最终 `final tracking error` 和 `max tracking error`。
8. 如果有报错，不要跳过，把完整报错贴出来，并先检查 mesh 路径、STL 是否下载完整、MuJoCo 是否安装成功。
```

## 排错

| 报错或现象 | 常见原因 | 处理方式 |
| --- | --- | --- |
| `Missing dependency: install MuJoCo` | 没安装 `mujoco` Python 包 | 运行 `python -m pip install mujoco` |
| `No URDF file found` | ZIP 不是 DeDeUrdf MuJoCo ZIP，或结构不对 | 确认 ZIP 内有 `urdf/*.urdf` |
| `missing mesh` | ZIP 里缺 STL，或文件名不一致 | 确认 `meshes/base.stl` 到 `meshes/end.stl` 都存在 |
| MuJoCo mesh 加载失败 | STL 编码或 mesh 路径问题 | 使用 `build_rsrebot_control_model.py` 重新整理和转换 |
| 视频无法写出 | 缺少 `imageio[ffmpeg]` | 运行 `python -m pip install imageio[ffmpeg]` |
| 模型突然散开 | 关节原点、rpy 或 axis 错误 | 回 DeDeUrdf 和 CAD 检查相邻坐标系 |
| 跟踪误差很大 | `kp/kv`、惯量、重力或轨迹过快 | 减小轨迹幅度、增加时长、调大阻尼或重新调 actuator |
