# cartographer/sensor/landmark_data.h ## Overview `LandmarkData` carries observations of fixed landmarks (visual fiducials, AprilTags, or similar) observed in the tracking frame. Each observation relates a named landmark to the robot pose with confidence weights, enabling the global optimization to anchor the map to real-world landmarks. ## Structs ### LandmarkObservation ```cpp struct LandmarkObservation { std::string id; transform::Rigid3d landmark_to_tracking_transform; double translation_weight; double rotation_weight; }; ``` - `id` — Name of the observed landmark. - `landmark_to_tracking_transform` — Estimated pose of the landmark in the tracking frame at observation time. - `translation_weight` — Confidence of the translational part of the observation. - `rotation_weight` — Confidence of the rotational part of the observation. ### LandmarkData ```cpp struct LandmarkData { common::Time time; std::vector landmark_observations; }; ``` ## Serialization ```cpp proto::LandmarkData ToProto(const LandmarkData& landmark_data); LandmarkData FromProto(const proto::LandmarkData& proto); ``` `proto::LandmarkData` (defined in `sensor/proto/sensor.proto`) stores the timestamp and repeated observations: ```protobuf message LandmarkData { int64 timestamp = 1; repeated LandmarkObservation landmark_observations = 2; } ``` ## Usage ```cpp sensor::LandmarkObservation observation{ "landmark_1", landmark_to_tracking, translation_weight, rotation_weight}; sensor::LandmarkData landmark_data{time, {observation}}; trajectory_builder->AddLandmarkData(sensor_id, landmark_data); ``` ## Role in the SLAM Pipeline - **Trajectory builder interface** — `AddLandmarkData` accepts landmark observations. - **Optimization** — The pose graph accumulates `LandmarkNode`s (a landmark's global pose estimate and per-trajectory observations). During `OptimizationProblemInterface::Solve`, landmark data is used to jointly optimize the global poses of landmarks and nodes, with the weights controlling how strongly each observation pulls the solution. - **Serialization** — landmark data is stored per-trajectory in the serialization format via `proto::LandmarkData` in `serialization.proto`; optimized landmark poses are stored in the pose graph (`proto::PoseGraph::LandmarkPose`). ## See Also - [Data](data.md) — Base class and `Dispatchable` wrapping - [FixedFramePoseData](fixed_frame_pose_data.md) — Alternative absolute reference (GPS-style) - [OptimizationProblemInterface](../mapping/internal/optimization/optimization_problem_interface.md) — Consumes landmark observations - [PoseGraphInterface](../mapping/pose_graph_interface.md) — Defines `LandmarkNode`