图片来自网络摄影|网络
#1 碰撞检测的意义
自动驾驶轨迹规划中,为了安全,我们需要避免和障碍物(他车、行人、动物或者静态的物体)发生碰撞,因此在轨迹上我们需要进行碰撞检测。
多条车道中可能产生碰撞的情况
在轨迹规划中,自车(ego)和他车可以等效成一个多边形,那么碰撞检测实际转换为多边形是否相交(intersect)。
#2 libgeo和shapely介绍
目前判断点、线、多边形之间的关系比较成熟,也有很多现有的算法。不同的算法涉及的时间复杂程度不一样,对于计算的时间也大相径庭。这里介绍一个计算比较快的库—— libgeos。
这是一个C++写的库,具体信息可以访问这个链接
GEOS: geos::algorithm Namespace Referencehttps://libgeos.org/doxygen/namespacegeos_1_1algorithm.html
shapely是一个基于libgeos的Python库,它提供了很多函数,可以实现多边形、线、点之间关系的判断。
#3 shapely 实例
在shapely中根据点的坐标,即可将一系列点转换为多边形(Polygon)对象,针对多边形对象,可以非常方便统计空间关系、计算空间距离、面积等统计量。也可以轻松得到多边形的凸包、AABB边缘以及相交的多边形对象。而且多边形对象能够轻松获取到点坐标,非常方便。
-
a 生成多边形的AABB外边界
生成多边形的AABB边界
env_0 = polygon1.envelope
-
b 点到多边形距离
点(3,0)到poly_2的距离
p1 = Point((3,0))
print(p1.distance(polygon2)) # 1.4142135623730951
p2 = Point((5.5,0.5))
print(p2.distance(polygon2)) # 0.0
p3 = Point((5.5,-0.5))
print(p3.distance(polygon2)) # 0.5
-
c 生成多个多边形的凸包
shapely生成凸外边界的例子
convex_res = polygon_res.convex_hull
-
d 多边形和点的关系判断
两个多边形和两个点
print(polygon0.contains(p1)) # True
print(polygon0.contains(p2)) # False
print(polygon1.contains(p1)) # False
print(polygon1.contains(p2)) # True
-
e 多边形和线段的关系判断
两个多边形和三条线段
print(polygon0.contains(l1)) # True
print(polygon0.contains(l2)) # False
print(polygon0.contains(l3)) # False
print(polygon1.contains(l1)) # False
print(polygon1.contains(l2)) # False
print(polygon1.contains(l3)) # True
print(polygon0.intersects(l1)) # True
print(polygon0.intersects(l2)) # True
print(polygon0.intersects(l3)) # False
print(polygon1.intersects(l1)) # False
print(polygon1.intersects(l2)) # True
print(polygon1.intersects(l3)) # True
-
f 多边形和多边形的关系判断
三个多边形关系
print(polygon0.contains(polygon1)) # False
print(polygon0.contains(polygon2)) # False
print(polygon1.contains(polygon2)) # False
print(polygon0.intersects(polygon1)) # True
print(polygon0.intersects(polygon2)) # False
print(polygon1.intersects(polygon2)) # True
#4 结语
关于点与多边形的判断算法可参考这个文章
几何关系判断算法是很有意思的一个话题,有兴趣的可以阅读书《Graphics Gems III》系列。
多边形和点的关系判断对于生成安全的轨迹十分重要,高性能的判断方案能够提前感知危险,尽快绕过危险障碍物。
感兴趣,可以关注公众号elegantcoin,接受更多消息