无人机飞控之光流知识小结

news/2024/9/16 7:37:20/ 标签: 无人机, autopilot, linux, 开源软件

要完成飞行器的定位,则必须要有位置的反馈数据。在户外,我们一般使用GPS作为位置传感器,然而,在室内,GPS无法使用,要完成定位功能,可以选用光流传感器。

本讲主要介绍如何通过下视摄像头估计飞行器的平移速度,即光流传感器。

光流传感器输出什么?

首先要知道光流传感器的输出是什么?光流传感器输出的是xy两个轴向的速度数据,注意,没有位置数据,而位置反馈可以通过速度积分获得,不可避免会产生漂移,但实际通过组合导航算法的处理,也可获得较为满意的使用效果。

光流算法的原理?

总体来看,光流算法分为两步:

  1. 通过下视摄像头获得图像数据,分析图像的不同时刻的帧数据,得到像素的移动速度;

  2. 将像素的移动速度转换成飞行器的移动速度;

那如何判定图像的运动?

选择对应的特征点,通过特征点的运动来判定图像的运动。

图中可以看出,摄像头在向右运动。

选择什么样的特征点?

简单来说就是能看出运动状态的。

例:

这个特征点选择,看不出运动

这个能看出左右,但看不出上下

这个就都可以能看出所有的运动。

完成特征点选择后,就该知道如何使用他们?首先如何根据前后两个像素点估计出运动?

图中由t时刻到t+1时刻,得到两个时刻的像素坐标后,如何知道运动?

这里引出光流算法的两个假设,即认为两个时刻的运动很小亮度恒定不变(上述等式才能成立)。

将上式右侧进行泰勒展开,忽略二阶无穷小项,则可以得到

该方程有两个未知数u,v。一个方程,两个未知数,所以无法得到确定的u和v。

此时需要引入另外的约束条件,从不同的角度引入约束条件,导致了不同光流场计算方法。这里介绍其中的一种,基于梯度的方法。利用时变图像灰度(或其滤波形式)的时空微分(即时空梯度函数)来计算像素的速度矢量。

LK光流法在光流法两个基本假设的基础上,增加了一个“空间一致”的假设,即所有的相邻像素有相似的行动。也即在目标像素周围m×m的区域内,每个像素均拥有相同的光流矢量。


图中A的部分能提供很多关于估计的信息。表示图像的梯度。

以上就是Lucas Kanade Optical Flow算法。

开源PX4的光流算法则是采用块匹配法进行光流定位,具体细节可参看其源码部分:

问题:

1、LK算法的约束条件即:小速度,亮度不变以及区域一致性都是较强的假设,并不很容易得到满足。如当物体运动速度较快时,假设不成立,那么后续的假设就会有较大的偏差,使得最终求出的光流值有较大的误差。对于其改进的相关理论,这里不做过多介绍;

对于亮度不变的假设,实际情况是光流场并不一定反映了目标的实际运动情况,光源与物体发生相对运动,就会有光流产生。因此可以说光流法对光线敏感, 光线变化极易影响识别效果

2、孔径问题,在进行光流计算时,我们是选取了一个小窗口进行判定的,这个窗口的选择大小也会对结果产生影响。

上图中可以看到目标是在向右移动,但是由于“观察窗口”过小我们无法观测到边缘也在下降。邻域大小的选取会影响到最终的效果;

得到像素速度u v后如何转换?

一般第二项可不考虑,则简单来说就是考虑焦距的变化,这样处理带来的问题是没有标准单位的速度输出,不过可以在后面进行标定的处理。

那得到光流输出的数据,飞控又如何使用?

具体的光流数据,如何应用到位置估计算法里,可以参考位置估计的算法原理,本文不再赘述。

这里就讲一下光流的数据在进融合算法前,常见的需要进行哪些预处理。

1、首先是与高度的关系,光流的数据一般在低空范围内有效,比如5m以内,超过一定高度,得到的数据精度就会比较差了,同时与高度有一个线性的关系,根据高度的大小,对光流得到的机体xy速度进行缩放;

一般来说,配合光流的高度数据主要来自超声波传感器,同样可以测得低空的高度,而且较气压计而言,精度较高,得到的相对高度比较准确(气压计有漂移,受风影响大,噪音也大)。

2、其次,需要进行姿态补偿

