乒乓球颠球#
使用单臂机器人控制挡板颠球,实现连续弹跳并保持球在目标位置。
任务描述#
Bounce Ball 是一个单臂机器人操作任务,使用 6 自由度的配天 AIR4-560 工业机械臂控制末端挡板(球拍)的位置。智能体通过控制机械臂 6 个关节的位置变化作为动作,使乒乓球在挡板上持续弹跳,并尽可能将球保持在目标高度和目标水平位置。
动作空间(Action Space)#
项目 |
详细信息 |
|---|---|
类型 |
|
维度 |
6 |
关节对应如下:
序号 |
动作含义(关节位置变化) |
最小值 |
最大值 |
对应 XML 中名称 |
|---|---|---|---|---|
0 |
Joint1(基座旋转)位置变化 |
-1 |
1 |
|
1 |
Joint2(大臂)位置变化 |
-1 |
1 |
|
2 |
Joint3(小臂)位置变化 |
-1 |
1 |
|
3 |
Joint4(手腕旋转)位置变化 |
-1 |
1 |
|
4 |
Joint5(手腕俯仰)位置变化 |
-1 |
1 |
|
5 |
Joint6(手腕旋转)位置变化 |
-1 |
1 |
|
观察空间#
项目 |
详细信息 |
|---|---|
类型 |
|
维度 |
29 |
观察空间由以下部分组成(按顺序):
部分 |
内容说明 |
维度 |
备注 |
|---|---|---|---|
dof_pos |
各关节自由度位置信息 |
13 |
前 6 个为机械臂关节,后 7 个为球的自由关节(3 位置 + 4 四元数) |
dof_vel |
各关节自由度速度信息 |
12 |
速度为位置导数 |
paddle_pos |
挡板位置信息 |
3 |
挡板中心的 x, y, z 坐标 |
target_height |
目标高度 |
1 |
当前环境的目标高度 |
序号 |
观察量 |
最小值 |
最大值 |
XML 名称 |
类型 (单位) |
|---|---|---|---|---|---|
0-5 |
机械臂关节角度 |
-Inf |
Inf |
Joint1-6 |
角度 (rad) |
6-8 |
球位置 [x, y, z] |
-Inf |
Inf |
ball_link |
位置 (m) |
9-12 |
球姿态四元数 [w,x,y,z] |
-Inf |
Inf |
ball_link |
四元数 |
13-18 |
机械臂关节角速度 |
-Inf |
Inf |
Joint1-6 |
角速度 (rad/s) |
19-24 |
球速度 [vx,vy,vz,wx,wy,wz] |
-Inf |
Inf |
ball_link |
速度 (m/s, rad/s) |
25-27 |
挡板位置 [x, y, z] |
-Inf |
Inf |
blocker |
位置 (m) |
28 |
目标高度 |
-Inf |
Inf |
- |
位置 (m) |
奖励函数#
奖励函数采用复合设计,包含多个奖励和惩罚项,引导机器人学习稳定的颠球策略。所有奖励参数可通过配置文件调整。
主要奖励项#
1. 水平位置奖励#
设计意义:这是最核心的奖励项,确保球始终保持在挡板正上方。通过垂直距离加权机制,当球接近挡板时(即将击打时刻)对水平位置的要求更严格,引导策略在关键时刻精确对齐。
计算公式:
权重:2.0
2. 位置偏离惩罚#
设计意义:对严重偏离目标位置的情况施加强惩罚,防止球飞出控制范围。使用 sigmoid 函数实现平滑过渡,避免奖励函数不连续。
计算公式:
权重:1.0
3. 速度匹配奖励#
设计意义:基于抛体运动物理规律,激励球的运动轨迹能够在目标高度时具有期望的速度(0.5 m/s)。这确保球不会过快或过慢地通过目标高度,有利于稳定控制。
计算公式:
权重:2.0
4. 高度奖励#
设计意义:直接激励球接近目标高度,这是任务的核心目标之一。较高的权重(4.5)确保策略优先考虑高度控制。目标高度在每个环境中随机采样(0.3-0.6 m),提升策略的泛化能力。
计算公式:
权重:4.5
5. 高度进步奖励#
设计意义:激励球达到更高位置,帮助策略在训练初期快速学会向上击打球,避免陷入”不击打”的局部最优。
计算公式:
权重:1.0
6. 受控向上速度奖励#
设计意义:只有当球水平位置良好时才奖励向上速度,避免”乱打”行为。理想速度根据物理公式计算,确保球能恰好达到目标高度。这个奖励引导策略学习精确的击打力度。
计算公式:
权重:1.5
7. 连续弹跳奖励#
设计意义:激励多次连续成功弹跳,引导策略学习稳定的长期控制。使用对数函数避免奖励无限增长,同时要求球位置良好才给予奖励。
计算公式:
权重:0.8
8. 高弹跳次数奖励#
设计意义:对高弹跳次数(≥3 次)给予额外奖励,进一步激励长期稳定控制。使用 sigmoid 激活函数使奖励平滑增长。
计算公式:
权重:0.3
9. 挡板-球水平对齐奖励#
设计意义:激励挡板主动移动到球的正下方,而不是等待球落下。垂直距离越近权重越大,在即将击打时刻要求更精确的对齐。弹跳时刻给予额外奖励(boost),强化正确的击打行为。
计算公式:
权重:0.6
10. 挡板原位奖励#
设计意义:激励挡板在球远离时回到原位(home position),避免挡板长时间停留在高位。使用距离动态因子:当球远离挡板时(\(d_{vert} > 0.15\) m)增大奖励,鼓励挡板快速回位;当球接近时减小奖励,允许挡板上移准备击打。这种设计使挡板运动更加节能和自然。
计算公式:
权重:1.5
惩罚项#
1. 过高向上速度惩罚#
设计意义:防止球速度过快(>3.5 m/s)失去控制,确保球的运动在可控范围内。
计算公式:
权重:1.0
2. 向下速度惩罚#
设计意义:惩罚球向下运动(\(v_z < -0.2\) m/s),激励策略及时击打球,避免球自由下落。
计算公式:
权重:1.0
3. 挡板高度违规惩罚#
设计意义:对挡板偏离原位过远(>0.1 m)施加强惩罚,确保挡板不会长时间停留在高位。
计算公式:
权重:1.0
4. 动作变化率惩罚#
设计意义:惩罚动作的剧烈变化,鼓励平滑的控制策略。
计算公式:
权重:\(10^{-4}\)
5. 关节速度惩罚#
设计意义:惩罚过高的关节速度,鼓励节能和平滑的运动。
计算公式:
权重:\(10^{-4}\)
总奖励计算#
Episode 终止条件#
球掉落:球的 z 坐标 < 0.05m(接近地面)
球过高:球的 z 坐标 > 目标高度 + 1.0m(失去控制)
水平偏离过远:球的 x 或 y 坐标绝对值 > 1.5m
关节速度过高:任一关节角速度 > 2π rad/s(360°/s)
超时:Episode 时长超过最大允许时间
初始状态#
机器人初始化#
关节角度:
默认角度:[0°, 40°, 110°, 0°, -60°, 0°]
随机噪声:每个关节在 [-0.1, 0.1] 弧度范围内添加均匀随机噪声
关节速度:
初始化为零,带有小幅随机噪声
球初始化#
位置:
基准位置:配置文件中的
ball_init_pos(默认 [0.58856, 0, 0.45] m)随机噪声:在 [-0.01, 0.01] m 范围内添加均匀随机噪声
速度:
初始化为零
姿态:
四元数:[0, 0, 0, 1](单位四元数,无旋转)
目标高度#
每个环境的目标高度在 [0.4, 0.6] m 范围内随机采样,提升策略的泛化能力。
使用指南#
1. 环境预览#
uv run scripts/view.py --env bounce_ball
2. 开始训练#
uv run scripts/train.py --env bounce_ball
3. 查看训练进度#
uv run tensorboard --logdir runs/bounce_ball
4. 测试训练结果#
uv run scripts/play.py --env bounce_ball
预期训练结果#
连续弹跳:能够实现 3 次以上的连续弹跳
位置控制:球的水平位置稳定在目标位置 ± 0.05m 范围内
高度控制:球的高度稳定在目标高度 ± 0.1m 范围内
速度控制:球的向上速度保持在合理范围(0.1-1.5 m/s)内
稳定控制:能够持续 20 秒的稳定颠球而不触发终止条件
已知问题#
JAX 后端训练效果不佳:当前 JAX 版本的训练效果不理想。建议使用 PyTorch 后端进行该环境的训练以获得更好的效果。