Batchplan: Plan batches of robot motions, use for execution or training data Natsuku Lab released batchplan 0.2, a Rust library for collision-aware robot motion planning that plans a typical problem in 0.17 ms on one CPU core, which the project says is faster than VAMP. The library runs inverse kinematics, trajectory optimization and distance grids on any GPU supported by wgpu (Vulkan, Metal or DX12) or on the CPU with the same results, and exports planned motions as LeRobot v3.0 datasets; two reBot arms hand blocks to each other over and around dividers in 512 scenes in 1.4–1.7 s on an M4 Pro or a Ryzen AI Max+ 395. batchplan requires stable Rust 1.90 or later (1.96 with the `usd` feature) and ships with the `gpu` feature on by default, while `lerobot` and `usd` are off by default. The fastest motion planning in the West. Quick start quick-start · Docs https://github.com/natsuku-lab/batchplan/blob/main/docs/README.md · API https://github.com/natsuku-lab/batchplan/blob/main/docs/api.md · Benchmarks https://github.com/natsuku-lab/batchplan/blob/main/docs/benchmarks.md · Examples https://github.com/natsuku-lab/batchplan/blob/main/examples · How it works https://github.com/natsuku-lab/batchplan/blob/main/docs/architecture.md batchplan is a Rust library for collision-aware motion planning, in batches. One call plans thousands of motions, each in its own scene: IK, a collision-free path, and a trajectory timed within the robot's limits. A typical problem plans in 0.17 ms on one CPU core, faster than VAMP how-it-compares , with paths that keep clear of the real geometry more often than any planner we compared. IK, trajectory optimization and distance grids run on any GPU that wgpu https://wgpu.rs supports Vulkan, Metal or DX12 , with no CUDA, no ROCm and no ROS, or on the CPU with the same results. It is built for robot learning at scale: planned motions become LeRobot https://github.com/huggingface/lerobot datasets that train as they are. Two reBot arms hand blocks to each other over and around dividers in 512 scenes in 1.4–1.7 s on an M4 Pro or a Ryzen AI Max+ 395, on the GPU or the CPU. - Plan: batched IK; RRT-Connect, shortcutting and smoothing on SIMD collision checks; smooth B-spline paths, optionally optimized with L-BFGS; time-optimal timing within velocity, acceleration and jerk limits; replanning from a moving state; and controlled stops along the path. - Robots: load from URDF, MJCF or OpenUSD, including mimic joints, closed loops, continuous joints and ball or floating joints, or assemble several, such as two arms. Collision spheres are fitted automatically. IK takes a target for each hand at once, and plans can hold one arm still while another moves. - Worlds: boxes, spheres, cylinders, capsules and signed distance grids, built from meshes, point clouds, depth images or frames fused over time. - Data: reaches with recoveries from mistakes, pick-and-place episodes and handovers between two arms, with grippers and task strings, plus states perturbed from them to start reinforcement learning from. They export as LeRobot v3.0 datasets arm by arm, as ALOHA's or NumPy arrays; scripts/replay mujoco.py replays them in MuJoCo and adds camera videos. - Embeddable: CPU-only builds, threads you own, time budgets, allocation-free sampling and typed errors, for use inside a robot's control process. dependencies batchplan = "0.2" | Cargo feature | Default | Adds | |---|---|---| | gpu | on | GPU devices through wgpu. Without it, batchplan is CPU-only and has no GPU dependencies. | | lerobot | off | LeRobot v3.0 export Arrow, Parquet . | | usd | off | Robots and scenes from OpenUSD. | batchplan builds on stable Rust 1.90 or later 1.96 with usd , with no build flags to set: its collision checks use the widest SIMD instructions the CPU has, chosen when the program runs SSE2 up to AVX-512 on x86-64, NEON on ARM . The paths below point at test robots in this repository's assets/ ; use your own robot's file instead. use batchplan::glam::{Quat, Vec3}; use batchplan::{ Device, Error, IkOptions, IkProblem, Obstacle, PlanOptions, PlanProblem, Pose, Robot, RobotOptions, Trajectory, World, }; fn main - Result< , Error { // Any URDF, MJCF or USD robot. Collision spheres are fitted when it loads. let robot = Robot::load "assets/ur5e/ur description/urdf/ur5e.urdf", &RobotOptions::default , ?; let device = Device::gpu &robot .or else | | Device::cpu &robot ?; // Scenes are uploaded once. Problems name their scene by index. let table = Obstacle::cuboid Vec3::new 0.0, 0.0, -0.02 , Vec3::new 1.0, 1.0, 0.02 ; let worlds = device.upload & World { obstacles: vec table , } ?; // IK for a batch of gripper poses... let down = Quat::from rotation x std::f32::consts::PI ; let goals: Vec