Skip to main content

Pelorus Python Bindings

Python bindings for Pelorus, a resource-aware Lidar-Inertial Odometry.

Installation

From source (requires Rust toolchain)

cd pelorus_py
pip install maturin
maturin develop --release

Select at most one GPU backend when building:

maturin develop --release --features cuda
maturin develop --release --features vulkan
maturin develop --release --features metal

Metal is available on macOS. CUDA requires a supported NVIDIA CUDA installation. Vulkan requires a compatible device and driver. The default features enable Rayon CPU parallelism and include processing_time_ns in odometry results. Additional features are no-imu-sync and large-processing-queue. The legacy downsample feature is retained for compatibility but does not control the current configuration-based downsampling.

Or build a wheel:

maturin build --release --out dist
pip install dist/pelorus-*.whl

Usage

Basic API

import pelorus
import numpy as np

# Create Pelorus instance
lio = pelorus.Handle() # Uses embedded default config

# Or with custom config:
# lio = pelorus.Handle("path/to/config.rl")
#
# If you want to control PointCloud2 parsing (like `pelorus_create_with_options` in C):
# - device_specific_pointcloud2=True  (default)
# - device_specific_pointcloud2=False (generic parsing path)
# lio = pelorus.Handle("path/to/config.rl", device_specific_pointcloud2=False)

# Add IMU data
lio.add_imu(
    timestamp_sec=1000,
    timestamp_nanosec=0,
    orientation=[1.0, 0.0, 0.0, 0.0],  # w, x, y, z
    orientation_covariance=[0.01] + [0.0]*8,
    angular_velocity=[0.0, 0.0, 0.0],
    angular_velocity_covariance=[0.001] + [0.0]*8,
    linear_acceleration=[0.0, 0.0, 9.81],
    linear_acceleration_covariance=[0.01] + [0.0]*8,
)

# Add point cloud (recommended):
# - If you already have ROS2 messages, pass them directly:
#   lio.add_pointcloud2_ros(cloud_msg)
#
# - For non-ROS point sources, use NumPy/sequence inputs:
# - Nx3: [x,y,z] (no per-point timing)
# - Nx4: [x,y,z,t] where t is uint32 nanosecond offset
# - Nx5: [x,y,z,intensity,t]
# NumPy arrays may use float32 or float64. Inputs must be non-empty. The t value
# must be finite and in the uint32 range; fractional values are rounded to the
# nearest nanosecond. The scan header timestamp is required:
points = np.array([[1.0, 2.0, 3.0, 0.0]], dtype=np.float32)
scan_id = lio.add_pointcloud(
    points,
    timestamp_sec=1000,
    timestamp_nanosec=0,
)

# After feeding enough synchronized IMU and Lidar data, receive odometry:
odom = lio.try_recv()
if odom:
    print(f"Position: {odom['position']}")
    print(f"Orientation: {odom['orientation']}")
    print(f"Linear velocity: {odom['linear_velocity']}")
    print(f"Accelerometer bias: {odom['accel_bias']}")
    print(f"Gyroscope bias: {odom['gyro_bias']}")
    print(f"Points: {len(odom['points'])}")

# Or block until the next odometry result is available. Do this only while
# another producer is feeding data or when an output is expected.
# odom = lio.recv()


# Or receive odometry asynchronously via callback (like pelorus_c)
def on_odom(odom: dict) -> None:
    print("Odom:", odom["timestamp_sec"], odom["timestamp_nanosec"], odom["position"])

lio.set_callback(on_odom)
# ... feed IMU / pointclouds ...
lio.clear_callback()  # equivalent to lio.set_callback(None)

Using with MCAP Bagfiles

See examples/bagfile_example.py for a complete example using real sensor data from an MCAP bagfile.

python -m pip install mcap mcap-ros2-support

API Reference

Handle

Main interface to the Pelorus system.

Constructor

  • Handle(config_path: str | None = None, device_specific_pointcloud2: bool = True): Create a new Pelorus instance

    device_specific_pointcloud2=False selects the generic parsing path for PointCloud2 inputs.

