无人机加速计、气压计、GPS数据融合

2023-05-16

加速计、气压计、GPS数据融合

在无人机控制当中,传感器的参与那是必不可少的,特别是陀螺仪,最经典的为MPU6050,目前大部分的无人机都是用的这个器件。
熟悉MPU6050的都知道,这个传感器可以输出三轴加速计、三轴陀螺仪;加速计,顾名思义,直接测得物体的加速度。
理论上 加速度积分得到速度,速度再积分得到位移:
S = V0 * t + 1/2 * a * t ^ 2;
V = v0 + a * t;
按照此理想情况下:一个加速计直接积分算得速度跟位移就得了呀,为啥还要气压计、GPS呢。
无人机为了定点悬停,需要计算XYZ三轴的速度跟位移,而加速度计有一个致命的缺点就是它积分会漂移,而且是漂移非常大的那种,如果直接用这个数据做控制,飞机都不知道要飘到哪里去了。所以才借助外部传感器气压计、GPS修正加速计的漂移。
加速计在无人机三轴位置速度计算时也有很大的优点,就是其灵敏度相对很高,无人机稍微动一点加速计都可以感受的出来,然后把数据传到无人机,无人机得以做相应的调整。

数据融合

具体数据怎么融合呢?
我们先来总结一下加速计、气压计、gps各自的优缺点:
加速计:优点反应速度快,缺点积分漂移严重。
气压计GPS:优点绝对位置比较平稳,缺点反应速度比较慢。
所以就有了互补滤波这个伟大的,简单易懂的滤波算法。

以下为互补滤波代码:

void Gps_Acc_Delay(void)
{
 volatile uint8 i;
 for (i = 0; i < XY_VEL_HISTORY - 1; i++)
 {
  x_vel_history[i] = x_vel_history[i+1];
  y_vel_history[i] = y_vel_history[i+1];
  
  x_pos_history[i] = x_pos_history[i+1];
  y_pos_history[i] = y_pos_history[i+1];
 }
 x_vel_history[XY_VEL_HISTORY - 1] = x_est[1];
 y_vel_history[XY_VEL_HISTORY - 1] = y_est[1];
 x_pos_history[XY_VEL_HISTORY - 1] = x_est[0];
 y_pos_history[XY_VEL_HISTORY - 1] = y_est[0];
}
void ObservationOPT_Update(float pos_x,float vel_x,float pos_y,float vel_y)  //have data and update
{
 uint8 i;
 corrOPT_xpos = pos_x-x_est[0];
 corrOPT_xvel = vel_x-x_est[1];
 corrOPT_ypos = pos_y-y_est[0];
 corrOPT_yvel = vel_y-y_est[1];
 return;
}
void ObservationUpdate(int baro_disdance,int16 baro_vel)
{
 uint8 i;
 corr_baro = (float)baro_disdance - z_est[0];
 if (fly_status.HOLD_STATUS == HOLD_STOP)
 {
  z_est[0] = baro_disdance;
  z_est[1] = 0;
 }
 return;
}
void TimeUpdate(struct vertical_information *pAltitude,realacc* acc)
{
 static float high_pass_zvel = 0;
 z_est[2]=acc->zz-z_bias;
 accel_filter_predict(INAV_T,z_est);
 z_est[0] += corr_baro * w_z_baro * INAV_T;
 z_bias -= corr_baro * 0.001f * INAV_T;
 z_est[1] += corr_baro * baro_vel_gain * INAV_T;
 high_pass_zvel = z_est[1];
 pAltitude->altitude_hat=z_est[0];
 pAltitude->velocity_hat=high_pass_zvel;
 ObservationOPT_Update(x_est[0],optflow.velx,y_est[0],optflow.vely);
 x_est[2]=acc->xx-x_bias;
 accel_filter_predict(INAV_TXY,x_est);
  x_est[0] += corrGPS_xpos * x_pos_gain * INAV_TXY;
 x_est[1] += (corrOPT_xvel*0 + corrGPS_xpos * 1.0f + corrGPS_xvel * 0.2f) * x_vel_gain * INAV_TXY;
 y_est[2]=acc->yy-y_bias;
 accel_filter_predict(INAV_TXY,y_est);
  y_est[0] += corrGPS_ypos * y_pos_gain * INAV_TXY;
 y_est[1] += (corrOPT_yvel*0 + corrGPS_ypos * 1.0f + corrGPS_yvel * 0.2f) * y_vel_gain * INAV_TXY;
 if (GPS_is_Good)
 {
  if (corrGPS_xvel > -10 && corrGPS_xvel < 10)
    x_bias -= (corrGPS_xpos*0.3f + corrGPS_xvel) * INAV_TXY * 0.1f;
  if (corrGPS_yvel > -10 && corrGPS_yvel < 10)
    y_bias -= (corrGPS_ypos*0.3f + corrGPS_yvel) * INAV_TXY * 0.1f;
 }
 else
 {
  x_est[1] = Body_dat.vel_x;
  y_est[1] = Body_dat.vel_y;
  x_est[0] = Body_dat.pos_x1;
  y_est[0] = Body_dat.pos_y1;
 }
 pos_vel_xy.posx = Body_dat.pos_x1;
 pos_vel_xy.posy = Body_dat.pos_y1;
 pos_vel_xy.velx = x_est[1];
 pos_vel_xy.vely = y_est[1];
}

