# 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 端口





