【基于STM32&OpenCV的车载机器人的抓取控制软件设计】

这篇具有很好参考价值的文章主要介绍了【基于STM32&OpenCV的车载机器人的抓取控制软件设计】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本科优秀毕业论文《基于STM32&OpenCV的车载机器人的抓取控制软件设计》

摘要:

本设计是一款基于STM32的车载机器人的抓取控制软件设计,以STM32F103RCT6作为主控芯片。STM32F103RCT6单片机为32位单片机,该单片机具有功能强大、低功耗、灵活易用、抗干扰能力强等特点。主要研究将OpenCV(开源计算机视觉库)与车载机器人硬件相互结合实现图像识别与物体搬运,在机械控制方面,利用PID算法处理带编码器直流减速电机的速度,在图像处理方面,结合OpenCV的CAMShift做对象检测标定与跟踪,并且利用OpenWRT路由器做PC与车载机器人的WiFi通讯媒介,首先在机器人端采集图像数据然后经由OpenWRT路由器传至PC机做图像处理,最后将计算过后的数据反馈控制指令到车载机器人端。最终可以实现物体的识别标定与机械臂抓取搬运对象、PC端可通过手动键盘控制与自动检测标定等主要功能。通过本次设计,结合计算机视觉比起以往普通的传感器检测与控制具有很大的优势,使得控制更加智能化、高效化与实用化,但是也面临着许多挑战(如算法的理解与实现)。利用OpenCV计算机视觉在机械控制领域是比较新颖的,随着科技的改革创新与不断发展,不管是目前还是未来,计算机视觉在机械控制领域都将起着举足轻重的作用。

关键词: OpenCV计算机视觉; PID算法; STM32; 物体的识别与标定; CAMShift跟踪

Abstract:

This design is a STM32-based vehicle grab control software design, with STM32F103RCT6 as the main control chip. The STM32F103RCT6 single-chip microcomputer is a 32-bit single-chip microcomputer, which has the characteristics of powerful functions, low power consumption, flexibility and ease of use, and strong anti-interference ability. The main research is to combine OpenCV (Open Source Computer Vision Library) and on-board robot hardware to realize image recognition and object handling. In terms of mechanical control, the PID algorithm is used to process the speed of the DC geared motor with encoder. In terms of image processing, it is combined with OpenCV’s CAMShift performs object detection calibration and tracking, and uses the OpenWRT router as the WiFi communication medium between the PC and the on-board robot. The image data is first collected on the robot side and then transmitted to the PC via the OpenWRT router for image processing. Finally, the calculated data is fed back to control Instructions to the on-board robot. In the end, the main functions such as object identification and calibration, robotic arm grasping and transporting objects can be realized, and the PC can be controlled by manual keyboard and automatic detection and calibration. Through this design, combining computer vision has great advantages over previous ordinary sensor detection and control, making the control more intelligent, efficient, and practical, but also facing many challenges (such as the understanding and implementation of algorithms). The use of OpenCV computer vision is relatively new in the field of mechanical control. With the reform and innovation and continuous development of technology, computer vision will play a pivotal role in the field of mechanical control, whether now or in the future.

Keywords: OpenCV computer vision; PID algorithm; STM32; object recognition and calibration; CAMShift tracking

前 言

随着人工智能、物联网、大数据、云计算、智能硬件等不断蓬勃发展,对机器人控制、视觉识别等的研究也越来越受到人们的青睐。中国制造2025成为中国当今社会上的一个重要焦点,为了推进科学技术的发展与提高工业制造等的效率,出现了各式各样的机器人,如码垛机器人、运输机器人、航空航天机器人、ROS扫地机器人等等,国家对机器人的研究此也非常重视。因此,我便将本课题的研究投入到机器人的领域,主要研究范围是将计算机视觉OpenCV软件与STM32硬件相互结合并设计出一款车载机器人,实现PC人机交互控制与视觉自动物体识别与跟踪抓取搬运。
本设计采用的研究方法是:功能分析法与实验法相结合,前期构建理论知识框架,对该设计进行可行性、实用性、功能需求等得出系统运行的所需条件,后期主要是通过大量的实验去逐渐验证理论结果,将整体的功能拆分成一个个零碎的功能,然后逐一的将零碎功能实现从而实现整体功能。
本课题开始介绍了机器人在当今社会的发展前景,并结合当前国内机器人的发展对现有的OpenCV开源视觉库与主流单片机控制器STM32了一个车载机器人,机器人实现的主要功能是目标物体检测、识别与跟踪甚至抓取搬运,控制方式可分为自动控制与PC端控制。经过长时间的研究与大量的实验,最终制作出了实物,已经实现了系统所需的绝大多数功能,但是也存在一些问题。如车体速度不够平滑导致图像采集不够连续甚至出现掉帧,基于单纯的颜色跟踪满足不了当前的应用需求,跟踪算法不完善、跟踪效果不好(实时性不好、反应迟钝与跟踪对象容易丢失或混乱等等),另外一个就是应为采用的是OpenWRT的图传方案,不知道摄像头的动态图像地址,后面利用Wireshark抓包工具分析出HTTP的数流抓包,这些都是在实验中发现的问题与需要解决的问题。
前言应说明本课题的研究目的、研究范围、研究方法;简述本课题概况及存在的主要问题;说明本课题应解决的主要问题。

1方案设计与论证

