Files
flyLink/PROJECT.md
flowerstonezl adc8f0569a app更新
2026-01-20 17:24:15 +08:00

5.9 KiB
Raw Permalink Blame History

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

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

🐛 故障排查

机载端无法连接相机



# 检查相机权限
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 端口