cartographer_learn_6
续接上一篇
回到Collator这个类中,前文说这个类有两个我们看不懂的类成员,前文讨论了其中一个OrderedMultiQueue,总的来说它就是按轨迹id和ros的话题分门别类的存储,处理,发送数据的。第二个是一个absl::flat_hash_map<int, std::vector< QueueKey> >,百度了一下说这是谷歌开发的库,其实从名字也能看出来这个就相当于unordered_map,至于它们间有啥不一样,没有研究,就当它是一个unordered_map吧。它的键值是轨迹的id,vector中存储了该轨迹所对应的所有数据类型(可回看上一篇的QueueKey)。那我们现在又回到Collator中
Collator类方法
看起来Collator是OrderedMultiQueue的封装,它的功能大部分都是调用OrderedMultiQueue去实现
(1)AddTrajectory
void Collator::AddTrajectory(
const int trajectory_id,
const absl::flat_hash_set<std::string>& expected_sensor_ids,
const Callback& callback) {
for (const auto& sensor_id : expected_sensor_ids) {
const auto queue_key = QueueKey{trajectory_id, sensor_id};
queue_.AddQueue(queue_key,
[callback, sensor_id](std::unique_ptr<Data> data) {
callback(sensor_id, std::move(data));
});
queue_keys_[trajectory_id].push_back(queue_key);
}
}
添加一条轨迹时要遍历这条轨迹所订阅的所有关于传感器数据数据的topic,并添加到
OrderedMultiQueue Collator::queue_中。注意这里的参数Callback并不是上一篇中的Callback,两者参数不一样,所以这里使用lambda表达式为两者过渡一下。作者又回去MapBuilder中查看添加轨迹时是否调用了这个函数,发现并没有,只是再生成前端时把这个类的指针传了进去,想必是在前端的构造函数中调用了它,我们后面讨论(其实是源码没看到那)再确定一下是不是和我们猜(瞎说)的那样。作者好奇数据怎么从订阅ros中的话题到传输入数据队列的,于是一番F12后发现依然是在前端实现的,到后面我们再一起讨论。同时将轨迹订阅的话题的名字都存储在absl::flat_hash_map<int, std::vector< QueueKey> > Collator::queue_keys_中
(2)FinishTrajectory
void Collator::FinishTrajectory(const int trajectory_id) {
for (const auto& queue_key : queue_keys_[trajectory_id]) {
queue_.MarkQueueAsFinished(queue_key);
}
}
结束轨迹,在absl::flat_hash_map<int, std::vector< QueueKey> > Collator::queue_keys_中取出该轨迹订阅的所有话题的名字,并调用OrderedMultiQueue::MarkQueueAsFinished具体处理
(3)AddSensorData
void Collator::AddSensorData(const int trajectory_id,
std::unique_ptr<Data> data) {
QueueKey queue_key{trajectory_id, data->GetSensorId()};
queue_.Add(std::move(queue_key), std::move(data));
}
添加数据,同样的先做出对应的QueueKey,再调用OrderedMultiQueue::Add去实现。
其他函数就不介绍了,都是一样的套路。