cartographer 点云同步处理
1.点云同步处理的类 RangeDataCollator
class RangeDataCollator {
public:
explicit RangeDataCollator(
const std::vector<std::string>& expected_range_sensor_ids)
: expected_sensor_ids_(expected_range_sensor_ids.begin(),
expected_range_sensor_ids.end()) {} sensor::TimedPointCloudOriginData AddRangeData(
const std::string& sensor_id,
const sensor::TimedPointCloudData& timed_point_cloud_data); private:
sensor::TimedPointCloudOriginData CropAndMerge(); const std::set<std::string> expected_sensor_ids_;
// Store at most one message for each sensor.
std::map<std::string, sensor::TimedPointCloudData> id_to_pending_data_;
common::Time current_start_ = common::Time::min();
common::Time current_end_ = common::Time::min();
};
其中有四个成员函数:
生成点云的所有传感器的 sensor_ids
const std::set<std::string> expected_sensor_ids_;
修剪合并点云时的所有点云 sensor_id 和与之对应的数据
std::map<std::string, sensor::TimedPointCloudData> id_to_pending_data_;
时间撮 记录点云
common::Time current_start_ = common::Time::min();
common::Time current_end_ = common::Time::min();
2.AddRangeData
sensor::TimedPointCloudOriginData RangeDataCollator::AddRangeData(
const std::string& sensor_id,
const sensor::TimedPointCloudData& timed_point_cloud_data)
1.首先检测该点云数据 sensor_id 是否在期望的sensor_ids里面,否则程序停止
CHECK_NE(expected_sensor_ids_.count(sensor_id), );
2.当该sensor_id 已经在 id_to_pending_data_ 中
当我们有两个相同传感器的消息时,移除两个中旧的数据,但不发送电流
1>跟新current_start,current_end 时间
current_start_ = current_end_;
current_end_ = id_to_pending_data_.at(sensor_id).time;
2>修剪合并在 id_to_pending_data_ 中的数据 CropAndMerge
auto result = CropAndMerge();
3>将当前传感器数据放入 id_to_pending_data_ 中,并且返回result
id_to_pending_data_.emplace(sensor_id, timed_point_cloud_data);
return result;
3.当sensor_id 不在 id_to_pending_data_ 中时
1>首先当前数据加到 id_to_pending_data_ 中,
id_to_pending_data_.emplace(sensor_id, timed_point_cloud_data);
2>使 id_to_pending_data_ 中 包含期望的所有数据
if (expected_sensor_ids_.size() != id_to_pending_data_.size()) {
return {};
}
3>跟新时间
current_start_ = current_end_;
// We have messages from all sensors, move forward to oldest.
common::Time oldest_timestamp = common::Time::max();
for (const auto& pair : id_to_pending_data_) {
oldest_timestamp = std::min(oldest_timestamp, pair.second.time);
}
current_end_ = oldest_timestamp;
4>修剪合并 CropAndMerge
3.CropAndMerge
sensor::TimedPointCloudOriginData RangeDataCollator::CropAndMerge()
1.定义返回对象
sensor::TimedPointCloudOriginData result{current_end_, {}, {}};
2.遍历 id_to_pending_data_ 中所有传感器的数据,其对于传感器数据处理一样
for (auto it = id_to_pending_data_.begin();
it != id_to_pending_data_.end();) {
sensor::TimedPointCloudData& data = it->second;
sensor::TimedPointCloud& ranges = it->second.ranges;
2>将在[current_start_,current_end_]区间内的传感器数据 下表确定出来
auto overlap_begin = ranges.begin();
while (overlap_begin < ranges.end() &&
data.time + common::FromSeconds((*overlap_begin)[]) <
current_start_) {
++overlap_begin;
}
auto overlap_end = overlap_begin;
while (overlap_end < ranges.end() &&
data.time + common::FromSeconds((*overlap_end)[]) <= current_end_) {
++overlap_end;
}
3>复制重叠范围。
if (overlap_begin < overlap_end) {
std::size_t origin_index = result.origins.size();
result.origins.push_back(data.origin);
double time_correction = common::ToSeconds(data.time - current_end_);
for (auto overlap_it = overlap_begin; overlap_it != overlap_end;
++overlap_it) {
sensor::TimedPointCloudOriginData::RangeMeasurement point{*overlap_it,
origin_index};
// current_end_ + point_time[3]_after == in_timestamp +
// point_time[3]_before
point.point_time[] += time_correction;
result.ranges.push_back(point);
}
}
涉及到: 处理了前一时刻的点云,然后将时间跟新
4>将缓冲点丢弃,直到overlap_end。
if (overlap_end == ranges.end()) {
it = id_to_pending_data_.erase(it);
} else if (overlap_end == ranges.begin()) {
++it;
} else {
data = sensor::TimedPointCloudData{
data.time, data.origin,
sensor::TimedPointCloud(overlap_end, ranges.end())};
++it;
}
3.按照时间排序,并且返回结果
std::sort(result.ranges.begin(), result.ranges.end(),
[](const sensor::TimedPointCloudOriginData::RangeMeasurement& a,
const sensor::TimedPointCloudOriginData::RangeMeasurement& b) {
return a.point_time[] < b.point_time[];
});
return result;
感觉cartographer处理点云数据有一帧延时
原文地址:https://blog.csdn.net/xiaoma_bk/article/details/85261422
cartographer 点云同步处理的更多相关文章
- 配置mac百度云同步盘
1. 选择同步盘在电脑中的位置,该文件夹中的内容与云端保持一致.默认位置/Users/LemonVerbena/百度云同步盘.电脑同步盘的作用与百度云网盘的主页一样,下面可以包括多个同步文件夹. 2. ...
- 打造自己的MyLifeOrganized 2(MLO2)云同步
0x01 官方云同步,付费也很卡 MyLifeOrganized(MLO)是Windows平台下强大的GTD软件,PC版本和Android版本需要分别购买授权,云同步还要再买包月或包年服务真不便宜,关 ...
- 黄聪:VPS实现自动定时备份网站数据以及Mysql数据库到百度云同步盘
建站多了,备份成了头疼的问题,因为你不知道你的VPS什么时候会宕机或者服务商跑路,一旦网站数据丢失,那么相当于前功尽弃了,所以自己研究出了一套自动备份的方法. 需要的东西: 1.一个VPS(虚拟空间没 ...
- 小白也能用Git管理团队项目了:百度云同步+Git Extensions+Git Source Control Provider
百度云同步 百度云同步,会将本地的某个文件目录和云端进行同步.如果在本地将这个同步的目录设置为Git的中心服务器,那么本地push到中心服务器的内容也会被同步到云端.其他开发者只要也进行相同的设置,就 ...
- 使用百度云同步盘和Git Extensions进行代码托管
一.软件安装 百度云同步盘和Git Extensions的安装和配置略过. 二.建立Git代码库,以[GHO2VMDK转换工具]项目为例 1. 建立本地代码库 进入[GHO2VMDK转换工具]项目文件 ...
- leanote使用本地账户+坚果云同步
1. 换机器后笔记无法显示 这是因为新建账户与原账户userid不一致. 正确的同步方式为: 下载leanote并解压,不运行,不新建账户 从坚果云同步leanote数据 创建leanote的数据目录 ...
- 亿级日PV的魅族云同步的核心协议与架构实践(转)
云同步的业务场景 这是魅族云同步的演进,第一张是M8.M9,然后到后面的是MX系统,M9再往后发展,我们的界面可以看到基本上是没有什么变化的,但本质发生了很大的变化,我们经过了一些协议优化,发展到今天 ...
- 亿级日PV的魅族云同步的核心协议与架构实践
声明:本文根据msup和魅族联合举办的<第三期魅族技术开放日-架构设计与优化>录音整理原创首发,转载或节选内容前需获授权. 嘉宾:沈辉煌,魅族高级架构师,魅族云同步负责人.2010年加入魅 ...
- 使用BestSync同步软件与坚果云同步
坚果云的免费用户可以享受每个月的1G上传与3G下载流量,同时号称是国内唯一支持WebDAV的云.我的工作备份的文档不多,正好手头有BestSync同步软件可以用.决定试试BestSync的与WebDA ...
随机推荐
- OCR技术浅析-tesserOCR(3)
tesserOCR使用 tesserOCR是文字识别软件(惠普公司开源) Optical Character Recognition (OCR)即光学字符辨识是把打印文本转换成一个数字表示的过程.它有 ...
- ExcelDna项目完整工程演示及讲解
原始链接:http://www.cnblogs.com/Charltsing/p/ExcelDnaDemo.html ExcelDna工程演示讲课内容 1.ExcelDna是啥? 2.ExcelDna ...
- java基础-不用ide如何打包
java基础-不用ide如何打包 1. 建立目录 src存放源文件 classes存放编译文件 2. 建立类文件 主类 package test.ant; import test.ant.MyTool ...
- MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(三)
版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 在前两篇文章MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网 ...
- vim编辑器的命令总结
1. 设置显示行数 :set nu 2. 复制第100至第103行的代码
- 根据 Power BI Desktop(预览版)中的报表页创建工具提示
根据 Power BI Desktop 中创建的报表页,可创建直观丰富的报表工具提示,这些提示在你将鼠标悬停在视觉对象上时显示. 通过创建用作工具提示的报表页,使自定义工具提示包含视觉对象.图像以及在 ...
- SQL Data Discovery and Classification
The new version of SQL Server Management Studio (v17.5) brings with it a new feature: SQL Data Disco ...
- [SimplePlayer] 5. 向音频设备输出音频
两种SDL音频输出方式 我们这里采用SDL来进行音频输出.SDL提供两种音频输出的方式: 如果在SDL_OpenAudio时不指定callback,那么可以调用SDL_QueueAudio主动地向音频 ...
- 关于【Webpack】的入门使用
注:节选自http://www.jianshu.com/p/42e11515c10f 1.安装 Webpack可以使用npm安装,新建一个空的练习文件夹(此处命名为webpack sample pro ...
- 当同时安装Python2和Python3后,如何兼容并切换使用详解(比如pip使用)
由于历史原因,Python有两个大的版本分支,Python2和Python3,又由于一些库只支持某个版本分支,所以需要在电脑上同时安装Python2和Python3,因此如何让两个版本的Python兼 ...