前言

来了,来了,它来了,小沐线下调车笔记第二弹,有没有想我呢~
这次和学弟调车真的是痛苦嗷~之前的文章我还说本来我并不打算帮学弟调试实体车的(打脸~~~~),可是我们的小车车的运行效果多少有点不尽人意。不得不说,智能车比赛的魅力真的是无限大,我是真顶不住心里的瘾虫,于是陪着学弟优化了一波,真是不优化不知道,这次的车的问题多少有点不一样。

正文

可能是我之前都是拿minipc做上位机的原因吧,我总是把参数调的很大,nano和minipc的算力多少是有点不一样的,于是nano的算力总是跟不上,就会警告,如下

遇到这个就是说明参数调的太离谱了,nano的性能搞不定了,可以尝试降低代价地图costmap,move_base中的导航相对应的参数。
值得一体的是,我们在解决这个问题的时候,我的学弟发现一个现象就是注释掉规划器,这个算力的问题就不会报了,然后车可以继续导航,很神奇……
不过各位小伙伴这种方法是不对的嗷~你把规划器注释了,你就是在凭感觉裸奔啊,一不留神就车毁人亡了,我们测试的时候就起飞了好几次,这里能跑,初步估计是movebase根据特定的参数跟踪的,不具备完整的导航功能,所以遇到问题千万不要采取这种方式解决。
不知道大家都使用的什么局部规划器,所以我决定给大家科普一下必须用到的costmap_common_params,经过测试这个文件的参数对比赛还是至关重要的。
给出如下参数(具体参数可通过查阅roswiki)


robot_radius: 0.2

obstacle_layer:
  enabled: true
  combination_method: 1
  track_unknown_space: true
  obstacle_range: 2.5
  raytrace_range: 3.0
  observation_sources: laser_scan_sensor
  laser_scan_sensor: {
    sensor_frame: /robot0_laser_0,
    data_type: LaserScan,
    topic: /robot0/laser_0,
    marking: true,
    clearing: true
  }

inflation_layer:
  enabled: true
  cost_scaling_factor: 5.0
  inflation_radius: 0.36

static_layer:
  enabled: true

robot_radius是用来设置机器人的半径,单位是米,根据自己机器人模型进行选择填写,如果机器人是圆形,直接填写机器人半径即可,如果不是圆形,就需要使用footprint这个参数对机器人的边界进行勾勒,我们设置机器人的中心为[0,0],这里放一个图方便大家理解。

下面介绍一些参数:
robot_radius这个参数其实是很重要的。系统学习过ros的导航功能包的同学都知道这个参数的作用,我们的机器人导航时,是以这个参数为标准,在栅格地图中判断机器人机体是否会与障碍物发生碰撞,然后决定导航路线是否可以进行的。由于这个参数是我们自己定的,所以在某些特殊的条件下,我们可以把将其设置的小于车的本体,这样虽然有碰撞的危险,但是大大提升了机器人的灵活性。
obstacle_layer是配置障碍物图层。该图层是否启用决定了机器人是否可以躲避导航路径的障碍物,有很多同学发问机器人不能够躲避障碍,极大地可能就是没有启用该层。(ps:也有可能是局部路径参数有问题)参数enabled:是否启用该层;combination_method:只能设置为0或1,用来更新地图上的代价值,一般设置为1;obstacle_range:设置机器人检测障碍物的最大范围;raytrace_range:在机器人移动过程中,实时清除代价地图上的障碍物的最大范围,更新可自由移动的空间数据。observation_sources:设置导航中所使用的传感器,具体传感器不具体解释了。
inflation_layer:膨胀层,用于在障碍物外标记一层危险区域,在路径规划时需要避开该危险区域。cost_scaling_factor:膨胀过程中应用到代价值的比例因子,值得一提的是增大比例因子反而会降低代价,为了让大家记忆深刻,这里不具体介绍其原理,请大家动动小手自行百度其原理。inflation_radius:膨胀半径,如果机器人经常撞到障碍物就需要增大该值,若经常无法通过狭窄地方就减小该值。
Static_layer:静态地图层,即SLAM中构建的地图层
这里就要有同学问了,膨胀层是怎么个运行模式哩,一张图片告诉大家:

结合栅格地图的原理,一看便知,嗯,应该足够简单粗暴了。

关于二维码

这里我们没有用什么特殊的,我是在终端直接安装的ros的二进制功能包,识别效果还不错,毕竟也没有用到什么特别高超的技术。

关于识别人物

关于识别有很多方案,常用的三个深度学习框架有tensorflow、yolo、Caffe三个,我们是cafee用的不多,常用tensorflow和yolo,令人足够兴奋的的是ros支持这两种学习框架,并且能够达到良好的效果,但是本次的识别任务并不是笔者本人在做,又因为比赛所以就不过多的分析这两个方案了。
但是识别这里有一个相对的难点我想提一下,小车的摄像头其实分辨率并不高,所以离识别人物模型比较远的话,小车摄像头糊糊一片,什么特征点在这个像素之下都没了。对此有个不太成熟的方案,我们可以先用摄像头得到对障碍物的距离,然后让小车跟进障碍物然后再识别,不过这个方案对于编程要求有一些要求,而且如果运气不好,还要识别两个,就需要进入c区之后就要先识别有几个人物,然后再分别进行跟进,时间会有一些浪费,不过识别一个人物减少30s,多少有一些诱人啊……

有一个调参利器

Todesk,一个远程控制软件,它支持linux系统,相对向日葵来说速度更快(个人觉得,还免费,白嫖啊兄弟们!),然后本次的小车cpu架构也是支持的,不知道大家经过网络优化之后摄像头传来的图像怎么样,反正我是巨卡,本来想着配置vnc,但是有个大佬说这个可以用,由于个人比较懒,恰好自己还是这个软件的使用者知道这个东西配置简单,所以我就替大家试了试,经过测试,效果不错,虽然摄像头有一丢丢延迟(比起ppt,好太多了),但是问题不大,效果可以说是很棒了,而且这个远程主要还是看网速,所以这个延迟可能是因为网速的原因,我们实验室一堆人……而且因为是远程控制桌面,所以可以直接修改参数,方便快捷,和vnc是一样的,个人使用不错,故在此推荐给大家,让大家免受不停拔显示器的痛苦~放个图标,方便大家找(ps:百度搜索即可)。

结语

这次的分享暂时先到这里了,马上就要比赛了,希望大家都能有一个好成绩,等比赛结束后,我会从头到尾刨析我们的工程。另外准备更新自己的一个学习笔记系列,比赛完之后就开始上了,希望各位大佬多多关照。笔者能力有限,如有错误还请评论,如果大家有什么好的想法但是没时间做,可以评论留言,我可以帮大家复现复现,最后祝各位同学比赛旗开得胜!!!