QueueKey OrderedMultiQueue::GetBlocker() const {
CHECK(!queues_.empty());
return blocker_;
如果目前有数据队列阻塞了,则该队列的 QueueKey 就会被保存在 OrderedMultiQueue::blocker_ 之中,调用该函数即可查看。
通过该篇博客,了解到了 BlockingQueue 与 OrderedMultiQueue 的成员函数,但是他们是怎么串联起来的,如何被调用的,或许不是很清楚。不过,没有关系,下一篇博客就会进行详细讲解,其主要设计的函数就是 OrderedMultiQueue::Dispatch()。
cartographer_learn_5_test续接前文OrderedMultiQueue相关的定义OrderedMultiQueue的类成员OrderedMultiQueue的类方法
在具体的讨论前后端前,觉得有必要讨论一下数据的处理和传输,即 unique_ptr< sensor::CollatorInterface > MapBuilder::sensor_collator_。看起来它的类型是sensor::CollatorInterface,但是F12进去后发现它仅仅是接口,
参考定义见:backpack_3d.lua
Local map frame是一次slam过程中的原点。但是现在cartographer支持Incremental mapping。global map是整个地图的原点,local map是每一次建图的原点。
map_frame = “map”:cartograp...
const Data* next_data = nullptr;
Queue* next_queue = nullptr;
QueueKey next_queue_key;
// check data is coming or not
//LOG(INFO) << "okagv enter forloop";
// must s
本次阅读的源码为 release-1.0 版本的代码
https://github.com/googlecartographer/cartographer_ros/tree/release-1.0
https://github.com/googlecartographer/cartographer/tree/release-1.0
也可以下载我上传的 全套工作空间的代码,包括 protobu...
我们知道了,GlobalTrajectoryBuilder 是 slam系统的顶层设计,该类中包含了两个成员变量:localTrajectoryBuilder 负责前端localslam ; PoseGraph 负责后端 (是从MapBuilder类中的posegraph传递过来的)。那么,传感器数据是如何流到GlobalTrajectoryBuilder从而被处理的呢?
一、基础类 OrderedMultiQueue
下面介绍 sensor::TrajectoryCollator 类
absl::f
0. 简介
在设计复杂的运行程序时,我们经常需要创建一定数量的线程,然而很多时候线程不都是一直执行的,会存在一些线程处于空闲状态。所以通过线程池的方式,可以有效的对线程进行分配。若线程池中有空闲线程,则从线程池中取出一个空闲的线程处理该任务,任务处理完后,该线程被放到线程池中;若线程池中无空闲线程,则将任务放入任务队列等待线程池中有线程空闲,这样的处理方式可以避免线程在建立与销毁时存在的开销。
1. 基础知识
多线程 https://www.cnblogs.com/heimazaifei/p/12176
Queue waiting for data:(0, points2)
Queue waiting for data:(0, odom)
说明在提供给cartographter的传感器数据出现了问题,没有被成功解析。
小编是使用自己编写的odom话题发布时,cartographer爆出了该错误。
于是设想传感器数据相关的tf或lua配置或数据本身存在错误。
于是逐个排查,最终发现了错误原因。
排查可能原因:tf错误
小编之前已处理过tf与lua配置的问题
(02)Cartographer源码无死角解析中提到了Cartographer的核心算法和数据结构,以及代码架构和工程实现细节。在掌握了这些内容之后,我们就可以使用Cartographer来实现SLAM(同时定位与地图构建)功能了。
(03)新数据运行与地图保存、加载地图启动仅定位,是指在使用Cartographer进行实时定位和地图构建时,如果我们获取到了新的传感器数据,就可以通过传入这些新数据来进行实时定位和地图更新。同时,当我们需要保存地图或者加载已有地图来进行定位时,Cartographer也提供了相应的API和工具。
具体来说,对于新数据的运行和实时定位,我们可以通过cartographer_ros包中的rosnode来实现。这个rosnode订阅传感器数据,然后使用Cartographer的算法和数据结构来进行实时定位和地图构建。当定位结束后,我们可以通过发布ROS消息的方式将建好的地图发送给其他ROS节点使用。
而对于地图的保存和加载,Cartographer提供了两个工具:cartographer_rosbag和cartographer_pbstream。前者可以将Cartographer处理过的数据保存成rosbag文件,以便于后续回放和分析;后者则可以将Cartographer的状态和数据保存成pbstream文件,以便于后续的加载和定位。当我们需要加载已有地图时,只需要使用cartographer_ros包中的另一个rosnode来加载pbstream文件,并订阅传感器数据即可。
需要注意的是,在地图保存和加载时,我们只能进行启动仅定位,也就是只进行实时定位和不进行地图更新。这是因为保存和加载的地图可能已经过时,而且相对于我们实时获取的传感器数据,地图的信息是静态的,无法提供新的信息。因此,Cartographer只提供了仅定位的功能。当我们需要重新建立地图时,需要重新运行实时定位的节点并进行地图更新。