迷你光流使用说明

2023-05-16

为了让你有兴趣往下学习,先上个定点悬停效果视频给你欣赏一下吧!

点击打开视频链接

首先,简单介绍一下我使用的这款光流传感器。长宽高:14x11x5mm,重量约0.6克,工作电流小于10ma。先来一睹它的芳容:

实物测量图:

 

然后,简单介绍一下它的通信接口和协议:

废话不多说,先把它接到飞控上吧。我是这样接的,用电烙铁把三根杜邦线焊到模块上,然后直接插到飞控的串口即可。注意:输入电压是2.0~3.6V,电压低了模块不能正常工作,高了可能会损坏模块。

一、数据的接收和解析,这点就不详解了,根据通信协议编写代码就行,比较简单直接上代码吧。


void Mini_Flow_Receive(u8 data)
{
	static u8 RxBuffer[32];
	static u8 _data_cnt = 0;
	static u8 state = 0;
	
	static u8 fault_cnt;
	u8 sum = 0;
	
	switch(state)
	{
		case 0:
			if(data==0xFE)
			{
				state=1;
				RxBuffer[_data_cnt++]=data;
			}else state = 0;
		break;
			
		case 1:
			if(data==0x04)
			{
				state=2;
				RxBuffer[_data_cnt++]=data;
			}else state = 0;
		break;
			
		case 2:
			RxBuffer[_data_cnt++]=data;
		
			if(_data_cnt==9)
			{
				state = 0;
				_data_cnt = 0;
				
				sum =  (RxBuffer[2] + RxBuffer[3] + RxBuffer[4] + RxBuffer[5]);
				
				if(sum == RxBuffer[6]) //和校验
				{
					mini.ssi_cnt++;
					
					//读取原始数据
					mini.flow_x = ( (s16)(*(RxBuffer+3)<<8)|*(RxBuffer+2) );
					mini.flow_y = ( (s16)(*(RxBuffer+5)<<8)|*(RxBuffer+4) );
					mini.qual   = *(RxBuffer+7);
					
					//累加求位移
					mini.flow_x_i += mini.flow_x;
					mini.flow_y_i += mini.flow_y;
					
				}
			}
		break;
			
		default:
			state = 0;
			_data_cnt = 0;
		break;
	}
}

先来看看光流输出的原始数据曲线吧,测试条件:模块离桌面20厘米左右,镜头正对着桌面,手持来回平移,数据输出范围大概在+-30:

二、光流数据的处理(由于这个光流输出的数据是没有经过惯性融合的,所以必须进行处理才能使用)。

第1步,对积分位移进行一个简单的低通滤波。

        pixel_flow.fix_x_i += (mini.flow_x_i - pixel_flow.fix_x_i) *0.2;
        pixel_flow.fix_y_i += (mini.flow_y_i - pixel_flow.fix_y_i) *0.2;

