fengke 发表于 2021-3-29 11:36

疯壳AI开源无人机串口(光流获取)

<div class='showpostmsg'><ul>
        <li>光流模块简介</li>
</ul>

<p>光流(optical flow)是指的是空间运动物体在观察成像平面上的像素运动的瞬时速度。</p>

<p>光流法是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。</p>

<p>通常将二维图像平面特定坐标点上的灰度瞬时变化率定义为光流矢量。</p>

<p>一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。</p>

<p>当人的眼睛观察运动物体时,物体的景象在人眼的视网膜上形成一系列连续变化的图像,这一系列连续变化的信息不断&ldquo;流过&rdquo;视网膜(即图像平面),好像一种光的&ldquo;流&rdquo;,故称之为光流。光流表达了图像的变化,由于它包含了目标运动的信息,因此可被观察者用来确定目标的运动情况。</p>

<p>COCOFLY无人机采用的光流模组是基于PMW3901,PMW3901是一款光学运动跟踪传感器,该传感器体积小、功耗低、精度高。如下图所示为该光流模组的实物图如下图所示。</p>

<p><img height="184" src="https://oscimg.oschina.net/oscnet/up-484039ea99b57be9a146c0fa4b7e925a4ea.JPEG" width="198" /></p>

<p>光流模组上已经把PMW3901的数据处理好,并且通过串口周期传输,波特率为19200,该光流模组的串口传输的协议如下表所示。</p>

<p>&nbsp;</p>

<table border="1" cellspacing="0">
        <tbody>
                <tr>
                        <td>
                        <p>包头</p>
                        </td>
                        <td>
                        <p>字节数</p>
                        </td>
                        <td>
                        <p>光流数据</p>
                        </td>
                        <td>
                        <p>和校验</p>
                        </td>
                        <td>
                        <p>环境质量</p>
                        </td>
                        <td>
                        <p>结束标识符</p>
                        </td>
                </tr>
                <tr>
                        <td>
                        <p>0xFE</p>
                        </td>
                        <td>
                        <p>0x04</p>
                        </td>
                        <td>
                        <p>DATA0</p>
                        </td>
                        <td>
                        <p>DATA1</p>
                        </td>
                        <td>
                        <p>DATA2</p>
                        </td>
                        <td>
                        <p>DATA3</p>
                        </td>
                        <td>
                        <p>SUM</p>
                        </td>
                        <td>
                        <p>SQUAL</p>
                        </td>
                        <td>
                        <p>0xAA(0xBB)</p>
                        </td>
                </tr>
        </tbody>
</table>

<p>其中DATA0、DATA1是flow_x拆分出来的低8位数据和高8位数据,即flow_x=(int16_t)(DATA1&lt;&lt;8)|(DATA0),DATA2、DATA3是flow_y的低8位和高8位,即flow_y=(int16_t)(DATA3&lt;&lt;8)|(DATA2),其中和校验为DATA0~DATA3的累加值,即SUM=DATA0+DATA1+DATA2+DATA3;SQUAL为地面环境质量,数值越大表示地面环境质量越高;最后一个字节是结束符,有两种:常规模式下固定是0xAA(Y引脚接高电平)、偏航模式下是固定的0xBB(Y引脚接低电平)。</p>

<ul>
        <li>串口光流数据获取实验</li>
</ul>

<p>串口光流数据获取实验使用STM32的串口2即UART2与光流模组相连,串口1即UART1通过USB转串口模块连接电脑,把串口2获取到的光流数据通过串口1传输到电脑端的串口调试助手显示出来。串口2的引脚如下图所示:</p>

<p><img height="168" src="https://oscimg.oschina.net/oscnet/up-2f9c407727371ad1b532ddd6c5df6c067f6.JPEG" width="171" /><img height="274" src="https://oscimg.oschina.net/oscnet/up-bb9a1e948cbb405fcf37670ef32eb384ecd.JPEG" width="320" /></p>

