开源飞控初探(四)ArduPilot::Copter固件源码分析

这篇具有很好参考价值的文章主要介绍了开源飞控初探(四)ArduPilot::Copter固件源码分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2022.5.7,基于v4.0.5的分析。官网文档没及时更新,本文对当前版本源码的描述可能和官网不一样。

1、无人机全栈分层结构图

开源飞控初探(四)ArduPilot::Copter固件源码分析

2、Flight Code固件部分

上图中的Flight Code层,分为5个部分:

  1. 车机层。一份代码通过编译配置,可以支持Rover(小车/船)、Copter(直升机,包括多旋翼)、Plane(固定翼飞机)、Sub(潜水器)、AntennaTracker(追踪天线,会自动跟随无人机所在方向转动的雷达)这些子项目。车机层是这几种车机子项目的专属代码层。

  1. 通用组件库。各种车机都依赖的基础层,见源码结构小节的libraries/。

  1. 硬件抽象层HAL

  1. 工具。包括自动化测试等,见源码结构一节的Tools/。

  1. 依赖的三方项目,以git submodule形式存在。见源码结构小节modules/。

车机层实际支持的vehicle类型:

开源飞控初探(四)ArduPilot::Copter固件源码分析

3、ArduCopter架构与顶层设计

ArduCopter就是ArduPilot:Copter子项目的简称。整体架构图:

开源飞控初探(四)ArduPilot::Copter固件源码分析

理解了顶层设计思路就行了:

  1. 每种板子都有自己的BootLoader bin文件,不需要再编译的,直接打包进最终bin。它是HAL硬件抽象层的实现。

  1. main函数是往HAL实现层注册一个callback函数,然后HAL::run()把控制权交给了BootLoader层。硬件初始化完毕会调用callback函数,其中一个是setup(),让车机层接着初始化。

  1. 每种车机子项目都有自己的主类,都继承AP_Vehicle父类,它是HAL层回调函数的实体,例如Copter子项目有个Copter类。Copter::setup()会发起很多个计划任务,不同任务做不同的事,触发频率也不一样(1~400Hz都有)。这些任务有三大类:

  1. 读取不同传感器的数据,处理后保存计算结果。这些结果能表示车机的当前状态。

  1. 执行地面站的各种命令,命令最终会转化为车机的目标状态

  1. 根据当前状态和目标状态的差距,计算应该如何通过调整不同电机的功率输出(螺旋桨转速)以达到目标状态,并把计算结果转换为电路控制信号。

  1. 飞行模式抽象为一个基类Mode,每种具体的飞行模式是一个子类。不同的子类,计算车机目标状态的结果会不一样。即设计模式中的策略模式。Copter类有成员变量记录当前的Mode。

  1. Mission(航线规划)item都可以用一种Mode来表示,item参数影响的是计算目标状态的结果。

用伪代码来描述核心流程:

while True:
    receiveMavLinkControlMessage()
        changeTarget()
    readSensorValue()
        convertValueToStandardUnit()
        saveInMemory()
    computeWayToTarget()
        computeAttitudeForMoving()
        computeMotorRate()
        computeElectricCurrentValue()
    passValueToMotor()

4、源码目录文件结构和用途

  • AntennaTracker/。追踪天线子项目的专属代码

  • APMrover2/。rover子项目的专属代码

  • ArduCopter/。直升机子项目的专属代码(多旋翼也是直升机,可以垂直起降的都算)

  • ArduPlane/。固定翼飞机子项目的专属代码(需要助跑的就不是直升机了)

  • ArduSub/。潜水器子项目的专属代码

  • benchmarks/AP_gbenchmark.h。只有两个inline函数,结合Google Benchmark使用的。

  • docs/。使用doxygen(文档生成工具)来生成文档的脚本和配置。

  • libraries/。有116个子目录。重要的模块包括:

  • AC_AttitudeControl/。ArduCopter的姿态、位置控制函数库

  • AC_PID/。比例-积分-微分控制

  • AP_AHRS/。姿态估算,使用DCM或EKF算法

  • AP_Camera/。摄像头控制

  • AP_InertialNav/。惯性导航处理,混合计算加速计的输入,包括GPS和气压计数据

  • AP_InertialSensor/。读取陀螺仪、加速计数据,校准和转换成标准单位,供其它模块使用

  • AP_Math/。各种数学函数,包括向量操作。

  • AP_Mission/。存储和读取eeprom上的mission命令

  • AP_Motors/。电机混合计算

  • AP_OpticalFlow/。光流传感器

  • AP_RangeFinder/。声呐和远距离传感器

  • AR_WPNav/。waypoint navigation,航点导航

  • RC_Channel/。转换APM_RC到内部单元的电平输入输出,例如角度

  • mk/check_modules.sh。检查子仓库有没有clone和checkout成功

  • modules/。子目录都是git submodule仓库,是ArduPilot保存的副本

  • ChibiOS/。一个实时操作系统,官网http://www.chibios.org/。ArduPilot基于它来开发。以前用的是NuttX系统。

  • gbenchmark/。google的性能测试工具。

  • gtest/。google的C++测试框架

  • libcanard/。一个uavcan/can协议的c语言实现

  • mavlink/。通信协议,见下一章

  • uavcan/。无人机控制器域网。

  • waf/。编译工具

  • tests/。应用gtest的代码

  • Tools/。有26个子目录,用途包括:BootLoader、外设管理、waf编译、自动化测试、代码风格检查、调试、环境依赖安装、日志分析、mavproxy等

  • BUILD.md。描述了编译各个子项目的命令和参数

  • README.md。主要是参考资料的网址和维护者的名单。

