1. 课程导论与预备知识:ArduPilot避障体系概述、硬件选型与开发环境搭建

大家好,我是你们的讲师。在无人机这个行当摸爬滚打了十来年,我踩过的坑比飞过的航线还多。今天咱们开始这门课,第一讲先搭好地基。说白了,避障不是让飞机“看见”障碍物,而是让飞机“理解”周围环境并做出决策。这个体系,远比想象中复杂。

1.1 ArduPilot避障体系:从感知到决策的闭环

ArduPilot的避障,不是单一功能,而是一整套流程。我习惯把它拆成三个环节:感知、处理、执行

  • 感知层:传感器采集原始数据。比如激光雷达的点云、双目相机的深度图、超声波的距离值。
  • 处理层:飞控上的避障算法模块(比如 AP_ProximityAP_OADatabase)把原始数据转成“障碍物地图”。
  • 执行层:路径规划器(如 AP_MissionAP_OpticalFlow)根据地图重新规划航线,或者直接刹车。

你想想看,这三个环节只要有一个掉链子,飞机就可能撞上去。我在项目中遇到过,传感器数据明明很干净,但飞控处理不过来,导致避障延迟。嗯,这里要注意,处理层的实时性往往是瓶颈。

核心要点:ArduPilot 4.0以上版本,避障架构已经统一为 AP_Proximity 后端 + AP_OADatabase 前端。所有传感器数据都先进入 AP_Proximity,再由 AP_OADatabase 生成障碍物网格。

下面这张图,是我自己画的避障体系逻辑流。你可以看到数据从传感器到最终动作的完整路径。

传感器层 激光雷达 / 双目 / 超声波 处理层 AP_Proximity AP_OADatabase 执行层 路径规划 / 刹车 反馈:避障失败则悬停或返航 ArduPilot 避障体系逻辑流 关键说明: 1. 传感器数据必须经过 AP_Proximity 统一格式转换 2. AP_OADatabase 维护一个 3D 障碍物网格(默认 10cm 分辨率) 3. 执行层根据避障模式(如“绕行”或“停止”)做出不同响应 4. 反馈回路确保避障失败时飞机不会失控

1.2 硬件选型:激光雷达、双目、超声波怎么选?

选传感器,说白了就是成本、精度、环境适应性三者的博弈。我直接说结论,再讲为什么。

传感器类型 典型型号 测距范围 精度 适用场景 我的建议
激光雷达(单线) RPLIDAR A1 / TFmini 0.1 - 12m ±1cm 室内、低光照、高精度 首选,稳定可靠
双目视觉 Intel RealSense D435 0.2 - 10m ±2cm @ 1m 室外、纹理丰富环境 适合室外,但计算量大
超声波 HC-SR04 / MaxBotix 0.02 - 5m ±1cm 近距离、透明物体 辅助用,别做主传感器

我的经验:如果你预算有限,先买一个 RPLIDAR A1 做测试。我当年第一次做避障,图便宜买了超声波阵列,结果在草地上飞,草反射声波导致误报不断。后来换了激光雷达,世界清净了。

为什么会这样?因为超声波对软性物体(比如树叶、草地)的反射特性很差。而激光雷达是光信号,只要物体不透明,基本都能稳定测距。

1.3 开发环境搭建:Ubuntu + MAVSDK + QGC

环境搭建,我建议你一步到位。别用虚拟机,直接双系统或者用一台闲置电脑装 Ubuntu 20.04。为什么?因为 USB 转串口、实时内核这些,在虚拟机里容易出幺蛾子。

1.3.1 安装 Ubuntu 20.04 LTS

这个我就不细说了,网上教程一大把。唯一提醒:分区时给 /home 留够空间,至少 50GB。你后面要装仿真、存日志,空间很快就吃完了。

1.3.2 安装 MAVSDK

MAVSDK 是咱们和飞控通信的桥梁。我个人习惯用 C++ 版本,因为性能好。安装很简单:

# 下载 MAVSDK
wget https://github.com/mavlink/MAVSDK/releases/download/v1.4.0/libmavsdk-dev_1.4.0_amd64.deb

# 安装
sudo dpkg -i libmavsdk-dev_1.4.0_amd64.deb

# 验证安装
pkg-config --modversion libmavsdk

如果你用 Python,也可以装 mavsdk 包。但我建议初学者先用 C++,因为 ArduPilot 的底层接口更直接。

注意:MAVSDK 依赖 libcurllibssl。如果安装报错,先执行 sudo apt install libcurl4-openssl-dev libssl-dev。我曾经在这上面卡了半小时,就是因为系统缺了这两个库。

1.3.3 安装 QGroundControl (QGC)

QGC 是地面站,用来监控和调试。安装方式:

# 下载 AppImage
wget https://d176tv9ibo4jno.cloudfront.net/latest/QGroundControl.AppImage

# 赋予执行权限
chmod +x QGroundControl.AppImage

# 运行
./QGroundControl.AppImage

第一次运行,QGC 会自动检测串口。如果你连不上飞控,多半是权限问题:

# 把当前用户加入 dialout 组
sudo usermod -a -G dialout $USER
# 然后注销重新登录

1.4 快速验证:让飞控“看到”传感器数据

环境搭好了,怎么知道传感器和飞控在通信?我教你一个快速验证方法。

  1. 把激光雷达(比如 TFmini)通过串口接到飞控的 TELEM2 口。
  2. 在 QGC 的参数表中,设置 SERIAL2_PROTOCOL = 9(对应 MAVLink),SERIAL2_BAUD = 115
  3. 打开 QGC 的 Mavlink Inspector,查看 DISTANCE_SENSOR 消息。

如果你看到 current_distance 字段在变化,说明数据已经进来了。嗯,这一步很关键,我见过有人折腾半天,结果发现是串口 TX/RX 接反了。

避坑指南:我曾经在项目里用了一款 3.3V 的激光雷达,直接接到 5V 的飞控串口上,结果烧了传感器。记住,电平匹配是硬件连接的第一原则。不确定的话,用万用表量一下。

好了,这一章的内容就是这些。环境搭好、传感器选好,咱们下一章就可以开始写真正的避障代码了。


专注资料整理