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

一分钟看完:深圳都有哪些机器人公司

1. 人形机器人与具身智能(当下最火,运控/LLM背景) 序号公司名称核心业务(10字内)公司地址(补齐与精确化)1优必选 (UBTECH)商业化双足人形机器人南山区学苑大道1001号南山智园 C1 栋2乐聚机器人 (Leju)人形机器人本体与算法南山区学苑大道1068号南山智园 C2 栋3众擎机器人 (EngineAI)通用人形与外骨骼电机南山区学苑大道1001号南山智园 (具体栋数在C区)4逐际动力 (LimX)动态双足/四足运控算法南山区南头街道前海华润金融中心 (研发中心)5星尘智能 (Astribot)绳驱 AI 机器人与灵巧手南山区打石一路深圳国际创新谷 6 栋6帕西尼感知 (PaXini)触觉传感器与人形手南山区粤海街道深圳湾科技生态园7自变量机器人 (X Square)端到端具身智能大模型南山区西丽街道万科云城8数字华夏康养与文旅服务人形机器人南山区西丽街道留仙大道创智云城9跨维智能 (DexForce)三维视觉与具身操作大模型南山区粤海街道软件产业基地10腾讯 Robotics X实验室前沿轮足与灵巧手南山区粤海街道腾讯滨海大厦/朗科大厦11易择智擎VLA 具身

FLUX.1-dev与Stable Diffusion对比评测:图像质量与生成速度

FLUX.1-dev与Stable Diffusion对比评测:图像质量与生成速度 作为一名长期关注AI图像生成技术的开发者,我一直在寻找能够在质量和速度之间取得最佳平衡的解决方案。最近,Black Forest Labs开源的FLUX.1-dev模型引起了我的注意,特别是它声称能够在消费级硬件上运行,同时保持出色的图像质量。 今天我将通过实际测试,从图像细节、风格控制、生成速度等多个维度,对比FLUX.1-dev与大家熟悉的Stable Diffusion,看看这两个模型在实际使用中究竟表现如何。 1. 测试环境与方法 为了确保对比的公平性,我搭建了统一的测试环境。使用NVIDIA RTX 4090显卡,24GB显存,Intel i9-13900K处理器,64GB DDR5内存。操作系统为Ubuntu 22.04,所有测试都在相同的硬件和软件环境下进行。 测试方法包括定量评估和定性分析。定量方面主要测量生成速度、内存占用等硬性指标;定性方面则通过同一组提示词生成图像,从视觉质量、细节表现、风格一致性等角度进行对比。 我选择了50组涵盖不同场景的提示词,包括人物肖像、风景

FPGA AD7606串行驱动与并行驱动

FPGA AD7606串行驱动与并行驱动

AD7606是一个八通道16分辨率的adc,有两种测量范围5v和10v,每个通道采样率最高200ksps,支持多种驱动方案,最常用的有串行方案与并行方案,其中串行方案采用spi协议进行数据传输,可以在io引脚不够用的情况下采用,而并行方案采用16个io在一个采样边沿同时接收一次采样数据。 首先介绍ad7606的内部结构 内部主要部分有四个模块,模块1是在每个通道处添加了2阶巴特沃斯模拟低通滤波器,用来抗混叠,其截止频率受电压测量范围影响,当范围为5v时截止频率15khz,10v时23khz 因此在使用ad7606测量截止频率以上的信号时,需要在前方加入仪表放大器来放大信号,否则信号会被ad7606滤除 模块2用来控制复位、测量范围、通道转换,range为0时测量范围0~5v,1时测量范围0~10v,通道转换是指八个通道可分为两组,A组包含0~3通道,B组包含4~7通道,转换的意思就是在adc内部进行模拟量向数字量的转换,转换需要消耗一定的时间,而要指定那组通道转换则受convst信号影响,convst A信号拉高会让A组转换,convst B拉高会让B组转换,一般convst

图谱驱动大模型智能体普惠时代:Neo4j Aura Agent正式全面上线

图谱驱动大模型智能体普惠时代:Neo4j Aura Agent正式全面上线

摘要: Neo4j Aura Agent正式商用,基于知识图谱的智能体构建平台实现分钟级部署,重塑企业AI应用开发范式。 往期推荐 [290页电子书]打造企业级知识图谱的实战手册,Neo4j 首席科学家力作!从图数据库基础到图原生机器学习 [550页电子书]2025年10月最新出版-知识图谱与大语言模型融合的实战指南:KG&LLM in Action [30页电子书]GraphRAG开发者指南 [180页电子书]GraphRAG全面解析及实践-Neo4j:构建准确、可解释、具有上下文意识的生成式人工智能应用 [140页]Neo4j GraphRAG白皮书 引言 在AI智能体(Agentic AI)市场快速扩张的当下,Neo4j宣布其开创性的智能体创建平台——Neo4j Aura Agent正式进入全面可用阶段,并在2026年2月全月提供免费使用。这一平台为AuraDB客户带来了革命性的体验:只需几分钟即可构建和部署基于知识图谱的智能体,并配备强大的新功能——包括基于本体的自动化智能体构建,以及一键部署到安全托管的MCP服务器。 智能体AI不仅仅是制造巨大的市