106 lines
4.6 KiB
Markdown
106 lines
4.6 KiB
Markdown
# NaviGlass 系统架构与实现详情
|
||
|
||
**更新日期**: 2026-01-06 (Day 28)
|
||
**项目状态**: ✅ 核心功能完备 / 室内导盲优化交付
|
||
|
||
---
|
||
|
||
## 🏗️ 系统总体架构
|
||
|
||
NaviGlass 采用 **端云协同** 架构,将即时性要求高的采集/播放任务放在前端眼镜终端,将算力密集的 AI 推理与大模型交互放在高性能 GPU 服务器端。
|
||
|
||
```mermaid
|
||
graph TD
|
||
subgraph Client [Avaota F1 终端]
|
||
Cam[摄像头 GC2083] -->|JPEG 流| WS_Cam[WebSocket /ws/camera]
|
||
Mic[麦克风] -->|PCM 流| WS_Audio[WebSocket /ws_audio]
|
||
IMU[传感器 ICM-42688] -->|UDP JSON| UDP_IMU[UDP :12345]
|
||
WS_Audio -->|TTS PCM| Spk[扬声器]
|
||
end
|
||
|
||
subgraph Server [RTX 3090 服务器]
|
||
WS_Cam --> |TurboJPEG| Visual[视觉感知中心]
|
||
WS_Audio --> |SenseVoice| ASR[语音识别]
|
||
UDP_IMU --> |Fusion| NavLogic[导航逻辑]
|
||
|
||
Visual --> |YOLOv11-seg| Lane[盲道检测]
|
||
Visual --> |YOLOv11-seg| Indoor[室内分割]
|
||
Visual --> |YOLOv11-det| Light[红绿灯检测]
|
||
|
||
ASR --> |Text| LLM[GLM-4V-Flash]
|
||
LLM --> |Response| EdgeTTS[语音合成]
|
||
EdgeTTS --> |PCM| WS_Audio
|
||
|
||
Lane --> |Guidance| NavMaster[导航总控]
|
||
Indoor --> |Guidance| NavMaster
|
||
NavMaster --> |Prompt| EdgeTTS
|
||
end
|
||
|
||
Client <--> |FRP Tunnel| Server
|
||
```
|
||
|
||
---
|
||
|
||
## 🧠 核心模块实现详情
|
||
|
||
### 1. 视觉感知中心 (Visual Perception)
|
||
**文件**: `NaviGlassServer/navigation_master.py`, `workflow_*.py`
|
||
|
||
* **多模态导航状态机**:
|
||
* `IDLE`: 待机/闲聊模式
|
||
* `BLINDPATH_NAV`: 盲道导航 (Outdoor)
|
||
* `INDOOR_NAV`: 室内导盲 (Indoor)
|
||
* `TRAFFIC_LIGHT`: 红绿灯检测
|
||
* `ITEM_SEARCH`: 物品寻找
|
||
* **室内导航 (Indoor) [Day 28 New]**:
|
||
* **模型**: `yolo11l-seg-indoor14.engine` (TensorRT FP16)
|
||
* **策略**: 语义分割 (Seg) 优先。提取 `floor` (CLSID 0) 生成可行走区域掩膜 (Mask),计算中心点偏移量进行方向引导。
|
||
* **避障**: 检测 `chair`, `table`, `cabinet` 等障碍物,结合深度/位置给出避让提示。
|
||
* **盲道导航 (Outdoor)**:
|
||
* **模型**: `yolo11l-seg-blind.engine`
|
||
* **算法**: `FindBestPath` 算法,计算盲道分割掩膜的主方向,引导用户居中行走。
|
||
|
||
### 2. AI 交互管道 (Voice Interaction)
|
||
**文件**: `NaviGlassServer/app_main.py`
|
||
|
||
* **ASR (语音识别)**: FunASR/SenseVoiceSmall (本地运行,强制中文 `zh`)。
|
||
* **LLM (大模型)**: ZhipuAI GLM-4.6v-Flash (通过 API)。支持视觉理解,用于 "这是什么"、"前方的文字" 等通用问答。
|
||
* **TTS (语音合成)**: EdgeTTS (本地/在线)。生成 16kHz PCM 音频流,并通过 WebSocket 实时推送到客户端播放。
|
||
|
||
### 3. 服务器性能优化 (Performance)
|
||
**关键技术**:
|
||
* **TensorRT 加速**: 所有 YOLO 模型导出为 `.engine`,启用 FP16 半精度。
|
||
* **TurboJPEG**: 替代 OpenCV 进行 JPEG 编解码,速度提升 3 倍。
|
||
* **零拷贝直传**: 非导航模式下,直接转发 JPEG 数据流给前端网页,不进行解码,CPU 占用降低 90%。
|
||
* **GPU 线程池**: `ThreadPoolExecutor` 管理 GPU 推理任务,避免 GIL 锁阻塞 Websocket 事件循环。
|
||
|
||
---
|
||
|
||
## 🕶️ 终端硬件与嵌入式实现
|
||
|
||
**平台**: Avaota F1 (全志 V821 / RISC-V 架构)
|
||
**系统**: Tina Linux (OpenWrt base, musl libc)
|
||
|
||
### 1. 传感器驱动
|
||
* **摄像头**:通过 MPP (Media Process Platform) 框架直接采集 ISP 处理后的图像,硬件编码为 JPEG。
|
||
* **IMU**: 使用 GPIO 模拟 SPI 驱动 ICM-42688,实现 10Hz 数据采集。
|
||
* **音频**: ALSA 架构。
|
||
* 播放: I2S 接口 (hw:1,0) -> MAX98357A 功放。
|
||
* 录音: Audio Codec (hw:0,0) -> 驻极体麦克风。
|
||
|
||
### 2. 客户端程序 (`NaviGlassClient`)
|
||
**语言**: C++
|
||
* **多线程架构**: `CameraThread`, `AudioCaptureThread`, `IMUThread` 独立运行。
|
||
* **断网重连**:
|
||
* WebSocket 连接具备指数退避 (Exponential Backoff) 重连机制。
|
||
* *注: 底层 WiFi 接口需依赖 OS 脚本保活。*
|
||
* **音频流**: 20ms 分包 (320 samples @ 16kHz),确保低延迟传输。
|
||
|
||
---
|
||
|
||
## 🛠️ 部署与运维
|
||
|
||
* **内网穿透**: FRP (Fast Reverse Proxy)。将本地端口 8081 (WS) 和 12345 (UDP) 暴露到公网服务器。
|
||
* **进程管理**: PM2 (Server), Systemd/Init.d (Client)。
|
||
* **可视化监控**: Web Dashboard (`/static/index.html`) 提供实时第一视角画面、IMU 姿态、AI 对话日志和系统状态监控。
|