依据课题的需求,得出如下系统设计方案:利用STM32F103RCT6作为硬件主控制器,车体采用两个带编码器的直流有刷减速电机与一个万向轮作为机器人的行走引擎, 搭建WIFI通讯链路,机械臂设计采用亚克力板与舵机相结合。实现PC机与车载机器人联合控制,并对机器人的运动速度、位置以及检测状态进行检测,将实时检测的速度反馈到STM32控制器,采用PID算法实时调节电机PWM脉宽,并在PC端通过TCP/IP协议访问机器人的摄像头数据实现图像处理任务、手动键盘控制任务与视频监控任务等等,最后将控制指令反馈到机器人控制器,达到机器人识别图像、跟踪目标物体等的主要功能。
该方案可以实现车载机器人的图像实时监控、目标检测与跟踪抓取 等等主要功能,该控制方案稳定可靠、实用性强、控制方便灵活,可以较好的实现机器人控制系统的功能指标。
1.1车载机器人车体运动速度子系统
方案一:采用变电阻式电压调节器做开环控制,机器人采用的是11.1V标准航模锂电池,结合一个降压调节器将航模电池输出的电压经过降压调节器直接输送给电机负载,通过降压器里面的电位器去调节输出电压、电流,从而实现机器人运动速度的开环手动调节,次方案设计起来非常简单方便,但是相对来说控制精度很低,无法获得电机真实速度,使得后续采集的图像会出现严重的抖动,对于精确的控制而言,满足不了高精度的速度控制需求,手动控制电位器来改变电机速度非常笨拙,适合对速度精度要求不高的场合。
方案二:采用PWM脉宽调制开环控制式控制电机速度,该方式控制电机速度为脉冲宽度控制,通过控制开关管的导通时间来控制电机负载两端的电压,在单个周期内(5毫秒),由主控制器控制驱动器的开关管导通电平信号的占空比实现电机调速。该控制方案的优点式采用软件编程的方式控制电机速度,节省硬件制作的成本、控制起来非常灵活,可以方便的实现车速控制,并且可以实现电机轮子的差速平滑转向,从而减少不必要的机械抖动,因为脉宽调制的频率比较高,单纯靠电枢电感的滤波就可以使得电流平滑,电流基本连续,调节速度的范围比较宽,缺点是软件实现略显复杂,对于高频的脉冲输出给负载会造成浪涌式冲击,消耗电机的使用寿命(该缺点可由并联电容滤波方式解决),控制精度一般,无法获得电机速度与位置的反馈。
方案三:采用带编码器的直流减速有刷电机并结合PWM与PID控制器实现电机速度闭环控制,首先通过脉冲宽度调制的方式去控制电机的转速,然后由STM32的编码器功能去实现电机转速测量,将测得的电机转速与设定值做差,基于偏差的控制方式去控制电机速度,该控制方案的优点非常明显,该控制方案采用的是基于偏差的闭环控制,闭环控制系统相对开环控制系统而言,稳定性与安全性、实时性等都得到了保障,在合适的比例因子、积分因子、微分因子的取值下,电机转速的上升时间、调节时间、稳态时间以及超调量都很小,系统的跟随效果好,有利于图像采集等,缺点是实现起来具有一定的复杂性,需要对PID算法的本质以及各个参数的调节非常清楚熟练,对自动控制原理要有一定的理解程度。
综合以上三个方案的优缺点与系统需求,本课题采用的是方案三,方案三不但结合了方案而的优点,而且加入了闭环控制方式,使得控制效果大大提升,为了解决方案二的缺点,在设计系统时加入小的滤波电容,使得电流更加平滑。减少高频脉冲带来的电机损耗。
1.2图像处理子系统
图像处理系统在机器人设计当中堪称时重中之重,图像识别是机器人的大脑,感知周围环境的变化,识别、检测、跟踪目标,该系统的实现有如下两个方案:
方案一:采用树莓派的ARM Soc作为机器人图像处理的处理器,在树莓派上搭建OpenCV运行环境,通过车载的方式将图像处理器与车体底层控制器STM32通过串口的方式实现数据传输,树莓派上直接访问摄像头硬件。该方案的优点是设计精巧、几乎没有图像传输延时,可以快速的采集图像数据,并且直接与底层STM32建立数据传输,缺点是硬件购置比较昂贵,搭建OpenCV运行环境比较困难,且由于树莓派3B+采用的是ARM的处理器Cortex-A53,图像运算能力非常有限,只能实现一些简单的图像处理算法,对于稍微复杂的算法在树莓派上跑起来显得心有余而力不足,可作为备选方案。
方案二:采用个人电脑来做OpenCV的图像处理器,在PC端运行Visual Studio 2019,将摄像头放置于机器人,PC机通过远程采集摄像头数据后跑OpenCV复杂算法,然后将处理后的结果(指令)通过无线方式远程反馈到STM32主控制器,实现远程数据处理。该方案实现起来相对容易,在PC机上可以跑一些复杂的图像处理算法,于CNN神经网络等,缺点是必须有一台PC机做远程图像识别,在PC机于STM32做数据传输的过程会出现图像延迟等问题。
综合上诉两个方案,本课题采用方案二作为本次研究的主选方案,方案一作为备选方案。由于知识做课题研究不必做过多的硬件开销,可以在原有的资源上获得研究成果,次方案的图像图像延迟等问题不影响研究效果,为了节约人力与不必要的开销,采用方案二是简单高效的。
1.3 图像传输子系统
在PC上做图像处理就必须考虑图像传输的问题,现在比较流行的图像传输有两个方案可供选择,其方案如下:
方案一:采用类似四轴航模图传的方式实现图像传输,航模的图传是用的非常广泛的一种图像传输方式,传输距离比较远,而且图传的图像延迟非常短,基本不影响PC端做图像处理。
方案二:采用WiFi的方式做图像传输,该传输方式略显繁琐,传输距离有限,普通的WiFi图像传输延迟相对图传来说长很多。
综合参考以上两种方案,本次选择方案二作为主选方案,方案一作为备选方案。

2机器人硬件电路设计

