Faster Planner——Kinodynamic Astar详解

实际成本和启发式成本

实际成本 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)=0Tu(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=pH=0λ2=vH=λ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[a22αμ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)=[pv]=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)====0tu2dt0tαμt+β2dt0tαμ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((2vμc2vμg)/(2T)(6pμc6pμg+6Tvμc)/(2T2))T3((6vμc6vμg)/(6T2)(12pμc12pμg+12Tvμc)/(6T3))

   α μ \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μgpμcvμcTvμgvμ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[126T6T2T2][pμgpμcvμcTvμgvμ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(T2vμc2+T2vμcvμg+T2vμg2+3Tpμcvμc+3Tpμcvμg3Tpμgvμc3Tpμgvμg+3pμc26pμcpμg+3pμg2))/T3)=μ{x,y,z}((12pμc2)/T3+(12pμg2)/T3(24pμcpμg)/T3)+μ{x,y,z}((12pμcvμc)/T2+(12pμcvμg)/T2(12pμgvμc)/T2(12pμgvμg)/T2)+μ{x,y,z}((4vμc2)/T+(4vμg2)/T+(4vμcvμg)/T)=μ{x,y,z}(12(pμcpμg)2/T312(vμc+vμg)(pμgpμc)/T2+4(vμc2+vμcvμ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}} TJ(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) TJ(T)=μ{x,y,z}(36(pμcpμg)2/T424(vμc+vμg)(pμgpμc)/T3+4(vμc2+vμcvμg+vμg2)/T2)

  这里的 36 ( p μ c − p μ g ) 36(p_{\mu c}-p_{\mu g}) 36(pμcpμ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μgpμ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μcvμ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;
}
  • 11
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值