# SkyLink - 多平台实时视频传输系统 一个分布式实时视频传输解决方案,连接机载端(ROS 2)、PC 地面站(Qt 6)和移动端(Android)。 ## 🏗️ 系统架构 ``` ┌─────────────────────┐ │ ROS 2 机载端 │ │ - 相机采集 │ │ - 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 | ## 🐛 故障排查 ### 机载端无法连接相机 ```bash # 检查相机权限 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 端收不到数据包 ```bash # 检查网络配置 ipconfig /all # 使用 Wireshark 抓包检查 9999 端口 ``` ### Android 连接超时 - 确保设备与 PC 在同一网段 - 检查防火墙是否开放 9999 端口