2.1直流电机驱动
由于本设计采用的是带编码器的减速直流电机,而且驱动电流比较大(堵转电流为5.4A),所以采用驱动能力比较强的TB6612FNG芯片来驱动电机,该芯片一共有两组H桥驱动电路,其中H桥驱动基本原理如图2.1.1所示。H桥一共由4个MOS管组成,VM代表电机的供电电源(最大电压不能超过15V),OUT1与OUT2代表电机的驱动电流输出端口,当左上角的MOS管与右下角的MOS管导通,其余两个MOS管关闭的时候,电机M的驱动电流为从左到右,假设此时电机M为正转,则相反的驱动右上角与左下角的MOS管,其他关闭时,驱动电机M的电流为从右至左,此时电机为反转。电路中的二极管起到电路的保护作用。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人
图2.1.1 H桥驱动原理图
TB6612FNG接线原理图如图2.1.2 所示,TB6612FNG芯片除了具备H桥驱动外,还可以通过PWM脉冲宽度驱动的方式去控制电机的转速,当改变PWM的占空比的时候,电机的速度也会做出相应的改变,因此非常适用于闭环控制系统的设计需求。STBY端口可以控制电机紧急刹车,防止程序电机失控(本次设计未使用该功能)。

opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图2.1.2 TB6612FNG接线原理图
2.2步进电机驱动
步进电机驱动采用A4988芯片,图2.1.3为A4988的接线原理图,该芯片可以自主发送步进电机运行所需的脉冲信号,通过跳线帽插头P24来选择脉冲的驱动模式,当MS1、MS2、MS3都为低电平时,则为16微步模式,输出的驱动电压能力高达35V、±2A,STEP为控制器发给A4988的脉冲信号,DIR则是步进电机的方向选择信号,芯片内部电路也是H桥的驱动结构。由于本设计的机械臂所使用的扭矩不是特别大,所以选用该芯片足以满足需求。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图2.2.1 A4988接线原理图

2.3陀螺仪(MPU6050)
利用陀螺仪可以获取机器人的运动状态,如方向信息,位置信息,抖动情况等等,通过IIC总线协议可以访问陀螺仪MPU6050寄存器中存储的数据,且可以通过向寄存器写入值来设置陀螺仪的工作模式,MPU6050基本原理如图2.3.1所示。陀螺仪共有三个轴,分别是X轴、Y轴、Z轴,其芯片内部使用的是三个16位的ADC,芯片读取内部的三个ADC模拟量后转换成数字量并且存入相应的寄存器当中,用户通过IIC协议访问这些寄存器便可以获取三轴转角数据。图2.3.2为陀螺仪芯片电路接线图,其中SCL与SDA为IIC总线,总线串联10K电阻起到限流作用。由于本次采用的是MPU6050的模块,所以硬件设计相对简单,图2.3.3为陀螺仪模块的硬件接线图。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图2.3.1 MPU6050基本原理图
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图2.3.2 MPU6050芯片电路设计图
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图2.3.3 MPU6050模块硬件接线图

2.4转速测量电路设计
应为本研究课题涉及到PID闭环控制,所以必须要使用编码器去检测直流电机的转速与转向,以构成闭环反馈网络。常见的测速装置有光电编码器与霍尔式编码器两种,光电编码器可以做到很高的检测精度,但是价格较贵,且抗干扰性不太好。本次采用的是霍尔传感器去检测电机转轴的转速。霍尔传感器本质是利用霍尔效应(当导体或者半导体处在与电流方向垂直的磁场中时,在其两端产生电位差),如图2.4.1所示,于半导体薄片两侧施加控制电流I,与此同时在半导体垂直方向上加入匀强磁场B,于是在垂直于电流和磁场的方向上产生Ur的电势差(也称霍尔电压)。半导体的厚度为d,霍尔系数和半导体的材料相关,这便是霍尔效应。利用霍尔效应制作转速测量装置,如图2.4.1中图所示,转子上带有一个旋转码盘,码盘周围有磁性间隔相反的永磁体,当霍尔元件检测到永磁体经过的时候,便会输出方波波,如图2.4.1右图所示,方波的频率和电机转速、永磁体数量成正比关系,永磁体越多,测量的精度越高,永磁体磁性越强,检测效果越好,当然也要在合适的范围内。图中只是例举了单个霍尔元件的检测原理,实际电路中为两个相互成一定角度的霍尔元件围着编码盘,分别检测出A、B两相,A相方波与B相方波相互成90度关系,这样便可以结合A、B两相方波来判断电机的转速与转向,利用A、B相可以实现四倍频,即只检测A、B相的边沿(上升沿与下降沿),这样可以提高传感器的检测精度。将检测到的信号通过放大器放大后输出到微控制器,控制器收到后做相应的计算处理,得到电机的转速信息。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图2.4.1霍尔传感器转速测量原理图

2.5基于舵机控制的机械手臂
舵机应用范围非常广泛,经常用于一些角度控制的机械当中,舵机其实里面就是一个伺服电机。一般舵机可分为直流和交流两种类型,直流伺服比较常用于工控,抗干扰性能良好,直流伺服倾向于小型领域,如玩具车,小型机械手等等,本设计所使用的是JX6221数码舵机,20kg的扭矩。数码舵机相对于模拟舵机反应迅速控制方便,对于舵机的控制,其里面为一个基准电路,产生出二十毫秒且宽度为1.5毫秒的基准信号,并且内部带有一个电位器作为电机的位置反馈信号,当电机转速一定的时候,通过多级减速齿轮传动控制并且其电机轴带动电位器一起转动,当电位器的电压值与目标位置的电压值一致的时候,其内部的电机驱动降使电机停止旋转。一般控制舵机只需要频率为50Hz的方波脉冲,其脉冲有效电平时间将决定舵机的旋转角度(一般是0.5毫秒至2.5毫秒),这个电平时间映射到电机转角的0度至180度(以180度满转角为例),PWM宽度与舵机轴转角对应关系如图2.5.1所示。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图2.5.1 PWM宽度与舵机转轴转角对应关系图
本设计机械手采用的是三轴机械手臂,因此至少需要三个舵机控制机械手的三轴旋转,另外一个舵机控制机械手的抓取,通过电脑端远程WiFi控制三个舵机的PWM占空比信号,便可以直接控制机械手做各种动作(如抓取物体,并且搬运到另一个地方)。
2.6系统硬件整体设计
如图2.6.1所示,本硬件设计总体包括STM32F1微控制器部分、TB6612FNG直流电机驱动部分、直流电器执行机构部分、基于OpenWRT的WiFi图像传输部分、OLED 128x64人机交互显示部分、用户独立按键部分、HC-12无线串口部分、舵机式云台部分、图像采集部分以及机械手部分等等,微控制器利用PID算法实时调节带编码器的直流电机的转速,另外通过IIC通讯接口与OLED显示器进行机器人速度信息、方向信息、位置信息等信息的实时显示,通过串口协议将机器人数据通过HC-12无线串口模块发送到PC的调试工具上查看,通过PWM的形式控制多级的转角。

opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图2.6.1 系统硬件结构整体设计图

3机器人软件设计

3.1 PID闭环控制软件算法设计
PID即Proportion(比例)、Integral(积分),Derivative(微分),PID算法是闭环控制中的一个非常经典的算法,通过PID算法软件的实现,可以很好的控制电机的速度,当车载机器人转向或者遇到不平坦的路面的时候,由于两个轮子所受到的力不一样,导致机器人出现偏离原来的行走路径。最重要的是机器人行走速度不均匀,是的采集的图像不够平滑,这样将严重影响图像处理,所以采用PID算法来优化。
该算法是基于偏差控制的,读取出霍尔传感器检测的速度减去设定的目标值。该算法又可以分为PI、PD控制,P控制比较简单,也就是系统输出量与误差构成比例关系,当偏差越大,则输出也就相应的成比例增加,其实可以看作是一个比例放大器,将偏差放大后交给输出调大比例系数可以减小调节时间,当比例系数设的过大的时候会使系统变得不稳定甚至发散。I控制为积分控制,由于单纯的P控制是不稳定且存在稳态误差的,为了减小且消除稳态误差,可以加入积分控制,对系统启动时刻起,累积系统开始时刻与当前时刻的误差,并且作用于输出,推动电机转速,使得速度尽可能的与目标转速相等,积分项使得系统到达稳态的时候没有稳态误差。微分控制D,也就是对系统误差变化率的微分,系统在抑制误差的过程中也许会出现抖动或者失控,呈现发散特性,此时对于自动控制系统而言就是欠阻尼状态,加入微分可以给系统施加阻尼,使得系统有一定的惯性,抑制抖动,微分控制也可以预测下一时刻速度的变化趋势,从而做出超前控制,在使用D控制时,最好是选择惯性比较小的控制对象,如果在惯性较大的对象中使用D控制没有太大效果,另外微分作用会对噪声比较敏感,使得系统的抗干扰特性变得薄弱,PID的原理框图如图所示,由于所使用的是数字控制器,处理器处理的只能是数字信号,为了使得控制方便,需要将模拟调节器进行离散化的处理,利用离散的差分方程代替连续的微分方程,使用累加代替积分,一阶差分代替一阶微。为了提高控制精度,本次设定PID控制部分程序在5ms的周期定时函数中处理,每隔5ms进如一次定时器中断,并用M法测速。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图3.1.1PID原理框图
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

PID的控制离散公式为:
(3.1)
式中:——比例系数;
——积分系数;
——微分系数;
——当前偏差,传感器检测的数值与目标设定值之差;
——上一时刻偏差;

在PID调参的时候显得最为重要,只有选取合适的参数,控制效果才显得突出,一般我们通过傅里叶变换和拉普拉斯变换来求得系统的响应,上升时间、如超调量、调节时间、稳态时间等,常用的调参方法为试凑法、经验法。
一般调节PID的时候,如果系统不是特别复杂,用试凑法来调试是比较简单高效的,将传感器读取的反馈值绘制成一条近似的曲线,并且分析它的系统响应,通过反复调整比例、积分、微分三个参数,使得系统输出响应时间快、跟随特性好、超调量小、输出尽早趋向稳定。
首先调节比例系数,逐渐增加比例系数,查看系统响应是否比较接近目标输出,直到系统略微出现震荡,在原有的比例基础上减小百分之十至百分之三十(需要留出一定的余量给积分与微分)。其次调节微分系数,逐渐增加微分控制,直到系统在达到稳态的时候没有稳态误差,与目标值一致即可,再减小一点比例与积分控制。最后如果系统响应显得缓慢与出现高频振荡,对控制系统还是不太满意,此时可以加入微分控制,抑制系统的抖动,加快整定速度,另外常用的PID参数取值如表3.1
表3.1 常用PID控制参数选取值
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

3.2 基于OpenCV的图像处理
OpenCV是跨平台的开源的计算机视觉库,可以很方便的在Linux、Windows、Android、Mac OS等平台上移植,其支持大多数流行的编程语言,如C++、Python、MATLAB等,并且提供了非常丰富的API。OpenCV由许多模块组成,如目标检测模块、2D特征校准模块、三维重建模块、视屏分析模块、图像拼接模块、加速模块以及神经网络模块等等。
3.3 OpenCV的图像处理的基础
如图3.3.1 所示,常见的色彩都可以三基色表示,三基色分别是RED红色GREEN绿色、BLUE蓝色,在计算机处理中,最常见的就是三通道的8位图像,所谓的三通道其实就是红色、绿色、蓝色三个颜色的通道,在以前的黑白电视中,最然只是单一的黑色,但是依然可以简单的显示出一幅图像来,其基本的原理就是根据黑色的亮暗程度的不同,被分成2的8次方(也就是256)个灰度等级,在某幅图像当中,关照强一些的,其值就越大,越接近256,关照强度月低的,其值就越小,越接近0。这便是单通道的灰度图像,有时候我们通常把三个通道的图像转换成单通道图像再去做相应的处理。三通道的图像也是如此,将三基色(红、绿、蓝)都分成8位的数字图像,通过三个颜色的叠加,基本上可以表示任意的一种颜色,当三个颜色的色值都为256,的时候,此时整个图像便为一个白色的图像。相反,当三个通道的颜色都为0值的时候,便是纯黑色的图像,三个颜色的8位图像可以任意组合成很多颜色。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图3.3.1 图像的三基色

