智能飞行控制系统

作业内容

基于 AirSim 无人机仿真平台,使用 Python 实现无人机自动起飞、带碰撞检测的智能定点巡航慢下降功能,RGB/深度/分割多模式相机拍照与处理键盘手动控制功能,速度档位切换一键返航,以及 CNN 深度图像碰撞预测与实时避障

运行环境

  • 操作系统:Windows 10/11 64位
  • Python 版本:Python 3.10.11
  • 仿真平台:AirSimNH / AirSim

依赖库

  • airsim==1.8.1
  • numpy>=1.21
  • opencv-python>=4.5.0
  • pynput>=1.8
  • msgpack-rpc-python>=0.4.1
  • torch

项目结构

drone_flight_sim/
├── main.py                      # 主程序入口(支持两种飞行模式)
├── drone_controller.py          # 无人机核心控制模块
├── collision_handler.py         # 碰撞检测与处理模块(简单神经网络)
├── collision_predictor.py       # CNN 碰撞预测模块(实时推理)
├── flight_path.py               # 航点规划模块
├── keyboard_control.py          # 键盘控制模块
├── collision_data_collector.py  # 手动碰撞数据采集模块
├── auto_collision_collector.py  # 自动碰撞数据采集模块
├── train_collision_model.py     # CNN 碰撞预测模型训练
├── config.py                    # 配置文件
├── utils.py                     # 工具函数
├── drone_images/                # 拍摄照片保存目录(自动创建)
└── collision_dataset/           # 碰撞数据采集保存目录(自动创建)

飞行模式

程序支持两种飞行模式,启动时会让你选择:

模式 1:自动航点飞行模式

  • 无人机按照预设的航点列表自动飞行
  • 在每个航点自动拍照
  • 实时 CNN 碰撞预测与自动避障
  • 适合执行重复性巡检任务

模式 2:键盘手动控制模式

  • 使用键盘实时控制无人机飞行
  • 支持拍照等功能
  • 按 M 键开启/关闭 CNN 碰撞预警
  • 适合手动探索和精确控制

功能实现

1. 自动连接与初始化

  • 自动连接 AirSim 仿真环境
  • 获取无人机控制权并解锁电机
  • 初始化碰撞检测系统
  • 初始化相机系统
  • 自动加载 CNN 碰撞预测模型

2. 智能起飞控制

  • 自动起飞至指定高度(默认5米)
  • 起飞超时保护(10秒)
  • 起飞状态验证与反馈

3. 定点巡航

  • 智能碰撞检测与自动恢复
  • 实时监测碰撞事件
  • 自动过滤地面/道路接触(Road、Ground、Terrain 等)
  • 区分严重碰撞与正常地面接触
  • 碰撞后自动恢复
    • 自动尝试后退避障(最多3次)
    • 恢复成功后继续执行飞行任务
  • 手动接管机制
    • 自动恢复失败后提示用户手动接管
    • 切换到键盘控制模式让用户解决碰撞
    • 脱离困境后可继续降落
  • 大范围航点飞行
  • 预设11个航点,覆盖更大飞行区域
  • 飞行高度5米,更安全的高度

4. CNN 碰撞预测与实时避障(新增)

  • 模型:使用 CollisionCNN 对深度图像进行二分类(安全 vs 危险)
  • 训练python train_collision_model.py
  • 性能:测试准确率 91.80%(301 个样本)
  • 航点模式:飞行循环中每 0.5 秒用深度图推理碰撞风险
  • 🟢 安全:正常飞行
  • 🟡 预警:自动减速
  • 🔴 危险:连续 3 次触发后自动后退+上升避障
  • 键盘模式:按 M 键开启/关闭 CNN 碰撞预警(独立线程监控)
  • 避障策略:后退 3m + 上升 2m,避障后自动恢复飞向目标
  • 模型文件:collision_model.pth

5. RGB 相机拍照功能(键盘快捷键操作)

支持键盘快捷键

按键 功能 说明
P RGB拍照 拍摄彩色图像,自动保存
T 全景拍照 一次性拍摄 RGB + 深度 + 分割三种图像
N 深度图像 拍摄深度图(伪彩色:蓝=近,红=远)
B 实时预览 打开相机预览窗口,实时查看无人机视角

