欢迎大家关注我的B站:
偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com)
目录
[4 ROS内置的模型](#4 ROS内置的模型)
大家可以先阅读前两篇关于碰撞检测算法的介绍
1.基于圆覆盖
圆的性质是圆心到圆周各点等距,这非常适合碰撞检测,如果两个物体能近似为圆,那么两个物体之间是否碰撞,则可以利用两个圆心之间的距离是否大于半径之和就可以判断,但是大部分物体若用圆去近似将产生较大的冗余部分,因此针对汽车,一篇2010年的IEEE IV提出通过多个圆去覆盖车辆,这个方法极大地提高了自动驾驶汽车碰撞检测的计算速度,也是现在广泛使用的方法
但是这个方法仍旧会产生冗余,并且改变覆盖圆的个数难以解决这个问题,因为横向和纵向上的冗余是此消彼长 的关系,并且我个人认为汽车最容易发生碰撞的位置其实是汽车的四个角落,但是这种方法在那个地方没有安全距离,如果在圆的半径上补充安全距离,会导致其他地方的冗余距离更大,因此这个方法对于非常狭窄的空间还是不适用的
2.BVH
BVH为层次包围盒,通过递归地形式将碰撞检测的任务分解,当大包围盒之间有碰撞,则检测子包围盒之间有没有碰撞,这能够同时提升碰撞检测的精度和速度,但是基于BVH的碰撞检测取决于待检测物体的形状,每个基元都应该预先计算并存储在阵列中。
BVH的一个较好应用可以看这个视频,这篇论文实现了同时提升自动驾驶汽车碰撞检测的精度和速度,能够良好地应用于狭窄的自主泊车中
ITSC2023 | 碰撞检测 | 一种在狭窄空间内自动驾驶汽车自主泊车时的快速准确的碰撞检测方法
3.MATLAB自动驾驶工具箱
在MATLAB中也实现了基于圆覆盖的碰撞检测算法,同时碰撞检测通过栅格地图实现,详细内容可以参考官方给出的自动驾驶工具箱的相关文档
Costmap representing planning space around vehicle - MATLAB - MathWorks 中国
4 ROS内置的模型
对于ROS中的碰撞检测,很多参加智能车或电赛的同学可能比较熟悉,但其实也存在不少误区,有时候不是调参调不出来,而是没有真正理解这些参数的意义
robot_radius:设置机器人的半径,单位是米。如果你的机器人不是圆形的那就需要使用footprint这个参数,该参数是一个列表,其中的每一个坐标代表机器人上的一点,设置机器人的中心为[0,0],根据机器人不同的形状,找到机器人各凸出的坐标点即可,具体可参考下图来设置:
inflation_layer:膨胀层,用于在障碍物外标记一层危险区域,在路径规划时需要避开该危险区域
- 当你选用了footprint,那么膨胀层就没有意义了,因为只有你是圆形的,障碍物才能进行有意义的闵可夫斯基和运算
- 同时footprint是利用多边形计算代价,在耗算力,如果为了节省算力,可以用圆,冗余的部分当做缓冲就行
- 如果你发现怎么调膨胀距离都会碰,因为膨胀层仅在圆形时有效,因此为了使用有安全距离的footprint,必须直接扩大footprint
通过下图来认识下为何要设置膨胀层以及意义:
虽然我提到footprint情况下膨胀层没用,但是对于全局路径规划,ROS中默认机器人为质点,这时候膨胀层非常有用,假如你全局路径规划贴边走,那么对于实际机器人完全是碰撞的,这时候就需要膨胀障碍物了