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

Benchmarks

Performance measurements and comparisons.

Performance Table

All measurements on AMD Ryzen 9 7950X, DDR5-5200, Ubuntu 24.04, Rust 1.75+ (release mode, -C target-cpu=native).

Core Operations

OperationRobotTimeNotes
FK (6-DOF)UR5e<1 usSingle end-effector pose
FK all links (6-DOF)UR5e~2 usAll link poses
FK (7-DOF)Panda~1.2 usSingle end-effector pose
Jacobian (6-DOF)UR5e~1.5 us6x6 matrix
Jacobian (7-DOF)Panda~2 us6x7 matrix
ManipulabilityUR5e~3 usSVD-based

Inverse Kinematics

SolverRobotTimeNotes
OPWUR5e<5 usAnalytical, closed-form
SubproblemUR5e<10 usAnalytical, up to 16 solutions
Subproblem7DOFPanda~50 usSweep + analytical
DLS (converge)UR5e100-300 us50-100 iterations typical
DLS (converge)Panda200-500 us7-DOF, more iterations
FABRIKUR5e50-150 usPosition-focused
Batch IK (100 targets)UR5e~500 usOPW, amortized

Collision Checking

OperationSpheresTimeNotes
Self-collision (coarse)~30<500 nsSIMD AVX2
Self-collision (fine)~120~2 usSIMD AVX2
Env collision (10 obstacles)~30~300 nsCAPT broadphase
Env collision (100 obstacles)~30~1 usCAPT broadphase
Env collision (1000 obstacles)~30~5 usCAPT broadphase

Motion Planning

PlannerRobotEnvironmentTimePath Quality
RRT-ConnectUR5eEmpty<100 usFeasible
RRT-ConnectUR5e10 obstacles5-50 msFeasible
RRT-ConnectPanda10 obstacles10-80 msFeasible
RRT*UR5e10 obstacles100-500 msNear-optimal
BiRRT*UR5e10 obstacles50-300 msNear-optimal
ESTUR5eNarrow passage20-100 msFeasible
CartesianUR5eEmpty<10 msExact path

Servo (Reactive Control)

OperationRobotTimeRate
Twist commandUR5e~50 us500 Hz capable
Joint jogUR5e~20 us500 Hz capable
Pose trackingPanda~100 us500 Hz capable

Trajectory Processing

OperationWaypointsTimeNotes
Trapezoidal50<100 usPer-joint limits
TOTP501-5 msTime-optimal
Jerk-limited50200-500 usS-curve profile
Cubic spline50<50 usInterpolation only
Validation50~20 usLimit checking

Comparison vs MoveIt2

Approximate comparisons based on published benchmarks and internal testing. MoveIt2 measurements from MoveIt2 documentation and community benchmarks.

OperationKineticMoveIt2Speedup
FK (6-DOF)<1 us~5 us~5x
IK (OPW, 6-DOF)<5 us~50 us (KDL)~10x
IK (DLS, 7-DOF)200-500 us500 us-2 ms (KDL)~2-4x
Collision check<500 ns~5 us (FCL)~10x
RRT-Connect (simple)<100 us1-10 ms~10-100x
Servo loop~50 us~200 us~4x

Speedups come from:

  • Rust vs C++ (memory safety without overhead)
  • SIMD collision (4-16x throughput per check)
  • Analytical IK solvers (OPW, Subproblem) vs iterative KDL
  • No ROS middleware overhead

How to Run Benchmarks

Prerequisites

# Install criterion (benchmark framework)
cargo install cargo-criterion  # optional, nicer output

# Build in release mode
cargo build --release

Running

# All benchmarks
cargo bench

# Specific benchmark group
cargo bench --bench fk_benchmarks
cargo bench --bench ik_benchmarks
cargo bench --bench collision_benchmarks
cargo bench --bench planning_benchmarks

# With HTML report
cargo bench --bench planning_benchmarks -- --output-format=bencher

# Filter by name
cargo bench -- "ur5e"

Results

Criterion generates HTML reports in target/criterion/. Open target/criterion/report/index.html for interactive charts.

Writing Custom Benchmarks

#![allow(unused)]
fn main() {
use criterion::{criterion_group, criterion_main, Criterion};

fn my_benchmark(c: &mut Criterion) {
    let robot = Robot::from_name("ur5e").unwrap();
    let chain = KinematicChain::extract(&robot, "base_link", "tool0").unwrap();
    let joints = vec![0.0, -1.0, 0.8, 0.0, 0.0, 0.0];

    c.bench_function("fk_ur5e", |b| {
        b.iter(|| forward_kinematics(&robot, &chain, &joints))
    });
}

criterion_group!(benches, my_benchmark);
criterion_main!(benches);
}

Reproducing Results

For reproducible benchmarks:

  1. Use --release builds with target-cpu=native
  2. Disable CPU frequency scaling: sudo cpupower frequency-set -g performance
  3. Close background applications
  4. Run each benchmark 3+ times and take the median
  5. Report CPU model, RAM speed, OS version, and Rust version