本节介绍的函数位于cartographer/mapping/internal/collated_trajectory_builder.cc
文件中
AddSensorData
AddSensorData 函数为CollatedTrajectoryBuilder的方法
此类继承于TrajectoryBuilderInterface接口,接口中的有多种AddSensorData函数,用于处理各个传感器数据,如
1 2 3 4 5 6
| void AddSensorData( const std::string& sensor_id, const sensor::TimedPointCloudData& timed_point_cloud_data) override { AddData(sensor::MakeDispatchable(sensor_id, timed_point_cloud_data)); }
|
Sensor类的sensor::MakeDispatchable
1 2 3 4 5 6 7 8 9 10 11 12
|
template <typename DataType> std::unique_ptr<Dispatchable<DataType>> MakeDispatchable( const std::string &sensor_id, const DataType &data) { return absl::make_unique<Dispatchable<DataType>>(sensor_id, data); }
|
此函数的作用是生称一个指向Dispatchable类的unique指针。
注意他是一个模板函数,使用的时候不需要加上尖括号,能自动推断出模板的数据类型,还是上面那个例子,则DataType为sensor::TimedPointCloudData
类型
模板类 Dispatchable
此类是接口Data的是一个继承,主要的作用是把数据加入到trajectory_builder
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| template <typename DataType> class Dispatchable : public Data { public: Dispatchable(const std::string &sensor_id, const DataType &data) : Data(sensor_id), data_(data) {}
common::Time GetTime() const override { return data_.time; }
void AddToTrajectoryBuilder( mapping::TrajectoryBuilderInterface *const trajectory_builder) override { trajectory_builder->AddSensorData(sensor_id_, data_); }
const DataType &data() const { return data_; }
private: const DataType data_; };
|
RateTimer
RateTimer建立
在HandleCollatedSensorData中,建立了RateTimer。RateTimer存储了一些还需要使用的数据的时间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void CollatedTrajectoryBuilder::HandleCollatedSensorData( const std::string& sensor_id, std::unique_ptr<sensor::Data> data) { auto it = rate_timers_.find(sensor_id); if (it == rate_timers_.end()) { it = rate_timers_ .emplace( std::piecewise_construct, std::forward_as_tuple(sensor_id), std::forward_as_tuple( common::FromSeconds(kSensorDataRatesLoggingPeriodSeconds))) .first; } it->second.Pulse(data->GetTime());
|
ratetimers 是一个map,可以通过emplace的方式进行插入。emplace().first表示新插入元素或者原始位置的迭代器。
1
| std::map<std::string, common::RateTimer<>> rate_timers_;
|
RateTimer构造
注意,ratetimers的值为common::RateTimer,common::RateTimer的构造函数为,表示需要保存的数据的持续时间
1 2
| explicit RateTimer(const common::Duration window_duration) : window_duration_(window_duration) {}
|
它只接受一单个参数,common::Duration,他的构造为
1
| std::forward_as_tuple(common::FromSeconds(kSensorDataRatesLoggingPeriodSeconds)))
|
数据更新
1 2 3 4 5 6 7
| void CollatedTrajectoryBuilder::HandleCollatedSensorData( const std::string& sensor_id, std::unique_ptr<sensor::Data> data) { auto it = rate_timers_.find(sensor_id); ... it->second.Pulse(data->GetTime());
|
it->second.Pulse(data->GetTime());
把当前传感器的数据时间和当前时间加入,并且剔除在当前传感器数据前面kSensorDataRatesLoggingPeriodSeconds 秒的时间
Debug log
程序运行期间,只要当前的时间距离上一次的时间大于15s了,就打印一次log
1 2 3 4 5 6 7 8 9 10
| if (std::chrono::steady_clock::now() - last_logging_time_ > common::FromSeconds(kSensorDataRatesLoggingPeriodSeconds)) { for (const auto& pair : rate_timers_) { LOG(INFO) << pair.first << " rate: " << pair.second.DebugString(); } last_logging_time_ = std::chrono::steady_clock::now(); }
|
DebugString
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| std::string DebugString() const { if (events_.size() < 2) { return "unknown"; }
std::ostringstream out; out << std::fixed << std::setprecision(2) << ComputeRate() << " Hz " << DeltasDebugString() << " (pulsed at " << ComputeWallTimeRateRatio() * 100. << "% real time)"; return out.str(); }
|