Files
NaviGlassClient/README.md
2025-12-31 16:04:00 +08:00

211 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# NaviGlass Client 📱
<div align="center">
**面向视障人士的智能导航与辅助系统 - 客户端**
基于 Avaota F1 (全志 V821 RISC-V) 的嵌入式终端
[功能特性](#功能特性) • [硬件配置](#硬件配置) • [编译部署](#编译部署) • [程序架构](#程序架构)
</div>
---
## ✨ 功能特性
- **摄像头采集**: 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