2026-01-20 17:24:15 +08:00
|
|
|
|
# SkyLink - 多平台实时视频传输系统
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
一个分布式实时视频传输解决方案,连接机载端(ROS 2)、PC 地面站(Qt 6)和移动端(Android)。
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
## 🏗️ 系统架构
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
```
|
|
|
|
|
|
┌─────────────────────┐
|
|
|
|
|
|
│ ROS 2 机载端 │
|
|
|
|
|
|
│ - 相机采集 │
|
|
|
|
|
|
│ - GPS 传感器 │
|
|
|
|
|
|
│ - UDP 发送广播 │
|
|
|
|
|
|
└──────────┬──────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
UDP 广播 (9999)
|
|
|
|
|
|
│
|
|
|
|
|
|
┌──────┴──────┐
|
|
|
|
|
|
│ │
|
|
|
|
|
|
┌───▼────────┐ ┌─▼──────────────┐
|
|
|
|
|
|
│ Qt PC 地面站 │ │ Android 移动端 │
|
|
|
|
|
|
│ - 解码显示 │ │ - 实时预览 │
|
|
|
|
|
|
│ - GPS 绘图 │ │ - 数据记录 │
|
|
|
|
|
|
│ - 丢包统计 │ │ - 远程控制 │
|
|
|
|
|
|
└────────────┘ └────────────────┘
|
|
|
|
|
|
```
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
|
|
|
|
|
## 📂 项目结构
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
SkyLink/
|
2026-01-20 17:24:15 +08:00
|
|
|
|
├── README.md # 本文件 (架构图、启动命令)
|
|
|
|
|
|
├── docker-compose.yml # (可选) Docker 部署
|
2026-01-19 17:08:49 +08:00
|
|
|
|
│
|
|
|
|
|
|
├── protocol/ # [核心] 公共协议定义
|
|
|
|
|
|
│ ├── protocol.h # C++ 结构体定义
|
|
|
|
|
|
│ └── Protocol.kt # Kotlin 参考实现
|
|
|
|
|
|
│
|
2026-01-20 17:24:15 +08:00
|
|
|
|
├── 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
|
2026-01-19 17:08:49 +08:00
|
|
|
|
│
|
2026-01-20 17:24:15 +08:00
|
|
|
|
├── skylink_qt_station/ # [PC端] Qt 6 C++ 工程
|
|
|
|
|
|
│ ├── CMakeLists.txt
|
2026-01-19 17:08:49 +08:00
|
|
|
|
│ ├── resources.qrc
|
2026-01-20 17:24:15 +08:00
|
|
|
|
│ ├── src/
|
|
|
|
|
|
│ │ ├── main.cpp
|
|
|
|
|
|
│ │ ├── MainWindow.h
|
|
|
|
|
|
│ │ ├── MainWindow.cpp
|
|
|
|
|
|
│ │ ├── GroundReceiver.h
|
|
|
|
|
|
│ │ ├── GroundReceiver.cpp
|
|
|
|
|
|
│ │ └── DataLogger.h
|
|
|
|
|
|
│ └── forms/
|
|
|
|
|
|
│ └── MainWindow.ui
|
2026-01-19 17:08:49 +08:00
|
|
|
|
│
|
2026-01-20 17:24:15 +08:00
|
|
|
|
└── 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
|
2026-01-19 17:08:49 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
## 🚀 快速启动
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
### 1️⃣ 机载端(ROS 2)
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd skylink_ros2
|
|
|
|
|
|
./build.sh
|
|
|
|
|
|
source install/setup.bash
|
|
|
|
|
|
ros2 launch skylink_bridge bridge.launch.py
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
**参数配置** (`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)
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-01-20 17:24:15 +08:00
|
|
|
|
cd skylink_qt_station
|
2026-01-19 17:08:49 +08:00
|
|
|
|
mkdir build && cd build
|
|
|
|
|
|
cmake ..
|
|
|
|
|
|
make
|
|
|
|
|
|
./skylink_station
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
**功能特性**:
|
|
|
|
|
|
- 📺 实时视频显示(支持 JPEG 解码和重组)
|
|
|
|
|
|
- 📍 GPS 位置绘制
|
|
|
|
|
|
- 📊 实时丢包率、FPS 显示
|
|
|
|
|
|
- 💾 视频帧保存到本地
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
### 3️⃣ Android 移动端
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
在 Android Studio 中打开 `skylink_android_app`,然后:
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
```bash
|
|
|
|
|
|
Build > Build Bundle(s) / APK(s)
|
2026-01-19 17:08:49 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
**权限要求**:
|
|
|
|
|
|
- `android.permission.INTERNET` (网络连接)
|
|
|
|
|
|
- `android.permission.WRITE_EXTERNAL_STORAGE` (保存数据)
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
## 📋 核心协议
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
### 数据包结构 (`protocol/protocol.h`)
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
|
|
|
|
|
```
|
2026-01-20 17:24:15 +08:00
|
|
|
|
+-------+----------+-------+-----------+---------+----------+-----+-----+-----+
|
|
|
|
|
|
| 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|
|
|
|
|
|
|
+-------+----------+-------+-----------+---------+----------+-----+-----+-----+
|
2026-01-19 17:08:49 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
**关键字段**:
|
|
|
|
|
|
- **Magic**: 0xAA55 (包头识别)
|
|
|
|
|
|
- **Frame ID**: 唯一帧编号
|
|
|
|
|
|
- **Chunks**: 总切片数(用于重组)
|
|
|
|
|
|
- **Timestamp**: GPS 时间戳
|
|
|
|
|
|
- **Lat/Lon/Alt**: 卫星定位数据
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
## 🔧 开发工具链
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
| 端 | 技术栈 |
|
|
|
|
|
|
|---------|------------------------------|
|
|
|
|
|
|
| 机载端 | ROS 2, C++17, OpenCV, JPEG |
|
|
|
|
|
|
| PC 端 | Qt 6, C++17, OpenGL |
|
|
|
|
|
|
| 移动端 | Android 12+, Kotlin, Coroutines |
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
## 🐛 故障排查
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
### 机载端无法连接相机
|
|
|
|
|
|
```bash
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
|
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
# 检查相机权限
|
|
|
|
|
|
v4l2-ctl --list-devices
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
# 检查相机帧率、分辨率、像素格式
|
|
|
|
|
|
v4l2-ctl --list-formats-ext
|
|
|
|
|
|
v4l2-ctl -d /dev/video0 --list-formats-ext
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
# 在终端 1 运行相机驱动
|
|
|
|
|
|
sudo apt install ros-humble-usb-cam # 如果还没装
|
|
|
|
|
|
ros2 run usb_cam usb_cam_node_exe --ros-args -p video_device:="/dev/video0"
|
|
|
|
|
|
ros2 topic hz /camera/image_raw
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
# 检查 ROS 2 节点
|
|
|
|
|
|
ros2 node list
|
|
|
|
|
|
ros2 topic list
|
|
|
|
|
|
```
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
### PC 端收不到数据包
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 检查网络配置
|
|
|
|
|
|
ipconfig /all
|
|
|
|
|
|
# 使用 Wireshark 抓包检查 9999 端口
|
|
|
|
|
|
```
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
2026-01-20 17:24:15 +08:00
|
|
|
|
### Android 连接超时
|
|
|
|
|
|
- 确保设备与 PC 在同一网段
|
|
|
|
|
|
- 检查防火墙是否开放 9999 端口
|
2026-01-19 17:08:49 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|