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

群二维码

摇杆环境

  • 理解摇杆是如何控制机械鸭,包含配置,摇杆命令,速度跟踪,观测构建,动作模拟等

概述

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

群二维码

标签: OpenDuckMini强化学习框架