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

news2024/11/24 3:10:23

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

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

2、Flight Code固件部分

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

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

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

  1. 硬件抽象层HAL

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

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

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

3、ArduCopter架构与顶层设计

ArduCopter就是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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/158225.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

行转列,动态列枚举分组

【问题】Hi All,Thanks for the wonderful support the community gets from this forum.I am trying to accomplish this in MongoDB. Didn’t think it could get this complicated. thought the problem was interesting to solve.I am trying to get a count of students b…

【库函数】-还在为操作字符串而烦恼,一篇带你解决这样的烦恼,这里详细介绍关于字符串操作的各个库函数,以及模拟实现

🎇作者:小树苗渴望变成参天大树 🎉作者宣言:认真写好每一篇博客 💥作者gitee:link 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 字符函数和字符串函数💦前言&…

python函数定义中的/和*的作用

python函数定义中的/和*的作用 特殊参数https://docs.python.org/zh-cn/3/tutorial/controlflow.html#special-parameters 函数定义中的单独出现的/和*的作用 / 和 * 是可选的。 /用来指明他前面的函数形参必须使用位置参数。 *用来指明他后面的函数形参必须为关键字参数的…

儿童感染新冠后怎么用药?什么情况需要就医?

儿童感染新冠病毒的症状,病程有哪些特点?退烧药怎么选,怎么吃?孩子有什么症状需要立即就医?...01儿童感染新冠病毒的症状,病程有哪些特点?王泉:儿童是新冠病毒的易感人群。新冠病毒感…

Unity C#热更新框架ILRuntime接入

简介 ILRuntime项目为基于C#的平台(例如Unity)提供了一个纯C#实现,快速、方便且可靠的IL运行时,使得能够在不支持JIT的硬件环境(如iOS)能够实现代码的热更新 官方教程 https://ourpalm.github.io/ILRunt…

揭开 TLS 握手的神秘面纱:它是什么以及它是如何工作的

传输层安全性 (TLS) 旨在为网络通信增加安全性。 就是浏览互联网时HTTP和HTTPS的区别。 使用 TLS 为客户端和服务器增加了额外的工作,但它有其好处,包括: 机密性:TLS 将流量包装在加密隧道中。 这使得窃听者不可能在到达目的地的…

[Swift]UIView抖动动画

以拨打视频电话时的拨打按钮抖动为例 import UIKitclass PACallPrepareAlertView: UIView {IBOutlet weak var callIV: UIImageView!private var isLeave: Bool falsedeinit {isLeave true}override func awakeFromNib() {super.awakeFromNib()shakeAction()}private func s…

套接字编程之接口

套接字编程之接口学习套接字之前你需要知道的套接字编程套接字TCP协议和UDP协议区别UDP协议的编写UDP通信两端流程具体操作接口介绍创建套接字为套接字绑定地址信息发送数据接收数据关闭套接字字节序相关接口📌————本章重点————📌 🔗…

【Ansible】ansible 变量

ansible 变量 文章目录ansible 变量一、Ansible 变量介绍二、变量命名规则三、变量类型1.全局变量2.剧本变量3.资产变量4.Facts 变量5.注册变量6.变量优先级一、Ansible 变量介绍 在 PlayBook 一节中,将 PlayBook 类比成了 linux 中的shell。那么它作为一门 ansibl…

搜索引擎收录查询,是什么影响了网站被搜索引擎收录

搜索引擎收录是指程序通过辨别把网站内容进行收录,同时会对这些内容进行价值以及其他方面的辨别。 我们想要知道网站有没有被搜索引擎收录,可以借助iis7seo批量查来查询网站有没有被搜索引擎收录。打开iis7seo批量查,添加需要查询的网站网址&…

计算结构体,位段,联合体(共用体)的大小

目录 一、计算结构体的大小 1.1 结构体的计算并不是简单的类型加运算 1.2 内存对齐 1.2.1 内存对齐规则 1.2.2 图解内存对齐 二、计算位段的大小 2.1位段是什么 2.2 位段的内存分配 三、计算联合体的大小 3.1 什么是联合体 3.2 联合体的内存分配 END. 一、计算结构…

Consensus Algorithm -- Raft

The Raft Consensus Algorithm Go 实现:etcd/raft、dragonboat Rust 实现:TiKV C 实现 :nebula-graph-storage、 RethinkDB、logcabin 拜占庭将军问题 拜占庭将军问题(Byzantine failures),是由莱斯利兰…

绝绝子!这些技巧真方便

技巧一:快速切换窗口 如果你还在使用桌面底部“任务栏”切换软件窗口,不妨试试这个“快速切换窗口”快捷键,仅需按住【Alt】键不放,并连续点按【tab】键即可实现窗口的快速切换,果真只有亲自上手体验才知道有多香&…

NLP中的对话机器人——问答机器人的应用场景

引言 本文是七月在线《NLP中的对话机器人》的视频笔记,主要介绍FAQ问答型聊天机器人的实现。 讲得还不错,关键是只要1分钱 FAQ问答机器人 FAQ就是一些常见问题与回答,比如https://letsencrypt.org/docs/faq/。 但是我们要做的不是一问一答…

原生RedHat OpenStack搭建

文章目录OpenStack的搭建方式实验软件及镜像实验环境配置NTP节点初始化配置配置本地yum仓库上传镜像文件至NTP节点搭建基于http的网络yum源搭建NTP服务配置Controller控制节点和Compute计算节点初始化配置安装RedHat OpenStack安装部署OpenStack配置OVS桥接OpenStack的搭建方式…

大赛启幕:2023数字中国创新大赛启动发布会在福州召开

2023年1月10日,由数字中国建设峰会组委会主办,福建省数字办、福建省工信厅、福建省通信管理局、福州市政府、泉州市政府、三明市政府、龙岩市政府等共同承办的2023数字中国创新大赛在福建省福州市盛大启幕。 十二届全国政协副主席王钦敏发来书面致辞。中…

Windows 10随机性死机怎么办?

在诸多的电脑问题中,死机算是格外恼人。尤其是当你正在编辑文档,正在做图,正在玩游戏,电脑突然死机,万一再加上没保存…… 如果你在使用Win10系统的过程中遇到随机性死机的问题,赶紧看看这篇文章。 小编整…

LeetCode 113. 路径总和 II

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 113. 路径总和 II,做好准备了么,那么开始吧。 🌲🌲🐴🐴 一、题目名称 LeetCode …

简单通讯录的实现

这次我们来实现一个简单的通讯录 目录 1.基本框架及的实现 2.相关结构体的实现 3.通讯录的初始化 4.新建联系人 5.显示所有联系人信息 6.删除联系人 7.查找指定联系人 8.修改联系人信息 9.对联系人进行排序 10.完整代码 既然是通讯录,我们要实现以下内容 …

内存泄漏调优案列

案列背景 最近在做公司项目核心接口压测和稳定性压测时,各接口的成功率不足99.99%,通过分割压测之后发现,在压测A服务时,内存上升明显,且伴有频繁的fgc发生 jvm老年代内存使用率已经达到了100%且应用的fgc有5000次&am…