d90a98cd9d03232b4e3266a7601db529cc72753c
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)
cd skylink_ros2
./build.sh
source install/setup.bash
ros2 launch skylink_bridge bridge.launch.py
参数配置 (skylink_ros2/src/skylink_bridge/config/params.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)
cd skylink_qt_station
mkdir build && cd build
cmake ..
make
./skylink_station
功能特性:
- 📺 实时视频显示(支持 JPEG 解码和重组)
- 📍 GPS 位置绘制
- 📊 实时丢包率、FPS 显示
- 💾 视频帧保存到本地
3️⃣ Android 移动端
在 Android Studio 中打开 skylink_android_app,然后:
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_前缀) - 注释:中英混用,关键逻辑必须有说明
🐛 故障排查
机载端无法连接相机
# 检查相机权限
v4l2-ctl --list-devices
# 检查相机帧率、分辨率、像素格式
v4l2-ctl --list-formats-ext
v4l2-ctl -d /dev/video0 --list-formats-ext
# 在终端 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
# 检查 ROS 2 节点
ros2 node list
ros2 topic list
PC 端收不到数据包
# 检查网络配置
ipconfig /all
# 使用 Wireshark 抓包检查 9999 端口
Android 连接超时
- 确保设备与 PC 在同一网段
- 检查防火墙是否开放 9999 端口
📄 许可证
MIT License - 详见 LICENSE 文件
👥 贡献指南
欢迎提交 Issue 和 Pull Request!
最后更新: 2026-01-19
Description
Languages
C++
69.1%
Makefile
11.9%
CMake
9%
Kotlin
7.2%
C
1.5%
Other
1.3%