5.7 KiB
5.7 KiB
AGV + 机械臂 移动拍摄平台 — 开发记录
汇总 2026年5-6月期间的所有修复记录和任务总结
一、running.html 显示修复 + 任务执行状态实时更新 (2026-05-29 13:10)
目标
修复运行页面两个 bug:
- 模板中
{{ }}显示为原始文本(Vue 未挂载) - 任务执行过程中状态不更新(始终显示"⏳等待")
根因分析
问题1:{{ }} 原文显示
running.js写有delimiters: ['[[', ']]'],但 Vue 3 已移除此选项(被静默忽略)- Vue 3 只认
{{ }},但模板中混用了[[ ]]和{% raw %}{{ }}{% endraw %} - 残留的裸
[[ ]](log、report、errorMsg 等)未被 Jinja2 处理,Vue 也因 delimiters 冲突不解析 - 修复:删除
delimiters行 → 全部改用{% raw %}{{ }}{% endraw %}包裹 Vue 表达式
问题2:状态不更新
api_mission_state()每次都从文件初始化point_status/machine_status为全"pending"mission_executor.py完全没有跟踪point_status和machine_status- 修复:executor 添加状态跟踪 + app.py 从 executor.report 读取实时状态
修改的文件
| 文件 | 改动 |
|---|---|
running.js |
删除 delimiters: ['[[', ']]'] |
running.html |
全部 [[ ]] → {% raw %}{{ }}{% endraw %}(14处) |
app.py |
api_mission_state() 从 ex.report 读取 point_status/machine_status |
mission_executor.py |
初始化+实时更新 point_status(pending/active/done/skipped)和 machine_status(pending/active/completed) |
关键设计
point_status 状态流转:
pending→active(开始导航到点位) →done(到达) →skipped(空位永不更新)
machine_status 状态流转:
- 初始化全
pending - 正面扫码开始:
status=active, step=正面扫码 - 扫码完成:
qr=done/skipped, qr_val=xxx, step=正面拍照 - 正面拍照完成:
front=done/skipped, front_cnt++ - 背面拍照开始:
step=背面拍照 - 背面拍照完成:
back=done/skipped, back_cnt++, status=completed, step=完成
部署状态
- 所有4个文件已通过 scp 部署到
192.168.50.93 - Flask 已重启(PID 3664)
- API 验证通过:
point_status和machine_status正常返回 - 本地文件已同步回 workspace
二、AGV 蛇形路径关节反转逻辑 (2026-05-29 13:49)
需求理解
蛇形路径行走时,AGV 在不同行到达点位时朝向相反:
- 偶数行(0,2,4...)点位 → AGV 从出发方向来 → 正面/背面朝向 = 标定朝向 → 不反转
- 奇数行(1,3,5...)点位 → AGV 从对面来 → 正面/背面朝向 = 标定朝向的反面 → 反转所有关节角度
修复内容
修改 mission_executor.py:
1. _shoot() 新增 machine_row 参数
def _shoot(self, model, side, row, col, qr_value, machine_row=0):
invert = (machine_row % 2 == 1) # 奇数行=反转
if invert:
angles = [-a for a in angles] # 6个关节全部取反
调用处传入 machine_row(正面=pr,背面=pr-1)
2. _scan_qr_with_poses() 新增 machine_row 参数
def _scan_qr_with_poses(self, qr_configs, machine_row=0):
invert = (machine_row % 2 == 1)
if invert:
angles = [-a for a in angles] # 二维码扫描时也反转
3. 调用处传递 machine_row
_scan_qr_with_poses(qr_configs, machine_row=pr)— 正面扫码_shoot(model, "front", ..., pr)— 正面拍照_shoot(model, "back", ..., pr-1)— 背面拍照
部署状态
- Flask PID 20577,AGV IP 192.168.50.93
- 已通过语法检查 ✅ 已部署 ✅
三、修复删除机器姿态 404 错误 (2026-05-29)
问题描述
删除机器姿态时出现 404 错误:
/api/mission/poses/m_1778767289/pose_1778767312/undefined
URL 末尾出现 undefined,说明 poseId 参数丢失。
根因分析
JS 中存在两个同名方法 deletePose:
- 机型姿态 (L457):
deletePose(modelId, poseId)→ 调用/api/models/... - 机器姿态 (L776):
deletePose(machineId, side, poseId)→ 调用/api/mission/poses/...
Vue 方法重载机制导致参数错位,poseId 变成 undefined。
修复方案
将机器姿态方法重命名为 deleteMachinePose,避免命名冲突。
修改文件
static/js/setting.jsL776:deletePose→deleteMachinePose
部署
- setting.js 已部署到 AGV
- setting.html 已部署到 AGV(版本号更新)
- 浏览器需刷新缓存 (Ctrl+F5)
待确认
- 模板中是否有调用
deleteMachinePose的地方需同步修改
四、技术说明文档生成 (2026-06-17)
任务
为 AGV + 机械臂移动拍摄平台项目生成详细的技术说明文档
产出
- 文件:
AGV_机械臂_技术说明文档.md(888行, 39.5KB) - 内容覆盖:
- 项目概述(业务目标、核心能力、技术栈)
- 系统架构(架构图、核心文件清单)
- 硬件环境与网络拓扑(设备清单、参数)
- 核心模块详解(GlobalState、MissionExecutorV3、AGVController、ArmClient、Nav2Navigator、QRScanner、ImageUploader)
- 通信协议(Flask↔前端、ROS2、TCP Socket、Java后端)
- 完整API接口文档(11个分组、98个端点)
- 任务执行流程(生命周期、QR扫描流程、拍照流程、错误处理)
- 数据配置格式(4种JSON schema)
- 部署与运维(启动流程、部署命令、常见问题)
- 关键决策与约束(10项架构决策 + 6项已知约束)
数据来源
- 逐文件阅读了全部7个Python源文件(共~4312行代码)
- 读取了4个数据配置文件
- 结合记忆条目中的经验教训和已知问题