Wuji CLI · 开发工具

用户与标定数据

用户 Profile 是某个人标定数据的本地档案。SDK 按 Profile 隔离手部模型标定与触觉模型,因此同一只手套可为每个人保存各自的标定,也能把标定在机器之间迁移。wuji user 管理这些 Profile。Profile 以用户名为标识。所有子命令都是 ~/.wuji/sdk 下的本地操作,不连接设备。全部子命令支持 --json

Profile 为什么与标定相关

手部模型标定会写入按 Profile 隔离的 URDF。默认用户无法执行手部模型标定:需先新建并切换到命名 Profile,再运行标定。触觉标定按设备归属,不受此限制。

wuji user create alice --switch   # 新建并立即切换
wuji calib ik                      # 此时才允许标定

管理 Profile

wuji user list                    # 列出 Profile,'*' 标记当前
wuji user create alice -d "备注"   # 新建(-d 加描述,不加 --switch 则不切换)
wuji user switch alice            # 切换当前 Profile
wuji user rename alice alice2     # 重命名,标定数据跟随
wuji user delete alice            # 删除 Profile 及其全部数据(先确认)
wuji user show [alice]            # 查看某 Profile 的标定(缺省当前)

用户名为 1–32 个字母/数字/下划线/连字符,且不得以连字符开头。list* 标记当前 Profile,把 Default 标为「不可标定」,并显示各命名 Profile 的左右手标定状态。show 列出左右手 IK 模型(状态/文件/大小/时间)与按设备 SN 分组的触觉模型。模型文件不全的设备会标出缺失文件,与从未标定的设备区分开。

delete 会先打印将删除的内容并请求确认(同时提示可先 wuji user export 备份)。加 --yes 可跳过确认。Default 不可删除或重命名。删除当前用户后,当前 Profile 回退为 Default

在机器间迁移标定

标定数据——按 Profile 隔离的手部模型 URDF,加上每只手套的触觉模型、触觉参数与最近一次完整触觉 run——打包为单个 .zip

导出

wuji user export ./alice.zip      # 写出 .zip
wuji user export ./out-dir/       # 已存在的目录内自动命名 calib_bundle_<name>_<ts>.zip
wuji user export ./alice.zip --force   # 覆盖已存在文件

导出始终作用于当前用户。目标写目录时该目录需已存在,否则返回退出码 1。不加 --force 时,导出到已存在的文件会失败。如果当前 Profile 没有任何标定产物,命令不会生成空 bundle,而是引导先完成标定并返回退出码 1。命名 Profile 运行 wuji calib ik 即可补齐,Default 无法执行手部模型标定,需先新建并切换到命名 Profile,或改做按设备归属的触觉标定

触觉模型由 contact.safetensorscontact.npzcontact.json 三个文件组成,缺任一文件即不完整,不会打进 bundle。导出清单会把这类模型标为 skipped 并列出缺失文件,而不是静默丢弃。当前 Profile 只有不完整的触觉模型时,报错会点名设备 SN 与缺失文件,并引导对这些设备重新运行 wuji calib tactile,同样返回退出码 1。

导入

wuji user import ./alice.zip --preview             # 仅查看,不改动
wuji user import ./alice.zip                        # 预览后确认
wuji user import ./alice.zip --yes                  # 跳过确认导入
wuji user import ./alice.zip --as bob               # 导入到新建 Profile

导入作用于当前用户(或用 --as <name> 导入到新建 Profile,导入成功后当前用户切换为该新 Profile)。它先预览来源用户、内容,以及与目标 Profile 标定的冲突,再请求确认。导入的新模型在手套下次连接时生效。当 bundle 来自不同用户且目标已有标定产物时,原产物会先备份到 calibration-import-backups/ 再覆盖。空 Profile 不会产生空备份目录。备份会保留到手动删除。

预览与导入清单会如实列出被跳过的触觉模型及原因:bundle 内的模型文件不全、bundle 未携带该设备的模型,或 bundle 带了模型文件但 manifest 未声明。manifest 未声明的产物不会被安装,清单会把它们列出来,不再静默丢弃。

自动化调用

--json 每条命令输出一个文档,错误输出 {"error":{"code":…,"message":…}}。由于 import/delete 在无终端时无法交互,非交互场景需加 --yes(或 --preview)。

createswitchrenamedelete--json 输出固定带 current_user 字段,写明命令跑完后当前用的是哪个 Profile,脚本不用再跑一次 user list 确认。rename 另返回 previous_name(改名前的用户名)与 name(新名):

$ wuji user rename alice alice2 --json
{
  "action": "renamed",
  "name": "alice2",
  "previous_name": "alice",
  "current_user": "alice2"
}

show --json 为不完整的触觉模型输出 missing_model_files(缺失文件名列表)。exportimportimport --preview 清单里被跳过的组件行带 reason 与可选的 detaildetail 补充缺失文件名等说明。触觉模型的 reason 取值:导出清单只出现 incomplete_model(模型文件不全),导入与预览清单还可能出现 not_in_bundle(bundle 未携带模型)与 not_declared_in_manifest(manifest 未声明)。

// show --json:不完整触觉模型的条目(tactile 数组内)
{
  "sn": "<SN>",
  "calibrated": false,
  "missing_model_files": ["contact.npz", "contact.json"]
}
// export/import/preview 清单:被跳过的组件行
{
  "name": "tactile.model",
  "device_sn": "<SN>",
  "state": "skipped",
  "reason": "incomplete_model",
  "detail": "missing contact.npz, contact.json"
}

退出码细分:

退出码(error.code含义
0成功(含切换到当前用户的幂等操作)
1其他运行时错误,包括导出无标定产物的 Profile
2用户名非法
3用户已存在
4用户不存在
5Default 保护(删/改 Default、默认用户手部模型标定,或向 Default 导入含手部模型的 bundle)
6bundle 文件不存在
7bundle 非法或版本不兼容
8导出目标已存在(需 --force
9确认时取消
订阅更新