3.4 图像模糊(Blur)处理
图像模糊处理是图像处理当中最基本的操作,也是非常重要的,为什么我们要将图像变得模糊不清的,按道理来所,图像不是越清晰越容易被识别并检测出来么?其实,得到清晰的图像是肯定需要的,图像模糊处理只是为了排除不必要的信息,最大化的将有效信息提取出来,一般地,在一幅图像当中会存在很多的噪点或者称为噪声,这些噪点也就是干扰我们做图像检测的难题之一,在识别一幅图像里,其实做的最多的就是如何去排除干扰信号,使对我们有用的信号被图取出来。如图3.4.1 与图3.4.2所示,前一副图像为原始图像,没有进行模糊处理,后衣服图像为模糊之后的图像,模糊前的图像所显示的信息比较清晰,也比较多,但是在图像处理中一般需要排除一些多余的信息,在模糊后的图像当中,显得更加平滑,但是现实的内容,字体不够完整。这个在图像处理当中可以用阈值化的方式来使图像的数据变得更加明显。

opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图3.4.1 模糊前的原始图像

opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图3.4.2 被模糊后的图像

3.5 WiFi图像传输
应为本设计的图像识别跟踪算法是在PC软件上面实现的,对于机器人STM32F1系列单片机无法完成复杂的图像运算。因此,本设计采用WIFI的的形式将机器人上面的摄像头的图像传到远程PC电脑上再做相应的处理。WiFi与上位机通讯就需要用到Socket通讯的方式,在OpenWRT路由器中作为一台服务器,PC机作为客户端,彼此建立TCP链接。TCP协议是面向链接的,与之对应的还有UDP通讯协议,TCP可以保证数据的真确呜呜的传输,没一次数据传输都会经过严格的核对校验数据,在机器人系统设计中,每一位数据都是至关重要的,在传输过程中出错时绝对不允许的。
如图3.5.1所示,为具体的TCP服务器与客户端建立通信的流程,首先OpenWRT中需要建立好服务器,在软件上为创建一个服务器套接字Socket,然后将该套接字绑定到本机的IP地址与端口号上面,接着监听是否有客户端发来连接的请求,如果服务器件接受到了客户端发来的连接请求,则进入连接状态,与客户端进行三次握手,确保数据传输的安全性与准确性。接着服务器与客户端便可以互相发送数据,只需要进行读写数据即可,数据交互的过程中,服务器发送数据,则客户端便进入数据接收状态,客户端发送数据,则服务器进入数据接收状态,通讯结束后便彼此都关闭该次通讯。在服务器等待接收客户端发来请求的时候,一般会进入阻塞状态。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图3.5.1 TCP通信流程图

opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图3.5.2 基于OpenWRT的WiFi图像传输服务器图
如图3.5.2所示,图中带黑色散热片与天线的便是实物的OpenWRT的WiFi图像传输服务器,该模块包含了一个串口,一个USB图像采集接口,一个迷你USB充电接口与信号指示灯、电源指示灯等,WiFi应为图像传输距离比较短,所以选择加入天线,增强图像传输的距离与质量。
3.6 图像光流跟踪
图像的跟踪对智能化机器人的设计是至关重要的前提,图像跟踪可以在检测到目标物体后对该目标物体进行实时的跟踪,图像的跟踪一般分为两种情况,其一为跟踪已经被识别出的图像,其二是跟踪未被识别出的图像,我们将三位坐标的物体转为二维坐标的图像,在图像中根据目标物体的像素位置反推出实际物体在图像中的位置坐标,实时跟踪对象。动态地扫描图像,其实连续显示的图像本质还是一帧一帧的图片,一般在WiFi图像传输中,图像的频率比较低,本设计的频率在30Hz左右,也就是一秒钟传输30帧的图像,但是图像的处理频率并不是一尘不变的,随着图像算法的处理难度不断增加,其处理的帧速也会相应的减慢,PC机的处理能力比较强,所以考虑在PC端做图像处理,在终端做图像采集。
常用的跟踪方法为光流对象跟踪,光流对象跟踪又可以分为稀疏光流-KLT和稠密光流-HF两种,机械手要想抓住物体,必须能够跟踪目标。本次介绍稠密光流跟踪的基本方法,该跟踪方法的跟踪三个基本要素还是三基色(红、绿、蓝),跟踪图像一般要把图像中的目标物体也就是ROI找出来,然后还要得知其外观模型特征,当物体的外观模型发生改变,或则移动位置。如此,计算机需要对物体从新识别并且继续跟踪,这就是跟踪算法的抗干扰能力,进行移动外观模型的预测与图像的表示,基于颜色跟踪的场景应用的不是特别多,一般都是根据其外观的模型进行跟踪。光流跟踪可以知道光流的移动,比如从一个位置移动到另外一个位置,光流呈现出逐渐移动的标记。光流跟踪前提需要物体产生移动,并且移动的速度在合适的范围之内,还有就是空间一致性,光线也需要一致,其跟踪数学表达式如式子3.6.1所示,用矩阵的表达形式见式子3.6.2,图像I在t时刻的位置为x,y,在t+1时刻分别在x、y上的移动位移为u与v,找出多个相同特征的点,并且利用最小二乘法便可以实现像素的跟踪,像素的移动距离u与v应该不能太大,否则便不符合跟踪的条件,像素点并不是所有的点都可以,只有一定的含有特征的x与y点才能作为跟踪像素,比如说已经被角点检测的点,这样可以将跟踪点的移动路径绘制出来,便可以看到其移动轨迹。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人
(3.6.1)
式中:——图像;
——某一像素的x坐标;
——某一像素的y坐标;
——像素在x坐标上发生的一小段位移u;
——像素在y坐标上发生的一小段位移v;
——时间;
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

             (3.6.2)

