双关节机械臂控制#
双关节机械臂(Reacher)是 DeepMind Control Suite 中的经典操作任务。其目标是训练一个由两段连杆组成的机械臂,通过控制关节力矩,使末端执行器(fingertip)尽可能靠近随机生成的目标点。
任务描述#
Reacher 是一个二维平面内的双关节机械臂控制任务。由两个通过铰链关节(hinge)连接的连杆组成,拥有 2 个受控关节(joint0 根部关节、joint1 中间关节),智能体通过向这些关节施加扭矩作为动作,使机械臂末端移动到目标点位置。目标点在每个 episode 初始化时随机采样。
动作空间(Action Space)#
项目 |
详细信息 |
|---|---|
类型 |
|
维度 |
2 |
动作对应如下:
序号 |
动作含义(施加在关节的力矩) |
最小值 |
最大值 |
对应 XML 中名称 |
|---|---|---|---|---|
0 |
根部关节驱动扭矩 |
-1 |
1 |
|
1 |
中间关节驱动扭矩 |
-1 |
1 |
|
观察空间#
项目 |
详细信息 |
|---|---|
类型 |
|
维度 |
6 |
Reacher 环境的观测空间由以下部分组成(按顺序):
部分 |
内容说明 |
维度 |
备注 |
|---|---|---|---|
qpos |
2 个关节角度 |
2 |
关节位置信息 |
fingertip → target |
末端到目标的向量差值 |
2 |
x、y 两维 |
qvel |
2 个关节角速度 |
2 |
关节速度信息 |
序号 |
观察量 |
最小值 |
最大值 |
XML 名称 |
关节 |
类型 (单位) |
|---|---|---|---|---|---|---|
0 |
第一个关节角度 |
-Inf |
Inf |
joint0_pos |
hinge |
角度 (rad) |
1 |
第二个关节角度 |
-Inf |
Inf |
joint1_pos |
hinge |
角度 (rad) |
2 |
fingertip - target 的 x 差值 |
-Inf |
Inf |
NA |
slide |
位置 (m) |
3 |
fingertip - target 的 y 差值 |
-Inf |
Inf |
NA |
slide |
位置 (m) |
4 |
第一个关节角速度 |
-Inf |
Inf |
joint0_vel |
hinge |
角速度 (rad/s) |
5 |
第二个关节角速度 |
-Inf |
Inf |
joint1_vel |
hinge |
角速度 (rad/s) |
奖励函数设计#
reacher 的奖励函数基于指尖与目标的距离:
# 距离奖励:指尖越接近目标,奖励越高
reward = tolerance(|| fingertip - target ||)
# 其中 tolerance 是一个单调递减函数
# 距离为 0 时奖励最大,距离越大奖励越小
初始状态#
初始状态通过随机分布采样:
手臂角度:均匀分布
手臂角速度:小范围随机值
目标点位置:随机一个圆形区域
Episode 终止条件#
若观测中出现
NaN值则终止
使用指南#
1. 环境预览#
uv run scripts/view.py --env dm-reacher
2. 开始训练#
uv run scripts/train.py --env dm-reacher
3. 查看训练进度#
uv run tensorboard --logdir runs/dm-reacher
4. 测试训练结果#
uv run scripts/play.py --env dm-reacher
预期训练结果#
机械臂迅速精准触达目标
末端与目标的平均距离小于 0.01 米
动作平滑,无震荡