Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Python Bindings

miniROS provides Python bindings that exactly match ROS2 rclpy API for core features.

Drop-in ROS2 Replacement

Replace your ROS2 imports:

# Instead of:
# import rclpy
# from std_msgs.msg import String

# Use:
import mini_ros
from mini_ros import String

Everything else stays the same.

Quick Setup

pip install maturin
maturin develop --features python

Core API

Node & Lifecycle

import mini_ros

# Initialize (like rclpy.init())
mini_ros.init()

# Create node
node = mini_ros.Node('my_node')

# Spin (like rclpy.spin())
mini_ros.spin(node)

# Cleanup (like rclpy.shutdown())
node.destroy_node()
mini_ros.shutdown()

Publisher/Subscriber

# Publisher (identical to rclpy)
pub = node.create_publisher(mini_ros.String, '/topic', 10)

msg = mini_ros.String()
msg.data = 'Hello!'
pub.publish(msg)

# Subscriber (identical to rclpy)
def callback(msg):
    print(f'Received: {msg.data}')

sub = node.create_subscription(
    mini_ros.String, '/topic', callback, 10
)

Services

# Service server
def add_callback(request, response):
    response.sum = request.a + request.b
    return response

srv = node.create_service(mini_ros.AddTwoInts, '/add', add_callback)

# Service client
client = node.create_client(mini_ros.AddTwoInts, '/add')
request = mini_ros.AddTwoInts.Request()
request.a = 2
request.b = 3

future = client.call_async(request)
response = future.result()  # Sum: 5

Message Types

# Built-in types (like std_msgs)
mini_ros.String()
mini_ros.Int32()  
mini_ros.Float64()
mini_ros.Bool()

# Access data fields
msg = mini_ros.String()
msg.data = "hello"

Migration from ROS2

✅ Compatible (no changes needed)

  • Node creation and management
  • Publisher/subscriber patterns
  • Service client/server
  • Basic message types
  • Spin and lifecycle

🚧 Optional Features

# Enable as needed
import mini_ros.actions      # Action client/server
import mini_ros.parameters   # Parameter client/server  
import mini_ros.visualization # 3D visualization

❌ Not Implemented

  • Custom message definitions
  • Advanced QoS policies
  • Timers and callbacks
  • Transformations (tf2)

Examples

Minimal Publisher

import mini_ros

mini_ros.init()
node = mini_ros.Node('publisher')
pub = node.create_publisher(mini_ros.String, '/chat', 10)

msg = mini_ros.String()
msg.data = 'Hello miniROS!'
pub.publish(msg)

node.destroy_node()
mini_ros.shutdown()

Minimal Subscriber

import mini_ros

def callback(msg):
    print(f'Got: {msg.data}')

mini_ros.init()
node = mini_ros.Node('subscriber')
sub = node.create_subscription(mini_ros.String, '/chat', callback, 10)
mini_ros.spin(node)

Performance Benefits

vs ROS2 rclpy

  • 10x faster startup - No ROS2 middleware overhead
  • Lower latency - Direct Rust backend
  • Less memory - Minimal runtime footprint
  • Simpler deployment - Single binary, no ROS2 installation

Memory Usage

ROS2 node:     ~50MB
miniROS node:  ~5MB

When to Use

✅ Perfect for:

  • ROS2 migration - Gradual transition
  • Simple applications - Pub/sub + services
  • Performance critical - Embedded systems
  • Learning - Clean API, no complexity

❌ Stick with ROS2 for:

  • Custom messages - Complex message definitions
  • Advanced features - QoS, security, lifecycle
  • Large ecosystems - Navigation, perception stacks

Roadmap

  • Custom message support
  • Timer and callback system
  • Advanced QoS options
  • More std_msgs types

miniROS Python: All the power, none of the complexity