如图3.6.1所示,图中蓝色的线条便是被计算得到光流,红色的点代表移动物体图像的角点(特征点),当物体不断做慢速移动时,光流便可以实时的跟随笔的移动而移动。从而实现了物体的跟踪效果。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图3.6.1 光流跟踪笔效果图
其软件具体实现如图3.6.2所示,首先打开计算机外部摄像头,紧接着采集跟踪物体的图像,然后将图像色彩空间转换到二值的灰度图像,随后进行特征物体的角点检测,被检测的角点便可以当作被识别目标的特征点,随后利用稀疏光流KLT算法计算,再对图像的特征点进行过滤并绘制出光流轨迹与特征点。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图3.6.2 光流跟踪软件框架图

3.7 图像CAMShift跟踪
CAMShift与基于颜色识别的跟踪算法有很大的不同,看起来像是基于颜色识别,其实并不完全是,它是非常强大的一种跟踪器,通过上面的光流跟踪算法确实可以实现目标物体的跟踪,但是其受到的干扰比较大,于是考虑改进使用CAMShift跟踪算法,将更加适合机器人对搬运物体的识别与跟踪,单纯的光流跟踪效果并不好,因为它是基于特征点检测后跟踪的,那么有时候我们并不希望非ROI的区域被当作了特征区域,否则将导致跟踪目标不明确,CAMShift跟踪算法恰恰可以解决这个问题,CAMShift(连续自适应)跟踪算法是基于MeanShift(均值漂移)跟踪算法发展而来的,但是与MeanShift不同的地方为CAMShift的搜索窗口为自动调整大小的,比如,当一个球体,距离摄像头近或者远的时候,其检测的窗口会随着距离的变化而变化。那么如此有什么作用呢?很显然,这样我们可以通过检测窗口的大小去估测出物体的距离大概是多少,以方便后续控制机械手去抓取物体
如图3.7.1 所示,设检测跟踪目标为绿色的分布点,一开始检测的窗口为C1,图中黑色的圆表示,其圆心C1_O为黑色的矩形,由于黑色圆圈内的绿色点密度不一样,导致其检测窗口的质心往斜右上角偏,质心为黑色的椭圆点C1_r,C1_O与C1_r有一段距离,这两个点的连线便是窗口漂移的路径所在。窗口始终往质心偏移,最后窗口相对稳定了下来,移动到与圆C2重合,此时圆的质心和圆心基本在同一个点上,如此便很好的跟踪了绿点对象,CAMShift是在MeanShift的基础上实现窗口可以自适应跟踪对象在一帧图像中的相对大小的。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图3.7.1 MeanShift跟踪原理图
3.8 CAMShift跟踪软件处理流程图
如图3.8.1所示,该图介绍了CAMShift跟踪软件框架的基本实现框架,首先需要建立可靠的数据连接Socket,与服务器建立好连接之后便开始从远程服务器OpenWRT端获取图像流,紧接着创建检测目标的结构元素,本次为一个大小5x5与7x7的椭圆形结构元素,然后创建显示图像的窗口、创建拖动滑条,拖动滑条的创建是利用了OpenCV自带的GUI图形接口,创建滑条的目的是为了在PC端做一个简单的人机交互控制,一共创建了四个滑条,分别是:机器人左轮速度拖动滑条、机器人右轮速度拖动滑条、摄像头旋转角度滑条与滤波滑条等。之后需要创建并且启动第二个线程,第二个线程主要负责手动控制操作,第一个线程为自动识别控制操作,在主线程中判断是否为首次读取图像,如果是首次读取,则本次图像需要使用者在首次读取的图像中用鼠标框选需要检测跟踪的目标,比如要跟踪并抓取小球,只要在显示的图像中框选小球便可以。然后计算目标物体的直方图并且实现色彩空间的转换,最后利用反向投影去获取图像的色调等信息,根据这些信息便可以用CAMShift算法实现对象检测识别并跟踪等等。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图3.8.1 MeanShift跟踪软件流程图
被识别目标物体区域(ROI)的RGB色彩空间被转换成直方图后如图3.8.2所示。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图3.8.2 ROI目标物体直方图

在第二线程中主要负责的是检测PC的按键操作,比如当按下“Q”键的时候,调亮机器人左边的闪光灯,“A”键被按下后便是调暗机器人左边的闪光灯,可以控制灯报警闪烁与常亮、亮暗程度灯,控制摄像头的拍摄角度,机器人的转向,左轮的速度与右轮的速度,机械手舵机的转交等等。

4系统主要功能测试

4.1 PID机器人电机调速测试
如图4.1.1所示,该测试项目为,利用STM32程序软件的PID闭环控制算法调节机器人车体的移动速度,进过大量的实验测试并改进,最终实现的电机转速闭环的良好控制效果,增大比例可以提高系统的响应速度,增加积分可以消除静态误差,增加微分项可以抑制电机的抖动。实现了系统响应时间快,超调量小,调节时间短,且系统快速收敛的良好效果,机器人的两个带编码器直流有刷电机速度可以实现宏观上的同步,有利于机器人的精准移动与定位等。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图4.1.1 PID机器人电机调速测试图