5、源码编译

环境为WSL - Ubuntu 20.04.4 LTS。

需要先安装python2,并确保python --version和pip --version都显示2.x版本。

# 先clone主仓库
git clone https://github.com/ArduPilot/ardupilot.git

主仓库的submodule地址写了git://协议,在国内是访问不了,需要手动修改为https://。方法:

  1. 打开.gitmodules和.git/config,把所有的git://改成https://。

  1. MAVLink还有一个submodule,pymavlink。所以要打开modules/mavlink/.gitmodules和.git/modules/modules/mavlink/config,把所有的git://改成https://。

修改完后再clone子仓库

git submodule update --init --recursive

ArduPilot带有一个脚本来安装环境依赖项,但是基于Ubuntu18的,在Ubuntu20需要修改脚本,因为Ubuntu20废弃了python2的包,无法用apt安装,可以改用pip安装。文本编辑器打开Tools/environment_install/install-prereqs-ubuntu.sh,可全局搜索删除这些包名python-pip python-matplotlib python-scipy python-empy python-serial python-opencv

使用自带脚本安装依赖:

pip install matplotlib scipy empy serial opencv-python==4.2.0.32
./Tools/environment_install/install-prereqs-ubuntu.sh -y
# 过程需要sudo权限,输入密码

ArduPilot使用waf编译工具来组织编译过程。waf的作用类似于Android系统的编译工具ninja。

./waf list_boards命令可以列出支持的板子,现在支持的有:

aero airbotf4 bbbmini bebop bhat blue crazyflie2 CUAV-Nora CUAV-X7 CUAV_GPS CUAVv5 CUAVv5Nano CubeBlack CubeBlack+ CubeGreen-solo CubeOrange CubePurple CubeSolo CubeYellow dark disco DrotekP3Pro Durandal edge erleboard erlebrain2 f103-ADSB f103-GPS f103-HWESC f103-periph f103-RangeFinder f103-Trigger f303-GPS f303-HWESC f303-M10025 f303-M10070 f303-periph f303-Universal F35Lightning F4BY fmuv2 fmuv3 fmuv4 fmuv4-beta fmuv5 iomcu KakuteF4 KakuteF7 KakuteF7Mini linux luminousbee4 MatekF405 MatekF405-STD MatekF405-Wing MatekF765-Wing MatekH743 mindpx-v2 mini-pix mRoControlZeroF7 mRoNexus mRoPixracerPro mRoX21 mRoX21-777 navio navio2 NucleoH743 ocpoc_zynq omnibusf4 omnibusf4pro omnibusf4v6 OMNIBUSF7V2 OmnibusNanoV6 PH4-mini Pix32v5 Pixhawk1 Pixhawk1-1M Pixhawk4 Pixracer pocket pxf pxfmini R9Pilot revo-mini rst_zynq sitl SITL_arm_linux_gnueabihf SITL_static SITL_x86_64_linux_gnu skyviper-f412-rev1 skyviper-journey skyviper-v2450 sparky2 speedybeef4 SuccexF4 TBS-Colibri-F7 VRBrain-v51 VRBrain-v52 VRBrain-v54 VRCore-v10 VRUBrain-v51 ZubaxGNSS zynq

这里选Pixhawk4。

# 先配置板子
./waf configure --board Pixhawk4
# 编译copter子项目
./waf -j8 --targets bin/arducopter

编译过程中,编译ChibiOS有103个步骤,ArduPilot本身有648个步骤,处理4个XML包含226种消息MAVLink。最终得到一个bin文件,要烧录到飞控板子上。

6、仿真

源码里有工具使得在PC机上运行固件,本机可通过tcp 5760端口连接并用MAVLink交互。

参考资料

  • ArduPilot源码官方介绍

  • Code Overview (Copter)

  • Clone a repository文章来源地址https://www.toymoban.com/news/detail-471050.html

