4 Commits
Author SHA1 Message Date
clear f4610abcb9 Release PGU5-Core v2.1.1 2026-08-13 13:38:25 +08:00
clear e357930bee Release PGU5-Core v2.0.5 2026-08-12 11:01:31 +08:00
clear 5744fca1bd Release PGU5-Core v2.0.4 2026-08-12 10:53:29 +08:00
clear 9c330d6327 Release PGU5-Core v2.0.3 2026-08-11 18:21:35 +08:00
6 changed files with 9193 additions and 2005 deletions

No files matched your search

+1 -1
View File
@@ -3,8 +3,8 @@ __pycache__/
run.log
captures/
backups/
runtime/
.vscode/
.codex
.codex/
# Local SDK/cache artifacts
+17 -5
View File
@@ -20,10 +20,10 @@ Windows 侧密码 SSH 自动化使用 Paramiko。编辑中文时必须保持 UTF
## 项目边界
- 当前应用版本和发布标签均为 `v1.1.19`。
- 当前应用版本和发布标签均为 `v2.1.1`。
- 版本字符串始终保留前导 `v`。
- 序列号使用 `PGU5A-` 加大写以太网 MAC。
- Core 不包含 PLC/Modbus、运动、水肥、业务自动化、计划任务、业务路径、Hikrobot/MVS/GenICam、AOT-PhenoXYZ、XYZ2、XYZ3 或 PGU5C 身份。
- Core 不包含 PLC/Modbus、运动、水肥、业务自动化、计划任务、业务路径、Hikrobot/MVS/GenICam 或任何应用专属身份。
- 不把应用专属功能放回 `main`。
## 事实来源
@@ -39,7 +39,7 @@ Windows 侧密码 SSH 自动化使用 Paramiko。编辑中文时必须保持 UTF
http://107.173.157.41:3000/clear/PGU5-Core.git
```
现场配置是实际设备配置。发布时如果用户要求提交当前现场状态,应保留并审查配置差异,不得直接丢弃。
现场配置是实际设备配置。每次提交、推送或发布前都必须重新读取 `192.168.101.172:/root/PGU5-Core/pgu5a_config.json`,以当前调试机运行参数为提交基线,不得直接丢弃现场差异。密码、AuthKey、令牌等设备私有认证值只保留在现场,不写入公开仓库;部署时也不得用公开配置覆盖这些值。
## 服务
@@ -58,6 +58,7 @@ OLED 是独立服务,OLED 故障不得影响主服务。
- `pgu5a_base.py` 内嵌 HTML、CSS 和 JavaScript,没有独立前端构建。
- 前端修改后提取脚本做 JavaScript 语法检查;一个语法错误会导致时钟、按钮和状态刷新同时失效。
- UI 保持紧凑、现场可操作,移动端不得横向溢出,DCL 必须完整显示画面。
- 管理中心“多光谱控制”页面通过 `GET/POST /api/ms602/detection` 管理开流检测时长、抖动、撕裂和帧率检测;保存后必须持久化并立即更新运行中的 worker,不得重启整机或全部通道。
- 配置写入保持格式化 UTF-8 JSON 和一个结尾换行。
- 不进行与用户请求无关的大范围重构。
@@ -65,9 +66,19 @@ OLED 是独立服务,OLED 故障不得影响主服务。
- MS602 和 DCL 立即启动。
- MS602 六通道按 `open_stagger_sec` 错开启动,各通道独立重连。
- MS602 连续读帧失败或满足反向垂直抖动阈值时,只重启受影响通道。
- MS602 连续读帧失败时始终允许独立重连;抖动和撕裂检测只在每次通道成功打开后的 `startup_detection_window_sec` 内运行。
- 首次启动、休眠唤醒和错误重连都会为对应通道开启新检测窗口;窗口通过后必须停止昂贵图像分析,且不得由状态轮询或保存配置重新启动检测。
- 每个通道的检测样本、截止时间和代次必须独立并受锁保护,旧开流代次的计算结果不得影响新通道实例。
- 抖动位移是在 `160x100` 检测样本上计算,现场 720 上下抖动实测约为 `0.04..0.20` 像素;不得恢复按原始分辨率误设的 `0.4` 最小位移和 `2.0` 累计位移。
- 撕裂检测同时使用跨帧低相关度大帧差和单帧横向/纵向梯度比例,避免已经撕裂且持续撕裂时因缺少连续切换而漏检。
- 启动窗口内的大幅位移按次数检测,极大位移单次触发;默认阈值分别为 `0.8`、`2` 次和 `1.0`,只恢复对应通道。
- 帧率检测是持续运行的轻量监控,不属于昂贵图像分析窗口;默认低于 `2.0 FPS` 连续 `2` 次后只重连对应通道,正常间隔必须清空连续异常次数。
- MS602 保存必须拒绝缺失、恢复中、过期或跨通道时间偏差过大的帧组;默认 `frame_max_age_sec=2.0`、`frame_max_skew_sec=1.0`。
- 通道打开后在启动检测完成前使用 `CHECKING`,通过后才转为 `CONNECTED`。
- `last_jitter_trigger_*` 和 `last_integrity_trigger_*` 必须跨通道重开保留,便于区分真实故障与阈值误判;保存检测参数不得清空已完成窗口的诊断证据。
- M3Lite 使用 GPIO 8 异步唤醒;UVC-RGB 使用 GPIO 9 异步唤醒。
- UVC-RGB 在视频节点消失、被替换或持续无新帧时重连。
- DCL 默认严格自动发现 `ClearDCLXXXXX` 视频设备名称;`camera_name` 仅作为兼容优先提示,不得要求换机时必须修改公开配置。
- 休眠递增 `sensor_wake_token`,取消旧延时唤醒线程。
- 定时保存或保存队列工作时暂停自动休眠。
@@ -79,6 +90,7 @@ OLED 是独立服务,OLED 故障不得影响主服务。
| M3 wake delay | `2.0 s` |
| UVC-RGB wake delay | `1.0 s` |
| MS602 open stagger | `0.3 s` |
| MS602 startup detection | `5.0 s` |
## M3/L640 控制
@@ -143,7 +155,7 @@ curl -fsS http://127.0.0.1:8080/api/syncthing/identity-init/status
- 主服务、OLED、Syncthing、Avahi 和 NVMe 正常。
- MS602 六通道、M3Lite、DCL 和 UVC-RGB 恢复连接。
- 实际服务页面 HTTP `200`,嵌入式 JavaScript 无语法错误。
- Core 活动目录和配置中没有 XYZ3 业务残余。
- Core 活动目录和配置中没有应用业务残余或旧工程标识。
## Git 与发布
+151 -10
View File
@@ -1,6 +1,6 @@
# PGU5-Core API
本文档对应 PGU5-Core `v1.1.19`,以 `pgu5a_base.py` 中的实际路由为准。
本文档对应 PGU5-Core `v2.1.1`,以 `pgu5a_base.py` 中的实际路由为准。
## 基本约定
@@ -41,12 +41,13 @@
| --- | --- |
| `/api/status` | 运行状态、相机状态、FPS、保存队列和自动休眠 |
| `/api/system/version` | 应用版本、Git 诊断信息和设备序列号 |
| `/api/storage` | 存储剩余空间和自动清理状态 |
| `/api/storage` | 存储总量、已用/剩余空间和自动清理状态 |
| `/api/network` | AP、STA、以太网、Syncthing 和 HS 状态 |
| `/api/network/headscale/task` | HS 后台任务进度 |
| `/api/syncthing/identity-init/status` | Syncthing 身份初始化进度 |
| `/api/ota/status` | OTA 当前状态 |
| `/api/m3/control` | M3/L640 热成像 USB 控制状态 |
| `/api/ms602/detection` | MS602 抖动、撕裂、帧率检测参数和六通道诊断 |
| `/api/ssh/read` | 读取 Web SSH PTY 输出 |
| `/api/config` | 读取当前 JSON 配置文本 |
| `/api/logs` | 获取内存运行日志 |
@@ -58,6 +59,10 @@
| `/frame/m3lite.jpg` | M3Lite 预览 |
| `/frame/dcl.jpg` | DCL 预览 |
| `/frame/uvc_rgb.jpg` | UVC-RGB 预览 |
| `/assets/logo.png` | 产品 Logo |
| `/assets/xterm.js` | Web SSH 终端脚本,按需加载 |
| `/assets/xterm.css` | Web SSH 终端样式,按需加载 |
| `/assets/xterm.LICENSE` | xterm.js 许可证文本 |
### POST
@@ -72,6 +77,7 @@
| `/api/sensors/power` | 唤醒或休眠传感器 |
| `/api/sensors/auto_sleep` | 设置自动休眠时间 |
| `/api/m3/auto_nuc` | 设置并保存自动 NUC |
| `/api/ms602/detection` | 保存并立即应用 MS602 抖动、撕裂、帧率检测参数 |
| `/api/network/scan` | 扫描 Wi-Fi |
| `/api/network/ap` | 修改 AP |
| `/api/network/sta/connect` | 连接 STA |
@@ -243,14 +249,16 @@ curl -X POST http://127.0.0.1:8080/api/save -d "target=all"
### `GET /api/storage`
返回剩余空间、刷新周期、版本以及自动清理结果:
返回存储总量、已用/剩余空间、刷新周期、版本以及自动清理结果:
```json
{
"save_root": "/nvme-data/pgu_data",
"free_gb": 120.5,
"used_gb": 118.0,
"total_gb": 238.5,
"refresh_ms": 5000,
"app_version": "v1.1.19",
"app_version": "v2.1.1",
"auto_cleanup": {}
}
```
@@ -372,6 +380,119 @@ curl -X POST http://127.0.0.1:8080/api/files/download \
修改后立即写入 `pgu5a_config.json`。
`GET /api/status` 的 `sensor_power.auto_sleep` 返回:
```json
{
"minutes": 15.0,
"idle_for_sec": 120.0,
"remaining_sec": 780.0,
"enabled": true,
"paused": false,
"activity_running": false
}
```
定时采集开启或保存队列仍有任务时,`paused` 和 `activity_running` 为 `true`,自动休眠倒计时暂停。
### `GET /api/ms602/detection`
返回当前运行中的检测参数和六通道实时诊断:
```json
{
"ok": true,
"config": {
"startup_detection_window_sec": 5.0,
"jitter_detection_enabled": true,
"jitter_shift_min": 0.04,
"jitter_shift_max": 0.5,
"jitter_horizontal_max": 0.25,
"jitter_restart_reversals": 3,
"jitter_window_sec": 3.0,
"jitter_cancellation_ratio": 0.35,
"jitter_total_shift_min": 0.35,
"jitter_large_shift_min": 0.8,
"jitter_large_shift_events": 2,
"jitter_extreme_shift_min": 1.0,
"frame_integrity_detection_enabled": true,
"frame_integrity_phase_response_min": 0.55,
"frame_integrity_delta_min": 8.0,
"frame_integrity_restart_events": 2,
"frame_integrity_window_sec": 3.0,
"frame_tearing_gradient_ratio_min": 2.0,
"frame_tearing_row_diff_min": 5.5,
"frame_rate_detection_enabled": true,
"frame_rate_min": 2.0,
"frame_rate_memory": 2,
"frame_max_age_sec": 2.0,
"frame_max_skew_sec": 1.0
},
"channels": {
"480": {
"status": "CONNECTED",
"device_index": 20,
"restart_count": 1,
"jitter_count": 0,
"frame_integrity_count": 1,
"frame_rate_count": 0,
"frame_rate_fps": 8.1,
"frame_rate_low_streak": 0,
"frame_rate_result": "ok",
"detection_active": false,
"detection_remaining_sec": 0.0,
"detection_result": "passed",
"detection_run_count": 1,
"detection_sample_count": 24,
"last_phase_response": 0.98,
"last_frame_delta": 1.2,
"last_tearing_gradient_ratio": 1.31,
"last_tearing_row_diff": 4.58,
"last_integrity_trigger_events": 2,
"last_integrity_trigger_gradient_ratio": 2.64,
"last_integrity_trigger_row_diff": 8.01
}
}
}
```
### `POST /api/ms602/detection`
表单字段与范围:
| 字段 | 范围 | 说明 |
| --- | --- | --- |
| `startup_detection_window_sec` | `1.0..60.0` | 每次成功打开通道后的检测时长,默认 `5.0` 秒 |
| `jitter_detection_enabled` | 布尔值 | 开关小抖动检测 |
| `jitter_shift_min` | `0.01..10.0` | `160x100` 检测样本上的最小上下位移 |
| `jitter_shift_max` | `0.1..20.0` | 最大上下位移,必须不小于最小值 |
| `jitter_horizontal_max` | `0.01..10.0` | 允许的最大左右位移 |
| `jitter_restart_reversals` | `2..20` | 反向次数阈值 |
| `jitter_window_sec` | `1.0..30.0` | 抖动统计窗口,秒 |
| `jitter_cancellation_ratio` | `0.05..0.8` | 来回位移抵消比例阈值 |
| `jitter_total_shift_min` | `0.05..50.0` | 累计位移阈值 |
| `jitter_large_shift_min` | `0.1..20.0` | 启动窗口内大幅垂直位移阈值 |
| `jitter_large_shift_events` | `1..20` | 大幅位移累计达到此次数后恢复当前通道 |
| `jitter_extreme_shift_min` | `0.1..20.0` | 单次极大垂直位移阈值,必须不小于大幅位移阈值 |
| `frame_integrity_detection_enabled` | 布尔值 | 开关撕裂检测 |
| `frame_integrity_phase_response_min` | `0.1..0.95` | 相位相关度阈值;调高更敏感 |
| `frame_integrity_delta_min` | `1.0..100.0` | 帧差阈值;调低更敏感 |
| `frame_integrity_restart_events` | `2..20` | 窗口内异常次数阈值 |
| `frame_integrity_window_sec` | `1.0..30.0` | 撕裂统计窗口,秒 |
| `frame_tearing_gradient_ratio_min` | `1.1..5.0` | 单帧纵向变化与横向变化的比例阈值 |
| `frame_tearing_row_diff_min` | `1.0..30.0` | 单帧横向断层强度阈值 |
| `frame_rate_detection_enabled` | 布尔值 | 开关运行期轻量帧率检测 |
| `frame_rate_min` | `0.1..60.0` | 单通道最低成功读帧 FPS |
| `frame_rate_memory` | `1..20` | 连续低帧率间隔达到此次数后恢复当前通道 |
`frame_max_age_sec` 和 `frame_max_skew_sec` 用于保存前校验六通道帧组是否新鲜、时间是否足够同步。它们当前通过配置文件管理,不由检测页面修改。
保存成功后先写入 `pgu5a_config.json`,再更新运行中的 MS602 worker 并清空当前检测样本。参数立即用于仍在进行的开流自检;已经通过的通道不会因为保存配置而重新开始检测。该操作不重启服务、不重启整机,也不会主动重启正常通道。
每个通道只在首次启动、休眠唤醒或错误重连后开启独立图像检测窗口。窗口结束且未触发异常时,`detection_result` 变为 `passed`,后续预览帧在进入灰度转换、缩放、相位相关和帧差计算前直接返回。帧率检测只记录成功读帧间隔,运行期间持续生效;低帧率累计达到阈值时也只请求重启对应通道。
管理中心诊断表只显示 `device_index` 的数字节点编号,例如 `12`;API 仍返回完整的 `device_index` 和通道状态消息,后台设备路径与相机打开逻辑不变。
### `GET /api/m3/control`
返回低频轮询缓存:
@@ -562,17 +683,37 @@ POST /api/ssh/close
"open_stagger_sec": 0.3,
"read_fail_restart_count": 5,
"channel_reconnect_delay_sec": 0.8,
"startup_detection_window_sec": 5.0,
"jitter_detection_enabled": true,
"jitter_shift_min": 0.4,
"jitter_shift_max": 2.5,
"jitter_horizontal_max": 0.5,
"jitter_shift_min": 0.04,
"jitter_shift_max": 0.5,
"jitter_horizontal_max": 0.25,
"jitter_restart_reversals": 3,
"jitter_window_sec": 3.0,
"jitter_cancellation_ratio": 0.35,
"jitter_total_shift_min": 2.0
"jitter_total_shift_min": 0.35,
"jitter_large_shift_min": 0.8,
"jitter_large_shift_events": 2,
"jitter_extreme_shift_min": 1.0,
"frame_integrity_detection_enabled": true,
"frame_integrity_phase_response_min": 0.55,
"frame_integrity_delta_min": 8.0,
"frame_integrity_restart_events": 2,
"frame_integrity_window_sec": 3.0,
"frame_tearing_gradient_ratio_min": 2.0,
"frame_tearing_row_diff_min": 5.5,
"frame_rate_detection_enabled": true,
"frame_rate_min": 2.0,
"frame_rate_memory": 2,
"frame_max_age_sec": 2.0,
"frame_max_skew_sec": 1.0
}
```
小幅反向垂直抖动继续使用位移方向、抵消比例和累计位移判断,位移值基于 `160x100` 检测样本。大幅位移按窗口内次数判断,极大位移单次即可触发。对于画面撕裂、错行等坏帧,检测器同时统计跨帧低相位相关度大帧差,以及单帧横向断层梯度;这些昂贵分析只在开流检测窗口运行。帧率监控持续记录成功读帧间隔,连续低 FPS 时只重启对应 MS602 通道。`ms602_channels` 会附带检测状态、恢复计数、相位相关度、帧差、断层、当前 FPS 和低帧率连续次数等诊断字段。
`dcl.auto_detect=true` 时运行时严格匹配 `ClearDCLXXXXX` 视频设备名称。`dcl.camera_name` 如存在仅作为优先提示;未配置或更换设备时无需修改发布配置。
### 服务和电源接口
| 接口 | 行为 |
@@ -619,9 +760,9 @@ git fetch --force origin refs/tags/<tag>:refs/tags/<tag>
随后切换标签、执行 Python 编译验证并重启主服务。没有手动回滚接口,也不创建项目外 OTA 备份目录。
## 已移除接口
## 排除的应用接口
PGU5-Core 不提供 XYZ3 业务接口。以下路径应返回 HTTP `404`:
PGU5-Core 不提供应用层业务控制接口。以下路径应返回 HTTP `404`:
```text
/api/plc/*
+49 -20
View File
@@ -1,14 +1,14 @@
# PGU5-Core
PGU5-Core 是运行在 Orange Pi 4 Pro 上的 PGU5A 开放管理平台核心程序,提供相机采集、预览与保存、传感器电源管理、文件管理、网络配置、OTA、Web SSH、OLED、RTC 和 NVMe 集成。
PGU5-Core 是运行在 Orange Pi 4 Pro 上的 PGU5 开放平台核心程序,提供相机采集、预览与保存、传感器电源管理、文件管理、网络配置、OTA、Web SSH、OLED、RTC 和 NVMe 集成。
## 项目标识
| 项目 | 当前值 |
| --- | --- |
| 产品 | PGU5A 开放管理平台 |
| 应用版本 | `v1.1.19` |
| 发布标签 | `v1.1.19` |
| 产品 | PGU5 开放平台 |
| 应用版本 | `v2.1.1` |
| 发布标签 | `v2.1.1` |
| 设备序列号 | `PGU5A-` + 大写以太网 MAC |
| 现场目录 | `/root/PGU5-Core` |
| Web | `http://192.168.101.172:8080/` |
@@ -20,13 +20,14 @@ PGU5-Core 是运行在 Orange Pi 4 Pro 上的 PGU5A 开放管理平台核心程
当前 Core 功能:
- MS602 六通道采集、预览、保存和独立通道恢复。
- MS602 六通道采集、预览、保存,以及开流自检阶段的小幅反向抖动、大幅/极大位移、低相关度撕裂帧检测和持续低成本帧率监控;异常时只恢复对应通道。
- M3Lite 热成像采集、温度数据保存和 PyUSB 控制。
- DCL 与 UVC-RGB/IMX766 采集、预览和保存。
- DCL 严格按 `ClearDCLXXXXX` 序列号名称自动发现;DCL 与 UVC-RGB/IMX766 均支持采集、预览和保存。
- 单次保存、在线定时保存、保存队列和自动休眠。
- 文件浏览、预览、ZIP 下载、后台永久删除和空间自动清理。
- AP、STA、以太网、HS/Headscale 和 Syncthing 管理。
- Web SSH、配置编辑、服务重启、安全关机和 OTA。
- 管理中心提供多光谱控制页,可开关并调节小抖动、大幅/极大位移、撕裂和帧率检测,保存后即时生效并持久化,同时查看六通道实时恢复诊断。
- 独立 OLED、DS3231 和 NVMe 服务。
不属于 Core 的功能:
@@ -34,17 +35,40 @@ PGU5-Core 是运行在 Orange Pi 4 Pro 上的 PGU5A 开放管理平台核心程
- PLC/Modbus、运动控制、水肥控制。
- 业务自动化、计划任务和业务路径配置。
- Hikrobot/MVS/GenICam。
- AOT-PhenoXYZ、XYZ2、XYZ3 或 PGU5C 产品身份。
- 任何应用专属产品身份、业务页面或部署路径。
## v1.1.19
## v2.1.1
- MS602 每个通道独立重连,并支持连续读帧失败和反向垂直抖动恢复。
- UVC-RGB 在 `/dev/videoN` 消失、被替换或持续无新帧时自动重扫。
- 增加 Syncthing 设备身份初始化和安全关机。
- 配置文件稳定写入为 UTF-8、LF 和单个结尾换行。
- M3/L640 USB 事务完成后释放接口和 PyUSB 资源。
- AP/STA 默认名称统一为 `PGU5A-AP` 和 `PGU5A-STA`。
- 保持 XYZ3 业务应用接口和配置不进入 Core。
- 同步 `v2.0.5..v2.1.1` 通用平台能力,不包含 PLC、运动、水肥、业务自动化、计划任务或 MVS/GenICam。
- MS602 新增启动期大幅/极大垂直位移检测,解决短时高幅跳动画面可能越过小抖动上限而漏检的问题。
- MS602 新增持续低成本单通道帧率监控;连续低于阈值时只重连对应波段,不持续执行灰度缩放、相位相关或撕裂分析。
- 开流后先显示 `CHECKING`,通过启动检测窗口后再转为 `CONNECTED`,避免画面尚未完成自检时过早显示正常。
- DCL 支持严格 `ClearDCLXXXXX` 名称自动发现,现场 `camera_name` 仅作为优先提示,不再是换机必须修改的绑定项。
- DCL 预览宽度同步为 `720`,刷新间隔调整为 `350ms`,在提升预览细节的同时控制浏览器和网络刷新负载。
## v2.0.5
- 多光谱六通道诊断表的“设备”列仅显示视频节点编号,例如 `/dev/video12` 显示为 `12`,减少现场界面的实现细节。
- 后端 `device_index`、设备路径、运行日志和通道打开逻辑保持不变,不影响设备识别、恢复和 API 诊断。
## v2.0.4
- 新增管理中心“多光谱控制”页面,可持久化调整 MS602 开流检测时长、小抖动和撕裂检测参数,并查看六通道诊断。
- MS602 昂贵图像分析只在首次启动、休眠唤醒或错误重连后的短暂窗口内运行;通过后停止检测,读帧失败仍保持独立通道恢复。
- 增强持续撕裂和 720 通道轻微上下抖动识别,使用通道代次、独立锁和诊断证据避免旧线程影响新实例。
- 管理中心所有页面统一可滚动高度链;多光谱诊断表完整显示通道、设备节点和检测指标,移动端改为无横向溢出的分组布局。
- 修复暗色主题移动端导航按钮、系统设置菜单、根页面白边和多处文字/组件样式,统一非业务管理界面。
- 清理空响应式规则、Python 缓存和历史部署临时备份,保留现场配置、配置备份、运行日志和 OTA 状态。
## v2.0.3
- 全面升级桌面与移动端 Web UI,统一浅色/深色主题、弹窗、导航、文件管理和管理工具布局。
- 增加中英文界面切换、商业化产品文案、现代化品牌区和紧凑设备状态展示。
- 文件管理支持分页、图像预览、原始文件访问、ZIP 下载、后台永久删除和空间统计。
- Web SSH 静态资源改为按需加载,并随仓库保留许可证文件。
- 自动清理在用户编辑期间不覆盖表单,日志增加结构化时间信息和轻量提示反馈。
- 保留多相机独立恢复、异步传感器上电、M3/L640 PyUSB 控制、OTA、Syncthing、OLED、RTC 和 NVMe 能力。
- 清除旧工程标识、业务接口说明和不属于 Core 的历史残余。
完整接口、参数和副作用见 [API.md](API.md)。
@@ -54,7 +78,7 @@ PGU5-Core 是运行在 Orange Pi 4 Pro 上的 PGU5A 开放管理平台核心程
| --- | --- |
| `pgu5a_base.py` | Web、API、相机、保存、网络、OTA 和管理逻辑 |
| `pgu5a_config.json` | 现场运行配置 |
| `assets/` | Logo 和 xterm.js 静态资源 |
| `assets/` | Logo、按需加载的 xterm.js/xterm.css 及许可证 |
| `ota/ota_update.py` | 独立 OTA 更新器 |
| `oled/` | SSD1306 OLED 独立服务 |
| `ds3231/` | RTC/NTP 同步 |
@@ -62,7 +86,7 @@ PGU5-Core 是运行在 Orange Pi 4 Pro 上的 PGU5A 开放管理平台核心程
| `backups/config/` | 配置编辑器备份,不提交 |
| `backups/ota_state.json` | OTA 运行状态,不提交 |
现场 `pgu5a_config.json` 是配置事实来源,不应当作普通本地差异丢弃。
现场 `pgu5a_config.json` 是配置事实来源,不应当作普通本地差异丢弃。每次提交、推送或发布前必须重新读取 `192.168.101.172:/root/PGU5-Core/pgu5a_config.json`,以当前调试机运行参数更新仓库配置。密码、AuthKey、令牌等设备私有认证值只保留在现场,部署时不得使用公开配置覆盖。
## 服务
@@ -79,7 +103,12 @@ PGU5-Core 是运行在 Orange Pi 4 Pro 上的 PGU5A 开放管理平台核心程
## 相机与电源
- MS602 和 DCL 唤醒时立即启动。
- MS602 六通道按 `ms602.open_stagger_sec` 间隔启动,当前默认 `0.3` 秒。
- MS602 六通道按 `ms602.open_stagger_sec` 间隔启动,当前现场值 `0.3` 秒。
- MS602 每个通道仅在首次启动、休眠唤醒或错误重连后执行昂贵的开流图像自检,默认持续 `5.0` 秒;通过后停止灰度、缩放、相位相关和帧差分析。
- 开流自检期间判断小幅反向垂直抖动、大幅/极大位移、跨帧低相关度大帧差和单帧横向断层;达到阈值时只重启受影响通道,并在重新打开后开始新一轮独立自检。
- 轻量帧率监控在通道运行期间持续工作,默认最低 `2.0 FPS`、连续 `2` 次低帧率后恢复对应通道;正常间隔会清空连续异常计数。
- 保存 MS602 六通道数据前校验缺失、恢复中、过期和跨通道时间偏差,默认最大帧龄 `2.0` 秒、最大时间偏差 `1.0` 秒。
- 管理中心的“多光谱控制”页面可调整全部检测参数;保存写入 `pgu5a_config.json`,无需重启服务或整机。
- M3Lite 使用 GPIO 8 延时上电,当前唤醒延迟 `2.0` 秒。
- UVC-RGB 使用 GPIO 9 延时上电,当前唤醒延迟 `1.0` 秒。
- 休眠会递增唤醒令牌,取消尚未完成的延时启动。
@@ -90,8 +119,8 @@ PGU5-Core 是运行在 Orange Pi 4 Pro 上的 PGU5A 开放管理平台核心程
界面当前版本来自:
```python
APP_VERSION = "v1.1.19"
APP_RELEASE_TAG = "v1.1.19"
APP_VERSION = "v2.1.1"
APP_RELEASE_TAG = "v2.1.1"
```
Git 信息只用于诊断。在线升级先检查 Gitea Release,只有发现更新后才启用升级按钮。OTA 状态包括:
+8951 -1962
View File
File diff suppressed because it is too large. Load diff
+24 -7
View File
@@ -7,7 +7,7 @@
"base_ifname": "wlan0",
"connection_name": "PGU5A-AP",
"ssid": "PGU5A-Base",
"password": "Bone1644",
"password": "",
"ipv4_address": "192.168.88.1/24"
},
"sta": {
@@ -26,11 +26,11 @@
"stream_fps": 10,
"ms602_preview_width": 280,
"m3lite_preview_width": 320,
"dcl_preview_width": 480,
"dcl_preview_width": 720,
"uvc_rgb_preview_width": 240,
"ms602_refresh_ms": 200,
"m3lite_refresh_ms": 200,
"dcl_refresh_ms": 200,
"dcl_refresh_ms": 350,
"uvc_rgb_refresh_ms": 480,
"disk_refresh_sec": 5.0,
"capture_interval_sec": 1.0,
@@ -48,14 +48,30 @@
"open_stagger_sec": 0.3,
"read_fail_restart_count": 5,
"channel_reconnect_delay_sec": 0.8,
"startup_detection_window_sec": 5.0,
"jitter_detection_enabled": true,
"jitter_shift_min": 0.4,
"jitter_shift_max": 2.5,
"jitter_horizontal_max": 0.5,
"jitter_shift_min": 0.04,
"jitter_shift_max": 0.5,
"jitter_horizontal_max": 0.25,
"jitter_restart_reversals": 3,
"jitter_window_sec": 3.0,
"jitter_cancellation_ratio": 0.35,
"jitter_total_shift_min": 2.0
"jitter_total_shift_min": 0.35,
"jitter_large_shift_min": 0.8,
"jitter_large_shift_events": 2,
"jitter_extreme_shift_min": 1.0,
"frame_integrity_detection_enabled": true,
"frame_integrity_phase_response_min": 0.55,
"frame_integrity_delta_min": 8.0,
"frame_integrity_restart_events": 2,
"frame_integrity_window_sec": 3.0,
"frame_tearing_gradient_ratio_min": 2.0,
"frame_tearing_row_diff_min": 5.5,
"frame_rate_detection_enabled": true,
"frame_rate_min": 2.0,
"frame_rate_memory": 2,
"frame_max_age_sec": 2.0,
"frame_max_skew_sec": 1.0
},
"m3lite": {
"width": 640,
@@ -75,6 +91,7 @@
"control_timeout_ms": 2500
},
"dcl": {
"auto_detect": true,
"camera_name": "ClearDCL00011",
"width": 3840,
"height": 1080,