宇树G1机器人强化学习训练完整实战教程

宇树G1机器人强化学习训练完整实战教程

0. 前言

人形机器人的运动控制一直是机器人领域的重要挑战,而强化学习为解决这一问题提供了强有力的工具。本教程将基于宇树G1人形机器人,从基础的强化学习环境搭建开始,逐步深入到高自由度模型的训练配置、奖励函数设计与优化,最终实现复杂动作的训练控制。作者看到一个很棒的系列,所以针对性的对文章内容进行了整理和二次理解,方便大家更好的阅读《不同自由度的宇树G1机器人强化学习训练配置及运行实战 + RSL-RL代码库问题修复》、《宇树G1机器人强化学习训练奖励函数代码架构 + 创建新的奖励函数(1)》、《RL指标分析与看板应用 — 宇树G1机器人高自由度模型强化学习训练实战(3)》、《调参解析 — 宇树G1机器人高自由度模型强化学习训练实战(4)》、《舞蹈训练?手撕奖励函数 — 宇树G1机器人高自由度模型强化学习训练实战(5)》。

1. 强化学习训练环境配置

1.1 基础环境搭建

宇树机器人的强化学习训练基于Isaac Gym物理仿真环境和RSL-RL强化学习框架。首先需要确保这两个核心组件正确安装和配置。

在开始训练之前,我们通过简单的命令来启动12自由度G1机器人的基础训练:

python legged_gym/scripts/train.py --task=g1 

这个命令背后的机制涉及到任务注册系统。在 legged_gym/envs/__init__.py 文件中,我们可以看到各种机器人任务的注册代码:

from legged_gym import LEGGED_GYM_ROOT_DIR, LEGGED_GYM_ENVS_DIR from legged_gym.envs.go2.go2_config import GO2RoughCfg, GO2RoughCfgPPO from legged_gym.envs.h1.h1_config import H1RoughCfg, H1RoughCfgPPO from legged_gym.envs.h1.h1_env import H1Robot from legged_gym.envs.h1_2.h1_2_config import H1_2RoughCfg, H1_2RoughCfgPPO from legged_gym.envs.h1_2.h1_2_env import H1_2Robot from legged_gym.envs.g1.g1_config import G1RoughCfg, G1RoughCfgPPO from legged_gym.envs.g1.g1_env import G1Robot from.base.legged_robot import LeggedRobot from legged_gym.utils.task_registry import task_registry # 任务注册 task_registry.register("go2", LeggedRobot, GO2RoughCfg(), GO2RoughCfgPPO()) task_registry.register("h1", H1Robot, H1RoughCfg(), H1RoughCfgPPO()) task_registry.register("h1_2", H1_2Robot, H1_2RoughCfg(), H1_2RoughCfgPPO()) task_registry.register("g1", G1Robot, G1RoughCfg(), G1RoughCfgPPO())

1.2 G1机器人12自由度配置解析

标准的G1机器人配置文件位于 legged_gym/envs/g1/g1_config.py 中,其中定义了机器人的各项参数。让我们深入分析关键配置:

from legged_gym.envs.base.legged_robot_config import LeggedRobotCfg, LeggedRobotCfgPPO classG1RoughCfg(LeggedRobotCfg):classinit_state(LeggedRobotCfg.init_state): pos =[0.0,0.0,0.8]# x,y,z [m] 初始位置 default_joint_angles ={# 各关节默认角度 [rad]'left_hip_yaw_joint':0.,'left_hip_roll_joint':0,'left_hip_pitch_joint':-0.1,'left_knee_joint':0.3,'left_ankle_pitch_joint':-0.2,'left_ankle_roll_joint':0,'right_hip_yaw_joint':0.,'right_hip_roll_joint':0,'right_hip_pitch_joint':-0.1,'right_knee_joint':0.3,'right_ankle_pitch_joint':-0.2,'right_ankle_roll_joint':0,'torso_joint':0.}classenv(LeggedRobotCfg.env): num_observations =47# 观测维度 num_privileged_obs =50# 特权观测维度 num_actions =12# 动作维度

