实际成本和启发式成本
实际成本 Actual Cost
每条轨迹的真实代价函数定义如下:
J
(
T
)
=
∫
0
T
∥
u
(
t
)
∥
2
d
t
+
ρ
T
\mathcal{J}(T)=\int_{0}^{T}\|\mathbf{u}(t)\|^{2} d t+\rho T
J(T)=∫0T∥u(t)∥2dt+ρT
离散形式下:
启发成本 Heuristic Cost
论文里没有给出启发函数详细的推导过程,可以结合高飞老师在深蓝学院讲的《Motion Planning》的课程来你就饿。下面就详细介绍下我自己的理解,错误的话请大家指出。
论文中使用的无人机模型为二阶模型,控制输入为加速度,即:
p
˙
(
t
)
=
v
(
t
)
v
˙
(
t
)
=
u
(
t
)
\begin{aligned} \dot{p}(t) = v(t) \\ \dot{v}(t)=u(t) \end{aligned}
p˙(t)=v(t)v˙(t)=u(t)
因此无人机的运动方程可以简写为:
s
˙
=
f
s
(
s
,
u
)
=
(
v
,
a
)
\dot{s}=f_s(s,u)=(v,a)
s˙=fs(s,u)=(v,a)
其中状态为
s
k
=
(
p
k
,
v
k
)
s_k=(p_k,v_k)
sk=(pk,vk),控制输入为
u
k
u_k
uk。
根据上方PPT中的内容,此时系统中只有两个变量,因此系统的协态(costate)为
λ
=
(
λ
1
,
λ
2
)
\lambda=(\lambda_1,\lambda_2)
λ=(λ1,λ2)(系统状态中只有两项,所以只有
λ
1
\lambda_1
λ1和
λ
2
\lambda_2
λ2,分别对应状态中的
p
p
p和
v
v
v)。系统的哈密顿函数(Hamiltonian function)可以定义为:
H
(
s
,
u
,
λ
)
=
1
T
a
2
+
λ
T
f
s
(
s
,
u
)
=
1
T
a
2
+
λ
1
v
+
λ
2
a
λ
˙
=
−
▽
s
H
(
s
∗
,
u
∗
,
λ
)
=
(
0
,
−
λ
1
)
\begin{aligned} H(s,u,\lambda)&=\frac{1}{T}a^2+\lambda^Tf_s(s,u) \\ &=\frac{1}{T}a^2+\lambda_1v+\lambda_2a \end{aligned}\\ \dot{\lambda}=-\bigtriangledown_sH(s^*,u^*,\lambda)=(0,-\lambda_1)
H(s,u,λ)=T1a2+λTfs(s,u)=T1a2+λ1v+λ2aλ˙=−▽sH(s∗,u∗,λ)=(0,−λ1)
上式中
λ
˙
\dot{\lambda}
λ˙是在状态取得最优
s
∗
s^*
s∗和控制输入取得最优
u
∗
u^*
u∗时,
H
H
H关于的
s
s
s的偏导,
s
s
s中包含
p
p
p和
v
v
v,所以将
H
H
H分别对
p
p
p和
v
v
v求偏导,即
λ
1
=
−
∂
H
∂
p
=
0
λ
2
=
−
∂
H
∂
v
=
−
λ
1
\begin{aligned} &\lambda_1=-\frac{\partial{H}}{\partial{p}}=0 \\ &\lambda_2=-\frac{\partial{H}}{\partial{v}}=-\lambda_1 \end{aligned}
λ1=−∂p∂H=0λ2=−∂v∂H=−λ1
所以得到了上面的
λ
˙
=
−
▽
s
H
(
s
∗
,
u
∗
,
λ
)
=
(
0
,
−
λ
1
)
\dot{\lambda}=-\bigtriangledown_sH(s^*,u^*,\lambda)=(0,-\lambda_1)
λ˙=−▽sH(s∗,u∗,λ)=(0,−λ1)
根据这个可以得到一组
λ
\lambda
λ的可行解
λ
=
1
T
[
−
2
α
μ
2
α
μ
t
+
2
β
μ
]
\lambda=\frac{1}{T} \left[ \begin{aligned} &-2\alpha_{\mu} \\ &2\alpha_{\mu} t+2\beta_{\mu} \end{aligned} \right]
λ=T1[−2αμ2αμt+2βμ]
由此可得,将上面的公式
λ
\lambda
λ带入
H
(
s
,
u
,
λ
)
H(s,u,\lambda)
H(s,u,λ)可得到此时系统的控制输入
u
∗
u^*
u∗为:
H
(
s
,
u
,
λ
)
=
1
T
[
a
2
−
2
α
μ
v
+
(
2
α
μ
t
+
2
β
μ
)
a
]
\begin{aligned} H(s,u,\lambda)=\frac{1}{T} \left[a^2-2\alpha_{\mu}v+(2\alpha_{\mu} t+2\beta_{\mu})a \right] \end{aligned}
H(s,u,λ)=T1[a2−2αμv+(2αμt+2βμ)a]
上述公式中的变量为
a
a
a且
u
=
a
u=a
u=a,其他都是已知的,所以控制输入最优时,
a
=
α
μ
t
+
β
a=\alpha_{\mu}t+\beta
a=αμt+β
因此系统中最优状态为(最优控制量
u
∗
u*
u∗的积分):
s
∗
(
t
)
=
[
p
∗
v
∗
]
=
[
1
6
α
μ
t
3
+
1
2
β
μ
t
2
+
v
μ
c
t
+
p
μ
c
1
2
α
μ
t
2
+
β
μ
t
+
v
μ
c
]
s^*(t)=\left[ \begin{aligned} p^* \\ v^* \end{aligned} \right] = \left[ \begin{aligned} &\frac{1}{6} \alpha_{\mu}t^3+\frac{1}{2} \beta_{\mu}t^2+v_{\mu c}t+p_{\mu c} \\ &\frac{1}{2} \alpha_{\mu}t^2+\beta_{\mu}t+v_{\mu c} \end{aligned} \right]
s∗(t)=[p∗v∗]=⎣⎢⎡61αμt3+21βμt2+vμct+pμc21αμt2+βμt+vμc⎦⎥⎤
原文中
p
∗
=
1
6
α
μ
t
3
+
1
2
β
μ
t
2
+
v
μ
c
+
p
μ
c
p^*=\frac{1}{6} \alpha_{\mu}t^3+\frac{1}{2} \beta_{\mu}t^2+v_{\mu c}+p_{\mu c}
p∗=61αμt3+21βμt2+vμc+pμc的倒数第二项应该是少了个
t
t
t,应该是
p
∗
=
1
6
α
μ
t
3
+
1
2
β
μ
t
2
+
v
μ
c
t
+
p
μ
c
p^*=\frac{1}{6} \alpha_{\mu}t^3+\frac{1}{2} \beta_{\mu}t^2+v_{\mu c}t+p_{\mu c}
p∗=61αμt3+21βμt2+vμct+pμc。系统的cost function为:
J
(
t
)
=
∫
0
t
∣
∣
u
∣
∣
2
d
t
=
∫
0
t
∣
∣
α
μ
t
+
β
∣
∣
2
d
t
=
∫
0
t
α
μ
2
t
+
2
α
μ
β
μ
t
+
β
μ
2
d
t
=
1
3
α
μ
2
t
3
+
α
μ
β
μ
t
2
+
β
μ
2
t
\begin{aligned} J(t)=&\int_{0}^{t} {||u||^2dt} \\ =&\int_{0}^{t} {||\alpha_{\mu}t+\beta ||^2dt}\\ =&\int_{0}^{t} {\alpha_{\mu}^2t+2\alpha_{\mu}\beta _{\mu}t+\beta_{\mu}^2 dt} \\ =&\frac{1}{3} \alpha_{\mu}^2 t^3+\alpha_{\mu}\beta _{\mu}t^2+\beta_{\mu}^2 t \end{aligned}
J(t)====∫0t∣∣u∣∣2dt∫0t∣∣αμt+β∣∣2dt∫0tαμ2t+2αμβμt+βμ2dt31αμ2t3+αμβμt2+βμ2t
cost function中只有时间
t
t
t是变量,因此可以通过对J(t)求导来获取最优的时间及对应的cost 。
p μ ∗ ( t ) = 1 6 α μ t 3 + 1 2 β μ t 2 + v μ c + p μ c = p μ c + v μ c + T 2 ∗ ( ( 2 ∗ v μ c − 2 ∗ v μ g ) / ( 2 ∗ T ) − ( 6 ∗ p μ c − 6 ∗ p μ g + 6 ∗ T ∗ v μ c ) / ( 2 ∗ T 2 ) ) − T 3 ∗ ( ( 6 ∗ v μ c − 6 ∗ v μ g ) / ( 6 ∗ T 2 ) − ( 12 ∗ p μ c − 12 ∗ p μ g + 12 ∗ T ∗ v μ c ) / ( 6 ∗ T 3 ) ) \begin{aligned} p_{\mu}^{*}(t) &=\frac{1}{6} \alpha_{\mu} t^{3}+\frac{1}{2} \beta_{\mu} t^{2}+v_{\mu c}+p_{\mu c} \\ &=p_{\mu c} + v_{\mu c} + T^2*((2*v_{\mu c} - 2*v_{\mu g})/(2*T) - (6*p_{\mu c} - 6*p_{\mu g} + 6*T*v_{\mu c})/(2*T^2)) - T^3*((6*v_{\mu c} - 6*v_{\mu g})/(6*T^2) - (12*p_{\mu c} - 12*p_{\mu g} + 12*T*v_{\mu c})/(6*T^3)) \end{aligned} pμ∗(t)=61αμt3+21βμt2+vμc+pμc=pμc+vμc+T2∗((2∗vμc−2∗vμg)/(2∗T)−(6∗pμc−6∗pμg+6∗T∗vμc)/(2∗T2))−T3∗((6∗vμc−6∗vμg)/(6∗T2)−(12∗pμc−12∗pμg+12∗T∗vμc)/(6∗T3))
α
μ
\alpha_{\mu}
αμ和
β
μ
\beta_{\mu}
βμ的确定依赖于终止条件,也就是经过时间
T
T
T以后无人机要到达
p
μ
g
p_{\mu g}
pμg和
v
μ
g
v_{\mu g}
vμg,可以得到下述关系:
[
1
6
T
3
1
2
T
2
1
2
T
2
T
]
[
α
β
γ
]
=
[
Δ
p
Δ
v
Δ
a
]
[
1
6
T
3
1
2
T
2
1
2
T
2
T
]
[
α
β
γ
]
=
[
p
μ
g
−
p
μ
c
−
v
μ
c
T
v
μ
g
−
v
μ
c
]
\left[\begin{array}{ccc} \frac{1}{6} T^{3} & \frac{1}{2} T^{2} \\ \frac{1}{2} T^{2} & T \end{array}\right]\left[\begin{array}{l} \alpha \\ \beta \\ \gamma \end{array}\right]=\left[\begin{array}{c} \Delta p \\ \Delta v \\ \Delta a \end{array}\right] \\ \left[\begin{array}{ccc} \frac{1}{6} T^{3} & \frac{1}{2} T^{2} \\ \frac{1}{2} T^{2} & T \end{array}\right]\left[\begin{array}{l} \alpha \\ \beta \\ \gamma \end{array}\right]=\left[\begin{array}{c} p_{\mu g}-p_{\mu c}-v_{\mu c} T \\ v_{\mu g}-v_{\mu c} \end{array}\right]
[61T321T221T2T]⎣⎡αβγ⎦⎤=⎣⎡ΔpΔvΔa⎦⎤[61T321T221T2T]⎣⎡αβγ⎦⎤=[pμg−pμc−vμcTvμg−vμc]
由此可以得到:
[ α μ β μ ] = 1 T 3 [ − 12 6 T 6 T − 2 T 2 ] [ p μ g − p μ c − v μ c T v μ g − v μ c ] \begin{aligned} {\left[\begin{array}{c} \alpha_{\mu} \\ \beta_{\mu} \end{array}\right] } &=\frac{1}{T^{3}}\left[\begin{array}{cc} -12 & 6 T \\ 6 T & -2 T^{2} \end{array}\right]\left[\begin{array}{c} p_{\mu g}-p_{\mu c}-v_{\mu c} T \\ v_{\mu g}-v_{\mu c} \end{array}\right] \end{aligned} [αμβμ]=T31[−126T6T−2T2][pμg−pμc−vμcTvμg−vμc]
将上式中的
α
μ
\alpha_{\mu}
αμ和
β
μ
\beta_{\mu}
βμ带入下式
J
∗
(
T
)
\mathcal{J}^{*}(T)
J∗(T)中,并将各项按照
T
T
T的阶次分解后可得:
J
∗
(
T
)
=
∑
μ
∈
{
x
,
y
,
z
}
(
1
3
α
μ
2
T
3
+
α
μ
β
μ
T
2
+
β
μ
2
T
)
=
∑
μ
∈
{
x
,
y
,
z
}
(
(
4
∗
(
T
2
∗
v
μ
c
2
+
T
2
∗
v
μ
c
∗
v
μ
g
+
T
2
∗
v
μ
g
2
+
3
∗
T
∗
p
μ
c
∗
v
μ
c
+
3
∗
T
∗
p
μ
c
∗
v
μ
g
−
3
∗
T
∗
p
μ
g
∗
v
μ
c
−
3
∗
T
∗
p
μ
g
∗
v
μ
g
+
3
∗
p
μ
c
2
−
6
∗
p
μ
c
∗
p
μ
g
+
3
∗
p
μ
g
2
)
)
/
T
3
)
=
∑
μ
∈
{
x
,
y
,
z
}
(
(
12
∗
p
μ
c
2
)
/
T
3
+
(
12
∗
p
μ
g
2
)
/
T
3
−
(
24
∗
p
μ
c
∗
p
μ
g
)
/
T
3
)
+
∑
μ
∈
{
x
,
y
,
z
}
(
(
12
∗
p
μ
c
∗
v
μ
c
)
/
T
2
+
(
12
∗
p
μ
c
∗
v
μ
g
)
/
T
2
−
(
12
∗
p
μ
g
∗
v
μ
c
)
/
T
2
−
(
12
∗
p
μ
g
∗
v
μ
g
)
/
T
2
)
+
∑
μ
∈
{
x
,
y
,
z
}
(
(
4
∗
v
μ
c
2
)
/
T
+
(
4
∗
v
μ
g
2
)
/
T
+
(
4
∗
v
μ
c
∗
v
μ
g
)
/
T
)
=
∑
μ
∈
{
x
,
y
,
z
}
(
12
(
p
μ
c
−
p
μ
g
)
2
/
T
3
−
12
(
v
μ
c
+
v
μ
g
)
(
p
μ
g
−
p
μ
c
)
/
T
2
+
4
(
v
μ
c
2
+
v
μ
c
∗
v
μ
g
+
v
μ
g
2
)
/
T
)
\begin{aligned} \mathcal{J}^{*}(T) &=\sum_{\mu \in\{x, y, z\}}\left(\frac{1}{3} \alpha_{\mu}^{2} T^{3}+\alpha_{\mu} \beta_{\mu} T^{2}+\beta_{\mu}^{2} T\right) \\ &=\sum_{\mu \in\{x, y, z\}}\left( (4*(T^2*v_{\mu c}^2 + T^2*v_{\mu c}*v_{\mu g} + T^2*v_{\mu g}^2 + 3*T*p_{\mu c}*v_{\mu c} + 3*T*p_{\mu c}*v_{\mu g} - 3*T*p_{\mu g}*v_{\mu c} - 3*T*p_{\mu g}*v_{\mu g} + 3*p_{\mu c}^2 - 6*p_{\mu c}*p_{\mu g} + 3*p_{\mu g}^2))/T^3\right) \\ &=\sum_{\mu \in\{x, y, z\}}\left((12*p_{\mu c}^2)/T^3 + (12*p_{\mu g}^2)/T^3 - (24*p_{\mu c}*p_{\mu g})/T^3 \right) + \sum_{\mu \in\{x, y, z\}}\left((12*p_{\mu c}*v_{\mu c})/T^2 + (12*p_{\mu c}*v_{\mu g})/T^2 - (12*p_{\mu g}*v_{\mu c})/T^2 - (12*p_{\mu g}*v_{\mu g})/T^2 \right) + \sum_{\mu \in\{x, y, z\}}\left((4*v_{\mu c}^2)/T + (4*v_{\mu g}^2)/T + (4*v_{\mu c}*v_{\mu g})/T \right) \\ &=\sum_{\mu \in\{x, y, z\}}\left(12(p_{\mu c}-p_{\mu g})^2/T^3 -12(v_{\mu c}+v_{\mu g})(p_{\mu g}-p_{\mu c})/T^2 + 4(v_{\mu c}^2 + v_{\mu c}*v_{\mu g} + v_{\mu g}^2)/T \right) \end{aligned}
J∗(T)=μ∈{x,y,z}∑(31αμ2T3+αμβμT2+βμ2T)=μ∈{x,y,z}∑((4∗(T2∗vμc2+T2∗vμc∗vμg+T2∗vμg2+3∗T∗pμc∗vμc+3∗T∗pμc∗vμg−3∗T∗pμg∗vμc−3∗T∗pμg∗vμg+3∗pμc2−6∗pμc∗pμg+3∗pμg2))/T3)=μ∈{x,y,z}∑((12∗pμc2)/T3+(12∗pμg2)/T3−(24∗pμc∗pμg)/T3)+μ∈{x,y,z}∑((12∗pμc∗vμc)/T2+(12∗pμc∗vμg)/T2−(12∗pμg∗vμc)/T2−(12∗pμg∗vμg)/T2)+μ∈{x,y,z}∑((4∗vμc2)/T+(4∗vμg2)/T+(4∗vμc∗vμg)/T)=μ∈{x,y,z}∑(12(pμc−pμg)2/T3−12(vμc+vμg)(pμg−pμc)/T2+4(vμc2+vμc∗vμg+vμg2)/T)
上式是关于
T
T
T的多项式,为了求得最优的
J
∗
(
T
)
\mathcal{J}^{*}(T)
J∗(T)的闭式解,因此需要对其进行求关于时间
T
T
T的偏导,即
∂
J
∗
(
T
)
∂
T
\frac{\partial{\mathcal{J}^{*}(T)}}{\partial{T}}
∂T∂J∗(T),由此可以得到:
∂
J
∗
(
T
)
∂
T
=
∑
μ
∈
{
x
,
y
,
z
}
(
36
(
p
μ
c
−
p
μ
g
)
2
/
T
−
4
−
24
(
v
μ
c
+
v
μ
g
)
(
p
μ
g
−
p
μ
c
)
/
T
−
3
+
4
(
v
μ
c
2
+
v
μ
c
∗
v
μ
g
+
v
μ
g
2
)
/
T
−
2
)
\frac{\partial{\mathcal{J}^{*}(T)}}{\partial{T}} =\sum_{\mu \in\{x, y, z\}}\left(36(p_{\mu c}-p_{\mu g})^2/T^{-4} -24(v_{\mu c}+v_{\mu g})(p_{\mu g}-p_{\mu c})/T^{-3} + 4(v_{\mu c}^2 + v_{\mu c}*v_{\mu g} + v_{\mu g}^2)/T^{-2} \right)
∂T∂J∗(T)=μ∈{x,y,z}∑(36(pμc−pμg)2/T−4−24(vμc+vμg)(pμg−pμc)/T−3+4(vμc2+vμc∗vμg+vμg2)/T−2)
这里的 36 ( p μ c − p μ g ) 36(p_{\mu c}-p_{\mu g}) 36(pμc−pμg)、 − 24 ( v μ c + v μ g ) ( p μ g − p μ c ) -24(v_{\mu c}+v_{\mu g})(p_{\mu g}-p_{\mu c}) −24(vμc+vμg)(pμg−pμc)、 4 ( v μ c 2 + v μ c ∗ v μ g + v μ g 2 ) 4(v_{\mu c}^2 + v_{\mu c}*v_{\mu g} + v_{\mu g}^2) 4(vμc2+vμc∗vμg+vμg2)分别对应四次项、三次项和二次项,也就是代码中的 c 1 c_1 c1 c 2 c_2 c2 c 3 c_3 c3;因为没有一次项,所以 c 4 = 0 c_4=0 c4=0;常数项 c 5 c_5 c5是自定义的,影响不大(可以联想下一个曲线,常数项只是让该曲线沿着Y轴上下移动)。
因为这里 J ∗ ( T ) \mathcal{J}^{*}(T) J∗(T)中的多项式是关于 T T T的,且是负的次幂,所以在代码中假设 t = 1 T t=\frac{1}{T} t=T1,然后求解四次多项式的根。这里的根为最优的时间 T ∗ T* T∗。需要注意的是,在最优的时间 T ∗ T* T∗时对应的cost J ∗ ( T ) \mathcal{J}^{*}(T) J∗(T)也是有大有小的,所以为了获得最优的时间 T ∗ T* T∗,需要对求得的多个根可进行判断,判断的过程后面再讲。
在求四次多项式的根时,调用了**quartic()**函数,该函数中使用费拉里方法来求解四次多项式的根。然后在求解三次多项式时,代码中使用了两种方法,当判别式大于0及等于0的情况利用了求根公式,判别式小于0的情况则是使用了三角函数解法。
double KinodynamicAstar::estimateHeuristic(Eigen::VectorXd x1, Eigen::VectorXd x2, double& optimal_time)
{
const Eigen::Vector3d dp = x2.head(3) - x1.head(3);
const Eigen::Vector3d v0 = x1.segment(3, 3);
const Eigen::Vector3d v1 = x2.segment(3, 3);
double c1 = -36 * dp.dot(dp);
double c2 = 24 * (v0 + v1).dot(dp);
double c3 = -4 * (v0.dot(v0) + v0.dot(v1) + v1.dot(v1));
double c4 = 0;
double c5 = w_time_;
std::vector<double> ts = quartic(c5, c4, c3, c2, c1);
double v_max = max_vel_ * 0.5;
double t_bar = (x1.head(3) - x2.head(3)).lpNorm<Eigen::Infinity>() / v_max;
ts.push_back(t_bar);
double cost = 100000000;
double t_d = t_bar;
for (auto t : ts)
{
if (t < t_bar)
continue;
double c = -c1 / (3 * t * t * t) - c2 / (2 * t * t) - c3 / t + w_time_ * t;
if (c < cost)
{
cost = c;
t_d = t;
}
}
optimal_time = t_d;
return 1.0 * (1 + tie_breaker_) * cost;
}