以上代码就是无人机里的互补滤波修正。如有不懂欢迎留言或扣我1836703877。无人机四轴本人做了五年,以上代码全部自己写,上传的没来的及添加注释,但是代码时成功在飞机上跑的并且无人机出货的。

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

无人机加速计、气压计、GPS数据融合 的相关文章

  • GPS 应用程序在 iOS 5 上停止工作 - 位置管理器未更新

    我开发了一个针对 iOS 4 3 的应用程序 效果很好 但自从我迁移到 iOS 5 0 以来 该应用程序开始表现出奇怪的行为 位置管理器不显示位置变化的更新 有人遇到过这种问题吗 谢谢你的帮助 我与 CLLocation 经理共享票价 出现
  • 动态更改 GPS LocationListener 的 minTime

    我正在编写的应用程序使用 GPS 位置管理器服务 requestLocationUpdates 但我希望能够更改整个程序中的最小时间和最小距离参数 我在创建时初始化位置侦听器 但我不知道如何更改这些参数 甚至不知道是否可以这样做 这样做的主
  • Android GPS 路由系统

    我正在开发一个 Android 应用程序 它可以定位用户 假设用户在路上 并且该应用程序将为用户创建最短路线 以便能够到达用户选择的目的地 定位用户不是问题 因为这里有一个 API http www vogella com articles
  • GPS坐标:一个点周围1平方公里

    我希望有人能给我提供一个方程来计算给定点周围 1 公里的平方 X 从 a aaa 到 b bbb Y 从 c ccc 到 c ccc 例如lat 53 38292839 and lon 6 1843984 我还需要围绕一个点 2 公里 5
  • 在带有校准点的地图上将经度和纬度转换为 X Y

    如果我有一张尺寸为 sizeX sizeY 的 jpeg 地图 以及地图上的一些校准点 X Y 经度 纬度 使用给定的经度 纬度对计算地图中相应 XY 点的算法是什么 这对我有用 没有那么多废话 int x int MAP WIDTH 36
  • GMSPolyline 非常大的内存峰值

    在允许用户在各种不同类型的地图上显示我们称之为轨迹的复杂位置点列表的 GPS 应用程序中 每个轨迹可以包含 2k 到 10k 个位置点 当轨迹在非 Google 地图类型上呈现时 它们会被大量剪切 修剪和路径简化 这是为了降低内存使用量并提
  • Android GPS 的准确度如何? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我好像在某处读过Android的GPS精度约为10厘米 任何人都可以验证或更正这个吗 原因是我正在尝试开发的应用程序会跟踪用户访问过的位置 这将极大地
  • C# - LINQ - GPS 纬度和经度的最短距离

    我有数据库 其中有带有 GPS 坐标的一流酒店 我想获得距离我选择的坐标最近的地方 我认为它应该看起来像这样 我在这里找到了很多示例代码 就像这样 var coord new GeoCoordinate latitude longitude
  • 帮助使用 GPS 坐标,Android

    我正在使用此代码来获取我的位置并在屏幕上打印坐标 package com example alpha import android app Activity import android content Context import and
  • 如何将 GPS 数据从 Android 发送到网站?

    我是 Android 和 Web 服务开发新手 目前我正在开发Android程序 该程序将发送经度和纬度信息到asp net网站 以显示位置更改网站地图 问题是 如何将此数据发送到网站 最佳实践 对合适框架的任何建议 从Android应用程
  • LocationManager requestLocationUpdates minTime OR minDistance

    我用的是安卓系统LocationManager及其方法requestLocationUpdates像这样 locationManager requestLocationUpdates LocationManager GPS PROVIDER
  • 使用 Google 电子表格中的脚本从手机获取我的当前位置

    有没有办法使用 Google Apps 脚本从手机的 GPS 数据中获取我的当前位置 纬度和经度 最好是十进制形式 另外 是否可以打开和关闭 GPS 或者至少检测它是否打开或关闭 这是我尝试做的 我带着电动助力车去一些地方 在每个地方我都会
  • 当我的活动结束时,如何停止 GPS/位置跟踪?

    我有一个非常简单的 Android 应用程序 它显示 Google 地图视图并使用 GPS 跟踪位置 基本上像这样 public void onCreate Bundle savedInstanceState mLocationManage
  • Java Marine API - 寻找 NMEA 数据

    我的最终目标是从 Adafruit Ultimate GPS NMEA 0183 标准 接收纬度和经度 GPS 信息到我的 Java 应用程序 我正在使用 Java Marine API 来执行此操作 然后 当前位置将与时间戳一起写入数据库
  • PWA 可以访问联系人、GPS 或使用手机摄像头吗?

    PWA 可以访问联系人 GPS 或使用手机摄像头吗 这在任何系统 ios android 中都可能吗 是否有任何开发计划来实现这些功能 PWA 无法克服一些限制 you cannot访问电话上的联系人列表 另一方面 你can拍照并使用 GP
  • Swift 将十进制坐标转换为度、分、秒、方向

    我怎样才能将其转换为快速 我最好的猜测是所有 int 都变成了 var 删除所有导致 的 此外 如果有的话可以给我指出一个很好的来源来了解事物如何转换 那就太好了 NSString coordinateString int latSecon
  • 使用 WGS84 椭球的距离

    考虑点 P1 60 N 20 E 0 和 P2 60 N 22 E 0 地球表面 当形状为 P1 和 P2 时 点 P1 和 P2 之间的最短距离是多少 地球是使用 WGS 84 椭球体建模的吗 不幸的是 文森蒂算法对于某些输入无法收敛 地
  • 检查用户设备的 GPS 是否开启

    我正在使用 jQuery Mobile 和 PHP 开发一个应用程序 我没有使用 Phonegap 或其他框架 我需要找到用户的geolocation 如果用户设备的 GPS 关闭 那么我无法获取位置 现在我需要查找用户设备的 GPS 是否
  • 使用 WiFi 获取位置详细信息

    我正在 Android 中创建一个小应用程序 它指向当前位置 我已经使用了 GPS 提供商 但发现在某些地方我无法使用 GPS 提供商获取数据 任何人都可以帮我得到这个吗 如果您已连接到 WIFI 则只需使用网络提供商即可更新您的位置 他们
  • 在android中快速获取当前位置

    我有一个 Android 应用程序需要设备当前位置 纬度和经度 我已经尝试了网上的一些教程 特别是堆栈溢出的一些解决方案 但它们对我来说效果不佳 我的要求非常简单 首先 我需要它速度快 并且在片段开始时需要一次位置 其次 我需要它尽可能精确

