Files
smart-inspection/docs/开发记录_2026-05_06.md
T
2026-06-19 18:10:43 +08:00

152 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AGV + 机械臂 移动拍摄平台 — 开发记录
> 汇总 2026年5-6月期间的所有修复记录和任务总结
---
## 一、running.html 显示修复 + 任务执行状态实时更新 (2026-05-29 13:10)
### 目标
修复运行页面两个 bug
1. 模板中 `{{ }}` 显示为原始文本(Vue 未挂载)
2. 任务执行过程中状态不更新(始终显示"⏳等待")
### 根因分析
**问题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` 参数**
```python
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` 参数**
```python
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 20577AGV IP 192.168.50.93
- 已通过语法检查 ✅ 已部署 ✅
---
## 三、修复删除机器姿态 404 错误 (2026-05-29)
### 问题描述
删除机器姿态时出现 404 错误:
```
/api/mission/poses/m_1778767289/pose_1778767312/undefined
```
URL 末尾出现 `undefined`,说明 `poseId` 参数丢失。
### 根因分析
JS 中存在两个同名方法 `deletePose`
1. **机型姿态** (L457): `deletePose(modelId, poseId)` → 调用 `/api/models/...`
2. **机器姿态** (L776): `deletePose(machineId, side, poseId)` → 调用 `/api/mission/poses/...`
Vue 方法重载机制导致参数错位,`poseId` 变成 `undefined`
### 修复方案
将机器姿态方法重命名为 `deleteMachinePose`,避免命名冲突。
### 修改文件
- `static/js/setting.js` L776: `deletePose``deleteMachinePose`
### 部署
- setting.js 已部署到 AGV
- setting.html 已部署到 AGV(版本号更新)
- 浏览器需刷新缓存 (Ctrl+F5)
### 待确认
- 模板中是否有调用 `deleteMachinePose` 的地方需同步修改
---
## 四、技术说明文档生成 (2026-06-17)
### 任务
为 AGV + 机械臂移动拍摄平台项目生成详细的技术说明文档
### 产出
- **文件**: `AGV_机械臂_技术说明文档.md` (888行, 39.5KB)
- **内容覆盖**:
1. 项目概述(业务目标、核心能力、技术栈)
2. 系统架构(架构图、核心文件清单)
3. 硬件环境与网络拓扑(设备清单、参数)
4. 核心模块详解(GlobalState、MissionExecutorV3、AGVController、ArmClient、Nav2Navigator、QRScanner、ImageUploader
5. 通信协议(Flask↔前端、ROS2、TCP Socket、Java后端)
6. 完整API接口文档(11个分组、98个端点)
7. 任务执行流程(生命周期、QR扫描流程、拍照流程、错误处理)
8. 数据配置格式(4种JSON schema
9. 部署与运维(启动流程、部署命令、常见问题)
10. 关键决策与约束(10项架构决策 + 6项已知约束)
### 数据来源
- 逐文件阅读了全部7个Python源文件(共~4312行代码)
- 读取了4个数据配置文件
- 结合记忆条目中的经验教训和已知问题