版本与升级¶
序列号和版本号都是示例,以实际读到的为准。完整变更见 CHANGELOG,反馈见支持与反馈。
必须升级到最新版本¶
采集前先把各项都升到下表版本,这不是可选项
| 组件 | 最低要求 | 怎么查 |
|---|---|---|
xense-taccap-lerobot |
0.5.1+xtac.0.1.1 |
pip show lerobot 或看 pyproject.toml |
xense.taccap SDK |
0.4.3 | python -c "import xense.taccap as t; print(t.__version__)" |
| 夹爪固件 | 命令集 V2.1,即 leader ≥ 1.2.0 / follower ≥ 1.1.0;用从夹爪(--robot.role=follower)时 follower 须 ≥ 1.2.5(低于 1.2.11 提示升级) |
跑 calibrate.py 或直接读 |
| 每台 leader 的编码器标定 | 零点 + 行程上限已写入 flash | 夹爪标定 |
| XenseVR PC Service | ≥ v0.2.0,装机直接用 v0.2.1 | dpkg -s xensevr-pc-service 的 Version |
顺序:先拉仓库与子模块并重编 SDK(否则 import xense.taccap 失败),再刷固件,最后夹爪标定(升级不产生标定值)。
flowchart LR
A[拉仓库 + 子模块] --> B[重新编译 xense.taccap] --> C[刷固件 OTA] --> D[每台 leader 标定]
- 已采数据不用重采;与新数据混用前确认两批
gripper.pos刻度一致。 - 升级后重做环境验证、设备自检和一条短 episode 校验。
版本兼容基线¶
命令与字段以本地 checkout 和 SDK 附带的设备说明为准。
| 组件 | 支持范围 / 约束 | 已验证基线 |
|---|---|---|
| 操作系统 / 架构 | Ubuntu 22.04 / 24.04,amd64 | 22.04.5 / 24.04.4,x86_64 |
| Linux 内核 | 不构成约束 | 6.8 / 6.14 / 7.0 |
| 采集主机 | 最低 12 代 i7、8GB、512GB SSD;推荐 Core Ultra 9 275HX、32GB、1TB NVMe,见主机配置 | — |
| NVIDIA GPU / 驱动 | 最低 RTX 3060 / 8GB(推荐 RTX 5060 Laptop / 8GB 起),驱动 ≥ 570.144;无 NVIDIA 显卡只能降级录制 | 570.144 / 580.126.09 / 595.71.05 |
| Python | ≥ 3.12(conda_environment.yaml 固定 python=3.12) |
3.12.13 |
| PyTorch | torch>=2.2.1,<2.11.0;torchvision>=0.21.0,<0.26.0 |
2.10.0 / 0.25.0 |
torchcodec |
>=0.2.1,<0.11.0,setup_env.sh 按当前 torch 自动对齐 |
0.10.0 |
| PyAV | av>=15.0.0,<16.0.0,安装脚本固定 15.1.0 |
15.1.0 |
rerun-sdk |
>=0.24.0,<0.27.0 |
0.26.2 |
opencv-python |
==4.12.0.88 |
4.12.0.88 |
| NumPy | >=1.26.4 |
2.2.6 |
xense-taccap-lerobot |
基于 lerobot 0.5.1,版本号 0.5.1+xtac.0.1.1 |
v0.1.1 |
xense.taccap SDK |
与主仓库子模块 third_party/taccap-gripper 配套 |
0.4.3(tag v0.4.3),附带固件 leader 1.2.6 / follower 1.2.16 |
| 夹爪固件 | 命令集 V2.1(帧格式 V1.8),leader ≥ 1.2.0 / follower ≥ 1.1.0 | leader 1.2.6 / follower 1.2.16,随 SDK 走,以 firmware/manifest.json 为准,见 OTA |
xensesdk |
由安装脚本提供 | 2.1.2 |
XenseVR PC Service(.deb) |
≥ v0.2.0 | v0.2.1 |
xensevr_pc_service_sdk |
在主仓库内,链接 .deb 的 C SDK |
0.2.1,版本号取自 .deb |
.deb(/opt/apps/roboticsservice/SDK)是 Pico4 C SDK 唯一来源,--install 不重编它,停在 v0.2.0 会拿旧 SDK 编绑定。v0.2.0 起转发头显相机帧。
三套编号:V2.1 是命令集,不是固件版本¶
| 编号 | 当前值 | 是什么 |
|---|---|---|
| 帧格式 | V1.8 |
字节怎么打包成帧,极少变动 |
| 命令集 | V2.1 |
固件实现的命令。行程标定的 EncoderMaxCal 由 V2.1 引入(V2.0 鱼眼标定,V1.9 LED 与私有电机参数) |
| 固件构建号 | leader ≥ 1.2.0 / follower ≥ 1.1.0 | 具体镜像,是门槛不是等号:更高的号(如 leader 1.2.2)同样支持 V2.1 |
够用不等于没缺陷,见我需要刷吗。
如何查版本¶
固件版本不在 SN 里,需 GetVersion 读取;下面同时打出 SDK 版本:
python - <<'EOF'
import xense.taccap as t
from xense.taccap import scan_grippers, LeaderGripper, Cmd
print("xense.taccap", t.__version__, "(需要 >= 0.4.3)")
for ep in scan_grippers():
g = LeaderGripper(mcu_device=ep.mcu_device) # 只读版本,主从夹爪通用
ack = g.transport.send_cmd(Cmd.GetVersion, b"", 500)
print(f" {ep.firmware_sn} {ep.side.name:5} fw={ack.data[0]}.{ack.data[1]}.{ack.data[2]}")
EOF
刷固件前的输出(两只主夹爪,旧版 fw 1.2.5,刷完应为 1.2.6):
- 主从夹爪都用
LeaderGripper打开;FollowerGripper会拒绝固件低于 1.2.5 的从夹爪。 - 只传
mcu_device、normalize_position保持默认False,未标定也能读。 - ACK 第 4 字节
build恒为 0,按MAJOR.MINOR.PATCH三段比较。
其余组件:
python - <<'EOF'
import importlib.metadata as M
for p in ("lerobot", "taccap-gripper", "xensesdk", "torch", "torchvision",
"torchcodec", "av", "rerun-sdk", "opencv-python", "numpy"):
try:
print(f"{p:16} {M.version(p)}")
except M.PackageNotFoundError:
print(f"{p:16} 未安装")
EOF
nvidia-smi --query-gpu=driver_version,name --format=csv,noheader # 需 >= 570.144
dpkg -s xensevr-pc-service 2>/dev/null | grep -E '^(Package|Version|Architecture):'
python -c "import xensevr_pc_service_sdk as xrt; print('pico camera API:', hasattr(xrt, 'has_pico_camera_frame'))"
pip show xensevr-pc-service-sdk 显示构建时从 dpkg 读到的 .deb 版本;头显相机接口看 has_pico_camera_frame;夹爪 SN 与角色见快速开始。
更新要点¶
0.1.1¶
- 夹爪 SDK 升到 0.4.3,附带固件主夹爪 1.2.6(不变)/ 从夹爪 1.2.16,见固件 OTA。
- 从夹爪力位控制(
ForcePositionController)跟随连续目标更平顺:跟踪延迟多约 10–15ms;目标仍在移动时被挡住,进入HOLDING_FORCE晚约 150ms。只用主夹爪采集不受影响。 - 拉到 v0.1.1 后必须重跑
./setup_env.sh --install。
0.1.0¶
- 带不带头显由
--robot.type决定:双夹爪新增xtac_umi_g1(录头显双目与头部位姿),bi_taccap_gripper不录头显;--robot.enable_head_camera与类型矛盾时报错,见录制。 - 夹爪 SDK 升到 0.4.1,附带固件主夹爪 1.2.6 / 从夹爪 1.2.14,见固件 OTA。
- 不再落盘
meta/runtimes/;meta/info.json新增collection_stack,标明录制软件,见数据集。 lerobot-check-dataset视频帧数严格相等:少帧报错、多帧告警;编辑数据集重新编码沿用采集时的编码器。- Docker 镜像支持在容器内语音播报。
- 仓库、子模块与镜像地址迁到
XenseRobotics-AI组织。 - 拉到 v0.1.0 后必须重跑
./setup_env.sh --install。
仓库与子模块更新¶
按发布 tag 更新,不要直接拉 main(可能含未发布改动):
git fetch --tags
git checkout v0.1.1
git submodule update --init --recursive --progress
./setup_env.sh --install # 对齐依赖并重编 xense.taccap
git submodule status # 子模块应对应 v0.4.3
拉完子模块必须重新编译 xense.taccap
git submodule update 只更新文件,不重跑 ./setup_env.sh --install 则 import xense.taccap 失败。SDK 版本号不变(如 0.4.1)也可能含 C++ 改动,每次都要重跑。
子模块地址是 SSH 形式:没有 GitHub SSH key 的机器先改写一次地址
third_party/taccap-gripper 的地址是 git@github.com: 形式,没配 SSH key 时拉子模块会失败。子模块仓库公开,克隆或更新前执行一次改走 HTTPS:
能正常更新的机器不必处理,也不要执行 git submodule sync,否则会切回 SSH。Docker 路径不受影响。
固件 OTA 升级¶
我需要刷吗¶
跑一次 calibrate.py,固件不够会退出并打印当前版本(样例见夹爪标定)。任一条成立就刷:
calibrate.py报needs command set >= V2.1退出;- 主夹爪连不上,报错提示先做 OTA;
- 固件低于命令集 V2.1。
V2.1 只是底线,旧固件有已知缺陷,请刷到 SDK 0.4.3 附带的 leader 1.2.6 / follower 1.2.16(见从夹爪固件版本表)。不换主板、不擦固件,刷一次即可。
怎么刷¶
先升级 SDK,再刷固件
- 镜像随 SDK 走:先把子模块升到 SDK 0.4.3,用它刷写与校验,才能刷到 1.2.6 / 1.2.16;绝不要用低于 0.1.7 的 SDK 刷。
- 新 SDK 与旧固件通信不变,先升 SDK 总是安全的。
- 镜像版本以
firmware/manifest.json里的version为准,不要从 SDK 版本号推。
镜像在 third_party/taccap-gripper/firmware/,只留当前发布版;文件名带版本号,优先按角色让脚本挑。各镜像文件名与版本见同目录 manifest.json:
python -c "import json;m=json.load(open('third_party/taccap-gripper/firmware/manifest.json'));[print(i['file'],i['version']) for i in m['images'].values()]"
| 镜像 | 适用角色 |
|---|---|
tc-gu-01-master-1.2.6.bin |
主夹爪(SN 末位 m) |
tc-gu-01-slave-1.2.16.bin |
从夹爪(SN 末位 s) |
按角色选,不按左右手:TCGU01A28Z0023m 末位 m,用主夹爪镜像;一套设备两只常都是主夹爪。
# 1. 确认每只夹爪的角色
python -c "from xense.taccap import scan_grippers
for g in scan_grippers(): print(g.firmware_sn, '->', 'master' if g.firmware_sn.endswith('m') else 'slave')"
# 2. 刷写:插着的每只夹爪各刷自己角色的镜像
python third_party/taccap-gripper/python/examples/ota_update.py --all
# 3. 断电重插后确认实际刷上的版本
python -c "
from xense.taccap import scan_grippers, LeaderGripper, Cmd
for ep in scan_grippers():
g = LeaderGripper(mcu_device=ep.mcu_device)
ack = g.transport.send_cmd(Cmd.GetVersion, b'', 500)
print(f'{ep.firmware_sn} {ep.side.name:5} fw={ack.data[0]}.{ack.data[1]}.{ack.data[2]}')
"
- 镜像名按给的路径、SDK 根目录、SDK
firmware/依次解析,任意目录可运行,连设备前就检查。 --target-version通常不用写:只给校验日志和分区元数据打标记,脚本按 CRC32 在manifest.json里查出版本号,它不认识的镜像才需指定。- 约 1 秒写完,重启约 1–3 秒;新固件先写备用分区,校验通过才替换,传输失败不会刷坏。
- 第 3 步读回须不低于 leader 1.2.0 / follower 1.1.0,刷当前附带镜像应为 1.2.6 / 1.2.16。
其它写法:
- 只插一只主夹爪(或从夹爪)时只写角色:
ota_update.py master/ota_update.py slave。 - 同角色多只里刷一只,写镜像文件名 + 左右或 SN:
ota_update.py tc-gu-01-master-1.2.6.bin left(以firmware/里实际文件名为准)。 - 不要写
slave left/master left:第一个参数会被当成文件名,报firmware file not found。
刷错角色会导致夹爪无法启动,需返厂恢复
ota_update.py 按 CRC32 比对 manifest.json 识别镜像,角色不符直接拒绝,--force 才能强制;手工编译的镜像带提示放行。升级期间不要断电或拔线。
刷完必须断电重插一次
这是升级流程的一步,不是排障手段。
- OTA 后是软复位,USB 转串口芯片没断电,设备停在降级状态:版本正确、数据流正常、错误计数为 0,却悄悄丢状态帧。实测 60 秒一轮,只做 OTA 丢 35~39 帧,断电重插后为 0。
- 顺序:刷写 → 断电重插 → 第 3 步确认 → 标定,断电前的数据不可信。
- 主夹爪拔插 USB 线;从夹爪拔下 24V 电源线,等约 2 秒插回,USB 线不用拔(主控板和电机都由 24V 供电)。
- 等夹爪重启完成再断电重插。
升到 V2.1 后回夹爪标定标零点和行程上限。