mapper_backend.h
C++ abstract interface for 3D mapper backends.
Location: sonar_3d_reconstruction/cpp/mapper_backend.h
Overview
IMapperBackend is an abstract interface that defines the common API for 3D occupancy mapping backends. It enables switching between In-Memory (RAM) and Out-of-Core (Disk) implementations without changing client code.
Key Features:
Unified API for RAM and Disk backends
IWLO (Intensity-Weighted Log-Odds) update support
Parameter configuration methods
Query and maintenance operations
Class: IMapperBackend
Purpose
Defines the common contract for:
IWLO batch updates
Parameter configuration (IWLO, intensity, adaptive)
Voxel queries
Resource management
Implementations
Implementation |
Backend Type |
Description |
|---|---|---|
|
In-Memory mapping for small maps |
|
|
Disk-based tile storage for large maps |
Required API
Core Update
batch_update_iwlo
virtual void batch_update_iwlo(
const Eigen::MatrixXd& points,
const Eigen::VectorXd& intensities,
const std::vector<bool>& is_occupied) = 0;
Main entry point for probability updates using IWLO algorithm.
Parameter |
Shape |
Description |
|---|---|---|
|
Nx3 |
Point coordinates (x, y, z) |
|
N |
Intensity values per point |
|
N |
Boolean flags (used for intensity threshold) |
Parameter Configuration
set_iwlo_params
virtual void set_iwlo_params(double sharpness, double decay_rate, double min_alpha,
double L_min, double L_max) = 0;
Parameter |
Default |
Description |
|---|---|---|
|
0.1 |
Sigmoid steepness for intensity-to-weight |
|
0.1 |
Learning rate decay rate |
|
0.3 |
Minimum learning rate |
|
-10.0 |
Saturation lower bound |
|
10.0 |
Saturation upper bound |
set_log_odds_params
virtual void set_log_odds_params(double log_odds_occupied, double log_odds_free) = 0;
Parameter |
Default |
Description |
|---|---|---|
|
3.5 |
Log-odds increment for occupied |
|
-3.0 |
Log-odds decrement for free |
set_intensity_params
virtual void set_intensity_params(double intensity_threshold, double intensity_max) = 0;
Parameter |
Default |
Description |
|---|---|---|
|
35.0 |
Minimum intensity to consider |
|
255.0 |
Maximum intensity value |
set_adaptive_params
virtual void set_adaptive_params(bool enabled, double threshold, double max_ratio) = 0;
Parameter |
Default |
Description |
|---|---|---|
|
true |
Enable adaptive updating |
|
0.5 |
Threshold for adaptive behavior |
|
0.3 |
Maximum update ratio |
set_occupied_threshold
virtual void set_occupied_threshold(double threshold) = 0;
Set probability threshold for occupied classification (default: 0.7).
Query API
get_occupied_voxels
virtual Eigen::MatrixXd get_occupied_voxels(double min_probability = 0.5) = 0;
Returns Nx4 matrix [x, y, z, probability] of voxels above threshold.
get_memory_usage
virtual MemoryStats get_memory_usage() const = 0;
Returns memory statistics.
get_resolution
virtual double get_resolution() const = 0;
Returns voxel resolution in meters.
get_num_nodes
virtual size_t get_num_nodes() const = 0;
Returns total number of nodes.
clear
virtual void clear() = 0;
Clear all data.
Optional API
These methods have default implementations (no-op or return 0/false).
flush
virtual void flush() {}
Flush data to persistent storage. RAM backend: no-op.
preload_region
virtual void preload_region(const Eigen::Vector3d& min_bound,
const Eigen::Vector3d& max_bound) {}
Preload tiles in a region into cache. RAM backend: no-op.
get_disk_usage
virtual size_t get_disk_usage() const { return 0; }
Get disk usage in bytes. RAM backend: returns 0.
prune
virtual size_t prune() { return 0; }
Prune tree to reduce memory. Returns nodes removed.
supports_persistence
virtual bool supports_persistence() const { return false; }
Check if backend supports persistent storage.
RAM backend:
falseDisk backend:
true
get_backend_type
virtual std::string get_backend_type() const = 0;
Get backend type name.
RAM backend:
"RAM"Disk backend:
"Disk"
Usage Example
#include "probability_updater.h"
#include "outofcore_tile_mapper.h"
// Choose backend based on map size
std::unique_ptr<IMapperBackend> backend;
if (use_large_map) {
backend = std::make_unique<OutofcoreTileMapper>("/path/to/tiles", 0.05, 10.0, 16);
} else {
backend = std::make_unique<ProbabilityUpdater>(0.05);
}
// Configure parameters (same API for both backends)
backend->set_iwlo_params(0.1, 0.1, 0.3, -10.0, 10.0);
backend->set_intensity_params(35.0, 255.0);
// Update with sonar data
Eigen::MatrixXd points(1000, 3);
Eigen::VectorXd intensities(1000);
std::vector<bool> is_occupied(1000);
// ... fill data ...
backend->batch_update_iwlo(points, intensities, is_occupied);
// Query results
auto occupied = backend->get_occupied_voxels(0.7);
// Optional: flush if using disk backend
if (backend->supports_persistence()) {
backend->flush();
}
std::cout << "Backend type: " << backend->get_backend_type() << std::endl;
Backend Comparison
Feature |
ProbabilityUpdater |
OutofcoreTileMapper |
|---|---|---|
Backend Type |
“RAM” |
“Disk” |
Storage |
RAM only |
Disk + RAM cache |
Map Size |
Limited by RAM |
Unlimited |
Speed |
Faster |
Slower (I/O) |
supports_persistence() |
false |
true |
flush() |
no-op |
saves tiles |
preload_region() |
no-op |
loads tiles |
get_disk_usage() |
0 |
actual usage |
Design Rationale
Why a common interface?
Enables runtime backend selection based on map size
Facilitates testing with mock implementations
Provides consistent API for Python bindings
Required vs Optional methods:
Required: Core functionality all backends must support
Optional: Persistence features only applicable to Disk backend