OpenDuckMini强化学习框架入门教程-摇杆环境
纠错,疑问,交流: 请进入讨论区或 请点击进入页面,扫码加入微信群或Q群进行交流
获取最新文章: 扫一扫加入“创客智造”公众号
欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流
摇杆环境
- 理解摇杆是如何控制机械鸭,包含配置,摇杆命令,速度跟踪,观测构建,动作模拟等
概述
Joystick 类(定义在 joystick.py 中)是 Open Duck Mini V2 的主要运动控制环境。它继承自 OpenDuckMiniV2Env,实现了摇杆命令跟踪——即机器人根据虚拟摇杆命令(前向速度、横向速度、旋转速度)学习如何运动。
类结构
class Joystick(open_duck_mini_v2_base.OpenDuckMiniV2Env):
"""Track a joystick command."""
def __init__(self, task="flat_terrain", config=default_config(), config_overrides=None):
super().__init__(xml_path=..., config=config, ...)
self._post_init()
配置参数
default_config() 定义了完整的训练配置:
| 参数 | 默认值 | 说明 |
|---|---|---|
ctrl_dt |
0.02 | 控制周期 (50 Hz) |
sim_dt |
0.002 | 仿真步长 (500 Hz) |
episode_length |
1000 | 回合长度(步数) |
action_repeat |
1 | 动作重复次数 |
action_scale |
0.25 | 动作缩放因子 |
dof_vel_scale |
0.05 | 关节速度观测缩放 |
max_motor_velocity |
5.24 rad/s | 最大电机速度限制 |
奖励权重配置:
| 奖励项 | 权重 | 说明 |
|---|---|---|
tracking_lin_vel |
+2.5 | 线速度跟踪奖励 |
tracking_ang_vel |
+6.0 | 角速度跟踪奖励 |
torques |
-1.0e-3 | 力矩惩罚(能量效率) |
action_rate |
-0.5 | 动作变化率惩罚(平滑性) |
stand_still |
-0.2 | 静止时偏离默认姿态的惩罚 |
alive |
+20.0 | 存活奖励 |
imitation |
+1.0 | 模仿奖励(可选) |
噪声配置:
| 传感器 | 噪声标准差 | 说明 |
|---|---|---|
| hip 位置 | 0.03 rad | 髋关节位置噪声 |
| knee 位置 | 0.05 rad | 膝关节位置噪声 |
| ankle 位置 | 0.08 rad | 踝关节位置噪声 |
| 关节速度 | 2.5 rad/s | 关节速度噪声 |
| 重力 | 0.1 | 重力向量噪声 |
| 线速度 | 0.1 | 线速度噪声 |
| 陀螺仪 | 0.1 | 角速度噪声 |
| 加速度计 | 0.05 | 加速度噪声 |
摇杆命令
摇杆命令是 7 维向量,在 sample_command() 中生成:
command = [
lin_vel_x, # 前进速度 (-0.15 ~ 0.15 m/s)
lin_vel_y, # 横向速度 (-0.2 ~ 0.2 m/s)
ang_vel_yaw, # 旋转速度 (-1.0 ~ 1.0 rad/s)
neck_pitch, # 颈部俯仰 (-0.34 ~ 1.1 rad)
head_pitch, # 头部俯仰 (-0.78 ~ 0.78 rad)
head_yaw, # 头部偏航 (-1.5 ~ 1.5 rad)
head_roll, # 头部滚动 (-0.5 ~ 0.5 rad)
]
命令每隔 500 步重新采样一次,有 10% 的概率全部置零(鼓励机器人学会静止)。
速度跟踪
速度跟踪是 Joystick 环境的核心目标。奖励函数使用高斯核:
tracking_lin_vel_reward = exp(-error² / sigma)
tracking_ang_vel_reward = exp(-error² / sigma)
其中:
error = command - actual_velocitysigma = 0.01(跟踪精度控制的宽度参数)- 线速度:x 方向严格跟踪,y 方向允许 ±0.1 的容差
完整的奖励计算
_get_reward() 方法合成多个奖励项:
def _get_reward(self, data, action, info, ...):
return {
"tracking_lin_vel": reward_tracking_lin_vel(...), # 速度跟踪
"tracking_ang_vel": reward_tracking_ang_vel(...), # 角速度跟踪
"torques": cost_torques(...), # 力矩惩罚
"action_rate": cost_action_rate(...), # 动作平滑
"alive": reward_alive(), # 存活奖励
"imitation": reward_imitation(...), # 模仿奖励
"stand_still": cost_stand_still(...), # 静止惩罚
}
# 最终奖励 = 加权求和后乘以 dt
reward = clip(sum(权重 * 分量) * dt, 0.0, 10000.0)
观测构建
_get_obs() 方法构建包含噪声的观测:
标准观测 (46 维):
gyro(3) + accelerometer(3) + command(3) +
(joint_angles - default)(10) + joint_vel * scale(10) +
last_act(10) + last_last_act(10) + last_last_last_act(10) +
motor_targets(10) + contact(2) + imitation_phase(2)
特权观测 (额外维度):
标准观测 +
gyro_true(3) + accelerometer_true(3) + gravity(3) +
linvel(3) + global_angvel(3) +
joint_angles - default(10) + joint_vel(10) +
root_height(1) + actuator_force(10) + contact(2) +
feet_vel(12) + feet_air_time(2) +
reference_motion(40) + imitation_i(1) + imitation_phase(2)
回差观测处理
在含回差建模的模型中,观测构建时会将回差关节偏移叠加到执行器关节位置:
joint_angles = self.get_actuator_joints_qpos(data.qpos)
joint_backlash = self.get_actuator_backlash_qpos(data.qpos)
# 将回差偏移加到关节角度
joint_angles = joint_angles + joint_backlash
动作延迟模拟
为了模拟真实机器人系统的通信延迟,Joystick 环境实现了动作延迟机制:
# 维护动作历史缓冲区
action_history = roll(action_history).at[:actuators].set(action)
# 随机采样延迟步数(0-3 步)
action_idx = random_int(min_delay, max_delay)
action_w_delay = action_history[action_idx]
类似地,IMU 观测也有延迟模拟(0-3 步)。
推力扰动
训练过程中定期施加随机推力,提高策略的抗干扰能力:
- 间隔:每 5-10 秒一次
- 大小:0.1-1.0 N
- 方向:随机角度
- 作用点:浮动基座的 xy 方向
终止条件
def _get_termination(self, data):
# 重力 Z 分量为负 → 机器人摔倒
fall = gravity_z < 0
# 检测 NaN 状态
nan_detected = any(isnan(qpos) or isnan(qvel))
return fall or nan_detected
使用示例
# 创建摇杆环境
from playground.open_duck_mini_v2.joystick import Joystick
env = Joystick(task="flat_terrain_backlash")
# 重置环境
rng = jax.random.PRNGKey(0)
state = env.reset(rng)
# 执行动作
action = jnp.zeros(env.action_size)
state = env.step(state, action)
print(f"Reward: {state.reward}")
print(f"Done: {state.done}")
print(f"Obs shape: {state.obs['state'].shape}")
纠错,疑问,交流: 请进入讨论区或 请点击进入页面,扫码加入微信群或Q群进行交流
获取最新文章: 扫一扫加入“创客智造”公众号
欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流


















