首页 > 其他分享 >nav2_constrained_smoother

nav2_constrained_smoother

时间:2023-10-20 19:44:48浏览次数:39  
标签:prev const Eigen pt smoother next nav2 constrained Matrix

平滑cost:
  template<typename T>
  inline void addSmoothingResidual(
    const double & weight,
    const Eigen::Matrix<T, 2, 1> & pt,
    const Eigen::Matrix<T, 2, 1> & pt_next,
    const Eigen::Matrix<T, 2, 1> & pt_prev,
    T & r) const
  {
    Eigen::Matrix<T, 2, 1> d_next = pt_next - pt;
    Eigen::Matrix<T, 2, 1> d_prev = pt - pt_prev;
    Eigen::Matrix<T, 2, 1> d_diff = next_to_last_length_ratio_ * d_next - d_prev;
    r += (T)weight * d_diff.dot(d_diff);    // objective function value
  }
曲率cost

圆心计算: https://paulbourke.net/geometry/circlesphere/

template<typename T>
  inline void addCurvatureResidual(
    const double & weight,
    const Eigen::Matrix<T, 2, 1> & pt,
    const Eigen::Matrix<T, 2, 1> & pt_next,
    const Eigen::Matrix<T, 2, 1> & pt_prev,
    T & r) const
  {
    Eigen::Matrix<T, 2, 1> center = arcCenter(
      pt_prev, pt, pt_next,
      next_to_last_length_ratio_ < 0);
    if (CERES_ISINF(center[0])) {
      return;
    }
    T turning_rad = (pt - center).norm();  //计算半径
    T ki_minus_kmax = (T)1.0 / turning_rad - params_.max_curvature; //曲率与最大曲率之间的差

    if (ki_minus_kmax <= (T)EPSILON) {
      return;
    }

    r += (T)weight * ki_minus_kmax * ki_minus_kmax;  // objective function value
  }

template<typename T>
inline Eigen::Matrix<T, 2, 1> arcCenter(
  Eigen::Matrix<T, 2, 1> pt_prev,
  Eigen::Matrix<T, 2, 1> pt,
  Eigen::Matrix<T, 2, 1> pt_next,
  bool is_cusp)
{
  Eigen::Matrix<T, 2, 1> d1 = pt - pt_prev;
  Eigen::Matrix<T, 2, 1> d2 = pt_next - pt;

  if (is_cusp) {
    d2 = -d2;
    pt_next = pt + d2;
  }

  T det = d1[0] * d2[1] - d1[1] * d2[0];
  if (ceres::abs(det) < (T)1e-4) {  // straight line
    return Eigen::Matrix<T, 2, 1>(
      (T)std::numeric_limits<double>::infinity(), (T)std::numeric_limits<double>::infinity());
  }

  // circle center is at the intersection of mirror axes of the segments:
  // http://paulbourke.net/geometry/circlesphere/
  // line intersection:
  // https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection#Intersection%20of%20two%20lines
  Eigen::Matrix<T, 2, 1> mid1 = (pt_prev + pt) / (T)2;
  Eigen::Matrix<T, 2, 1> mid2 = (pt + pt_next) / (T)2;
  Eigen::Matrix<T, 2, 1> n1(-d1[1], d1[0]);
  Eigen::Matrix<T, 2, 1> n2(-d2[1], d2[0]);
  T det1 = (mid1[0] + n1[0]) * mid1[1] - (mid1[1] + n1[1]) * mid1[0];
  T det2 = (mid2[0] + n2[0]) * mid2[1] - (mid2[1] + n2[1]) * mid2[0];
  Eigen::Matrix<T, 2, 1> center((det1 * n2[0] - det2 * n1[0]) / det,
    (det1 * n2[1] - det2 * n1[1]) / det);
  return center;
}
参考点偏移cost,与原始参考点的偏移
template<typename T>
  inline void addDistanceResidual(
    const double & weight,
    const Eigen::Matrix<T, 2, 1> & xi,
    const Eigen::Matrix<T, 2, 1> & xi_original,
    T & r) const
  {
    r += (T)weight * (xi - xi_original).squaredNorm();  // objective function value
  }
