cartographer/mapping/trajectory_builder_interface.h¶
Overview¶
TrajectoryBuilderInterface defines the interface for local SLAM — constructing submaps from sensor data and producing pose estimates. Separate implementations exist for 2D (LocalTrajectoryBuilder2D) and 3D (LocalTrajectoryBuilder3D).
Class: cartographer::mapping::TrajectoryBuilderInterface¶
Types¶
SensorId¶
using SensorId = std::pair<std::string /*type*/, std::string /*id*/>;
Identifies a sensor. Type is one of: "rangefinder", "imu", "odometer", "fixed_frame_pose", "landmark".
LocalSlamResultCallback¶
using LocalSlamResultCallback =
std::function<void(const LocalSlamResultData&)>;
Called when local SLAM produces a result (submap insertion, pose estimate).
LocalSlamResultData¶
struct LocalSlamResultData {
int trajectory_id;
common::Time time;
transform::Rigid3d local_pose;
sensor::RangeData range_data_in_local;
std::vector<std::shared_ptr<const Submap>> submaps;
};
Contains the local SLAM result: trajectory ID, timestamp, estimated pose in local map frame, range data transformed to local frame, and updated submaps.
Pure Virtual Methods¶
AddSensorData¶
virtual void AddSensorData(const std::string& sensor_id,
std::unique_ptr<Data> data) = 0;
Adds sensor data to the trajectory builder. The data is dispatched based on its type (rangefinder, IMU, odometry, etc.).
Sensor Data Types:
sensor::RangeData— Lidar/scan data (origin, returns, misses)sensor::ImuData— IMU measurements (linear acceleration, angular velocity)sensor::OdometryData— Odometry posesensor::FixedFramePoseData— Pose in a fixed frame (e.g., GPS)sensor::LandmarkData— Landmark observations
AddLocalSlamResultData¶
virtual void AddLocalSlamResultData(
std::unique_ptr<LocalSlamResultData> local_slam_result_data) = 0;
Used for deserialization: injects pre-computed local SLAM results.
2D Implementation: LocalTrajectoryBuilder2D¶
Located in internal/2d/local_trajectory_builder_2d.h/.cc.
Configuration (TrajectoryBuilderOptions2D)¶
Key parameters (from trajectory_builder_2d.lua):
Parameter |
Description |
|---|---|
|
Fuse IMU data for pose extrapolation |
|
Rangefinder min/max range (meters) |
|
Voxel filter for point cloud downsampling |
|
Adaptive filter for variable density scans |
|
Correlative scan matching config |
|
Ceres-based scan matching config |
|
Throttles sensor data insertion |
|
Submap configuration (count, resolution, inserter) |
|
Pose extrapolation (constant velocity or IMU-based) |
Algorithm Flow¶
Sensor Data Reception — Data arrives via
AddSensorData, collated by sensor typeRange Data Processing — Accumulates
num_accumulated_range_datascans, applies voxel filteringScan Matching — Matches current scan against local submap:
Real-time correlative scan matcher (coarse)
Ceres scan matcher (fine, gradient-based optimization)
Submap Insertion — Inserts matched range data into current submap
Submap Creation — Creates new submap after
num_range_datainsertionsPose Extrapolation — Predicts pose between sensor updates using IMU or constant velocity model
3D Implementation: LocalTrajectoryBuilder3D¶
Located in internal/3d/local_trajectory_builder_3d.h/.cc.
Configuration (TrajectoryBuilderOptions3D)¶
Key parameters (from trajectory_builder_3d.lua):
Parameter |
Description |
|---|---|
|
Range limits |
|
Initial voxel filter |
|
For local scan matching |
|
For loop closure |
|
3D correlative matching |
|
3D Ceres matching (supports intensity) |
|
Data throttling |
|
For rotational scan matching |
|
Hybrid grid submaps (high/low resolution) |
|
Enable intensity-based matching |
Algorithm Flow¶
Similar to 2D but with 3D-specific components:
Point Cloud Accumulation — Accumulates multiple scans for denser point clouds
Voxel Filtering — Multi-resolution filtering (high-res for local, low-res for global)
Scan Matching — 3D Ceres with optional intensity cost function
Hybrid Grid Submaps — High-res (near) + low-res (far) voxel grids
Rotational Scan Matcher — Optional rotation-only optimization
Usage¶
// Typically created via MapBuilder::AddTrajectoryBuilder
auto* traj_builder = map_builder->GetTrajectoryBuilder(traj_id);
// Add rangefinder data
auto range_data = sensor::RangeData{origin, returns, misses};
auto dispatchable = sensor::MakeDispatchable("laser", time, range_data);
traj_builder->AddSensorData("laser", std::move(dispatchable));
// Add IMU data
auto imu_data = sensor::ImuData{time, linear_acceleration, angular_velocity};
traj_builder->AddSensorData("imu", sensor::MakeDispatchable("imu", time, imu_data));
See Also¶
MapBuilder — Creates trajectory builders
Submaps — Submap representation