Update project structure
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
# 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 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`:
|
||||
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个数据配置文件
|
||||
- 结合记忆条目中的经验教训和已知问题
|
||||
Reference in New Issue
Block a user