Methods

  • add_imu(...): Add an IMU measurement
  • add_imu_ros(imu_msg): Add a ROS2 sensor_msgs/msg/Imu object directly
  • add_odom(...): Add an odometry measurement
  • add_odom_ros(odom_msg): Add a ROS2 nav_msgs/msg/Odometry object directly
  • add_pointcloud(cloud_dict): Add a point cloud (PointCloud2 format)
  • add_pointcloud(cloud_np, timestamp_sec=..., timestamp_nanosec=...): Add a point cloud from a non-empty float32/float64 NumPy array
  • add_pointcloud(cloud_sequence, timestamp_sec=..., timestamp_nanosec=...): Add a point cloud from lists, tuples, or other Python sequences
  • add_pointcloud2_ros(cloud_msg): Add a ROS2 sensor_msgs/msg/PointCloud2 message directly
  • try_recv(): Try to receive odometry (non-blocking), returns None if no data
  • recv(): Receive odometry (blocks until available)
  • set_callback(callback): Deliver odometry via callback from a background thread. Disables try_recv()/recv() queuing while enabled
  • clear_callback(): Disable callback delivery (equivalent to set_callback(None))
  • version(): Get library version (static method)

Timestamp semantics

Pelorus uses two timestamp levels:

  1. IMU/Odom timestamps (timestamp_sec + timestamp_nanosec)

    • Absolute timestamps (typically epoch / ROS time) used for synchronization.
  2. Lidar timestamps

    • Scan header timestamp: absolute (sec/nanosec)
    • Per-point t field (if provided): uint32 nanoseconds offset, non-negative and forward in time relative to the scan header time.

The effective point time is:

point_time_abs = header_time_abs + (t * 1e-9)

Odometry outputs include timestamp_sec/timestamp_nanosec (and timestamp as float for convenience), scan_id, pose/twist data and covariances, accel_bias and gyro_bias in the IMU frame, a points NumPy array, and frame_id. Builds using the default processing-time-export feature also include processing_time_ns.

Development

# Install development dependencies
pip install maturin pytest black ruff

# Build and test
maturin develop
pytest

# Format code
black .
ruff check .

License

Dual-licensed under MIT or Apache-2.0, consistent with the Pelorus project.

Metadata

Release files for pelorus 0.0.9

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pelorus 0.0.9
File Size Uploaded Provenance Actions
pelorus-0.0.9.tar.gz 424.7 kB Without provenance Details for pelorus-0.0.9.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for pelorus 0.0.9
File Actions
pelorus-0.0.9-cp38-abi3-musllinux_1_2_x86_64.whl CPython 3.8 abi3 Linux musl 1.2+ x86-64 Details for pelorus-0.0.9-cp38-abi3-musllinux_1_2_x86_64.whl
pelorus-0.0.9-cp38-abi3-musllinux_1_2_armv7l.whl CPython 3.8 abi3 Linux musl 1.2+ ARMv7l Details for pelorus-0.0.9-cp38-abi3-musllinux_1_2_armv7l.whl
pelorus-0.0.9-cp38-abi3-musllinux_1_2_aarch64.whl CPython 3.8 abi3 Linux musl 1.2+ ARM64 Details for pelorus-0.0.9-cp38-abi3-musllinux_1_2_aarch64.whl
pelorus-0.0.9-cp38-abi3-manylinux_2_34_aarch64.whl CPython 3.8 abi3 Linux glibc 2.34+ ARM64 Details for pelorus-0.0.9-cp38-abi3-manylinux_2_34_aarch64.whl
pelorus-0.0.9-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.8 abi3 Linux glibc 2.17+ x86-64 Details for pelorus-0.0.9-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
pelorus-0.0.9-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl CPython 3.8 abi3 Linux glibc 2.17+ ARMv7l Details for pelorus-0.0.9-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
pelorus-0.0.9-cp38-abi3-macosx_11_0_arm64.whl CPython 3.8 abi3 macOS 11.0+ ARM64 Details for pelorus-0.0.9-cp38-abi3-macosx_11_0_arm64.whl

Total release size: 23.3 MB

Release files / pelorus-0.0.9.tar.gz

