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

疯壳AI开源无人机串口(视觉数据获取)

<div class='showpostmsg'><ul>
        <li>OPENMV&nbsp;模组简介</li>
</ul>

<p>OPENMV是一个开源、低成本、功能强大的机器视觉模块。以STM32F767为核心,集成了OV7725摄像头芯片,在小巧的硬件模块上,用C语言高效地实现了核心机器视觉算法,提供Python编程接口。开发者、发烧友以及智能设备开发商都可以用Python语言使用OPENMV提供的机器视觉功能,为自己的产品和发明增加有特色的竞争力。</p>

<p>OPENMV上的机器视觉算法包括寻找色块、眼球跟踪、边缘检测、标志跟踪等。可以用来实现非法入侵检测、产品的残次品筛选、跟踪固定的标记物等。使用者仅需要写一些简单的Python代码,即可轻松的完成各种机器视觉相关的任务。小巧的设计,使得OPENMV可以用到很多创意的产品上。比如,可以给机器人提供周边环境感知能力;给智能车增加视觉巡线功能;甚至,可以给工厂产品线增加残次品筛选功能等。</p>

<p>COCOFLY上的无人机视觉模组采用的就是OPENMV,其实物图如下图所示。</p>

<p><img height="254" src="https://oscimg.oschina.net/oscnet/up-b063ba96eb4753a787125bc3f3f5ffdbaf2.JPEG" width="272" /></p>

<p>&nbsp;</p>

<p>其中OPENMV的Python代码已经写好提供给用户,如果用户需要修改的话,也可以修改使用,目前OPENMV串口发出的视觉数据的协议框架如下表所示。</p>

<table border="1" cellspacing="0">
        <tbody>
                <tr>
                        <td>
                        <p>帧头(2 Bytes)</p>
                        </td>
                        <td>
                        <p>功能字(1Byte)</p>
                        </td>
                        <td>
                        <p>长度(1Byte)</p>
                        </td>
                        <td>
                        <p>数据(nBytes)</p>
                        </td>
                        <td>
                        <p>和校验(1Byte)</p>
                        </td>
                </tr>
                <tr>
                        <td>
                        <p>0xAA &nbsp;0xAA</p>
                        </td>
                        <td>
                        <p>0xXX</p>
                        </td>
                        <td>
                        <p>0xXX</p>
                        </td>
                        <td>
                        <p>0xXX...</p>
                        </td>
                        <td>
                        <p>0xXX</p>
                        </td>
                </tr>
        </tbody>
</table>

<p>其中帧头是固定为两个字节:0xAA、0xAA;功能字为一个字节;长度为数据的长度,也为一个字节;数据位n个字节;和校验为一个字节,即帧头开始相加到最后一个字节,保留低8位。</p>

<p>视觉模组的接收数据,即模式设置的协议框架如下表所示。</p>

<table border="1" cellspacing="0">
        <tbody>
                <tr>
                        <td>
                        <p>帧头(2 Bytes)</p>
                        </td>
                        <td>
                        <p>功能字(1Byte)</p>
                        </td>
                        <td>
                        <p>长度(1Byte)</p>
                        </td>
                        <td>
                        <p>Mode(1Byte)</p>
                        </td>
                        <td>
                        <p>和校验(1Byte)</p>
                        </td>
                </tr>
                <tr>
                        <td>
                        <p>0xAA &nbsp;0xAF</p>
                        </td>
                        <td>
                        <p>0xF1</p>
                        </td>
                        <td>
                        <p>0xXX</p>
                        </td>
                        <td>
                        <p>0xXX...</p>
                        </td>
                        <td>
                        <p>0xXX</p>
                        </td>
                </tr>
        </tbody>
</table>

<p>其中帧头是固定为两个字节:0xAA、0xAF;功能字为0xF1;长度为数据的长度,也为一个字节;Mode,即OPENMV的模式设置,为1个字节;和校验为一个字节,即帧头开始相加到最后一个字节,保留低8位。</p>

<p>该数据的协议用户均可自定义,详情可以看配套的OPENMV的Python源码,OPENMV的具体使用方式可以查看OPENMV官网。</p>

<h3>二、串口视觉数据获取实验</h3>

<p>串口视觉数据获取实验使用STM32的串口1即UART1与视觉模组相连,串口2即UART2,通过USB转串口模块连接电脑,把串口1获取到的视觉数据通过串口2传输到电脑端的串口调试助手显示出来。做该实验的时候需要把视觉模组接到USART1,把光流模组暂时取下,并且把USB转串口的线接到光流接口处。</p>

<p>串口1和串口2的配置可以参考《串口(基础收发)》和《串口(光流数据获取)》两节,配置代码(通过调用官方库)。</p>

<p>代码编写的思路如下表所示:</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="395" src="https://oscimg.oschina.net/oscnet/up-784f62791533723956e195b6ad754381677.JPEG" width="534" /></p>

<p>这里注意要把串口的发送也配置好,这样才能把数据发送到电脑。</p>

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

<p><img height="127" src="https://oscimg.oschina.net/oscnet/up-c5858106f322735932c32b96ef7ab5883e3.JPEG" width="490" /></p>

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

<p><img height="129" src="https://oscimg.oschina.net/oscnet/up-bf796cd7580f2b1ff0f85835c7aaf02c0d8.JPEG" width="418" /></p>

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

<p><img height="280" src="https://oscimg.oschina.net/oscnet/up-93e4887666558155fb9234210c69dcb95ec.JPEG" width="400" /></p>

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

<p><img height="257" src="https://oscimg.oschina.net/oscnet/up-a9d7e60dae914b85691c34237c13f653965.JPEG" width="477" /></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>
页: [1]
查看完整版本: 疯壳AI开源无人机串口(视觉数据获取)