ArduPilot代码解析之二 — 载具基础系统(AP_Vehicle)

ArduPilot代码解析之一 — 核心架构 摘要:ArduPilot采用单线程协作式架构,AP_Vehicle基类提供基础框架,所有车辆类型均继承自该框架。系统包含参数系统、调度器、硬件抽象层等核心组件,通过固定频率主循环执行任务。初始化过程分阶段进行,确保依赖关系满足。参数系统支持持久化存储和动态修改,串口管理系统可灵活分配50多种协议。硬件抽象层保持跨平台兼容性,状态管理跟踪飞行状态。车辆类型通过实现纯虚函数扩展功能,支持脚本和外部控制集成。架构设计兼顾通用性和扩展性,为各类无人机提供统一开发基础。 阅读详情

该类AP_Vehicle是所有 ArduPilot 飞行器类型的基础。它定义了 Copter、Plane、Rover、Sub 和 AP_Periph 等实现共享的通用基础设施、接口和子系统。该基类提供了执行框架(设置/循环)、调度器、参数系统以及与核心库的集成。

有关车辆具体实现方式,请参阅第 3 页(车辆类型)。


概述和架构

该AP_Vehicle车型类别是所有车辆类型的通用基础,提供:

  • 主要执行流程(setup()和loop()方法)
  • 任务调度器和常用计划任务
  • 具有共享参数组的参数系统
  • 与核心子系统(传感器、日志记录、通信、安全)集成
  • 车辆必须实现的虚拟接口(模式管理、初始化)

图:系统架构中的 AP_Vehicle

核心子系统和集成

该类AP_Vehicle实例化并管理多个子系统,这些子系统以成员变量的形式存在。这些成员变量提供对传感器、通信、日志记录和其他功能的访问。

图:AP车辆子系统集成

类结构和继承

该类AP_Vehicle定义了一个所有车辆类型都必须实现的通用接口。车辆继承AP_Vehicle并重写纯虚方法,以提供特定于车辆的行为。

图:AP_车辆类结构

注意:标记为 `*` 的方法* = 0是纯虚方法,必须由派生类实现。标记为 `*` 的方法*是虚方法,可以被重写。final关键字 `*` 表示不能被重写的方法。


类层次结构和代码实体

所有车辆类型都继承自基AP_Vehicle类。这实现了代码重用,并确保不同车辆类型之间接口的一致性。

关键方法和生命周期

该类通过方法AP_Vehicle定义车辆生命周期,以及用于模式管理和初始化的接口。setup()loop()

主要生命周期方法

方法 类型 目的 地点
setup() final 启动后一次性初始化;加载参数,初始化子系统,调用init_ardupilot() libraries/AP_Vehicle/AP_Vehicle.cpp305-549
loop() final 主执行循环;运行调度程序,更新内部错误跟踪 libraries/AP_Vehicle/AP_Vehicle.cpp551-584
init_ardupilot() pure virtual 车辆特定初始化(传感器、控制系统、飞行模式) libraries/AP_Vehicle/AP_Vehicle.h319
load_parameters() virtual 从存储中加载持久化参数;可以重写以处理格式版本。 libraries/AP_Vehicle/AP_Vehicle.h320 libraries/AP_Vehicle/Parameters.cpp8-26

模式管理接口

方法 类型 目的 地点
set_mode(mode, reason) pure virtual 根据原因跟踪更改车辆运行模式 libraries/AP_Vehicle/AP_Vehicle.h123
get_mode() pure virtual 返回当前车辆模式编号 libraries/AP_Vehicle/AP_Vehicle.h124
get_control_mode_reason() 返回上次模式更改的原因 libraries/AP_Vehicle/AP_Vehicle.h126-128
notify_no_such_mode(mode_num) 当请求无效模式时,日志记录错误。 libraries/AP_Vehicle/AP_Vehicle.cpp933-937

调度器接口

方法 类型 目的 地点
get_scheduler_tasks(tasks, count, log_bit) pure virtual 返回车辆特定调度程序任务列表 libraries/AP_Vehicle/AP_Vehicle.h142
get_common_scheduler_tasks(tasks, count) 返回通用的 AP_Vehicle 任务列表 libraries/AP_Vehicle/AP_Vehicle.cpp697-701

状态查询方法

方法 目的
从零构建DroneCAN适配器:AP_Periph固件开发实战指南 本文详细介绍了如何从零构建DroneCAN适配器,并开发AP_Periph固件,实现无人机外设的高效连接。通过解析DroneCAN适配器核心架构、定制开发AP_Periph固件、CAN总线集成与调试等步骤,帮助开发者快速掌握CAN总线协议栈的应用,提升无人机系统的扩展性和抗干扰能力。 阅读详情

相关推荐

ardupilot框架核心解析:从源码结构到ArduSub二次开发实战

开源飞控系统是嵌入式机器人领域的重要基石,其框架设计直接影响上层应用的开发效率与可维护性。ardupilot作为成熟的开源飞控生态,通过模块化架构将硬件抽象、传感器驱动、状态估计、通信协议等核心能力解耦,形成高内聚、低耦合的复用体系。理解其顶层目录组织、libraries工具箱模式以及AP_Scheduler调度机制,是掌握飞控系统运行原理的关键。MAVLink协议作为地面站与载具交互的数据管道,与AP_Mission任务调度紧密配合,构成完整的控制链路。基于SITL仿真环境,开发者可快速验证逻辑并熟悉编译

weixin_34380948的博客 447

ArduPilot新手别怕!从工程目录结构入手,快速理清六种飞行器代码脉络

本文为ArduPilot新手提供了从工程目录结构入手的详细指南,帮助快速理清六种飞行器代码脉络。通过解析开源代码框架,详细介绍ArduCopter、ArduPlane等六大设备家族的核心代码结构,以及共享代码库和模块化设计,助力开发者高效掌握无人机控制系统的开发技巧。

