https://blog.csdn.net/qq_42688495/article/details/116019557
https://blog.csdn.net/tkokof1/article/details/111297299
3篇文档存档。
https://gitee.com/ghowoght/motion-planner/tree/develop/MotionPlanner/map/sampling
一个项目地址
跳点(Jump Point)
跳点:当前点 x 满足以下三个条件之一:
- 节点 x 是起点/终点。
- 节点 x 至少有一个强迫邻居。
- 如果父节点在斜方向(意味着这是斜向搜索),节点x的水平或垂直方向上有满足条件a,b的点。
节点y的水平或垂直方向是斜向向量的拆解,比如向量d=(1,1),那么水平方向则是(1,0),并不会往左搜索,只会看右边,如果向量d=(-1,-1),那么水平方向是(-1,0),只会搜索左边,不看右边,其他同理。
实现原理
JPS 算法和A* 算法非常相似,步骤大概如下:
- openlist取一个权值最低的节点,然后开始搜索。(这些和A*是一样的)
- 搜索时,先进行 直线搜索(4/8个方向,跳跃搜索),然后再 斜向搜索(4个方向,只搜索一步)。如果期间某个方向搜索到跳点或者碰到障碍(或边界),则当前方向完成搜索,若有搜到跳点就添加进openlist。
跳跃搜索是指沿直线方向一直搜下去(可能会搜到很多格),直到搜到跳点或者障碍(边界)。一开始从起点搜索,会有4个直线方向(上下左右),要是4个斜方向都前进了一步,此时直线方向会有8个。
- 若斜方向没完成搜索,则斜方向前进一步,重复上述过程。
因为直线方向是跳跃式搜索,所以总是能完成搜索。
- 若所有方向已完成搜索,则认为当前节点搜索完毕,将当前节点移除于openlist,加入closelist。
- 重复取openlist权值最低节点搜索,直到openlist为空或者找到终点。