障碍物距离代价,通过压入costmap最小化cost来远离障碍物,自车用多圆模型表示,每个圆心的cost代价可不同:
template<typename T>
  inline void addCostResidual(
    const double & weight,
    const Eigen::Matrix<T, 2, 1> & pt,
    const Eigen::Matrix<T, 2, 1> & pt_next,
    const Eigen::Matrix<T, 2, 1> & pt_prev,
    T & r) const
  {
    if (params_.cost_check_points.empty()) {
      Eigen::Matrix<T, 2, 1> interp_pos =
        (pt - costmap_origin_.template cast<T>()) / (T)costmap_resolution_;
      T value;
      costmap_interpolator_->Evaluate(interp_pos[1] - (T)0.5, interp_pos[0] - (T)0.5, &value);  //双三次插值
      r += (T)weight * value * value;  // objective function value
    } else {
  //这里计算了路径的切线方向 dir,以便将成本检查点放在沿着路径方向的正确一侧。切线方向取决于路径是否正在倒车
      Eigen::Matrix<T, 2, 1> dir = tangentDir(
        pt_prev, pt, pt_next,
        next_to_last_length_ratio_ < 0);
      dir.normalize();
  //这个条件检查路径的朝向是否与 dir 方向一致,如果不一致,则取相反的方向。
      if (((pt_next - pt).dot(dir) < (T)0) != reversing_) {
        dir = -dir;
      }
  //这里创建了一个仿射变换矩阵 transform,该矩阵用于将成本检查点从局部坐标系转换为全局坐标系。这个变换基于 dir 和当前路径点 pt 的位置。
      Eigen::Matrix<T, 3, 3> transform;
      transform << dir[0], -dir[1], pt[0],
        dir[1], dir[0], pt[1],
        (T)0, (T)0, (T)1;
      for (size_t i = 0; i < params_.cost_check_points.size(); i += 3) {
        Eigen::Matrix<T, 3, 1> ccpt((T)params_.cost_check_points[i],
          (T)params_.cost_check_points[i + 1], (T)1);
        auto ccpt_world = (transform * ccpt).template block<2, 1>(0, 0);
        Eigen::Matrix<T, 2,
          1> interp_pos = (ccpt_world - costmap_origin_.template cast<T>()) /
          (T)costmap_resolution_;
        T value;
        costmap_interpolator_->Evaluate(interp_pos[1] - (T)0.5, interp_pos[0] - (T)0.5, &value);

        r += (T)weight * (T)params_.cost_check_points[i + 2] * value * value;
      }
    }
  }

标签:prev,const,Eigen,pt,smoother,next,nav2,constrained,Matrix
From: https://www.cnblogs.com/penuel/p/17777370.html

相关文章

  • 【ROS2机器人入门到实战】使用Nav2导航API进行导航
    4.使用Nav2导航API进行导航写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cnNav2的API其实是Nav2提供的一个Python库,通过该库......
  • [ABC297G] Constrained Nim 2 题解
    题意有\(N\)堆石子,其中第\(i\)堆有\(A_i\)个石子。每次可以选一堆从中取\(\left[L,R\right]\)个,问判断先手后手胜负。(\(1\leN\le2\times10^5,1\leL\leR\le10^9,1\leA_i\le10^9\))。题解考虑子游戏,即只有一堆石子的情况,考虑其\(\operatorname{SG}\)......
  • ROS2机器人导航Nav2超详细保姆级教程之四大服务器
    导航服务器规划器和控制器是导航任务的核心。恢复器用于使机器人摆脱不良状态或尝试处理各种形式的问题,以使系统具有容错能力。平滑器可用于进一步提高规划路径的质量。在本节中,将分析有关它们的一般概念及其在Nav2项目中的用途。规划器、恢复器、平滑器和控制器服务器。Nav2中......
  • 什么是 Kernel Smoother ?它与 Self Attention 有什么关系?
    [1]带权滑动平均(WeightedMovingAverage,WMA)是标量场上的滑动窗口内的加权平均,数学上等价于卷积。[1][2]KernelSmoother是一种特殊的WMA方法,特殊在于权重是由核函数决定的,相互之间越接近的点具有越高的权重。[2][3]Transformer中的自注意力机制可以看作一种KernelS......
  • Rust语言 - 接口设计的建议之受约束(Constrained)
    Rust语言-接口设计的建议之受约束(Constrained)RustAPI指南GitHub:https://github.com/rust-lang/api-guidelinesRustAPI指南中文:https://rust-chinese-translation.github.io/api-guidelines/RustAPI指南:https://rust-lang.github.io/api-guidelines/受约束(Constrai......
  • 【优秀论文解读】UV-SLAM: Unconstrained Line-based SLAM Using Vanishing Points fo
    论文简介提出了一种UV-SLAM的算法,整体建立与VINS-MONO的基础上:在VINS—MONO的基础上增加了线特征的约束和消影点的约束。其中线特征的提取用的是linesegmentdetector......
  • [ABC255G] Constrained Nim 题解
    [ABC255G]ConstrainedNimSolution目录[ABC255G]ConstrainedNimSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面一般Nim游戏基......
  • 《动手学ROS2》10.7 Nav2导航框架介绍与安装
    《动手学ROS2》10.7Nav2导航框架介绍与安装本系列教程作者:小鱼公众号:鱼香ROSQQ交流群:139707339教学视频地址:小鱼的B站​完整文档地址:鱼香ROS官网版权声明:如非允许禁止......
  • Safe RL——Constrained Policy Optimization (CPO)
    SafeRL——ConstrainedPolicyOptimization(CPO)作者:凯鲁嘎吉-博客园 http://www.cnblogs.com/kailugaji/这篇文章详细讲解ConstrainedPolicyOptimization(CPO)......
  • 学习笔记-Flutter 布局(三)- FittedBox、AspectRatio、ConstrainedBox详解
    Flutter布局(三)-FittedBox、AspectRatio、ConstrainedBox详解本文主要介绍Flutter布局中的FittedBox、AspectRatio、ConstrainedBox,详细介绍了其布局行为以及使用场景,并......