匿名光流传感器
匿名光流传感器模块V3.4版(以下称V3版),是匿名团队设计的针对无人机低空悬停的速度传感器,经过V1、V2版本的使用经验以及反馈,V3版本在硬件设计、功能设计等方面进行了全面优化,大幅提升光流识别率,并改进INS融合算法,输出更稳定,并完善状态信息输出,和指令等功能。
模块介绍
融合设计
传感器模块本体集成光流传感器和惯性传感器,可以实现光流数据和惯导数据的板级融合。
将V1版集成的激光传感器独立,增加一个单独的高度传感器接口。V1版光流受制于板载激光测距功率,测距距离短,受阳光影响大,V3版使用独立的高度传感器接口,不仅可以外接超声波测距模块,还可以外接大功率激光测距模块,可以提升测距距离,并且在室外也有良好性能,使光流传感器模块适应更多应用场景。
模块级数据融合
单独依靠光流传感器,因镜头常固定于载体,使得光流测量与载体的姿态旋转一同耦合,并不能实现良好的悬停效果,光流传感器必须与加速度、角速度、对地高度值进行综合融合计算后,得出解耦后的光流数据,用解耦后的光流数据进行控制才有可能取得良好的悬停效果。普通光流模块是直接输出原始光流数据,或者对数据进行简单融合后输出,需要用户自己进行光流数据的二次处理,因为处理难度大,所以很难达到稳定控制的效果。本传感器模块集成完善的融合算法,可实时输出融合后的光流数据,大大方便用户的使用。
激光TOF测距
普通光流模块,使用超声波进行高度测量,由于飞机飞行中产生的噪声和气流,会对超声波传感器产生很大干扰,这也是很多用户静止测量超声波传感器的测距效果很好,往往能有好几米的稳定距离,但是一旦安装到飞机上飞行中测距,其效果就大打折扣的原因。本模块可采用激光TOF测距方式,由于使用的是光学测量,可以避免飞机噪声、气流的干扰。 激光版光流模块使用北醒TF-mini(s)高性能激光测距模块,数据稳定,抗干扰能力强。
方便的配置模式
模块可以通过USB口,方便的连接上位机,并通过上位机对模块滤波参数、输出数据类型、输出频率、串口波特率等参数做配置,配置信息会存储于模块内部,掉电不丢失。
模块图片
激光测距版
超声波测距版
模块使用流程
1硬件介绍
2安装方法
- 传感器模块安装于飞行器底部,尽量在飞行器中心位置,模块距离地面需要留有一定距离,一是防止模块直接接触地面造成损坏,二是防止检测不到有效图像,造成起飞时模块无法立即进入正常工作状态。(激光测距模块应距离地面10cm以上,否则因高度数据无效导致光流数据无效)
- 模块不要使用扎带等方式固定,建议使用泡沫海绵双面胶,因传感器模块内部有惯性测量单元,有条件的可以安装减震板,让模块的工作状态更佳。
- 模块镜头朝下水平安装,USB插座朝向飞机前进方向或者左侧、右侧、后侧的任一方向。(V3.2以后的固件有6面校准,安装好后通过6面校准即可校准模块的安装角度)
- 模块串口采用4P插座,如上图, VCC必须为5V供电,大家在使用时,务必注意接线顺序,因模块导线具有方向性,接入任何飞控前,需要确认串口线序是否正确,如果有交叉,请调整线序后再接入串口,否则有烧坏模块的风险。(模块串口丝印TX表示本侧为TX,接对侧的RX)
- 使用串口4p导线连接飞控对应串口和光流模块的FC接口。
- 将配套测距传感器连接至光流模块的ALT接口。
3如何连接上位机
使用USB线,连接光流模块的USB口至电脑,然后打开配套匿名上位机(必须使用购买光流模块时提供的光流资料包中的上位机,其他版本上位机可能会出现配置不成功的现象)。
点击连接设置,选择HID方式,点击搜索按钮,直到搜索到标题为匿名光流模块,选中并点击确定按钮(如果已经自动搜索到匿名光流模块,则可以跳过搜索步骤。如果光流模块已经正确连接到电脑,还是无法搜索到,则可以尝试更换USB数据线、更换电脑进行尝试)。如果上位机没有自动打开连接,则点击连接设置右边的打开连接按钮,正确打开连接后,可看到RX接收计数开始增长,此时表示模块已经正确连接。
4光流校准
5光流数据显示
使用地面站的波形显示功能,可以方便的观察光流数据。打开波形显示界面,右键波形名称,选择OF_DX_0、OF_DY_0,并勾选波形名称,即可观察原始光流数据波形。同样,设置OF_DX_1、OF_DY_1即可显示解耦后的数据,设置OF_DX_2、OF_DY_2即可显示融合后的光流数据。(波形选择中OF开头的数据为光流模块输出的数据,观察某项数据前,要确定已打开该数据帧的输出使能)
至此,您已经可以按默认配置使用匿名光流模块了,特别是使用匿名飞控进行配套使用的,使用默认配置即可实现良好效果。
进阶使用介绍
上位机配置功能
通过配套上位机可以进行光流模块的所有功能配置。
- 光流数据
- 可以选择输出三种光流数据,第一种是原始的光流数据,不加处理,直接将光流传感器的视觉数据输出。第二种是综合解耦后的光流数据,解耦后的数据指示地面速度。第三种为融合数据,指示更加准确的地面速度,更加适用于飞行器控制,省去用户自行解耦的开发难度。其中前两种频率固定为50hz,第三种输出频率可调。
- 融合参数:调节融合比例,参数越大,跟随原始数据越快,噪声越大。
- 高度数据
- 输出频率大约30hz,高度数据为激光TOF或超声波测距数据。输出频率取决于传感器数据频率。
- 惯性数据
- 模块可以输出滤波后的加速度、陀螺仪采样值。
- 滤波参数:参数越大滤波越少。
- 姿态数据
- 模块可以输出四元数格式的姿态角数据。模块内置完善的姿态解算算法,姿态数据稳定。
- 滤波参数:调节融合比例,参数越大,跟随加速度计数据越快,噪声越大。
- 串口波特率
- 推荐使用高于500000的波特率,因为模块可以实时输出多种信息,信息量较大,波特率太低会造成串口数据阻塞,影响正常通信。同时尽量关闭不需要的数据输出功能,或者合理降低数据输出频率,可以降低对串口波特率的要求。
- XYZ轴偏移
- 本设置不推荐新手使用,新手建议直接将XYZ轴偏移设置为0,也会有很好的效果。本功能只推荐给已经熟练使用光流模块并且已经实现光流稳定定点的用户,用以再次提升光流定点效果。
- 飞行器的旋转中心应为飞机的重心,一般飞机为对称结构,所以重心在水平面的位置容易找到,就是飞行器每个电机为顶点形成的多边形的中心,重心的高度也就是在Z轴的位置,不好确定,这里定义为所有电机形成的平面到飞机机架下板之间的中点。由此确定飞机的重心也就是旋转中心。
- 旋转中心在光流模块坐标系中的位置,即为光流模块的XYZ偏移量,单位为厘米。
- 这里举例说明,一般光流模块安装于飞机下方,那么飞机的旋转中心就在光流模块的Z轴正半轴,所以Z轴偏移是正值,等于光流模块镜头到旋转中心的高度差。旋转中心若在模块X轴正方向,则X轴偏移为正,数值等于飞机旋转中心到模块镜头的水平距离在模块X轴的投影距离。旋转中心若在模块Y轴负方向,则Y轴偏移为负,数值等于飞机旋转中心到模块镜头的水平距离在模块Y轴的投影距离。
- 模块坐标系
- 模块无默认坐标系,只需要镜头向下安装,在完成惯性校准以后,机头为x正,左侧为y正,天为z正。
通信协议
模块的通信协议可以在匿名地面站>帮助界面,点击通信协议按钮打开(电脑需安装Office)。
串口配置:8位数据,1个停止位,无奇偶校验,无流控。波特率默认500k(可在上位机配置)。
帧格式介绍
通信帧格式如下:
帧头 | 目标地址 | 功能码 | 数据长度 | 数据内容 | 和校验 | 附加校验 |
---|---|---|---|---|---|---|
HEAD | D_ADDR | ID | LEN | DATA | SUM CHECK | ADD CHECK |
1 Byte | 1 Byte | 1 Byte | 1 Byte | n Byte | 1 Byte | 1 Byte |
0xAA(固定值) | 表示本帧数据发送到哪个设备,参考硬件地址定义 | 表示本帧数据的功能 | 表示数据内容字段的长度 | 具体数据内容,n=数据长度 | 计算方法附后 | 计算方法附后 |
DATA数据内容中的数据,采用小端模式,低字节在前,高字节在后。
为了提高数据传输的效率,当有浮点数类型数据需要传输时,根据数据类型的特点,适当截取小数点后固定几位,比如飞控姿态数据,保留角度的小数点后两位即可,比如经纬度信息,保留小数点后7位即可,然后通过小数点移动(扩大10的n次方),将浮点数转化成整数类型进行传输,可缩短数据长度,并且避免浮点数传输时发生异常,解析成非法浮点数。类似数据会在协议中著名,如A*100,就代表将数据A只保留两位小数,乘以100进行传输,用户使用时将收到的数据除以100即可。
- 和校验SUM CHECK计算方法:
- 从帧头0xAA字节开始,一直到DATA区结束,对每一字节进行累加操作,只取低8位。
- 附加校验ADD CHECK计算方法:
- 计算和校验时,每进行一字节的加法运算,同时进行一次SUM CHECK的累加操作,只取低8位。
- 校验计算示例:
- 假设数据帧缓存为data_buf数组,0xAA存放于数组起始位置,那么data_buf[3]存放的是数据长度,校验程序如下:
校验字节计算
U8 sumcheck = 0; U8 addcheck = 0; For(u8 i=0; I < (data_buf[3]+4); i++) { sumcheck += data_buf[i]; //从帧头开始,对每一字节进行求和,直到DATA区结束 addcheck += sumcheck; //每一字节的求和操作,进行一次sumcheck的累加 } //如果计算出的sumcheck和addcheck和接收到的check数据相等,代表校验通过,反之数据有误 if(sumcheck == data_buf[data_buf[3]+4] && addcheck == data_buf[data_buf[3]+5]) return true; //校验通过 else return false; //校验失败
1:ID:0x51:匿名光流数据
帧头 | 目标地址 | 功能码 | 数据长度 | 数据内容 | 和校验 | 附加校验 |
---|---|---|---|---|---|---|
HEAD | D_ADDR | ID | LEN | DATA | SC | AC |
0xAA | 0xFF | 0x51 | 5~11 | 格式如下 | 程序计算 | 程序计算 |
DATA区域内容(MODE 0):
数据类型 | U8 | U8 | S8 | S8 | U8 |
---|---|---|---|---|---|
数据内容 | MODE=0 | STATE | DX_0 | DY_0 | QUALITY |
- MODE:0表示本帧为原始的光流数据
- STATE:状态标记位, 0:无效,1:有效。
- DX_0、DY_0:X、Y轴的光流信息,对应移动的速度(像素移动速率,单位:像素/20毫秒)
- QUALITY:光流数据质量,数值越大,表示光流数据质量越好(0-255),仅供参考。
DATA区域内容(MODE 1):
数据类型 | U8 | U8 | S16 | S16 | U8 |
---|---|---|---|---|---|
数据内容 | MODE=1 | STATE | DX_1 | DY_1 | QUALITY |
- MODE:1表示本帧为融合的光流数据
- STATE:状态标记位, 0:无效,1:有效。
- DX_1、DY_1:X、Y轴的光流信息,对应移动的速度(地面速度,单位:厘米/秒)
- QUALITY:光流数据质量,数值越大,表示光流数据质量越好(0-255),仅供参考。
- 注意:本组数据仅在高度传感器数据有效/陀螺仪无异常时有效。
DATA区域内容(MODE 2):
数据类型 | U8 | U8 | S16 | S16 | S16 | S16 | S16 | S16 | U8 |
---|---|---|---|---|---|---|---|---|---|
数据内容 | MODE=2 | STATE | DX_2 | DY_2 | DX_FIX | DY_FIX | INTEG_X | INTEG_Y | QUALITY |
- MODE:2表示本帧为惯导融合的光流数据
- STATE:状态标记位, 0:无效,1:有效。
- DX_2、DY_2:X、Y轴的光流信息,对应融合的移动的速度(地面速度,单位:厘米/秒);
- DX_FIX、DY_FIX:修正后的X、Y轴的移动速度,适用于积分计算(地面速度,单位:厘米/秒);
- INTEG_X、INTEG_Y:X、Y轴的速度积分值(单纯积分,仅供参考,单位厘米,-32768~+32767 循环)。
- QUALITY:光流数据质量,数值越大,表示光流数据质量越好(0-255),仅供参考。
- 注意:本组数据仅在光流融合有效、高度传感器数据有效/陀螺仪无异常时有效。
数据物理意义:
- 原始光流DX_0、DY_0数据:
- 数据为像素速度。
- 数据转地面速度简易计算公式(没有去掉旋转耦合):
- 移动速度(厘米/秒)= 光流原始数据 * 0.065 *相对高度(景深,单位厘米) (厘米/秒)。
- 解耦后的光流DX_1.DY_1数据:
- 直接为地面速度数据,单位为厘米/秒,噪声大,只能做速度观测用。
- 融合后的光流DX2、DY2数据:
- 直接为地面速度数据,单位为厘米/秒,噪声小,有零偏,适合做速度环控制,积分会漂移。
- DX_FIX、DY_FIX数据:
- 积分修正后的速度数据,单位为厘米/秒,噪声稍大,积分后偏移小,适合用于积分计算。
2:ID:0x34:通用测距传感器数据(捷联载体测量型)
帧头 | 目标地址 | 功能码 | 数据长度 | 数据内容 | 和校验 | 附加校验 |
---|---|---|---|---|---|---|
HEAD | D_ADDR | ID | LEN | DATA | SC | AC |
0xAA | 0xFF | 0x34 | 7 | 格式如下 | 程序计算 | 程序计算 |
DATA区域内容:
数据类型 | U8 | U16 | U32 |
---|---|---|---|
数据内容 | DIRECTION | ANGLE | DIST |
- DIRECTION:安装方向,0:向下;1:向上;2:向前;3:向后;4:向左;5:向右。恒为0
- ANGLE:角度信息,恒为0。
- DIST:距离信息,单位CM,0xFFFFFFFF表示数据无效。
3:ID:0x01:惯性传感器数据
帧头 | 目标地址 | 功能码 | 数据长度 | 数据内容 | 和校验 | 附加校验 |
---|---|---|---|---|---|---|
HEAD | D_ADDR | ID | LEN | DATA | SC | AC |
0xAA | 0xFF | 0x01 | 13 | 格式如下 | 程序计算 | 程序计算 |
DATA区域内容:
数据类型 | S16 | S16 | S16 | S16 | S16 | S16 | U8 |
---|---|---|---|---|---|---|---|
数据内容 | ACC_X | ACC_Y | ACC_Z | GYR_X | GYR_Y | GYR_Z | SHOCK_STA |
- ACC、GYR:依次为加速度(量程+-16g,16位整形)、陀螺仪传感器数据(量程+-2000dps,16位整形)。
- SHOCK_STA:暂无,恒为0。
4:ID:0x04:飞控姿态:四元数格式
帧头 | 目标地址 | 功能码 | 数据长度 | 数据内容 | 和校验 | 附加校验 |
---|---|---|---|---|---|---|
HEAD | D_ADDR | ID | LEN | DATA | SC | AC |
0xAA | 0xFF | 0x04 | 9 | 格式如下 | 程序计算 | 程序计算 |
DATA区域内容:
数据类型 | S16 | S16 | S16 | S16 | U8 |
---|---|---|---|---|---|
数据内容 | V0*10000 | V1*10000 | V2*10000 | V3*10000 | FUSION _STA |
- V0、V1、V2、V3:四元数,传输时扩大10000倍。
- FUSION _STA:暂无,恒为0。
灯光介绍
- 模块故障类提示:
- 红色闪烁,亮灭各0.2秒为一个循环,长间隔1秒
- 光流传感器错误:2闪
- 惯性传感器错误:3闪
- 高度传感器错误:4闪
- 开机灯光:
- 红绿蓝依次闪亮0.33秒
- BOOT模式灯光:
- 等待连接:蓝色快闪,亮0.1,灭0.1
- 连接成功:蓝色慢闪,亮0.5,灭0.5
- 下载过程,绿色快闪,亮0.1,灭0.1
- 正常运行
- 绿色呼吸
- 需要校准传感器
- 惯性传感器需要校准:蓝灯亮0.2,灭0.2,循环2次,间隔1秒
- 陀螺仪校准中
- 白灯快闪,亮0.1,灭0.1
注意事项、模块小知识
- 模块上电后,需保持静止,待LED正常闪烁后,表示模块初始化完成,方可移动、使用。
- 模块请使用5V供电,否则具有烧坏模块、运行不正常的风险,较低的电源纹波可以使模块有更好的性能。
- 若加速度计或者陀螺仪没有良好校准,融合后的光流数据可能偏离0点,此时用户需要综合原始光流数据进行判断或者重新校准传感器。
- 由于光流本身为非绝对定位传感器,其输出的为水平速度,长时间积分会有误差累积,属于正常现象。
- 光流模块受光照影响较大,请尽量在光线充足的环境使用。
- 光流模块的原理是通过摄像头检测地面纹理特征点的移动,所以地面纹理越明显,使用效果越好。
- 北醒tf-minis激光模块在10cm内有测距死区,故在10cm内测距输出均为10cm,若使用大功率激光模块,请在起飞时,尽量快速的起飞到10cm以上,避开测距死区。