Ros小车应用篇(三)——网络摄像头YOLOV3实现小车跟踪目标

YOLO小车跟踪

在这里插入图片描述
在这里插入图片描述

  • yolo跟踪代码:https://download.csdn.net/download/zhuchen88988/20175153?spm=1001.2014.3001.5501

  • 小车博客:https://editor.csdn.net/md/?articleId=118612242

  • YOLOv3模型采用opencv dnn方式导入神经网络权重,再使用opencv读取视频流并转换为标准block接口进行前向传播。最后输出结果列表中存在物体质心,物体大小,物体标签置信度等等,将数据提出再进行画框。如果想要追踪目标就在循环中,判断标签是否属于要找的那个标签。

  • 详细opencv实现yoloV3可以看https://www.bilibili.com/video/BV18B4y1c7r4?p=11

oepncv使用Yolo注意点

  • 由于使用树莓派motion推流的网络摄像头,python读取视频如果处理不及时会造成极大程度卡顿,延时。
    所以想要解决卡顿问题需要使用重新编译源码的opencv gpu版本,在pip以及anaconda中中下载的opencv是无法使用GPU的。想要使用GPU版本opencv必须 安装cuda以及cudnn,通过cmake +vs 编译出来。网上有很多教程,不过可能会失败,如果想要一次成功,注意opencv版本和vs的版本如果opencv源码版本比较新,如4以上。建议vs版本也要在2016以上,cuda和cudnn版本也要比较新。反之 opencv在3.2以下,建议vs版本也要在2016以下,cuda,cudnn版本也要与之对应来。这样成功率比较高。
  • cmake配置opencv源码时候会出现github连不上的问题,经过百度可以手动下载下来,修改本地文件,或者,修改下载url,在github后加个s。或者直接翻墙。均可以解决这个问题
  • 还有一种解决延时的方法,是开启python多线程,一个线程读取视频流,另一线程yolo识别。读取视频流的线程做缓冲区,如果,yolo识别的结果反馈很慢,就丢弃后面的视频帧,这样也可以解决一些卡顿问题,但是这样会造成识别偶尔出现没有识别到目标的现象。
  • yolov3模型有好几个版本,我使用320分辨率,分辨率越高的版本识别效果越好,但是处理速度越慢。yolov3有一个最低配版本为yolo-tiny,网上有人在树莓派上使用神经网络加速棒可以在本地运行yolov3-tiny网络,不过帧率不搞。本文使用的是yolov3-320版本,GPU opencv帧率稳定在30帧左右。

通讯协议控制小车

  • python使用struct.pack函数打包字节流,并且可以指定大小端。非常方便。通讯协议按照我之前的博客https://blog.csdn.net/zhuchen88988/article/details/118637714?spm=1001.2014.3001.5501
  • 控制通讯源代码都封装成类在ROS_Car目录文件下。在Struct.py中可以看到其用法
  • 字节流的CRC校验还是用的C语言,通过MinGW 64(python 也是64位)编译出.so动态库,使用加载动态库的方法调用C语言的函数库。详细可以百度python调用C语言。当然python也是有CRC16校验库的,也可以通过python库实现。

小车跟踪

  • 小车实现跟踪目标原理即为,将摄像头识别到的目标一直处于镜头中央。yolo3前向传播后的结果中有物体的质心,即使得质心在屏幕中央即可。
  • 由于小车不能在Y轴方向上改变摄像头位置,所以只需要改变摄像头X轴(即左右轮速改变摄像头),使得物体质心处于摄像头中央,这可以使用PID进行调节,具体公式如下:V=Kperr+Kderr_last(没有加入积分),err即为目标与摄像头正中央水平轴X差距,PID实现如下:
def PIDX_result(Cx,Kp,Kd,PID_outputs):
    Ox = 320 #中点X位置
    global Vl_dir
    global Vr_dir
    global err_last
    global Vx
    if Cx !=0:


        if (Cx-Ox)<0:
            print("偏左")
            #偏左,右轮前向,左轮反向(原地左转向)
            Vl_dir=0x02
            Vr_dir=0x01

        elif (Cx-Ox)>0:
            print("偏右")
            #偏右,左轮向后,前轮相反(原地右转向)
            Vl_dir=0x01
            Vr_dir=0x02

    else :
        print("CX无值")
        Cx=320
        Vl_dir = 0x00
        Vr_dir = 0x00

    err=Cx-Ox

    err_D=err-err_last
    Vx=abs(float(Kp*err +Kd*err_D))

    err_last = err
    print("Vl_dir:",Vl_dir)
    print("Vr_dir:", Vr_dir)

    PID_outputs[0]=Vl_dir
    PID_outputs[1]=Vr_dir
    PID_outputs[2]=Vx

    return PID_outputs

  • 同理如果为飞控的话,可以加上Y轴,达到完美的跟踪目标。
