2. ArduPilot基础架构

ArduPilot作为当前最成熟的开源自动驾驶仪系统之一,其架构设计直接决定了避障算法能否高效、稳定地集成与运行。理解ArduPilot的基础架构,是后续进行避障算法移植、参数调优和实机测试的前提。本章将从飞行控制器硬件、固件分层架构、MAVLink通信协议、参数系统以及日志系统五个维度展开,帮助学员建立完整的系统认知框架,为后续章节的算法集成打下坚实基础。

ArduPilot 基础架构总览 飞行控制器硬件层 主处理器 MCU (STM32H7/F7) IMU (BMI088) 气压计 (MS5611) 磁力计 (IST8310) UART/I2C/SPI/CAN 固件分层架构 应用层 (ArduCopter/ArduPlane) 库层 (AP_Math/AP_NavEKF2/3) 硬件抽象层 (AP_HAL) 实时操作系统 (ChibiOS) MAVLink 通信协议 消息帧结构 (STX/LEN/SEQ) 消息集 (HEARTBEAT/GPS_RAW) MAVLink 2 扩展 (签名/遥测) 路由与转发机制 参数系统 (Parameter System) 参数类型: INT8/16/32, FLOAT 参数ID: 16字符以内 存储: FRAM/SD卡 访问: 地面站实时读写 日志系统 (DataFlash/Logger) 日志格式: .bin / .log 关键消息: GPS/IMU/RC/PM 分析工具: Mission Planner /MAVExplorer 避障算法集成涉及的关键交互路径 传感器数据 → 避障算法 (通过AP_Proximity库) 避障决策 → 导航控制 (通过AP_Avoidance库) 参数/日志 → 地面站调试 (通过MAVLink协议)

2.1 飞行控制器硬件平台

核心原理:硬件资源与接口分配

飞行控制器(Flight Controller, FC)是ArduPilot运行的物理载体。在避障算法集成中,FC的处理器性能、传感器接口和通信外设直接决定了算法可用的计算资源与数据通路。当前主流ArduPilot兼容FC多采用STM32H7系列(Cortex-M7内核,主频480MHz)或F7系列(216MHz),配备1MB以上RAM和2MB Flash。避障算法通常需要额外的距离传感器(如激光雷达、毫米波雷达或双目相机),这些传感器通过UART、I2C、SPI或CAN总线与FC连接。

以常见的避障传感器配置为例:激光雷达(如RPLidar A1)通过UART接口以串口协议输出距离数据,FC通过AP_Proximity库解析这些数据;而双目相机(如Intel RealSense)则通常通过USB连接至 companion computer(如树莓派或Jetson),由companion computer运行视觉避障算法,再将避障指令通过MAVLink发送给FC。这种"主控+协处理"的架构是当前避障系统的主流方案。

判断方法:如何评估FC是否满足避障需求

评估一块FC是否适合避障算法集成,需要从以下维度进行判断:

  • 处理器余量:避障算法(尤其是基于距离传感器的数据处理)会占用CPU时间。建议在集成前通过Mission Planner的"状态"页面观察CPU负载率,若在悬停状态下CPU负载已超过60%,则需考虑使用companion computer分担计算。
  • 可用UART数量:避障传感器通常占用1-2个UART。FC至少需要预留1个空闲UART用于避障传感器,同时保留1个UART用于数传模块。
  • I2C总线负载:若使用I2C接口的传感器(如部分超声波模块),需注意I2C总线上已挂载的设备数量。I2C总线地址冲突和带宽限制是常见问题。
  • PWM输出通道:避障算法触发紧急制动时,需要快速控制电机。确保FC的PWM输出频率可调(如400Hz),且具备足够的通道数。
经验提醒:在选型阶段,建议优先选择ArduPilot官方硬件列表中的"FMUv5+"及以上版本板卡。这些板卡具有更充裕的RAM和Flash,且对AP_Proximity、AP_Avoidance等避障相关库有更好的兼容性。Pixhawk 6X(FMUv6X)是目前避障开发的首选平台之一。

案例拆解:基于Pixhawk 6X的避障硬件配置

