正文
子节点优化选择策略
(1)子节点选择方式
为了找到从起始点到终点的路径,需定义一种可以选择后续节点的方式。在A*算法中两种常见的方法为 4-邻接(见图 5-7(a))和 8-邻接 (见图 5-7(b)),但考虑到在复杂越野环境上,我们希望智能车辆允许更多的自由运动来更好规避危险,因此本文选择 16-邻接(见图 5-7©)。如图 5-8 所示,4-邻接规划的路径具有很多的直角拐点且路径最长,其次是 8-邻接规划的路径,而 16-邻接规划的路径平滑、拐点数少、路径短,适合复杂越野环境智能车的需求。
(2)优化子节点选择
传统 A*算法在子节点选取上,仅考察子节点周围是否为障碍物,而未考察子节点与障碍物位置的相关性,从而规划出路线存在斜着通过障碍物栅格顶点的问题,导致车辆可能与障碍物发生碰撞。因为本文中所构建环境模型具有更危险的威胁物存在,所以优化了子节点的选择规则。
如图 5-9,为 16 个子节点分布图。本文结合越野环境栅格地图设计的子节点选择规则为:
**1:**若子节点 4 或子节点 12 具有威胁(在越野环境栅格地图中值1),则子节点 2、子节点 6、子节点 3、子节点 5 或子节点 13、子节点 9、子节点 14、子节点11 不作为预选点。
**2:**若子节点 16 或子节点 8 具有威胁,则子节点 2、子节点 13、子节点 15、
子节点 1 或子节点 6、子节点 9、子节点 10、子节点 7 不作为预选点。
**3:**均无具威胁,则不做处理。
优化子节点选择后,规划后的路径避开具有威胁栅格的顶点,避免智能车辆
代码部分
###############创建A-Star类############ class AStar: # 描述AStar算法中的节点数据 class Node: #初始化 def __init__(self, point, startPoint,endPoint, g=0,w=1,p=1): self.point = point # 自己的坐标 self.father = None # 父节点 self.g = g # g值,g值在用到的时候会重新算 # 计算h值,采用曼哈顿距离 #self.h = (abs(endPoint.x - point.x) + abs(endPoint.y - point.y)) * 10 #采用欧几里得距离 #self.h = math.pow((math.pow((endPoint.x - point.x),2) + math.pow((endPoint.y - point.y),2)),0.5)*10 #采用对角距离 pp=(1-p)+0.2*math.exp((math.pow((math.pow((endPoint.x - point.x),2) + math.pow((endPoint.y - point.y),2)),0.5))/(math.pow((math.pow((endPoint.x - startPoint.x),2) + math.pow((endPoint.y - startPoint.y),2)),0.5))) Diagonal_step = min((endPoint.x - point.x),(endPoint.y - point.y)) straight_step = (abs(endPoint.x - point.x) + abs(endPoint.y - point.y)) - 2*Diagonal_step self.h =(straight_step + math.pow(2,0.5)*Diagonal_step)*10*pp #print(pp) #初始化A-start def __init__(self, map2d, startPoint, endPoint, passTag=1.0):#map2d地图信息,startPoint起点, endPoint终点, passTag=1.0为不可行驶区域 # 开启表 self.openList = [] # 关闭表 self.closeList = [] # 寻路地图 self.map2d = map2d # 起点终点 if isinstance(startPoint, Point) and isinstance(endPoint, Point): self.startPoint = startPoint self.endPoint = endPoint else: self.startPoint = Point(*startPoint) self.endPoint = Point(*endPoint) # 不可行走标记 self.passTag = passTag def getMinNode(self): """ 获得openlist中F值最小的节点 :return: Node """ currentNode = self.openList[0] for node in self.openList: if node.g + node.h < currentNode.g + currentNode.h: currentNode = node return currentNode#返回最小代价的点
结果对比
越野环境路径规划对比
敏感度衡量对比
结论
本节针对越野场景路径规划问题,采用栅格法建立障碍物、威胁物和越野道路模型,模拟真实的越野环境场景。引入方向变化惩罚和局部区域复杂度惩罚来优化A算法,使算法规划出的路径更平滑,算法效率更高效。采用改进 Floyd 算法对路径进行双向平滑,并且进行了防碰撞处理,来确保规划出路径的安全可靠性。仿真结果表明,所改进的 A算法与传统算法相比较,效率提高了 30%,拐点数减少了
4 倍,所提算法能够在越野环境多重因素综合影响以及不同车辆性能和任务的要求下快速的规划出安全的路径。