<p>&nbsp;</p>

<p>两个串口引脚分别与PA2与PA3引脚相连,那么我们就对PA2与PA3引脚进行配置,串口1的配置可以参考《串口(基础收发)》,配置代码(通过调用官方库)编写的思路如下:</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>代码思路</p>

<table border="1" cellspacing="0">
        <tbody>
                <tr>
                        <td>
                        <p>1</p>
                        </td>
                        <td>
                        <p>管脚配置</p>
                        </td>
                        <td>
                        <p>1、定义结构体;</p>

                        <p>2、使能时钟;</p>

                        <p>3、填充结构体;</p>

                        <p>4、装载结构体。</p>
                        </td>
                </tr>
                <tr>
                        <td>
                        <p>2</p>
                        </td>
                        <td>
                        <p>串口配置</p>
                        </td>
                        <td>
                        <p>1、定义结构体;</p>

                        <p>2、使能时钟;</p>

                        <p>3、填充结构体;</p>

                        <p>4、装载结构体;</p>

                        <p>5、开启中断;</p>

                        <p>6、使能串口。</p>
                        </td>
                </tr>
                <tr>
                        <td>
                        <p>3</p>
                        </td>
                        <td>
                        <p>中断优先级管理</p>
                        </td>
                        <td>
                        <p>1、定义结构体;</p>

                        <p>2、填充结构体;</p>

                        <p>3、装载结构体。</p>
                        </td>
                </tr>
                <tr>
                        <td>
                        <p>4</p>
                        </td>
                        <td>
                        <p>逻辑处理</p>
                        </td>
                        <td>
                        <p>1、等待接收以及发送数据。</p>
                        </td>
                </tr>
        </tbody>
</table>

<p>串口2初始化代码如下:</p>

<p><img height="415" src="https://oscimg.oschina.net/oscnet/up-4dbefba4f0ee6d65c2b434b4736a7d07ad6.JPEG" width="528" /></p>

<p>串口2接收到光流模组的数据就转发到串口1,串口2的中断函数代码如下。</p>

<p><img height="133" src="https://oscimg.oschina.net/oscnet/up-47b89d203f42833f7f7e358e346c0086332.JPEG" width="554" /></p>

<p>设置串口2的波特率为19200,代码如下:</p>

<p><img height="40" src="https://oscimg.oschina.net/oscnet/up-2e928c86dbf52c1ffda439a82c3f56f8517.JPEG" width="235" /></p>

<p>保存、编译、下载代码,确保串口2接上了光流模组,然后再把串口1接上USB转串口模块,最后接到电脑的USB端口,如下图所示:</p>

<p><img height="285" src="https://oscimg.oschina.net/oscnet/up-42ebf5eaef0753c5491ab2fc586ccfc3463.JPEG" width="437" /></p>

<p>然后在把USB转串模块插到电脑的USB口,打开电脑端的串口调试助手,找到对应的COM口(前提是安装了USB转串口驱动),设置波特率为115200,打开,可以看到串口在不断打印光流模组发送的数据,如下图所示。</p>

<p><img height="278" src="https://oscimg.oschina.net/oscnet/up-86998797c2bf8b5497255fc303a06aa34f5.JPEG" width="512" /></p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2021-3-29 11:47

<p>光流模块是通过串口和主机通信的?</p>

<p>配置串口信息与普通的串口有什么区别</p>

fengke 发表于 2021-3-29 15:35

Jacktang 发表于 2021-3-29 11:47
光流模块是通过串口和主机通信的?

配置串口信息与普通的串口有什么区别

<p>谢谢支持,技术问题欢迎加入qq交流群457586268</p>

h472438470 发表于 2021-9-12 13:17

<p>疯壳AI开源无人机 &nbsp; &nbsp; &nbsp;感谢楼主的整个xi整个系列系统性分享 &nbsp; 谢谢</p>
页: [1]
查看完整版本: 疯壳AI开源无人机串口(光流获取)