某无人机项目需要在室内环境实现自主避障飞行,选用Pixhawk 6X作为飞控,配置如下:

硬件组件型号/规格接口用途
飞控Pixhawk 6X (FMUv6X)-主控
激光雷达RPLidar A1 (8m范围)UART4 (TELEM2)360°二维测距
光流传感器PMW3901SPI室内定位辅助
数传模块SiK Radio 915MHzUART1 (TELEM1)地面站通信
机载电脑Raspberry Pi 4BUSB (MAVLink)视觉避障(可选)

在该配置中,激光雷达通过UART4接入,AP_Proximity库配置为"RangeFinder"类型,数据更新频率为10Hz。飞控通过AP_Avoidance库处理距离数据,当检测到前方障碍物距离小于2m时,触发"停止并悬停"的避障策略。整个系统的CPU负载在悬停状态下约为35%,留有充足余量。

常见误区与总结复盘

风险提示:部分开发者将避障传感器直接连接到I2C总线,却忽略了I2C总线的带宽限制。当多个传感器共享I2C总线时,数据更新率会显著下降,导致避障响应延迟。建议距离传感器优先使用UART或SPI接口。

硬件选型是避障系统的基础,但并非性能越强越好。需要根据实际飞行场景(室内/室外、飞行速度、障碍物类型)合理配置。在实机测试前,务必通过Mission Planner的"传感器"页面逐一验证每个传感器的数据输出是否正常。

2.2 固件架构与避障相关库

核心原理:分层设计与模块化

ArduPilot固件采用严格的分层架构,从上到下依次为:应用层(如ArduCopter、ArduPlane)、库层(AP_*系列库)、硬件抽象层(AP_HAL)和实时操作系统(ChibiOS)。这种分层设计使得避障算法可以以库的形式集成到系统中,而不需要修改飞控核心逻辑。

与避障直接相关的核心库包括:

  • AP_Proximity:负责管理所有距离传感器(激光雷达、毫米波雷达、超声波等),将原始距离数据转换为统一的障碍物距离表示。该库支持多种传感器类型,并提供"边界框"(Boundary)数据结构,用于描述飞行器周围的障碍物分布。
  • AP_Avoidance:避障决策库,基于AP_Proximity提供的障碍物信息,结合当前飞行模式(如Loiter、Auto)和导航目标,输出避障指令。支持"停止"、"绕行"、"爬升"等策略。
  • AP_OAPathPlanner:路径规划库,用于在Auto模式下生成绕过障碍物的航点路径。该库实现了简单的2D路径搜索算法,适合静态障碍物场景。

操作流程:如何添加自定义避障算法

在ArduPilot中集成自定义避障算法,通常遵循以下流程:

  1. 创建新库:在libraries目录下创建新的AP_MyAvoidance库,继承或调用AP_Proximity的接口。
  2. 注册传感器:在AP_Proximity的传感器注册表中添加自定义传感器类型,实现距离数据的读取与解析。
  3. 修改避障策略:在AP_Avoidance中增加新的避障策略枚举值,并在避障决策函数中实现自定义逻辑。
  4. 编译与烧录:使用waf编译系统编译固件,通过USB或SD卡烧录至飞控。
  5. 地面站验证:通过Mission Planner的"Proximity"视图查看传感器数据是否正常,通过"Flight Data"页面观察避障行为。
关键代码位置:避障相关的主要代码位于 libraries/AP_Proximity/ 和 libraries/AP_Avoidance/ 目录。自定义传感器驱动通常放在 libraries/AP_Proximity/AP_Proximity_MySensor.cpp 中,并实现 update() 和 get_distance() 等核心接口。

案例拆解:集成一个自定义超声波避障传感器

假设需要集成一个通过I2C接口输出的超声波传感器(如MaxBotix MB1240),其输出为模拟电压,需通过ADC读取。集成步骤如下:

  1. 在AP_Proximity中新增传感器类型 AP_Proximity_MB1240,继承 AP_Proximity_Backend 类。
  2. 在 init() 中配置ADC引脚,设置采样率为20Hz。
  3. 在 update() 中读取ADC值,转换为距离(电压与距离呈线性关系,0.5V对应20cm,4.5V对应700cm)。
  4. 将距离数据通过 set_distance() 写入边界框。
  5. 在AP_Avoidance中设置避障策略为"停止",当距离小于1.5m时触发悬停。

