# NaviGlass Client 📱
**面向视障人士的智能导航与辅助系统 - 客户端** 基于 Avaota F1 (全志 V821 RISC-V) 的嵌入式终端 [功能特性](#功能特性) • [硬件配置](#硬件配置) • [编译部署](#编译部署) • [程序架构](#程序架构)
--- ## ✨ 功能特性 - **摄像头采集**: GC2083 MIPI (1280×720 @20fps, JPEG 硬件编码) - **音频采集**: 板载模拟麦克风 (16kHz/mono) - **音频播放**: I2S + MAX98357A 功放 - **IMU 传感**: ICM-42688-P 六轴 (GPIO 模拟 SPI) - **网络通信**: WebSocket (音视频) + UDP (IMU) - **自动启动**: 开机自动连接服务器 --- ## 🔧 硬件配置 ### 核心硬件 | 组件 | 型号 | 接口 | |------|------|------| | SoC | 全志 V821 | 32-bit RISC-V | | 摄像头 | GC2083 | MIPI-CSI2 | | 功放 | MAX98357A | I2S (PD12/PD13/PD15) | | 麦克风 | 板载模拟 | Audio Codec | | IMU | ICM-42688-P | GPIO SPI | ### 引脚配置 | 功能 | 引脚 | 说明 | |------|------|------| | I2S BCLK | PD12 | 音频位时钟 | | I2S LRCK | PD13 | 左右声道时钟 | | I2S DOUT | PD15 | 音频数据输出 | | SPI SCLK | PD3 | IMU 时钟 | | SPI MOSI | PD2 | IMU 数据输入 | | SPI MISO | PD4 | IMU 数据输出 | | SPI CS | PD5 | IMU 片选 | --- ## 💻 开发环境 ### 主机环境 - **系统**: Ubuntu 24.04 LTS - **SDK**: Tina SDK (tina-v821-release) - **工具链**: musl (`riscv32-linux-musl-`) ### SDK 路径 ``` /home/rongye/ProgramFiles/AvaotaF1/avaota_sdk/tina-v821-release ├── prebuilt/rootfsbuilt/riscv/nds32le-linux-musl-v5d/ ← 工具链 └── ... ``` > ⚠️ 必须使用 **musl 工具链**,glibc 工具链与开发板不兼容 --- ## 🚀 编译部署 ### 1. 环境初始化 ```bash cd ~/ProgramFiles/AvaotaF1/avaota_sdk/tina-v821-release source build/envsetup.sh lunch # 选择 avaota_f1 ``` ### 2. 交叉编译 ```bash cd ~/ProgramFiles/AvaotaF1/avaota_app_demo ./build_main.sh ``` ### 3. 部署到开发板 ```bash # 复制到 SD 卡 cp avaota_client /media/$USER/SDCARD/ # 板端执行 mount /dev/mmcblk0p1 /mnt/extsd cp /mnt/extsd/avaota_client /mnt/UDISK/ chmod +x /mnt/UDISK/avaota_client /mnt/UDISK/avaota_client ``` ### 4. 自动启动配置 程序已配置开机自启动: - 位置: `/mnt/UDISK/avaota_client` - 方式: `/etc/init.d/avaota` + `load_script.conf` - 延迟: 15 秒 (等待音频系统就绪) --- ## 🏗️ 程序架构 ```cpp int main() { init_signal_handler(); // Ctrl+C 安全退出 std::thread cam_thread(run_camera_loop); // 摄像头 → WebSocket std::thread mic_thread(run_audio_capture); // 麦克风 → WebSocket std::thread spk_thread(run_audio_play); // WebSocket → 扬声器 std::thread imu_thread(run_imu_udp); // IMU → UDP cam_thread.join(); mic_thread.join(); spk_thread.join(); imu_thread.join(); } ``` ### 核心模块 | 目录 | 模块 | 功能 | |------|------|------| | `src/audio/` | AudioCapture | 麦克风采集 (ALSA) | | `src/audio/` | AudioPlayer | 扬声器播放 (I2S) | | `src/camera/` | Camera | MPP 框架封装 | | `src/imu/` | ICM42688 | GPIO SPI 驱动 | | `src/network/` | WSClient | WebSocket 客户端 | | `src/network/` | UDPSender | UDP 发送 | --- ## 📡 通信协议 ### WebSocket 连接 | 端点 | 用途 | 数据格式 | |------|------|---------| | `/ws/camera` | 摄像头上传 | Binary (JPEG) | | `/ws_audio` | 音频双向 | Binary (PCM16 16kHz) | ### UDP 连接 | 端口 | 用途 | 数据格式 | |------|------|---------| | 12345 | IMU 数据 | JSON | ### 服务器地址 ```cpp // main.cpp #define SERVER_IP "8.148.25.142" // 公网 IP (frp 穿透) #define SERVER_PORT 8081 ``` --- ## 📁 目录结构 ``` NaviGlassClient/ ├── avaota_app_demo/ │ ├── src/ │ │ ├── audio/ # 音频模块 │ │ ├── camera/ # 摄像头模块 │ │ ├── imu/ # IMU 模块 │ │ ├── network/ # 网络模块 │ │ ├── main.cpp # 主程序 │ │ └── Makefile │ └── build_main.sh ├── Device_Tree/ # DTS 配置 ├── docs/ # 硬件文档 └── README.md ``` --- ## 📊 性能参数 | 指标 | 数值 | |------|------| | 视频帧率 | 10 FPS (上传) | | 音频采样 | 16kHz / 16bit / Mono | | IMU 采样 | 10 Hz | | 启动时间 | ~15 秒 (音频系统就绪) | | 功耗 | 待测 | --- ## 🔗 相关文档 - [服务器代码](../NaviGlassServer/) - Python 后端 - [开发日志](../Docs/DevLogs/) - Day 1 ~ Day 25 - [任务清单](../Docs/task_complete.md) - [Avaota F1 文档](./docs/) --- ## 📄 许可证 MIT License