如何通过目标追踪功能制作一个手机摄像头实时跟踪小车,该设计运用OpenCV的图像处理APP,手机APP通过摄像头实时跟踪设定的颜色目标,并且通过手机蓝牙将目标坐标位置和大小等信息输出,配合蓝牙串口模块和我写的配套Arduino数据接收库,就可以做成一个简单的手机跟踪寻迹小车。 手机实时跟踪寻迹小车视频演示: 手机实时跟踪寻迹小车手机APP截图: 安装方法: 1.直接安装Trace.apk,Android5.0以上系统需要到设置里赋予应用相机和蓝牙权限 2.在豌豆荚搜索“迹”安装,同上 使用方法: 1.进软件之后可以点击连接蓝牙,选择你的蓝牙模块(模块需要事先在手机系统蓝牙设置里面配对好),连接上之后如果有目标信息就会通过蓝牙发送到模块上,Arduino进行读取就可以了。 2.点击左上角的按钮进入预览画面,此时在预览窗口中点击任何一个你想追踪的物体,就会自动进行处理输出数据了,顶栏会显示你选中的颜色。 3.这里说明一下,跟踪原理是以颜色为特征的,所以应该尽量避免视野中出现颜色相同的物体,同时如果发现跟踪物体的周围出现大量小块的目标块,可以适当调大屏幕下方的进度条,直到杂块消失只剩一个目标。 说明一下屏幕下方各个控件的含义: 1.左边的按钮是切换手机前后镜头的(现在应该没有不带前置镜头的手机了吧…) 2.进度条用于调节图像处理阈值,这个值用于色块过滤,可以理解为,用于设置最小的目标块的限制,也就是当目标小于一定程度就过滤掉。 3.T、X、Y个参数是目标的信息,XY是坐标大家都知道(坐标的最大值跟手机镜头分辨率有关);T是目标的大小信息,如果检测到多个目标或者没有检测到任何目标这里会显示E(error)。T可以用于粗略得判断物体的远近(近大远小),不过更推荐的方式是用Y轴判断远近(见后文的小车)。 手机实时跟踪寻迹小车设计总结: 这个小车大家可以随意搭建,只要能把你的手机放上去就行。Tmp上我用了两个舵机改造成轮子,把180度的舵机改成可以连续旋转的360舵机,这样就省下了电机驱动以及麻烦的减速箱,而且只用一根信号线就可以控制电机的正反转和速度,这部分要是大家感兴趣可以上网搜搜相关改造教程。 然后我们需要把小车和手机联系起来,通过蓝牙模块: 需要使用从机模块,最好把波特率设置为115200,连线如下: 蓝牙模块 Arduino Tx -> Rx Vcc -> 5V Gnd -> Gnd 1.注意蓝牙的Rx是不接Arduino的,因为Arduino只需要接收APP的数据而不需要发送,这样的话留出的Tx就可以通过Serial.Print()打印到电脑端的串口助手。 2.当然,考虑到一般Arduino都只有一个硬件串口,这样串口被蓝牙模块占用了之后每次下载都需要拔下蓝牙以避免数据串扰,解决办法是换用软串口或者换用Mega等不止一个串口的板子。 3.软件部分,提供已经封装好的Arduino库,放到library文件夹后打开示例就会用了 需要自己完成的部分就是,把获取到的x,y坐标转换为小车电机的速度,思路是这样的: 1.假设我们希望目标始终在屏幕中间,那么当y坐标大于屏幕y最大值的一半时让车有一个往前的基础速度V,反 之则是向后的基础速度-V; 2.如果x坐标大于屏幕x最大值的一半,那么让车子有一个旋转速度Vt,反之有个旋转速度-Vt; 最后赋值给小车的速度是:左轮 = V+Vt,右轮 = V-Vt,也就是所谓的差速驱动了。 最后给出APP和Arduino库,见“相关文件”下载。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值