这里的关键参数解释:

  • pos: 机器人在仿真环境中的初始位置
  • default_joint_angles: 各关节的默认角度,这些角度对应机器人的自然站立姿态
  • num_observations: 观测空间维度,包括身体姿态、关节状态等信息
  • num_actions: 动作空间维度,对应可控制的关节数量

2. 扩展到23自由度模型

2.1 高自由度模型的挑战

当我们将G1机器人从12自由度扩展到23自由度时,增加的11个自由度主要分布在上肢:

  • 腰部:3个自由度(yaw, pitch, roll)
  • 左右肩部:各3个自由度(pitch, roll, yaw)
  • 左右肘部:各1个自由度(pitch)
  • 左右手腕:各1个自由度(roll)

这种扩展带来了显著的复杂性增加,不仅仅是参数数量的增长,更重要的是动作空间的指数级扩展和训练难度的显著提升。

2.2 创建23自由度配置

为了不破坏现有的G1训练任务,我们在 legged_gym/envs/g1/ 目录下创建新的配置文件 g1_config_23.py

from legged_gym.envs.base.legged_robot_config import LeggedRobotCfg, LeggedRobotCfgPPO classG1_23RoughCfg(LeggedRobotCfg):classinit_state(LeggedRobotCfg.init_state): pos =[0.0,0.0,0.8] default_joint_angles ={# 腿部关节(保持原有配置)'left_hip_yaw_joint':0.,'left_hip_roll_joint':0,'left_hip_pitch_joint':-0.1,'left_knee_joint':0.3,'left_ankle_pitch_joint':-0.2,'left_ankle_roll_joint':0,'right_hip_yaw_joint':0.,'right_hip_roll_joint':0,'right_hip_pitch_joint':-0.1,'right_knee_joint':0.3,'right_ankle_pitch_joint':-0.2,'right_ankle_roll_joint':0,# 新增的上肢关节'waist_yaw_joint':0,# 注意:torso_joint改名为waist_yaw_joint'left_shoulder_pitch_joint':0.,'left_shoulder_roll_joint':0,'left_shoulder_yaw_joint':0.,'left_elbow_joint':0.,'left_wrist_roll_joint':0.,'right_shoulder_pitch_joint':0.,'right_shoulder_roll_joint':0.0,'right_shoulder_yaw_joint':0.,'right_elbow_joint':0.,'right_wrist_roll_joint':0.}

2.3 观测维度的重新计算

观测维度的计算是强化学习配置中的关键环节。对于足式机器人,标准的观测包括:

  • 基座角速度:3维
  • 重力投影:3维
  • 运动命令:3维
  • 关节位置偏差:关节数量维(23维)
  • 关节速度:关节数量维(23维)
  • 上一步动作:关节数量维(23维)
  • 相位信息:2维(sin和cos)

因此,23自由度G1机器人的观测维度为:3 + 3 + 3 + 23×3 + 2 = 80维,通过查看/unitree_rl_gym/legged_gym/envs/g1/g1_env.py中的privileged_obs_buf和obs_buf,我们发现多了base_lin_vel(线速度) (3维)。

classenv(LeggedRobotCfg.env): num_observations =80# 普通观测维度 num_privileged_obs =83# 特权观测维度(多了基座线速度3维) num_actions =23# 动作维度

2.4 控制参数配置

针对新增的关节,需要配置相应的PD控制参数。不同类型的关节需要不同的刚度和阻尼设置:

classcontrol(LeggedRobotCfg.control): control_type ='P'# PD控制# 关节刚度配置 [N*m/rad] stiffness ={'hip_yaw':100,'hip_roll':100,'hip_pitch':100,'knee':150,'ankle':40,'waist_yaw':250,# 腰部需要更高刚度'shoulder':100,# 肩部关节'elbow':50,# 肘部关节'wrist':50,# 手腕关节}# 关节阻尼配置 [N*m*s/rad] damping ={'hip_yaw':2,'hip_roll':2,'hip_pitch':2,'knee':4,'ankle':2,'waist_yaw':6,# 腰部阻尼'shoulder':2,'elbow':2,'wrist':2,} action_scale =0.25# 动作缩放因子 decimation =4# 控制频率分频

2.5 资源文件更新

最后,需要更新机器人模型文件路径:

classasset(LeggedRobotCfg.asset):file='{LEGGED_GYM_ROOT_DIR}/resources/robots/g1_description/g1_23dof_rev_1_0.urdf' name ="g1" foot_name ="ankle_roll" penalize_contacts_on =["hip","knee"] terminate_after_contacts_on =["pelvis"] self_collisions =0 flip_visual_attachments =False

完成配置后,在 __init__.py 中注册新任务:

from legged_gym.envs.g1.g1_config_23 import G1_23RoughCfg, G1_23RoughCfgPPO task_registry.register("g1_23", G1Robot, G1_23RoughCfg(), G1_23RoughCfgPPO())

现在可以使用以下命令开始23自由度的训练:

python legged_gym/scripts/train.py --task=g1_23 

3. 奖励函数架构深度解析

3.1 奖励函数的核心作用

在强化学习中,奖励函数是算法学习的唯一指导信号。对于足式机器人,一个良好的奖励函数设计需要平衡多个目标:稳定性、任务完成度、能耗效率、动作自然性等。

宇树的强化学习框架采用了模块化的奖励函数设计,每个奖励组件专注于机器人行为的特定方面。这种设计使得我们可以精细调节每个行为特征的重要性。

3.2 G1机器人奖励函数配置详解

在G1机器人的配置类 G1RoughCfg(LeggedRobotCfg) 中,奖励函数的配置采用继承和重写的方式:

classG1RoughCfg(LeggedRobotCfg):classrewards(LeggedRobotCfg.rewards):# 基础参数设置 soft_dof_pos_limit =0.9# 柔性关节位置限制,保护机械结构 base_height_target =0.78# 期望的机器人身体高度classscales(LeggedRobotCfg.rewards.scales):# 轨迹跟踪奖励 tracking_lin_vel =1.0# 线速度跟踪奖励权重 tracking_ang_vel =0.5# 角速度跟踪奖励权重# 稳定性相关惩罚 lin_vel_z =-2.0# z方向线速度惩罚(防跳跃) ang_vel_xy =-0.05# xy轴角速度惩罚(防翻滚) orientation =-1.0# 姿态偏离惩罚 base_height =-10.0# 高度偏离惩罚# 动作平滑性惩罚 dof_acc =-2.5e-7# 关节加速度惩罚 dof_vel =-1e-3# 关节速度惩罚 action_rate =-0.01# 动作变化率惩罚# 步态相关奖励 feet_air_time =0.0# 足部离地时间奖励 contact =0.18# 足部接触奖励 contact_no_vel =-0.2# 接触时无速度惩罚 feet_swing_height =-20.0# 足部摆动高度惩罚# 安全性奖励 collision =0.0# 碰撞惩罚 dof_pos_limits =-5.0# 关节位置限制惩罚 alive =0.15# 存活奖励 hip_pos =-1.0# 髋部位置惩罚

参数设置详解

  • soft_dof_pos_limit = 0.9: 设置为URDF限制的90%,当关节接近极限位置时开始惩罚,保护机械结构
  • base_height_target = 0.78: G1机器人的理想身体高度(米),用于维持稳定的站立姿态

父类继承的默认配置

classLeggedRobotCfg:classrewards:classscales: termination =-0.0# 终止惩罚 torques =-0.00001# 扭矩惩罚 feet_stumble =-0.0# 足部绊倒惩罚 stand_still =-0.# 静止时动作惩罚# 奖励函数参数 only_positive_rewards =True# 限制负奖励,避免早期终止 tracking_sigma =0.25# 跟踪奖励的衰减参数 soft_dof_vel_limit =1.# 关节速度软限制 soft_torque_limit =1.# 扭矩软限制 max_contact_force =100.# 最大接触力阈值
奖励函数权重配置示意图

3.3 奖励函数的初始化机制

在LeggedRobot类的初始化过程中,_prepare_reward_function() 方法负责构建奖励函数列表:

def_prepare_reward_function(self):"""准备奖励函数列表,查找所有非零权重的奖励函数"""# 移除零权重项,并将非零权重乘以时间步长for key inlist(self.reward_scales.keys()): scale = self.reward_scales[key]if scale ==0: self.reward_scales.pop(key)# 移除零权重项else: self.reward_scales[key]*= self.dt # 转换为每秒奖励# 构建函数列表 self.reward_functions =[] self.reward_names =[]for name, scale in self.reward_scales.items():if name =="termination":continue# 终止奖励单独处理 self.reward_names.append(name) function_name ='_reward_'+ name self.reward_functions.append(getattr(self, function_name))# 初始化累积奖励记录 self.episode_sums ={ name: torch.zeros(self.num_envs, dtype=torch.float, device=self.device, requires_grad=False)for name in self.reward_scales.keys()}

这个机制的巧妙之处在于动态函数查找:通过 getattr(self, '_reward_' + name) 自动找到对应的奖励函数,这意味着我们只需要定义函数并在配置中设置权重,系统就会自动将其纳入训练过程。

3.4 奖励计算的执行机制

每个仿真步骤都会调用 compute_reward() 方法来计算总奖励:

defcompute_reward(self):"""计算总奖励,调用所有非零权重的奖励函数""" self.rew_buf[:]=0.# 初始化奖励缓冲区# 计算各项奖励for i inrange(len(self.reward_functions)): name = self.reward_names[i] rew = self.reward_functions[i]()* self.reward_scales[name] self.rew_buf += rew self.episode_sums[name]+= rew # 可选:限制负奖励if self.cfg.rewards.only_positive_rewards: self.rew_buf[:]= torch.clip(self.rew_buf[:],min=0.)# 单独处理终止奖励if"termination"in self.reward_scales: rew = self._reward_termination()* self.reward_scales["termination"] self.rew_buf += rew self.episode_sums["termination"]+= rew 

3.5 核心奖励函数解析

让我们深入分析几个关键的奖励函数:

轨迹跟踪奖励

def_reward_tracking_lin_vel(self):"""线速度跟踪奖励 - 鼓励机器人按指令移动""" lin_vel_error = torch.sum(torch.square( self.commands[:,:2]- self.base_lin_vel[:,:2]), dim=1)return torch.exp(-lin_vel_error / self.cfg.rewards.tracking_sigma)def_reward_tracking_ang_vel(self):"""角速度跟踪奖励 - 鼓励机器人按指令转向""" ang_vel_error = torch.square( self.commands[:,2]- self.base_ang_vel[:,2])return torch.exp(-ang_vel_error / self.cfg.rewards.tracking_sigma)

这两个函数使用指数衰减的奖励机制:误差越小,奖励越接近1;误差增大,奖励快速衰减至0。

稳定性奖励

def_reward_orientation(self):"""姿态稳定性奖励 - 惩罚身体倾斜"""return torch.sum(torch.square(self.projected_gravity[:,:2]), dim=1)def_reward_base_height(self):"""高度控制奖励 - 保持目标高度""" base_height = self.root_states[:,2]return torch.square(base_height - self.cfg.rewards.base_height_target)

动作平滑性奖励

def_reward_action_rate(self):"""动作变化率惩罚 - 鼓励平滑控制"""return torch.sum(torch.square(self.last_actions - self.actions), dim=1)def_reward_dof_acc(self):"""关节加速度惩罚 - 避免剧烈动作"""return torch.sum(torch.square((self.last_dof_vel - self.dof_vel)/ self.dt), dim=1)
奖励函数分类图

…详情请参照古月居

Read more

企业级 Git 分支管理模型实战:从 Git Flow 到 DevOps 落地

企业级 Git 分支管理模型实战:从 Git Flow 到 DevOps 落地

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 企业级开发模型:认知突破 * 二. 企业级分支模型核心:Git Flow 规范 * 2.1 五大核心分支及其职责 * 2.2 分支命名规范(企业实操版) * 三. 环境与分支的强绑定:从开发到上线的流转 * 3.1 四大核心环境及分支对应关系 * 四. 企业级项目管理实战:完整落地流程 * 4.1 前置准备工作 * 4.2 开发场景-基于git flow模型的实践 * 结尾: 前言: 在小型团队或个人开发中,简单的分支操作或许能满足需求,但进入企业级项目后,多环境部署、

By Ne0inhk
VLM Unlearning 有关论文阅读总结与梳理

VLM Unlearning 有关论文阅读总结与梳理

文章目录 目录 前言 一、什么是 Unlearning 二、AUVIC 三、Neuron Pruning 四、 Neuron Path Editing 五、 MLLM Eraser 前言 本文整理了当前多模态大模型(VLM)中常见的 Unlearning 技术路线,主要包括: * AUVIC * Neuron Pruning * Neuron Path Editing * MLLM Eraser 这些方法的核心目标都是: 让模型“遗忘”指定知识,同时尽量不影响其它知识。 一、什么是 Unlearning 在多模态大模型(Vision-Language Model / VLA)中,我们经常需要: * 删除隐私数据 * 移除不安全知识 * 删除特定人物或敏感概念

By Ne0inhk

OpenClaw 最新功能大揭秘!2026年最火开源AI Agent迎来史诗级升级,手机变身AI终端不是梦

OpenClaw 最新功能大揭秘!2026年最火开源AI Agent迎来史诗级升级,手机变身AI终端不是梦 大家好,我是Maynor。最近开源社区彻底炸锅了——OpenClaw(前身Clawdbot/Moltbot)又一次刷屏!这个能真正“干活”的本地AI助手,在3月2日刚刚发布v2026.3.1版本,紧接着2月底的v2026.2.26也是里程碑式更新。 从外部密钥管理、线程绑定Agent,到Android深度集成、WebSocket优先传输……OpenClaw正在把“AI常驻员工”从概念变成现实。 今天这篇图文并茂的干货,带你一口气看懂最新功能、安装上手和实战价值!

By Ne0inhk

FPGA开发必看:vivado除法器ip核定点击除法教程

FPGA硬件除法不再难:手把手教你用透Vivado除法器IP核 你有没有遇到过这种情况?在FPGA里做个简单的 a / b 运算,结果综合工具报出几千个LUT的资源消耗,时序还跑不到50MHz?更离谱的是,明明只写了几行代码,生成的电路却像一座迷宫——这就是 手工实现除法 带来的典型痛点。 其实,Xilinx Vivado早就为你准备了“标准答案”: Divider Generator IP核 。它不是什么黑科技,却是每个FPGA工程师都该熟练掌握的基础武器。今天我们就抛开教科书式的讲解,从真实工程视角出发,带你真正搞懂这个看似简单、实则暗藏玄机的IP核。 为什么别再自己写除法状态机了? 先来看一组对比: 维度 自己写的除法模块 Vivado Divider IP 开发时间 3天(含调试) 10分钟(GUI配置+例化) 最高工作频率 ~60MHz(16位) >200MHz(流水线模式) 资源利用率 高且不可预测 可控,

By Ne0inhk