For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: 在 RK3588 部署一个基于 Web UI 的交互式手动标定脚本,通过浏览器点击按钮完成标定,生成准确的 calibration_group1.json。
Architecture: 标定脚本负责控制 PTZ 相机、抓取图像、维护标定状态;内嵌 HTTP 服务提供 Web UI 和 /api/status、/api/command 接口;前端页面轮询状态并发送指令。
Tech Stack: Python 3.8, OpenCV 4.5.5, Dahua SDK ctypes, http.server, RK3588
| 文件 | 说明 |
|---|---|
dual_camera_system/scripts/manual_calibrate.py |
本地项目标定脚本(已纳入 git) |
dual_camera_system/scripts/points.txt |
默认标定点配置 |
/home/admin/dsh/calibration_scan_180_360_z1/manual_calibrate.py |
RK3588 运行时部署副本 |
/home/admin/dsh/calibration_scan_180_360_z1/points.txt |
RK3588 运行时标定点配置 |
manual_calib/panorama.jpg |
当前全景图 |
manual_calib/panorama_marks.jpg |
带标定点标记的全景图 |
manual_calib/ptz_shots/latest_ptz.jpg |
当前 PTZ 预览图 |
manual_calib/calibration_group1_manual.json |
最终生成的校准文件 |
Files:
Create: dual_camera_system/scripts/manual_calibrate.py
[x] Step 1: 设计全局状态与命令队列
使用全局 calib_state dict 保存当前点、pan、tilt、状态、消息;使用 queue.Queue 接收前端指令。
继承 http.server.SimpleHTTPRequestHandler,添加路由:
GET / → 返回 Web UI HTMLGET /api/status → 返回 calib_state JSONPOST /api/command → 解析 {command: "p+5"} 并入队其他路径 → 静态文件服务
[x] Step 3: 编写 Web UI HTML/JS
页面包含:
JS 轮询 /api/status 并自动刷新图片
[x] Step 4: 主循环接收 Web UI 指令
对每个标定点:
latest_ptz.jpgwaitingwait_for_command() 从队列取指令处理 pan/tilt 调整、ok、skip、quit
[x] Step 5: 生成校准文件
标定点 ≥4 时,拟合线性参数和 lookup tables,输出 calibration_group1_manual.json。
Files:
/home/admin/dsh/calibration_scan_180_360_z1/manual_calibrate.pyCreate: /home/admin/dsh/calibration_scan_180_360_z1/points.txt
[x] Step 1: scp 脚本到 RK3588
Run:
scp dual_camera_system/scripts/manual_calibrate.py admin@10.126.126.1:/home/admin/dsh/calibration_scan_180_360_z1/manual_calibrate.py
Run:
ssh admin@10.126.126.1 "cat > /home/admin/dsh/calibration_scan_180_360_z1/points.txt <<'EOF'
0.20 0.50 left
0.40 0.50 left-center
0.60 0.50 right-center
0.80 0.50 right
0.50 0.30 upper
0.50 0.70 lower
0.50 0.90 bottom
EOF"
Files:
Modify: /home/admin/dsh/calibration_scan_180_360_z1/manual_calib/index.html(运行时生成)
[x] Step 1: 清理旧进程并启动脚本
Run:
ssh admin@10.126.126.1 "pkill -f '^python.*manual_calibrate' || true; sleep 2; rm -rf /home/admin/dsh/calibration_scan_180_360_z1/manual_calib; cd /home/admin/dsh/calibration_scan_180_360_z1 && (setsid python -u manual_calibrate.py --points points.txt --output manual_calib --http-port 8000 > /tmp/calib.log 2>&1 &) && sleep 3 && pgrep -f '^python.*manual_calibrate'"
Expected: PID printed, HTTP server starts.
Run:
curl -s http://10.126.126.1:8000/api/status
curl -s http://10.126.126.1:8000/ | head -n 5
Expected: JSON status showing status: waiting, HTML page returned.
Files:
/home/admin/dsh/calibration_scan_180_360_z1/manual_calib/manual_points.jsonModify: /home/admin/dsh/calibration_scan_180_360_z1/manual_calib/calibration_group1_manual.json
[x] Step 1: 用户打开 Web UI
URL: http://10.126.126.1:8000/
对每个标定点 P1-P7:
页面自动进入下一点
[x] Step 3: 检查生成的校准文件
完成后脚本自动生成 calibration_group1_manual.json。
Run:
ssh admin@10.126.126.1 "cat /home/admin/dsh/calibration_scan_180_360_z1/manual_calib/calibration_group1_manual.json | python -m json.tool | head -n 30"
Expected: JSON with rms_error < 5°.
Actual: RMS 5.51°, 7 个有效点。
Files:
/home/admin/dsh/calibration_scan_180_360_z1/calibration_group1.jsonModify: /home/admin/dsh/calibration_scan_180_360_z1/calibration_group1.json
[x] Step 1: 备份旧文件
Run:
ssh admin@10.126.126.1 "cp /home/admin/dsh/calibration_scan_180_360_z1/calibration_group1.json /home/admin/dsh/calibration_scan_180_360_z1/calibration_group1.json.bak.manual.$(date +%Y%m%d_%H%M%S)"
Run:
ssh admin@10.126.126.1 "cp /home/admin/dsh/calibration_scan_180_360_z1/manual_calib/calibration_group1_manual.json /home/admin/dsh/calibration_scan_180_360_z1/calibration_group1.json"
Run:
sudo systemctl start dsh
Actual: dsh 服务已启动,main.py --skip-calibration 运行中。检测到人时 PTZ 成功移动到 (196.1°, -4.4°),方向合理;但存在 PTZ 抓拍取流失败问题(获取球机画面失败),未保存 PTZ 配对图。