APM飞控学习笔记——自动模式下一分钟自动降落

2023-05-16

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、自动模式简介
  • 二、添加自动降落功能
    • 1.飞控主循环调用逻辑
    • 2.功能添加
  • 总结


前言

APM是一款功能齐全的开源多轴飞行器无人机控制器。历经多年的完善与发展,其手动模式的功能较为齐全和完善。自动模式逐渐成为开发重点。此文章将对自动模式进行简单的功能添加与改写。

贴出官方网站方便学习:学习 ArduPilot — 简介 — 开发文档https://ardupilot.org/dev/docs/learning-ardupilot-introduction.html

一、自动模式简介

自动模式是飞行系统中,最复杂的系统。包括:任务读取保存,任务执行 逻辑,航迹规划,位置控制,姿态控制。 之间几个模式的互相调用,接口,都是我们需要学习和开发的内容。 

 模式调用逻辑  

//对模式进行初始化,准备执行任务
bool Copter::set_mode(control_mode_t mode, mode_reason_t reason)
{
case AUTO:
success = auto_init(ignore_checks);
break;
}

//以下为主循环调用,频率为400hz
void Copter::fast_loop()
{
// 运行姿态控制器
update_flight_mode();
}

//运行自动模式
void Copter::update_flight_mode()
{
switch (control_mode) {
case AUTO:
auto_run();
break;
}

//模式退出逻辑
void Copter::exit_mode(control_mode_t old_control_mode, control_mode_t
new_control_mode)
{
if (old_control_mode == AUTO) {
if (mission.state() == AP_Mission::MISSION_RUNNING) {
mission.stop();
}

二、添加自动降落功能

1.飞控主循环调用逻辑

2.功能添加

原理:本功能添加较为简单,在主循环函数中添加功能函数并在线程中调用即可。

以下为原生代码的部分


const AP_Scheduler::Task Copter::scheduler_tasks[] = {
    SCHED_TASK(rc_loop,              100,    130),
    SCHED_TASK(throttle_loop,         50,     75),
    SCHED_TASK(update_GPS,            50,    200),
//分别声明函数名,调用频率,最大停止时间

编译自己要添加的功能函数

void Copter::oneminute()
{
	if (control_mode == AUTO)
	 {
	 	long start_time;
	 	long t;
	 	
	 	if (auto_mode == Auto_TakeOff)
	 	{
	 		start_time = time(0);
	 		while(t <= 61)
	 		{
	 			t = time - start_time;
	 			if (t >= 60)
	 			{
	 				auto_mode = Auto_Land;
				 }
			 }
		 }
	 }
}

大概思路:1、首先判断飞行模式是否为自动模式,若为自动模式则进入函数

2、判断是否执行起飞指令,若是则记录起始时间并进入循环函数

3、若计时小于61执行循环函数

 4、判断计时是否达到60s,若是则执行降落命令

 添加线程

const AP_Scheduler::Task Copter::scheduler_tasks[] = {
    SCHED_TASK(rc_loop,              100,    130),
    SCHED_TASK(throttle_loop,         50,     75),
    SCHED_TASK(update_GPS,            50,    200),
    SCHED_TASK(oneminute,             50,    200),//添加到此处

添加声明

最后在copter.h文件中添加声明

    void fast_loop();
    void rc_loop();
    void throttle_loop();
    void update_batt_compass(void);
    void fourhundred_hz_logging();
    void ten_hz_logging_loop();
    void twentyfive_hz_logging();
    void three_hz_loop();
    void one_hz_loop();
    void update_GPS(void);
    void init_simple_bearing();
    void update_simple_mode(void);
    void update_super_simple_bearing(bool force_update);
    void read_AHRS(void);
    void update_altitude();
    void oneminute();//添加到此处

总结

以上就是本文章的全部内容,本文简单介绍了添加飞控功能的方法,错误与不足欢迎指出!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

APM飞控学习笔记——自动模式下一分钟自动降落 的相关文章

随机推荐

  • C/C++排序算法(三)—— 冒泡排序和快速排序

    文章目录 前言1 冒泡排序 x1f351 基本思想 x1f351 图解冒泡 x1f351 动图演示 x1f351 代码实现 x1f351 代码优化 x1f351 特性总结 2 快速排序 x1f351 hoare 版本 x1f345 图解过程
  • C/C++排序算法(四)—— 归并排序和计数排序

    文章目录 前言1 归并排序 x1f351 基本思想 x1f351 算法图解 x1f345 分组 x1f345 归并 x1f345 比较 x1f351 动图演示 x1f351 代码实现 x1f351 非递归实现 x1f345 情况一 x1f3
  • C++深入浅出(九)—— 多态

    文章目录 1 多态的概念2 多态的定义及实现 x1f351 多态的构成条件 x1f351 虚函数 x1f351 虚函数的重写 x1f351 虚函数重写的两个例外 x1f351 C 43 43 11的override 和 final x1f3
  • C++STL剖析(八)—— unordered_set和unordered_multiset的概念和使用

    文章目录 前言1 unordered set的介绍和使用 x1f351 unordered set的构造 x1f351 unordered set的使用 x1f345 insert x1f345 find x1f345 erase x1f3
  • C++STL剖析(九)—— unordered_map和unordered_multimap的概念和使用

    文章目录 1 unordered map的介绍和使用 x1f351 unordered map的构造 x1f351 unordered map的使用 x1f345 insert x1f345 operator x1f345 find x1f
  • C++STL剖析(十)—— 位图(bitset)

    文章目录 1 位图的介绍2 位图的概念3 位图的实现 x1f351 构造函数 x1f351 设置指定位 x1f351 清除指定位 x1f351 获取指定位的状态 x1f351 打印函数 4 总结 1 位图的介绍 在介绍位图之前先来看一道面试
  • C/C++数据结构(十二)—— 红黑树

    文章目录 1 红黑树的概念2 红黑树的性质3 红黑树节点的定义4 红黑树的旋转5 红黑树的插入 x1f351 情况一 x1f351 情况二 x1f351 情况三 x1f345 叔叔结点存在且为红色 x1f345 叔叔结点存在且为黑色 x1f
  • 机器学习数学基础

    文章目录 一 学习任务二 学习内容1 梯度下降法的一般求解步骤2 梯度下降法手工求解极值2 1 计算过程 3 Excel中利用梯度下降求解近似根4 线性回归问题求解4 1 最小二乘法4 2 梯度下降法 三 参考资料 一 学习任务 解释微分
  • 一篇文章吃透算法时间复杂度

    文章目录 前言1 什么是好的算法2 算法的效率度量3 时间复杂度4 大 O 时间复杂度表示法5 算法时间复杂度计算规则 x1f351 规则 1 xff1a 只关注循环中的代码段 x1f351 规则 2 xff1a 加法规则 x1f351 规
  • 2023 年最佳 C++ IDE

    文章目录 前言1 Visual Studio2 Code Blocks3 CLion4 Eclipse CDT xff08 C C 43 43 开发工具 xff09 5 CodeLite6 Apache NetBeans7 Qt Creat
  • 掌握顺序表,成为数据结构和算法的高手

    文章目录 1 线性结构与线性表2 线性表的顺序存储3 顺序表的基础操作 x1f351 顺序表接口总览 x1f351 初始化顺序表 x1f351 销毁链表 x1f351 插入操作 x1f351 删除操作 x1f351 获取元素操作 x1f34
  • 数据结构中常见的哈希表,到底是什么?

    文章目录 1 哈希概念 x1f351 举例说明 2 哈希冲突3 哈希函数 x1f351 常见哈希函数 4 哈希冲突解决 x1f351 闭散列 xff08 开放定址法 xff09 x1f345 线性探测 x1f345 二次探测 x1f351
  • 探索数据结构之精髓:单链表解密

    文章目录 1 前言2 单链表的特点3 单链表的基础操作 x1f351 接口总览 x1f351 初始化操作 x1f351 插入操作 x1f345 优化操作 x1f351 删除操作 x1f345 优化操作 x1f351 获取元素 x1f345
  • 引用与指针:在C++中如何做出正确的选择?

    文章目录 前言1 引用入门2 引用作为函数传参3 引用作为函数返回值4 引用和指针5 其他区别 前言 引用是 C 43 43 的新增内容 xff0c 在实际开发中会经常使用 xff0c 它就如同C语言的指针一样重要 xff0c 但它比指针更
  • C++引用进阶篇:让你的程序更加高效、安全、简洁

    文章目录 前言1 引用和临时数据 x1f351 什么样的临时数据会放到寄存器中 x1f351 关于常量表达式 x1f351 引用也不能指代临时数据 x1f351 引用作为函数参数 2 为const引用创建临时变量3 const引用与转换类型
  • 二叉树基础概念详解

    文章目录 前言1 树的基本概念2 二叉树的基本概念3 特殊二叉树 x1f351 满二叉树 x1f351 完全二叉树 x1f351 斜树 4 二叉树的性质 x1f351 性质一 x1f351 性质二 x1f351 性质三 x1f351 性质四
  • 链队列知识总结及代码实现

    目录 链队的存储方式 链队的优点 链队功能函数 代码实现 链队的存储方式 可以通过 单链表 的方式来实现 xff0c 使用链式队的优点在于它能够克服用数组实现的顺序队空间利用率不高的特点 xff0c 但是需要为每个队元素分配额外的指针空间用
  • 【C语言】全面解析结构体,结构体知识点整理

    文章目录 结构体的概念结构体类型的声明结构体变量的创建typedef关键字结构体的嵌套结构体变量的初始化结构体成员的访问结构体的传参总结 结构体的概念 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 组成结构型数据的每个数据称为
  • 逻辑回归案例 练习

    文章目录 一 学习任务二 学习内容1 常用评价指标2 实验分析 三 参考资料 一 学习任务 学习理解逻辑回归的基本概念 xff0c 练习python代码的实现 xff0c 在notebook中写入自己的理解注释 准确理解机器学习算法的常用评
  • APM飞控学习笔记——自动模式下一分钟自动降落

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 自动模式简介二 添加自动降落功能 1 飞控主循环调用逻辑2 功能添加总结 前言 APM是一款功能齐全的开源多轴飞行器无人