205 lines
5.9 KiB
Markdown
205 lines
5.9 KiB
Markdown
|
|
# SkyLink - 多平台实时视频传输系统
|
|||
|
|
|
|||
|
|
一个分布式实时视频传输解决方案,连接机载端(ROS 2)、PC 地面站(Qt 6)和移动端(Android)。
|
|||
|
|
|
|||
|
|
## 🏗️ 系统架构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────┐
|
|||
|
|
│ ROS 2 机载端 │ (树莓派 / Jetson)
|
|||
|
|
│ - 相机采集 │
|
|||
|
|
│ - GPS 传感器 │
|
|||
|
|
│ - UDP 发送广播 │
|
|||
|
|
└──────────┬──────────┘
|
|||
|
|
│
|
|||
|
|
UDP 广播 (9999)
|
|||
|
|
│
|
|||
|
|
┌──────┴──────┐
|
|||
|
|
│ │
|
|||
|
|
┌───▼────────┐ ┌─▼──────────────┐
|
|||
|
|
│ Qt PC 地面站 │ │ Android 移动端 │
|
|||
|
|
│ - 解码显示 │ │ - 实时预览 │
|
|||
|
|
│ - GPS 绘图 │ │ - 数据记录 │
|
|||
|
|
│ - 丢包统计 │ │ - 远程控制 │
|
|||
|
|
└────────────┘ └────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📂 项目结构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
SkyLink/
|
|||
|
|
├── README.md # 本文件 (架构图、启动命令)
|
|||
|
|
├── docker-compose.yml # (可选) Docker 部署
|
|||
|
|
│
|
|||
|
|
├── protocol/ # [核心] 公共协议定义
|
|||
|
|
│ ├── protocol.h # C++ 结构体定义
|
|||
|
|
│ └── Protocol.kt # Kotlin 参考实现
|
|||
|
|
│
|
|||
|
|
├── skylink_ros2/ # [机载端] ROS 2 C++ Workspace
|
|||
|
|
│ ├── src/
|
|||
|
|
│ │ └── skylink_bridge/ # ROS 2 Package
|
|||
|
|
│ │ ├── package.xml
|
|||
|
|
│ │ ├── CMakeLists.txt
|
|||
|
|
│ │ ├── launch/
|
|||
|
|
│ │ │ └── bridge.launch.py
|
|||
|
|
│ │ ├── config/
|
|||
|
|
│ │ │ └── params.yaml
|
|||
|
|
│ │ ├── include/
|
|||
|
|
│ │ │ └── skylink_bridge/
|
|||
|
|
│ │ │ └── udp_sender_node.hpp
|
|||
|
|
│ │ └── src/
|
|||
|
|
│ │ └── udp_sender_node.cpp
|
|||
|
|
│ └── build.sh
|
|||
|
|
│
|
|||
|
|
├── skylink_qt_station/ # [PC端] Qt 6 C++ 工程
|
|||
|
|
│ ├── CMakeLists.txt
|
|||
|
|
│ ├── resources.qrc
|
|||
|
|
│ ├── src/
|
|||
|
|
│ │ ├── main.cpp
|
|||
|
|
│ │ ├── MainWindow.h
|
|||
|
|
│ │ ├── MainWindow.cpp
|
|||
|
|
│ │ ├── GroundReceiver.h
|
|||
|
|
│ │ ├── GroundReceiver.cpp
|
|||
|
|
│ │ └── DataLogger.h
|
|||
|
|
│ └── forms/
|
|||
|
|
│ └── MainWindow.ui
|
|||
|
|
│
|
|||
|
|
└── skylink_android_app/ # [移动端] Android Studio 工程
|
|||
|
|
├── build.gradle.kts
|
|||
|
|
├── app/
|
|||
|
|
│ ├── build.gradle.kts
|
|||
|
|
│ └── src/
|
|||
|
|
│ └── main/
|
|||
|
|
│ ├── AndroidManifest.xml
|
|||
|
|
│ ├── java/com/skylink/app/
|
|||
|
|
│ │ ├── MainActivity.kt
|
|||
|
|
│ │ ├── network/
|
|||
|
|
│ │ │ ├── UdpReceiver.kt
|
|||
|
|
│ │ │ └── PacketDef.kt
|
|||
|
|
│ │ └── utils/
|
|||
|
|
│ │ └── BitmapUtils.kt
|
|||
|
|
│ └── res/
|
|||
|
|
│ ├── layout/
|
|||
|
|
│ │ └── activity_main.xml
|
|||
|
|
│ └── values/
|
|||
|
|
│ └── strings.xml
|
|||
|
|
└── settings.gradle.kts
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🚀 快速启动
|
|||
|
|
|
|||
|
|
### 1️⃣ 机载端(ROS 2)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd skylink_ros2
|
|||
|
|
./build.sh
|
|||
|
|
source install/setup.bash
|
|||
|
|
ros2 launch skylink_bridge bridge.launch.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**参数配置** (`skylink_ros2/src/skylink_bridge/config/params.yaml`):
|
|||
|
|
```yaml
|
|||
|
|
/**:
|
|||
|
|
ros__parameters:
|
|||
|
|
target_ip: "255.255.255.255" # 广播地址
|
|||
|
|
target_port: 9999 # UDP 端口
|
|||
|
|
jpeg_quality: 70 # 图像压缩质量
|
|||
|
|
camera_topic: "/camera/image_raw"
|
|||
|
|
gps_topic: "/mavros/global_position/global"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2️⃣ PC 地面站(Qt 6)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd skylink_qt_station
|
|||
|
|
mkdir build && cd build
|
|||
|
|
cmake ..
|
|||
|
|
make
|
|||
|
|
./skylink_station
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**功能特性**:
|
|||
|
|
- 📺 实时视频显示(支持 JPEG 解码和重组)
|
|||
|
|
- 📍 GPS 位置绘制
|
|||
|
|
- 📊 实时丢包率、FPS 显示
|
|||
|
|
- 💾 视频帧保存到本地
|
|||
|
|
|
|||
|
|
### 3️⃣ Android 移动端
|
|||
|
|
|
|||
|
|
在 Android Studio 中打开 `skylink_android_app`,然后:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
Build > Build Bundle(s) / APK(s)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**权限要求**:
|
|||
|
|
- `android.permission.INTERNET` (网络连接)
|
|||
|
|
- `android.permission.WRITE_EXTERNAL_STORAGE` (保存数据)
|
|||
|
|
|
|||
|
|
## 📋 核心协议
|
|||
|
|
|
|||
|
|
### 数据包结构 (`protocol/protocol.h`)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
+-------+----------+-------+-----------+---------+----------+-----+-----+-----+
|
|||
|
|
| Magic | Frame ID | Chunks| ChunkIdx | DataLen | Timestamp| Lat | Lon | Alt |
|
|||
|
|
|2 bytes| 4 bytes |2bytes | 2 bytes | 2 bytes |8 bytes |8 by |8 by |8 by|
|
|||
|
|
+-------+----------+-------+-----------+---------+----------+-----+-----+-----+
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**关键字段**:
|
|||
|
|
- **Magic**: 0xAA55 (包头识别)
|
|||
|
|
- **Frame ID**: 唯一帧编号
|
|||
|
|
- **Chunks**: 总切片数(用于重组)
|
|||
|
|
- **Timestamp**: GPS 时间戳
|
|||
|
|
- **Lat/Lon/Alt**: 卫星定位数据
|
|||
|
|
|
|||
|
|
## 🔧 开发工具链
|
|||
|
|
|
|||
|
|
| 端 | 技术栈 |
|
|||
|
|
|---------|------------------------------|
|
|||
|
|
| 机载端 | ROS 2, C++17, OpenCV, JPEG |
|
|||
|
|
| PC 端 | Qt 6, C++17, OpenGL |
|
|||
|
|
| 移动端 | Android 12+, Kotlin, Coroutines |
|
|||
|
|
|
|||
|
|
## 📝 编码规范
|
|||
|
|
|
|||
|
|
- **C++**:Google C++ Style Guide (改进版)
|
|||
|
|
- **Kotlin**:Kotlin Coding Conventions
|
|||
|
|
- **命名**:驼峰法(成员变量用 `m_` 前缀)
|
|||
|
|
- **注释**:中英混用,关键逻辑必须有说明
|
|||
|
|
|
|||
|
|
## 🐛 故障排查
|
|||
|
|
|
|||
|
|
### 机载端无法连接相机
|
|||
|
|
```bash
|
|||
|
|
# 检查相机权限
|
|||
|
|
v4l2-ctl --list-devices
|
|||
|
|
# 检查 ROS 2 节点
|
|||
|
|
ros2 node list
|
|||
|
|
ros2 topic list
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### PC 端收不到数据包
|
|||
|
|
```bash
|
|||
|
|
# 检查网络配置
|
|||
|
|
ipconfig /all
|
|||
|
|
# 使用 Wireshark 抓包检查 9999 端口
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Android 连接超时
|
|||
|
|
- 确保设备与 PC 在同一网段
|
|||
|
|
- 检查防火墙是否开放 9999 端口
|
|||
|
|
|
|||
|
|
## 📄 许可证
|
|||
|
|
|
|||
|
|
MIT License - 详见 LICENSE 文件
|
|||
|
|
|
|||
|
|
## 👥 贡献指南
|
|||
|
|
|
|||
|
|
欢迎提交 Issue 和 Pull Request!
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**最后更新**: 2026-01-19
|