赞
踩
传送门
【L3】深蓝学院-高飞老师 移动机器人规划笔记 基于采样的最优路径规划算法&进阶
【L2】深蓝学院-高飞老师 移动机器人规划笔记 基于搜索的路径规划
【L1】深蓝学院-高飞老师 移动机器人规划笔记
Q1: 首先,为什么要kinodynamic呢,也就是考虑运动学和动力学(后续简称为动力学)呢?
因为在现实世界中的机器人,他们是有自己的运动模型的,仅仅将他们转化为质点考虑运动路径肯定是有失偏颇的。
Q2: 当然,前面其实提到过,在整个pipeline中,还有后端做轨迹优化的部分,会考虑到机器人的动力学,那在前端为什么要考虑动力学这个事情呢?
简单来讲,这样去做可以降低后续后端路径优化的负担。而且,后端优化的时候,往往都是在局部进行优化,如果前端完全不考虑动力学的话,可能会产生对于机器人来说动力学代价更大的路径。
一般比较简单,输入就是速度和角速度,
(
x
˙
y
˙
θ
˙
)
=
(
cos
θ
sin
θ
0
)
⋅
v
+
(
0
0
1
)
⋅
ω
\left(
约束就是速度和角速度的最大值,
(
x
˙
y
˙
θ
˙
)
=
(
r
2
(
u
l
+
u
r
)
cos
θ
r
2
(
u
l
+
u
r
)
sin
θ
r
L
(
u
r
−
u
l
)
)
\left(
类似的约束,
这几个比较经典的动力学模型网上的教学还比较多,随便挂一个差速驱动和自行车模型的二维运动学模型。
前面的基于采样的、基于图搜索的方法都有一个共同需要关注的问题,那就是搜索树的构建问题,然后就可以用各类的图搜索的方法解决问题。但是在之前的方法中,我们都默认机器人是一个质点,它可以向各个方向移动,但是现在就需要一个节点之间的可以给机器人进行执行的feasible motion connection 而不是之前的直接连接。
有两种思路去实现这样的建图(边):
对于一个机器人的运动模型: s ˙ = f ( s , u ) \dot{s}=f(s, u) s˙=f(s,u),即状态s的导数是一个由状态和输入为变量去描述的函数。一般会给一个初始状态 s 0 s_0 s0。
对应上面的两种思路,
用位置和速度作为状态
s
s
s,用加速度作为输入
u
u
u,构成一个线性系统方程:
s
˙
=
A
⋅
s
+
B
⋅
u
\dot{s}=A \cdot s+B \cdot u
s˙=A⋅s+B⋅u。(再往高阶的话,也可以用三阶导jerk作为输入,状态填入加速度的三个维度)。中间的图即表明了,在以加速度为输入的情况下,以[1,0,0]作为初速度,选取不同加速度后经时间t后得到的离散的控制空间的点。右边的图就是用jerk作输入的结果。不断进行这个过程就会得到lattice graph,如下所示,但是其实不用把整个lattice graph建完再搜索路径(因为这个图与前面用的已经构建好的栅格图不一样,这个图最开始是没有的),可以利用heuristic函数类似的思路去提高效率。
需要注意一下,上面系统方程中的A矩阵,叫做nilpotent,即幂零矩阵,这个矩阵的性质很适合去除展开式里的高次项,方便我们求解。
具体来说,给定sample后,可以根据系统方程输入计算最后的末状态(给定输入和时间),驱动系统向前前进,那怎么确定中间的轨迹呢?这就涉及到了如下的状态转移方程:
s
(
t
)
=
e
A
t
⏟
F
(
t
)
s
0
+
[
∫
0
t
e
A
(
t
−
σ
)
B
d
σ
]
⏟
G
(
t
)
u
m
s(t)=\underbrace{e^{A t}}_{F(t)} s_0+\underbrace{\left[\int_0^t e^{A(t-\sigma)} B d \sigma\right]}_{G(t)} u_m
s(t)=F(t)
eAts0+G(t)
[∫0teA(t−σ)Bdσ]um
简单来讲,就是状态 s s s随时间变化的函数,是与初状态和整个过程中选取的控制量有关的。前半项是零输入响应,后半项是零状态响应。如果给定时刻 t t t,一般对 e A t e^{A t} eAt做展开计算, e A t = I + A t 1 ! + ( A t ) 2 2 ! + ( A t ) 3 3 ! + ⋯ + ( A t ) k k ! + ⋯ e^{A t}=I+\frac{A t}{1 !}+\frac{(A t)^2}{2 !}+\frac{(A t)^3}{3 !}+\cdots+\frac{(A t)^k}{k !}+\cdots eAt=I+1!At+2!(At)2+3!(At)3+⋯+k!(At)k+⋯,这样A矩阵作为幂零矩阵就很有作用了。
对上述的整个过程举一个简单的小车模型的例子,
如下图所示,给定一个初始的状态,先离散出他周围临近的状态,然后反推状态之间的可行性路径。
下面图展现了,两者比较直观的对比,
看起来,状态空间采样的方法要好一些,因为不会出现那些失败的路径。而且如果控制空间的输入变化的范围控制不好的话,可能会导致一系列的路径都容易是失败的,因为他们比较接近。那为什么不完全使用状态空间采样的方法呢,原因在于其实现的难度。下面介绍一下,已知起点终点状态,怎么去解中间的可行路径的一个方法。
比如,以x轴方向为例,可以用多项式做参数化,
以上可能有很多解,因为限制条件比较少,获得一个解相对而言比较容易,但是获得比较优的解还需要其他的方法。
任务:给定初始和终点两个状态,我们想要去找到中间的最优
s
∗
s^*
s∗和
u
∗
u^*
u∗。
这里以庞特里亚金极小值定理为例展现整个计算的过程,
从状态空间采样搜索路径的方法不具备启发式函数,也就是漫无目的的去搜索。结合之前几个章节的启发式函数的内容,在这里同样可以引入heuristic。
当然在这里有两种假设:
思路:A* + lattice graph,对比较稠密的图进行剪枝(栅格地图每一个格子里只要一个状态),跟A*的思路一样,区别就是邻居节点的选择是选择相邻的一些邻状态点,然后启发式函数的选择有一些区别。
上面介绍了基于搜索的算法,接下来介绍一个基于采样的运动学约束的path finding方法
其实思路差不多,就是在采样点之间生成路径的时候不是直连了,而是通过初始状态解出运动学约束的路径,当然他这里的求解方式跟上面讲的利用汉密尔顿函数的不太一样,这里不去细说了。
RRT*用球形的范围找周围采样点,那个时候的cost就是距离,那这里图里面的点都是不同的状态点,cost是很复杂的一个高维的公式,那就需要在当前状态找到cost在给定范围内的节点(很多个高维的椭球),找利用cost在给定范围r找父节点的集合就是前向可达集,同理有后向可达集。
本文仅作个人笔记之用,如有纰漏,欢迎大家指正和讨论!希望可以和大家一起进步nie!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。