# cartographer/sensor/compressed_point_cloud.h ## Overview `CompressedPointCloud` provides lossy compression for point clouds using grid-based quantization. Reduces memory/storage for large 3D lidar scans. ## Class: `cartographer::sensor::CompressedPointCloud` ### Compression Algorithm 1. **Quantize** points to a 3D grid (configurable resolution) 2. **Deduplicate** points in same voxel 3. **Encode** as integer grid indices + residuals 4. **Store** as byte arrays ### Construction ```cpp explicit CompressedPointCloud(const PointCloud& point_cloud, float compression_ratio = 0.1f); ``` - `compression_ratio` — Target size ratio (0.1 = 10% of original) ### Decompression ```cpp PointCloud Decompress() const; ``` Returns approximate original point cloud. ### Serialization ```cpp proto::CompressedPointCloud ToProto() const; static CompressedPointCloud FromProto(const proto::CompressedPointCloud& proto); ``` ### Proto Format ```proto message CompressedPointCloud { int32 version = 1; float resolution = 2; repeated int32 cell_indices = 3; // Packed 3D indices repeated float residuals = 4; // Quantization residuals } ``` ## Usage ```cpp // Compress large point cloud sensor::PointCloud large_cloud = lidar->GetScan(); sensor::CompressedPointCloud compressed(large_cloud, 0.1f); // Store/transmit auto proto = compressed.ToProto(); SaveToFile(proto); // Decompress for processing sensor::PointCloud decompressed = compressed.Decompress(); ``` ## Configuration Compression ratio tradeoffs: - `0.05` — High compression, more loss - `0.1` — Balanced (default) - `0.2` — Lower compression, higher fidelity ## See Also - [PointCloud](point_cloud.md) — Uncompressed representation - [RangeData](range_data.md) — SLAM input format