1. 课程导论与预备知识:ArduPilot避障体系概述、硬件选型与开发环境搭建
大家好,我是你们的讲师。在无人机这个行当摸爬滚打了十来年,我踩过的坑比飞过的航线还多。今天咱们开始这门课,第一讲先搭好地基。说白了,避障不是让飞机“看见”障碍物,而是让飞机“理解”周围环境并做出决策。这个体系,远比想象中复杂。
1.1 ArduPilot避障体系:从感知到决策的闭环
ArduPilot的避障,不是单一功能,而是一整套流程。我习惯把它拆成三个环节:感知、处理、执行。
- 感知层:传感器采集原始数据。比如激光雷达的点云、双目相机的深度图、超声波的距离值。
- 处理层:飞控上的避障算法模块(比如
AP_Proximity和AP_OADatabase)把原始数据转成“障碍物地图”。 - 执行层:路径规划器(如
AP_Mission或AP_OpticalFlow)根据地图重新规划航线,或者直接刹车。
你想想看,这三个环节只要有一个掉链子,飞机就可能撞上去。我在项目中遇到过,传感器数据明明很干净,但飞控处理不过来,导致避障延迟。嗯,这里要注意,处理层的实时性往往是瓶颈。
核心要点:ArduPilot 4.0以上版本,避障架构已经统一为 AP_Proximity 后端 + AP_OADatabase 前端。所有传感器数据都先进入 AP_Proximity,再由 AP_OADatabase 生成障碍物网格。
下面这张图,是我自己画的避障体系逻辑流。你可以看到数据从传感器到最终动作的完整路径。
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 依赖 libcurl 和 libssl。如果安装报错,先执行 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 快速验证:让飞控“看到”传感器数据
环境搭好了,怎么知道传感器和飞控在通信?我教你一个快速验证方法。
- 把激光雷达(比如 TFmini)通过串口接到飞控的
TELEM2口。 - 在 QGC 的参数表中,设置
SERIAL2_PROTOCOL = 9(对应MAVLink),SERIAL2_BAUD = 115。 - 打开 QGC 的 Mavlink Inspector,查看
DISTANCE_SENSOR消息。
如果你看到 current_distance 字段在变化,说明数据已经进来了。嗯,这一步很关键,我见过有人折腾半天,结果发现是串口 TX/RX 接反了。
避坑指南:我曾经在项目里用了一款 3.3V 的激光雷达,直接接到 5V 的飞控串口上,结果烧了传感器。记住,电平匹配是硬件连接的第一原则。不确定的话,用万用表量一下。
好了,这一章的内容就是这些。环境搭好、传感器选好,咱们下一章就可以开始写真正的避障代码了。