1.点云同步处理的类  RangeDataCollator

  1. class RangeDataCollator {
  2. public:
  3. explicit RangeDataCollator(
  4. const std::vector<std::string>& expected_range_sensor_ids)
  5. : expected_sensor_ids_(expected_range_sensor_ids.begin(),
  6. expected_range_sensor_ids.end()) {}
  7.  
  8. sensor::TimedPointCloudOriginData AddRangeData(
  9. const std::string& sensor_id,
  10. const sensor::TimedPointCloudData& timed_point_cloud_data);
  11.  
  12. private:
  13. sensor::TimedPointCloudOriginData CropAndMerge();
  14.  
  15. const std::set<std::string> expected_sensor_ids_;
  16. // Store at most one message for each sensor.
  17. std::map<std::string, sensor::TimedPointCloudData> id_to_pending_data_;
  18. common::Time current_start_ = common::Time::min();
  19. common::Time current_end_ = common::Time::min();
  20. };

其中有四个成员函数:

生成点云的所有传感器的 sensor_ids

  1. const std::set<std::string> expected_sensor_ids_;

修剪合并点云时的所有点云  sensor_id  和与之对应的数据

  1. std::map<std::string, sensor::TimedPointCloudData> id_to_pending_data_;

时间撮  记录点云

  1. common::Time current_start_ = common::Time::min();
  2. common::Time current_end_ = common::Time::min();

2.AddRangeData

  1. sensor::TimedPointCloudOriginData RangeDataCollator::AddRangeData(
  2. const std::string& sensor_id,
  3. const sensor::TimedPointCloudData& timed_point_cloud_data)

1.首先检测该点云数据 sensor_id 是否在期望的sensor_ids里面,否则程序停止

  1. CHECK_NE(expected_sensor_ids_.count(sensor_id), );

2.当该sensor_id 已经在 id_to_pending_data_ 中

当我们有两个相同传感器的消息时,移除两个中旧的数据,但不发送电流

1>跟新current_start,current_end 时间

  1. current_start_ = current_end_;
  2. current_end_ = id_to_pending_data_.at(sensor_id).time;

2>修剪合并在  id_to_pending_data_ 中的数据  CropAndMerge

  1. auto result = CropAndMerge();

3>将当前传感器数据放入 id_to_pending_data_ 中,并且返回result

  1. id_to_pending_data_.emplace(sensor_id, timed_point_cloud_data);
  2. return result;

3.当sensor_id 不在 id_to_pending_data_ 中时

1>首先当前数据加到 id_to_pending_data_ 中,

  1. id_to_pending_data_.emplace(sensor_id, timed_point_cloud_data);

2>使 id_to_pending_data_ 中 包含期望的所有数据

  1. if (expected_sensor_ids_.size() != id_to_pending_data_.size()) {
  2. return {};
  3. }

3>跟新时间

  1. current_start_ = current_end_;
  2. // We have messages from all sensors, move forward to oldest.
  3. common::Time oldest_timestamp = common::Time::max();
  4. for (const auto& pair : id_to_pending_data_) {
  5. oldest_timestamp = std::min(oldest_timestamp, pair.second.time);
  6. }
  7. current_end_ = oldest_timestamp;

4>修剪合并  CropAndMerge
3.CropAndMerge

  1. sensor::TimedPointCloudOriginData RangeDataCollator::CropAndMerge()

1.定义返回对象

  1. sensor::TimedPointCloudOriginData result{current_end_, {}, {}};

