
回复
如果你是做自动驾驶的工作人员,那么你一定知道自动驾驶模块主要由感知模块、高精地图模块、定位模块、路径规划模块以及控制模块组成,然而感知模块在整车当中就相当于人的眼睛一样十分重要。现在有这么一个需求:在自动驾驶雷达感知模块中,我们需要在特定探测范围内搜索障碍物。
我们假设站在车(驻点)的角度看待,整车的摄像头覆盖的角度为90度,那么从整车的摄像头的坐标看,整个视野就为90度,我们需要对整个视野的障碍物进行一个统计。
约定:我们假定points为待观测点,angle为观测角度,location为驻点或者站点。
思路: 先要计算驻点与待观测点的一个角度,这个我们可以通过atan2函数计算得到弧度,然后转换为角度
角度 = 180.0 / pi * 弧度
(因为angle是角度),需要考虑一个跨象限问题,因此计算值需要加360°,最后就是排序然后进行滑动窗口搜索。
1、遍历是否和驻点重合,不重合即可计算两个点的弧度,否则认为是驻点,并记录个数。
for i in points: #
if i != location:
r.append(atan2(i[1] - location[1], i[0] - location[0]))
else: # 驻点
samePoint = samePoint + 1
new_l = []
2、将计算的弧度转为角度,并对所有数据加上360°。
for i in r: # 2、对弧度转为角度,同时防止跨象限问题加上360
tmp = 180.0 / pi * i
new_l.append(tmp)
new_l.append(tmp + 360.0)
3、对所有角度进行排序,这个可以直接调用list对应的函数
new_l.sort()
4、滑动搜索。窗口new_l[right] - new_l[left]值小于指定的angle角度,计数+1
while right < len(new_l): # 滑窗 搜索
while right < len(new_l) and new_l[right] - new_l[left] <= angle:
right = right + 1 # 窗口new_l[right] - new_l[left]值小于指定的angle角度,计数+1
ans = max(ans, right - left)
left = left + 1
其实整个算法是一个算法比赛的一个题目,整个背景是十分适合在自动驾驶领域使用,出题方也是站在自动驾驶的角度去看待这个问题。我们做自动驾驶方向,我们站在这个角度去看待这个问题的话,其实就是一个搜索问题,当然这里是使用了Python语言实现,也可以考虑使用C++。