匿名光流传感器模块V4.0版(以下称V4版),是匿名团队设计的针对无人机低空悬停的速度传感器,经过V1、V2、V3版本的使用经验以及反馈,V4版本在硬件设计、功能设计等方面进行了全面优化,大幅提升光流识别率,并改进INS融合算法,输出更稳定,并完善状态信息输出,和指令等功能。
传感器模块本体集成光流传感器和惯性传感器,可以实现光流数据和惯导数据的板级融合。
将V1版集成的激光传感器独立,增加一个单独的高度传感器接口。V1版光流受制于板载激光测距功率,测距距离短,受阳光影响大,V4版使用独立的高度传感器接口,不仅可以外接超声波测距模块,还可以外接大功率激光测距模块,可以提升测距距离,并且在室外也有良好性能,使光流传感器模块适应更多应用场景。
单独依靠光流传感器,因镜头常固定于载体,使得光流测量与载体的姿态旋转一同耦合,并不能实现良好的悬停效果,光流传感器必须与加速度、角速度、对地高度值进行综合融合计算后,得出解耦后的光流数据,用解耦后的光流数据进行控制才有可能取得良好的悬停效果。普通光流模块是直接输出原始光流数据,或者对数据进行简单融合后输出,需要用户自己进行光流数据的二次处理,因为处理难度大,所以很难达到稳定控制的效果。本传感器模块集成完善的融合算法,可实时输出融合后的光流数据,大大方便用户的使用。
普通光流模块,使用超声波进行高度测量,由于飞机飞行中产生的噪声和气流,会对超声波传感器产生很大干扰,这也是很多用户静止测量超声波传感器的测距效果很好,往往能有好几米的稳定距离,但是一旦安装到飞机上飞行中测距,其效果就大打折扣的原因。本模块可采用激光TOF测距方式,由于使用的是光学测量,可以避免飞机噪声、气流的干扰。 激光版光流模块使用北醒TF-mini(s)高性能激光测距模块,数据稳定,抗干扰能力强。
模块可以通过USB口,方便的连接上位机,并通过上位机对模块滤波参数、输出数据类型、输出频率、串口波特率等参数做配置,配置信息会存储于模块内部,掉电不丢失。
使用USB线,连接光流模块的USB口至电脑,然后打开配套匿名上位机(必须使用购买光流模块时提供的光流资料包中的上位机,其他版本上位机可能会出现配置不成功的现象)。
点击连接设置,选择HID方式,点击搜索按钮,直到搜索到标题为匿名光流模块,选中并点击确定按钮(如果已经自动搜索到匿名光流模块,则可以跳过搜索步骤。如果光流模块已经正确连接到电脑,还是无法搜索到,则可以尝试更换USB数据线、更换电脑进行尝试)。如果上位机没有自动打开连接,则点击连接设置右边的打开连接按钮,正确打开连接后,可看到RX接收计数开始增长,此时表示模块已经正确连接。
使用地面站的波形显示功能,可以方便的观察光流数据。打开波形显示界面,右键波形名称,选择OF_DX_0、OF_DY_0,并勾选波形名称,即可观察原始光流数据波形。同样,设置OF_DX_1、OF_DY_1即可显示解耦后的数据,设置OF_DX_2、OF_DY_2即可显示融合后的光流数据。(波形选择中OF开头的数据为光流模块输出的数据,观察某项数据前,要确定已打开该数据帧的输出使能)
至此,您已经可以按默认配置使用匿名光流模块了,特别是使用匿名飞控进行配套使用的,使用默认配置即可实现良好效果。
通过配套上位机可以进行光流模块的所有功能配置。
模块的通信协议可以在匿名地面站>帮助界面,点击通信协议按钮打开(电脑需安装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即可。
校验字节计算
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; //校验失败
帧头 | 目标地址 | 功能码 | 数据长度 | 数据内容 | 和校验 | 附加校验 |
---|---|---|---|---|---|---|
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 |
DATA区域内容(MODE 1):
数据类型 | U8 | U8 | S16 | S16 | U8 |
---|---|---|---|---|---|
数据内容 | MODE=1 | STATE | DX_1 | DY_1 | QUALITY |
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 |
数据物理意义:
帧头 | 目标地址 | 功能码 | 数据长度 | 数据内容 | 和校验 | 附加校验 |
---|---|---|---|---|---|---|
HEAD | D_ADDR | ID | LEN | DATA | SC | AC |
0xAA | 0xFF | 0x34 | 7 | 格式如下 | 程序计算 | 程序计算 |
DATA区域内容:
数据类型 | U8 | U16 | U32 |
---|---|---|---|
数据内容 | DIRECTION | ANGLE | DIST |
帧头 | 目标地址 | 功能码 | 数据长度 | 数据内容 | 和校验 | 附加校验 |
---|---|---|---|---|---|---|
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 |
帧头 | 目标地址 | 功能码 | 数据长度 | 数据内容 | 和校验 | 附加校验 |
---|---|---|---|---|---|---|
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 |