ArduPilot AP_Periph DroneCAN 外设固件开发指南:从 hwdef.dat 到构建、烧录与仿真验证
2026/9/14 20:20:36 网站建设 项目流程

ArduPilot AP_Periph DroneCAN 外设固件开发指南:从 hwdef.dat 到构建、烧录与仿真验证

【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot

AP_Periph 是 ArduPilot 仓库中一套基于 DroneCAN 协议的外设固件方案(Tools/AP_Periph/README.md),它复用 ArduPilot 丰富的传感器驱动,让开发者只需编写一个简单的 hwdef.dat 即可把 STM32 芯片变成 GPS/RTK、罗盘、气压计、测距仪、电调等 DroneCAN 外设。本文将以官方 README 为主线,结合仓库源码深入讲解 AP_Periph 的架构、支持的硬件与功能、构建烧录流程、bootloader 更新机制以及 SITL 仿真测试方法,帮助你从零上手开发自己的 DroneCAN 外设固件。

AP_Periph 是什么

AP_Periph 是一套基于 ArduPilot 的 DroneCAN(即 UAVCAN v0)外设固件。它的核心设计思想是:不重复造轮子——直接复用 ArduPilot 中为飞控开发的大量传感器驱动(GPS、罗盘、气压计、空速、测距、ADSB、电调遥测等),把它们封装成一个运行在独立 STM32 节点上的 DroneCAN 从设备固件。

与 ArduCopter、ArduPlane 等载具固件不同,AP_Periph 不执行飞行控制逻辑,而是通过 CAN 总线与主飞控通信,把本地传感器数据以 DroneCAN 消息形式广播到总线上,或接收飞控下发的遥控输出(RCOutput)、灯光、蜂鸣器等命令。从源码结构看,AP_Periph 的主类AP_Periph_FW(定义于 Tools/AP_Periph/AP_Periph.h)同时持有AP_GPSCompassAP_BaroAP_AirspeedRangeFinderAP_BattMonitorAP_ProximityAP_EFI等完整的 ArduPilot 传感器库实例,这正是它能快速支持多种外设类型的根本原因。

AP_Periph 的入口实现(Tools/AP_Periph/AP_Periph.cpp)展示了其运行模型:

  • setup()调用periph.init(),完成参数加载、CAN 启动、各传感器初始化、串口管理、看门狗初始化等;
  • loop()周期调用periph.update(),以 1Hz 发送心跳与系统状态、10Hz 读取电池、50Hz 更新通知与 GCS、并持续调用can_update()处理 CAN 收发。
void setup(void) { periph.init(); } void loop(void) { periph.update(); }

