# agentic-robotics-rt
[](https://crates.io/crates/agentic-robotics-rt)
[](https://docs.rs/agentic-robotics-rt)
[](../../LICENSE)
**Real-time executor with priority scheduling for Agentic Robotics**
Part of the [Agentic Robotics](https://github.com/ruvnet/vibecast) framework - high-performance robotics middleware with ROS2 compatibility.
## Features
- โฑ๏ธ **Deterministic scheduling**: Priority-based task execution with deadlines
- ๐ **Dual runtime architecture**: Separate thread pools for high/low priority tasks
- ๐ **Latency tracking**: HDR histogram for microsecond-precision measurements
- ๐ฏ **Priority isolation**: High-priority tasks never blocked by low-priority work
- โก **Microsecond deadlines**: Schedule tasks with < 1ms deadlines
- ๐ฆ **Rust async/await**: Full integration with Tokio ecosystem
## Installation
Add to your `Cargo.toml`:
```toml
[dependencies]
agentic-robotics-core = "0.1.0"
agentic-robotics-rt = "0.1.0"
tokio = { version = "1", features = ["full"] }
```
## Quick Start
### Basic Priority Scheduling
```rust
use agentic_robotics_rt::{Executor, Priority, Deadline};
use std::time::Duration;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// Create executor with dual runtime
let executor = Executor::new()?;
// High-priority 1kHz control loop
executor.spawn_rt(
Priority::High,
Deadline::from_hz(1000), // 1ms deadline
async {
loop {
// Read sensors, compute control, write actuators
control_robot().await;
tokio::time::sleep(Duration::from_micros(1000)).await;
}
}
)?;
// Low-priority logging (won't interfere with control loop)
executor.spawn_rt(
Priority::Low,
Deadline::from_hz(10), // 100ms deadline
async {
loop {
log_telemetry().await;
tokio::time::sleep(Duration::from_millis(100)).await;
}
}
)?;
executor.run().await?;
Ok(())
}
```
### Deadline Enforcement
```rust
use agentic_robotics_rt::{Executor, Priority, Deadline};
use std::time::Duration;
let executor = Executor::new()?;
// Critical task must complete within 500ยตs
executor.spawn_rt(
Priority::High,
Deadline(Duration::from_micros(500)),
async {
// If this takes longer than 500ยตs, deadline missed warning
critical_computation().await;
}
)?;
```
### Latency Monitoring
```rust
use agentic_robotics_rt::LatencyTracker;
let tracker = LatencyTracker::new();
let start = std::time::Instant::now();
process_message().await;
tracker.record(start.elapsed());
// Get statistics
println!("p50: {} ยตs", tracker.percentile(0.50) / 1000);
println!("p95: {} ยตs", tracker.percentile(0.95) / 1000);
println!("p99: {} ยตs", tracker.percentile(0.99) / 1000);
println!("p99.9: {} ยตs", tracker.percentile(0.999) / 1000);
```
## Architecture
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ agentic-robotics-rt (Executor) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Task Scheduler โ โ
โ โ โข Priority queue โ โ
โ โ โข Deadline tracking โ โ
โ โ โข Work stealing โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโดโโโโโโโโโโ โ
โ โ โ โ
โ โโโโโผโโโโโโโ โโโโโโโโผโโโโ โ
โ โ High-Pri โ โ Low-Pri โ โ
โ โ Runtime โ โ Runtime โ โ
โ โ (2 thr) โ โ (4 thr) โ โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโ โ
โ โ โ โ
โ โโโโโผโโโโโโโโโโโโโโโโโโโโผโโโโ โ
โ โ Tokio Async Runtime โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
```
## Priority Levels
The executor supports multiple priority levels:
```rust
pub enum Priority {
Critical, // Real-time critical (< 100ยตs deadlines)
High, // High priority (< 1ms deadlines)
Medium, // Medium priority (< 10ms deadlines)
Low, // Low priority (> 10ms deadlines)
Background,// Background tasks (no deadline)
}
```
### Priority Assignment Guidelines
| **Critical** | Safety-critical control | Emergency stop, collision avoidance | < 100 ยตs |
| **High** | Real-time control | PID control, motor commands | < 1 ms |
| **Medium** | Sensor processing | Image processing, point cloud filtering | < 10 ms |
| **Low** | Perception | Object detection, SLAM | < 100 ms |
| **Background** | Logging, telemetry | File I/O, network sync | No deadline |
## Deadline Specification
Multiple ways to specify deadlines:
```rust
use std::time::Duration;
use agentic_robotics_rt::Deadline;
// Direct duration
let d1 = Deadline(Duration::from_micros(500));
// From frequency (Hz)
let d2 = Deadline::from_hz(1000); // 1 kHz = 1ms deadline
// From milliseconds
let d3 = Deadline::from_millis(10);
// From microseconds
let d4 = Deadline::from_micros(100);
```
## Real-Time Control Example
```rust
use agentic_robotics_core::Node;
use agentic_robotics_rt::{Executor, Priority, Deadline};
use std::time::Duration;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let mut node = Node::new("robot_controller")?;
let executor = Executor::new()?;
// Subscribe to sensor data
let sensor_sub = node.subscribe::<JointState>("/joint_states")?;
// Publish control commands
let cmd_pub = node.publish::<JointCommand>("/joint_commands")?;
// High-priority 1kHz control loop
executor.spawn_rt(
Priority::High,
Deadline::from_hz(1000),
async move {
loop {
// Read latest sensor data (non-blocking)
if let Some(state) = sensor_sub.try_recv() {
// Compute control law
let cmd = compute_control(&state);
// Send command
cmd_pub.publish(&cmd).await.ok();
}
// 1kHz loop
tokio::time::sleep(Duration::from_micros(1000)).await;
}
}
)?;
// Low-priority telemetry
executor.spawn_rt(
Priority::Low,
Deadline::from_hz(10),
async move {
loop {
log_robot_state().await;
tokio::time::sleep(Duration::from_millis(100)).await;
}
}
)?;
executor.run().await?;
Ok(())
}
```
## Performance
Real measurements on production hardware:
| **Task spawn overhead** | ~2 ยตs |
| **Priority switch latency** | < 5 ยตs |
| **Deadline jitter** | < 10 ยตs (p99.9) |
| **Throughput** | > 100k tasks/sec |
### Latency Distribution
Measured latencies for 1kHz control loop:
```
p50: 800 ยตs โ
Excellent
p95: 950 ยตs โ
Good
p99: 990 ยตs โ
Acceptable
p99.9: 999 ยตs โ
Within deadline
```
## Advanced Features
### Custom Thread Pools
Configure thread pool sizes:
```rust
use agentic_robotics_rt::{Executor, RuntimeConfig};
let config = RuntimeConfig {
high_priority_threads: 4, // 4 threads for high-priority
low_priority_threads: 8, // 8 threads for low-priority
};
let executor = Executor::with_config(config)?;
```
### CPU Affinity
Pin high-priority threads to specific cores:
```rust
use agentic_robotics_rt::{Executor, CpuAffinity};
let executor = Executor::new()?;
// Pin high-priority runtime to cores 0-1
executor.set_cpu_affinity(
Priority::High,
CpuAffinity::Cores(vec![0, 1])
)?;
// Pin low-priority runtime to cores 2-7
executor.set_cpu_affinity(
Priority::Low,
CpuAffinity::Cores(vec![2, 3, 4, 5, 6, 7])
)?;
```
### Deadline Miss Handling
Handle deadline misses gracefully:
```rust
use agentic_robotics_rt::{Executor, DeadlinePolicy};
let executor = Executor::new()?;
executor.set_deadline_policy(DeadlinePolicy::Warn)?; // Log warning
// or
executor.set_deadline_policy(DeadlinePolicy::Panic)?; // Panic on miss
// or
}))?;
```
## Testing
```bash
# Run unit tests
cargo test --package agentic-robotics-rt
# Run real-time latency tests
cargo test --package agentic-robotics-rt --test latency -- --nocapture
# Run with logging
RUST_LOG=debug cargo test --package agentic-robotics-rt
```
## Benchmarks
```bash
cargo bench --package agentic-robotics-rt --bench latency
```
Expected results:
```
task_spawn_overhead time: [1.8 ยตs 2.0 ยตs 2.2 ยตs]
priority_switch time: [4.2 ยตs 4.5 ยตs 4.8 ยตs]
deadline_tracking time: [120 ns 125 ns 130 ns]
```
## Platform Support
| **Linux** | โ
Full support | SCHED_FIFO available with CAP_SYS_NICE |
| **macOS** | โ
Supported | Thread priorities via pthread |
| **Windows** | โ
Supported | SetThreadPriority API |
| **Embedded** | โณ Planned | RTIC integration coming soon |
## Real-Time Tips
### Best Practices
1. **Avoid allocations in hot path**: Pre-allocate buffers
2. **Use try_recv() for non-blocking**: Don't block high-priority tasks
3. **Keep critical sections short**: < 100ยตs per iteration
4. **Profile regularly**: Use latency tracking to find bottlenecks
### Common Pitfalls
โ **Don't** do file I/O in high-priority tasks
โ **Don't** use mutex locks in critical paths
โ **Don't** allocate memory in control loops
โ **Don't** make network calls in high-priority tasks
โ
**Do** pre-allocate buffers
โ
**Do** use lock-free channels
โ
**Do** offload heavy work to low-priority tasks
โ
**Do** profile and measure latencies
## License
Licensed under either of:
- Apache License, Version 2.0 ([LICENSE-APACHE](../../LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
- MIT License ([LICENSE-MIT](../../LICENSE-MIT) or http://opensource.org/licenses/MIT)
at your option.
## Links
- **Homepage**: [ruv.io](https://ruv.io)
- **Documentation**: [docs.rs/agentic-robotics-rt](https://docs.rs/agentic-robotics-rt)
- **Repository**: [github.com/ruvnet/vibecast](https://github.com/ruvnet/vibecast)
- **Performance Report**: [PERFORMANCE_REPORT.md](../../PERFORMANCE_REPORT.md)
---
**Part of the Agentic Robotics framework** โข Built with โค๏ธ by the Agentic Robotics Team