5.1 KiB
5.1 KiB
Day 17 - 室外测试与盲道导航语音修复
日期: 2025-12-17
主题: 室外实地测试、盲道导航语音播报问题修复、IMU 采样率优化
室外实地测试
测试环境
- 网络连接: 开发板通过 iPhone 手机热点连接公网服务器
- 服务器地址:
8.148.25.142:8081(通过 frp 内网穿透)
测试结果
| 功能 | 状态 | 说明 |
|---|---|---|
| 摄像头采集 | ✅ 正常 | 视频流传输稳定 |
| 过马路导航语音 | ✅ 正常 | 语音播报正常工作 |
| 盲道导航语音 | ❌ 异常 | 无语音播报 |
| IMU 数据上传 | ❌ 异常 | 公网环境下无法接收 |
| 扬声器杂音 | ⚠️ 存在 | IMU 工作和手靠近电线时有杂音 |
问题 1:IMU 数据无法通过公网上传
现象
- 将服务器地址从本地 IP 改为公网 IP
8.148.25.142后 - IMU 数据无法被服务器接收
根因分析
frpc.toml 只配置了 TCP 8081(WebSocket),未配置 UDP 12345(IMU):
# 原配置只有 TCP
[[proxies]]
name = "avaota_server"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8081
remotePort = 8081
解决方案
1. 修改 frpc.toml,增加 UDP 代理:
[[proxies]]
name = "avaota_imu_udp"
type = "udp"
localIP = "127.0.0.1"
localPort = 12345
remotePort = 12345
2. 公网服务器防火墙开放 UDP 12345:
- 阿里云/腾讯云安全组添加入站规则
- 或使用
iptables -A INPUT -p udp --dport 12345 -j ACCEPT
3. 重启 frpc 服务使配置生效
问题 2:盲道导航无语音播报
现象
- 过马路导航正常有语音播报
- 盲道导航没有语音播报
根因分析
调用链差异
过马路模块 (workflow_crossstreet.py):
process_frame() 返回 guidance_text
↓
navigation_master._say() 节流
↓
app_main.py play_voice_text() ← 在主事件循环中执行 ✅
盲道模块 (workflow_blindpath.py):
process_frame() 内部直接调用 play_voice_text() ← 在线程池中执行 ❌
↓
play_voice_text() 调用 async broadcast_pcm16_realtime()
↓
在线程池中无法运行 asyncio 协程 → 失败
核心问题
盲道模块在 process_frame() 内部直接调用 play_voice_text(),但该函数是在 frame_processing_executor 线程池中执行的,无法正确运行 asyncio 协程。
修复方案
修改 workflow_blindpath.py,与过马路模块保持一致:
- 移除内部播放(第 17 行):
# 【移除】从这里播放音频会导致线程池中asyncio无法工作
# from audio_player import play_voice_text
# 语音由 app_main.py 统一处理
- 移除 play_voice_text 调用(第 759-765 行):
# 【移除】play_voice_text() - 由app_main统一处理
logger.info(f"[语音待播] 优先级{selected_voice['priority']}: {final_guidance_text}")
- 返回正确的文本(第 793 行):
# 【修改】返回 final_guidance_text(经过节流的),由 app_main 统一播放
return ProcessingResult(
guidance_text=final_guidance_text, # 改为返回节流后的文本
...
)
问题 3:扬声器有杂音
现象
- IMU 工作时扬声器有杂音
- 手靠近电线时扬声器也有杂音
分析
IMU 干扰源
- GPIO 模拟 SPI 通信(500kHz)
- 每秒约 5600 次 GPIO 翻转(50Hz × 14字节 × 8位)
- 可能产生电磁干扰
优化措施
降低 IMU 采样率从 50Hz 到 10Hz:
// main.cpp 第 311 行
usleep(100000); // 10 Hz (100ms) - 降低采样率减少对音频的干扰
硬件层面原因
- 人体静电感应
- 信号线屏蔽不足
- 接地不良
结论
- 软件优化可减少干扰但无法完全消除
- 彻底解决需要硬件层面改进(加磁环、重新布线等)
- 当前暂时保持现状
语音播报系统统一状态
| 模块 | 状态 | 说明 |
|---|---|---|
workflow_blindpath.py |
✅ 已修复 | 移除内部播放,由 app_main 统一处理 |
workflow_crossstreet.py |
✅ 正常 | 早已移除内部播放 |
navigation_master.py |
✅ 正常 | 只做节流,不播放语音 |
trafficlight_detection.py |
✅ 正常 | 导入但未调用 |
app_main.py |
✅ 正常 | 统一语音播放入口 |
修改文件列表
| 文件 | 修改内容 |
|---|---|
frpc.toml |
新增 UDP 12345 代理配置(IMU 数据转发) |
OpenAIglasses_for_Navigation/workflow_blindpath.py |
移除内部语音播放,改为返回文本给 app_main |
AvaotaF1/avaota_app_demo/src/main.cpp |
IMU 采样率从 50Hz 降低到 10Hz |
待解决问题
- IMU 数据公网传输(已通过 frpc UDP 代理解决)
- 盲道导航语音播报(已修复代码)
- 扬声器杂音(需硬件层面解决)
- 验证盲道导航语音播报是否正常工作(需重新室外测试)