OpenDuckMini强化学习框架入门教程-地形生成
纠错,疑问,交流: 请进入讨论区或 请点击进入页面,扫码加入微信群或Q群进行交流
获取最新文章: 扫一扫加入“创客智造”公众号
欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流
地形生成
- 理解地形生成,包含地形配置选项,场景文件结构,平坦地形,粗糙地形,渲染配置,初始姿态和地形选择策略等
概述
Open Duck Playground 中的地形通过 MuJoCo 的场景 XML 文件定义,支持平坦地形和粗糙地形两种类型,并可选择是否启用回差建模。地形定义包含地面几何体、材质纹理、光照和渲染配置。
地形配置选项
通过 constants.py 中的 task_to_xml() 函数映射任务到场景文件:
def task_to_xml(task_name: str) -> epath.Path:
return {
"flat_terrain": FLAT_TERRAIN_XML,
"rough_terrain": ROUGH_TERRAIN_XML,
"flat_terrain_backlash": FLAT_TERRAIN_BACKLASH_XML,
"rough_terrain_backlash": ROUGH_TERRAIN_BACKLASH_XML,
}[task_name]
场景文件结构
场景文件通过 <include> 标签包含机器人模型,然后定义环境和地形:
scene_*.xml
├── <include file="open_duck_mini_v2[_backlash].xml"/> ← 机器人模型
├── <visual> ← 渲染设置
├── <asset> ← 纹理 + 材质 + 高度场
├── <worldbody> ← 地面几何体
└── <keyframe> ← 初始姿态
平坦地形
scene_flat_terrain.xml 和 scene_flat_terrain_backlash.xml 使用平面几何体:
<asset>
<texture type="skybox" builtin="gradient" rgb1="1 1 1" rgb2="1 1 1" width="800" height="800"/>
<texture type="2d" name="groundplane" builtin="checker" mark="edge"
rgb1="1 1 1" rgb2="1 1 1" markrgb="0 0 0" width="300" height="300"/>
<material name="groundplane" texture="groundplane" texuniform="true"
texrepeat="5 5" reflectance="0"/>
</asset>
<worldbody>
<body name="floor">
<geom name="floor" size="0 0 0.01" type="plane" material="groundplane"
contype="1" conaffinity="0" priority="1" friction="0.6" condim="3"/>
</body>
</worldbody>
平坦地形参数
| 参数 | 值 | 说明 |
|---|---|---|
type |
plane |
无限平面 |
size |
0 0 0.01 |
平面厚度参数 |
friction |
0.6 | 摩擦系数(域随机化会变化此值) |
condim |
3 | 接触维度(3 = 法向 + 切向摩擦力) |
contype / conaffinity |
1 / 0 | 碰撞类型(机器人的足部设置 conaffinity=0 以匹配) |
粗糙地形
scene_rough_terrain.xml 和 scene_rough_terrain_backlash.xml 使用**高度场(height field)**实现不规则地形:
<asset>
<texture type="skybox" builtin="gradient" rgb1="1 1 1" rgb2="1 1 1" width="800" height="800"/>
<texture type="2d" name="groundplane" builtin="checker" mark="edge"
rgb1="1 1 1" rgb2="1 1 1" markrgb="0 0 0" width="300" height="300"/>
<material name="groundplane" texture="groundplane" texuniform="true"
texrepeat="5 5" reflectance=".8"/>
<hfield name="hfield" file="assets/hfield.png" size="10 10 .01 0.1"/>
</asset>
<worldbody>
<body name="floor">
<geom name="floor" type="hfield" hfield="hfield" material="groundplane"
contype="1" conaffinity="0" priority="1" friction="1.0"/>
</body>
</worldbody>
粗糙地形参数
| 参数 | 值 | 说明 |
|---|---|---|
type |
hfield |
高度场几何体 |
hfield |
hfield |
引用的高度场资产 |
friction |
1.0 | 摩擦系数(略高于平坦地形) |
hfield size |
"10 10 .01 0.1" | 水平范围 10×10m,高度范围 -0.01~0.1m |
高度场格式
高度场使用 PNG 图像文件 assets/hfield.png 定义,这是一种典型的高度场表示方法:
hfield.png (灰度图)
│
├── 每个像素的亮度 → 地面的高度值
├── 黑色 (0) → 最低点 (-0.01m)
├── 白色 (255) → 最高点 (0.1m)
├── 水平分辨率 → 地形网格密度
└── 水平范围 → 10m × 10m
生成的粗糙地形:
- 高度变化范围: ~0.11m
- 水平范围: 10m × 10m
- 地形特征: 由 PNG 图像的灰度分布决定
渲染配置
场景文件包含视觉渲染设置:
<visual>
<headlight diffuse="0.6 0.6 0.6" ambient="0.3 0.3 0.3" specular="0 0 0"/>
<rgba haze="0.15 0.25 0.35 1"/>
<global azimuth="160" elevation="-20"/>
</visual>
| 参数 | 说明 |
|---|---|
| 环境光 | 中性灰色,柔和照明 |
| 雾色 | 淡蓝灰色 |
| 视角 | 方位角 160°, 仰角 -20° |
粗糙地形有独立的渲染配置:
<visual>
<rgba force="1 0 0 1"/>
<global azimuth="120" elevation="-20"/>
<map force="0.01"/>
<scale forcewidth="0.3" contactwidth="0.5" contactheight="0.2"/>
<quality shadowsize="8192"/>
</visual>
| 参数 | 说明 |
|---|---|
| 力可视化 | 红色 |
| 视角 | 方位角 120°, 仰角 -20° |
| 阴影分辨率 | 8192 |
初始姿态 (Keyframe)
所有场景文件定义名为 "home" 的 keyframe,包含初始关节位置和执行器控制值:
qpos:
0 0 0.15 ← 浮动基座位置 (x, y, z)
1 0 0 0 ← 浮动基座四元数 (w, x, y, z)
0.002 ← left_hip_yaw
0.053 ← left_hip_roll
-0.63 ← left_hip_pitch
1.368 ← left_knee
-0.784 ← left_ankle
0 ← neck_pitch
0 ← head_pitch
0 ← head_yaw
0 ← head_roll
-0.003 ← right_hip_yaw
-0.065 ← right_hip_roll
0.635 ← right_hip_pitch
1.379 ← right_knee
-0.796 ← right_ankle
ctrl:
0.002 0.053 -0.63 1.368 -0.784 (左腿)
0 0 0 0 (头部)
-0.003 -0.065 0.635 1.379 -0.796 (右腿)
初始高度 0.15 m(浮动基座底部到地面的距离),腿部呈半蹲姿态。
地形选择策略
训练策略
训练时应根据需求选择合适的地形组合:
| 阶段 | 地形 | 说明 |
|---|---|---|
| 初期训练 | 平坦地形 | 学习基础运动模式 |
| 中期训练 | 平坦 + 域随机化 | 提高对环境变化的鲁棒性 |
| 高级训练 | 粗糙地形 + 随机化 | 学习在不规则地形上运动 |
| 最终部署 | 回差 + 粗糙 + 随机化 | 弥合 sim-to-real 差距 |
训练命令示例
# 简单地形起步
uv run ... --task flat_terrain --num_timesteps 150000000
# 复杂地形进阶
uv run ... --task flat_terrain_backlash --num_timesteps 300000000
# 最高难度
uv run ... --task rough_terrain_backlash --num_timesteps 300000000
纠错,疑问,交流: 请进入讨论区或 请点击进入页面,扫码加入微信群或Q群进行交流
获取最新文章: 扫一扫加入“创客智造”公众号
欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流


