随机推荐

  • 我心目中的好的技术教程

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 当人类进入互联网时代 xff0c 便宣告一个新的学习模式 网上学习的诞生 现在各种网上教程之多可以用恒河沙数来形容 xff08 这里暂时除
  • TCP的建立

    大家好呀 xff0c 我是请假君 xff0c 今天又来和大家一起学习数通了 xff0c 今天要分享的知识是TCP的建立 TCP是一个面向连接的可靠的传输控制协议 xff0c 在每次数据传输之前首先需要建立连接 xff0c 连接建立成功后才开
  • Java根据数字金额生成大写金额

    要求 根据用户输入金额数字转换成相对应大写金额例如 xff1a 430 65 xff0c 转换成肆佰叁拾元陆角伍分代码如下 xff1a public class MoneyFormatUtils private static final S
  • POI 设置Excel单元格背景色(参考颜色代码)

    创建一个 workbook 对象 Workbook workbook 61 new XSSFWorkbook 创建一个 sheet Sheet sheet 61 workbook createSheet 创建一行 Row row 61 sh
  • RedisTemplate之opsForValue使用说明

    转载链接出自 xff1a https blog csdn net qq 25135655 article details 80357137 Redis中opsForValue 方法的使用介绍 xff1a 1 set K key V valu
  • Python爬虫(二)——爬取电影天堂,保存下载地址

    首先我们开始要分析一下 xff0c 下载种子我们需要哪几步 xff1a 获取所有电影页的访问地址获取电影页源码提取出下载地址将下载地址保存 首先第一步 xff0c 我们来分析一下电影天堂网站的结构 xff0c 发现他跟我们的古诗文网还是非常
  • pixhawk飞控中添加uORB主题

    本说明针对 Firmware v1 2 0 参考 xff1a https pixhawk org start id 61 zh dev shared object communication 1 添加流程说明 在Firmware msg下新
  • px4 多旋翼SITL仿真

    好久不写csdn了 xff0c 自己的笔记都记在了onenote里面了 xff0c 没有时间写东西分享 xff0c 今天找了个记得比价规整的分享一下 备注 xff1a SITL需要程序源码和QGC xff0c 以及配置环境时安装的一些东西
  • keil空间不足,.\Objects\template.axf: Error: L6406E: No space in execution regions with .ANY selector mat

    关于keil空间报错 xff0c 我总结了一下集中解决方案 xff1a 1 有可能是所选主控芯片RAM xff0c ROM真的被用完了 xff0c 这是需要更换主控芯片 2 keil里面的优化还可以继续优化省出一点空间 下面红色标的选择跟你
  • 无人机之姿态控制篇

    姿态控制篇 拿四旋翼无人机为例 xff0c 四个桨叶旋转是的无人机产生了升力 xff0c 但是这个升力要怎么匹配才能使得无人机能够平稳的飞行呢 xff0c 这个就是无人机姿态控制的关键 如图四个电机1 2 3 4 xff0c 水平位置X x
  • 无人机小四轴定高篇

    无人机定高篇 定高 xff0c 也是无人机的标配功能 xff0c 可以说必须要有的 一般来说定高怎么做 xff0c 常规的思维就是计算出无人机的高度和Z轴速度 xff0c 然后对高度和速度进行PID运算 实际上大思想就是这么的简单 xff0
  • 无人机光流定点讲解

    无人机光流定点 光流是测速算法 xff0c 并不是直接定位的 简单理解 xff0c 光流就是通过检测图像中光点和暗点的移动 xff0c 来判断图像中像素点相对于飞行器的移动速度 如果地面是静止的 xff0c 自然就可以得到飞行器相对于地面的
  • TinyXml快速入门(一)

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 对于xml文件 xff0c 目前我的工作只是集中在配置文件和作为简单的信息文件来用 xff0c 因此我不太喜欢使用msxml这种重量级的x
  • 华大单片机HC32L130/HC32L136从机IIC通信

    从机IIC理论知识 主机IIC的做法比较多 xff0c 从机IIC的就相对比较难一点 先补充一下从机IIC的思路 xff1a 先看IIC时序图 xff0c 然后根据时序图理清IIC从机需要做哪些判断 xff1a 从机发送 xff1a 判断I
  • cannot access memory

    cannot access memory 先说一个经历 xff1a 在一次我测试单片机FLASH时候 xff0c 程序就是一直运行的擦除FALSH xff0c 写入FLASH 然后再想通过SWD重新烧录程序就无法烧录进去了 具体现象如下 x
  • 无刷电机反方向高速旋转

    无刷电机反方向高速旋转 最近遇到一个问题 xff0c 就是无刷电机在给正转的力的时候如果用手往反方向快速的掰 xff0c 突然的电机会往反方向高速运动 xff0c 除非电机有阻力让转速慢下来 xff0c 要不就会一直反方向运动 经过一个晚上
  • 串口仿真数据正常,不接仿真数据异常

    今天遇到一个奇怪的问题 xff0c 折腾了大半天 具体问题如下 xff1a 串口我用的DMA空闲中断接收 xff0c 接仿真器仿真时接收数据完全正确 xff0c 没有异常 但是仿真器不接的时候 xff0c 正常外部供电串口接收数据就异常了
  • 普通定时器输出互补PWM带死区

    普通定时器输出互补PWM带死区 一般来说三相半桥电路需要互补PWM驱动 xff0c 而且互补PWM需要带死区 xff0c 死区的大小跟管子的性能参数有关 公司为了省成本 xff0c 在云台上把电机驱动芯片替换成三相半桥 用6个MOS驱动无刷
  • STM32F4配置内部时钟(HSI)

    STM32F4配置内部时钟 半年多没更新了 xff0c 今天配置F4的时候内部时钟问题整了2个小时 xff0c 记录下这个坑 有些板子由于没有贴外部晶振 xff0c 所以代码运行起来的时候时钟就会出问题 xff0c 本来配置的中断是1ms实
  • 无人机加速计、气压计、GPS数据融合

    加速计 气压计 GPS数据融合 在无人机控制当中 xff0c 传感器的参与那是必不可少的 xff0c 特别是陀螺仪 xff0c 最经典的为MPU6050 xff0c 目前大部分的无人机都是用的这个器件 熟悉MPU6050的都知道 xff0c