Franka 打开抽屉#
概述#
本文档详细描述了基于 Franka Emika Panda 机械臂的打开抽屉任务环境。
环境描述#
Franka 打开柜门任务环境基于真实的 Franka Emika Panda 7 自由度机械臂构建,旨在训练机器人接近柜门把手、抓取并拉开抽屉。
机器人结构#
Franka Emika Panda 是一个 7 自由度机械臂,由以下主要部分组成:
基座(Base):固定在地面上的机器人基座
7 个关节:
joint1 ~ joint4:肩部和臂部旋转关节
joint5 ~ joint7:手腕部旋转关节
夹爪(Gripper):双指夹爪,包含两个手指关节
finger_joint1:左指关节,带有接触垫(left_finger_pad)
finger_joint2:右指关节,带有接触垫(right_finger_pad)
末端执行器(TCP):夹爪中心点,用于抓取操作
环境物体#
柜子:包含一个可打开的抽屉
抽屉把手(drawer_top_handle):机器人需要抓取的目标部位
抽屉关节(drawer_top_joint):抽屉的滑动关节,1 个自由度
任务目标#
机器人需要完成以下操作目标:
接近把手:从初始位置移动到抽屉把手位置
姿态对齐:调整末端姿态与把手对齐
抓取把手:闭合夹爪抓取抽屉把手
拉开抽屉:向后拉动抽屉将其打开
动作空间#
动作空间为 Box(-inf, inf, (8,), float32),表示施加到 8 个关节的位置控制指令(相对于当前关节位置的偏移量)。
控制模式#
环境使用位置控制模式,动作通过以下方式转换为关节目标位置:
目标关节角度 = 当前关节角度 + 动作值
动作维度详细说明#
编号 |
动作说明 |
控制范围 |
对应关节名称 |
关节类型 |
|---|---|---|---|---|
0 |
关节 1 偏移量 |
-inf ~ inf |
joint1 |
revolve |
1 |
关节 2 偏移量 |
-inf ~ inf |
joint2 |
hinge |
2 |
关节 3 偏移量 |
-inf ~ inf |
joint3 |
hinge |
3 |
关节 4 偏移量 |
-inf ~ inf |
joint4 |
hinge |
4 |
关节 5 偏移量 |
-inf ~ inf |
joint5 |
hinge |
5 |
关节 6 偏移量 |
-inf ~ inf |
joint6 |
hinge |
6 |
关节 7 偏移量 |
-inf ~ inf |
joint7 |
hinge |
7 |
夹爪动作(概率) |
-inf ~ inf |
finger_joint* |
hinge |
夹爪控制#
夹爪动作使用概率控制:
Sigmoid 映射:将动作值映射到 [0, 1] 区间的概率
p = 1 / (1 + exp(-action))
伯努利采样:根据概率 p 进行随机采样
采样结果 < p:夹爪闭合(0.0)
采样结果 >= p:夹爪打开(0.04)
观测空间#
观测空间为 Box(-5, 5, (25,), float32),包含机器人的本体感知信息、任务相关信息和抽屉状态。
观测组成部分#
观测向量由以下部分组成(按顺序):
关节角度(8 维)
7 个机械臂关节角度(归一化到 [-1, 1])
归一化公式:
2 × (关节角度 - 下限) / (上限 - 下限) - 1
关节速度(8 维)
8 个关节的角速度(除以 2 进行缩放)
目标相对位姿(7 维)
位置偏差(3 维):把手位置 - 末端位置 [Δx, Δy, Δz]
姿态偏差(4 维):把手姿态 - 末端姿态(四元数)
抽屉关节位置(1 维)
抽屉当前打开距离
抽屉关节速度(1 维)
抽屉当前打开速度
观测详细说明#
编号 |
观测内容 |
维度 |
范围 |
单位 |
|---|---|---|---|---|
0-7 |
归一化关节角度(8 个关节) |
8 |
[-1, 1] |
无量纲 |
8-15 |
归一化关节速度(8 个关节) |
8 |
≈[-π/2, π/2] |
rad/s |
16-18 |
到把手的相对位置 |
3 |
[-5, 5] |
m |
19-22 |
到把手的相对姿态(四元数) |
4 |
[-5, 5] |
无量纲 |
23 |
抽屉关节位置 |
1 |
[-5, 5] |
m |
24 |
抽屉关节速度 |
1 |
[-5, 5] |
m/s |
所有观测值被裁剪在 [-5, 5] 范围内以保持数值稳定性。
奖励函数#
奖励函数采用复合设计,包含多个奖励和惩罚项。
主要奖励项#
距离奖励(权重:10)
计算公式:
10 × (1 - tanh(d_gripper_handle / 0.1))激励机器人末端接近抽屉把手
d_gripper_handle:末端到把手的欧氏距离
姿态匹配奖励
计算公式:四元数相似度函数
激励机器人末端姿态与把手姿态对齐
夹爪闭合奖励(条件奖励)
当距离 < 0.025m:闭合夹爪获得 +100 奖励
当距离 >= 0.025m:闭合夹爪获得 -20 惩罚
打开夹爪:无奖励(0)
激励机器人在接近时闭合夹爪抓取
打开抽屉奖励(指数奖励)
计算公式:
20 × (exp(open_dist) - 1)open_dist:抽屉打开距离(裁剪在 [0, 1] 范围)
随着抽屉打开程度增加,奖励指数增长
防止非法打开
当抽屉已打开(open_dist > 0)但末端未接触把手(距离 > 0.03m)时,取消打开奖励
防止机器人使用其他方式强行打开抽屉
惩罚项#
动作变化率惩罚
计算公式:
||current_action - last_action||²
关节速度惩罚
计算公式:
||joint_vel||²
手指位置穿透惩罚
当手指接触垫低于把手表面时施加惩罚
防止手指模型穿透抽屉
惩罚系数调度#
惩罚项系数随训练进度调整:
惩罚项 |
前期权重(steps < 8000) |
后期权重(steps >= 8000) |
|---|---|---|
动作变化率 |
1e-3 |
2e-3 |
关节速度平方和 |
0 |
2e-7 |
终止惩罚#
当触发终止条件时,额外施加 -10.0 惩罚。
初始状态#
机器人初始化#
位置初始化:
机器人在世界坐标系中的初始位置固定:
基座位置:固定在地面上
关节角度:设置为默认姿态
默认关节姿态:
[0.0, -30°, 0°, -156°, 0.0, 186°, -45°, 0.04, 0.04] (弧度)
关节角度噪声:
每个关节角度在 [-0.125, 0.125] 弧度范围内添加均匀随机噪声。
速度初始化:
所有线速度和角速度初始化为零。
柜子初始化#
柜子固定在地面上,抽屉处于关闭状态(关节位置为 0)。
使用方法#
训练#
uv run scripts/train.py --env franka-open-cabinet
策略评估#
uv run scripts/play.py --env franka-open-cabinet
TensorBoard#
uv run tensorboard --logdir runs/franka-open-cabinet