Motus.OMPL.NET
0.12.0
dotnet add package Motus.OMPL.NET --version 0.12.0
NuGet\Install-Package Motus.OMPL.NET -Version 0.12.0
<PackageReference Include="Motus.OMPL.NET" Version="0.12.0" />
<PackageVersion Include="Motus.OMPL.NET" Version="0.12.0" />
<PackageReference Include="Motus.OMPL.NET" />
paket add Motus.OMPL.NET --version 0.12.0
#r "nuget: Motus.OMPL.NET, 0.12.0"
#:package Motus.OMPL.NET@0.12.0
#addin nuget:?package=Motus.OMPL.NET&version=0.12.0
#tool nuget:?package=Motus.OMPL.NET&version=0.12.0
Motus.NET
.NET 8 host-agnostic motion-planning core: models, FK/IK, collision, sampling/Cartesian planners, retiming, and export. No UI, no vendor runtime, no live robot I/O. Algorithm catalog: docs/METHODS.md · citations: docs/REFERENCES.bib.
Use it from Motus.Grasshopper or any .NET host. Bundled presets (UR family) and URDF / xacro loaders; analytic IK for Universal Robots, numerical IK for generic chains.
Licensed under MIT.
Packages
dotnet add package Motus.Core
dotnet add package Motus.Geometry
dotnet add package Motus.OMPL.NET
dotnet add package Motus.Presets
| Package | Role |
|---|---|
Motus.Core |
Models, IPlanner, validation, PlanningContext, JSON/CSV export |
Motus.Geometry |
FK/IK, mesh/sphere collision, LIN / industrial motion programs |
Motus.OMPL.NET |
Sampling planners (managed RRT-Connect by default; native OMPL when built) |
Motus.Presets |
JSON presets + UrdfRobotLoader / xacro |
Motus.Native |
Optional P/Invoke to motus_native (OMPL + FCL) |
Rhino / desktop: managed planning and C# mesh collision are the default — no Linux .so required. See docs/rhino-host.md.
Quick start
var robot = PresetLoader.LoadRobotModelByName("UR10e");
var start = HomePoseResolver.HomeOrZeros(robot);
var goal = new JointState(/* radians */);
var scene = new CollisionScene(new[] {
CollisionObject.Sphere("obstacle", Frame.Identity, 0.1)
});
var checker = CollisionCheckerFactory.Create(robot);
var opts = new PlanningOptions {
CollisionScene = scene,
CollisionChecker = checker
};
var result = SamplingPlanner.Create(checker, new SamplingPlannerOptions {
PlannerId = SamplingPlannerId.RrtConnect,
MaxIterations = 4000
}).Plan(new PlanningRequest(robot, start, goal, opts));
if (result.Success)
File.WriteAllText("plan.json", TrajectoryExport.ToJson(result.Trajectory!));
URDF:
var robot = UrdfRobotLoader.Load("robot.urdf", new UrdfLoadOptions {
BaseLink = "base_link",
TipLink = "tool0"
});
var fk = KinematicsResolver.CreateFkSolver(robot.Preset, robot.Chain);
Planners
| Planner | When to use |
|---|---|
JointLinearPlanner |
Free-space joint interpolation |
CartesianLinearPathPlanner |
True TCP-linear (LIN) after IK |
SamplingPlanner |
Obstacles — RRT-Connect / RRT* / … via registry |
IndustrialMotionPlanner |
Mixed PTP / LIN / CIRC programs |
Prefer SamplingPlanner + CollisionCheckerFactory.Create (or GetOrCreate for session reuse) over the obsolete RrtConnectPlanner wrapper.
// Motion program
var planner = new IndustrialMotionPlanner(robot.Preset);
var result = planner.Plan(new MotionProgramRequest(robot, start, new MotionSegment[] {
new PtpSegment(ptpGoal, blendRadiusMeters: 0.004),
new LinSegment(linGoal, stepMeters: 0.005),
new CircSegment(via, circGoal, arcSamples: 12)
}));
Context: attach, groups, SRDF
var ctx = PlanningContext.Create(robot, scene)
.Attach("workpiece", workpieceBox, tcpLocalFrame)
.ForGroup(SrdfLoader.LoadGroups("robot.srdf")[0]);
var checker = CollisionCheckerFactory.Create(robot, attached: ctx.Attached);
var result = SamplingPlanner.Create(checker).Plan(
new PlanningRequest(robot, start, goal, ctx.ToPlanningOptions()));
Non-group joints stay locked at the start configuration. MotusCapabilities.Describe() reports managed vs native OMPL/FCL.
Units & export
Internal units: radians, seconds, meters (Motus.Core.Units for °↔rad).
TrajectoryExport.ToJson emits the PlanBundle contract for Grasshopper and control adapters:
contractVersion/exportVersion— schema compatibilityunits,frameConvention— semanticsdiagnostics— machine-readable planner messagesprovenance— optionalplannerId, seed, settings hash
Additive optional fields are safe; removing/renaming fields requires a major contractVersion bump.
Build & test
Requires .NET 9+ SDK to open the .slnx; libraries target net8.0.
dotnet build Motus.NET.slnx
dotnet test Motus.NET.slnx
Optional native library:
cmake -S native -B native/build -DMOTUS_USE_OMPL=ON -DMOTUS_USE_FCL=ON
cmake --build native/build
# Linux: export LD_LIBRARY_PATH=native/build
Benchmarks: benchmarks/Motus.Benchmarks (BenchmarkDotNet).
Releases
Tag vX.Y.Z → release workflow builds, tests, packs, publishes to nuget.org, and creates a GitHub Release.
One-time nuget.org trusted publisher: GitHub owner lasaths, repo Motus.NET, workflow release.yml.
Changelog: CHANGELOG.md.
Safety
Motus does not command physical robots. Presets and URDF imports are planning defaults — verify limits and calibration before hardware use. See docs/safety.md.
This library and bundled presets were developed with AI assistance; values are approximate and must be checked against manufacturer data.
Attribution
- Managed RRT-Connect implements Kuffner & LaValle (ICRA 2000). Native path uses OMPL (BSD-3-Clause) when built.
- Robot presets are approximate public-datasheet values for planning/visualization only.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- Motus.Core (>= 0.12.0)
- Motus.Geometry (>= 0.12.0)
- Motus.Native (>= 0.12.0)
- Motus.OMPL.Native (>= 0.12.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.12.0 | 0 | 7/27/2026 |
| 0.11.0 | 30 | 7/26/2026 |
| 0.10.0 | 38 | 7/26/2026 |
| 0.9.1 | 42 | 7/24/2026 |
| 0.8.0 | 40 | 7/22/2026 |
| 0.7.2 | 104 | 7/19/2026 |
| 0.7.1 | 100 | 7/19/2026 |
| 0.7.0 | 82 | 7/19/2026 |
| 0.6.9 | 100 | 7/18/2026 |
| 0.6.8 | 149 | 7/18/2026 |
| 0.6.7 | 100 | 7/18/2026 |
| 0.6.6 | 117 | 7/13/2026 |
| 0.6.4 | 85 | 7/12/2026 |
| 0.6.3 | 95 | 7/12/2026 |
| 0.6.2 | 88 | 7/12/2026 |
| 0.6.1 | 101 | 7/11/2026 |
| 0.6.0 | 97 | 7/10/2026 |
| 0.5.1 | 98 | 7/10/2026 |
| 0.5.0 | 99 | 7/9/2026 |
| 0.4.0 | 95 | 7/8/2026 |
See CHANGELOG.md.