什么意思呢?假设一种情况,飞行器在原地晃动,比如左右摆动,此时光流会输出一个速度数据出来,而实际飞行器并未有位置上的变化,所以需要将这个误判的速度进行修正掉。

如何做?

由于这个误判的速度、距离信息与姿态角的变化有关,所以我们可以用角度的变化去提前标定这个补偿。

如上代码所示,先将光流的数据进行积分,得到位移。然后用角度乘以一个系数得到补偿量,这个是需要调试的部分,同时,因为角度的变化相对较快,所以我们需要进行大概的时间同步,然后减去补偿量,得到处理后的位移数据,再微分可得到速度数据,输入给位置估计算法。

如图所示,两个曲线分别是校正前的位移flow_ori_distance_x,位移补偿量flow_angle_fix_x,调至图中两者变化一致即可。

这里,对光流数据先积分再微分的处理,基于两个考虑:

  • 有一定的滤波效果;

  • 由于光流得到的速度并不是标准单位,而位移量是可以提前标定的,比如实际飞行器移动了1m,而测量值是1.2m,则可以进行校正处理,得到标准单位的数据;

3、最后还有一个yaw的旋转补偿。这个主要针对的是光流传感器并未放在飞行器中心位置,所以在原地yaw旋转运动时,xy会不对称的输出错误的数据,而这个数据是我们不需要的(实际飞行器并未运动)。

与Z轴的角速度有关,具体实现如下:

也是需要进行实现的参数调试,调至原地转圈时,得到的光流速度为0左右即可。


http://www.ppmy.cn/news/1522426.html

相关文章

K12智慧校园云平台源码,智慧校园小程序源码,支持PC+小程序,提供丰富的API接口,支持和其他系统的融合对接

智慧校园平台是目前教育信息化领域的热点之一。随着数字化转型的加速,越来越多的学校开始寻求解决方案,以提高教育管理的效率和质量。 智慧校园电子班牌系统是一种集成信息化技术、物联网、智能化的教育管理解决方案,它在校园内实现了信息共…

四个pdf软件分享,你更爱哪一款?

如果说现在用的最多的电子文档是什么,不是Word就是PDF,所以PDF编辑器几乎成了我们日常工作中不可或缺的工具。但面对市面上琳琅满目的PDF编辑器,到底哪一款才是你的菜呢?今天,我就来和大家聊聊我用过的四款编辑器&…

【重学 MySQL】十六、算术运算符的使用

【重学 MySQL】十六、算术运算符的使用 加法 ()减法 (-)乘法 (*)除法 (/ 或 div )取模(求余数) (% 或 mod )注意事项 在 MySQL 中,算术运算符用于执行数学运算,如加法、减法、乘法、除法和取模(求余数)等。…

Html、Css3动画效果

文章目录 第九章 动画9.1 transform动画9.2 transition过渡动画9.3 定义动画 第九章 动画 9.1 transform动画 transform 2D变形 translate():平移函数,基于X、Y坐标重新定位元素的位置 scale():缩放函数,可以使任意元素对象尺…

选择服务器机柜租用要注意哪些方面?

企业在进行选择服务器租用和托管后,大多数的企业会选择租用服务器机柜来进行放置,同时机房中也有着不同款式的机柜,使计算机行业中不可或缺的用品,那我们在选择服务器机柜租用时需要注意哪些方面呢? 接下来就让我们了解…

Flask如何创建并运行数据库迁移

Flask创建并运行数据库迁移的过程是一个涉及多个步骤的操作,旨在帮助开发者在开发过程中管理数据库模式的变化,而不需要手动地删除和重建数据库表,从而避免数据丢失。以下是一个详细的步骤说明: 一、准备工作 1. 安装必要的包 …

紫色UI趣味测试小程序源码,包含多种评测

紫色UI趣味测试小程序源码,包含多种评测。 该源码里面包含了多种评测,每一种评测都包含大多小细节。 代码下载

计算机基础知识复习9.6

点对点链路:两个相邻节点通过一个链路相连,没有第三者 应用:PPP协议,常用于广域网 广播式链路:所有主机共享通信介质 应用:早期的总线以太网,无线局域网,常用于局域网 典型拓扑结…

CentOS7虚拟机下安装及使用Docker