2.遍历 id_to_pending_data_ 中所有传感器的数据,其对于传感器数据处理一样

  1. for (auto it = id_to_pending_data_.begin();
  2. it != id_to_pending_data_.end();) {
  3. sensor::TimedPointCloudData& data = it->second;
  4. sensor::TimedPointCloud& ranges = it->second.ranges;

2>将在[current_start_,current_end_]区间内的传感器数据  下表确定出来

  1. auto overlap_begin = ranges.begin();
  2. while (overlap_begin < ranges.end() &&
  3. data.time + common::FromSeconds((*overlap_begin)[]) <
  4. current_start_) {
  5. ++overlap_begin;
  6. }
  7. auto overlap_end = overlap_begin;
  8. while (overlap_end < ranges.end() &&
  9. data.time + common::FromSeconds((*overlap_end)[]) <= current_end_) {
  10. ++overlap_end;
  11. }

3>复制重叠范围。

  1. if (overlap_begin < overlap_end) {
  2. std::size_t origin_index = result.origins.size();
  3. result.origins.push_back(data.origin);
  4. double time_correction = common::ToSeconds(data.time - current_end_);
  5. for (auto overlap_it = overlap_begin; overlap_it != overlap_end;
  6. ++overlap_it) {
  7. sensor::TimedPointCloudOriginData::RangeMeasurement point{*overlap_it,
  8. origin_index};
  9. // current_end_ + point_time[3]_after == in_timestamp +
  10. // point_time[3]_before
  11. point.point_time[] += time_correction;
  12. result.ranges.push_back(point);
  13. }
  14. }

涉及到:   处理了前一时刻的点云,然后将时间跟新

4>将缓冲点丢弃,直到overlap_end。

  1. if (overlap_end == ranges.end()) {
  2. it = id_to_pending_data_.erase(it);
  3. } else if (overlap_end == ranges.begin()) {
  4. ++it;
  5. } else {
  6. data = sensor::TimedPointCloudData{
  7. data.time, data.origin,
  8. sensor::TimedPointCloud(overlap_end, ranges.end())};
  9. ++it;
  10. }

3.按照时间排序,并且返回结果

  1. std::sort(result.ranges.begin(), result.ranges.end(),
  2. [](const sensor::TimedPointCloudOriginData::RangeMeasurement& a,
  3. const sensor::TimedPointCloudOriginData::RangeMeasurement& b) {
  4. return a.point_time[] < b.point_time[];
  5. });
  6. return result;

感觉cartographer处理点云数据有一帧延时

原文地址:https://blog.csdn.net/xiaoma_bk/article/details/85261422

cartographer 点云同步处理的更多相关文章

  1. 配置mac百度云同步盘

    1. 选择同步盘在电脑中的位置,该文件夹中的内容与云端保持一致.默认位置/Users/LemonVerbena/百度云同步盘.电脑同步盘的作用与百度云网盘的主页一样,下面可以包括多个同步文件夹. 2. ...

  2. 打造自己的MyLifeOrganized 2(MLO2)云同步

    0x01 官方云同步,付费也很卡 MyLifeOrganized(MLO)是Windows平台下强大的GTD软件,PC版本和Android版本需要分别购买授权,云同步还要再买包月或包年服务真不便宜,关 ...

  3. 黄聪:VPS实现自动定时备份网站数据以及Mysql数据库到百度云同步盘

    建站多了,备份成了头疼的问题,因为你不知道你的VPS什么时候会宕机或者服务商跑路,一旦网站数据丢失,那么相当于前功尽弃了,所以自己研究出了一套自动备份的方法. 需要的东西: 1.一个VPS(虚拟空间没 ...

  4. 小白也能用Git管理团队项目了:百度云同步+Git Extensions+Git Source Control Provider

    百度云同步 百度云同步,会将本地的某个文件目录和云端进行同步.如果在本地将这个同步的目录设置为Git的中心服务器,那么本地push到中心服务器的内容也会被同步到云端.其他开发者只要也进行相同的设置,就 ...

  5. 使用百度云同步盘和Git Extensions进行代码托管

    一.软件安装 百度云同步盘和Git Extensions的安装和配置略过. 二.建立Git代码库,以[GHO2VMDK转换工具]项目为例 1. 建立本地代码库 进入[GHO2VMDK转换工具]项目文件 ...

  6. leanote使用本地账户+坚果云同步

    1. 换机器后笔记无法显示 这是因为新建账户与原账户userid不一致. 正确的同步方式为: 下载leanote并解压,不运行,不新建账户 从坚果云同步leanote数据 创建leanote的数据目录 ...

  7. 亿级日PV的魅族云同步的核心协议与架构实践(转)

    云同步的业务场景 这是魅族云同步的演进,第一张是M8.M9,然后到后面的是MX系统,M9再往后发展,我们的界面可以看到基本上是没有什么变化的,但本质发生了很大的变化,我们经过了一些协议优化,发展到今天 ...

  8. 亿级日PV的魅族云同步的核心协议与架构实践

    声明:本文根据msup和魅族联合举办的<第三期魅族技术开放日-架构设计与优化>录音整理原创首发,转载或节选内容前需获授权. 嘉宾:沈辉煌,魅族高级架构师,魅族云同步负责人.2010年加入魅 ...

  9. 使用BestSync同步软件与坚果云同步

    坚果云的免费用户可以享受每个月的1G上传与3G下载流量,同时号称是国内唯一支持WebDAV的云.我的工作备份的文档不多,正好手头有BestSync同步软件可以用.决定试试BestSync的与WebDA ...

随机推荐

  1. python3 今日大纲 day05

    1. 上周内容回顾 1. 闭包: 内层函数对外层函数变量的使用 def outer(): a = 10 def inner(): print(a) return inner ret = outer() ...

  2. 全解史上最快的JOSN解析库 - alibaba Fastjson

    JSON,全称:JavaScript Object Notation,作为一个常见的轻量级的数据交换格式,应该在一个程序员的开发生涯中是常接触的.简洁和清晰的层次结构使得 JSON 成为理想的数据交换 ...

  3. 2019年美国大学生数学建模竞赛(MCM/ICM) E题解题思路

    这也许是我大学生涯最后一次参加数学建模比赛了吧,这次我们选择的问题是E题,以下是我们解题时候的一些思路.很多不易体现的项目产生对环境造成影响的指标可以由一些等同类型的指标来代替,如土地.森林植被被破环 ...

  4. Django配置404页面

    一.settings配置 1.首先需要在settings中将DEBUG由原来的True改为False DEBUG = False 2.需要设置 ALLOWED_OSTS = ["*" ...

  5. Kubernetes — 从0到1:搭建一个完整的Kubernetes集群

    准备工作 首先,准备机器.最直接的办法,自然是到公有云上申请几个虚拟机.当然,如果条件允许的话,拿几台本地的物理服务器来组集群是最好不过了.这些机器只要满足如下几个条件即可: 满足安装 Docker ...

  6. 开发神器之PHPstorm配置及使用

    之前文章对于PHPstorm有了简单的介绍,作为一名合格的PHPer,一定要定制一个适合自己的IDE,然后开始我们的路途吧... 1. 为不同的项目选定PHP版本 我们经常会遇到这样的场景,不同的项目 ...

  7. jmeter beanshell 中使用map

    1.使用第三方jar包的时候可以放在lib目录下也可以放在lib/ext目录下,放在这两个目录都可以引用jar包成功,通过引用json的jar包在另个目录都实验过成功. 2.通过学习知道可以在bean ...

  8. js语言规范_ES5-6-7_个人总结

    ## **理解ES** 1. 全称: ECMAScript 2. js语言的规范 3. 我们用的js是它的实现 4. js的组成   * ECMAScript(js基础)   * 扩展-->浏览 ...

  9. h5-音视频标签

    ###1. <video>:Html5提供的播放视频的标签          src:资源地址          controls:该属性定义是显示还是隐藏用户控制界面 调用默认控件    ...

  10. 数据库优化-mysql中INNODB和MYIASM引擎的区别

    Innodb引擎 Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别. 该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQ ...