hdl_graph_slam源码解析(六)

本文深入解析hdl_graph_slam源码的后端优化部分,包括位姿图(posegraph)构建、激光里程计及地面检测约束的添加,以及非线性优化算法的应用。同时,分享了在实际场景中的实验结果与遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6. 后端优化

6.1 pose graph

hdl_graph_slam采用g2o来进行后端优化,也就是对优化目标函数的工作了。再解析这部分源码之前,我们首先来看下hdl_graph_slam对应的位姿图(pose graph)是什么样子的呢?首先肯定有由激光里程计构成的运动约束,然后还有地面检测和回环检测构成的测量约束,整个pose graph可以用下图来表示:

图中黑色直线代表的是激光里程计构成的运动约束,从数学的角度来讲是两个SE(3)节点之间的约束,紫色直线是地面检测的约束,是SE(3)到平面的约束,而虚线是回环检测约束,同样也是SE(3)之间的约束。接下来,一起看下如何利用g2o表示上图所示的pose graph并采用非线性优化算法进行优化。

6.2 hdl_graph_slam

hdl_graph_slam算法中的后端优化部分主要定义并实现在hdl_graph_slam_nodelet.cpp源码中,由于这部分的源码较多,我们挑比较核心的部分进行解析。首先来看下如何添加激光里程计构成的运动约束:

bool flush_keyframe_queue(){
   
	for(int i=0; i<std::min<int>(keyframe_queue.size(), max_keyframes_per_update); i++) {
   
      num_processed = i;

      const auto& keyframe = keyframe_queue[i];
      // new_keyframes will be tested later for loop closure
      new_keyframes.push_back(keyframe);

      // add pose node
      Eigen::Isometry3d odom = odom2map * keyframe->odom;
      keyframe->node = graph_slam->add_se3_node(odom);
      keyframe_hash[keyframe->stamp] = keyframe;

      // fix the first node
      if(keyframes.empty() && new_keyframes.size() == 1) {
   
        if(private_nh.param<bool>("fix_first_node", false)) {
   
          anchor_node = graph_slam->add_se3
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值