自动驾驶【基于libgeos的碰撞检测】

图片来自网络摄影|网络

#1 碰撞检测的意义

自动驾驶轨迹规划中,为了安全,我们需要避免和障碍物(他车、行人、动物或者静态的物体)发生碰撞,因此在轨迹上我们需要进行碰撞检测。

多条车道中可能产生碰撞的情况

在轨迹规划中,自车(ego)和他车可以等效成一个多边形,那么碰撞检测实际转换为多边形是否相交(intersect)。

#2 libgeo和shapely介绍

目前判断点、线、多边形之间的关系比较成熟,也有很多现有的算法。不同的算法涉及的时间复杂程度不一样,对于计算的时间也大相径庭。这里介绍一个计算比较快的库—— libgeos。

这是一个C++写的库,具体信息可以访问这个链接

GEOS: geos::algorithm Namespace Referencehttps://libgeos.org/doxygen/namespacegeos_1_1algorithm.html

shapely是一个基于libgeos的Python库,它提供了很多函数,可以实现多边形、线、点之间关系的判断。

The Shapely User Manual — Shapely 1.8.2 documentationhttps://shapely.readthedocs.io/en/stable/manual.html

#3 shapely 实例

在shapely中根据点的坐标,即可将一系列点转换为多边形(Polygon)对象,针对多边形对象,可以非常方便统计空间关系、计算空间距离、面积等统计量。也可以轻松得到多边形的凸包、AABB边缘以及相交的多边形对象。而且多边形对象能够轻松获取到点坐标,非常方便。

GEOS库学习之三:空间关系、DE-9IM和谓词 - denny402 - 博客园要判断两个多边形的关系,实际上属于几何图形空间关系判断。几何图形并不只有多边形一种,它包括点、线、面构成的任何图形,两两之间相互关系也有很多种,因此空间关系非常复杂。根据前人的研究,总结出了DE-9Ihttps://www.cnblogs.com/denny402/p/4968201.html

  • 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 结语

关于点与多边形的判断算法可参考这个文章

详谈判断点在多边形内的七种方法(最全面) hdu1756 hrbust1429 为例_WilliamSun0122的博客-CSDN博客_判断点在多边形内算法这几天在学计算几何,学到点定位的判断点在多边形内,书上提到了三种方法,但是有些方法的代码不全。于是网上找了找,又发现更多判断的方法,一时兴起决定学习一下,看看到底有多少种,结果一个大坑。。。 网上好多介绍的不详细(特别是转角法,最后还是google出来的),而且有些方法叫不同的名字,有点难搞啊,花了我一天多的时间。。TAT话不多说,下面分享一下。有些方法我会介绍清楚但不会画图详解,希望大家自己画图https://blog.csdn.net/WilliamSun0122/article/details/77994526

几何关系判断算法是很有意思的一个话题,有兴趣的可以阅读书《Graphics Gems III》系列。

多边形和点的关系判断对于生成安全的轨迹十分重要,高性能的判断方案能够提前感知危险,尽快绕过危险障碍物。


​感兴趣,可以关注公众号elegantcoin,接受更多消息​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值