前言

  新赛季讯飞创意组的规则出来了,作为去年参赛选手,可以给大家提供一些思路,能够更好的完成比赛。

正文

   今年的规则和去年相比,主体的部分变化不大,最主要的变化为数据集的变更以及根据识别的结果来判断每个区域的房型。

定位

  定位是完成比赛的基础,如果定位不准确,那么导航的效果将受到影响。小车自带的定位算法是根据编码器的数据获取线速度和角速度,积分得出位移和角度。但因为打滑等非系统误差,定位精度并不会很高,特别是在旋转过程中,定位误差将会很大。下面介绍几种提高导航定位的方法。

IMU的引入

  在base_dirver.cpp中,将编码器计算的角速度换成IMU计算的角速度,因为IMU得出的角速度精确度远比编码器得出的要高。

编码器标定

 编码器的数据根据车辆运动学模型解算过程中,由于每个车的硬件参数可能不同,会造成一定的误差,因此需要重新标定一下。控制小车前进1m的距离,通过实际距离和odom发布的距离进行对比,在odom计算代码中修改系数,减小误差的引入

滤波器的使用

 通过UKF,EKF等滤波器的使用,进行多传感器融合获取较为准确的位姿,推荐使用robot_ekf_pose或者robot_localizationg功能包,对odom数据和imu数据进行融合,也可以通过rf2o功能包引入激光里程计的数据。IMU和激光里程计的协方差矩阵可以通过小车实际转的角度以及行驶的距离,与各个传感器测量的结果进行对比,准确的传感器协方差小,不准确的协方差大来设置。

amcl功能包的使用

  通过amcl粒子滤波来减小odom到map之间的漂移误差,详情可以查看我的前几篇博客。

cartographer纯定位

  有兴趣的同学可以尝试cartographer的纯定位算法,但是这种算法的必须要通过cartographer建图才可以,并且cpu资源占用较大,具体过程会在下一篇博客中讲解。

导航

  其实导航部分对于大部分同学来说也许只是调参而已,无论是DWA算法还是TEB算法在ROS中都有很成熟的功能包,对于第一次参赛的选手们来说,需要做的是理解各个参数对于导航的影响,大家可以先通过仿真练习,再进行实际小车的配置。对于多次参数或者有一定基础的同学,可以尝试纯追踪算法,或者MPC算法。

识别

  对于识别来说,根据去年的经验来看,拍照识别比实时识别更加稳定、准确,因为小车在旋转过程中摄像头帧率不够会导致图像的模糊,无法进行识别。可以通过在每个区域拍两张图片,并且将其拼接成一张图片进行识别,拼接的方法可以根据特征点提取来做,网上有很多方法可以解决。

  关于数据集的制作,推荐使用小车的摄像头来拍摄,先进行图像的矫正,然后将小车放在识别的位置,多个角度,远近拍摄数据集,如果比赛细则说不会出现提供数据集之外的图片,那么仅需使用提供的数据集进行训练,大概500张绝对够。如果会出现数据集以外的图片,那么则需要在网上下载图片进行数据集的补充。

  关于深度学习框架的选择。去年我们队伍使用的是yolov4,当然经过测试v3-tiny也能很好的完成任务。今年我在仿真的时候选择了nanodet模型,相比于yolov3、v4来说,检测速度更快,在小车上能达到10+帧。如果同学们感兴趣可以去github下载0.2.0分支的版本。

 最后,如何根据识别结果来判断房型呢?根据识别的结果,如people,pet等,在python中使用set,判断本次识别的结果是否在预先设定的列表中。如:

result_list = [['tableware', 'table', 'food', 'people'],    # 餐厅
                ['people', 'pet', 'bed', 'table'],          # 卧室
                ['sofa', 'pet', 'table', 'tv']]             # 客厅

            if(set(self.tmp)<set(result_list[i])):
                self.result.append(i)

 同时,其实我们只需要小车在运行完毕的时候调用识别代码,在运行过程中不想因为识别代码占用太大的内存,这个时候就可以使用ros中服务的功能,当我们小车到达终点时,调用service,识别代码在接收到client后在开始识别图片,这种方式有效的减小了cpu的占用,给我们的导航留了足够的运行空间。

语音

  关于语音识别的部分,其实很简单,每次我们唤醒小车的时候,会向ros发布一个唤醒的角度,我们可以订阅唤醒角度来判断是否唤醒小车,当小车唤醒时给小车发布目标点即可。

结尾

  本章只是给了大家一个整体的思路,由于公平问题代码不会提供,希望大家不要把奖项看的很重,而是学习知识,代码的结构编写等,希望大家能取得好的成绩。最后我把仿真地图上传到github上,大家可以按需自取。

https://github.com/lzw12138/xf_map_gazebo.git

https://www.bilibili.com/video/BV1g54y1f7eN?share_source=copy_web