值得一提的健壮性设计是:init()中始终启用硬件看门狗(stm32_watchdog_init()与周期性的stm32_watchdog_pat()),并在编译期强制要求AP_CHECK_FIRMWARE_ENABLED开启(否则直接#error)。源码注释明确指出,这不仅是功能依赖,更是一套"刷错固件也能可靠恢复"的防护机制。

基于 hwdef.dat 的硬件适配机制

AP_Periph 复用了 ArduPilot 的 ChibiOS hwdef.dat 系统——这也是 ArduPilot 为 STM32 飞控定义引脚的核心工具。这意味着:

支持一个新的基于 STM32 的 DroneCAN 外设,只需要编写一个定义设备引脚的简单 hwdef.dat 文件。

hwdef 文件位于仓库的 libraries/AP_HAL_ChibiOS/hwdef 目录下,每个板卡一个子目录。构建系统会自动识别 AP_Periph 板卡:根据 Tools/ardupilotwaf/boards.py 中的get_ap_periph_boards()逻辑,板卡名包含 "periph" 关键字,或 hwdef.dat 中带有 periph 标记的板卡,都会被纳入 AP_Periph 构建目标。

支持的 MCU 系列

仓库中已提供超过 60 个 AP_Periph 构建目标,覆盖 ArduPilot 支持的全部主流 STM32 系列:

MCU 系列典型外设应用
STM32F1xx低成本 GPS 模块、CAN 节点
STM32F3xx测距、传感器节点
STM32F4xx主流 GPS/RTK、罗盘、电调节点
STM32F7xx高性能外设
STM32H7xx高速 CAN-FD、多传感器复合节点
STM32L4xx低功耗外设
STM32G4xx电机驱动、遥测节点

更多 MCU 可通过 hwdef.dat 系统扩展(hwdef.dat 示例可查看 libraries/AP_HAL_ChibiOS/hwdef/ARK_GPS/hwdef.dat、libraries/AP_HAL_ChibiOS/hwdef/ARK_CANNODE/hwdef.dat 等成熟产品级配置)。

支持的传感器与功能特性

传感器类型

AP_Periph 可配置支持以下 DroneCAN 传感器类型:

  • GPS 模块(含 RTK GPS,支持移动基线 Moving Baseline 数据转发)
  • 磁罗盘(SPI 或 I2C)
  • 气压计(SPI 或 I2C)
  • 空速传感器(I2C)
  • 测距仪(UART 或 I2C,支持多实例)
  • ADSB(uAvionix 兼容的 Ping ADSB 接收机,接 UART)
  • 电池监测(Analog、I2C/SMBus、UART)
  • LED(GPIO、I2C 或 WS2812 串行)
  • 安全 LED 与安全开关
  • 蜂鸣器(tonealarm 或简单 GPIO)
  • RC 输出(全部标准 RCOutput 协议,含 DShot 等)
  • RC 输入
  • 电池平衡监测(Tools/AP_Periph/batt_balance.cpp)
  • EFI 发动机(libraries/AP_EFI/AP_EFI.cpp)
  • 近距离传感器 Proximity(libraries/AP_Proximity/AP_Proximity.cpp)

此外,从 Tools/AP_Periph/Parameters.cpp 的参数表还可以看到更多可选能力:温度传感器(TEMP_MSG_RATE)、RPM 转速传感器(RPM_MSG_RATE)、MSP 串口透传(MSP_PORT)、IMU 输出(INS_SAMPLE_RATE)、电调遥测(ESC_TELEM_RATE)、舵机遥测(SRV_TLM_MSG_RATE)、NMEA 输出、继电器(RELAY)、以及通过 Lua 脚本扩展的通知/灯光控制(SCR_参数组)。是否启用取决于 hwdef.dat 中的宏定义,构建系统会根据 hwdef 裁剪库(见 Tools/AP_Periph/wscript 中的AP_PERIPH_HEAVY分支)。

DroneCAN 协议特性

AP_Periph 固件具备完整的 DroneCAN 节点能力:

  • 动态或静态 CAN 节点分配CAN_NODE参数设为 0 时向 DNA 服务器请求动态节点 ID,设为非 0 值则固定使用该 ID(范围 0~127)
  • 固件上传:支持通过 CAN 总线在线升级固件
  • 自动生成的 bootloader:每个板卡构建时自动生成配套 bootloader
  • 参数存储在 Flash:通过 StorageManager 持久化参数
  • 便捷的 bootloader 更新:用户可直接在飞控端触发
  • 高韧性设计:看门狗、CRC 校验与板级检查
  • 固件与参数更新:外设挂载在飞控上时,可通过 MissionPlanner 或 DroneCAN GUI 工具完成
  • USB 固件更新:若硬件提供 USB 口,可独立通过 USB 更新固件
  • SLCAN 参数更新:若提供 USB,外设独立使用时可通过 SLCAN + DroneCAN GUI 更新参数

从 Tools/AP_Periph/AP_Periph.h 的消息处理函数列表可以看出协议实现的完整性:handle_get_node_info(节点信息)、handle_param_getset/handle_param_executeopcode(参数读写与操作码执行)、handle_begin_firmware_update(固件更新启动)、handle_allocation_response(动态节点 ID 分配)、handle_safety_state(安全状态)、handle_RTCMStream(RTK 差分数据)、handle_esc_rawcommand(电调原始命令)、handle_act_command(舵机命令)、handle_beep_command(蜂鸣)、handle_lightscommand(灯光)等。

编译 AP_Periph 固件

以官方示例板卡 f103-GPS 为例(注意:f103-GPS 对应的 hwdef 需在 libraries/AP_HAL_ChibiOS/hwdef 中确认你的板卡目录是否存在,若为自研板卡请先按 hwdef.dat 规范编写配置文件):

# 1. 配置构建环境,指定目标板卡 ./waf configure --board f103-GPS # 2. 编译 AP_Periph 固件 ./waf AP_Periph

构建产物位于build/f103-GPS/bin/AP_Periph.bin。之后可通过CAN bootloader配合dronecan_gui_toolMissionPlanner 的 DroneCAN 支持将其加载到设备中。

构建系统会在 configure 阶段自动识别该板卡是否为 AP_Periph 目标(Tools/ardupilotwaf/boards.py 的get_ap_periph_boards()),并据此裁剪库集合、启用AP_PERIPH相关定义。

烧录固件

使用 ST-Link 直接烧录

ST-Link V2 可直接将固件写入目标地址。官方给出了两个典型示例:

# f103-GPS:应用固件加载地址 0x8006400 st-flash write build/f103-GPS/bin/AP_Periph.bin 0x8006400 # CUAV_GPS:应用固件加载地址 0x10000(从 0x8010000 写入) st-flash write build/CUAV_GPS/bin/AP_Periph.bin 0x8010000

注意:写入地址必须与硬件设计中的 bootloader 长度匹配(不同板卡偏移不同,CUAV_GPS 在 0x10000 偏移处),务必先确认目标板卡的固件偏移约定,避免覆盖 bootloader 区域。

烧录 bootloader

bootloader 需要烧录到 Flash 起始地址 0x8000000:

st-flash write Tools/bootloaders/f103-GPS_bl.bin 0x8000000

预编译的 bootloader 文件存放在仓库的 Tools/bootloaders 目录(<板卡名>_bl.bin)。

构建 bootloader

若需要自行编译 bootloader,可使用仓库提供的自动化脚本:

Tools/scripts/build_bootloaders.py f103-GPS

脚本源码位于 Tools/scripts/build_bootloaders.py,构建生成的 bootloader 会输出到Tools/bootloaders目录,命名形如<板卡名>_bl.bin。bootloader 本身也是由同一套 hwdef 系统生成的(构建逻辑可参考 Tools/ardupilotwaf/chibios.py 中关于BOOTLOADERHAL_NUM_CAN_IFACES的配置处理)。

固件分发与参数修改

AP_Periph 固件目标由 ArduPilot 官方 CI 自动构建并发布到 ArduPilot 固件服务器。普通用户获取固件后:

  • 通过MissionPlannerDroneCAN GUI Tool加载固件;
  • 外设参数可通过MissionPlanner 的 DroneCAN 支持DroneCAN GUI 工具在线修改。

核心参数速查

以下参数在 Tools/AP_Periph/Parameters.cpp 中定义,均带有完整的参数元数据(范围、单位、默认值):

参数说明默认值备注
CAN_NODE本节点在所有网络上的 DroneCAN 节点 ID;0 表示向 DNA 服务器动态申请板卡默认范围 0~127,重启生效
CAN_BAUDRATECAN 接口比特率1000000范围 10000~1000000,重启生效
CAN_PROTOCOL端口使用的协议(0:禁用,1:UAVCAN/DroneCAN,4:PiccoloCAN 等)DroneCAN至少一个 CAN 口必须为 DroneCAN
CAN_FDMODE/CAN_FDBAUDRATECAN-FD 模式与数据段比特率(1M/2M/4M/5M/8M)0 / 由硬件决定需 MCU 支持 CAN-FD
FLASH_BOOTLOADER触发 bootloader 更新(危险操作)0见下文"用户 bootloader 更新"
DEBUG调试位掩码(0:显示空闲栈,1:15 秒后自动重启,2:发送统计)0
BRD_SERIAL_NUM设备序列号,非 0 时会显示在 CAN App Name 中0
GPS_PORTGPS 串口编号,该口协议会被设为 GPS3重启生效
RNGFND_BAUDRATE/RNGFND_PORT测距仪串口波特率/端口115200 / 3支持多实例(RNGFND2_*)
RNGFND_MAX_RATE测距数据最大发送速率(Hz),0 表示不限50范围 0~200
ADSB_BAUDRATE/ADSB_PORTADSB 串口波特率/端口57600 / 1
ESC_RATE/ESC_PWM_TYPE电调输出速率 / PWM 类型(1 正常、2 OneShot、3 OneShot125、4 Brushed、5~8 DShot)400Hz / 0
ESC_CMD_TIMO电调命令超时(ms),超时后输出归零,0 表示不归零200应大于两帧 CAN 命令间隔
SRV_CMD_TIME_OUT舵机命令超时(ms)200同上
BARO_ENABLE气压计使能1
LOG_BITMASK日志位掩码(bit1 为 GPS)4
OPTIONS外设选项位掩码(bit0:持续探测传感器)板卡决定

传感器驱动参数(如GPS_*COMPASS_*BARO_*ARSPD_*RNGFND_*BATT_*PRX_*EFI_*TEMP_*RPM_*INS_*)均复用对应 ArduPilot 库的参数体系,可通过串口/DroneCAN 完整配置。

用户 bootloader 更新机制

AP_Periph 的一个实用特性是:bootloader 已内置在固件的 ROMFS 中,终端用户无需 ST-Link 即可升级 bootloader。

操作步骤:

  1. 通过 DroneCAN 将外设参数FLASH_BOOTLOADER设为1
  2. 节点会执行 bootloader 更新——将内嵌的 bootloader 复制覆盖现有 bootloader(耗时数秒);
  3. 更新结果会以debug 文本消息回传,可在 DroneCAN GUI 工具中查看。

该参数的完整描述可见 Tools/AP_Periph/Parameters.cpp 中的FLASH_BOOTLOADER定义,其注释明确警告:"DANGER! 启用后 App 将用内嵌 bootloader 覆盖现有 bootloader……只有在明确知道自己在做什么时才应执行"。

与 bootloader 更新配套的还有 Tools/AP_Bootloader 目录下的 bootloader 源码(含 CAN 固件上传协议bl_protocol.cpp、从 SD 卡刷写flash_from_sd.cpp、网络刷写network.cpp等),以及 Tools/AP_Periph/AP_Periph.cpp 中的prepare_reboot()/reboot(bool hold_in_bootloader)实现——重启前会强制打开安全开关(force_safety_on())、冲刷未写入的参数(AP_Param::flush())并短暂延迟以让 ACK 发出,确保升级过程安全可靠。

SITL 仿真测试

AP_Periph 在 SITL(软件在环)仿真系统中支持大量 DroneCAN 外设,无需真实硬件即可验证固件行为。最简单的方式是使用sim_vehicle.py启动带 DroneCAN 总线的仿真载具:

# 仿真垂直起降固定翼(quadplane),挂载 DroneCAN 外设 sim_vehicle.py -f quadplane-can # 仿真四旋翼,挂载 DroneCAN 外设 sim_vehicle.py -f quad-can

SITL 支持通过HAL_BOARD_SITL构建 AP_Periph(Tools/AP_Periph/AP_Periph.cpp 中为 SITL 提供了看门狗的桩实现),仿真时每个外设作为独立 CAN 节点接入仿真总线,可用于验证节点分配、传感器消息流、电调命令与遥测等完整链路。仿真的测试用例可参考 Tools/autotest 下的自动化测试体系。

开发新外设的推荐路径

结合 README 与源码,为自研 STM32 外设开发 AP_Periph 固件的完整流程是:

  1. 编写 hwdef.dat:在 libraries/AP_HAL_ChibiOS/hwdef 下新建板卡目录,定义 MCU、CAN 外设引脚、传感器接口(SPI/I2C/UART)、LED/蜂鸣器 GPIO 等;参考现有产品级配置(如 libraries/AP_HAL_ChibiOS/hwdef/ARK_GPS/hwdef.dat);
  2. 配置构建./waf configure --board <你的板卡名>,确认构建系统识别为 AP_Periph 目标;
  3. 编译固件./waf AP_Periph,得到build/<板卡>/bin/AP_Periph.bin
  4. 编译 bootloaderTools/scripts/build_bootloaders.py <板卡名>,输出到 Tools/bootloaders;
  5. 烧录:先用 ST-Link 烧 bootloader 到 0x8000000,再按板卡偏移烧应用固件;
  6. 调参验证:通过 SITL 仿真或接上飞控,用 MissionPlanner / DroneCAN GUI 修改参数、观察节点消息、验证传感器数据与遥控输出;
  7. 发布:配置 CI 自动构建,固件即可通过 DroneCAN 在线更新通道分发。

总结

AP_Periph 将 ArduPilot 的传感器驱动资产与 DroneCAN 生态有机结合,是快速构建 UAVCAN 外设的高效方案。其核心价值在于:复用 hwdef.dat 硬件抽象与完整传感器库,一套源码即可支持从 F1 到 H7 的数十种 MCU、数十种外设形态,并内置看门狗、CRC 校验、Flash 参数存储、自动 bootloader 生成与在线更新等高韧性机制。无论是 GPS/RTK 模块、CAN 电调、测距传感器还是复合传感器节点,遵循 README 与源码中的构建、烧录与仿真流程,都能在很短时间内完成从硬件定义到可用固件的闭环。

【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询