拍照功能详情: - RGB拍照(P键):拍摄无人机视角的彩色照片,自动保存到 drone_images/ 目录,文件名包含时间戳和位置信息 - 全景拍照(T键):同时获取 RGB 彩色图、深度图、分割图三种图像,适合需要完整数据的场景 - 深度图像(N键):拍摄深度图,使用伪彩色显示(JET色彩表:蓝色表示近,红色表示远),可用于测距和避障 - 实时预览(B键):打开相机实时预览窗口,可以直观看到无人机视角,适合探索环境时使用

图片保存: - 保存位置:drone_images/ 目录(自动创建) - RGB图像:rgb_时间戳_X_Y_n序号.png - 深度图像:depth_时间戳_X_Y.png - 分割图像:seg_时间戳_X_Y.png - 全景图像:all_时间戳_X_Y_rgb/depth/seg.png

6. 键盘手动控制功能

按键 功能
W 前进
S 后退
A 向左横移
D 向右横移
Q 上升
E 下降
空格 悬停
1-5 切换速度档位(慢/中/快/很快/极速)
R 一键返航
L 执行降落
M 切换 CNN 碰撞预警(开/关)
ESC 紧急停止并退出
O 一键环绕(飞矩形轨迹)

特点: - 持续按键时无人机持续移动 - 释放按键后自动悬停并显示移动距离 - 支持组合按键实现斜向飞行

速度档位(1-5键): - 1档(慢速):1 m/s - 2档(中速):2 m/s(默认) - 3档(快速):3 m/s - 4档(很快):5 m/s - 5档(极速):8 m/s

一键返航(R键): - 自动飞回起飞点位置 - 到达后自动降落 - 起飞时会自动记录返航点

7. 安全降落系统

  • 三重降落机制
  • 正常降落:调用 AirSim 降落 API
  • 重试机制:最多 3 次尝试
  • 强制复位:降落失败时的最后保障
  • 降落状态实时监控
  • 高度检测与安全高度调整
  • 降落完成后自动锁定电机

8. 慢速平稳降落

  • 速度控制降落:以 1m/s 的下降速度缓慢降落,避免冲击
  • 下降过程监控:实时显示当前高度,让降落过程可视化
  • 渐进式着地:从飞行高度逐步下降至着陆
  • 电机柔和锁定:着陆后平稳锁定电机,无抖动

配置参数

config.py 中可以修改以下参数:

参数 默认值 说明
TAKEOFF_HEIGHT -5 起飞高度(米)
FLIGHT_VELOCITY 3 飞行速度(米/秒)
MAX_FLIGHT_TIME 60 最大飞行时间(秒)
COLLISION_COOLDOWN 1.0 碰撞冷却时间(秒)
RGB_CAMERA_NAME "0" RGB 相机名称
KEYBOARD_VELOCITY 2 键盘控制默认速度(米/秒)
KEYBOARD_STEP 2 键盘控制位移步长(米)
ENABLE_CNN_PREDICTION True 是否启用 CNN 碰撞预测
CNN_RISK_THRESHOLD 0.7 碰撞风险阈值
CNN_PREDICTION_INTERVAL 0.5 CNN 推理间隔(秒)
CNN_CONSECUTIVE_WARNING_THRESHOLD 3 连续预警触发避障次数
CNN_AVOID_BACK_DISTANCE 3.0 避障后退距离(米)
CNN_AVOID_RISE_HEIGHT 2.0 避障上升高度(米)

碰撞数据采集

自动采集(推荐)

python auto_collision_collector.py

飞行模式

模式 说明 碰撞率
1. 螺旋飞行 螺旋向外扩大飞行
2. 随机飞行 飞向随机目标点
3. 折线飞行 高速直线折返
4. 撞墙模式 专门朝障碍物飞行 最高

采集原理: - 安全样本(label=0):飞行过程中定期自动采集 - 危险样本(label=1):碰撞事件发生时自动采集并标注 - 碰撞后自动恢复,继续飞行采集

