自主悬停&高度融合 作者:nieyong

2023-05-16

自主悬停&高度融合

作者:nieyong

自主悬停是Crazepony玩家问得最多的问题,也是技术难度最高的问题。

首先我们明确什么是自主悬停?下面是一位资深航模玩家对于自主悬停的解释。

飞行器能够悬停在某个位置,在发生了偏离之后能够自动校正并且回到原来悬停的位置,并且能够在该位置保持足够长的时间,至少2分钟以上,那么我们认为该飞行器是能够自主悬停的。

飞行器在空中是一个三维坐标(x,y,z)位置,涉及到两个维度的悬停。第一是在水平面上(x,y),飞行器不能够左右或者前后漂移。第二是在垂直方向上(又叫Z轴维度),飞行器不能够发生掉高等现象。针对这两个不同的维度,有不同的技术进行解决。

在水平面上,为了确定飞行器的位置,一般使用GPS进行定位,室内一般使用光流进行定位(室内没有GPS信号)。

在垂直方向上,一般使用气压计进行定高,室内等条件下可以使用超声波模块。

能否只用6维数据实现悬停

能否只使用3维加速度和3维陀螺仪这6个维度的数据实现自主悬停?而不再使用气压计和GPS等。现在就我了解,是很难实现。因为只使用这个6维数据,无法知道飞行器在空中的绝对坐标,只能够由6维数据获得相对偏移。没有绝对坐标,就无法对位置实现闭环控制

当然,我们看到很多只是用了MPU6050的玩具四轴,也能够实现一定程度的悬停,但是那并不是真正意义上的自主悬停。

水平面的定位

室外使用GPS进行水平定位,室内一般使用光流技术(optical flow)。光流传感器其实就是一个摄像头,安装在飞行器上垂直拍摄地面。光流技术就是要对拍摄到的画面进行视觉处理,以此知道相对于地面坐标位置。APM飞控中关于光流传感器的介绍。

 

垂直方向定位

在垂直方向上,使用高精度气压计(如MS5611)进行定位。在飞行器处于较低高度时,可以使用超声波进行高度定位。

Crazepony的自动悬停

飞行器要想实现真正意义的自主悬停需要有自稳和空中绝对坐标。Crazepony有一个高精度气压计MS5611,所以可以实现Z轴的自主悬停。在水平方向上,crazepony没有绝对坐标,无法实现悬停。

在Z轴自主悬停上,Crazepony有一个高精度气压计MS5611,通过气压传感器采集的大气压值计算出来,将气压传感器采集值进行校正后,再通过温度二阶补偿,得到准确的大气压值,最后经过气压转换高度公式就可以得到一个相对于起飞地点的绝对高度(参考气压计MS5611)。

MS5611气压计的精度为10CM,因此需要融合加速度计互补滤波得到比较合适的高度值,Z轴速度值和加速度值。用高度作外环,速度作内环形成高度双环PID控制器,调节输出油门实现Z轴的自主悬停。高度融合在文件Altitude.c中实现,高度双环PID控制在Control.c文件中的CtrlAlti()函数中实现。

高度双环PID控制总体流程。

代码实现在Control.c文件中的CtrlAlti()函数中。

……
// pid and feedforward control . in ned frame
posZErr= -(altSp - alt);
posZVelSp = posZErr * alt_PID.P + spZMoveRate * ALT_FEED_FORWARD;
//consider landing mode
if(altCtrlMode==LANDING)
    posZVelSp = LAND_SPEED;

velZ=nav.vz;	
velZErr = posZVelSp - velZ;
valZErrD = (spZMoveRate - velZ) * alt_PID.P - (velZ - velZPrev) / dt;	//spZMoveRate is from manual stick vel control
velZPrev=velZ;

thrustZSp= velZErr * alt_vel_PID.P + valZErrD * alt_vel_PID.D + thrustZInt;	//in ned frame. thrustZInt contains hover thrust
……

在水平方向上,由于Crazepony没有绝对坐标,使用3维加速度和3维陀螺仪这6个维度的数据进行双环PID控制形成一个自稳系统,可实现短时间定点脱控悬停,但是受误差影响产生偏离,没有水平绝对坐标就无法回到原来的位置,所以Crazepony是无法实现正真意义上自动悬停的。

