跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

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

综述由AI生成0\. 前言 人形机器人的运动控制一直是机器人领域的重要挑战,而强化学习为解决这一问题提供了强有力的工具。本教程将基于宇树G1人形机器人,从基础的强化学习环境搭建开始,逐步深入到高自由度模型的训练配置、奖励函数设计与优化,最终实现复杂动作的训练控制。作者看到一个很棒的系列,所以针对性的对文章内容进行了整理和二次理解,方便大家更好的阅读《不同自由度的宇树G1机器人强化学习训练配置及运行实战 + RS…

指针猎手发布于 2026/4/6更新于 2026/5/2390K 浏览
宇树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  legged_gym...  H1_2RoughCfg, H1_2RoughCfgPPO  legged_gym...  H1_2Robot  legged_gym...  G1RoughCfg, G1RoughCfgPPO  legged_gym...  G1Robot ..    legged_gym..  task_registry # 任务注册 task_registry.(, , (), ()) task_registry.(, H1Robot, (), ()) task_registry.(, H1_2Robot, (), ()) task_registry.(, G1Robot, (), ())
from
envs
h1_2
h1_2_config
import
from
envs
h1_2
h1_2_env
import
from
envs
g1
g1_config
import
from
envs
g1
g1_env
import
from
base
legged_robot
import
LeggedRobot
from
utils
task_registry
import
register
"go2"
LeggedRobot
GO2RoughCfg
GO2RoughCfgPPO
register
"h1"
H1RoughCfg
H1RoughCfgPPO
register
"h1_2"
H1_2RoughCfg
H1_2RoughCfgPPO
register
"g1"
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)

奖励函数分类图

…详情请参照古月居

目录

  1. 0\. 前言
  2. 1\. 强化学习训练环境配置
  3. 1.1 基础环境搭建
  4. 1.2 G1机器人12自由度配置解析
  5. 2\. 扩展到23自由度模型
  6. 2.1 高自由度模型的挑战
  7. 2.2 创建23自由度配置
  8. 2.3 观测维度的重新计算
  9. 2.4 控制参数配置
  10. 2.5 资源文件更新
  11. 3\. 奖励函数架构深度解析
  12. 3.1 奖励函数的核心作用
  13. 3.2 G1机器人奖励函数配置详解
  14. 3.3 奖励函数的初始化机制
  15. 3.4 奖励计算的执行机制
  16. 3.5 核心奖励函数解析
  17. …详情请参照古月居
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 Django 与 Vue 的红色旅游网站设计与实现
  • TrendRadar 本地部署:打造个人专属 AI 热点情报系统
  • MongoDB 数据备份与恢复实战指南
  • MySQL 数据库核心操作:创建、配置与备份实战
  • 基于深度学习的智能害虫识别系统
  • 使用 Dexie 操作前端 IndexedDB 数据库教程
  • 斯坦福 2025 AI Index Report 深度解读:技术扩散与产业变革
  • Wan2.2-T2V-A14B 模型下载与部署指南
  • OpenClaw 本地部署实战:从零搭建可控 AI Agent 框架
  • 基于 OpenClaw、LMStudio 和飞书搭建本地离线 AI 助手
  • Z-Image-Turbo 与 Stable Diffusion 实测对比
  • 鸿蒙金融理财全栈项目:基础架构、数据安全与用户体验
  • 扩散模型技术演进:从DDPM到Stable Diffusion再到DiT
  • Vivado 2020.2 安装教程:FPGA 开发环境搭建指南
  • LLaMaFactory 基于魔搭社区免费 GPU 微调大模型实战
  • OmniSteward:基于大语言模型的智能语音管家系统
  • BK7258 与 LiveKit WebRTC 端侧适配实战
  • VR-Reversal 工具使用指南:3D 视频转 2D 及视角控制
  • OmniSteward:基于 LLM Agent 的智能家居与电脑控制助手
  • 企业实战中的 WebSocket 应用场景

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online