许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  Cartographer优化问题2D(optimization_problem_2d)源码分析

Cartographer优化问题2D(optimization_problem_2d)源码分析

阅读数 4
点赞 0
article_banner


cartographer_optimization_problem_2d

  • 0.引言 1.设置待优化变量 2.残差项 2.1.第一种残差-intra- and inter-submap constraints. 2.2.第二种残差-Landmark 2.3.第三种残差-Odometer-relative pose constraint 相邻帧的约束 2.4.第四种残差-relative_local_slam_pose-前端结果的局部信息 2.5.第五种残差-gps 3.理论参考


0.引言

请添加图片描述

主要业务逻辑回到mapping/internal/2d/pose_graph_2d.cc/PoseGraph2https://www.gofarlic.com:HandleWorkQueue-->RunOptimization()中。具体的优化这一部分就是在optimization中进行实现。

前面计算约束结果为:

请添加图片描述

1.设置待优化变量

请添加图片描述

  • 子图的global_pose
  • 节点的global_pose_2d

2.残差项

2.1.第一种残差-intra- and inter-submap constraints.

节点与子图原点在global坐标系下的相对位姿约束 的差值作为残差项

  • 第一种坐标变换: 节点与子图原点在global坐标系下的坐标变换(预测位姿)
  • 第二种坐标变换: 子图内约束与子图间约束(测量位姿)

请添加图片描述

  • note:向约束测量值逼近

残差计算代码:

/**
 * @brief 2d 根据SPA论文里的公式求残差
 * 
 * 计算残差:
 * T12 = T1.inverse() * T2
 * [R1.inverse * R2,  R1.inverse * (t2 -t1)]
 * [0              ,  1                    ]
 * 
 * @param[in] relative_pose 
 * @param[in] start 
 * @param[in] end 
 * @return std::array<T, 3> 
 */
template <typename T>
static std::array<T, 3> ComputeUnscaledError(
    const transform::Rigid2d& relative_pose, const T* const start,
    const T* const end) {
  // 旋转矩阵R
  const T cos_theta_i = cos(start[2]);
  const T sin_theta_i = sin(start[2]);
  const T delta_x = end[0] - start[0]; // t2 -t1
  const T delta_y = end[1] - start[1];
  const T h[3] = {cos_theta_i * delta_x + sin_theta_i * delta_y, // R.inverse * (t2 -t1)
                  -sin_theta_i * delta_x + cos_theta_i * delta_y,
                  end[2] - start[2]};
  return {{T(relative_pose.translation().x()) - h[0],
           T(relative_pose.translation().y()) - h[1],
           common::NormalizeAngleDifference(
               T(relative_pose.rotation().angle()) - h[2])}};
}

2.2.第二种残差-Landmark

landmark数据通过2个节点位姿插值出来的相对位姿 的差值作为残差项

  • 第一种坐标变换: landmark数据的时间在2个节点位姿中插值出来的位姿(预测位姿)
  • 第二种坐标变换: landmark数据中的landmark_to_tracking_transform_(测量位姿)
  struct LandmarkNode {
    // landmark数据是相对于tracking_frame的相对坐标变换
    struct LandmarkObservation {
      int trajectory_id;
      common::Time time;
      transform::Rigid3d landmark_to_tracking_transform;
      double translation_weight;
      double rotation_weight;
    };
    // 同一时刻可能会观测到多个landmark数据
    std::vector<LandmarkObservation> landmark_observations;
    // 这帧数据对应的tracking_frame在global坐标系下的位姿
    absl::optional<transform::Rigid3d> global_landmark_pose;
    bool frozen = false;
  };

主要是node <--> landmark 之间的约束:

  // Step: landmark数据 与 通过2个节点位姿插值出来的相对位姿 的差值作为残差项
  AddLandmarkCostFunctions(landmark_nodes, node_data_, &C_nodes, &C_landmarks,
                           &problem, options_.huber_scale());

略.

2.3.第三种残差-Odometer-relative pose constraint 相邻帧的约束

节点与节点间在global坐标系下的相对坐标变换通过里程计数据插值出的相对坐标变换 的差值作为残差项

  • 第一种坐标变换: 相邻2个节点间在global坐标系下的坐标变换
  • 第二种坐标变换: 再分别计算这2个节点的时间在里程计数据队列中插值得到的2个里程计位姿, 计算这2个里程计位姿间的坐标变换
  • note: 帧间约束,向里程计结果逼近

2.4.第四种残差-relative_local_slam_pose-前端结果的局部信息

节点与节点间在global坐标系下的相对坐标变换相邻2个节点在local坐标系下的相对坐标变换 的差值作为残差项

  • 第一种坐标变换: 相邻2个节间在global坐标系下的坐标变换
  • 第二种坐标变换: 相邻2个节点在local坐标系下的坐标变换
  • note:同样是帧间约束,向前端匹配结果逼近

2.5.第五种残差-gps

节点与gps坐标系原点在global坐标系下的相对坐标变换通过gps数据进行插值得到的相对坐标变换 的差值作为残差项

  • 第一种坐标变换: 节点对应的时刻在gps数据中插值得到的gps相对于gps坐标系原点的位姿
  • 第二种坐标变换: 节点在global坐标系下 与 gps坐标系原点 的相对坐标变换

在这里插入图片描述

3.理论参考
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空