turtlebot3-burger_150.png
turtlebot3-waffle-pi_150.png
turtlebot3-arm_150.png
walking-y2_150.png
turbot3-multi_150.png
turbot3-dl-ros1_150.png
turbot3-ai.png
turbot3-dl-ros2_150.png
turbot3-slam_150.png
turbot3-arm_150.png
turtlebot4-lite_150.png
turtlebot4-pro_150.png
turbot4-dl_150.png
turbot4-ai_150.png
aidriving-racebot_150.png
aidriving-autodrive_150.png
turtlebot-arm_150.png
openmanipulator-x_150.png
Home » OpenDuckMini强化学习框架入门教程 » OpenDuckMini强化学习框架入门教程-地形生成

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.xmlscene_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.xmlscene_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交流群,微信扫描右侧二维码立即进群交流

群二维码

标签: OpenDuckMini强化学习框架