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