Ekumen-OS/beluga

A general implementation of Monte Carlo Localization (MCL) algorithms written in C++17, and a ROS package that can be used in ROS 2.

Beluga – Monte Carlo Localization for Robots

What it is – Beluga is a C++17 library that implements the Monte Carlo Localization (MCL) family of algorithms, the core technique many mobile‑robot navigation stacks use to estimate a robot’s pose on a map. The code is written to be ROS‑agnostic, but the repo also ships ROS‑specific wrappers so you can drop a Beluga node straight into a ROS‑based robot stack.

Key pieces

Package Role
beluga Core, ROS‑independent particle‑filter library.
beluga_ros Thin glue layer that translates ROS messages/services to the core library.
beluga_amcl Ready‑to‑run ROS node/component that mimics the behaviour of the classic nav2_amcl/amcl node, but uses Beluga under the hood.
beluga_example Launch files and tiny demo programs showing how to start the AMCL node on a TurtleBot 2 or an Andino robot.
beluga_system_tests Integration‑test suite that spins up full ROS systems to verify correctness.
beluye_vdb Optional extension that plugs OpenVDB into Beluga, enabling 3‑D voxel‑based localization.

Why it matters – Traditional AMCL implementations are tightly coupled to ROS and can be hard to extend. Beluga’s design separates the algorithmic core from any middleware, making it easier to:

  • swap in custom motion or sensor models,
  • reuse the library in non‑ROS projects (e.g., simulation, embedded systems),
  • run automated benchmarks without pulling in a full ROS stack.

How you’d use it

  1. Add the library – Pull the beluga package into your CMake/colcon or Bazel workspace.
  2. Pick a wrapper – If you’re already on ROS 1/2, depend on beluga_ros or beluga_amcl to get a node that publishes /tf and subscribes to laser scans, odometry, etc.
  3. Configure – The node reads the same parameters as the standard amcl (map, particle count, resampling thresholds, etc.), so you can drop it into an existing Nav2 launch with minimal changes.
  4. Extend – Implement a custom motion model or sensor model by inheriting the abstract interfaces in beluga; the rest of the particle filter stays the same.
  5. Benchmark – Use the built‑in benchmark scripts to compare different configurations (particle numbers, resampling strategies) and guard against regressions.

Target audience – Robotics developers who need a reliable, well‑tested particle‑filter localisation engine, especially those who want a clean separation between algorithmic code and ROS middleware, or who are building localisation for custom hardware (e.g., Raspberry Pi‑based robots).

Documentation & community – Full API docs are hosted at https://ekumen-os.github.io/beluga, CI badges show continuous testing on both Colcon and Bazel, and the project follows an Apache‑2.0 license, encouraging commercial and academic use.


Beluga is not a machine‑learning model; it is a classic probabilistic robotics algorithm, but it sits squarely in the robotics/embodied‑intelligence space.

Related

  • Project
  • Project
  • Project
  • Project
  • Project