apm二次开发经历分享

APM二次开发经历分享

截止到2025/3/3,差不多已经和飞控系统apm、px4打交道一年多了,一直以来都是以使用为主。但是由于国内apm社区不完善,一路上踩了不少坑。有很多飞控的高级特性也没有机会探索,飞控方面的水平停滞不前。所以这段时间开始,我计划结合deepseek,进行apm的二次开发工作,从源码的层面深入了解apm。同时我也计划起草一个飞控地面站计划——“PulseWing”,虽然短期来看pulseWing无法追赶missionplanner、QGroundControl等,但是我希望开发出可控性高,可编辑性强,ui界面美观的地面站软件,也就是说结合目前发行地面站的优点开发。(编辑于2025/3/3)

第〇章,项目结构

1.顶层目录结构

ardupilot/
├── ArduCopter/        # 多旋翼无人机固件
├── ArduPlane/         # 固定翼无人机固件
├── Rover/             # 无人车/船固件
├── Sub/               # 水下机器人固件
├── libraries/         # 核心库(跨平台、跨载具)
├── Tools/             # 开发工具与脚本
├── modules/           # 高级功能模块(可选)
├── wscript            # Waf编译系统配置
└── ...

2.关键目录详解

(1) 载具固件目录(如 ArduPlane
  • 功能:每个载具的独立入口,包含模式切换、主循环、载具特定逻辑。
  • 核心文件
    • system.cpp:主程序入口(setup()loop())。
    • mode_*.cpp:飞行模式实现(如 mode_auto.cpp自动模式)。
    • control_*.cpp:控制算法(如 control_tecs.cpp固定翼能量控制)。
    • quadplane/:垂直起降混合模式(VTOL)。

(2)核心库目录(libraries/)

libraries/
├── AP_HAL/            # 硬件抽象层(HAL)
├── AP_Math/           # 数学库(坐标转换、滤波算法)
├── AP_Param/          # 参数管理系统
├── AP_NavEKF3/        # 扩展卡尔曼滤波(导航核心)
├── AP_Scheduler/      # 实时任务调度器
├── AP_Mission/        # 任务规划与执行
├── AP_GPS/            # GPS驱动与数据处理
├── AP_Baro/           # 气压计驱动
├── AP_Compass/        # 磁力计驱动
├── AP_OpticalFlow/    # 光流传感器支持
└── ...

(3) 硬件抽象层(AP_HAL/)

  • 功能:统一硬件接口,支持多种飞控平台(如Pixhawk、Linux)。

  • 子目录

    • AP_HAL_PX4/:Pixhawk系列飞控驱动。
    • AP_HAL_Linux/:Linux平台(如Raspberry Pi)驱动。
    • AP_HAL_ChibiOS/:ChibiOS实时操作系统支持。

(4) 工具目录(Tools/

Tools/
├── autotest/          # 自动化测试框架
├── Bootloader/        # 飞控引导程序
├── Hardware/          # 硬件定义文件(如Pixhawk引脚映射)
├── LogAnalyzer/       # 飞行日志分析工具
├── scripts/           # 实用脚本(如SITL仿真)
└── ...

3.代码分层架构

  1. 应用层(载具固件目录):
    • 实现具体载具的行为(如固定翼的自动降落逻辑)。
  2. 功能层(核心库):
    • 提供通用算法和传感器驱动(如导航滤波、PID控制)。
  3. 硬件抽象层(AP_HAL):
    • 屏蔽硬件差异,提供统一API(如串口通信、PWM输出)。

4. 编译系统(Waf)

  • 配置文件wscript定义编译规则。
  • 编译命令
    ./waf configure --board px4-v2  # 选择硬件平台
    ./waf copter                     # 编译多旋翼固件
    
  • 输出文件:固件位于 build/{board}/bin/(如 arducopter.px4)。

5. 参数系统

  • 定义位置:在库或载具代码中通过宏定义参数:
    cpp

    复制

    // 在 AP_Param 中定义
    AP_GROUPINFO("MAX_SPEED", 1, Plane, max_speed, 30),
    
  • 存储方式:参数保存在飞控的EEPROM或Flash中,可通过地面站(如Mission Planner)调整。

6. 扩展开发入口

(1) 添加新传感器

  1. libraries/AP_*中创建驱动(如 AP_CustomSensor)。
  2. 在载具代码中初始化传感器并读取数据。

(2) 新增飞行模式

  1. 在载具目录(如 ArduPlane/)创建 mode_my_mode.cpp
  2. 继承 Mode基类,实现 init()run()方法。
  3. 注册到载具主类并更新模式切换逻辑。

(3) 修改控制算法

  • 目标文件:libraries/AP_Control或载具的 control_*.cpp
  • 示例:调整PID参数或修改TECS(Total Energy Control System)逻辑。

7. 仿真与测试

  • SITL仿真

    sim_vehicle.py -v ArduPlane --console --map
    
  • Gazebo集成

    • 场景文件位于 Tools/autotest/models/
    • 支持固定翼、多旋翼等复杂环境仿真。

第一章,环境搭建

1.硬件环境及操作系统

Hardware Model:ThinkPad s3-490
Memory:  8GB
Processor: Intel Core i5-8265U CPU @ 1.60GHz x 8
Disk Capacity:  512.1G
OS Name:  Ubuntu 22.04.5 LTS
OS Type:  64-bit

2.开发环境配置

  • 安装依赖

    • Ubuntu系统(推荐):

      sudo apt-get install git cmake build-essential python3-dev python3-pip
      
    • 安装必要的Python库:

      pip3 install future pymavlink pyserial
      
  • 克隆代码

    git clone https://github.com/ArduPilot/ardupilot.git
    cd ardupilot
    git submodule update --init --recursive
    
  • 配置工具链

    • 使用ArduPilot官方脚本自动配置环境:

      ./Tools/environment_install/install-prereqs-ubuntu.sh -y
      

(这里欠一张图)

3.编译测试

我使用的飞控是 YJUAV A6SE,所以参照官方文档,我进行了编译操作:

设置飞控型号:

./waf configure --board YJUAV_A6SE_H743

编译(固定翼):

./waf plane

(这里欠一张图)

删除编译生成文件:

./waf clean


apm二次开发经历分享
http://ddxd.xyz//archives/apmer-ci-kai-fa-jing-li-fen-xiang
作者
Administrator
发布于
2025年03月03日
许可协议