配置空间
- 机器人配置:机器人上所有点的位置描述
- DOF自由度:表示机器人配置所需的最小实值坐标数 n,如无人机轨迹规划,在微分平坦状态,初始空间进行规划,需要x,y,z和偏航角四个变量,自由度为四。
- 机器人配置空间:包含所有可能的机器人配置的n维空间,表示为 C-space。
- 机器人任何可能的位姿,在C-space中都表示为一个点。
配置空间中障碍物表示
在工作空间中规划
一般不在工作空间中进行规划主要是由以下几个问题:
问题1:机器人有不同的形状和大小
问题2:碰撞检测需要了解机器人的几何形状,既耗时又困难
在配置空间中规划
特点1:机器人由C-space中的点表示,例如位置(
R
3
R^3
R3中的点),姿态(
s
o
(
3
)
so(3)
so(3)中的点)等
特点2: 障碍物需要在配置空间中表示,即将障碍物按照机器人的体积进行膨胀,使得机器人简化后的质点落在膨胀后的障碍物外面。膨胀后的障碍物空间称为配置空间障碍物或C-obstacle
特点3:C-space = C-obstacle
⋃
\bigcup
⋃ C-free
特点4:路径规划是在C-free内找到起点q起点和目标点q目标之间的路径
在配置空间中进行规划时,需要先对障碍物进行膨胀处理来避免碰撞,由于机器人在配置空间中被看成是一个质点,所以规划更为简单。
图概念
图由节点和边组成,边可以有方向,也可以有权重。
搜索算法
算法原理
- 状态空间图:搜索算法的数学表示
- 对于每个搜索问题,都有一个相应的状态空间图
- 图中节点之间的连通性由(有向或无向)边表示
- 图搜索步骤:从开始状态S开始
- 搜索图生成搜索树
- 回溯搜索树中的节点,可以得到从起始状态到该节点的路径
- 对于许多情况,构建整个树代价很大或效率低下,如何尽可能快地求得最优路径才是需要考虑问题。
图搜索算法总体框架
- 维护一个容器以存储要访问的所有节点
- 容器初始化为开始状态S
- 循环
- 根据一些预定义的评价函数从容器中删除节点(访问一个节点)
- 扩展:获取节点的所有邻居(发现所有存在的邻居节点)
- 把邻居节点塞回容器
- 循环结束
问题:
- 什么时候结束循环?
当容器为空的时候 - 如果图是回环的怎么办
添加一个新的容器,记录从容器中删除(弹出/访问)的节点,使得一个节点从容器中删除时,它不被再次添加回容器。 - 通过什么方式删除正确的节点,可以尽快达到目标状态,从而减少节点的扩展。(我们要实现的算法)
两种遍历图的算法(DFS、BFS)
- 广度优先搜索Breadth First Search(BFS):
- 先入先出,容器:队列
- 深度优先搜索Depth First Search(DFS):
- 先入后出,容器:栈
- 先入后出,容器:栈
深度优先搜索DFS
策略:移除/弹出容器中最深的节点
简要说明:先将S节点塞入容器,弹出S节点后,按照p、e、d的先后顺序将三个节点塞入容器,之后先弹出子节点d,再按照c,e,b的顺序将d的三个子节点依次塞入容器,先弹出b再塞入b的子节点a,弹出a后,a没有子节点,返回弹出d的另外一个子节点c,如此往复。
如图为栅格地图DFS搜索,先逆时针塞入邻居节点1,2,3,4,弹出最后塞入的节点4,再逆时针塞入邻居节点5,6,7,弹出节点7后再顺时针弹出另据节点8,9,如此往复进行搜索。
广度优先搜索BFS
策略:移除/扩展容器中最浅的节点
简要说明:先将S节点塞入容器,弹出S节点后,按照p、e、d的先后顺序将三个节点塞入容器,之后先弹出子节点p,再塞入p的子节点q,并弹出节点e,弹出e后,按照r,h的顺序塞入e的子节点,再弹出节点d,塞入d的子节点e,c,b。此时树的第二层全部弹出,且第三层节点按照q,r,h,e,c,b的顺序全部塞入容器,之后再次按先后顺序弹出节点,逐层进行搜索。
如图为栅格地图BFS搜索,先逆时针塞入邻居节点1,2,3,4,弹出最开始塞入的节点1,再逆时针塞入邻居节点5,6,7,此时再弹出最开始塞入的第二个节点2,再逆时针塞入邻居节点8,9,之后弹出节点3,塞入节点10,11,逐步向外探索。
BFS和DFS对比
原因:DFS在树中一个节点走到头,可能先找到一条路径可以走到终点,但可能搜索的层级很深,不一定是最短路径,而BFS向逐层搜索,先找到的路径一定是最短路径。由此可见在路径搜索中最好采用BFS。
启发式算法(贪心算法)
BFS和DFS根据“先入”或“后入”选择下一个节点。
贪心算法根据某种规则选择“节点”,这种规则称为启发式算法。
- 定义:启发式算法猜测你离目标有多近。
- 要求:
- 启发式引导你朝着正确的方向前进
- 启发式应该易于计算
如图所示是两种路径搜索中常见的启发式函数:欧氏距离(
x
2
+
y
2
\sqrt{x^2+y^2}
x2+y2)和曼哈顿距离(
x
+
y
x+y
x+y)
如图所示,贪心算法减少了探索的节点,且获得了最短路径。
如果有很多障碍物的话,贪心算法可能会陷入局部最优,搜索出的路径并不是最短路径。