Download URL pelorus-0.0.9.tar.gz
Size 424.7 kB
Tags Source
SHA-256 checksum
How to use checksums
1a20a62ed396159d9bd54d4ff379361bae44d735cf5ad043334f79885552e7d6
BLAKE2b-256 checksum
How to use checksums
948809f5eac3a58890cba384dd6f9d0c4c9ca249e27d7a6e1685c5d49b2e636d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Release files / pelorus-0.0.9-cp38-abi3-musllinux_1_2_x86_64.whl

Download URL pelorus-0.0.9-cp38-abi3-musllinux_1_2_x86_64.whl
Size 3.8 MB
Tags CPython 3.8 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
cbbd7343da347efbfd20a2de9e9a8fc8ff114234dcbdaea85c68eb9e4236ebbf
BLAKE2b-256 checksum
How to use checksums
6ab679add23df111fca43afcf32ded396c87bc9f1cd3c2e0ca65afbc5818ff4f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Release files / pelorus-0.0.9-cp38-abi3-musllinux_1_2_armv7l.whl

Download URL pelorus-0.0.9-cp38-abi3-musllinux_1_2_armv7l.whl
Size 2.8 MB
Tags CPython 3.8 Linux musl 1.2+ ARMv7l abi3
SHA-256 checksum
How to use checksums
8432c3c06242f2c7cbd5bddf6d28c4113abafa0bcf5dc058e474b2d97e58a179
BLAKE2b-256 checksum
How to use checksums
460b2d5dc653bfd6f273d5a27b61dd6702e51d08585df517f6a4b56894993789
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Release files / pelorus-0.0.9-cp38-abi3-musllinux_1_2_aarch64.whl

Download URL pelorus-0.0.9-cp38-abi3-musllinux_1_2_aarch64.whl
Size 3.3 MB
Tags CPython 3.8 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
aa094c78918767b1618dad82666f5deb45c95597f1e276308dab8aaa965accb3
BLAKE2b-256 checksum
How to use checksums
362da10de314321f8ceac90484a8527d779cd6e3344cddd47d0f16edc4cde341
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Release files / pelorus-0.0.9-cp38-abi3-manylinux_2_34_aarch64.whl

Download URL pelorus-0.0.9-cp38-abi3-manylinux_2_34_aarch64.whl
Size 3.2 MB
Tags CPython 3.8 Linux glibc 2.34+ ARM64 abi3
SHA-256 checksum
How to use checksums
a4ed6f731bff767eae861ced6c719320238a654ef715eec99c71f8f7696f3527
BLAKE2b-256 checksum
How to use checksums
61de781d95b62a97f9b924bb5f335043570b82b95fe884f108af7e515cf4aa5e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Release files / pelorus-0.0.9-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL pelorus-0.0.9-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 3.8 MB
Tags CPython 3.8 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
33fb271bbabfa637dd15a5e1c49bab39fb47b1259e588ceae20e464222001890
BLAKE2b-256 checksum
How to use checksums
a2fac1128c4db47c4b0401a1eecfdd087baa77cb63fea995518ba7e6601104e5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Release files / pelorus-0.0.9-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL pelorus-0.0.9-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 2.8 MB
Tags CPython 3.8 Linux glibc 2.17+ ARMv7l abi3
SHA-256 checksum
How to use checksums
7ae9ef110c7910775866154a009b77394c3695f1679fbf7aa77b53d3f06617f4
BLAKE2b-256 checksum
How to use checksums
f8d078697ff77fb353c83126fc079e77f69562b6520aa8b7946cded0f1dc7db1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Release files / pelorus-0.0.9-cp38-abi3-macosx_11_0_arm64.whl

Download URL pelorus-0.0.9-cp38-abi3-macosx_11_0_arm64.whl
Size 3.1 MB
Tags CPython 3.8 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
3956e489cda5a95dcfc4e80ca00235b8054a9bb9423d3b4c4a33068473cf6a5c
BLAKE2b-256 checksum
How to use checksums
c138879c7c23ef0f39393fc32a135baadd6358769cb6efeddd870bc513abc6ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Security for pelorus 0.0.9

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page