cartographer导航时丢失odom数据,如何保证定位数据稳定?

Posted COCO_PEAK_NOODLE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cartographer导航时丢失odom数据,如何保证定位数据稳定?相关的知识,希望对你有一定的参考价值。

我们知道odom是电机齿轮编码器的数据,如果按了急停,这时候没有odom数据发布出来,我们要如何处理odom丢失导致定位失效的问题,这里给出一种解决方案

在ordered_multi_queue.cc 中当检测到odom丢失时,KMaxQueueSize是检测到其他传感器累计的数量超过多少时,我们可以在queues中移除odom的使用

void OrderedMultiQueue::CannotMakeProgress(const QueueKey& queue_key) 
  blocker_ = queue_key;
  for (auto& entry : queues_) 
    if (entry.second.queue.Size() > kMaxQueueSize) 
      LOG_EVERY_N(WARNING, 60) << "Queue waiting for data: " << queue_key;

      //here
      queues_.erase(queue_key);

      return;
    
  

本以为这样就可以了,但是由于pose_extrapolator.cc并没有考虑odom丢失的问题,这里也要修改一下

void PoseExtrapolator::TrimOdometryData() 
  //LOG(INFO) << "TrimOdometryData odometry_data_ size " << odometry_data_.size();
  //cartographer
  /*
  while (odometry_data_.size() > 2 && !timed_pose_queue_.empty() &&
         odometry_data_[1].time <= timed_pose_queue_.back().time) 
    odometry_data_.pop_front();
  
  */

  //here
  if(odometry_data_.size()!=0 && timed_pose_queue_.size() != 0)
  
  double second = common::ToSeconds(odometry_data_.back().time
                                  - timed_pose_queue_.back().time) * (-1);

   //odom 丢失时间超过1s
   if(second >1.0 && odometry_data_.size() != 0)
   
     odometry_data_.clear();
     LOG(WARNING) << "okagv odom maybe missing ";
   
  
  

原作者的意思是odometry_data_.size()数量只要不超过2个,则使用激光估计的位姿来进行线速度的估计。所以这里odometry_data_.clear();
之所以这样做(用时间来检测)而不是暴力的移除,反正读者可以测试一下就知道了

以上是关于cartographer导航时丢失odom数据,如何保证定位数据稳定?的主要内容,如果未能解决你的问题,请参考以下文章

cartographer odom中途添加进来导致last_dispatched_time_时间检测失败

cartographer导航时优化速度间隔多少合适?

cartographer导航时优化速度间隔多少合适?

cartographer之pose_extrapolator

cartographer使用二维码读码器和2D激光雷达实现的混合定位

ROS实验笔记之——基于cartographer方法的SLAM