|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
COCOFLY教程 ——疯壳·无人机·系列 串口(光流数据获取)
N, f: ^; y! X! G3 x& m4 {
9 }4 D: g( H8 E8 H
; `) j! s- l; U( L; C0 z' _
0 A9 B; _' s$ q9 Q9 t2 s4 W5 y
! f: h8 G7 S2 r) l4 X1 |图1
9 a! T, K. w- {% L+ H; ?8 J
! z6 n A# s2 D$ _
& c; g; W( G2 @* a2 \$ C6 y! V 一、光流模块简介9 T. a3 D- K6 ~ }6 S4 s% s3 l$ H( t
光流(optical flow)是指的是空间运动物体在观察成像平面上的像素运动的瞬时速度。' M% a; B& O( B
光流法是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。; u) Y: J, U- @; b3 g) c: r
通常将二维图像平面特定坐标点上的灰度瞬时变化率定义为光流矢量。
U; n( ~9 G& X# N, I& e 一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。
% ]6 ]8 U$ X' a$ N1 M8 H0 K 当人的眼睛观察运动物体时,物体的景象在人眼的视网膜上形成一系列连续变化的图像,这一系列连续变化的信息不断“流过”视网膜(即图像平面),好像一种光的“流”,故称之为光流。光流表达了图像的变化,由于它包含了目标运动的信息,因此可被观察者用来确定目标的运动情况。& v0 f. A+ P8 L! S" c
COCOFLY 无人机采用的光流模组是基于 PMW3901,PMW3901 是一款光学运动跟踪传感器,该传感器体积小、功耗低、精度高。如下图所示为该光流模组的实物图如下图所示。+ ~0 B; v+ g5 G" [+ S9 m" B
; E9 g) X8 I) P( L
0 K4 i5 r: _1 ]+ ?
图24 Q% s1 ^/ Z& f1 S2 F
光流模组上已经把 PMW3901 的数据处理好,并且通过串口周期传输,波特率为 19200,该光流模组的串口传输的协议如下表所示。- ]/ M6 k- f0 C5 l) e$ i4 Y
/ s4 l9 n3 Q$ v% M8 c+ ?9 j
4 t3 a3 F% U* A0 m" f2 M
表1
: @9 }# c$ u5 m' C9 o$ } 其中 DATA0、DATA1 是 flow_x 拆分出来的低 8 位数据和高 8 位数据,即flow_x=(int16_t)(DATA1<<8)|(DATA0),DATA2、DATA3 是 flow_y 的低 8 位和高8 位,即 flow_y=(int16_t)(DATA3<<8)|(DATA2),其中和校验为 DATA0~DATA3 的累加值,即 SUM=DATA0+DATA1+DATA2+DATA3;SQUAL 为地面环境质量, 数值越大表示地面环境质量越高;最后一个字节是结束符,有两种:常规模式下固定是 0xAA(Y 引脚接高电平)、偏航模式下是固定的 0xBB(Y 引脚接低电平)。二、串口光流数据获取实验% |& i( i6 s! T5 [
串口光流数据获取实验使用 STM32 的串口 2 即 UART2 与光流模组相连, 串口 1 即 UART1 通过 USB 转串口模块连接电脑,把串口 2 获取到的光流数据通过串口 1 传输到电脑端的串口调试助手显示出来。串口 2 的引脚如下图所示:
+ }" f4 R2 K3 G* g
' t, M7 W) \; {8 Y6 r1 ^. [
1 P; L4 f/ h9 D2 q! S! O1 H$ q# f 图3
: F9 b9 a) t+ t" O, r 两个串口引脚分别与 PA2 与 PA3 引脚相连,那么我们就对 PA2 与 PA3 引脚进行配置,串口 1 的配置可以参考《串口(基础收发)》,配置代码(通过调用官方库)编写的思路如下:
" Q5 C" ~. P, ]2 }+ V* e4 A2 m9 o
4 Q& z' A, k1 e/ I% P7 Y 表2
7 P* U, ~, ^+ d( \: ?" a7 p5 t0 Y6 j 串口 2 初始化代码如下:) }+ S) x) b: @ W$ I4 q+ O& i
+ b* Y3 X1 K1 h$ c, x- c0 {
/ B( \* \4 u! l1 e( y; G 图43 R4 r0 z& Q' q O, {
串口 2 接收到光流模组的数据就转发到串口 1,串口 2 的中断函数代码如下。
: G: c# H/ J4 Y2 k, `5 s" p
3 M3 P( V! m0 ~8 z6 I2 _
0 D; N7 O1 a* C+ J( H3 W: D 图51 A8 {/ F' d- |1 {$ _
设置串口 2 的波特率为 19200,代码如下:- ^8 J! k5 a: J3 m2 ^
2 a6 v) t8 D* ?: n
$ p8 @) @: N0 M4 l* \* n' l
图6
% o% J0 f* M# V 保存、编译、下载代码,确保串口 2 接上了光流模组,然后再把串口 1 接上5 g% A# C! p* B. t! N# F: @7 W
USB 转串口模块,最后接到电脑的 USB 端口,如下图所示:
; @# O8 u: ~4 b b. \5 ]4 {
; R: i! J) x: s5 {6 ]; J( g% z
% V J7 I! f$ ]+ U! N% N
图77 b2 |/ {$ \6 c3 d7 I& \; x
然后在把 USB 转串模块插到电脑的 USB 口,打开电脑端的串口调试助手, 找到对应的 COM 口(前提是安装了 USB 转串口驱动),设置波特率为 115200, 打开,可以看到串口在不断打印光流模组发送的数据,如下图所示。
2 n: ~0 p% R2 O" U
. j, B( n- H# M9 F2 G1 S! x5 }
5 _$ w/ l4 d S/ @/ b2 f: H9 |/ o
图8
' |) Q: J! D# \3 \+ d& ^1 e z$ {. f6 M
% E. ~/ q- | H. N' I3 }7 W3 @& f* W' L
- a1 g7 }6 d3 c1 h7 E2 b
文件下载请点击:
【4】串口(光流数据获取).pdf
(799.34 KB, 下载次数: 0)
5 M3 J' Y$ k5 @; ~2 T, Q6 b- n. {6 }* S; V; C9 T) L) `9 z
# z* `" l! U k. z. ] |
|