Skip to main content

Pelorus - High Efficient Lidar Inertial Odometry

Project description

Pelorus Python Bindings

Python bindings for Pelorus - a LiDAR-Inertial Odometry system.

Installation

From source (requires Rust toolchain)

cd pelorus_py
pip install maturin
maturin develop --release

Or build a wheel:

maturin build --release
pip install target/wheels/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/list 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]
# For numpy/list inputs, you must also provide the scan header timestamp:
# lio.add_pointcloud(points_np, timestamp_sec=..., timestamp_nanosec=...)

# Try to receive odometry (non-blocking)
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"Points: {len(odom['points'])}")

# Or block until odometry is available
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_odom(...): Add an odometry measurement
  • add_pointcloud(cloud_dict): Add a point cloud (PointCloud2 format)
  • add_pointcloud(cloud_np, timestamp_sec=..., timestamp_nanosec=...): Add a point cloud from numpy
  • 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).

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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pelorus-0.0.5-cp38-abi3-musllinux_1_2_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ x86-64

pelorus-0.0.5-cp38-abi3-musllinux_1_2_armv7l.whl (1.5 MB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ ARMv7l

pelorus-0.0.5-cp38-abi3-musllinux_1_2_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ ARM64

pelorus-0.0.5-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ x86-64

pelorus-0.0.5-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

pelorus-0.0.5-cp38-abi3-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

File details

Details for the file pelorus-0.0.5-cp38-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pelorus-0.0.5-cp38-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d8bf36f91bdca86f841983fae612bdebe703978d538e3ca2dda49fb8c3e1fa63
MD5 c1378337fc2bc039059d5f10df074285
BLAKE2b-256 4a38d1aebf93b968e6852e8eb8f8721236f8f0a11ce14efad90b741b95014cfb

See more details on using hashes here.

File details

Details for the file pelorus-0.0.5-cp38-abi3-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for pelorus-0.0.5-cp38-abi3-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 0242eafc0ece3debd1f8377b8df4a33807eb25bd5ee4d0912bc6d094376b8861
MD5 20d10dd1894c69bde6f94509decead33
BLAKE2b-256 d36f7024145834cfff8bf101f91578d4cf5c8f41a97ad23431d224cacc405c96

See more details on using hashes here.

File details

Details for the file pelorus-0.0.5-cp38-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pelorus-0.0.5-cp38-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 c0ea7e0dd079c1a687853abd7aa712e4e349c63bb245c50e678e6581f9c6815c
MD5 d5f63a32b27f42f4b195433fc789f9b2
BLAKE2b-256 2968b4e358d9f4a87970c173a792006fbfae0cf38f23bacc32c166e271b114f3

See more details on using hashes here.

File details

Details for the file pelorus-0.0.5-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pelorus-0.0.5-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6ce90266cd2d76b865dcececf26c75a1c8d4858c5b6eaa7f4c784235a7424ee3
MD5 ef66297249706b7aa42f6078c96d2a95
BLAKE2b-256 727309418ce04f5f4b89aead0bf7537bd2f577b919ce4e726622957cb3cb9cc2

See more details on using hashes here.

File details

Details for the file pelorus-0.0.5-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pelorus-0.0.5-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9520c4cb1a705d6a7d48dad60020adfc25237cb11a384efd0ed0bd239b86a525
MD5 cd4e5634f739849057dc7bd317eff036
BLAKE2b-256 b17a8cf1441c401d50db7c7b8557f5ce70bc247bade14e1578c148b3b51fd776

See more details on using hashes here.

File details

Details for the file pelorus-0.0.5-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pelorus-0.0.5-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 89890abf0b433b27e14a2c3593d4de4b4dd0ece2795742650bd2ece593f2de10
MD5 790025e9e9eceab4089567d07cda18e4
BLAKE2b-256 bd3d695c4a4fafbee275e190fa820b5ed1f1fecc512c16b50a90f0455db853a0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page