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

207 lines
5.9 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 端口