到了这里,关于开源飞控初探(四)ArduPilot::Copter固件源码分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Nooploop空循环 基于ArduPilot开源自动驾驶仪平台(APM固件)的TOFSense/-F/-M全系列激光测距传感器应用图文教程

    自2023/7/10日起ArduPilot飞控固件开始支持深圳空循环科技有限公司的TOFSense系列产品。从Plane/Copter/Rover 4.5 开始,Ardupilot 固件添加了对 TOFSense协议的支持,用于避障和高度保持。用户如果使用低于该版本的固件需要自行将相关文件进行移植与适当修改,才能支持TOFSense,TOFSense传

    2024年02月04日
    浏览(78)
  • 无人机/飞控--ArduPilot、PX4学习记录(5)

    这几天看dronekit,做无人机失控保护。 PX4官网上的经典案例,我做了很多注解,把代码过了一遍。 无人机具体执行了:  先起飞,飞至正上空10m-向北移动10m-向东移动10m-向南移动10m-向西移动10m-回到初始起飞点(即home点),降落。 具体执行之前,要打开JMAVSim,接下来会在JMAV

    2024年04月15日
    浏览(58)
  • 无人机/飞控--ArduPilot、PX4学习记录(2)

    这是一篇碎碎念,零零碎碎的记录了环境配置过程, 仅供本人记录学习历程和参考。 (记录的挺乱的,但是文章链接里的博客写的是真好) 本章主要完成的目标 : 安装PX4 并 成功运行出3D无人机界面。 参考文章: 搭建PX4环境: PX4/Pixhawk - 编译环境搭建_pix4 yu pixhawk-CSDN博客 使

    2024年03月21日
    浏览(60)
  • (5)将固件加载到没有ArduPilot固件的主板上

    文章目录 前言 4.1 下载驱动程序和烧录工具 4.2 下载ArduPilot固件 4.3 使用测试版和开发版 4.3.1 测试版 4.3.2 最新开发版本 4.4 将固件上传到自动驾驶仪 4.5 替代方法 4.6 将固件加载到带有外部闪存的主板上 ArduPilot 的最新版本( Copter-3.6 , Plan-3.9 , Rover-3.5 )运行在相对较小的、非

    2024年02月14日
    浏览(43)
  • (3)将固件加载到已有ArduPilot固件的主板上

    文章目录 前言 3.1 将自动驾驶仪连接到电脑 3.2 选择COM端口 3.3 安装固件 3.4 使用测试版和开发版 3.5 测试 这些说明将告诉你如何将最新的固件下载到已经安装了 ArduPilot 固件的 自动驾驶仪 硬件上。这个过程将使用 Mission Planner 地面控制站。请参阅将固件加载到没有 ArduPilot 固

    2024年02月11日
    浏览(46)
  • (4)将固件加载到已有ArduPilot固件的主板上

    文章目录 前言 3.1 将自动驾驶仪连接到电脑 3.2 选择COM端口 3.3 安装固件 3.4 使用测试版和开发版 3.5 测试 这些说明将告诉你如何将最新的固件下载到已经安装了 ArduPilot 固件的 自动驾驶仪 硬件上。这个过程将使用 Mission Planner 地面控制站。请参阅将固件加载到没有 ArduPilot 固

    2024年02月14日
    浏览(46)
  • BetaFlight飞控AOCODARC-F7MINI固件编译

    BetaFlight是一款非常出色的飞控航模开源软件,而且是基于GPL V3协议,所以相应的代码修改,必须开源出来。与PX4的BSD协议不一样,通常商业角度更多倾向于BSD协议。 本次编译主要是针对AOCODARC-F7MINI飞控板,采用最新的代码分支进行编译,以便进行功能验证。 控制器:STM32F

    2024年02月12日
    浏览(34)
  • Godot 4 源码分析 - 初探

    准备研究GoDot 4源码。 获取源代码 在进入 SCons 构建系统并编译 Godot 之前,你需要将 Godot 的源代码下载到本地。 源代码位于 GitHub 上, 虽然你可以通过网站手动下载它, 但是通常你希望通过  git  版本控制系统来下载. 如果你是为了做贡献或拉动请求而进行编译,你应该遵循

    2024年02月06日
    浏览(36)
  • 初探 qiling ( 麒麟 ):开源的二进制分析、高级代码模拟框架

    官方介绍: 官网:https://qiling.io/ :https://twitter.com/qiling_io github 地址:https://github.com/qilingframework/qiling   qiling 基于 python 开发,是一个开源的、可模拟多种架构和平台的二进制 仿真(模拟) 框架,同时还提供跨架构的调试能力,多种层次的 hook 方法,该工具由 Unicorn 引擎 驱动

    2023年04月24日
    浏览(39)
  • F4/F7飞控betaflight固件烧写,地面站 BF无法读取、不识别、未发现等飞控疑难杂症问题解决与驱动安装

    目录 1.安装驱动 2.测试固件 3.烧录固件 4.寻找补充代码 betaflight/unified_targets/configs/OMNIBUSF4SD.config 5.连接飞控,点击cli命令行。 6.寻找其他稳定版本 当安装完毕betaflight软件后,第一次链接飞控与电脑,出现无法连接情况,点击无反应。 点击计算机-管理-设备管理器-端口,出现

    2024年01月25日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包