手动采集

python collision_data_collector.py
按键 功能
W/S/A/D 飞行控制
Q/E 上升/下降
0 设置安全标签
1 设置危险标签
C 采集当前样本

数据保存:collision_dataset/depth/ + collision_dataset/labels.csv

碰撞预测模型

训练

python train_collision_model.py

评估

python train_collision_model.py --eval

模型架构

输入: 深度图像 (64x64 灰度)
    ↓
Conv2D(1→16) + BN + ReLU + MaxPool
    ↓
Conv2D(16→32) + BN + ReLU + MaxPool
    ↓
Conv2D(32→64) + BN + ReLU + MaxPool
    ↓
Conv2D(64→128) + BN + ReLU + MaxPool
    ↓
Flatten → Dense(256) → Dropout → Dense(64) → Dense(1)
    ↓
输出: 碰撞风险概率 [0~1]

性能

  • 数据集:collision_dataset/(301 个样本,安全: 278, 危险: 23)
  • 数据增强:过采样平衡类别
  • 测试准确率:91.80%
  • 模型文件:collision_model.pth

API 参考

键盘控制 API

from keyboard_control import KeyboardController, print_control_help

# 打印控制说明
print_control_help()

# 创建键盘控制器并启动
controller = KeyboardController(drone)
controller.start()

相机控制 API

# 创建无人机控制器
drone = DroneController()

# 设置图片保存目录(可选,默认保存到 drone_images 文件夹)
drone.set_output_dir("my_photos")

# 拍摄 RGB 彩色图像
drone.capture_image()

# 指定文件名保存
drone.capture_image(filename="my_photo.png")

# 拍摄并显示预览窗口
drone.capture_image(show_preview=True)

# 拍摄深度图像(伪彩色)
drone.capture_depth_image()

# 拍摄分割图像
drone.capture_segmentation_image()

# 同时拍摄 RGB + 深度 + 分割三种图像
drone.capture_all_cameras()

# 显示无人机状态
drone.get_telemetry()

航点规划 API

from flight_path import FlightPath

# 正方形路径
waypoints = FlightPath.square_path(size=15, height=-3)

# 矩形路径
waypoints = FlightPath.rectangle_path(width=20, length=10, altitude=-3)

# 三角形路径
waypoints = FlightPath.triangle_path(size=15, height=-5)

# 自定义路径
waypoints = [(5, 0, -3), (5, -5, -3), (0, -5, -3), (0, 0, -3)]

CNN 碰撞预测 API

from collision_predictor import CollisionPredictor

# 创建预测器
predictor = CollisionPredictor(risk_threshold=0.7)

# 从深度图像预测
result = predictor.predict(depth_image_numpy)
# result = {'probability': 0.85, 'is_dangerous': True, 'risk_level': 'danger'}

# 从 AirSim 直接获取深度图并预测
result = predictor.predict_from_airsim(client, camera_name="0")

运行步骤

  1. 启动仿真环境
  2. 启动 AirSimNH.exe
  3. 选择"否(N)"进入四旋翼无人机模式
  4. 等待仿真环境完全加载

  5. 运行程序 bash python main.py

  6. 选择飞行模式

  7. 输入 1:自动航点飞行模式
  8. 输入 2:键盘手动控制模式

  9. 键盘控制模式操作

  10. 按 W/S/A/D 控制水平移动
  11. 按 Q/E 控制升降
  12. 按 1-5 切换速度档位
  13. 按 R 一键返航
  14. 按 M 切换 CNN 碰撞预警
  15. 按 P/T/N/B 进行拍照操作
  16. 按 ESC 或 L 退出并降落

照片存储

运行后拍摄的图片会自动保存到 drone_images/ 目录下,文件命名格式:

  • RGB 图像:rgb_YYYYMMDD_HHMMSS_X_Y_n序号.png
  • 深度图像:depth_YYYYMMDD_HHMMSS_X_Y.png
  • 分割图像:seg_YYYYMMDD_HHMMSS_X_Y.png

其中 XY 为拍照时的无人机坐标,序号 为该次运行的第 N 张照片。