G1
编程与工程
IsaacLab
训练配置
G1-23dof Following 目标跟随任务配置规范
2026-04-12
·
4 min read
G1-23dof Following 目标跟随任务配置规范
文档版本:V1.0
机器人平台:Unitree G1-23dof
仿真框架:IsaacLab 2.3.0 + IsaacSim 5.1.0
训练算法:RSL-RL PPO
编写日期:2026-04-12
任务标识:Unitree-G1-23dof-Following
相关文档:G1-23dof Velocity 任务训练配置规范
1. 任务概述
1.1 任务目标
Following 任务是 G1-23dof 机器人的目标跟随任务,目标为:
跟踪视野中的红色球体目标,保持 0.5~1.0m 的安全距离并始终面向目标。
Phase 1 使用静态目标(目标固定不动),后续可扩展为动态目标。
1.2 与 Velocity 任务的本质差异
| 维度 | Velocity | Following |
|---|---|---|
| 控制目标 | 跟踪指令速度 $(v_x, v_y, \omega_z)$ | 跟踪空间目标位置 |
| 状态表示 | 速度向量 | 极坐标(距离 + 朝向角) |
| 奖励来源 | 速度误差 | 距离误差 + 朝向误差 |
| 终止条件 | 高度/倾斜超时 | 高度/倾斜超时 + 目标过远/碰撞 |
1.3 任务特性
| 特性 | 说明 |
|---|---|
| 任务类型 | 目标跟踪(Target Following) |
| 地形 | 平地(flat only,Phase 1) |
| 目标物体 | 红色球体(半径 0.15m,静态) |
| 目标距离 | 0.5~1.0m(期望 0.75m) |
| Episode 长度 | 20 秒 |
2. 场景配置
2.1 目标物体配置
target = RigidObjectCfg(
prim_path="{ENV_REGEX_NS}/Target",
spawn=sim_utils.SphereCfg(
radius=0.15, # 球体半径 15cm
visual_material=PreviewSurfaceCfg(
diffuse_color=(1.0, 0.2, 0.2) # 红色球体
),
rigid_props=RigidBodyPropertiesCfg(
kinematic_enabled=True, # Kinematic 物体
disable_gravity=True,
),
collision_props=CollisionPropertiesCfg(
collision_enabled=True,
),
),
init_state=RigidObjectCfg.InitialStateCfg(
pos=(2.0, 0.0, 0.5), # 初始位置:前方 2m,高度 0.5m
),
)
2.2 地形配置
Phase 1 使用纯平地(与 Velocity 的混合地形不同):
COBBLESTONE_ROAD_CFG = TerrainGeneratorCfg(
sub_terrains={
"flat": MeshPlaneTerrainCfg(proportion=1.0), # 100% 平地
},
)
3. 目标命令设计
3.1 TargetFollowingCommand
Following 使用专用的 TargetFollowingCommand 而非 Velocity 命令:
target_following = mdp.TargetFollowingCommandCfg(
target_name="target",
desired_distance=0.75, # 期望距离 0.75m(在 0.5~1.0m 范围中间)
max_lin_vel=1.0, # 最大线速度 1.0 m/s
max_ang_vel=0.5, # 最大角速度 0.5 rad/s
k_p=1.5, # 线速度 P 控制增益
k_yaw=2.0, # 偏航角速度 P 控制增益
)
3.2 命令生成逻辑
# 内部机制:将目标位置转换为速度命令
# 1. 计算当前机器人到目标的距离 d 和朝向角 θ
# 2. 若 d > desired_distance:生成朝目标的前进命令
# 3. 若 d < desired_distance:生成后退命令
# 4. 若机器人不面向目标:生成转向命令
# 效果:机器人自动调节速度,保持期望距离并面向目标
4. 观测空间
4.1 Policy 观测(84D)
Following 在 Velocity 78D 基础上新增 6D 目标感知观测:
| 观测项 | 维度 | 类型 | 说明 |
|---|---|---|---|
base_ang_vel |
3D | 本体 | 基座角速度 |
projected_gravity |
3D | 本体 | 重力投影 |
velocity_commands |
3D | 目标 | 生成的跟踪命令(距离+朝向控制) |
joint_pos_rel |
23D | 本体 | 关节位置 |
joint_vel_rel |
23D | 本体 | 关节速度 |
last_action |
23D | 本体 | 上一步动作 |
target_relative_pos_normalized |
3D | 目标 | 归一化相对位置 $(x,y,z)/max_dist$ |
target_distance_normalized |
1D | 目标 | 归一化距离 $d / 5.0m$ |
target_heading_sin_cos |
2D | 目标 | 朝向角 $\sin(\theta), \cos(\theta)$ |
总计:78D + 6D = 84D
4.2 Critic 观测(93D)
| 额外项 | 维度 | 类型 | 说明 |
|---|---|---|---|
base_lin_vel |
3D | 特权 | 真值线速度 |
target_relative_pos |
3D | 目标 | 原始相对位置(无归一化) |
target_distance |
1D | 目标 | 原始距离 |
target_heading |
1D | 目标 | 原始朝向角 |
Critic 总计:78D + 3D + 3D + 1D + 1D = 93D
4.3 观测归一化设计
目标相关观测使用归一化 + 三角编码,避免周期性边界问题:
| 原始值 | 编码方式 | 输出范围 | 优势 |
|---|---|---|---|
| 距离 $d \in [0, 5]$ | $d / 5.0$ | $[0, 1]$ | 有界输入 |
| 朝向角 $\theta \in [-\pi, \pi]$ | $[\sin(\theta), \cos(\theta)]$ | $[-1, 1]^2$ | 连续无突变 |
5. 奖励函数设计
5.1 Following 专项奖励
| 奖励项 | 权重 | 函数 | 物理意义 |
|---|---|---|---|
track_lin_vel_xy |
1.0 | track_lin_vel_xy_yaw_frame_exp |
跟踪由目标位置生成的线速度命令 |
track_ang_vel_z |
0.5 | track_ang_vel_z_exp |
跟踪偏航角速度命令 |
track_distance |
2.0 | track_target_distance |
保持在 0.75m 期望距离 |
track_heading |
1.0 | track_target_heading |
始终面向目标 |
5.2 Following 与 Velocity 奖励对比
| 奖励项 | Velocity | Following | 差异 |
|---|---|---|---|
track_lin_vel_xy |
1.0 | 1.0 | 相同 |
track_ang_vel_z |
0.5 | 0.5 | 相同 |
track_distance |
— | 2.0 | Following 独有,距离控制是核心 |
track_heading |
— | 1.0 | Following 独有,面向目标是安全要求 |
alive |
0.15 | 0.15 | 相同 |
gait |
0.5 | 0.5 | 相同 |
feet_clearance |
1.0 | 1.0 | 相同 |
5.3 核心奖励项详解
track_target_distance
def track_target_distance(env, target_name, desired_distance=0.75, std=0.25):
# 当前距离
current_distance = norm(robot.pos - target.pos)
# 使用指数误差奖励
error = current_distance - desired_distance
reward = exp(-error² / (2 × std²))
# 最佳情况:distance = 0.75m,reward = 1.0
# 0.5m 或 1.0m:reward ≈ 0.45
# 0.25m 或 1.25m:reward ≈ 0.04
track_target_heading
def track_target_heading(env, target_name, std=0.5):
# 计算偏航角误差(机器人朝向 vs 目标方向)
error = yaw_robot - atan2(target.y, target.x)
reward = exp(-error² / (2 × std²))
# 最佳情况:完全面向目标,reward = 1.0
6. 终止条件
6.1 标准终止(与 Velocity 相同)
| 终止项 | 触发条件 |
|---|---|
time_out |
Episode 达到 20 秒 |
base_height < 0.2m |
机器人摔倒 |
bad_orientation > 0.8rad |
机器人严重倾斜 |
6.2 Following 专项终止
| 终止项 | 触发条件 | 原因 |
|---|---|---|
target_too_far |
目标距离 > 5.0m | 目标丢失,需重置 |
target_collision |
目标距离 < 0.3m | 与目标碰撞,需后退 |
7. 事件随机化
7.1 目标重置
reset_target = EventTerm(
func=mdp.reset_object_pose_uniform,
mode="reset",
params={
"asset_cfg": SceneEntityCfg("target"),
"pose_range": {
"x": (1.0, 3.0), # 前方 1~3m
"y": (-1.5, 1.5), # 左右 1.5m
"z": (0.4, 0.6), # 高度 0.4~0.6m
},
},
)
7.2 与 Velocity 的差异
| 事件 | Following | Velocity |
|---|---|---|
| 目标重置 | 每 episode 随机目标位置 | 无 |
| 地形 | 仅平地 | 混合地形 |
| 推送干扰 | 每 5s 随机水平力 | 每 5s 随机水平力 |
8. 训练命令
# Following 训练
./unitree_rl_lab.sh -t --task Unitree-G1-23dof-Following --num_envs 4096 --max_iterations 50000 --headless
# Following 推理
./unitree_rl_lab.sh -p --task Unitree-G1-23dof-Following
9. 扩展方向
9.1 Phase 2:动态目标
# 目标运动模式
target.velocity_range = {
"x": (-0.5, 0.5), # 目标水平速度
"y": (-0.3, 0.3),
}
9.2 Phase 3:多目标 / 移动障碍
# 场景中增加多个目标或障碍物
# 策略需学会选择和避障
版本记录
| 版本 | 日期 | 修改内容 | 作者 |
|---|---|---|---|
| V1.0 | 2026-04-12 | 初始版本,Following 完整配置规范 | AI Assistant |
本文档由 AI 辅助整理自 unitree_lab_locomotion 仓库源码