Z轴悬停-悬停油门基准值

在Z轴悬停代码中,定义了一个悬停油门基准值HOVER_THRU,该值决定着飞行器脱控悬停的时候需要的油门大小。对悬停起到至关重要的作用。 在版本9bf1e83f之后,该宏定义由函数estimateHoverThru()代替,根据当前电池电压大小,输出对应的油门悬停基准值,能够彻底解决充满电之后第一次飞行直接往上冲的问题。

油门基准值的选取对悬停是至关重要的。例如,我们换了一批扭力更大的电机,那么在飞行器重量不变的情况下,使用原来的基准值就会出现脱控之后一直往上飞的情况。这个时候,我们就需要将该值改小,以此适应这批次扭力大的电机。

悬停油门基准值将会直接影响Z轴悬停,选取不当或者系统参数发生变化时,就会出现往上飞或者掉高的问题。这里的系统参数发生变化,包括电池电力变化,飞机重量改变,电机扭力变化等。如果使用固定值,在电池充满电之后,会出现起飞之后往上冲的问题。所以在版本9bf1e83f之后,该悬停油门基准值由函数estimateHoverThru()输出。根据电池电压不同,使用不同的油门基准值。

float estimateHoverThru(void){
	float hoverHru = 0.55f;
	
	//电池电压检测
	Battery.BatteryAD  = GetBatteryAD();
	Battery.BatteryVal = Battery.Bat_K * (Battery.BatteryAD/4096.0) * Battery.ADRef;//实际电压 值计算
	
	if(Battery.BatteryVal > 4.05){
		hoverHru = -0.35f;
	}else if(Battery.BatteryVal > 3.90){
		hoverHru = -0.40f;
	}else if(Battery.BatteryVal > 3.80){
		hoverHru = -0.45f;
	}else if(Battery.BatteryVal > 3.70){
		hoverHru = -0.50f;
	}else{
		hoverHru = -0.55f;
	}

	return hoverHru;
}

Z轴悬停-最小油门值

根据机重和动力系统的输出,我们还为Crazepony设定了一个最小的油门输出值THR_MIN,这样能够限制最大的下降速度。可以避免下降速度过快,机身失去平衡。

限定最小的油门输出值THR_MIN本来是为了解决下降过快的问题,有时候也会带来副作用。例如充电后第一次飞行,由于动力输出强劲,如果这个最小油门输出值设置得过大,那么即使将摇杆油门拉到了最低,飞机也会一直往上冲。在版本7ee226a之后,该宏被修改为函数estimateMinThru(),将输出和当前电池电压挂钩,能够解决往上冲下拉油门时无法受控的问题

