集成同源 BYOK 会话隔离、精简模型设置、官方订阅入口和 HTTPS 发布运维;保留本地训练/调参与控制能力。同步 npm 版本及 CHANGELOG,记录公网真实 API 验收仍待用户凭据。
6.7 KiB
移动操作 v2:先接近,再抓放
为什么不直接继续原来的策略
- v1 把动作映射到关节全行程的绝对位置;50 Hz 下可产生数弧度的位置目标跳变。v2 使用带速度/加速度约束的积分位置目标。
- Bundle 转换后关节层遗留的
actuatorfrcrange="-1 1"覆盖了配方中舵机的 ±8 N·m 限力,导致保持姿态也会下垂、碰撞。现在关节和执行器限力一致。这是仿真配方修正,不是实机扭矩标定,也不修改源 URDF。 - 单纯跑通 PPO→ONNX 不等于任务学会。现在独立评估成功率、关节速度峰值、安全终止次数都写入
deployment.json,完整逐回合结果保存为evaluation.json。
设计参考本机 IsaacLab 的 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/:
config/franka/joint_pos_env_cfg.py:缩放的位置动作,而非全关节行程跳变。reach_env_cfg.py:分开的动作/观测/奖励/终止定义,动作变化率、关节速度惩罚和课程设计。config/franka/agents/rsl_rl_ppo_cfg.py:有界 PPO 更新与 MLP 策略。
这里借鉴结构和训练原则,没有复制 Franka 的关节范围、质量、奖励尺度,也没有新建或启动 IsaacLab/Isaac Sim 环境。继续使用同一份 MuJoCo 3.11 场景,是为了保持现有浏览器推断、API 与 Go2 训练链路不变。
控制与版本
唯一当前契约:contracts/mobile-manipulator-v2.json,固定 float32 [1,92] → [1,12],50 Hz。
- 前 68 维保留原任务状态;68–79 为上次实际施加的归一化动作;80–91 为控制目标状态(底盘/未用槽为 0,臂位置目标及夹爪开度归一化)。积分器和滤波状态不是隐藏变量。
- 底盘三个分量目标上限:0.12 m/s、0.12 m/s、0.5 rad/s;加速度上限:0.3、0.3、0.8(对应 SI 单位)。轮速仍受描述符限制。
- 臂位置目标速率不超过
min(velocityLimit, 0.5 rad/s);增量命令经过 1.5 rad/s² 加速度限制和 0.2 rad 跟踪误差防积分饱和。零动作保持既有目标,不追随重力下垂位置;暂停/撤销策略也保留安全位置目标,不清零位置舵机,不在每次暂停后继续向下垂姿态累积漂移。 - 夹爪动作变为开合速度:+1 张开、-1 闭合、0 保持;开度每秒最多变化 0.5。
- 目标限速不是物理速度的硬上界。每个物理子步检查实际臂/夹爪速度,超过 2 rad/s 即结束回合;底盘倾倒/越界也失败。不通过裁剪 qvel 或跳过碰撞伪造安全。 浏览器安全终止后暂停并显示原因。
- 部署校验任务版本、动作语义
rate-limited-position-target-v1、阶段、张量以及权重/机器人/场景指纹。旧 68 维全行程位置策略明确拒绝,必须重新训练;Go2 契约不变。
主控制台操作
- 导入相应机器人,在「控制台 → 强化学习任务」连接本地训练服务。
- 默认阶段 1 · 底盘接近:机械臂/夹爪保持;学习到物体前方世界坐标偏移
(0.3, 0)的接近位,并朝向 +X。不是驶向放置目标,不是通用避障导航。 - 默认可先做 4096 步导航示教初始化(闭环底盘控制器采样、监督训练 MLP),再用 PPO 微调。初始化还采样 ±0.6 rad 的初始朝向;设为 0 可做纯 PPO 对照。部署只导出神经网络,不附带示教控制器。 使用低初始探索噪声、较小学习率和 KL 约束,避免马上破坏接近行为。
- 成功条件:接近位误差 <6 cm、偏航误差 <0.2 rad、线速度 <0.035 m/s、角速度 <0.1 rad/s,连续稳定 10 个控制步。1000 步超时。
- 完成后查看评估,不只看 loss。点击「接续此作业(保留权重)」可同阶段续训;只接受服务拥有的 checkpoint,不接受浏览器提供 Python/PPO 文件路径。接续绑定完整资产快照;升级阶段还须保留已评估的坐标/随机范围,改变分布应先同阶段续训。
- 上一阶段至少 10 回合、成功率 ≥80%、无安全终止,才允许切到 2 · 末端接近。先导航,接近位附近停止底盘并启用臂控制;末端 <9 cm 且臂速低、稳定驻留才成功。
- 同样达标后才允许 3 · 抓取放置。保持接近门控,抬升后允许搬运;沿用真实接触、抬升、释放和稳定放置判据,不焊接/吸附物体。升级阶段时放开新启用机械臂的探索噪声。不能跨过未通过的阶段。
未达标作业仍可导出和导入,便于可视化调试,但界面明确警告,且不能用于跳级。服务重启会丢失当前内存作业索引;目前接续入口依赖同一服务会话,磁盘 checkpoint/评估文件不会因此删除。
随机化、奖励与评估边界
训练默认在名义物体/目标 XY 周围 ±0.1 m 采样;可设置 0–0.3 m。训练、示教、评估使用不同种子序列。浏览器复现部署中的名义初态,不复现隐藏随机数状态。
导航有距离进展和位置/朝向误差奖励。各阶段加入 -0.005 * ||a_t-a_(t-1)||² 和 -dt * 0.01 * ||qdot_arm||²;成功奖励 20,安全失败惩罚 -5。阶段 1 不包含抓取奖励,阶段 2 不包含抬升/搬运奖励。具体常量在共享 JSON,两端同公式并做多步 golden 对照。
本次实际实验(CPU、4 环境、128 rollout、位置扰动 0.1 m、示教 4096 步):
- Bundle:PPO 30 次更新 / 15360 步,10 回合评估 10/10,关节峰值约 1.084 rad/s,无安全终止。
- LeKiwi v1:同样初训后 6/10;继续 30 次更新后 7/10,峰值约 0.299 rad/s,无安全终止。尚未达到升级门槛,未继续训练抓放。
- 原 Bundle 全行程控制环境即使保持零位,短测臂速峰值约 5.52 rad/s;修正限力后同样保持姿态约 1.09 rad/s。这是仿真模型上的对照,不是硬件限速证明。
额外用导出的 ONNX(不是 PyTorch actor)在另一组从未用于上述 rollout/初始化的种子 300000…300019 上复测:Bundle 20/20,LeKiwi v1 17/20;两者安全终止均为0,峰值分别约1.085和0.299 rad/s,结果保存于各产物目录 evaluation-independent-20.json。v1 的服务部署元数据仍保留原 7/10 评估,没有用较好的一组结果覆盖门槛。Bundle 另做了 checkpoint→末端接近的两次更新连通性检查,0/2成功,尚不能升级为抓取放置。
这些是小样本、有限训练种子、有限初态分布结果,不代表大范围导航、任意朝向、未知资产、抓取成功或实机安全。后续需要更多独立种子和长回合评估;不得把成功导出 ONNX 写成“已经学会抓放”。实验产物在 build/mobile-curriculum/,服务作业成果仍按原路径位于 logs/rsl_rl/web_jobs/{id}/。