4.2 机器人底层核心控制器主板测试
如图4.1.2所示,机器人的底层控制主板为STM32F1系列单片机,主板包含陀螺仪、STM32、直流电机驱动、步进电机驱动、OLED显示器、NRF24L01无线传输器、各种执行器接口、电源接口、CAN总线控制模块、舵机驱动等,经过系统测试,各项功能均正常,无线串口通讯测试图如图4.1.3为主板发送的数据信息,主板可以正常发送数据,而且数据中包含PID控制的反馈信息,从左到右一次为一号电机脉冲宽度、二号电机脉冲宽度、一号电机转速反馈、二号电机转速反馈、电机转速的偏差等。当转速偏差为零的时候表明系统电机的转速与目标设定转速一致,此时转速处于稳定状态。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图4.2.1 机器人底层控制主板图
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图4.2.2 主板无线串口通讯及其PID电机控制信息图
4.3 机器人供电分压电路测试
如图4.3.1所示,应为STM32单片机的供电电压为3.3伏左右,而舵机、电机驱动芯片等电压在5伏,带编码器的有刷直流电机额定电压为12伏特。因此需要此分压电路将航模电池电压(11伏)分成三个电压,分别给系统供电,经过整体测试,本电路可以很好的实现分压功能,而且电源纹波比较小而平滑。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图4.3.1 主板分压供电电路板图

4.4 OpenWRT远程摄像头图像采集测试
如图4.4.1所示,为了节约研究成本,购置的摄像头基本可以满足本次课题研究的需求,测试时,可以在远程PC端清晰地考到摄像头采集到的图像信息,如图4.4.2所示。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图4.4.1 远程图像采集摄像头
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图4.4.2 摄像头采集图像测试

4.5 CAMShift对象跟踪测试
如图4.5.1所示,利用CAMShift对象跟踪算法,机器人可以识别出手的位置,并且跟踪手的移动,被检测的物体被包含在红色圆圈内,圆的大小会随着被跟踪对象手的远近而相应的变大变小,这便是自适应的跟踪算法,且抗干扰性强,相对于单纯的颜色识别有很大的优势。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图4.5.1 MeanShift跟踪软件流程图
如图4.5.2与图4.5.3所示,机器人可以识别出小球与鼠标的位置、移动状态,并且实现对象跟踪,方便做物体的抓拿去,利用MeanShift跟踪算法,可以得知小球或则鼠标距离机器人的远近以及上下、左右的位置,通过次便可以实现物体的精确定位。

opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图4.5.2 MeanShift跟踪软件流程图
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图4.5.3 MeanShift跟踪软件流程图
4.6 系统整体效果展示
如图4.6.1,机器人整体硬件包含机械手臂、舵机、步进电机、大功率闪光灯、摄像头、航模电池、系统底层主控板、OpenWRT无线远程WiFi图像传输模块、电源分压器、机器人亚克力板框架、低电压报警器、全向轮带编码器有刷直流电机等等。
opencv可以和stm32,本科优秀论文(OpenCV&嵌入式),stm32,opencv,机器人

图4.6.1 机器人硬件部分整体效果图

5 结 论

结论:通过对本课题的研究, 让自己收获颇深,从硬件电路的PCB设计到控制器软件算法的实现,最后到图像部分的处理,中间设计到的数据传输等,都是非常复杂的过程,在硬件这块,因为电源电压的不稳定,还有就是系统中含有12V与3.3V并存,导致应为电路设计的不合理性而经常烧毁STM32控制芯片,换了3次主控芯片,主板采用全贴片式焊接。接着就是比较困难的图像处理,本次图像处理设计到的知识面比较广,由于自己的水平有限,尽可能地实现了对象的检测、标定识别与定位跟踪等。
关于遇到的问题,其实还是会遇到许多问题的,比如PID算法部分,应为采样频率的不够,会使得系统误差过大,导致调节失控,在比例、积分、微分参数的调节时,由于参数选取不当,导致电机经常出现失控的状态,甚至烧毁电源的保险,后面解决此问题是参考了相关的调参技巧,最常见的就是试凑法,慢慢的将参数调到合适的状态。图像中有也很多干扰值得去花大量时间研究,其中光线的干扰比较大,目标物体的光照不一样,反映出的色彩空间与直方图都有比较大的差异,在这块我也尝试使用机器学习Tensorflow的方式做更加智能化的对象识别与跟踪,这也是接下来自己应该加强改进的方向。
关于未来的改进,我将选择机器学习结合物联网去优化机器人,并且后续利用ROS系统去做,ROS是一款专门为机器人而生的操作系统,该系统可以方便的嵌入OpenCV、深度相机、激光雷达等等,可以利用SLAM建图导航算法实现机器人自动的、全方位的避障,类似扫地机器人,这是未来机器人发展的主流,值得去探索这项新的领域。

参考文献

[1] 刘正, 张奎, 曾小勤. 镁基轻质合金理论基础及其应用[M]. 北京: 机械工业出版社, 2002.
[2] D. M. Zang, R. W. Zhu, C. X. Wu, et al. Fabrication of stable superhydrophobic surface with improved anticorrosion property on magnesium alloy[J]. Scripta Materialia. 2013, 69(8): 614-617.
[3] 卢志文, 汪凌云, 潘复生等. 变形镁合金及其成形工艺[J]. 材料导报, 2004, (9): 39-42.
[4] 刘龙飞. 大块金属玻璃剪切带形成机理[D]. 北京:中国科学院力学研究所, 2006.

