标准版
#第六届立创电赛#基于机器视觉与Slam的全向移动机器人

创建时间:3年前

1349 1

视频

  • cartographer建图实验.mp4

  • dijkstra路径规划.mp4

  • 串口屏操作演示.mp4

描述

<div class="document"> <h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">* 1、项目功能介绍</h3> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">基于Slam与机器视觉的全向移动机器人,可实现室内地形建图、精准的导航定位、USB摄像头网络图传、红绿灯检测、S弯循迹等功能。</p> <h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">*2、项目属性</h3> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">首次公开</p> <h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">* 3、开源协议</h3> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">GPL3.0</p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">电路与核心板开源至<a href="https://lceda.cn/aihuangze/stm32f4-hu-xin-ban" target="_blank">STM32F4-ROS机器人主板 - 立创EDA (lceda.cn)</a></p> <h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">*4、硬件部分</h3> <h3><span style="font-size: 18px;">4.1机器人配置列表</span></h3> <p>    小车整体配置如下所示:</p> <p><span>1. </span>供电方式:航模动力电池(<span>12V</span>)</p> <p><span>2. </span>结构形式:全向运动模型(麦克纳姆轮)</p> <p><span>3. </span>控制方式:<span>PC </span>端上位机控制、蓝牙<span>/</span>手柄控制、无人驾驶模式</p> <p><span>4. </span>行驶电机:直流有刷电机<span>*2</span>,电压<span> 6-24V</span>、带<span>AB</span>双向增量霍尔编码器,额定转矩<span> 3.4N*m</span></p> <p><span>5. </span>视 <span>   </span>觉:<span>Logi C505e USB</span>摄像头 <span>800</span>万像素<span>160</span>度广角摄像头</p> <p><span>6. </span>惯<span>    </span>导:<span>MPU9250 : 9</span>轴姿态:<span>3</span>轴加速度、<span>3</span>轴陀螺仪、<span>3</span>轴磁力计,<span>IIC/SPI </span>通信协议</p> <p><span>7. </span>激光雷达:思岚<span>RPLIDAR A1</span>,<span>10</span>米测距、配套完整<span> USB </span>串口、<span>SDK </span>开源工具</p> <p><span>8. </span>电源模块:<span>12V->5V 4A DC-DC</span>直流转换模块(<span>Jetson Nano</span>供电)</p> <p><span>9. </span>交互系统:<span>TJC 7</span>英寸<span>HMI</span>电阻式串口屏、<span>2W</span>喇叭</p> <p><span>10. </span>控 制 器:<span>STM32 </span>复合驱动板、<span>Jetson NANO </span>控制器</p> <p>(<span>1</span>)<span>STM32</span>复合驱动板参数:</p> <p>处理器:<span>STM32F407VET6</span></p> <p align="left">控制器特点:<span>2</span>组舵机接口、<span>4</span>路驱动电机接口、<span>2</span>个按钮模块、蜂鸣器、<span>LED</span>灯、J<span>LINK_OB</span>接口</p> <p align="left"><span>OLED </span>显示屏、<span>HC05</span>蓝牙接口、<span>HMI</span>串口屏接口、<span>IMU </span>接口、<span>TYPEC</span>供电接口等</p> <p>(<span>2</span>)<span>Jetson Nano </span>控制器参数:</p> <p><span>CPU</span>: 四核<span> ARM Cortex-A57 MPCore</span>处理器</p> <p><span>GPU</span>:<span> NVIDIA Maxwell w / 128 NVIDIA CUDA</span>核心</p> <p>内存:<span> 4 GB 64 </span>位<span> LPDDR4</span></p> <p>显卡:<span> HDMI </span>和<span> DisplayPort </span>输出</p> <p><span>USB</span>:<span> 4 </span>个<span>USB 3</span>端口</p> <p><span>I / O</span>:<span> I2C</span>,<span>SPI</span>,<span>UART </span>以及与<span>Raspberry Pi</span>兼容的<span>GPIO</span>接头</p> <p><span>11. </span>通信系统:<span> WIFI </span>通信、<span>UART TTL</span>、<span>USB </span>串口、<span>SOCKET</span>、<span>RosMsg</span></p> <p><span>12. </span>操作系统:<span> Ubuntu 18.04 LTS</span>、<span>ROS-melodic</span>、<span>Windows</span></p> <p><span>13. </span>编程语言:<span> C/C++/Python3</span></p> <p><span>14. </span>使用软件:<span> Keil5</span>、<span>Kdevelop</span>、<span>VS2015</span>、<span>Pycharm</span>、<span>Solidworks</span></p> <p><span>15. </span>匹配环境:<span> OpenCV3.4.12</span>、<span>Pychtorch</span>、<span>Pip3</span>、<span>Rviz</span>、<span>Gazebo</span></p> <h3><span style="font-size: 18px;"><span>4.2</span>机器人控制主板电路设计</span></h3> <p><span style="font-size: 16px;">      基于Slam与机器视觉的全向移动机器人整体硬件结构由供电单元、运动控制单元、人机交互单元与信息采集单元组成。(此处不含由Jetson Nano运行的ROS系统。)其整体硬件结构框图如图1所示:<img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/vnGbNh4Bin3GBegDHytbx6eTKkOZqpb3dI9AoVKy.png" alt="" width="901" height="455"></span></p> <p style="text-align: center;"><strong><span style="font-size: 16px;">图1 移动机器人硬件结构框图</span></strong></p> <p><span style="font-size: 16px;">       由于麦克纳姆轮小车需实现自由运动,且需装配有陀螺仪解算出自身角度姿态、串口接口与ROS主机进行通信、蓝牙模块接收手机APP信息进行交互,故合理的电路图设计与PCB元器件布局十分关键。</span>采用立创<span>EDA</span>进行电路原理图设计,其中包括稳压电路设计(<span>12V->5V Buck 5V->3V3</span>线性稳压)、<span>JTAG</span>接口、编码器、陀螺仪、<span>ADC</span>采样、<span>OLED</span>等电路设计与<span>PCB</span>板绘制。在完成绘制后进行<span>PCB</span>打样与实物焊接操作。如下图所示:<img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/6IQNgJ81QoTfYcWa35cmxF1Zvq9BxbIGrTUvZdgQ.png" alt="" width="949" height="501"></p> <p style="text-align: center;"><strong>图2 运动控制主板原理图</strong></p> <p>        在完成原理图绘制后,发由立创进行PCB打样,同时采购元器件,对PCB进行焊接:</p> <p align="center"><span> <img src="//image.lceda.cn/pullimage/oaIuPmvp92zaWzEi11SyLUJv0TL4jyu2nZxOUuy1.jpeg" alt="" width="460" height="466"> </span><strong>图3<span> </span>一代控制主板<span>PCB</span>焊接实物图</strong></p> <p style="text-align: left;" align="center">        对一代主控板进行程序测试与小车装配,发现仍有许多美中不足的地方,作为优秀的武理大学生,工程问题应该做到<strong>精益求精</strong>。故对如PCB接口布局不合理,PCB主板板长过大等问题,故对原理图与PCB重新进行设计并改进:</p> <p style="text-align: left;" align="center">     <strong>(1)</strong>为了保持电路整洁性,缩小<span>PCB</span>布局尺寸为66mm*94mm,使主控板螺丝孔位与<span>Jetson Nano</span>孔位保持一致,增强小车整体集成度。</p> <p style="text-align: left;" align="center">     <strong>(2)</strong>陀螺仪由<span>MPU9250</span>更换为<span>ICM20602模块</span>,该模块采用模拟<span>SPI引脚采集信号</span>,能够实现<span>1ms</span>采集数据不卡顿。</p> <p>     <strong>(<span>3</span>)</strong><span>JTAG</span>下载接口改为<span>JLINK OB</span>下载器(该下载器为四线<span> </span>,节省<span>PCB</span>布局位置,且使用方法与普通<span>Jlink</span>一致)。</p> <p>     <strong>(4)</strong>增加<span>WS2812B</span>灯光控制电路,增强小车人机交互性与美观度。</p> <p>     <strong>(5)</strong>删除<span>1</span>路舵机接口、<span>1</span>路步进电机接口、红外接口;T插电源接口改为DC接口;增加<span>2</span>路串口接口,其中一路给<span>UART-NRF</span>无线转串口模块使用,用于山外上位机示波器显示,便于查看数据波形,另一路闲置备用。</p> <p>     <strong>(6)</strong>增加一路ADC电路电阻(分压测量电路,PA4_ADC1采集),测量12V航模电池电压,监控小车电量,增强系统可靠性。</p> <p>       在改进结束后对PCB进行重新设计并打样焊接,第二代控制主板PCB实物图如下<strong>(原理图、Gerber文件、引脚分配图见附件):</strong></p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/qOJv5LwACQ7WVZyePfqe9sxV1Vu0Kte8ZWXeV6QK.jpeg" alt="" width="466" height="406"></p> <p style="text-align: center;"><span> </span><strong>图4<span> </span>一代控制主板<span>PCB</span>焊接实物图</strong></p> <h3><span style="font-size: 18px;"><span>4.3 Solidworks</span>建模与实物搭建</span></h3> <p>        在完成运动控制主板设计后,下一步的工作就是搭出小车整体结构与框架。由于麦克纳姆轮小车运动需根据其轮距与轴距进行计算,可精确控制小车的移动方向与速度,故建模十分必要。采用<span>Solidworks</span>软件进行<span>3D</span>建模,对整车的结构,固定支架,<span>PCB</span>板孔位、麦轮大小进行建模绘制,并采用配合指令组装,便于整车结构观察,为后期<span>3D</span>打印提供可靠依据。其模型图如图<span>4</span>所示,可见小车底板与上盖板均留有固定空位,供串口屏、激光雷达等零件固定配合:</p> <p style="text-align: center;"><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/4zaRSb34VJjLgZnREuuCqTjyhrWCBjl5rP5Qtma5.png" alt="" width="593" height="374"><strong>图5 Solidworks建模图</strong></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">        采用Autocad软件,将Solidworks建模的运动上下板的3D图转化为2D图,并发给生产商进行亚克力板定制,厚度为5mm。<img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/ThF2mtbCeZUpa5S1chk0y265HdiNuy50e971yazL.png" alt="" width="879" height="321"></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8; text-align: center;"><strong>图6 CAD绘制图</strong></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8; text-align: left;"><strong>        </strong>由此,拿到材料后便可对小车进行组装与运动控制调试,其组装过程与整体效果图如下:</p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8; text-align: left;"><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/Yk0ioe1hk4JW8BEZTjjpRHN9RfBt9X6uIr7ZlMsd.jpeg" alt="" width="800" height="479"></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8; text-align: center;"><strong>图7 小车下底板硬件组装图</strong></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8; text-align: center;"><strong><img src="//image.lceda.cn/pullimage/nvBR0e8EVcdgtGS9RHsamco01ajrGa9nluucgUNh.jpeg" alt="" width="1561" height="1194"></strong></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8; text-align: center;"><strong>图8 小车整体组装图</strong></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8; text-align: left;">        至此,硬件结构部分制作完毕。</p> <h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">*5、软件部分</h3> <hr class="horizontal-splitline normal-bold-2"> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">        软件部分整体涉及到四部分:STM32运动控制板软件设计、HMI串口屏交换系统设计、ROS端路径规划图像处理程序设计以及QT上位机程序设计。其整体分布结构如图所示:</p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/MbMaAl45NcGwg2u4rQGZHRS0XWZk9v4mLXZ29JVF.png" alt="" width="1349" height="810"></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8; text-align: center;"><strong>图9 小车软件整体结构框图</strong></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">     </p> <h3><span style="font-size: 18px;"><span>5.1 STM32运动控制主板程序设计</span></span></h3> <p><span style="font-size: 18px;"><span>         <strong>5.1.1 PID运动控制闭环</strong></span></span></p> <p>        采取<span>PID</span>实现直流减速电机控速,速度闭环控制是根据单位时间内获取的脉冲数测量电机的速度信息,并与目标值进行比较,得到控制偏差,然后通过对偏差的比例、积分、微分进行控制,使偏差趋向于零的过程。</p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/cPoM03xg8cM4C4sm7Gfj0RTCej8oqGQw3q3SQ9QV.png"></p> <p style="text-align: center;"><strong>图10 <span>PID</span>速度闭环原理图</strong></p> <p><span>        PID</span>速度闭环控制公式为:<span>Pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)] 。</span>其中<span>e(k)</span>代表本次偏差,<span>e(k-1)</span>代表上一次的偏差,<span>e(k-2)</span>是上上次的偏差,<span>Pwm</span>代表增量输出。可以看出,当转速小于设定偏差值时,三项都会使当前值向设定值靠拢,且<span>Kp</span>增大能增大响应速度、<span>Ki</span>增大能消除微弱误差、<span>Kd</span>增大能增大突变阻尼。离散型PI控制函数如下:</p> <p style="text-align: center;"><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/fnxoF4dykIVedVVkq1vuqmJKStJ9dLPCbhjBf54K.png" alt="" width="741" height="265"><strong>图11 离散PI控制函数</strong></p> <p style="text-align: center;"> </p> <p>     <span style="font-size: 18px;"><strong>5.1.2 麦轮小车运动学分析</strong></span></p> <p>        麦克纳姆轮小车在行进过程中拥有较高的机动性能。麦克那姆轮是一种可以进行全方位任意移动的轮子,它由轮毂和围绕轮毂的辊子组合而成,同时,麦克那姆轮的辊子轴线与轮毂轴线成<span>45</span>°夹角。在轮毂的轮缘上斜向分布着许多小轮子,叫辊子,它可以使轮子横向移动。辊子又是一种没有动力的小滚子,小滚子的母线十分特殊,当轮子绕着固定的轮心轴转动的时候,各个小滚子的包络线会形成圆柱面,所以轮子能够连续地向前滚动。由<span>4</span>个轮子加以组合,便可使设备实现任意方位移动的功能。采用麦克纳姆轮技术的智能运输机器人可以实现前行、横移、斜行、旋转及其组合等运动方式。适合在狭窄通道和一些危险的环境中进行行进作业,提高工作效率。</p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/WK3Wa0SC5WLn7uzuV9GkoxIrb8JWXF7fKj4rTB8L.png"></p> <p style="text-align: center;"><strong>图12 麦轮小车运动学模型</strong></p> <p style="text-align: center;"> </p> <p>       为了简化数学模型,做下列两点理想化假设:</p> <p><strong><span>    (1)</span></strong>全向轮不与地面打滑,同时地面有足够摩擦力;</p> <p><strong><span>    (2)</span></strong><span>4</span>个轮子分布在长方形或者正方形的<span>4</span>个角上,轮子之间相互平行。</p> <p>在这里我们将小车的刚体运动线性分解为三个分量,那么只需计算输出麦轮底盘在研<span>X+</span>,<span>Y+</span>方向平移,<span>Z+</span>方向转动时四个轮子的速度,就可以通过公式的合并,计算出这三种简单运动所合作的“平动<span>+</span>旋转”运动时所需要的四个轮子的转速。其中VA VB VC VD 分别为<span>A</span>、<span>B</span>、<span>C</span>、<span>D</span>四个轮子的转速,也就是电机的转速;为小车沿着<span>X</span>轴平移的速度, 为小车沿着<span>Y</span>轴平移速度, 为小车沿着<span>Z</span>轴旋转速度; 为小车轮距的一半, 为小车轴距<span>H</span>的一半。据此可得小车运动状态解算出四个轮子的转速:</p> <p> </p> <p style="text-align: left;" align="center"><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/w7bIShsLg59fWTxWPf3nAW5FrZIlRtjssTpaFDmJ.png" alt="" width="475" height="244"></p> <p style="text-align: left;" align="center">        由此可得运动学逆解后的4轮速度,并给PWM赋值:</p> <p style="text-align: left;" align="center"><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/vrg9BVDDpXHa4qpz0DFbzv0U3hWxXYd8f83dgaNz.png" alt="" width="992" height="550"></p> <p style="text-align: center;" align="center"><strong>图13 麦轮小车运动学逆解控制函数</strong></p> <p style="text-align: left;" align="center"><strong>       </strong> 其中MEC_axlespacing为小车轴距的一半,MEC_wheelspacing为小车轮距的一半。</p> <p style="text-align: left;" align="center"> </p> <p><span style="font-size: 18px;"><span><strong>5.2 HMI人机交互系统设计 </strong></span></span></p> <p><strong style="font-size: 18px;">    5.2.1HMI人机交互页面设计</strong></p> <p><span style="font-size: 18px;"><span><strong>   </strong> <span style="font-size: 16px;">    人机交互系统采用HMI串口屏的方案,采用一块7.0寸1024*600电阻式触摸屏。其拥有128M大小的FLASH空间,200KHz主频。HMI串口屏能通过串口与单片机进行通信,且通过UI界面设计能将调试数据,通信数据反映在串口屏上。通过串口屏对屏幕控件的操控即可实现对单片机的简易控制,具有优越的用户友好性,其开发软件为淘晶驰官方软件。该设计集成了小车速度显示、电量显示、密码控制、小车移动模式选择、语音播报等功能,其设计图如下:</span></span></span></p> <p><span style="font-size: 18px;"><span><span style="font-size: 16px;"><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/FovamRXVwKXFzJxyA0WdbvW98yy2Y8LfAeozvV2d.png" alt="" width="1024" height="600"><br></span></span></span></p> <p style="text-align: center;"><span style="font-size: 18px;"><span><span style="font-size: 16px;"><strong>图14 HMI主界面设计图</strong></span></span></span></p> <p style="text-align: left;"><span style="font-size: 18px;"><span><span style="font-size: 16px;"><strong>        </strong>系统上电后,HMI自动刷新为主页面下,在该页面可进行不同模式页面选择,且左上角实时进行电量显示。</span></span></span></p> <p style="text-align: left;"><span style="font-size: 18px;"><span><span style="font-size: 16px;"><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/LO7dRweCgUPcc7vp1fNeuoXmxkPjjmhHBvB84QGj.png" alt="" width="1025" height="602"></span></span></span></p> <p style="text-align: center;"><span style="font-size: 18px;"><span><span style="font-size: 16px;"><strong>图15 HMI设置界面设计图</strong></span></span></span></p> <p style="text-align: left;"><span style="font-size: 18px;"><span><span style="font-size: 16px;">        在HMI设置界面下,使用者可进行串口屏亮度调节(10%~100%),且调节掉电自动保存,在下次上电时亮度保持不变。</span></span></span></p> <p style="text-align: left;"><span style="font-size: 18px;"><span><span style="font-size: 16px;"><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/q0p69XCHUb9JnSyACmmzIxy8o3lNajdGflWJc82R.png" alt="" width="1026" height="603"></span></span></span></p> <p style="text-align: center;"><span style="font-size: 18px;"><span><span style="font-size: 16px;"><strong>图16 小车模式选择页面设计图</strong></span></span></span></p> <p style="text-align: left;"><span style="font-size: 18px;"><span><span style="font-size: 16px;">        在小车模式选择页面下,使用者可进行下列操作:</span></span></span></p> <p style="text-align: left;"><span style="font-size: 18px;"><span><span style="font-size: 16px;">     <strong>(1)</strong>通过按钮对小车遥控速度进行加减操作(100mm/s~200mm/s)</span></span></span></p> <p style="text-align: left;"><span style="font-size: 18px;"><span><span style="font-size: 16px;">     <strong>(2)</strong>可切换小车移动模式(ROS自动控制模式/手机蓝牙控制模式)</span></span></span></p> <p style="text-align: left;"><span style="font-size: 18px;"><span><span style="font-size: 16px;">     <strong>(3)</strong>可切换小车遥控移动效果(Mec麦轮移动模式/Akm阿克曼移动模式)</span></span></span></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8;"><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/dfuScvGKqJgfGb7P40DX1FWcfs5voXwvqFHTlXUm.png" alt="" width="1026" height="603"></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8; text-align: center;"><span style="font-size: 18px;"><span><span style="font-size: 16px;"><strong>图17 RGB控制系统设计图</strong></span></span></span></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8; text-align: left;"><span style="font-size: 18px;"><span><span style="font-size: 16px;">        在RGB控制系统页面下:</span></span></span></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8; text-align: left;"><span style="font-size: 18px;"><span><span style="font-size: 16px;">     <strong>(1)</strong>使用者可通过触碰彩色圆环上的色块进行小车RGB颜色选择</span></span></span></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8; text-align: left;"><span style="font-size: 18px;"><span><span style="font-size: 16px;">     <strong>(2)</strong>使用者可通过点击色环中心的图标进行模式切换(渐变灯光效果/跑马灯效果)</span></span></span></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8; text-align: left;"><span style="font-size: 18px;"><span><span style="font-size: 16px;"><strong>    <span style="font-size: 18px;">  5.2.2HMI人机交互系统软件设计</span></strong></span></span></span></p> <p>        由于<span>HMI</span>串口屏操作方式为串口发送特定字符串的形式,故需在<span>STM32</span>的<span>USART</span>函数中编写符合其通信结构的函数进行串口屏控件操控。在初始化函数中初始特定的串口波特率为921600,与串口屏设置波特率保持一致。编写的操控控件函数如图<span>13</span>所示,通过此<span>3</span>个函数可操控绝大多数串口屏控件,实现不同功能使用(可见附录STM32工程代码中USART_HMI.c文件)。</p> <p> </p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8; text-align: left;"> <img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/IaHKUr8SOIRnoYD1aPogj2QSRk9ywZYhmAe6sA95.png" alt="" width="574" height="740"></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8; text-align: center;"><span style="font-size: 18px;"><span><span style="font-size: 16px;"><strong>图18 HMI控件函数</strong></span></span></span></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8; text-align: left;"><span style="font-size: 18px;"><span><strong>5.3 上位机通信方案设计</strong></span></span></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8; text-align: left;"><span style="font-size: 18px;"><span><strong>        5.3.1通信协议的选择</strong></span></span></p> <p><span>        Socket</span>通信可以基于<span>TCP</span>或<span>UDP</span>进行。两者的主要区别如下:</p> <p><strong>     (<span>1</span>)</strong><span>TCP</span>的传输是可靠传输;<span>UDP</span>的传输是不可靠传输。</p> <p><strong>     (<span>2</span>)</strong><span>TCP</span>是基于连接的通信协议,在正式收发数据前必须和对方建立可靠的连接;<span>UDP</span>是基于非连接的通信协议,在不与对方建立连接的情况下直接把数据发送出去。</p> <p><strong>     (<span>3</span>)</strong><span>TCP</span>的传输速度很慢;<span>UDP</span>的传输速度很快。</p> <p>        上位机与<span>ROS</span>之间大多进行字符串传输,很少进行视频传输。因此,既可以选择<span>TCP</span>通信协议也可以选择<span>UDP</span>通信协议。为了使传输更加快速简洁,选择<span>UDP</span>通信协议来进行<span>Socket</span>通信。</p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8; text-align: left;"><span style="font-size: 18px;"><span><strong>        5.3.2</strong></span></span><strong>界面设计的选择</strong></p> <p>      上位机显示的界面可以基于<span>QT</span>或<span>MFC</span>进行设计。两者的主要区别如下:</p> <p>    <strong>(<span>1</span>)</strong><span>QT</span>的集成开发环境是<span>Qt Creator</span>;<span>MFC</span>的集成开发环境是<span>Visual C++</span>。</p> <p>    <strong>(<span>2</span>)</strong><span>QT</span>可以跨平台(<span>Linux</span>、<span>Windows</span>等)使用;<span>MFC</span>只能在<span>Windows</span>平台上使用。</p> <p>    <strong>(<span>3</span>)</strong><span>QT</span>界面设计比<span>MFC</span>更简单、更方便、更美观。</p> <p>       基于以上比较,我选择了<span>QT</span>进行上位机的界面设计。在<span>Qt Creator</span>中设计<span>UI</span>界面并进行代码编写。上位机有目标位置设定功能,通行、禁行、重新启动功能等,具有简洁性与良好的人机交互特性,其设计效果如下图所示:</p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/cX6CzPGRtbXcSVoav2UUv3aCZ0ojJYZWgsldk1dA.png" alt="" width="968" height="556"></p> <p style="text-align: center;"><span style="font-size: 18px;"><span><span style="font-size: 16px;"><strong>图19 上位机界面设计图</strong></span></span></span></p> <p style="text-align: left;"><span style="font-size: 18px;"><span><strong>      5.3.3 ROS端通信程序设计</strong></span></span></p> <p style="text-align: left;"><span style="font-size: 18px;"><span>        <span style="font-size: 16px;">由于采用SOCKET协议进行上位机指令发送,故ROS端工作空间中需创建对应的功能包进行上位机数据的接收与处理操作。采用节点的形式不断采集固定IP地址的数据,并以话题的形式发送出去(见工作空间src/client_pkg/src/recvfrom.cpp函数)</span></span></span></p> <p style="text-align: left;"><span style="font-size: 18px;"><span><span style="font-size: 16px;"><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/3fZV0yKubK5NmjkxzgD06mvAaT8zSVFGRHGSpLa0.png" alt="" width="1053" height="1063"></span></span></span></p> <p style="text-align: center;"><span style="font-size: 18px;"><span><span style="font-size: 16px;"><strong>图20 ROS接收上位机函数</strong></span></span></span></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8; text-align: left;"><span style="font-size: 18px;"><strong>5.4Dijkstra 算法原理</strong></span></p> <span style="font-size: 16px;">       Dijkstra 算法,是由荷兰计算机科学家 Edsger Wybe Dijkstra 在1956年发现的算法,戴克斯特拉算法使用类似广度优先搜索的方法解决赋权图的单源最短路径问题。Dijkstra 算法原始版本仅适用于找到两个顶点之间的最短路径,后来更常见的变体固定了一个顶点作为源结点然后找到该顶点到图中所有其它结点的最短路径,产生一个最短路径树。本算法每次取出未访问结点中距离最小的,用该结点更新其他结点的距离。需要注意的是绝大多数的Dijkstra 算法不能有效处理带有负权边的图。</span></div> <div class="document"><span style="font-size: 16px;"><span style="font-size: 16px;"><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/stObKPxahbRTduZeNhgnVHVf1XhpfS2kvzCObgvJ.png" alt="" width="659" height="403"></span></span> <p> 1:算法初始,将选择的源点<strong>s</strong>放进集合<strong>S</strong>中;</p> <p> 2:无自环的源点<strong>s</strong>到自己的最短路径为0;</p> <p> 3:当顶点<strong>vi</strong>不在集合S中时,(此时集合S中仍只有源点s),开始进入循环;</p> <p> 4:将源点<strong>s</strong>与点<strong>vi</strong>之间的权值赋给<strong>dist[s,vi]</strong>。由于是有向图,所以当源点<strong>s</strong>不指向任何其他集合<strong>S</strong>外的顶点时,<strong>dist[s,vi]=∞</strong>。可以理解为<strong>此时</strong>从源点<strong>s</strong>出发,<strong>暂时</strong>是达到不了<strong>vi</strong>的。不过后来随着集<strong>S</strong>的扩充,从源点<strong>s</strong>出发一定能到达所有的顶点。一会我们讲解例子时会出现这种情况。此时第一个<strong>for</strong>循环结束;</p> <p> 5:如果集合<strong>V-S</strong>不是空集,则进入循环;</p> </div> <div class="document"> 6:选出经过第一个<strong>for</strong>循环之后的,在集合<strong>V-S</strong>中的,且相对于集合<strong>S</strong>的最短路径中距离最短的那个顶点<strong>Vj</strong>;</div> <div class="document"> 7:将这个顶点<strong>Vj</strong>并入集合<strong>S</strong>,从而达到扩充集合<strong>S</strong>的目的;</div> <div class="document"> 8:将顶点<strong>Vi</strong>并入集合<strong>S</strong>之后可能会对其他顶点相对于集合<strong>S</strong>的最短路的长度会有影响,所以进入内<strong>for</strong>循环对有影响的进行更新;</div> <div class="document"> 9:即如果从源点<strong>s</strong>到我们在第<strong>6</strong>步选出的顶点<strong>vj</strong>的相对于集合<strong>S</strong>的最短路径的长度再加上顶点<strong>vj</strong>到顶点<strong>vi</strong>之间的距离<strong>wi,j</strong>还要小于源点<strong>s</strong>到顶点<strong>vj</strong>的相对于集合<strong>S</strong>的最短路径的长度还要短的话;</div> <div class="document"> 10:则将源点<strong>s</strong>到顶点<strong>vi</strong>的相对于集合<strong>S</strong>的最短路径更新成源点<strong>s</strong>到我们在第<strong>6</strong>步选出的顶点<strong>vj</strong>的相对于集合<strong>S</strong>的最短路径再加上顶点<strong>vj</strong>到顶点<strong>v</strong>之间的权值<strong>wi,j。</strong></div> <div class="document"> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8; text-align: left;"><span style="font-size: 18px;"><strong>5.5机器人建图导航定位实验</strong></span></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8; text-align: left;"><span style="font-size: 18px;"><strong>    5.5.1 网络图传控制小车(利用键盘控制小车移动,并将图像信息显示于<span>rqt_image_view</span>)</strong></span></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8; text-align: left;"><span style="font-size: 18px;"><strong><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/ONNWKAkjegw3v7RDZyzI5pKZPjCdTWpJBwwNSjLb.png" width="880" height="497"></strong></span></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8; text-align: center;"><span style="font-size: 18px;"><strong>图21 远程控制图传小车实验展示</strong></span></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height: 1.8; text-align: left;"><span style="font-size: 18px;"><strong>    5.5.2<span>cartographer</span>算法实现建图</strong></span></p> <p><span>        Gmapping</span>算法由于对里程计要求较高,无法适应不平坦区域,但是比赛的地图中有减速带这一元素,因此对<span>gmapping</span>建图造成了影响,建成的地图上总是会出现偏移错位,难以使用。考虑到这一点,我们将<span>gmapping</span>算法替换为<span>Cartographer</span>算法,利用其回环检测,成本较低的雷达也能跑出不错的效果。其建图过程如下:</p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/VG7vZ9px397NVPh7hDzop154PQ9spj845S9plJGq.png" alt="" width="589" height="402"></p> <p style="text-align: center;"><strong><span style="font-size: 18px;">图<span>22 Cartographer</span>建图效果</span></strong></p> <p style="text-align: left;"><strong><span style="font-size: 18px;">   5.5.3 <span>Dijsktra</span>算法实现的全局路径规划与自主导航</span></strong></p> <p>        目前有两种算法方案选择:<span>A*</span>算法和<span>Dijkstra</span>算法。<span>Dijkstra</span>算法和<span>A*</span>算法都是最短路径问题的常用算法,下面就对这两种算法的特点进行一下比较:</p> <p><strong>(<span>1</span>)</strong><span>Dijkstra</span>算法计算源点到其他所有点的最短路径长度,<span>A*</span>关注点到点的最短路径<span>(</span>包括具体路径<span>)</span>。</p> <p><strong>(<span>2</span>)</strong><span>Dijkstra</span>算法建立在较为抽象的图论层面,<span>A*</span>算法可以更轻松地用在诸如游戏地图寻路中。</p> <p><strong>(<span>3</span>)</strong><span>Dijkstra</span>算法的实质是广度优先搜索,是一种发散式的搜索,所以空间复杂度和时间复杂度都比较高。对路径上的当前点,<span>A*</span>算法不但记录其到源点的代价,还计算当前点到目标点的期望代价,是一种启发式算法,也可以认为是一种深度优先的算法。</p> <p>        由第一点可知,当目标点很多时,<span>A*</span>算法会带入大量重复数据和复杂的估价函数,所以如果不要求获得具体路径而只比较路径长度时,<span>Dijkstra</span>算法会成为更好的选择。出于节省算力的考虑,本次使用<span>Dijkstra</span>算法进行全局路径规划。在建图完成后,设置<span>Teb</span>局部路径规划、<span>Dijsktra</span>全局规划、机器人模型、加速度、最大线速度等相关参数,启动<span>ROS</span>导航节点,采用<span>2D Nav goal</span>的方式实现机器人的自主导航与定位:</p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/czjeZjyDSxjF7MhZVoxQyc5FT1QEWfnMiuPFhc0G.png" alt="" width="1000" height="544"></p> <p style="text-align: center;"><strong><span style="font-size: 18px;">图<span>23 </span><span>Dijsktra</span>算法实现全局路径规划</span></strong></p> <p style="text-align: left;"><strong><span style="font-size: 18px;">   5.5.4基于<span>OpenCV</span>实现的红绿灯目标检测</span></strong></p> <p>       roslaunch 对应的摄像头启动节点,并python oepncv_test.py直接运行图像识别程序。</p> <p>        本项目中使用<span>OpenCV</span>库对红绿灯进行颜色识别与位置计算,其识别由以下几个阶段构成:</p> <p><strong>    (<span>1</span></strong><strong>)阈值设置与函数初始化</strong></p> <p>        首先导入所需要的<span>python</span>库<span>cv2</span>、<span>cvBridge</span>、<span>numpy</span>等,根据红、黄、绿三种颜色的<span>HSV</span>分别设置出对应的阈值,而后根据摄像头识别的具体情况来设置彩色距离阈值,在物流小车运行的过程中,需要根据光线等影响因素来实时调节对应的参数。利用<span>OpenCV</span>资料与开源代码,构造颜色识别函数、二维码识别函数、话题发布函数等。</p> <p><strong>    (<span>2</span></strong><strong>)<span>aruco</span></strong><strong>码识别与距离计算</strong></p> <p>       在主代码中,将<span>CSI</span>摄像头/USB摄像头采集到的图像不断识别<span>aruco</span>码并根据视觉位置关系确定其相对摄像头的<span>3</span>维位置坐标,可计算出与小车的绝对距离距离由于物流车在起步进入第一个直道后,在相当长的一段路程中都可以识别到红绿灯,因此需要通过计算此时摄像头离红绿灯的距离,与设定的阈值比较,来判断是否应当控制小车停止运动。</p> <p><strong>    (<span>3</span></strong><strong>)红绿灯颜色识别与话题发送</strong></p> <p>       其设计思路为:由<span>aruco</span>识别函数所得到的红绿灯识别区域中进行颜色识别函数调用与判断。如果在目标范围内,检测到红、黄、绿三种颜色,则将该颜色保存并后续以<span>ROS</span>话题的形式发送。该阶段主要用于确保摄像头识别正确的红绿灯颜色,避免环境中其他颜色的影响。如果摄像头框选的区域可以检测到<span>arcuo</span>二维码,则对应的<span>ROI</span>区域有效,可以进行对图像的操作和颜色的识别。对图像的操作过程陈述如下:首先提取交通灯的小块区域图像;其次根据预设阈值对图像进行二值化,保留指定的颜色目标;然后对图像进行膨胀腐蚀操作,清除杂质;而后寻找轮廓,并根据面积进行大小排序,获得最大面积轮廓;最后将颜色空间的距离与预设的阈值相比较,如果小于阈值,则可以进行颜色判断,并将所判断的结果以<span>ROS</span>话题形式发送,在主函数中订阅该话题并与控制函数结合,使<span>32</span>能顺利接收到串口信息,控制电机运动或者停止。颜色的判断结果和图像可以在上位机中显示出来,其识别效果如下图所示:</p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/DjgNy2Q8pZTBLVXJf3pJFer7cCor8iLJwH9W9Oe1.png" alt="" width="1000" height="607"></p> <p style="text-align: center;"><strong><span style="font-size: 18px;">图<span>23 </span>红绿灯识别效果演示</span></strong></p> <h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">*6、BOM清单</h3> <hr class="horizontal-splitline normal-bold-2"> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"> </p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/yw32f1cbrHizucdzWOEZsjw8DxbAO9YSSQk7uuAD.png" alt="" width="1000" height="367"></p> <h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">*7、大赛LOGO验证</h3> <hr class="horizontal-splitline normal-bold-2"> <p style="line-height: 1.8;"> </p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/pullimage/WobqhJGF2OKKC2LttwApNgzUiPFog5ezIY8GAJ5Q.png" alt="" width="548" height="734"></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8; text-align: center;"><img src="//image.lceda.cn/pullimage/FSlao0c6XE9ab4pShmOm2vA1nAZRRAUoPMlp0Oqg.jpeg" alt="" width="1073" height="741"></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"> </p> <h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">* 8、演示您的项目并录制成视频上传</h3> <hr class="horizontal-splitline normal-bold-2"> <p style="line-height: 1.8;"> </p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><span style="color: #95a5a6; font-size: 14px;">视频要求:请横屏拍摄,分辨率不低于1280×720,格式Mp4/Mov,单个视频大小限100M内;</span></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><span style="color: #95a5a6; font-size: 14px;">视频标题:立创电赛:{项目名称}-{视频模块名称};如立创电赛:《自动驾驶》-团队介绍。</span></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"> </p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><span style="font-size: 14px;">更多详情:<a href="/posts/06c94d90c2c447dfbd9ed7339ff4a5b1" target="_blank">https://diy.szlcsc.com/posts/06c94d90c2c447dfbd9ed7339ff4a5b1</a></span></p> <p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"> </p> </div>

文档

BOM

暂无

附件

附件名 下载
STM32F4-ROS机器人主板V2.zip
STM32运动底盘源码V2.zip

评论(1)

  • 表情
    emoji
    小嘉工作篇
    小嘉日常篇
  • 图片
成功
工程所有者当前已关闭评论
立创电赛 回复
<p><span class="colour" style="color: rgb(85, 85, 85);">记得在logo验证处,上传实物图哟~</span></p>
goToTop
svg-battery svg-battery-wifi svg-books svg-more svg-paste svg-pencil svg-plant svg-ruler svg-share svg-user svg-logo-cn svg-double-arrow