3. 采集程序¶
3.1 代码结构¶
capture/
├── record_ego_wuji.py Wuji 方案入口(Linux)
├── record_ego_manus.py MANUS 方案入口(Windows)
├── record_ego_app.py 设备连接、网页服务与录制流程
├── record_ego_page.html 控制页面
├── tracker_sender_windows.py Windows 端 tracker 发送程序(Wuji 方案)
├── visualize_session.py 回看一条录制
├── record_ego/ 配置、录制控制、写盘、上传
├── devices/ 各设备驱动
├── network_bridge/ tracker 数据的网络协议
├── ManusClient/ MANUS UDP 发送端(需自行获取,见目录内 README)
├── wuji_calibration/ Wuji 标定文件的导入与导出
├── scripts/
│ ├── setup_wuji_gloves.sh Wuji 手套网络配置与检查
│ ├── wuji_calibration_tool.py Wuji 手套标定与标定文件导出
│ ├── start_tracker_sender.ps1 启动 Windows 端 tracker 发送程序
│ ├── wuji_launch.sh Wuji 方案一键启动(按本机修改)
│ ├── rclone_linux.sh 上传数据(Linux)
│ └── rclone_win.bat 上传数据(Windows)
└── task_setting/example.json 任务列表示例
3.2 任务列表¶
--task-setting 指向一个 JSON 文件,内容是任务名数组。控制页面上按顺序切换任务,任务名会写进录制名和 session.json:
["物料称量", "萃取", "开反应", "旋蒸", "烘箱取料", "过柱"]
3.3 启动¶
先在 Linux 上启动采集程序:
cd capture && source .venv/bin/activate
python record_ego_wuji.py \
--task-setting task_setting/example.json \
--tracker-host 0.0.0.0 --tracker-port 8766 \
--save-dir ./data
也可以按本机路径改好 scripts/wuji_launch.sh 后一键启动。
再在 Windows 的 capture/ 目录下启动 tracker 发送程序:
.\scripts\start_tracker_sender.ps1 -LinuxHost <LINUX_IP> -Port 8766
# 或
python tracker_sender_windows.py --host <LINUX_IP> --port 8766
- 两端的端口(以及设了的话 token)必须一致。连接断开后 Windows 端每 2 秒重连一次,Linux 端照常录制视频和手套。
- Windows 端只需允许 Python 访问局域网,不用开放入站端口。
- 在 Windows 终端里也能控制录制:
r开始,e结束并保存,Esc关闭按键监听(位姿照常发送)。开始前的倒计时默认沿用 Linux 端的--record-countdown,可以用-Countdown/--countdown覆盖;不需要按键控制时加-NoKeyboard/--no-keyboard。
按第 2.4 节启动 MANUS Core 和 UDP 发送端,然后:
python record_ego_manus.py \
--task-setting task_setting/example.json \
--manus-ip 0.0.0.0 --manus-port 9000
tracker 由本机直接读取。没有 tracker 时加 --no-tracker,相机和手套照常采集。
3.4 控制页面¶
控制页面默认在 http://127.0.0.1:8770/。要从其它电脑访问,加 --host 0.0.0.0 并放行端口。

MANUS 方案

Wuji 方案
两种方案的页面布局相同:左侧是 GoPro 画面,右上是五个 tracker 的位姿和坐标,右下是左右手骨架(Wuji 方案另有 24×31 触觉热力图),底部是操作栏。Wuji 页面的相机监看画面默认缩到 640×360(--preview-width、--preview-height),不影响录制分辨率。
键盘操作与终端相同:
| 键 | 作用 |
|---|---|
r |
倒计时(默认 3 秒,可在页面上改)后开始录制 |
e |
结束并保存 |
d |
倒计时中按下取消;录制中按下则终止并丢弃,不写盘 |
q |
退出,未保存的录制会被丢弃 |
3.5 常用参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
--cam-device |
0 |
采集卡编号或 /dev/video* 路径 |
--cam-width --cam-height --cam-fps |
2560 1440 60 |
向采集卡请求的分辨率和帧率,实际值以采集卡输出为准,记录在 session.json |
--video-codec --crf --h264-preset --h264-threads |
h264 20 ultrafast 4 |
实时 H.264 编码 |
--no-camera |
不接相机 | |
--wuji-calibration / --no-wuji-calibration |
wuji_calibration/calibration_bundle.zip |
Wuji 手套标定文件 |
--tracker-host --tracker-port --tracker-token |
0.0.0.0 8766 空 |
Wuji 方案接收 tracker 数据 |
--tracker-record-fps |
120 |
Wuji 方案 tracker 写盘上限 |
--tracker-sample-fps |
90 |
MANUS 方案 tracker 采样率 |
--no-tracker |
不接 tracker | |
--save-dir |
./data |
录制保存目录 |
--record-countdown |
3 |
开始前倒计时(秒) |
--rclone-remote --rclone-config |
空 | 上传目标(可选) |
--storage-limit-gb --storage-check-interval |
50 30(分钟) |
数据目录超过上限时自动上传并清理 |
--host --web-port |
127.0.0.1 8770 |
控制页面地址和端口 |
完整参数见 python record_ego_wuji.py --help 和 python record_ego_manus.py --help。
3.6 上传(可选)¶
录制默认只保存在本机的 --save-dir 下。本机空间不够时,可以开通一个兼容 S3 的对象存储(阿里云 OSS、腾讯云 COS、AWS S3 等),用 rclone 上传:
- 安装 rclone;
- 运行
rclone config新建一个远端,例如命名为myremote,填入存储类型、Endpoint 和密钥; - 用
rclone lsd myremote:<bucket>验证能列出内容。
之后有两种上传方式:
- 在采集程序里上传。 启动时加
--rclone-remote myremote:<bucket>/ego_data(或设环境变量EGO_RCLONE_REMOTE),页面上的"上传数据"按钮随即可用,它执行rclone copy,跳过远端已有的文件。数据目录超过--storage-limit-gb(0表示不检查)时,程序自动执行rclone move,只删除确认已上传的本地文件。rclone 不在 PATH 里时用--rclone-bin指定,配置文件不在默认位置时用--rclone-config指定。 - 用脚本上传。 把
scripts/rclone_linux.sh或scripts/rclone_win.bat开头的LOCAL_PATH、REMOTE_PATH改成自己的路径后运行。需要过滤文件或上传后删除本地文件时,修改脚本里那条 rclone 命令。
没有配置 rclone 时,"上传数据"按钮不可用,超过存储上限也不会自动清理,需要自己留意磁盘空间。
3.7 常见问题¶
| 现象 | 依次检查 |
|---|---|
| Linux 一直显示等待 tracker | Windows 端 --host 填的是 Linux 的局域网 IP(不是 127.0.0.1);两端端口和 token 一致;Test-NetConnection <LINUX_IP> -Port 8766 能通;Linux 防火墙;两台机器在同一网段;Linux 端先启动 |
| Windows 端没有 tracker 位姿 | 依赖已安装;SteamVR 是当前的 OpenXR Runtime;tracker 已配对并分配了角色(不能是 Handheld object) |
| Linux 找不到 Wuji 手套 | 已安装 wuji-sdk,没有其它程序占用 SDK;setup_wuji_gloves.sh --check;左右手序列号与当前 SDK 用户的标定是否对应 |