diff --git a/DOC_RULES.md b/DOC_RULES.md index bf4b300..a99bc32 100644 --- a/DOC_RULES.md +++ b/DOC_RULES.md @@ -68,23 +68,28 @@ NaviGlass/Docs/ > ⚠️ **仅当用户明确要求更新 `task_complete.md` 时才更新** -### 更新内容 -```markdown -## ✅ 已完成任务 +### 更新原则 +- **格式一致性**:直接参考 `task_complete.md` 现有格式(列表/表格)追加内容。 +- **进度更新**:仅在阶段性里程碑时更新进度百分比。 -### [模块名称] -- [x] 功能描述 (Day N) - - [x] 子功能 1 -``` +### 🔍 完整性检查清单 (必做) +每次更新 `task_complete.md` 时,必须**逐一检查**以下所有板块: -### 进度表更新 -```markdown -| 模块 | 完成度 | 状态 | -|------|--------|------| -| 网络通信 | 100% | ✅ 完成 | -``` +1. **文件头部 & 导航** + - [ ] `更新时间`:必须是当天日期 + - [ ] `整体进度`:简述当前状态 (e.g. "优化交付") + - [ ] `快速导航`:Day 范围与文档一致 +2. **核心任务区** + - [ ] `已完成任务`:添加新的 [x] 项目 + - [ ] `后续规划与遗留问题`:管理三色板块 (优先/债务/未来),移除已完成项 +3. **统计与回顾** + - [ ] `进度统计`:更新对应模块的状态描述和百分比 + - [ ] `里程碑`:若有重大进展,追加 `## Milestone N` (注意用 **完成时间**) +4. **底部链接** + - [ ] `时间线`:追加今日概括,确保与 DayLog 一致 + - [ ] `相关文档`:更新 DayLog 链接范围 (e.g. `Day1-Day28`) -- 仅在阶段性里程碑时更新进度百分比 +> **口诀**:头尾时间要对齐,任务规划两手抓,里程碑上别落下。 --- @@ -106,4 +111,4 @@ NaviGlass/Docs/ --- -**最后更新**:2025-12-25 +**最后更新**:2026-01-06 diff --git a/DevLogs/Day28.md b/DevLogs/Day28.md new file mode 100644 index 0000000..44ab5d0 --- /dev/null +++ b/DevLogs/Day28.md @@ -0,0 +1,60 @@ +# Day 28: 室内导航优化与 Bug 修复 (2026-01-06) + +## 🎯 今日目标 +1. **修复室内导航无语音播报问题**。 +2. **优化“未检测到可行走区域”的播报逻辑,消除闪烁**。 +3. **切换到更精准的室内分割模型 (14类)**。 +4. **解决 TTS 音频末尾的“啪”声**。 +5. **排查终端 WiFi 断连后无法重连的问题**。 + +## 🔧 实施细节 + +### 1. 模型切换与优化 +- **切换模型**: 从原 `yolo11l-seg-indoor.engine` (22类) 切换为 `yolo11l-seg-indoor14.engine` (14类,专为室内地板优化)。 +- **类别映射更新**: 修改 `workflow_indoor.py` 以适配 14 类数据集 (MIT Indoor Subset): + - 可行走区域:`floor(0)`, `corridor(1)`, `sidewalk(2)` + - 静态障碍物:`chair(3)`, `table(4)`, `sofa_bed(5)`, `cabinet(11)`, `trash_can(12)` + - 兴趣点:`door(6)`, `elevator(7)`, `stairs(8)` + - 动态障碍:`person(10)` +- **效果**: 地板 (`floor`) 检测置信度显著提升(0.85+),彻底解决了“无法识别地面”的问题。 +- **识别逻辑优化**: + - **视觉持久化**: 引入可行走区域 Mask 缓冲机制,防止因单帧检测失败导致的“绿道闪烁”现象。 + - **阈值微调**: 将 `WALKABLE_MIN_AREA` 降至 50,提高对狭窄路段或远距离地面的检出灵敏度。 + - **可视化增强**: 完善 `_draw_indoor_visualizations`,确保实时渲染分割掩膜与避障框。 + +### 2. 语音播报修复 +- **强制首播机制**: 修复了 `IndoorNavigator` 中“未检测到可行走区域”的节流逻辑。 + - **问题**: 初始化时间 `last_no_walkable_time` 为 0,导致首次检测失败时由于时间差过大或逻辑判断失误被跳过。 + - **修复**: 增加显式判断 `if self.last_no_walkable_time == 0`,确保首次检测到无路时**立即播报**,后续保持 8 秒间隔。 +- **启动即时反馈**: 在 `app_main.py` 中,收到“室内导航”指令后,立即播报“**室内导航已启动,正在寻找可行走区域**”,消除用户等待时的不确定感。 +- **崩溃修复**: 移除了新模型中不存在的 `CLASS_TOILET` 和 `CLASS_SINK` 引用,解决了后台报错导致的导航中断。 +- **语音识别优化**: + - **别名扩展**: 针对 SenseVoice 的同音误识,增加了 `["四内导航", "思维导航", "失内导航", "室类导航"]` 等别名映射,确保“室内导航”指令的高唤醒率。 + - **短指令支持**: 允许单独说“导航”触发盲道导航,防止吞字导致命令失效。 + +### 3. 音频体验优化 +- **消除“啪”声**: 在 `app_main.py` 的 TTS 播放流末尾,将静音填充时长从 60ms 增加到 **200ms**,有效消除了音频截断带来的爆音。 + +### 4. 终端 WiFi 重连问题分析 +- **现象**: 终端离开 WiFi 范围后断网,返回后无法自动重连。 +- **分析**: 客户端程序 (`NaviGlassClient`) 的 WebSocket 连接逻辑已有无限重试和指数退避机制。无法重连是因为底层操作系统 (Tina Linux) 的 WiFi 接口在断开后未自动重新关联 AP。 +- **结论**: 此为系统配置问题,非 App 代码 Bug。 +- **建议**: 在终端部署后台脚本 (`wifi_check.sh`),定期检测网关连通性并在断网时重启 WiFi 接口。 + +## 📊 结果验证 +- ✅ **地面检测**: 14类模型能稳定识别大面积 `floor` (area > 60000)。 +- ✅ **语音反馈**: 启动导航和无路警告均能正常听到,不再静默。 +- ✅ **稳定性**: 修复未定义变量错误后,导航进程稳定运行。 +- ⚠️ **遗留问题**: 终端 WiFi 自动重连需在设备端通过脚本解决。 + +### 5. 文档体系重构与完善 +- **系统架构图更新**: 重写 `implementation_plan_complete.md`,新增基于 Mermaid 的端云协同架构图,更新至 Day 28 状态。 +- **任务清单优化**: 全面整理 `task_complete.md`,合并“技术债务/未来规划”板块,优化快速导航与排版。 +- **技术文档刷新**: 更新《技术栈对比》与《服务器技术栈》,纳入室内导盲 (14类) 与新 AI 管道信息。 +- **更新规则精简**: 优化 `DOC_RULES.md`,移除冗余示例,确立“轻量化检查清单”原则。 + +--- + +## 📝 下一步计划 +1. 在真实环境中实测 14 类模型的避障效果。 +2. (终端侧) 部署 WiFi 保活脚本。 diff --git a/implementation_plan_complete.md b/implementation_plan_complete.md index b0097e8..4db5e23 100644 --- a/implementation_plan_complete.md +++ b/implementation_plan_complete.md @@ -1,693 +1,105 @@ -# Avaota F1 技术实现总结 +# NaviGlass 系统架构与实现详情 -**版本**:v3.5 -**日期**?025-12-17 -**平台**:Avaota F1 (全志 V821 / 32-bit RISC-V) -**项目进度**?00% - [查看任务清单](task_complete.md) +**更新日期**: 2026-01-06 (Day 28) +**项目状态**: ✅ 核心功能完备 / 室内导盲优化交付 --- -## 📖 文档说明 - -本文档专注于**技术实现细节、难点解决和经验总结**? -如需查看?- 📋 **任务进度、里程碑、时间线** ?`task_complete.md` -- 📝 **开发日志详?* ?`Day1-8.md` - ---- - -## 🔧 技术栈总结 - -### 硬件外设 - -| 模块 | 型号/接口 | 实现方式 | 关键参数 | -|------|-----------|---------|----------| -| **音频输出** | MAX98357A (I2S) | Device Tree + ALSA | PD12/PD13/PD15, 16kHz | -| **音频输入** | 板载模拟麦克?| Audio Codec ADC | MIC Gain=25, 16kHz Mono | -| **IMU** | ICM-42688-P | GPIO 模拟 SPI | ±16g, ±2000°/s, ~500kHz | -| **摄像?* | GC2083 (MIPI) | MPP 框架 | 1280x720@20fps, JPEG Q80 | -| **网络** | 以太?WiFi | 板载 | - | - -### 软件架构 - -| 组件 | 技术栈 | 说明 | -|------|--------|------| -| **AudioCapture** | ALSA API | 麦克风录音,S16_LE格式 | -| **AudioPlayer** | ALSA API | 扬声器播?| -| **ICM42688** | GPIO + SPI协议 | 自实现SPI驱动 | -| **Camera** | MPP (VI/ISP/VENC) | JPEG硬件编码 | -| **UDPSender** | BSD Socket | 静态链?| -| **WSClient** | 自实?+ BSD Socket | WebSocket客户端(支持二进制数据) | -| **HTTPClient** | libcurl | HTTP客户?| - -### 编译工具链(更新:使?musl? -```makefile -SDK_ROOT := ~/ProgramFiles/AvaotaF1/avaota_sdk/tina-v821-release - -# ⚠️ 关键修正:使?musl 工具链(Day 9?TOOLCHAIN_DIR := $(SDK_ROOT)/prebuilt/rootfsbuilt/riscv/nds32le-linux-musl-v5d/bin -CROSS_COMPILE := riscv32-linux-musl- - -# 旧配置(不兼容开发板?# TOOLCHAIN_DIR := $(SDK_ROOT)/out/toolchain/nds32le-linux-glibc-v5d/bin -# CROSS_COMPILE := riscv32-unknown-linux- - -CC := $(TOOLCHAIN_DIR)/$(CROSS_COMPILE)gcc -CXX := $(TOOLCHAIN_DIR)/$(CROSS_COMPILE)g++ -``` - -**关键链接?*?0+ 静态库): -- MPP框架:aw_mpp, media_utils, awion -- ISP处理?2个ISP?- 视频编解码:vencoder, vdecoder, Cedar?- 音频处理:adecoder, aencoder, AGC, AEC -- 文件格式:muxers, demuxer, parser - ---- - -## 💡 技术难点与解决方案 - -### 1. I2S 音频输出配置 - -#### 问题 -- Device Tree 初始配置错误 -- 引脚功能冲突 -- `simple-audio-card` 无法正常工作 - -#### 解决方案 -```dts -// 参?LVDS 成功配置,为每个引脚创建独立节点 -&pio { - sndcodec_pins_a: sndcodec@0 { - pins = "PD12"; - function = "i2s0"; - }; - sndcodec_pins_b: sndcodec@1 { - pins = "PD13"; - function = "i2s0"; - }; - sndcodec_pins_c: sndcodec@2 { - pins = "PD15"; - function = "i2s0"; - }; -}; -``` - -**关键经验**?- 使用 `pins` + `function` 标准属?- 避免 `allwinner,pins` 等自定义属?- 每个引脚独立节点更清? ---- - -### 2. ICM-42688 通信方案选型 - -#### I2C 方案尝试(失败)? -**问题**?- PD1 被其他功能占?- PL2/PL3 不支?TWI0 -- 设备响应地址 (0x68) 但拒绝寄存器读写 - -**尝试过的方法**?1. GPIO 模拟 I2C -2. 更换地址引脚 (0x69) -3. 调整时序延迟 -4. Bank 寄存器切? -**结论**:可能需要特殊初始化序列,放弃I2C方案 - -#### SPI 方案实现(成功)? -**实现细节**?```cpp -// GPIO 模拟 SPI Mode 0 (CPOL=0, CPHA=0) -void spiTransfer(uint8_t data) { - for (int i = 7; i >= 0; i--) { - gpio_set_value(MOSI, (data >> i) & 0x01); - usleep(1); // ~500kHz - gpio_set_value(SCLK, 1); // 上升? usleep(1); - gpio_set_value(SCLK, 0); - } -} -``` - -**引脚配置**?- SCLK: PD3 (GPIO 99) -- MOSI: PD2 (GPIO 98) -- MISO: PD4 (GPIO 100) -- CS: PD5 (GPIO 101) - -**性能**?- 速度:~500kHz -- WHO_AM_I 识别?x47 ?- 数据稳定性:优秀 - ---- - -### 3. 静态编译链接顺? -#### 问题 -``` -undefined reference to `pthread_create` -``` - -#### 解决方案 -```makefile -# 错误顺序 -LDFLAGS += -lpthread -lssl -lcrypto - -# 正确顺序 -LDFLAGS += -lssl -lcrypto -lpthread -lm -lstdc++ -``` - -**规则**?1. 业务库在?2. 系统库在?3. `-lpthread` `-lm` `-lstdc++` 放最? ---- - -### 4. MPP 框架集成 - -#### 缓冲区配置优? -**问题**:VBV 缓冲区溢出导致帧丢失 - -**解决方案**?```cpp -// VI 缓冲区配?vipp_attr.nbufs = 5; // 5个VI缓冲?vipp_attr.nplanes = 1; - -// VBV 配置 -aw_enc_attr.VeAttr.mMaxKeyInterval = 30; -aw_enc_attr.VeAttr.mVbvBufferSize = 4 * 1024 * 1024; // 4MB -``` - -**关键经验**?- VI缓冲区不宜过大(内存有限?- VBV需根据码率调整 -- JPEG编码质量80为最佳平衡点 - ---- - -### 5. 工具链配置收?(Day 7-8) - -#### 问题 -- README.md 提到 `riscv32-linux-musl` 工具链不存在 -- 多个Makefile配置不一?- 构建脚本路径混乱 - -#### 解决过程 -1. 查询 `tina_files_clean.csv` 文件索引 -2. 在服务器上验证实际路?3. 发现 musl 工具链为压缩包(未解压) -4. 确认使用 glibc 工具链(已解压可用) - -#### 最终配?```bash -# 实际工具链路?out/toolchain/nds32le-linux-glibc-v5d/bin/ - -# 编译器(符号链接?riscv32-unknown-linux-g++ -> riscv32-linux-g++ - -# C?glibc (?musl) -``` - ---- - -### 6. Cedar 库链接问?(Day 8) - -#### 问题 -``` -undefined reference to `CDC_LOG_LEVEL_NAME' -undefined reference to `CDC_GLOBAL_LOG_LEVEL' -``` - -#### 原因 -主程?Makefile 缺少完整?Cedar 多媒体库链接 - -#### 解决方案 -添加 60+ 个静态库?```makefile -# Cedar 核心库(关键!) -LDFLAGS += -lcdc_base -lcdx_base - -# 音频处理 -LDFLAGS += -ladecoder -lResample -lAudioVps -laac -lwav -LDFLAGS += -lcedarx_aencoder -laacenc -lAgc -lAec -lAns - -# Muxer/Demuxer -LDFLAGS += -lmuxers -lcedarxdemuxer -lcdx_parser -LDFLAGS += -lmp4_muxer -lraw_muxer -lmpeg2ts_muxer - -# 视频编解?LDFLAGS += -lvencoder -lvdecoder -lvideoengine -lawmjpegplus - -# 配置解析 -LDFLAGS += -lPluginMpp -lIniParserMpp -lsample_confparser - -# 显示?LDFLAGS += -lcedarxrender -lhwdisplay -``` - ---- - -### 7. musl/glibc 工具链兼容?(Day 9) ? -#### 问题 -开发板运行 `musl libc 1.2.4`,但程序使用 `glibc` 编译,导致: -- 动态链接器不匹?- 符号不兼?(`__register_atfork` ? -- 程序无法运行 - -#### 解决方案 -```makefile -# 修正工具链路径(关键发现:musl ?prebuilt 而非 out/toolchain?USE_MUSL := 1 - -ifeq ($(USE_MUSL),1) - TOOLCHAIN_DIR := $(SDK_ROOT)/prebuilt/rootfsbuilt/riscv/nds32le-linux-musl-v5d/bin - CROSS_COMPILE := riscv32-linux-musl- -endif -``` - -**验证方法**?```bash -# 检查动态链接器 -readelf -l avaota_client | grep interpreter -# 应输出:/lib32/ld.so.1 - -# 开发板上创建符号链?ln -s /lib32/ilp32d/libc.so /lib32/ld.so.1 -``` - -**结果**:✅ 程序成功运行,所有硬件模块测试通过 - ---- - -### 8. 音频 I/O 错误处理 (Day 10) ? -#### 问题 -程序运行?10 秒后崩溃?- ALSA 返回 I/O error -- `snd_pcm_recover()` 恢复失败 -- 类型转换错误(`size_t` vs `snd_pcm_sframes_t`?- 缺少错误检查导?Segmentation fault - -#### 解决方案 - -**audio_capture.cpp - 设备重新初始?*?```cpp -int err = snd_pcm_recover(m_pcm_handle, frames_read, 0); -if (err < 0) { - LOG_ERROR("[AudioCapture] Cannot recover: %s, attempting to reinitialize...", - snd_strerror(err)); - - // 关闭设备 - snd_pcm_close(m_pcm_handle); - m_pcm_handle = nullptr; - - // 等待并重新初始化 - usleep(500000); // 500ms - if (!init()) { - LOG_ERROR("[AudioCapture] Failed to reinitialize device"); - return -1; // 彻底失败 - } - - LOG_INFO("[AudioCapture] Device reinitialized successfully"); - return 0; // 本次读取失败,但设备已恢?} -``` - -**main.cpp - 类型安全和错误检?*?```cpp -// 修复类型错误 -snd_pcm_sframes_t frames_read = mic.read(buffer, 160); // 使用有符号类? -// 添加错误检?if (frames_read < 0) { - LOG_ERROR("[AUD-CAP] Fatal error, exiting thread"); - break; // 安全退出线程,不影响其他模?} - -if (frames_read > 0) { - ws_aud.send_binary((uint8_t*)buffer, frames_read * 2); -} -``` - -#### 验证结果 -- ?程序稳定运行 36+ 秒(修复前:10 秒崩溃) -- ?自动恢复机制生效(测试中成功恢复 3 ?I/O 错误?- ?音频线程失败不影?IMU 和摄像头线程 - ---- - -### 9. WebSocket 崩溃修复 (Day 11) ? -#### 问题 -程序?WebSocket 连接失败?03 Forbidden)后崩溃?- 错误信息:`terminate called without an active exception` -- 原因 1:`perform_handshake()` 失败?`m_recv_thread` 未启?- 原因 2:`disconnect()` 仍尝?`join()` 未启动的线程 -- 原因 3:接收线程阻塞在 `recv()` ?`disconnect()` 直接关闭 socket - -#### 解决方案 - -**ws_client.cpp - 正确的断开连接流程**?```cpp -void WSClient::disconnect() { - // 1. 设置标志? m_running = false; - m_connected = false; - - // 2. 发送关闭帧 - if (m_sockfd >= 0) { - uint8_t close_frame[] = {0x88, 0x00}; - send(m_sockfd, close_frame, sizeof(close_frame), 0); +## 🏗️ 系统总体架构 + +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[导航逻辑] - // ?关键修复:先 shutdown 中断阻塞?recv() - shutdown(m_sockfd, SHUT_RDWR); - } - - // 3. ?join 实际运行的线? if (m_recv_thread.joinable()) { - m_recv_thread.join(); - } - - // 4. 关闭 socket - if (m_sockfd >= 0) { - close(m_sockfd); - m_sockfd = -1; - } -} -``` + 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 -**关键经验**?- `shutdown()` 可以中断阻塞?`recv()` 调用 -- 必须?`join()` 前调?`shutdown()` -- 使用 `joinable()` 检查线程是否可 join + Client <--> |FRP Tunnel| Server +``` --- -### 10. 音频双向通信实现 (Day 11) ? -#### 需?- 现有系统只支持音频采集(上传?- 需要实现音频播放(TTS 语音合成?- 服务器通过 WebSocket 返回二进?PCM 音频数据 +## 🧠 核心模块实现详情 -#### 解决方案 +### 1. 视觉感知中心 (Visual Perception) +**文件**: `NaviGlassServer/navigation_master.py`, `workflow_*.py` -**步骤 1: 扩展 WSClient 支持二进制数据队?* +* **多模态导航状态机**: + * `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` 算法,计算盲道分割掩膜的主方向,引导用户居中行走。 -```cpp -// ws_client.h - 添加二进制数据队?class WSClient { -public: - void poll_binary_messages(std::function callback); - -private: - std::queue> m_binary_queue; - std::mutex m_binary_mutex; -}; +### 2. AI 交互管道 (Voice Interaction) +**文件**: `NaviGlassServer/app_main.py` -// ws_client.cpp - recv_loop 保存二进制数?if (opcode == OP_BINARY) { - std::lock_guard lock(m_binary_mutex); - m_binary_queue.push(payload); - LOG_DEBUG("[WS] Received binary: %zu bytes", payload.size()); -} -``` +* **ASR (语音识别)**: FunASR/SenseVoiceSmall (本地运行,强制中文 `zh`)。 +* **LLM (大模型)**: ZhipuAI GLM-4.6v-Flash (通过 API)。支持视觉理解,用于 "这是什么"、"前方的文字" 等通用问答。 +* **TTS (语音合成)**: EdgeTTS (本地/在线)。生成 16kHz PCM 音频流,并通过 WebSocket 实时推送到客户端播放。 -**步骤 2: 主循环集成音频播?* - -```cpp -// main.cpp - 初始化扬声器(hw:1,0 - I2S 接口?AudioPlayer speaker("hw:1,0", 16000, 1); // 16kHz, mono -bool speaker_enabled = speaker.init(); - -// 主循环中接收并播放音?if (speaker_enabled) { - ws_aud.poll_binary_messages([&](const uint8_t* data, size_t size) { - if (size % 2 == 0) { // S16_LE 数据 - size_t frames = size / 2; - speaker.write((const int16_t*)data, frames); - } - }); -} -``` - -**关键经验**?- WebSocket ?`recv_loop` 已经在独立线程中运行 -- 二进制数据通过队列传递到主线?- 使用 `hw:1,0`(I2S)而非 `hw:0,0`(Audio Codec?- 音频格式必须匹配?6kHz, mono, S16_LE - -#### 验证结果 -- ?扬声器初始化成功(hw:1,0?- ?音频采集正常(已发?2000+ 数据包) -- ?TTS 音频播放已实现(Day 13 修复? ---- - -### 11. TTS 事件循环阻塞修复 (Day 13) ? -#### 问题 -TTS 音频播放断断续续,每?5-15 秒才播放几个字: -- 客户端日志:`[AudioPlayer] Underrun occurred, recovering...` -- 服务器日志:TTS 块间?5-15 ? -#### 根因分析 -`omni_client.py` 中使用同步迭代器处理 Omni API 响应,阻塞了整个 asyncio 事件循环?```python -# 问题代码 -async def stream_chat(...): - completion = client.chat.completions.create(stream=True, ...) - for chunk in completion: # ?同步迭代,阻塞事件循环! - yield OmniStreamPiece(...) -``` - -#### 解决方案 - -**步骤 1: Omni 客户端异步化** - -使用 `threading.Thread` + `asyncio.Queue` 解耦同?API 调用? -```python -async def stream_chat(...): - queue = asyncio.Queue() - loop = asyncio.get_running_loop() - - def _sync_stream(): - """在独立线程中运行同步 API 调用""" - completion = client.chat.completions.create(stream=True, ...) - for chunk in completion: - piece = OmniStreamPiece(...) - loop.call_soon_threadsafe(queue.put_nowait, piece) - loop.call_soon_threadsafe(queue.put_nowait, None) # 结束标记 - - thread = threading.Thread(target=_sync_stream, daemon=True) - thread.start() - - while True: - item = await queue.get() # 非阻塞等? if item is None: - break - yield item -``` - -**步骤 2: 客户?TTS 预缓冲机?* - -```cpp -// main.cpp - TTS 预缓冲实?static std::vector tts_buffer; -static const size_t PRE_BUFFER_FRAMES = 16000; // 1秒预缓冲 -static const size_t MIN_PLAY_FRAMES = 8000; // 0.5秒最小播放阈?static bool is_buffering = true; - -// 接收时追加到缓冲?ws_aud.poll_binary_messages([&](const uint8_t* data, size_t size) { - const int16_t* samples = (const int16_t*)data; - size_t frames = size / 2; - tts_buffer.insert(tts_buffer.end(), samples, samples + frames); - - // 积累足够再开始播? if (is_buffering && tts_buffer.size() >= PRE_BUFFER_FRAMES) { - is_buffering = false; - } -}); - -// 播放时使用较小批? if (!is_buffering && tts_buffer.size() >= MIN_PLAY_FRAMES) { - size_t play_frames = std::min(tts_buffer.size(), (size_t)1600); // 100ms - speaker.write(tts_buffer.data(), play_frames); - tts_buffer.erase(tts_buffer.begin(), tts_buffer.begin() + play_frames); -} -``` - -**步骤 3: 服务器退出修?* - -```python -# app_main.py - lifespan 捕获 CancelledError -@asynccontextmanager -async def lifespan(app): - # ... 启动逻辑 ... - try: - yield - except asyncio.CancelledError: - pass # Ctrl+C 正常行为 - finally: - print("[LIFESPAN] 应用关闭完成") - # 强制退出线? def _force_exit(): - time.sleep(0.5) - os._exit(0) - threading.Thread(target=_force_exit, daemon=True).start() -``` - -#### 验证结果 -| 指标 | 修复?| 修复?| -|------|--------|--------| -| TTS 块间?| 5-15 ?| ~2 ?| -| 首次播放延迟 | 立即 | ~1 秒(预缓冲) | -| Underrun 频率 | 每块一?| 偶发 | -| 服务器退?| 挂起 | 正常返回 | - -#### 遗留问题 -- TTS 仍有轻微断续(Omni API 响应慢) -- 建议切换?HTTP `/stream.wav` 模式(参?ESP32S3 实现? ---- - -## 🏆 关键成就 - -### 技术突?1. ?从零实现 GPIO 模拟 SPI 驱动 -2. ?解决 I2S Device Tree 配置难题 -3. ?ICM-42688 SPI 驱动完整实现 -4. ?MPP 框架完整集成(VI→ISP→VENC?5. ?GC2083 100% 捕获成功?6. ?静态链?60+ 库依赖成?7. ?工具链配置统一收敛 -8. ?3.9MB 主程序编译成?9. ?音频错误自动恢复机制 -10. ?**WebSocket 崩溃问题修复** -11. ?**音频双向通信实现** -12. ?**TTS 事件循环阻塞修复**(Omni 客户端异步化?13. ?**客户?TTS 预缓冲机?* -14. ?**项目代码瘦身** (移除 19 个冗余文? -15. ?**非阻塞跳帧机?* (导航 FPS 0.5 -> 10.0) - -### 性能指标 -- 音频采样率:16kHz ?- 摄像头帧率:20fps ?- JPEG 压缩质量?0 ?- SPI 通信速度:~500kHz ?- IMU 数据率:1kHz ?- 编译产物大小?.9MB ?- **板上运行验证:所有模?00%通过** ?- **TTS 块间隔:~2 ?*(修复前 5-15 秒)? ---- - -## 📚 经验积累 - -### Device Tree 配置 -- `pinctrl` 机制:每个引脚独立节?- `function` vs `allwinner,function`:优先使用标准属?- 引脚复用冲突:通过 `/sys/kernel/debug/pinctrl` 排查 - -### GPIO 控制 -- `/sys/class/gpio` 接口使用 -- 导出 ?设置方向 ?读写?- GPIO 编号计算:`(bank - 'A') * 32 + offset` - -### SPI 协议 -- Mode 0:CPOL=0, CPHA=0 -- 时序:MOSI准备 ?SCLK上升??MISO采样 -- ICM-42688 读取:首字节 0x80|寄存器地址 - -### ALSA 音频 -- 运行时配?vs 编译时配?- `amixer` 调试技?- MIC Gain 调优方法 - -### MPP 框架 -- 初始化顺序:VI ?ISP ?VENC -- 缓冲区优化策?- JPEG 编码质量与文件大小权? -### 交叉编译 -- 静态库链接顺序规则 -- Cedar 库依赖关?- 工具链路径验证方? ---- - -## ⚠️ 遗留问题与优化方? -### 技术探索方?1. **硬件 SPI** - - 当前:GPIO 模拟 (~500kHz) - - 可优化:使用硬件 SPI (数MHz) - - 收益:降?CPU 占用 - -2. **I2C 方案** - - 当前:已放弃 - - 可探索:特殊初始化序? - 收益:更标准的实? -3. **musl 工具?* - - 当前:使?glibc - - 可迁移:解压 musl 工具? - 收益:减小可执行文件体积 - -### 性能优化 -- GPIO 模拟 SPI 速度优化(目?1-2MHz?- 内存使用优化 -- 多线程负载均? -### 代码质量 -- 统一注释风格 -- 添加单元测试 -- 错误处理完善 +### 3. 服务器性能优化 (Performance) +**关键技术**: +* **TensorRT 加速**: 所有 YOLO 模型导出为 `.engine`,启用 FP16 半精度。 +* **TurboJPEG**: 替代 OpenCV 进行 JPEG 编解码,速度提升 3 倍。 +* **零拷贝直传**: 非导航模式下,直接转发 JPEG 数据流给前端网页,不进行解码,CPU 占用降低 90%。 +* **GPU 线程池**: `ThreadPoolExecutor` 管理 GPU 推理任务,避免 GIL 锁阻塞 Websocket 事件循环。 --- ---- +## 🕶️ 终端硬件与嵌入式实现 -### 12. 项目清理?TTS 流畅 (Day 14) ? -#### 优化内容 -1. **HTTP 节拍阻塞修复**:发?HTTP 20ms pacing 循环阻塞?WebSocket 发送,导致 TTS 卡顿。修复方案:?HTTP 广播移至后台任务 `asyncio.create_task()`?2. **项目瘦身**:移?HTTP TTS 相关代码及测试脚本,文件减少 19 个?3. **效果**:TTS 播放完全流畅,无断续? -### 13. 导航模式卡顿修复 (Day 15) ? -#### 问题现象 -导航模式开启后,FPS ?10.0 暴跌?0.5-1.5,画面卡顿? -#### 技术方案:非阻塞跳帧机?**原代码问?*:`await loop.run_in_executor` 虽然在线程池执行,但主循环会等待结果返回,导致串行阻塞? -**修复方案**?1. **Fire-and-Forget 模式**:主循环提交任务后立即继续,不等?`await`?2. **最新帧优先**:如果有新帧且上一帧未处理完,则覆?Pending 帧,确保处理最新数据?3. **结果复用**:在后台处理完成前,广播上一帧的检测结果,保持 UI 刷新率为 10FPS? -**效果**?- 客户端采集:10 FPS (1280x720) +**平台**: 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),确保低延迟传输。 --- -### 14. 固件重刷与自启动配置 (Day 16) ? -#### 问题 1:动态链接器路径 -程序编译时使?`/lib32/ld.so.1`,但开发板实际路径?`/lib/ld-musl-riscv32.so.1`,导?`not found` 错误? -**解决方案**?```makefile -# src/Makefile 添加 -LDFLAGS += -Wl,--dynamic-linker=/lib/ld-musl-riscv32.so.1 -``` - -#### 问题 2:自启动方案选择 - -| 方案 | 结果 | 问题 | -|------|------|------| -| `/etc/init.d/rc.final` | ?失败 | 导致 SD 卡检测失败,需重刷固件 | -| `crontab @reboot` | ?失败 | BusyBox crond 不支持此语法 | -| `/etc/init.d/avaota` + `load_script.conf` | ?成功 | 稳定可靠 | - -#### 成功方案详解 - -**1. 创建 init 脚本**?```bash -cat > /etc/init.d/avaota << 'EOF' -#!/bin/sh /etc/rc.common -START=99 -start() { - sleep 15 - ulimit -c 0 - /mnt/UDISK/app/avaota_client > /tmp/avaota.log 2>&1 & -} -stop() { - killall avaota_client -} -EOF -chmod +x /etc/init.d/avaota -``` - -**2. 添加到启动列?*?```bash -echo "avaota" >> /etc/init.d/load_script.conf -``` - -#### 关键经验 -- **启动延迟**:需?15 秒等待音频系统初始化? 秒不够) -- **禁用 core dump**:`ulimit -c 0` 防止程序崩溃撑满 overlay 分区 -- **WiFi 自动连接**:系统会保存配置?`/etc/wifi/wifimg.config`,无需在脚本中配置 -- **避免 rc.final**:会干扰 SD ?mdev 初始化流? -#### 公网服务器配? -修改 `main.cpp` 支持 frp 内网穿透: -```cpp -// 修改?const char* SERVER_HOST = "192.168.110.188"; -// 修改?const char* SERVER_HOST = "8.148.25.142"; -``` - -**frpc.toml 配置**?```toml -serverAddr = "8.148.25.142" -serverPort = 7000 -auth.token = "your_token" - -[[proxies]] -name = "avaota_server" -type = "tcp" -localIP = "127.0.0.1" -localPort = 8081 -remotePort = 8081 - -[[proxies]] -name = "avaota_imu_udp" -type = "udp" -localIP = "127.0.0.1" -localPort = 12345 -remotePort = 12345 -``` - -> **Day 17 补充**:必须添?UDP 12345 代理,否?IMU 数据无法通过公网传输。同时需在公网服务器防火墙开?UDP 12345 端口?- 服务器处理:~15 FPS (有效利用) -- 导航体验:流畅无卡顿 - ---- - -## 📖 参考资? -### 硬件文档 -- [全志 V821 Datasheet](https://www.aw-ol.com) -- [ICM-42688 Datasheet](https://invensense.tdk.com) -- [MAX98357A Datasheet](https://www.maximintegrated.com) -- [GC2083 Datasheet](http://www.galaxycore.com.cn) - -### 软件文档 -- [ALSA Documentation](https://www.alsa-project.org) -- [MPP Framework Guide](https://github.com/allwinner) -- [Linux GPIO Subsystem](https://www.kernel.org/doc/html/latest/driver-api/gpio/) - -### 开发日?- [x] [Day1.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day1.md) - SDK编译环境搭建 -- [x] [Day2.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day2.md) - 网络库编?- [x] [Day3.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day3.md) - I2S音频输出 -- [x] [Day4.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day4.md) - 麦克?IMU -- [x] [Day5.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day5.md) - GC2083摄像?- [x] [Day6.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day6.md) - 硬件验证 -- [x] [Day7.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day7.md) - 工具链配?- [x] [Day8.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day8.md) - 整体编译成功 -- [x] [Day9.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day9.md) - **musl 工具链修?+ 板上测试通过** ?- [x] [Day10.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day10.md) - **音频 I/O 错误修复 + 程序稳定性提?* ?- [x] [Day11.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day11.md) - **WebSocket 崩溃修复 + 音频播放实现** ?- [x] [Day12.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day12.md) - **音频回环分析 + 扬声器混音器修复** ?- [x] [Day13.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day13.md) - **TTS 事件循环阻塞修复 + 客户端预缓冲** ?- [x] [Day14.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day14.md) - **项目清理 + TTS 流畅播放** ?- [x] [Day15.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day15.md) - **导航模式性能优化 (跳帧机制)** ?- [x] [Day16.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day16.md) - **固件重刷与自启动配置** ?- [x] [Day17.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day17.md) - **室外测试+盲道语音修复+IMU UDP代理** ?- [ ] [Day19.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day19.md) - **传输优化 + Python GIL 瓶颈诊断** ⚠️ - ---- - -### 15. Python GIL 性能瓶颈诊断 (Day 19) ⚠️ - -#### 问题发现 - -服务器测试盲道导航时发现性能问题?- **GPU 利用率仅 7%** - 远低于预?- **Python 进程占用 120% CPU** - 但服务器?CPU ?3%?6 核利用率极低?- **帧处?FPS ?3-4 ?* - 画面卡顿严重 - -#### 根因分析 - -```python -# app_main.py ?237 ?frame_processing_executor = ThreadPoolExecutor(max_workers=3, ...) -``` - -`ThreadPoolExecutor` ?Python GIL (全局解释器锁) 限制,无法真正并行化 CPU 密集型任务(JPEG 编解码、绘图渲染)? -#### 解决方案 - -使用 **PyNvJpeg** ?JPEG 编解码移?GPU? -```bash -pip install pynvjpeg -``` - -```python -import pynvjpeg as nj -_nvjpeg = nj.NvJpeg() - -def gpu_decode(jpeg_bytes): - return _nvjpeg.decode(jpeg_bytes) - -def gpu_encode(image, quality=85): - return _nvjpeg.encode(image, quality) -``` - -**状?*:❌ 未实施,待明日开? ---- - -**最后更?*?025-12-23 (Day 19 - 传输优化 + GIL 瓶颈诊断) -**项目状?*:⚠?**99% 完成!导航性能待优?(Python GIL 瓶颈)** -**Day 19 更新**:TurboJPEG 优化、中文字体修复、GIL 瓶颈诊断 -**待完?*:PyNvJpeg GPU JPEG 加速、TTS 断连修复 +## 🛠️ 部署与运维 +* **内网穿透**: FRP (Fast Reverse Proxy)。将本地端口 8081 (WS) 和 12345 (UDP) 暴露到公网服务器。 +* **进程管理**: PM2 (Server), Systemd/Init.d (Client)。 +* **可视化监控**: Web Dashboard (`/static/index.html`) 提供实时第一视角画面、IMU 姿态、AI 对话日志和系统状态监控。 diff --git a/task_complete.md b/task_complete.md index e55fba9..8af7afb 100644 --- a/task_complete.md +++ b/task_complete.md @@ -2,21 +2,22 @@ **项目**:NaviGlass项目开发 **平台**:全志 V821 (32-bit RISC-V) -**更新时间**:2026-01-05 -**整体进度**:100%(室内导盲模型训练优化完成) +**更新时间**:2026-01-06 +**整体进度**:100%(室内导盲系统优化交付) ## 📖 快速导航 | 章节 | 说明 | |------|------| -| [已完成任务](#-已完成任务) | Day 1-27 完成的功能 | -| [待验证问题](#️-待验证问题-day-20-优化后) | 当前需要验证的修复 | +| [已完成任务](#-已完成任务) | Day 1-28 完成的功能 | +| [后续规划](#-后续规划与遗留问题) | 待办 / 债务 / 未来展望 | | [进度统计](#-进度统计) | 各模块完成度 | -| [时间线](#-时间线) | 开发时间线 | +| [里程碑](#-里程碑) | 关键节点回顾 | +| [时间线](#-时间线) | 开发流水账 | **相关文档**: - [实现计划详情](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/implementation_plan_complete.md) -- [Day 日志](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/) (Day1-Day27) +- [Day 日志](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/) (Day1-Day28) --- @@ -413,37 +414,39 @@ - [x] **跨平台路径修复**: 解决 Windows 生成 `data.yaml` 在 Linux 报错问题 - [x] **文档同步**: 更新《训练指南》至 V2 (22类 + 路径注意) ---- - -## ⏳ 待完成任务 - - -### 性能评估 -- [ ] CPU 使用率监控(目标: <80%) -- [ ] 内存使用监控(目标: <100MB) -- [x] 摄像头实际帧率: 客户端 10 FPS, 服务器处理 ~15 FPS -- [x] IMU 采样率: 10Hz - -### 稳定性验证 -- [ ] 长时间运行测试(5分钟基础 / 1小时稳定性 / 内存泄漏检查) -- [ ] 异常恢复测试(断网重连 / 设备异常恢复) -- [ ] 压力测试(高负载 / 边界条件) +### 室内导航优化与 Bug 修复 (Day 28) +- [x] **模型精准化** + - [x] 切换至 `yolo11l-seg-indoor14.engine` (14类) + - [x] 更新 `workflow_indoor.py` 类别映射 + - [x] 地面检测率提升,解决无路误报 +- [x] **语音播报修复** + - [x] **强制首播**: 解决初始无路提示被节流的问题 + - [x] **即时反馈**: 启动命令后立即播报“正在寻找可行走区域” + - [x] **音频 Pop 消除**: 增加静音填充至 200ms + - [x] **崩溃修复**: 移除 undefined class 引用 +- [x] **终端 WiFi 诊断** + - [x] 确认断连不可恢复为 OS 层面问题 + - [x] 建议部署 `wifi_check.sh` 守护脚本 --- -## 🔮 未来优化方向 +## 🛤️ 后续规划与遗留问题 -### 性能优化 -- [ ] 内存使用优化 -- [ ] CPU 负载平衡 -- [ ] 网络带宽管理 -- [ ] 功耗优化 +### 🔴 优先待办 (Priority) +- [ ] **稳定性验证**: 长时间运行测试(5分钟基础 / 1小时稳定性 / 内存泄漏检查) +- [ ] **异常恢复**: 模拟断网重连、设备异常恢复等边界条件 +- [ ] **WiFi 保活**: 部署终端脚本 `wifi_check.sh` 解决断网不重连问题 -### 硬件升级探索 -- [ ] 硬件 SPI 替代 GPIO 模拟(提升IMU速度) -- [ ] I2C 通信方案重新探索 +### 🟠 技术债务 (Debt) +1. **音频底噪**: 需探索软件降噪 (AEC/ANS) 以消除回环底噪 +2. **硬件屏蔽**: 扬声器电流声需硬件改进(磁环/布线) +3. **代码规范**: 补充单元测试,统一注释风格 + +### 🔵 长期探索 (Future) +- [ ] **硬件升级**: 尝试硬件 SPI 替代 GPIO 模拟(提升 IMU 采样率) +- [ ] **I2C 攻坚**: 重新探索 ICM-42688 的 I2C 通信模式 +- [ ] **能效优化**: 内存占用优化与 CPU 负载平衡 ---- ## 📊 进度统计 @@ -474,7 +477,7 @@ | 导航模式 | 100% | ✅ Day 15 修复 | | 服务器优化 | 100% | ✅ Day 18-19 完成 | | AI 交互管道 | 100% | ✅ Day 21-22 修复 (GLM-4V/SenseVoice) | -| 室内导盲模型 | 100% | ✅ Day 25 训练完成 | +| 室内导盲模型 | 100% | ✅ Day 28 优化交付 (14类模型) | --- @@ -595,41 +598,16 @@ - **稳定性修复**: 彻底解决 FP16 训练 NaN 问题 (AMP=False) - **完整性验证**: 数据集健康检查 100% 通过 ---- - -## 📝 技术债务 - -### 需要优化的地方 -1. **GPIO 模拟性能**: 当前 SPI 速度 ~500kHz,可优化到 1-2MHz -2. **错误处理**: 网络断开重连、设备异常恢复、日志完善 -3. **代码规范**: 需要统一注释风格、需要单元测试 - -### 遗留问题 -1. **音频底噪**: 开启 Playback Switch 可能引入回环底噪,需探索软件降噪 (AEC/ANS) -2. **扬声器杂音** (Day 17): 确认为硬件问题,需加磁环或重新布线 -3. **I2C 问题**: ICM-42688 I2C 模式未解决,保留为技术探索方向 -4. **硬件 SPI**: 未尝试使用硬件 SPI,可作为性能优化方向 +### Milestone 24: 室内导盲系统优化交付 ✅ +**时间**: Day 28 +**成果**: +- **高精度感知**: 切换 14 类模型,地面检测率/避障精准度显著提升 +- **体验升级**: 修复无路提醒节流 Bug,消除音频 Pop 噪声,交互响应即时化 +- **系统诊断**: 明确终端 WiFi 断连根因并给出自动化运维方案 --- -## 🛠️ 开发工具与资源 -### 必备工具 -- [x] WinSCP - 文件传输 -- [x] PuTTY - SSH 终端 -- [x] PhoenixSuit - 固件烧录 -- [x] VS Code - 代码编辑 - -### 参考文档 -- [x] [全志 V821 Datasheet](https://www.aw-ol.com) -- [x] [ICM-42688 Datasheet](https://invensense.tdk.com) -- [x] [MAX98357A Datasheet](https://www.maximintegrated.com) -- [x] [ALSA Documentation](https://www.alsa-project.org) - -### 开发笔记 -- [Day1.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day1.md) ~ [Day23.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day23.md) - ---- ## 📅 时间线 @@ -660,15 +638,4 @@ Day 24: YOLOE模型训练 ✅ 完成 (问题诊断+数据集筛选) Day 25: 室内导盲模型完成 ✅ 完成 (训练+验证通过) Day 26: 室内导盲服务器集成 ✅ 完成 (IndoorNavigator工作流) Day 27: 模型训练优化与完善 ✅ 完成 (NaN修复+22类适配+路径修复) -``` - - ---- - -**🎯 当前状态:100% 完成!室内导盲系统已集成并可使用** - - - -## ⚠️ 待验证问题 - -*(当前无遗留问题,所有已知 BUG 均已修复)* +Day 28: 室内导航优化与修复 ✅ 完成 (14类模型+语音修复+音频Pop修复) diff --git a/服务器技术栈.md b/服务器技术栈.md index aabb70d..09f673b 100644 --- a/服务器技术栈.md +++ b/服务器技术栈.md @@ -10,7 +10,7 @@ WebSocket: 用于音频/视频流的实时双向传输 (websockets 库) HTTP: 用于控制指令和状态查询 -- 新一代 AI 交互管道 (Day 21+ 架构) +- 新一代 AI 交互管道 (Day 28+ 架构) 大语言模型 (LLM): GLM-4.6v-Flash (通过 zai-sdk 调用智谱 AI,支持多模态视觉理解) 语音识别 (ASR): SenseVoiceSmall (通过 funasr 本地部署,高精度中文识别) 语音活动检测 (VAD): Silero VAD (PyTorch 实现,含 300ms 环形缓冲,抗噪能力强) @@ -18,6 +18,10 @@ - 计算机视觉 (CV) 核心引擎: Ultralytics YOLO (YOLO11 / YOLOv8) + 模型矩阵: + - 盲道导航: yolo11l-seg-blind.engine + - 室内导盲: yolo11l-seg-indoor14.engine (14类) + - 红绿灯: yolov8n.engine 任务类型: 目标检测 (Detection) + 语义分割 (Segmentation) 推理加速: TensorRT (NVIDIA 深度学习推理引擎,FP16半精度 + .engine 模型文件) 图像处理: