Files
flyLink/PROJECT.md

207 lines
5.9 KiB
Markdown
Raw Normal View History

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