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

汇川机器人软件RobotLab常规操作

汇川机器人软件RobotLab常规操作

一.权限管理注意事项 1.1 软件登录权限管理 连接上软件后,修改轴参数、点位数据需要权限。点击人物图标,登录对应的权限,管理员权限登录密码6个0。 1.2机器人控制权限管理 点击“锁”,打开机器人控制权配置页面。 选择“InoRoboLabt”,机器人受编程软件控制,使用软件可手动移动点位、示教位置信息。 选择“远程IO单元”,机器人受外部设备控制如PLC、上位机,机器人进入自动模式,收到交互信号就按照程序执行。 选择“远程以太网客户端”,机器人受远程客户短控制,用于查找问题、远程调试。 二、 使用过渡点注意事项 程序中点到点直线运动会有机构干涉或有安全风险时,使用过渡点在运动规避风险。 使用过渡点时,注意指令的工具坐标系,选择正确的Wobj工具好,否则运动出错有撞机风险。 如下图所示为例,wobj0为A工位,wobj1为B工位,注意在“轴控制面板”中选择对应工具坐标号 三、使用全局点位移动注意事项 双击左侧“P.

【无人机】无人机路径规划算法

【无人机】无人机路径规划算法

目录 一、引言:无人机与路径规划算法 二、路径规划算法基础 (一)定义与重要性 (二)规划目标与约束条件 三、常见路径规划算法详解 (一)A * 算法 (二)Dijkstra 算法 (三)RRT(快速扩展随机树)算法 (四)蚁群算法 四、算法应用实例与效果展示 (一)不同场景下的算法应用 (二)算法性能对比数据 五、算法的优化与发展趋势 (一)现有算法的优化策略 (二)结合新技术的发展方向 六、挑战与展望 (一)面临的技术挑战 (二)未来应用前景 七、结论 一、引言:无人机与路径规划算法 在科技飞速发展的今天,无人机作为一种极具创新性的技术产物,已深度融入我们生活的方方面面,

基于2-RSS-1U的双足机器人并联踝关节分析与实现

基于2-RSS-1U的双足机器人并联踝关节分析与实现

"当你的机器人开始像人类一样思考如何走路时,你会发现,原来最复杂的不是大脑,而是脚踝。"这句话在机器人学界越来越成为共识。论文ASAP中的研究也证实,在sim2real中,偏差最大的正是踝关节控制。 参考文献:On the Comprehensive Kinematics Analysis of a Humanoid Parallel Ankle Mechanism 结构变体:Structural design and motion analysis of parallel ankle joints for humanoid robots 脚踝革命:深入解析人形机器人高性能并联踝关节 传统的单轴踝关节设计,就像给机器人穿了一双"高跟鞋"——虽然能走,但走得很僵硬,很危险。我们需要的是像人类脚踝一样的灵活性:既能前后摆动(pitch),又能左右倾斜(roll)

(10-1)大模型时代的人形机器人感知:视觉-语言模型在机器人中的应用

(10-1)大模型时代的人形机器人感知:视觉-语言模型在机器人中的应用

本章内容聚焦大模型时代人形机器人的感知体系升级,系统介绍了视觉—语言模型、多模态Transformer与3D大模型在机器人中的核心作用,详细讲解了文本、视觉、点云与语音等信息的语义对齐与融合机制,介绍了从语言指令到视觉目标的Grounding、任务分解与意图理解方法,并通过闭环感知与决策联动,展示了大模型支撑机器人在复杂真实场景中的理解、规划与实时行动的用法。 10.1  视觉-语言模型在机器人中的应用 视觉—语言模型(Vision-Language Model,VLM)通过统一建模视觉与自然语言,使机器人具备“看懂并理解语言”的能力,是大模型时代机器人感知与认知融合的核心技术。VLM不仅能够完成图像识别、目标检测等传统感知任务,还可以直接理解语言指令、进行语义推理,并将高层语义映射为可执行的感知与行动目标,在人形机器人中广泛应用于交互理解、场景认知和任务执行等环节。 10.1.1  CLIP/BLIP/Flamingo等模型简介 随着大规模多模态数据与Transformer架构的发展,视觉—语言模型逐渐从“跨模态对齐”演进为“多模态理解与推理”。CLIP、BLIP与Flam