float estimateMinThru(void){
	float minThru = -0.55f;
	
	//电池电压检测
	Battery.BatteryAD  = GetBatteryAD();
	Battery.BatteryVal = Battery.Bat_K * (Battery.BatteryAD/4096.0) * Battery.ADRef;//实际电压 值计算
	
	if(Battery.BatteryVal > 4.05){
		minThru = -0.30f;
	}else if(Battery.BatteryVal > 3.90){
		minThru = -0.40f;
	}else{
		minThru = -0.55f;
	}
	
	return minThru;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自主悬停&高度融合 作者:nieyong 的相关文章

  • 虚拟化技术介绍 & hypervisor简介

    什么是虚拟化 xff1f 虚拟化 xff08 英语 xff1a Virtualization xff09 是一种资源管理技术 xff0c 是将计算机的各种实体资源 xff0c 如服务器 网络 内存及存储等 xff0c 予以抽象 转换后呈现出
  • 【CCF推荐专区】计算机类优质SCI&EI好刊,期刊质量高,部分期刊仅有少量版面

    x1f308 智能传感类 xff08 TOP xff09 CCF C类 期刊简介 IF 7 0 8 0 xff0c JCR1区 xff0c 中科院2 1区 检索情况 SCI amp EI 双检 xff0c 正刊 xff0c CCF C类 征
  • Kibana学习&理解

    注 xff1a 本篇的kibana基于7 5 1版本 Kibana是什么 xff1f kibana是一个数据可视化平台 展示与分析 将es里面的东西通过各种图表展示出来 xff0c 还可以执行es的各种搜索 amp 监控 Kibana环境搭
  • Lesson 9.2&9.3&9.4 黑箱:不可解释的深层神经网络&探索多层神经网络:层vsh(z)

    二 黑箱 xff1a 深层神经网络的不可解释性 首先从结构上来看 xff0c 多层神经网络比单层神经网络多出了 中间层 中间层常常被称为隐藏层 xff08 hidden layer xff09 xff0c 理论上来说可以有无限层 xff0c
  • 时空行为检测数据集 JHMDB & UCF101_24 详解

    文章目录 0 前言1 JHMDB1 1 基本情况1 2 数据准备以及标签详解 2 UDF101 242 1 基本情况2 2 数据准备与标签详解 3 数据集可视化代码 0 前言 现在常用的时空行为检测数据集只有AVA JHMDB UCF101
  • AMP:参考xapp-1078和xapp1079的一些建议

    Linux系统默认是SMP模式 xff0c 有时我们也需要AMP模式进行开发 参考网站 xff1a wiki xilinx com 有xapp1078 xapp1079最新版本的AMP demo www arm com 主要是介绍arm系列
  • 持续请求/socket.io/?EIO=3&transport=polling&t=N8HrzIR

    项目基本介绍 xff1a 使用React xff0c webpack xff0c socket io client Node js Express socket io 等技术 xff0c 采用前后端分离开发 实现项目中的聊天室时遇到报错 x
  • weak & asign

    Why does Apple use assign rather than weak to store a delegate http stackoverflow com questions 20419317 why does apple
  • C++编程(五)--- Cmake详解&Makefile详解

    C C 43 43 程序员肯定离不开Makefile和Cmake xff0c 因为如果对这两个工具不熟悉 xff0c 那么你就不是一个合格的C C 43 43 程序员 本文对Makefile和Cmake xff0c 及它们的使用进行了详细的
  • STM32调试方式JTAG&SWD的区别

    在学习STM32时 xff0c 我们经常会遇到JTAG和SWD的调试方法 xff0c 还涉及到Jlink Ulink Stlink等 xff0c JTAG和SWD是ARM板一种调试模式 后面三种都是实现这种模式的一种工具 xff0c 他们之
  • A1&AlienGo--通过realsense-viewer调用相机

    使用机器狗时 xff0c 有时需要通过NX 树莓派上的系统来查看调用相机 xff0c 可以通过realsense提供的realsense viewer来查看 但是机器狗自带的视觉程序会开机自启占用相机 xff0c 所以首先需要杀掉这个进程
  • ROS通信机制~话题通信(Publisher&Subscriber)·笔记2

    系列文章目录 xff1a ROS开发 xff08 ubuntu xff09 笔记 1 嘻 嘻的博客 CSDN博客 ROS通信机制 服务通信 server amp client 笔记3 嘻 嘻的博客 CSDN博客 话题通信 理论模型 xff1
  • Jetson Xavier NX 配置(七)—— 数据传输之socket文件传输 & usb摄像头RTSP视频推流

    目录 1 Python socket 文件传输 xff08 1 xff09 发送单个文件 xff08 一次性 xff09 xff08 2 xff09 发送一个文件夹下的所有文件 xff08 一次性 xff09 xff08 3 xff09 发
  • ROS速成之发送&接收消息

    人真的老了 xff0c 扔了个周末 xff0c 完全不记得干了什么 论纪录的重要性啊 xff0c 当时觉得明白的很 xff0c 你扔两天试试 xff1f 扔一年试试 xff1f 扔几年试试 xff1f 最近参加的各种项目脑疼眼乏 xff0c
  • SIP 鉴权 & HTTP 认证

    sip 鉴权是基于摘要签名认证的 具体来说 每一个用户都有一个用户名和密码 用户名和密码在客户端和SIP 服务器的数据库中都有保存 在认证的过程中 客户端将自己的信息 用户名 密码 url 等信息 做一些复杂的MD5 或者SHA256 SH
  • Docker数据卷&&自定义Docker镜像

    目录 宿主机与容器之间的文件拷贝 引言 xff1a 利用MySQL镜像安装MySQL服务 从容器中拷贝文件到宿主机 从宿主机拷贝文件到容器 数据卷 数据卷容器 Dockerfile自定义镜像 自定义tomcat8 xff08 熟悉几乎所有的
  • Flask-SQLAlchemy 中的 relationship & backref

    今天重看 Flask 时 xff0c 发现对backref仍然没有理解透彻 查阅文档后发现 xff0c 以前试图孤立地理解backref是问题之源 xff0c backref是与relationship配合使用的 一对多关系 db rela
  • linux中断&poll&selcet按键处理机制

    在上一篇linux按键中断处理中 xff0c 我们采用按键中断处理获取按键 xff0c 在read函数中阻塞读取 xff0c 当按键发生时 xff0c read自动解除阻塞 xff0c 实现应用层读取到相应的按键值 在上一节中如果没有按键到
  • C++ 文件的读写(fin && fout)

    如何让键盘输入字符保存在 txt文件中 如何让我们自己在键盘上输入的字符不仅仅在屏幕上显示 xff0c 而且还能保存在特定路径的文件中 xff0c 这让简单枯燥的控制台命令程序变得略有趣 首先 xff0c 先看看cin和cout对象 xff
  • C++Primer Plus第6版&C Primer Plus第6版 中文版免费分享啦

    最近在学习C 43 43 xff0c 用的资料是师兄分享的经典书籍 C 43 43 Primer Plus第6版中文版 的PDF xff0c 自带书签 xff0c 使用很方便 但师兄说这个是他在网上花了积分才下载下来的 xff0c 这让我很

随机推荐

  • sdf模型插入gazebo_ros_control插件

    gazebo ros control目前只支持老版的urdf模型 xff0c 官方教程 xff1a http gazebosim org tutorials tut 61 ros control sdf模型怎么办呢 xff1f 回答 xff
  • PreparedStatement 在mysql下中文乱码解决方案

    在顶目中无意中碰到PreparedStatement 在存DB时出现乱码 xff0c 困扰了好久终于解决问题 问题代码如下 pstmt 61 con prepareStatement INSERT OFFLINE pstmt setStri
  • 2013年终总结

    2013年即将过去 xff0c 回顾这一年 xff0c 有得有失 xff0c 有喜有悲 xff0c 些许记忆碎片留在脑海中 简单做个总结 xff0c 也算划上一个完美的句号 xff0c 再迎接充满挑战的2014 xff01 项目 一年过来
  • 程序员的生活,其实苦不堪言

    前一天 A 下班前把这个代码发给我 B 好的 xff01 第二天 A 都他妈中午了 xff0c 代码怎么还没发过来 xff1f B 我他妈还没下班呢 xff01 程序猿的真实写照 曾经刚参加工作 xff0c 接手一个项目的维护 xff0c
  • 不容错过的用户标签全面解读。建议收藏!

    过去几年来 xff0c 随着我国整体人口红利优势不再 xff0c 市场竞争加剧 xff0c 获客成本不断飙升 xff0c 互联网也告别增长进入存量时代 xff0c 品牌方的营销目标也从最大化追求用户数量规模转变为追求用户质量的精细化营销上
  • 【书写makefile】相关符号介绍

    本文将介绍一下几种符号 xff1a 61 43 61 61 61 makefile中 xff0c 的意思是取变量的意思 xff0c 比如 xff0c a 61 4 那么在后面的语句中 xff0c a 就代表的是取a的值 如果给a定义的是个宏
  • python人工智能技术

    人工智能 xff08 AI xff09 已成为当今世界的热门话题 xff0c 它的应用范围越来越广泛 其中 xff0c Python成为AI开发中最受欢迎的编程语言之一 Python提供了许多功能强大的库和框架 xff0c 大大简化了开发人
  • 利用X-CTU软件给P900数传配置参数

    转自 xff1a 70条消息 P900数传参数配置 落体偏东 CSDN博客 ATS104设置网络号 xff08 设置主从之间通讯连接的密码 xff09 ATS105设置单元号 xff08 给自己使用的数传进行编号 xff0c 防止主从混乱
  • px4添加自己编写的代码并编译

    1 在px4项目下的src文件夹下的modules文件夹中创建一个文件夹 xff0c 如图我创建了一个position control文件夹 xff0c 在该文件夹中添加自己写的代码程序 xff0c 同时添加一个CmakeLists txt
  • 思岚A1M8激光雷达-ubuntu18.04-slam建图参考

    Rplidar A1 A2使用及Hector SLAM建图 NouriXiiX的博客 CSDN博客 激光雷达初体验 Ubuntu 18 04 43 思岚科技 RPLIDAR A1M8 43 ROS 上手使用 银时大魔王的博客 CSDN博客
  • intel Realsense D/T系列 kalibr标定

    kalibr官方源码GitHub ethz asl kalibr The Kalibr visual inertial calibration toolbox 鼠标下拉找到install follow the install wiki pa
  • gazebo仿真遇到的FCU问题

    当使用roslaunch xxx launch命令进行gazebo仿真时出现 FCU Preflight Fail Accel 0 uncalibrated或者FCU Preflight Fail Baro Sensor 0 missing
  • 大广角USB摄像头选用指南

    起因是我要做一个二维码引导无人机降落的实验 四旋翼无人机搭载单目下视摄像头 xff0c 用于识别地面的二维码 我选择摄像头的标准基本上只有一个 xff1a 视场角越大越好 为此查阅了一些资料 xff0c 买了很多镜头和底板 xff0c 有了
  • 一:XTDrone平台上将视觉SLAM2与gazebo仿真集合

    1 XTDrone仿真平台配置 参考官方教程 xff0c 基本没大问题 仿真平台基础配置 语雀 依赖安装sudo apt install y n https www yuque com xtdrone manual cn basic con
  • 线程和进程的区别

    不少刚看到这两个词 xff08 特别是不是计算机专业的 xff09 小伙伴可能会比较疑惑 xff0c 线程和进程有什么区别 xff0c 网上有许多专业性的解答 xff0c 但是既然不少小伙伴不是计算机专业的 xff0c 那就结合例子做个大概
  • Pixhawk烧写自己开发过的1.11.0固件连接不上QGC

    最近在更改代码烧写固件后 xff0c 飞控就连接不上地面站 xff0c 以为是飞控坏了 xff0c 烧写了最新版的固件发现有可以连接到地面站了 xff0c 又烧写了同一版本的其他代码发现也可以连接qgc xff0c 应该是自己写的代码某个部
  • C标准库string.h源码(简单版)

    C标准库string h源码 xff08 简单版 xff09 strcpy strncpystrcat strncatstrcmp strncmpstrchr strrchr strchrnul strstrmemcpy memmove s
  • 二进制浮点数以及二进制浮点数算术运算

    二进制浮点数以及二进制浮点数算术运算 二进制浮点数表示半精度浮点数单精度浮点数双精度浮点数特殊情况 浮点数的运算步骤一 对阶二 尾数运算三 结果规格化左规操作右规操作 四 舍入处理五 溢出判断六 例子二进制浮点数加法二进制浮点数减法二进制浮
  • SMPL源代码实现和模型解读

    对于SLAM的工作已经告一段落了 xff0c 传统的人体动态三维重建也要告一段落了 xff0c 由于课题研究的方向是基于图像 视频的人体三维重建 xff0c 三维shape pose的恢复 xff1a 所以今天和大家交流的是SMPL模型 x
  • 自主悬停&高度融合 作者:nieyong

    自主悬停 amp 高度融合 作者 xff1a nieyong 自主悬停是Crazepony玩家问得最多的问题 xff0c 也是技术难度最高的问题 首先我们明确什么是自主悬停 xff1f 下面是一位资深航模玩家对于自主悬停的解释 飞行器能够悬