cartographer/sensor/internal/collator.h

Overview

Collator synchronizes sensor data from multiple sensors using an OrderedMultiQueue, then dispatches to a TrajectoryBuilderInterface. Provides higher-level interface than OrderedMultiQueue.

Class: cartographer::sensor::Collator

Construction

Collator(
    const std::set<TrajectoryBuilderInterface::SensorId>& expected_sensor_ids,
    const std::function<void(int trajectory_id, 
                             std::unique_ptr<Data>)>& callback);

Methods

// Add sensor data for a trajectory
void AddSensorData(int trajectory_id, 
                   const std::string& sensor_id,
                   std::unique_ptr<Data> data);

// Mark trajectory as finished
void FinishTrajectory(int trajectory_id);

// Flush all pending data
void Flush();

Sensor IDs

expected_sensor_ids defines valid sensor IDs for this collator:

std::set<SensorId> sensors = {
  {"rangefinder", "laser"},
  {"imu", "imu"},
  {"odometer", "odom"}
};

TrajectoryCollator

Manages multiple Collator instances (one per trajectory):

class TrajectoryCollator {
 public:
  TrajectoryCollator(
      const std::function<void(int trajectory_id,
                               std::unique_ptr<Data>)>& callback);

  void AddTrajectory(int trajectory_id,
                     const std::set<SensorId>& expected_sensor_ids);
  
  void AddSensorData(int trajectory_id,
                     const std::string& sensor_id,
                     std::unique_ptr<Data> data);
  
  void FinishTrajectory(int trajectory_id);
  void Flush();
};

Usage

// In MapBuilder
auto collator = std::make_unique<Collator>(expected_sensors, 
    [this](int traj_id, std::unique_ptr<Data> data) {
      trajectory_builders_[traj_id]->AddSensorData(data->GetSensorId(), 
                                                   std::move(data));
    });

// From sensor driver
collator->AddSensorData(traj_id, "laser", 
    MakeDispatchable("laser", time, range_data));
collator->AddSensorData(traj_id, "imu", 
    MakeDispatchable("imu", time, imu_data));

Configuration

Controlled by MapBuilder option:

MAP_BUILDER = {
  collate_by_trajectory = false,  -- Single collator for all trajectories
}
  • false — Single Collator for all trajectories

  • true — TrajectoryCollator with per-trajectory Collator

See Also