宇树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

国内如何升级GitHub Copilot到专业版

国内如何升级GitHub Copilot到专业版

国内外的AI编程工具我用过很多,用的时间比较长的是Cursor,后来Cursor在国内不能用了,就又回去试了一下GitHub Copilot,结果被惊艳到了,在VS Code里用起来很丝滑,体验很好,感觉VS Code团队在AI编程这块上真是下功夫了,现在其体验已经不输Cursor。 我一直是VS Code的粉丝,感觉还是原生的VS Code用起来最舒服,现在VS Code里的Copilot体验已经做的很好,就没有理由再用其他替代编辑器了。 VS Code里的Copilot每月有一定的免费额度,用完之后就需要开通专业版才能继续使用。我用完免费额度之后,已经被其良好的体验所打动,就想升级到专业版,但是如何付费成了问题。在网上搜了一下,说是国内的信用卡不能用,而之前好用的wildcard虚拟信用卡服务现在也停了,试了一下网友推荐的胡桃卡,试了好几次也没有支付成功,还被扣了很多手续费。 现在还有什么方式能支付升级到copilot专业版呢? 后来发现GitHub Copilot升级页面上的支付方式那里也支持paypal,就在Payment method那里,credit card旁边有

AR眼镜光学镜头设计实例(含核心技巧解析)

AR眼镜光学镜头设计实例(含核心技巧解析)

AR眼镜光学镜头设计实例(含核心技巧解析) 一、应用领域 聚焦AR全场景交互需求,核心服务于消费级AR眼镜(需虚实画面叠加、轻量化佩戴)、工业AR(需远程协作标注、设备维修指引)、医疗AR(需手术视野导航、解剖结构叠加),解决传统AR镜头“视场角窄、重影眩晕、光学效率低”的痛点。 二、设计规格(关键指标与实现逻辑) • 视场角(FOV):50°(对角) 采用“自由曲面+微显示适配”技巧,通过非对称自由曲面透镜(打破旋转对称限制),将微显示屏(0.7英寸Micro-OLED)的画面投射至人眼,实现50°对角视场,覆盖人眼自然视野的30%,避免“通过小窗口看世界”的局限,提升沉浸感。 • 眼动距(Eye Relief):20mm 运用“光路折叠设计”技巧,

如何打造自动化B站直播间:神奇弹幕机器人全功能指南

如何打造自动化B站直播间:神奇弹幕机器人全功能指南 【免费下载链接】Bilibili-MagicalDanmaku【神奇弹幕】哔哩哔哩直播万能场控机器人,弹幕姬+答谢姬+回复姬+点歌姬+各种小骚操作,目前唯一可编程机器人 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-MagicalDanmaku B站直播机器人"神奇弹幕"是一款集弹幕管理、自动答谢、智能点歌等功能于一体的可编程直播辅助工具。本指南将从核心功能解析、环境配置到高级应用,全面介绍如何利用这款工具提升直播效率和互动质量,帮助主播构建专业的自动化直播系统。 核心功能架构解析 直播间智能管理系统 神奇弹幕提供了一站式直播管理解决方案,通过直观的控制台界面实现对直播状态的全面掌控。系统采用模块化设计,将直播控制功能划分为基础设置、状态监控和快捷操作三大模块,满足不同场景下的操作需求。 管理系统核心功能包括: * 直播信息实时编辑(标题、封面、公告等) * 房间状态监控(人气值、弹幕量、在线观众) * 快捷开播与分区管理 * 直播数据一键导出

写给技术管理者的低代码手册系列文章(3)——第一部分:低代码诞生的背景【第二章】

写给技术管理者的低代码手册系列文章(3)——第一部分:低代码诞生的背景【第二章】

第二章 传统开发模式在规模化后的核心瓶颈 在高级语言诞生后的相当长一段时间内,行业普遍认为,只要语言不断演进、类库不断完善,软件开发效率就可以持续线性提升。然而,当企业软件进入中大型规模,并在真实组织环境中长期运行后,这一判断开始失效。问题并不主要出在语言本身,而是出在传统开发模式与企业软件现实约束之间的结构性错位。 2.1 企业软件开发的真实起点:小团队、不稳定需求 与互联网产品不同,大多数企业软件项目并非从“大规模系统”起步,而是从小团队、小范围需求开始演进的。一个典型的企业软件项目,往往具有以下特征: * 单个项目的开发人员规模较小,常见在3-5人以内:一个制造企业的生产排程系统,可能只有3名开发者,甚至没有专职的产品经理 * 需求来源复杂,往往来自业务部门的阶段性诉求:财务部门要求增加多币种支持,采购部门要求增加供应商评级,这些需求在对应系统的立项之初,往往没有统筹规划 * 需求本身不稳定,存在频繁调整、回滚和例外情况:一条审批规则可能因为组织架构调整而每季度修改一次 * 软件生命周期长,项目交付只是开始而非结束:许多企业软件会运行5-10年,期间经历数十次甚至