weixin_30698297的博客 376

【ArduPilot开发指南】1. AP外围设备(AP_Peripheral Devices)

AP_Periph是ArduPilot外围设备的缩写,即ArduPilot 外围设备基于现有的ArduPilot autopilot代码。它将ArduPilot的外围设备驱动库进行适配运行到独立的外围设备商去,并通过CAN,MSP或其他外围总线协议与主要自动驾驶设备进行通信。

从0到1,突破自己 1425

ardupilot开发 --- 代码解析 篇

代码解析,通过断点调试带你走进ardupilot,有图有真相!!

记录老板的每次pua,分享领导每天的毒鸡汤... 809

ardupilot开发 --- AP_Periph 篇

ardupilot开发 --- AP_Periph 篇

记录老板的每次pua,分享领导每天的毒鸡汤... 1571

软件工程实验报告--用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

m0_73814332的博客 4160

信号完整性仿真SI之Cadence Sigrity SPEED2000_眼图仿真(四)

今天给大家分享一个仿真的操作流程,是关于Cadence Sigrity SPEED2000的时域波形仿真和眼图仿真。我们会经常看见硬件工程师调试示波器上的一些信号的波形变化,其实这些也可以通过仿真电路的搭建来做出投板前的仿真,来优化走线,以减少版本的迭代次数。如果要和实际的信号保持一致,就要求仿真设置的参数和实际的参数保持一致,这也是仿真的重点和难点。下面先让我们了解一下Cadence Sigrity SPEED2000时域仿真的操作流程: 1.仿真模式选择与文件导入 选择Cadence Sigrity下的

刘小同学的博客 1万+

从零开始:用Python实现AlphaZero五子棋AI(附完整代码)

本文详细介绍了如何从零开始使用Python实现AlphaZero五子棋AI。通过工程化实践,逐步构建蒙特卡洛树搜索(MCTS)、轻量化残差网络(ResNet)以及自博弈训练循环,并提供完整可运行的代码。文章旨在帮助开发者绕过复杂理论,聚焦实战,最终打造一个能够自我学习与对弈的智能体,是深度强化学习在游戏AI领域的一次完整项目实战。

weixin_29081703的博客 415

神领物流-day01-项目概述

公司从2019年开始业务快速扩张,网点数量从138家扩展至540家,车辆从170台增长到800台。同时,原有的系统非常简单,比如车辆的调度靠人工操作、所有的货物分拣依靠人员,核心订单数据手动录入,人效非常低。随着业务不断演进,技术的不断提升,原有运输管理系统已无法满足现有快速扩展下的业务需求,但针对现有系统评估后发现,系统升级成本远高于重新研发。因此,公司决定基于现有业务体系进行重新构建,打造一套新的TMS运输系统,直接更替原有系统。

心飞为你飞 2253

AI: 机器学习的模型是如何训练的?(在试错中学习)

一句话理解机器学习一般训练过程 :通过有标签样本来调整(学习)并确定所有权重Weights和偏差Bias的理想值。 训练的目标:最小化损失函数 (损失函数下面马上会介绍) 机器学习算法在训练过程中,做的就是:检查多个样本并尝试找出可最大限度地减少损失的模型;目标就是将损失(Loss)最小化 在这里插入图片描述 上图就是一般模型训练的一般过程(试错过程),其中 模型: 将一个或多个特征作为输入,然后返回一个预测 (y’) 作为输出。为了进行简化,不妨考虑一种采用一个特征并返回一个预测的模型,如下公式

HowieXue 薛永浩的博客 3万+

南方电网专业面试题(电气类-继电保护)(目录)

南方电网专业面试题(电气类-继电保护)(目录) 这些面试题围绕继电保护的基本概念、工作原理、分类、性能要求,以及变压器、断路器、母线保护、自动重合闸等电力系统关键设备的保护机制和操作原则展开,旨在评估应聘者对电力系统保护和控制策略的深入理解和实际应用能力。

weixin_44808274的博客 2157

DeerFlow 系列教程 第三篇 | 核心技术深度剖析:Skills、Memory 与 Context Engineering

摘要化是 Context Engineering 中最关键的组件——它直接决定了长对话的可用性。Skills 技能系统通过渐进式加载的三层模型,在保持系统提示词轻量的同时,支持无限数量的技能扩展。从发现到执行的 10 个生命周期阶段,配合 AI 驱动的安全扫描和多层缓存,构成了一个生产级的技能管理框架。Memory 长期记忆系统通过文件系统持久化、LLM 驱动的信息提取和防抖动异步更新,实现了跨会话的认知持久化。六类事实分类体系和修正信号检测机制,让 Agent 能够从交互中持续学习和改进。

weixin_43674738的博客 280

C++ getline函数详解与示例代码

每次调用函数时,会读取一行文本,并将其存储在字符串对象中。在循环中,我们检查读取到的文本是否为空行,如果是则跳出循环,否则输出读取到的文本。这个函数在处理用户输入、文件读取等场景中非常有用,希望能对您的C++编程有所帮助。函数是一个常用的字符串输入函数,可以用于从输入流中读取一行文本。首先,我们输出提示信息,要求用户输入一行文本。函数会等待用户输入,并将输入的文本存储在。函数从输入流中读取一行文本,并将其存储在字符串对象。这样,当用户输入制表符时,函数会停止读取。函数的用法,并提供相应的示例代码。

LogicGuruX的博客 825

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: ArduPilot代码解析之三 — 布防和安全系统
下一篇: ArduPilot代码解析之四 — 姿态和位置控制
timmy-uav
博客等级 码龄26年 526粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

timmy-uav

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值