NaviGlass Client 📱
✨ 功能特性
- 摄像头采集: 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. 环境初始化
cd ~/ProgramFiles/AvaotaF1/avaota_sdk/tina-v821-release
source build/envsetup.sh
lunch # 选择 avaota_f1
2. 交叉编译
cd ~/ProgramFiles/AvaotaF1/avaota_app_demo
./build_main.sh
3. 部署到开发板
# 复制到 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 秒 (等待音频系统就绪)
🏗️ 程序架构
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 |
服务器地址
// 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 秒 (音频系统就绪) |
| 功耗 | 待测 |
🔗 相关文档
- 服务器代码 - Python 后端
- 开发日志 - Day 1 ~ Day 25
- 任务清单
- Avaota F1 文档
📄 许可证
MIT License
Description