好久不见朋友们,首先祝大家新年好呀!新的一年,祝大家牛年大吉,万事如意,bug少点,笑容多点!!!
年前本着学习的精神,入手了一款激光雷达。因为是第一次接触这类传感器,所以想着便宜,性价比高的硬件就好。因此买的就是rplidar a1这款雷达,根据商家提供的资料,用hector建图的方法建了室内的地图,效果从建图中看得还行。
但是,从一开始接触ros开始,我发现主流的机器人激光雷达都放在车顶的位置,这点让我十分疑惑。比如创客智造的机器人turtlebot系列,ros小课堂的全向轮机器人系列,平衡小车之家的几款产品,他们的激光雷达都是放在车顶位置。
一开始我觉得这不符合常理啊,激光雷达放在机器人上大的主要功能是建图和避障以及一些测距功能,除去测距功能,激光雷达应该放在车底的位置才对,因为在一些障碍物多的环境中,某些障碍物是很低的。(比如一些低的凳子,小玩具,塑料瓶,垃圾桶等等)如果障碍物放的太高不就出问题了,万一碰上了怎么办? 当实际拿到激光雷达后,进行一些测试和放车试跑时,我才能明白那些将雷达固定到小车上的痛处。激光雷达在测距时(或测量障碍物时),有一个值是我们十分关心的,也是就是测量的最大值。比如官方文档中给出的a1测距最大值就是12m,但是我们常常会忽略一个重要的参数,那就是激光雷达测距的最小值,那么肯定有朋友问:我要这最小值干什么?因为大部分的机器人身上我们可以看到,机器人本体的半径就已经超过了雷达的测距的最小值,所以根本不需要担心机器人躲不过障碍物的情况。 但是这就需要一个很重要的条件,那就是激光雷达放在机器人本体上时,跟激光雷达测量平行高度的两侧不应该有机器人的本体结构。如果有的话,那激光雷达检测到返回的激光数据,会直接判定多少米处有障碍物,上位机进行数据处理后很可能判断机器人已经撞在障碍物上了。 所以这也是我觉得市面上机器人激光雷达放在机器人顶上的一个原因吧。 但是这值得我们思考很多,有没有什么方法可以进行小小的改进呢?以下是我把激光雷达放在机器人底部的一张图片,可以看到激光雷达处于第二层的蓝色电池上,它的周围有结构本体的三个支架。因此一开始在rviz显示的粒子图中,可以发现周围是有障碍物的。
但是从图中我们可以发现,这个全向机器人高度太高了,实测大概60cm左右,如果把雷达直接放在机器人顶上是根本不现实的。那么我们只能从其他方面入手去解决这个问题。 我们刚才提到了激光雷达所谓的最小测量距离,我想这个值是受硬件限制的,而不是我们软件代码中要求的。现在在想想我们的问题,我们想把雷达固定在一个低的位置,而又不能检测到机器人本体,那应该怎么办呢?相信你和我想的一样,那就是改变激光雷达测距地最小距离,或者说是把某一范围的数据给剔除掉。那么接下来就要将我们的中心移到代码中。 雷达的驱动代码这里就不直接展示了,因为属于源码,所以只列一些重要段落进行分析,以下是rplidar a1的部分驱动代码。
上述代码从头看,字面意思就是正反先进行判断,接下来进到一组循环函数,获取激光雷达的数据并赋值到各个角度。然后又是一组判断语句,判断条件就是读取的值是否为零,如果为零就赋值无穷大,不为零就是读取的值,下面的else语句就是区分正反转时另一种情况。 赋值为无穷大,显然就是忽略了这个数据,不进行处理,在这一点入手可能就解决了我们刚刚的问题。那我们将判断语句的值再扩大范围,将雷达与支柱的距离放在不做处理的数据范围内,问题可能就解决了。
还有一个问题就是在scan_msg有测量最大值和最小值,本来我是想通过改变最小值直接解决,但是却发现最小值在源码中仅仅赋了个值,后续就没有再出现了。如果有同学知道,欢迎在评论区热烈讨论呀!最后,祝大家新年快乐!!!