四足机器人#
四足机器人(Quadruped)是 DeepMind Control Suite 中的经典连续控制任务。在 MotrixLab 中,motrix_envs/src/motrix_envs/basic/quadruped 目录当前注册了四个可直接训练的任务:平地行走 dm-quadruped-walk、平地奔跑 dm-quadruped-run、复杂地形逃离 dm-quadruped-escape,以及平地推球到目标区 dm-quadruped-fetch。
任务预览#
Walk#
Run#
Escape#
Fetch#
任务概览#
环境 ID |
任务目标 |
模型文件 |
目标速度 |
观察维度 |
|---|---|---|---|---|
|
在平地上稳定向前行走并保持朝向 |
|
0.5 m/s |
54 |
|
在平地上高速奔跑并保持稳定姿态 |
|
5.0 m/s |
54 |
|
在起伏地形上尽快向外逃离原点区域 |
|
3.0 m/s |
57 |
|
在平地上将球体推动到目标区域 |
|
2.0 m/s |
66 |
任务描述#
Quadruped 是一个三维四足机器人任务。机器人主体由一个躯干和四条腿组成,每条腿具有偏航、抬升和伸展相关的控制能力。底层 XML 中定义了髋部、膝部和踝部的关节结构,而动作层采用每条腿 3 个执行器的耦合设计:
yaw:控制腿部偏航lift:通过 tendon 耦合控制抬腿动作extend:通过 tendon 耦合控制腿部伸展/收缩
walk 与 run 使用相同的平地模型,区别主要在目标速度;escape 使用带高度场的 quadruped_escape.xml,要求机器人在崎岖地形中快速远离世界原点,同时保持躯干直立和运动稳定;fetch 使用 quadruped_fetch.xml,在场景中额外引入自由球体与目标区域,要求机器人先调整到合适站位,再将球向目标方向推进。
动作空间(Action Space)#
项目 |
详细信息 |
|---|---|
类型 |
|
维度 |
12 |
动作按照四条腿依次排列,每条腿包含 yaw / lift / extend 三个执行器:
序号 |
动作含义 |
最小值 |
最大值 |
对应执行器 |
|---|---|---|---|---|
0 |
左前腿偏航控制 |
-1.0 |
1.0 |
|
1 |
左前腿抬升控制 |
-1.0 |
1.1 |
|
2 |
左前腿伸展控制 |
-0.8 |
0.8 |
|
3 |
右前腿偏航控制 |
-1.0 |
1.0 |
|
4 |
右前腿抬升控制 |
-1.0 |
1.1 |
|
5 |
右前腿伸展控制 |
-0.8 |
0.8 |
|
6 |
右后腿偏航控制 |
-1.0 |
1.0 |
|
7 |
右后腿抬升控制 |
-1.0 |
1.1 |
|
8 |
右后腿伸展控制 |
-0.8 |
0.8 |
|
9 |
左后腿偏航控制 |
-1.0 |
1.0 |
|
10 |
左后腿抬升控制 |
-1.0 |
1.1 |
|
11 |
左后腿伸展控制 |
-0.8 |
0.8 |
|
观察空间#
环境 |
详细信息 |
|---|---|
|
|
|
|
|
|
|
|
四种任务共享绝大部分本体观测,escape 额外增加了 3 维与原点相关的任务信息,fetch 额外增加了球体状态与目标位置信息:
部分 |
内容说明 |
维度 |
|
|
|
|---|---|---|---|---|---|
egocentric dof pos |
身体广义位置状态 |
16 |
是 |
是 |
是 |
egocentric dof vel |
身体广义速度状态 |
16 |
是 |
是 |
是 |
actuator ctrl |
当前 12 维执行器控制量 |
12 |
是 |
是 |
是 |
torso velocity |
躯干线速度传感器 |
3 |
是 |
是 |
是 |
torso upright |
躯干朝上程度标量 |
1 |
是 |
是 |
是 |
imu |
IMU 加速度与角速度 |
6 |
是 |
是 |
是 |
origin |
世界原点在本体坐标系中的位置 |
3 |
否 |
是 |
否 |
ball state |
球相对本体的位置、相对线速度与角速度 |
9 |
否 |
否 |
是 |
target |
目标区域在本体坐标系中的相对位置 |
3 |
否 |
否 |
是 |
环境还在 XML 中定义了足端力/力矩传感器与质心传感器,但当前实现的默认观测并未直接拼接这些量。
奖励函数设计#
四种任务都以“保持躯干直立”为核心约束。实现中首先根据 torso_upright 计算 upright_reward,要求机器人主体保持接近直立的姿态。
Walk / Run#
dm-quadruped-walk 与 dm-quadruped-run 使用相同的奖励结构,只是目标速度不同:
walk追踪0.5 m/srun追踪5.0 m/s
总奖励由以下部分组成:
# 速度奖励:沿前向达到目标速度
# 姿态奖励:保持躯干直立
# 辅助奖励:高度、横向稳定性、朝向一致性、动作平滑性
# 惩罚项:后退、竖直速度过大、横滚/俯仰角速度过大、偏离默认姿态
total_reward = upright_reward * move_reward + shaping_terms - penalty_terms
其中主要 shaping/penalty 项包括:
height_reward:鼓励躯干保持在站立高度附近lateral_reward:抑制过大的横向速度heading_reward:鼓励机器人持续朝 +X 方向前进smooth_reward:惩罚相邻时刻动作变化过大backward_penalty:抑制向后运动lin_vel_z_penalty与ang_vel_xy_penalty:抑制上下颠簸和躯干横滚/俯仰过大similar_to_default_penalty:鼓励关节姿态不要偏离默认站姿太远
Escape#
dm-quadruped-escape 在 locomotion 奖励基础上,增加了“尽快逃离原点区域”的任务项。该任务使用 quadruped_escape.xml 中的高度场地形:
# 基础 locomotion 奖励
# + 远离原点奖励
# + 径向外逃速度奖励
total_reward = locomotion_reward + upright_reward * escape_reward + radial_speed_reward
额外任务项包括:
escape_reward:根据机器人离原点区域的距离给出奖励radial_speed_reward:鼓励沿着“远离原点”的方向加速前进
这使得 escape 不仅要求机器人跑得快,还要求它在复杂地形上沿正确方向脱离中心区域。
Fetch#
dm-quadruped-fetch 使用一套面向“站位 + 推球”的专用 shaping 结构。当前实现中,奖励主要围绕机器人相对球和目标的几何关系展开:
# 站位阶段:鼓励机器人先移动到球后方或侧后方
# 就绪阶段:鼓励机器人面向球、贴近球,并与球-目标连线对齐
# 推球阶段:鼓励球向目标方向滚动,并最终进入目标区域
# 惩罚项:反向移动、把球推离目标方向、腿部与球体过近
total_reward = stage_terms + ready_terms + push_terms - penalty_terms
其中主要项包括:
stage_move:鼓励机器人朝当前阶段目标点移动stage_reach:鼓励机器人先到达球后方或侧后方的站位点behind_align:鼓励机器人站到球和目标连线的后方face_ball:鼓励机体朝向球体near_ball:鼓励机器人接近球体ready与ready_gate:综合站位、朝向和距离关系,决定是否进入更积极的推球阶段fetch:鼓励球体靠近目标区域push:鼓励球沿目标方向滚动backward:惩罚朝阶段目标的反向运动away:惩罚把球推向远离目标的方向leg_ball:惩罚腿部几何体与球体过近,减少“缠球”或挤球现象
此外,fetch 还通过 stability 门控同时约束躯干直立程度和机体高度,避免机器人通过明显跌倒或趴地的方式获取任务奖励。
初始状态#
walk、run和escape都从 XML 中的默认四足站姿开始重置这三个任务的根关节朝向固定为初始朝向,不随机旋转
fetch会在平面上随机初始化机器人位置与偏航角,同时随机初始化球体在地面上的位置所有任务的关节速度与球体速度都初始化为 0
重置时会自动抬高机体,直到机器人与地面不发生初始穿透/碰撞
Episode 终止条件#
最大时长为 20 秒
当观测中出现
NaN时,episode 终止walk、run与escape当前实现没有单独设置“跌倒即终止”的条件fetch在机体明显跌倒时会提前终止,条件包括躯干直立程度过低或躯干高度过低当前实现尚未单独设置“球进入目标区域即成功终止”的条件
使用指南#
1. 环境预览#
uv run scripts/view.py --env dm-quadruped-walk
uv run scripts/view.py --env dm-quadruped-run
uv run scripts/view.py --env dm-quadruped-escape
uv run scripts/view.py --env dm-quadruped-fetch
2. 开始训练#
uv run scripts/train.py --env dm-quadruped-walk
uv run scripts/train.py --env dm-quadruped-run
uv run scripts/train.py --env dm-quadruped-escape
uv run scripts/train.py --env dm-quadruped-fetch
3. 查看训练进度#
uv run tensorboard --logdir runs/dm-quadruped-walk
uv run tensorboard --logdir runs/dm-quadruped-run
uv run tensorboard --logdir runs/dm-quadruped-escape
uv run tensorboard --logdir runs/dm-quadruped-fetch
4. 测试训练结果#
uv run scripts/play.py --env dm-quadruped-walk
uv run scripts/play.py --env dm-quadruped-run
uv run scripts/play.py --env dm-quadruped-escape
uv run scripts/play.py --env dm-quadruped-fetch
预期训练结果#
行走任务(dm-quadruped-walk)#
稳定维持接近
0.5 m/s的平地前进速度身体姿态平稳,横向摆动较小
能够持续保持朝 +X 方向行走
奔跑任务(dm-quadruped-run)#
速度提升到接近或超过
5.0 m/s步幅明显增大,动作具有更强爆发性
高速运动下仍能保持较好的躯干稳定性
逃离任务(dm-quadruped-escape)#
能够快速离开原点附近区域
在高度场地形上保持稳定落脚,不易侧翻
运动方向以向外逃离为主,而不是原地打转
推球任务(dm-quadruped-fetch)#
能够先调整到球和目标连线的合理站位,而不是直接从侧面乱撞球
能够稳定地将球向目标区域推进,而不是把球踢飞或持续推离目标
在推球过程中保持较好的机体稳定性,减少趴地、翻倒和腿部缠球现象