cartographer_learn_6

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去实现。
其他函数就不介绍了,都是一样的套路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值