测试结果显示,该传感器在1m范围内的测距误差为±3cm,满足室内低速飞行的避障需求。但超声波传感器存在波束角较宽(约30°)的问题,在狭窄通道中可能产生误报,需通过软件滤波(如中值滤波)处理。

常见误区与总结复盘

风险提示:不要直接修改AP_Avoidance的核心决策逻辑来适配特定传感器。正确做法是扩展AP_Proximity后端,将传感器数据标准化后交给AP_Avoidance处理。否则,当更换传感器时,需要重写大量避障逻辑,且容易引入bug。

固件架构的核心价值在于"可插拔"的模块化设计。避障算法开发者应充分利用AP_Proximity和AP_Avoidance提供的接口,将精力集中在算法本身,而非底层硬件适配。

2.3 MAVLink协议与避障数据交互

核心原理:消息帧结构与关键消息

MAVLink(Micro Air Vehicle Link)是ArduPilot与地面站、机载电脑之间通信的标准协议。MAVLink 2.0是当前主流版本,其帧结构包含:起始标志(STX=0xFD)、长度(LEN)、序列号(SEQ)、系统ID(SYS_ID)、组件ID(COMP_ID)、消息ID(MSG_ID)、负载(Payload)和校验(CRC)。在避障系统中,MAVLink承担着三类关键数据交互:

  • 传感器数据上行:机载电脑(如运行视觉避障算法的Jetson)通过MAVLink将障碍物距离信息发送给飞控,通常使用 DISTANCE_SENSOR 消息(MSG_ID=132)。
  • 状态数据下行:飞控将避障状态(是否触发避障、当前避障策略)通过 STATUSTEXT 或 NAV_CONTROLLER_OUTPUT 消息发送给地面站。
  • 指令交互:地面站通过 SET_POSITION_TARGET_LOCAL_NED 消息发送避障航点,或通过 MAV_CMD 命令设置避障参数。

操作流程:配置MAVLink以支持避障数据

在ArduPilot中启用MAVLink避障数据交互,需要完成以下配置:

  1. 在Mission Planner的"配置"→"完整参数列表"中,设置 SERIAL2_PROTOCOL 为 "MAVLink2"(若使用机载电脑连接)。
  2. 设置 MAV_OPTIONS 参数,启用MAVLink 2扩展功能(如消息签名)。
  3. 在机载电脑端,使用pymavlink库发送 DISTANCE_SENSOR 消息,消息中需包含传感器ID、测量距离、最小/最大量程、方向等字段。
  4. 在飞控端,通过 AP_Proximity_MAVLink 后端接收并解析这些消息,将距离数据写入边界框。
关键参数:与MAVLink避障相关的核心参数包括:PROXIMITY_TYPE(设置为"MAVLink")、PROXIMITY_MAV_ORIENT(传感器安装方向)、AVOID_ENABLE(避障功能总开关)。这些参数均可通过地面站实时修改,便于飞行测试中的快速调整。

案例拆解:机载电脑视觉避障与飞控的MAVLink通信

某项目使用Jetson Nano运行YOLOv5目标检测,检测到障碍物后计算避障方向,并通过MAVLink发送给Pixhawk飞控。具体实现如下:

# 机载电脑端Python代码(使用pymavlink)
from pymavlink import mavutil

# 连接飞控(通过USB)
master = mavutil.mavlink_connection('/dev/ttyACM0', baud=115200)
master.wait_heartbeat()

# 发送DISTANCE_SENSOR消息
master.mav.distance_sensor_send(
    time_boot_ms=0,        # 时间戳
    min_distance=20,       # 最小量程 (cm)
    max_distance=500,      # 最大量程 (cm)
    current_distance=150,  # 当前距离 (cm)
    type=1,                # MAV_DISTANCE_SENSOR_LASER
    id=1,                  # 传感器ID
    orientation=0,         # MAV_SENSOR_ROTATION_NONE (前方)
    covariance=0           # 协方差
)