[1] 杨源鑫, 侯继红等. 嵌入式C语言技术实战开发[M]. 北京: 北京航空航天大学出版社, 2004, (9): 65-231.
[2] Lars Bengsson and Lennart Lindh. Low level C programming of microcontrolers[M]. Sweden. 2016, (10): 99-139.
[3] 刘火良, 杨森. FreeRTOS内核实现与应用开发实战指南[M]. 北京: 机械工业出版社, 2019, (2): 20-478.
[4] 刘杨振江, 朱敏波. 基于STM32 ARM 处理器的编程技术[M]. 西安: 西安电子科技大学出版社, 2016, (1): 233-353.
[5] 张毅刚. 基于Proteus的单片机课程的基础实验与课程设计[M]. 北京: 人民邮电出版社, 2017, (1): 227-235.
[6] 吴勇. 四周飞行器DIY-基于STM32微控制器[M]. 北京: 北京航空航天大学出版社, 2016, (1): 186-199.
[7] 韩建海. 工业机器人[M]. 北京: 华中科技大学出版社, 2015, (6): 5-130.
[8] 刘军, 张洋. STM32F7原理与应用[M]. 北京: 北京航空航天大学出版社, 2017, (5): 44-261.
[9] 胡寿松. 自动控制原理[M]. 北京: 科学出版社, 2013, (3): 66-115.
[10] 毛星云, 冷雪飞. OpenCV编程入门[M]. 北京: 电子工业出版社, 2015, (2): 3-143
[11] 朱伟. OpenCV图像处理编程实例[M]. 北京: 电子工业出版社, 2016, (5): 267-365.
[12] 张迪. Altium Designer17一体化设计高级教程[M]. 北京: 电子工业出版社, 2018, (1): 36-102.文章来源地址https://www.toymoban.com/news/detail-790801.html

到了这里,关于【基于STM32&OpenCV的车载机器人的抓取控制软件设计】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32 ARM+ FPGA 的软体机器人的 CAN总线运动控制器的设计

    针对在软体机器人控制时 , 多电机协同控制过程中难度大 、 通用性差 、 协同性差等缺点 , 设计了基于 ARM 和 FPGA 的软体机器人的控制器局域网络 ( controller area network , CAN ) 总线运动控制器 , 采用 ARMCortex-M4 为内核的 STM32F407 开发板和 AX7102 FPGA 开发板设计一种基于 C

    2024年02月13日
    浏览(62)
  • 78、基于STM32单片机学习型搬运机器人四自由度机械臂机械手遥感控制设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图  六、程序源码 七、资料包括  在当今大规模制造业中,企业为提高生产效率,保障产品质量,普遍重视生产过程的自动化程度,工业机器人作为自动

    2024年02月09日
    浏览(53)
  • 基于STM32F103控制舵机 仿真 简单二轴机器人逆运动学(20220615完成 正在处理三轴)

    本项目基于 正点原子精英(stm32f103zet6) 控制小舵机 模拟 二轴机器人逆运动学控制。 目录 概述: 1. 我的问题总结 2.stm32控制部分 与机械部分 2.1 对于二轴机器人设计 2.2 stm32 输出 pwm 2.3 舵机控制 3.正运动学 3.1 D-H建模下对姿态的描述 4.逆运动学 4.1 几何解法 4.2 代数解法 4.3 多重

    2023年04月20日
    浏览(64)
  • 六自由度JAKA机器人基于视觉的多颜色方块抓取(色块颜色识别、坐标提取、旋转角度提取)

    目录 一、任务描述 二、视觉处理方案(重点) 2.1 图像标定与单应性矩阵计算 2.2 目标坐标与旋转角度提取 三、运动控制方案 四、结果讨论 五、完整代码(无控制底层)         基于JAKA ZU3机器人平台与固定位置的彩色相机(非垂直),完成不同颜色木块的识别与抓取

    2024年02月02日
    浏览(104)
  • 基于kinova机器人搭建实际抓取环境;采用级联网络Cascade R-CNN提取特征

    点击这里下载源码 基于Pytorch深度学习框架进行整体环境搭建,包括数据集制作,模型训练,模型测试,模型优化;基于kinova机器人搭建实际抓取环境;采用级联网络Cascade R-CNN提取特征。 一、针对机器人多物体抓取检测研究问题,选用Cascade R-CNN为基础网络框架,Cascade R-CNN是

    2024年02月05日
    浏览(53)
  • 有方机器人 STM32智能小车 项目学习笔记2

    今天是学习有方机器人课程的第二天,通过课程复习GPIO相关知识点,很有收获,老师讲的非常好! 处理器在日常工作时有两种功能,第一个是负责 基本的数据运算和逻辑运算 ,第二是 控制硬件外设。 对于处理器来说,正常工作时需要去运行程序,而处理器本身只能运行程

    2024年02月22日
    浏览(42)
  • 有方机器人 STM32智能小车 项目学习笔记1

    今天开始学习有方机器人--智能小车项目,正点原子部分的学习先放一放,还是小车更有吸引力哈哈。 目前常用的 STM32 的开发方式主要有基于寄存器编程、基于标准库函数编程、基于 HAL 库编程这三种。 寄存器版本---最高效,最直接,需要对STM32内部结构十分了解,难度系数

    2024年02月21日
    浏览(40)
  • stm32毕设分享 单片机自动写字机器人设计与实现 - 物联网 嵌入式 stm32

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年01月21日
    浏览(88)
  • 单片机毕业设计 stm32智能扫地机器人设计与实现

    Hi,大家好,学长今天向大家介绍一个 单片机项目,大家可用于 课程设计 或 毕业设计 基于stm32的智能扫地机器人设计与实现 随着人口老龄化的到来和人民对提升生活品质的需要, 人们对在现实生活场景中取代人力的服务机器人有着迫切的需要。 同时, 机电、 自动控制、

    2024年02月04日
    浏览(57)
  • STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!

    01 前言 之前,我们出了一系列的STM32机器人控制开发教程,收到不少小伙伴的反馈,于是我们对教程进行了优化,并将增加新的内容和工具。 本教程使用的机器人控制板拥有4个带编码器的电机接口,4个舵机接口,串口通信接口、SWD下载调试接口、航模遥控接口、USB5V输出接

    2024年02月05日
    浏览(155)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包