说明

能够取得ROS组的亚军对我来说三一个很满意的结果,既有运气也有努力。
已经有不少小伙伴跟我聊过希望看一下代码啦。

之前的代码一直有一个远程仓库在码云上,现在解除了它的私有状态了,大家可以去这里码云地址查看我的代码。
或者可以直接在这里面下载项目下载地址
说实话,代码可能写的比较粗糙,除了yolo那一块和爬虫那一块是拿python写的,其它都是C++,这里为就叫他C++吧,哈哈哈,或者叫C++的C语言写法更贴切,毕竟作为一个老单片机玩家,C++的许多编程习惯都没跟上。
其实也没有很特别的东西,大家有什么疑问可以联系为QQ(1809078069),欢迎大佬们来交流指正的。
看代码之前建议大家把制表符宽度改位2,会舒适许多

文件结构


baidu_picture_downloader:其中的main.py为从网上获取图片的程序,因为比赛需要识别眼镜和头发,训练需要数据集嘛,数据集就是这么来的,哈哈哈。这个稍微看一下代码就晓得怎么用啦,需要在data文件夹里提前创建好以搜索关键字命名的文件夹,嗯,我训练用的九千多张图片都是这么来的。
control_test:任务的主体代码,这里看一下它的launch文件,里面参数都有简短注释,都是字面意思,stop_point取值范围是0/1/2代表三个停车点;B是B区识别二维码的停车点位置;C是到达C区的停车点位置,由于需要在C区识别任务模型所以在C区域摄制了一个停车点;D1/D2/D3是终点位置;预留1/预留2为国赛增加了两个人物模型摆放位置,所以加了俩停车点停下来拍照;以上位置都是map坐标系下。
fdilink_ahrs:没用,老版本车模的imu驱动。
finnal:负责到达终点的时候播报,主要是为最终识别图片多争取点时间,赛方要求10s内开始播报,为想在播报的过程中争取一些时间用来识别,后来发现多此一举,没啥大作用,最终沦为停车后计时的工具,这里为停车后应该三设置为5s开始播报。
gazebo_nav:导航相关,movebase那一套,参数在config文件夹里,启动文件是ifly_nav_demo.launch,这个以后再细表。
geometry:官方给的,不晓得有什么用。
geometry2:同上。
laserscan:之前有想过用激光雷达来给人物模型做定位,就是通过激光雷达数据来判断人物模型的位置,但是识别结果过于神经病,被放弃了。
map:存放的是建图的参数,建图选的gmapping,参数也在里面,里面有俩map是通过车跑出来的效果还行,没有被采用,不过最后还是采用了仿真建图,最终采用的地图在gazebo_nav里看得到。
mp3:语音播报的mp3文件。
opencv_test:视觉相关任务的代码。launch文件里面里面有一些参数需要说明,实际上后面都有注释,结合代码看一眼就知道干了些什么。有几个文件夹,用来查看小车行使过程中拍到的图片,aruco是存放B区域照片的,yoloP三存放C区域和全局人物模型拍照的,这仨文件夹具体可以看opencv_test.cpp看一眼就晓得了。yolo_debug和yolo文件夹三关于YOLO处理得到的图片,方便我临场调试,具体看detect1.py和detect2.py看一眼就晓得了。
radio:贪玩写的遥控器控制程序,可以遥控控制和语言控制,还有“炫酷RGB指示”。
run_test:相当于任务调度器的东西,由这个决定我的车子当前处于什么状态,语音控制/处理视觉任务/导航。
serial_port:解码IBUS,我用的遥控器是神控福斯i6,这个是解析遥控器通道值的。
startup_scripts:官方给的脚本,具体作用就是该设备规则。
ucar_cam:官方给的摄像头例子,有借鉴意义。
ucar_controller:官方给的底盘控制,这个很重要,base_driver.cpp被为修改过,这个以后再细表。
ucar_map:官方给的建图例子。
ucar_nav:官方给的导航例子。
udev:设备规则,/etc/udev/rules.d文件夹下面的,为加上了遥控器接收端的串口,所以加了一个,这个是为留的备份。
voic_test:根据与因识别结果发送不同的数值出去,原因是为觉得每次看语音识别结果都得对比字符串让我写代码非常不爽,所以就多次一举了,图个快乐。
xf_mic_asr_offline:语音SDK相关,借用的平衡小车之家的方案,魔改了许多,要资料可以找我或者找平衡小车之家,平衡小车之家现在改名叫东莞市微宏智能科技,没啥子很特别的东西,pass。
ydlidar:官方给的激光雷达驱动例子,ydlidar.launch里面samp_rate参数改成了4,因为为在初始定位的时候用了激光雷达数据,如果默认为9的话会经常扫不出来赛道挡板造成没法初始化小车的定位,这个以后再细表。
yolo:识别任务的主要内容在detect1.py和detect2.py,省赛用的detect1.py,国赛用的detect2.py,方案变了,weights文件夹里lastrr.pt是识别八种不同姿态的,国赛方案;lasts.pt和last.pt是识别眼睛和长头发的模型,省赛方案,这俩识别效果都差不多;yolov5s.pt是官方的模型文件,省赛方案里有用到。识别方案以后细表。
这个是识别八种不同姿态的分类,这是从东北大学的付佬那里借鉴的思路,十分感谢:

启动文件

看代码最好的方式当然是依次看啦,启动文件有顺序的,大家可以根据启动文件来看代码,这样子方便理逻辑。
比赛里我的启动文件依次是

看一眼启动文件就晓得我调用了那些程序啦。

最后

关于这个代码,写的没那么漂亮,反正比赛比完了为也懒得整理了,想复现可以联系我,我把环境也给你,不然可能会有一些小错误。
我觉得美必要去复现,本来就不算什么好代码,看一看了解一下思路就行,借鉴一下导航方式或者识别方案什么的。
有一些东西这篇文章三讲不完的,这个以后再细表。
大家如果觉得还行可以等待我后面的博客,关于导航参数和识别什么的后面再发博哈。
不肝了,睡觉,梦里有妹子~。