文章目录 一,准备工作二、安装Docker三、启动Docker四、验证Docker五、使用Docker六,卸载Docker 有一个Centos7的虚拟机,想要安装个docker测试一些docker用法和熟悉命令 一,准备工作 1,使用uname -r命令检查系统内核…

2024国赛数学建模B题完整分析参考论文38页(含模型和可运行代码)

2024 高教社杯全国大学生数学建模完整分析参考论文 B 题 生产过程中的决策问题 目录 摘要 一、问题重述 二、问题分析 三、 模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码(仅供参考) 4.…

2024最新!Facebook手机版和网页版改名教程!

Facebook作为全球最大的社交平台之一,允许用户自定义名字和昵称。在Facebook更新姓名可以帮助您更好的展现账号形象。本文将为您提供详细的步骤指导,帮助您在手机APP和网页版上轻松完成Facebook改名操作。 Facebook手机版改名 打开Facebook APP并登录账号…

SAP学习笔记 - 开发02 - BTP实操流程(账号注册,BTP控制台,BTP集成开发环境搭建)

上一章讲了 BAPI的概念,以及如何调用SAP里面的既存BAPI。 SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI-CSDN博客 本章继续讲开发相关的内容,主要就是BTP的实际操作流程,比如账号注册,登录&#…

Arch - 演进中的架构

文章目录 Pre原始分布式时代的核心内容1. 背景与起源2. 分布式系统的初步探索3. 分布式计算环境(DCE)4. 技术挑战与困境5. 原始分布式时代的失败与教训6. 未来展望 单体架构的特点与应用优势缺陷单体架构与微服务架构的关系总结 SOA架构1. SOA架构及其背…

pytorch torch.matmul函数介绍

torch.matmul 是 PyTorch 中用于进行矩阵乘法的函数。它可以执行两维矩阵、向量和更高维张量之间的乘法运算,支持的运算取决于输入张量的维度。 1. 函数签名 torch.matmul(input, other, out=None)input: 左乘的张量。other: 右乘的张量。out: 可选,用于存储输出结果的张量…

热力图科普:数据可视化的利器

hello大家好,俺是没事爱瞎捣鼓又分享欲爆棚的叶同学!!! 日常闲扯 哎呀,第一天上完课,给俺的感觉是(热和惊喜),热是真热,从出租屋走到教学楼给我整的汗流浃背…

智能代码编辑器:Visual Studio Code的深度剖析

引言:编程的革新者 在软件开发的历史长河中,编辑器始终扮演着至关重要的角色。它们不仅是代码的容器,更是开发者与计算机之间沟通的桥梁。然而,随着技术的飞速发展,传统的文本编辑器已经无法满足现代开发的需求。Visu…

解决商店汽水兑换问题——利用贪心算法与循环结构

解决商店汽水兑换问题——利用贪心算法与循环结构 在某商店中,有一种特别的促销活动:三个空汽水瓶可以换一瓶汽水。而且,如果空瓶数量不足,还可以向老板借空瓶(但必须要归还)。给定初始的空瓶数量,如何计算最多可以喝到多少瓶汽水?这个问题可以通过贪心算法来高效解决…

4.1 Sensors -- onClickOutside

4.1 Sensors – onClickOutside https://vueuse.org/onClickOutside 作用 监听当前的点击是否是在目标元素之外。在弹窗和下拉框中非常有用。 官方示例 <template><div ref"target">Hello world</div><div>Outside element</div>…

linux查看网络链接的具体进程

问题 linux上有多个程序&#xff0c;都在访问同一个数据库&#xff0c;如何知道哪些网络连接&#xff0c;是由那个程序的进程发出的&#xff0c;通过netstat看不出具体是那个进程产生的链接。 解决方案1 在 Linux 上&#xff0c;如果你想查看哪个进程发起了对数据库的网络连…

加密与安全_ sm-crypto 国密算法sm2、sm3和sm4的Java库

文章目录 sm-crypto如何使用如何引入依赖 sm2获取密钥对加密解密签名验签获取椭圆曲线点 sm3sm4加密解密 sm-crypto https://github.com/antherd/sm-crypto 国密算法sm2、sm3和sm4的java版。基于js版本进行封装&#xff0c;无缝兼容js版公私钥加解密。 PS: js版&#xff1a;h…