返回首页

Manipulation 入门

数据采集环境准备

1. 完全复刻 U-Arm 中的硬件完成校准

pic

2. 在 SAPIEN 中搭建仿真环境

使用 U-Arm 模拟器教程 中的指令来安装环境并启动模拟器

Pitfall 1: 环境配置,需要注意最后 a) 需要手动安装 pip install setuptools==81.0; b) 需要下载 ManiSkill 的场景数据集 python -m mani_skill.utils.download_asset "ReplicaCAD"。 此外如果在 conda 环境中需要运行 setup_ros_venv.sh 来安装 ros 依赖。

Pitfall 2: 容器渲染,在 debian13 + 自制 Docker 的环境下会出现一些问题:

- 在容器调教方面,发现只有宿主机使用 nvidia-container-toolkit==1.17.6-1 能够比较轻松的启动 SAPIEN - 同时如果使用默认的 rt-fast 渲染会因为宿主机缺少 optix 库而无法 denoise 输出的图像会有大量噪声 - 在宿主机安装了 optix 的库后,SAPINE 调用 optix 会导致 internal error。有两种解决方案 a) 使用 oidn,CPU 完成 denoise 会带来轻微的延迟 b) 使用以下命令来尝试将宿主机的库手动复制到容器内: `` bash C=pi # 检查容器内缺少的库 docker exec -it "\(C" bash -lc ' echo "== Vulkan ICD ==" ls -l /etc/vulkan/icd.d/nvidia_icd.json 2>/dev/null || true ls -l /usr/share/vulkan/icd.d/nvidia_icd.json 2>/dev/null || true echo "== Vulkan layer ==" ls -l /etc/vulkan/implicit_layer.d/nvidia_layers.json 2>/dev/null || true ls -l /usr/share/vulkan/implicit_layer.d/nvidia_layers.json 2>/dev/null || true echo "== EGL vendor ==" ls -l /usr/share/glvnd/egl_vendor.d/10_nvidia.json 2>/dev/null || true echo "== OptiX bin ==" ls -l /usr/share/nvidia/nvoptix.bin 2>/dev/null || true echo "== NVIDIA libraries ==" ldconfig -p | grep -E "libGLX_nvidia|libnvoptix|libnvidia-rtcore|libnvidia-glvkspirv|libnvidia-gpucomp" || true ' # 复制缺少的 layers.json docker exec -u root "\)C" mkdir -p \ /etc/vulkan/implicit_layer.d \ /usr/share/nvidia docker cp /usr/share/vulkan/implicit_layer.d/nvidia_layers.json \ "\(C":/etc/vulkan/implicit_layer.d/nvidia_layers.json cp -L /usr/share/nvidia/nvoptix.bin /tmp/nvoptix.bin # 复制 optix 需要的模型参数 docker cp /tmp/nvoptix.bin \ "\)C":/usr/share/nvidia/nvoptix.bin rm /tmp/nvoptix.bin ``

optix denoise 效果: pic

oidn denoise 效果: pic

无 denoise 效果: pic

3.机械臂以及相机调整

  1. 原始的 U-Arm 代码中存在关节顺序/行程映射错误的问题,在 fork 仓库 中进行了修复(调整 3、4 号关节顺序关节方向,调整夹爪行程映射)。
  2. 原本的代码中只有第三人称的 "human" 视角,在 fork 仓库 添加了一个俯视固定相机和腕部相机。

OpenPi 训练

训练流程

  1. 采集数据:定义简单任务,固定红色物块以及蓝色盘子,固定任务将红色物块放到蓝色盘子上。其余颜色盘子随机生成在桌面的其他位置。 收集 20 episode 给 openpi 做 lora finetune。

    定义 state 为 6 个关节角度 + 1 夹爪状态,action 为关节角度变化量,观测为桌面上方的俯视 (640 480) 和腕部相机 (320 320)

random_data_collection

  1. 修改代码,添加 piper_sim_policy.py 用于桥接采集到的数据和模型输出的维度。 在 config.py 中添加基于 pi0 的微调训练 config

    调整了 openpi 导入顺序,先导入 checkpoint 后导入 train 否则会提前退出 调整了 norm stat 的保存位置

uv run scripts/compute_norm_stats.py --config-name pi0_piper_sim_low_mem_finetune
XLA_PYTHON_CLIENT_MEM_FRACTION=0.9 uv run scripts/train.py pi0_piper_sim_low_mem_finetune --exp-name=my_experiment  --overwrite

测试

在录制数据集的相同环境下进行推理测试,大概架构为 policy server + simulation。

  1. 加载训练好的 ckpt,本地启动一个 policy server
  2. 启动一个仿真环境,与 policy server 建立连接,准备好后将机器人的状态以及相机渲染画面通过 websocket 传给 policy server。
  3. 从 policy server 接受控制指令,并传送给机器人。

但是今天在初步测试的过程中,机械臂会靠近红色的目标物块,在接近后会闭合夹爪,但是无法抓取方块。 在很多情况下会出现直接乱摆的情况,猜测是训练数据的长度基本 20s 以内就结束,所以超过 20s 算是 OOD?

下一步启动 pi0.5 微调测试