Fork me on GitHub

JetsonTX2自主无人车原型开发

本科生培育的项目,目前已基本成型,涉及的技术包括:opencv,caffe,arduino,android

项目github地址:https://github.com/luxuantao/jetsontx2_car

前言

当初搞这个项目,纯粹是我一厢情愿。自从有了JetsonTX2开发板,就想着这么又贵又强的东西不用怎么行。断断续续搞了一学期,也算学了不少新东西。队里加我总共四个人,其中三个不干活的(没错,从头到尾只有我一个人在瞎忙活)。你问我有怨气吗,自然是有的,这学期第13周的时候,我把物体识别的任务交给了一位队友,就想着后面要期末考所以特地提前了些,结果他硬生生地拖到第十九周学期结束,都没有碰一下开发板。罢了,给他学习的机会他不要,又能怪谁呢?而且我在一开始申报项目时就做好了一带三的准备,那么好,opencv,caffe,arduino,android,全都由我一个人负责。

我不贴代码,arduino和android的全部代码可以从https://github.com/luxuantao/jetsontx2_car 获取。

这是一篇开发手札,主要是写给我自己看的,记录一下开发中遇到的问题。

已完成的目标

  • JetsonTX2架设在小车上,调用usb摄像头,能够识别出20种不同的物体,包括人,车,显示屏等等,并能将带有标记的流(实际上传的是图片)传回手机
  • 用于控制小车和显示回传视频的app
  • 小车用anduino开发,有两种运行模式:手动控制行驶(由app和anduino蓝牙通信实现)和自动行驶(由一组超声波模块+三组红外探测模块实现避障),可随时通过app切换模式

Arduino小车部分

最先做的是小车,网上买的小车零件,买回来后要自己全部一个个拼接起来,比如扩展板上,每一个排角,电阻都要自己焊上去。这里要感谢我的爸爸,他虽然不怎么懂编程,但是焊接东西他很拿手,帮我一个部件一个部件的焊好,前后焊了有一周的时间,感谢我的爸爸,没有他,第一步都没法完成。

小车上最重要的是这些模块:正前方的一组超声波云台模块,正前方/左前方/右前方各一组红外探测模块,以及一组蓝牙模块。为什么正前方又要装超声波又要装红外?因为超声波打的距离比较远,能提早做出判断,但是在车上的位置比较高,打不到较低的地方,所以我在低处补了一组红外探测模块,做两手准备。而左前方和右前方的红外探测模块是后来加的,因为当小车以接近四十五度角接近前方障碍时,无法通过正前方的超声波和红外探测到,所以我在左前方和右前方各补了一个红外,效果不错。

JetsonTX2部分

NVIDIA的JetsonTX2是比JetsonTX1性能更强的一块开发板(不过最近好像又有了一块比JetsonTX2还要厉害的开发板)。说它是开发板,其实并不准确,它其实是一台嵌入式计算机,由于其GPU的强大,专门用于做图像处理方面的工作。

刚到手的JetsonTX2是一台裸机,内置ubuntu16.04操作系统,看上去就和普通的计算机没什么两样。要让它变得更强,先要在NVIDIA的官网上下载JetPack开发包,装好后,就有了CUDA等一系列基础设施。

关于图像识别,我用的是Faster R-CNN ,但是用它之前,先要装好CaffePyCaffe ,但是装Caffe 之前,先要装好opencv 。是不是感觉挺麻烦的?没错,难就难在这,有不少依赖要装,而且要翻墙。给出一个很不错的博客,我基本上就是照着这个博客中所说的一步步做的,装了两天(其中caffe装了两遍,注意一定要用python2)。

opencv3安装:https://jkjung-avt.github.io/opencv3-on-tx2/

caffe安装:https://jkjung-avt.github.io/caffe-on-tx2/

opencv3和caffe都是下载源码在本地编译,所以很慢很慢。。。

然后就是套Faster R-CNNhttps://jkjung-avt.github.io/faster-rcnn/ ,用到了别人训练好的模型,细心的你会发现github上说这个模型已经废弃了,现在有更快的模型可以用。没错,Faster R-CNN 虽然有个Faster 但是它的速度真心不快,0.9秒识别一张图片(后面会提到如何加速),但是这个模型的准确度非常好,比起别的模型更具优势,所以我还是采用了这个模型。

那如何做到更快呢,https://jkjung-avt.github.io/making-frcn-faster/ 里面提到可以用GoogLeNet换掉速度较慢的VGG16 ,也就是对神经网络中的某一层做了改动,但是简简单单的这一步带来的改良是巨大的,在JetsonTX2开最佳性能的情况下sudo nvpmodel -m 0,可以做到0.5秒识别一张图片。

视频流可以选择使用板载摄像头或者自己搞个usb摄像头,我都试了下,运行后,opencv会在JetsonTX2上会新建一个窗口,里面实时显示带有识别框的图片,每0.5秒换一次图片。

Android部分

手机是通过蓝牙和小车交互,但是由于和JetsonTX2需要进行图片流的传输,数据量较大,所以采用Wifi,经TCP传输,socket通信。

https://jkjung-avt.github.io/faster-rcnn/ 中提到的demo_camera.py 自然不包括传图片的回手机的部分,这个需要自己实现。原本代码中用于显示在窗口中的每一张图片其实是一个三维的ndarray(长、宽和RGB),我的做法是把这个ndarray转换为照片先存在本地,然后再读取这个图片把它传输出去。这里有个坑,ndarray中的某两个颜色次序(好像是G和B)要反一下,不然生成的图片你会觉得颜色不对劲。

其他

我也试了试yolov3https://jkjung-avt.github.io/yolov3/ ,但是实际效果很差,主要是延时太久,理论上yolov3 的速度应该是最快的,可能是有什么没注意到的地方,今后再说。

PS:很多事情只能靠自己。

donate the author