飞控端通过AP_Proximity_MAVLink后端接收该消息,当检测到前方距离小于2m时,AP_Avoidance触发"停止"指令。测试中,无人机以1m/s速度飞行,视觉避障系统成功在距离障碍物1.8m处触发悬停,响应延迟约100ms。

常见误区与总结复盘

风险提示:MAVLink通信的延迟和丢包是避障系统的潜在风险。在无线数传链路中,若带宽不足或信号干扰,可能导致距离数据更新延迟。建议在机载电脑与飞控之间使用USB或以太网有线连接,确保低延迟通信。

MAVLink是避障系统"外部大脑"(机载电脑)与"核心控制器"(飞控)之间的桥梁。合理利用MAVLink的消息机制,可以实现灵活的避障算法部署——既可以在飞控内部运行轻量级避障,也可以在机载电脑上运行复杂AI避障,两者通过MAVLink无缝协作。

2.4 参数系统与日志系统

核心原理:参数存储与日志记录机制

ArduPilot的参数系统(Parameter System)采用键值对存储方式,每个参数由不超过16字符的ID和对应的数值组成。参数类型支持INT8、INT16、INT32和FLOAT。参数存储在飞控的FRAM(铁电存储器)中,具有掉电保持能力。在避障算法集成中,参数系统用于配置传感器类型、避障阈值、使能开关等。

日志系统(DataFlash/Logger)以二进制格式(.bin)或文本格式(.log)记录飞行数据。日志消息以"类型+数据"的结构组织,例如GPS消息(GPS)、IMU消息(IMU)、RC输入消息(RCIN)等。避障相关的日志消息包括:PRX(Proximity距离数据)、AVOID(避障决策输出)、TERRAIN(地形数据)等。

操作流程:配置避障参数与日志分析

避障参数配置流程如下:

  1. 通过Mission Planner的"配置"→"标准参数"页面,找到"Proximity"和"Avoidance"参数组。
  2. 设置 PRX_TYPE 为对应传感器类型(如1=RangeFinder,2=MAVLink,3=激光雷达)。
  3. 设置 AVOID_ENABLE 为1(启用避障),并选择避障策略(如 AVOID_BEHAVIOR 设置为"停止"或"绕行")。
  4. 设置 AVOID_MARGIN 为安全距离(如2.0m),该参数定义了触发避障的最小障碍物距离。
  5. 在"配置"→"日志"页面,确保 LOG_BITMASK 包含PRX和AVOID消息位。

日志分析流程:飞行测试后,通过Mission Planner的"数据闪存日志"页面下载.bin文件,使用"日志浏览"功能查看PRX消息,绘制距离-时间曲线,判断避障触发是否及时、是否存在误触发。

案例拆解:通过日志分析避障误触发问题

某次测试中,无人机在空旷场地飞行时频繁触发避障悬停。通过日志分析发现:

日志消息时间戳 (s)距离值 (cm)备注
PRX12.5180正常
PRX12.645异常跳变
PRX12.7200恢复正常
AVOID12.6STOP触发避障

分析发现,距离值在12.6s时从180cm跳变至45cm,随后又恢复。进一步检查传感器安装位置,发现激光雷达的扫描平面与无人机起落架产生干涉,导致瞬间误测。解决方案是调整传感器安装角度,并在AP_Proximity中启用中值滤波(设置 PRX_FILT 参数为3),消除单点噪声。

常见误区与总结复盘

风险提示:日志系统是避障问题排查的"黑匣子"。在实机测试前,务必确认日志位掩码已包含PRX和AVOID消息。否则,一旦发生避障失效,将无法通过日志回溯原因。

参数系统和日志系统是避障算法集成中"输入配置"和"输出验证"的两个关键环节。参数系统决定了避障算法的行为边界,而日志系统则提供了算法运行效果的可视化证据。两者配合使用,可以大幅提升避障系统的调试效率。