第2步,用姿态角去补偿积分位移(#define  angle_to_rad  0.0174f  //角度转弧度)。

	pixel_flow.ang_x += (600.0f*tan(imu_data.rol*angle_to_rad) - pixel_flow.ang_x) *0.2;
	pixel_flow.ang_y += (600.0f*tan(imu_data.pit*angle_to_rad) - pixel_flow.ang_y) *0.2;
	
	pixel_flow.out_x_i = pixel_flow.fix_x_i - pixel_flow.ang_x;
	pixel_flow.out_y_i = pixel_flow.fix_y_i - pixel_flow.ang_y;

注意:600.0f是一个重要参数!需要慢慢调,调到怎么样才算合格呢?

当飞机在原地摇晃时,pixel_flow.fix_x_i 和 pixel_flow.ang_x 的曲线变化幅度几乎一样即可,两者相减互相抵消,达到补偿的作用。或者这么说:pixel_flow.fix_y_i 和 pixel_flow.ang_y 的曲线变化幅度几乎一样即可(特别注意,飞机在原地晃时积分位移数据会缓慢地增大或者减小,这是积分飘移现象,是正常的)。

飞机在原地摇晃时,pixel_flow.fix_x_i 和 pixel_flow.ang_x 的曲线图:

用姿态角去补偿积分位移的作用是:当飞机在原地摇晃时,使积分位移尽量保持不变。为什么要使积分位移尽量保持不变呢?很简单,因为飞机在在原地摇晃,位移没变。

飞机在原地摇晃时,姿态角补偿后的积分位移曲线图:

第3步,对积分位移进行微分处理,得到速度。

	//求微分速度
	pixel_flow.x = (pixel_flow.out_x_i - pixel_flow.out_x_i_o)/dT;	pixel_flow.out_x_i_o = pixel_flow.out_x_i;
	pixel_flow.y = (pixel_flow.out_y_i - pixel_flow.out_y_i_o)/dT;	pixel_flow.out_y_i_o = pixel_flow.out_y_i;
	
	//低通滤波
	pixel_flow.fix_x += ( pixel_flow.x - pixel_flow.fix_x ) * 0.1f;
	pixel_flow.fix_y += ( pixel_flow.y - pixel_flow.fix_y ) * 0.1f;

 

有的人看到这里可能会迷惑了,为什么要微分求速度而不是直接使用光流的输出作为速度呢?原因是:这个光流模块的输出的数据严格的说不是速度,而是连续两帧画面的相对位移,单位是像素。

飞机在一个水平面内来回平移的速度曲线图:

第4步,把数据单位转换为厘米。

//式中HIGH为实际高度,单位:米
float cpi = (HIGH / 11.914f) *2.54f ;

//积分位移单位转换为:厘米
loc_x = pixel_flow.out_x_i * cpi;
loc_y = pixel_flow.out_y_i * cpi;

//微分速度单位转换为:厘米/秒
loc_xs = pixel_flow.fix_x * cpi;
loc_ys = pixel_flow.fix_y * cpi;

至此,光流数据的处理算是基本完成了,有了积分位移微分速度这两个参数,就可以进行水平面内的位置环和速度环的串级PID控制了。


最后给大家提供一个光流调试助手,把迷你光流模块通过串口模块连接到电脑上面后,打开这个上位机即可查看光流模块数据,还有动态显示的功能,非常方便!通信协议与本文所述一致。

光流调试助手下载地址:https://yunpan.360.cn/surl_ySbubreVPka

 

 

 

 

 

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

迷你光流使用说明 的相关文章

  • 车辆姿态角(Euler角)Pitch、Yaw、Roll 的设定

    首先申明 xff1a 此坐标系是针对车辆而设定的 xff0c 对于无人机来说是不同的 pitch xff1a 俯仰角 xff0c pitchAngleC2W orientation radian Y yaw xff1a 航向角 xff0c
  • Docker(四)----Docker-Compose 详解

    1 什么是Docker Compose Compose项目来源于之前的fig项目 xff0c 使用python语言编写 与docker swarm配合度很高 Compose 是 Docker 容器进行编排的工具 xff0c 定义和运行多容器
  • 转贴:ERP实施过程中的40个问题

    笔者在多年的实践中 xff0c 结合自身经验和多年的理论积累 xff0c 总结出有关ERP 实施的最关键的39 个问题 xff0c 以问答的形式 xff0c 让您在最短的时间内对ERP 实施有一个全面而客观的认识 xff0c 以免陷入日新月
  • VS Code 常用设置集合

    常用设置 xff08 setting json xff09 34 editor parameterHints enabled 34 true 开启参数预览窗口 设置字体颜色 34 editor semanticTokenColorCusto
  • Arduino--LCD1602(IIC)

    xff08 1 xff09 简介 前篇文章介绍了LCD1602的四位数据线控制方法 xff1a https blog csdn net u011816009 article details 106573622 但是该方法还是需要较多的IO口
  • Px4 ULog文件详解

    Px4 ULog文件详解 简介数据类型文件组织文件头定义段消息标记位消息格式定义消息信息消息复合信息消息参数消息 数据段订阅消息取消订阅消息日志数据消息字符串消息同步消息丢失 附录 简介 ULog 是用于记录数据的文件格式 xff0c 该格
  • 开发日记(一)

    这是自己编程第二天 xff0c 自己解决了好几个问题 xff0c 觉得很有成就感 xff0c 决定写下以后开发中遇到的问题 1 在多个Activity中传递数据 xff0c 之前只学过绑定基本的putExtra xff0c 今天上网一搜 x
  • 源程序生成控制流图和du-path

    最近上 源代码分析技术 这个课 xff0c 老师让写一个程序 xff0c 由一段c代码 xff0c 生成生成控制流图和du path xff0c 控制流图不用解释了 xff0c 说一下du path xff0c 这个术语是针对变量来说的 x
  • pandas使用笔记

    DataFrame使用笔记 dates 61 pd date range span class hljs string 39 20160728 39 span periods 61 span class hljs number 6 span
  • keras

    大神笔记 xff0c 转载自http blog csdn net u012162613 article details 45397033 Keras简介 Keras是基于Theano的一个深度学习框架 xff0c 它的设计参考了Torch
  • gensim similarity计算文档相似度

    向量空间模型计算文档集合相似性 0 将原始输入的词转换为ID xff0c 词的id表示法简单易用 xff0c 但是无法预测未登记词 xff0c 难以挖掘词关系 xff1b 词汇鸿沟 1 任意两个词之间是独立的 xff0c 无法通过词的ID来
  • doc2vec计算文档相似度

    doc2vec是基于word2vec的 xff0c word2vec对于计算两个词语的相似度效率比较好 xff0c 修改了word2vec中的cbow和skip gram模型 xff0c paragraph vector直接得到doc向量
  • 多维中维度的理解

    项目有段时间了 xff0c 今天需要做一个需求查询调研 必须要照顾楼下业务人员理解的方式吧多维度表述清楚 还真不好讲 xff1a 原以为维度就是一个基准点 xff0c 一个看事情的角度 xff0c 静下来想 xff0c 要描述出来好像还真不
  • Spring注解

    注解介绍 注解有两个作用 xff1a 标注和注入 标注 xff1a 类路径下自动扫描 xff0c 减少在xml中配置bean 例如 64 Component 64 Service注入 xff1a 自动装配 xff0c 需要类的地方直接加注解
  • akka基础

    基本概念消息传递API 通用API消息传递方式 Future机制Actor生命周期处理状态和错误 监督kill actor生命周期监控和DeathWatch安全重启状态 纵向扩展 Router调度方式使用策略 横向扩展 订阅集群事件启动 退
  • ROS学习(9)自定义移动机器人模型Gazebo仿真

    文章目录 前言一 gazebo启动二 创建编译功能包三 更新xacro文件1 更新robot base xacro2 更新robot camera xacro3 更新robot lidar xacro4 更新robot xacro 四 更新
  • ROS学习(11)使用ROS创建地图

    文章目录 前言一 创建编译功能包二 更新启动文件三 启动模型四 保存地图五 加载地图六 总结 前言 创建地图是一件比较复杂的工作 xff0c ROS利用map server地图服务器 xff0c 借助激光雷达和机器人的里程信息来完成这项工作
  • ROS学习(12)使用ROS创建自定义地图

    文章目录 前言一 新建环境二 创建编译功能包三 新建 world文件四 新建world启动文件五 更新启动文件六 建图 前言 上一篇使用的是柳树车库环境 xff0c 实现完整建图工作比较复杂 xff0c 所以准备新建一个简单点的环境 xff
  • ROS学习(13)自定义机器人的ROS导航

    文章目录 前言一 创建编译功能包二 代价地图配置三 基本局部规划器配置四 创建导航包的启动文件五 运行启动文件六 为导航功能包集设置rviz七 导航仿真 前言 上一篇针对我家户型 xff0c 完成了自定义环境的建图工作 本篇主要完成对导航功

随机推荐

  • ROS学习(开篇)Ubuntu16.04安装ROS Kinetic详细教程

    文章目录 前言一 添加ROS软件源 xff08 sources list xff09 二 添加密钥三 更新apt功能包列表四 安装ROS五 初始化 rosdep六 将ROS环境变量添加到 bashrc文件中七 安装rosinstall等工具
  • ROS学习(14)自定义四轮小车的ROS导航

    文章目录 前言一 创建编译功能包二 代价地图配置三 基本局部规划器配置四 创建导航包的启动文件五 导航仿真六 总结 前言 本篇为自定义四轮小车的ROS导航仿真 xff0c 与前面自定义机器人导航类似 该篇源码非原创 xff0c 特此说明 x
  • ROS学习(24)plugin插件

    文章目录 前言一 工作原理二 具体实现1 创建基类2 创建plugin类3 注册插件4 编译插件的动态链接库5 将插件加入ROS6 调用插件7 运行效果 前言 ROS中的插件就是可以动态加载的扩展功能类 ROS中的pluginlib功能包提
  • ROS学习(28)Web GUI

    文章目录 前言一 rosbridge suite元功能包二 roslibjs ros2djs ros3djs功能包三 tf2 web republisher功能包四 创建web应用五 使用web浏览器控制机器人 前言 ROS Web too
  • 参看了别人写的面试讲解

    转帖 ERP顾问的面试 新的一年就要开始了 xff0c 有不少的同行估计都在想着跳槽了 今天我就把自己的当面试官的感受给大家谈谈 xff0c 也许 xff0c 从中 xff0c 你可以掌握 ERP 实施顾问面试的技巧 在来年 xff0c 当
  • ROS2学习(1)ROS2简述

    文章目录 前言一 ROS1存在的问题二 什么是ROS21 ROS2的设计目标2 ROS2的系统架构3 ROS2的关键中间件 DDS4 ROS2中的通信模型5 ROS2的编译系统 前言 虽然众多开发者对ROS1进行了很多开发建设 xff0c
  • Qt之实现自定义控件的两种方式——提升法

    文章目录 前言一 需求二 实现1 新建项目2 自定义控件类3 提升4 效果 前言 可以通过Qt设计师拖拽原生控件进行界面开发 xff0c 但有时候原生控件不能满足项目需求 此时 xff0c 就需要实现自定义控件 Qt中实现自定义控件 xff
  • Qt之实现自定义控件的两种方式——插件法

    文章目录 前言一 需求二 实现1 新建项目2 自定义控件类3 编译插件4 拖拽使用 xff08 1 xff09 在designer exe中直接拖拽 xff08 2 xff09 在Qt Creator的设计师中直接拖拽 5 在项目中正常使用
  • Qt自定义控件——动态圆形进度条

    文章目录 前言一 需求二 实现1 自定义控件类2 提升3 效果 前言 本篇通过提升法实现一个动态圆形进度条 一 需求 自定义实现一个动态圆形进度条 xff0c 支持设置进度条颜色 目标值背景色 外边框背景色 中央圆环背景色 旋转角度及大小自
  • linux下可视化git工具git-cola安装与使用(SSH方式)

    一 git cola为何物 很多小伙伴 xff0c 特别喜欢使用TortoiseGit xff0c 该软件是做什么的 xff0c 就不用多说吧 奈何 xff0c TortoiseGit只有windows版 xff0c 这让在linux上开发
  • 智能优化算法:布谷鸟搜索算法-附代码

    智能优化算法 xff1a 布谷鸟搜索算法 附代码 文章目录 智能优化算法 xff1a 布谷鸟搜索算法 附代码1 算法原理2 算法结果3 参考文献4 Matlab代码 摘要 xff1a 谷鸟搜索算法 cuckoo search cs xff0
  • 基于布谷鸟优化的BP神经网络(预测应用) - 附代码

    基于布谷鸟优化的BP神经网络 xff08 预测应用 xff09 附代码 文章目录 基于布谷鸟优化的BP神经网络 xff08 预测应用 xff09 附代码1 数据介绍3 CS优化BP神经网络3 1 BP神经网络参数设置3 2 布谷鸟算法应用
  • 基于粒子群优化的BP神经网络(分类应用) - 附代码

    基于粒子群优化的BP神经网络 xff08 分类应用 xff09 附代码 文章目录 基于粒子群优化的BP神经网络 xff08 分类应用 xff09 附代码1 鸢尾花iris数据介绍2 数据集整理3 粒子群优化BP神经网络3 1 BP神经网络参
  • Arm Keil MDK v5.30版本官宣,快来下载!

    近日 xff0c Arm很高兴地宣布发布Arm Keil MDK v5 30 此版本新增了对Cortex M55处理器和CMSIS Build的支持 xff0c 更新包括Arm Compiler 6 14 xff0c CMSIS 5 7 0
  • ubuntu下访问串口

    前言 最近准备将windows上自动瞄准的程序移植到linux xff0c 第一步准备调试一下ubuntu下的串口 在网上搜到一个串口库 xff0c 于是就拿来调用 xff0c 最后调试成功 过程如下 xff1a 过程 1 下载Serial
  • 热备笔记实验

    早上突然断电 本来笔记本的插头就忘记插了 xff0c 电池没用多久就熄火 最纳闷的是接入电源后本机数据库竟然挂掉了 xff0c 嘿嘿 xff0c 正好试一试前几天应用的热备回复 以下是我的全程 C Documents and Setting
  • Android学习之AIDL添加Service权限

    参考 Android开发艺术探索 xff0c 书中提供了两种方法 第一种方法 xff1a 在onBind中验证 在服务端的AndroidManifest添加自定义权限 lt permission android name 61 span c
  • ADRC(自抗扰控制器)技术附Matlab代码框架

    自抗扰控制器 Auto Active Disturbances Rejec ion Controller ADRC 是韩京清学者提出的 xff0c 是一种继PID控制器后的一种新型的实用的控制技术 它不是一种独立的技术 xff0c 可以理解
  • git视频及对初学者的学习建议

    http herry2013git blog 163 com blog static 21956801120144810133569 http herry2013git blog 163 com blog static 2195680112
  • 迷你光流使用说明

    为了让你有兴趣往下学习 xff0c 先上个定点悬停效果视频给你欣赏一下吧 xff01 点击打开视频链接 首先 xff0c 简单介绍一下我使用的这款光流传感器 长宽高 xff1a 14x11x5mm xff0c 重量约0 6克 xff0c 工