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.7

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

Built distributions (wheels)

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

Total release size: 13.4 MB

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

Download URL pelorus-0.0.7-cp38-abi3-musllinux_1_2_x86_64.whl
Size 2.4 MB
Tags CPython 3.8 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
1fa766501d4222e570e0d6edca40eb5a3222d0ea2216afb49fef945e7837071b
BLAKE2b-256 checksum
How to use checksums
095e032bb5a2aace0773018667d24e975d8bfec3411ce17833fe6bba62a3f39e
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.7-cp38-abi3-musllinux_1_2_armv7l.whl

Download URL pelorus-0.0.7-cp38-abi3-musllinux_1_2_armv7l.whl
Size 1.7 MB
Tags CPython 3.8 Linux musl 1.2+ ARMv7l abi3
SHA-256 checksum
How to use checksums
d7b16232ded055a06a79db74850cde915f5422d172f5010171781bdfb30ed583
BLAKE2b-256 checksum
How to use checksums
8c1d51e60f29c5ddb98b748d8931dd99b059081797f037056b36f421bf10f76d
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.7-cp38-abi3-musllinux_1_2_aarch64.whl

Download URL pelorus-0.0.7-cp38-abi3-musllinux_1_2_aarch64.whl
Size 1.9 MB
Tags CPython 3.8 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
b117ac8734f9a4ead43f318fd3ab4c219c4079033427b6f21e1cbf74b677f301
BLAKE2b-256 checksum
How to use checksums
35c5566e0ea7ccf817fb3cdffb7896562dfc5e17fbadc64b23e37fbf35dee9aa
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.7-cp38-abi3-manylinux_2_34_aarch64.whl

Download URL pelorus-0.0.7-cp38-abi3-manylinux_2_34_aarch64.whl
Size 1.8 MB
Tags CPython 3.8 Linux glibc 2.34+ ARM64 abi3
SHA-256 checksum
How to use checksums
1f9833996655a88abcf717f502e16f195ca8ad8df44ff8c952340aa60e256768
BLAKE2b-256 checksum
How to use checksums
91c377256f29d73aca227ea0ea2e0aa71156dd75f7e5589467251bbe80bb8a42
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.7-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL pelorus-0.0.7-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 2.4 MB
Tags CPython 3.8 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
0e94b6ec62bde04ae2aa594bd4e49a1a17c8612c26468af5fa768a7fe87ce007
BLAKE2b-256 checksum
How to use checksums
1737d8825463ce8e7946c29c6b09aded334c414bcb67ab63385b0491f4786b73
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.7-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL pelorus-0.0.7-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 1.7 MB
Tags CPython 3.8 Linux glibc 2.17+ ARMv7l abi3
SHA-256 checksum
How to use checksums
bf2a898223c565315b147fc2106821860b8d2829b894c5ea66a16cef24d52a0e
BLAKE2b-256 checksum
How to use checksums
8023994981e24aa05c604231ecd374ed25ecd2646f37fdc02b49115d773b69a0
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.7-cp38-abi3-macosx_11_0_arm64.whl

Download URL pelorus-0.0.7-cp38-abi3-macosx_11_0_arm64.whl
Size 1.7 MB
Tags CPython 3.8 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
ca6d0b48ca5e6d2578f4bd95ab67f9c58a18e5586113e4118dcace17569b3e45
BLAKE2b-256 checksum
How to use checksums
0c4afebde0f5596b38d723055feaf30f6b457d51223700d622b37900c9b9b3b9
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.7

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