2026-06-15-interactive-ptz-calibration.md 6.4 KB

交互式 PTZ 手动标定脚本实施计划

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


File Structure

文件 说明
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 最终生成的校准文件

Task 1: 实现 Web UI 标定脚本

Files:

  • Create: dual_camera_system/scripts/manual_calibrate.py

  • [x] Step 1: 设计全局状态与命令队列

使用全局 calib_state dict 保存当前点、pan、tilt、状态、消息;使用 queue.Queue 接收前端指令。

  • Step 2: 实现自定义 HTTP Handler

继承 http.server.SimpleHTTPRequestHandler,添加路由:

  • GET / → 返回 Web UI HTML
  • GET /api/status → 返回 calib_state JSON
  • POST /api/command → 解析 {command: "p+5"} 并入队
  • 其他路径 → 静态文件服务

  • [x] Step 3: 编写 Web UI HTML/JS

页面包含:

  • 状态栏:当前点 / PAN / TILT / 状态
  • 两列图片:实时 PTZ 图、全景标记图
  • 控制按钮:Pan ±3/5/10、Tilt ±3/5/10、确认、跳过、退出
  • JS 轮询 /api/status 并自动刷新图片

  • [x] Step 4: 主循环接收 Web UI 指令

对每个标定点:

  • 移动到初始位置
  • 抓拍并更新 latest_ptz.jpg
  • 设置状态为 waiting
  • 调用 wait_for_command() 从队列取指令
  • 处理 pan/tilt 调整、ok、skip、quit

  • [x] Step 5: 生成校准文件

标定点 ≥4 时,拟合线性参数和 lookup tables,输出 calibration_group1_manual.json


Task 2: 部署到 RK3588

Files:

  • Create/Overwrite: /home/admin/dsh/calibration_scan_180_360_z1/manual_calibrate.py
  • Create: /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
  • Step 2: 创建默认标定点文件

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"

Task 3: 在 RK3588 启动并验证 Web UI

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.

  • Step 2: 验证 Web UI 和 API

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.


Task 4: 用户通过浏览器完成标定

Files:

  • Modify: /home/admin/dsh/calibration_scan_180_360_z1/manual_calib/manual_points.json
  • Modify: /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/

  • Step 2: 逐点调整并确认

对每个标定点 P1-P7:

  • 查看左侧 PTZ 画面是否对准右侧全景图上的红色标记
  • 使用 Pan/Tilt 按钮微调
  • 点击 确认该点
  • 页面自动进入下一点

  • [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 个有效点。


Task 5: 替换正式校准文件并验证

Files:

  • Backup: /home/admin/dsh/calibration_scan_180_360_z1/calibration_group1.json
  • Modify: /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)"
  • Step 2: 替换为新标定文件

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"
  • Step 3: 运行主程序验证

Run:

  sudo systemctl start dsh

Actual: dsh 服务已启动,main.py --skip-calibration 运行中。检测到人时 PTZ 成功移动到 (196.1°, -4.4°),方向合理;但存在 PTZ 抓拍取流失败问题(获取球机画面失败),未保存 PTZ 配对图。


Self-Review

  1. Spec coverage: Web UI、API、部署、运行、替换验证均有对应 Task。
  2. No placeholders: 所有步骤包含具体命令。
  3. Type consistency: 文件路径、JSON 字段与现有项目保持一致。