smac 路径优化器分析——平滑度成本分析

参考

Apollo 离散点曲线平滑度优化

相关文章

smac 路径优化器分析——曲率成本分析

smac 路径优化器分析——距离成本和代价地图成本分析

平滑度成本函数

Smac 用向量和的模的平方来作为曲线离散点的平滑度,非常巧妙。
离散点顺序: pt_m -> pt -> pt_p
向量 u 是 pt -> pt_m,向量 v 是 pt -> pt_p,向量 w = u + v。

fig.1 向量 u 和 v 图示

下面蓝色圆形虚线 ptmNorm 表示向量 u 的模,紫色圆形虚线 ptpNorm 表示向量 v 的模。

1. 在 u 和 v 的模大小固定情况下,夹角 α  从大到小变化([0,π]范围),此时 w 的模是从小到大变化。

fig.2 模固定,向量夹角 176°
fig.3 模固定,向量夹角 129°
fig.4 模固定,向量夹角 27°

这个性质反映了向量的方向同向程度,方向越接近 w 模越大。

性质用作离散曲线点的平滑度成本函数,w 模越大反映曲线越扭曲迂回,w 模越小反映曲线越平滑前进。

2. 在 u 和 v 的夹角固定,u 的模大小固定情况下

        a. 当 v 的模在 ptmNorm 之内,即 v 的模小于 u 的模。v 的模从小到大变化,此时 w 的模是从大到小变化。

fig.5 向量夹角固定,v 的模小于 u 的模,v 的模较小
fig.6 向量夹角固定,v 的模小于 u 的模,v 的模较大

        b. 当 v 的模在 ptmNorm 之外,即 v 的模大于 u 的模。v 的模从小到大变化,此时 w 的模是从小到大变化。

fig.7 向量夹角固定,v 的模大于 u 的模,v 的模较小
fig.8 向量夹角固定,v 的模大于 u 的模,v 的模较大

这个性质反映了向量的模差异程度,向量的模差越大,w 模越大。

该性质用作离散曲线点的平滑度成本函数,w 模越大反映离散点分布越混乱,w 模越小反映离散点分布越均匀。
任意 v 向量情况下的 w 情况如下

fig.9 任意 v 向量条件下的 w 情况

平滑度成本函数为:

Cost_{smooth} = {|\overrightarrow{u}+\overrightarrow{v}|}^2

\overrightarrow {u} 是 pt_m -> pt 向量,\overrightarrow {v} 是 pt_p-> pt 向量。

具体公式是

\begin{aligned} Cost_{smooth} &={|\overrightarrow{u}+\overrightarrow{v}|}^2 \\ &=((ptm - pt) + (ptp - pt))^2 \\ &=(ptp + ptm - 2*pt)^2 \\ &=(ptp·ptp + ptp·ptm - 2*ptp·pt) + (ptm·ptp + ptm·ptm - 2*ptm·pt) + (-2*pt·ptp - 2*pt·ptm + 4*pt·pt) \\ &=ptp·ptp - 4*ptp·pt + 2*ptp·ptm + 4*pt·pt - 4*pt·ptm + ptm·ptm \end{aligned}

源码:

  inline void addSmoothingResidual(
    const double & weight,
    const Eigen::Vector2d & pt,
    const Eigen::Vector2d & pt_p,
    const Eigen::Vector2d & pt_m,
    double & r) const
  {
      r += weight * (
      pt_p.dot(pt_p) -
      4 * pt_p.dot(pt) +
      2 * pt_p.dot(pt_m) +
      4 * pt.dot(pt) -
      4 * pt.dot(pt_m) +
      pt_m.dot(pt_m));    // objective function value
  }

平滑度成本梯度函数

对平滑度成本函数中 pt 变量求偏导,由于求偏导将与自变量无关项视作常量,常量求导为 0,所以在这里只需要关心平滑度成本函数中与自变量 pt 相关的项即可。
提取平滑度成本函数中 pt 相关项:

-4*pt·ptm + 4*pt*pt - 4*ptp·pt

矩阵表示:

\frac{\partial Cost_{smooth}}{\partial x}= -4 * x_{ptm} + 8 * x_{pt} - 4 * x_{ptp}

\frac{\partial Cost_{smooth}}{\partial y}= -4 * y_{ptm} + 8 * y_{pt} - 4 * y_{ptp}

源码:

  inline void addSmoothingJacobian(
    const double & weight,
    const Eigen::Vector2d & pt,
    const Eigen::Vector2d & pt_p,
    const Eigen::Vector2d & pt_m,
    double & j0,
    double & j1) const
  {
      j0 += weight *
      (-4 * pt_m[0] + 8 * pt[0] - 4 * pt_p[0]); // xi x component of partial-derivative
      j1 += weight *
      (-4 * pt_m[1] + 8 * pt[1] - 4 * pt_p[1]); // xi y component of partial-derivative
  }
  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值