Motus.Geometry
2.0.0
dotnet add package Motus.Geometry --version 2.0.0
NuGet\Install-Package Motus.Geometry -Version 2.0.0
<PackageReference Include="Motus.Geometry" Version="2.0.0" />
<PackageVersion Include="Motus.Geometry" Version="2.0.0" />
<PackageReference Include="Motus.Geometry" />
paket add Motus.Geometry --version 2.0.0
#r "nuget: Motus.Geometry, 2.0.0"
#:package Motus.Geometry@2.0.0
#addin nuget:?package=Motus.Geometry&version=2.0.0
#tool nuget:?package=Motus.Geometry&version=2.0.0
Motus.NET
.NET 8 host-agnostic motion-planning core: models, FK/IK, collision, sampling/Cartesian planners, retiming, and export.
| Motus.NET | Motus.Grasshopper |
|---|---|
| Libraries on nuget.org (latest published 1.8.0; next cut 2.0.0 — publish on tag) | Rhino/GH UI that calls these APIs |
| Owns math, units, Status contracts, method DOIs | Thin components + examples |
No UI, no vendor runtime, no live robot I/O. Algorithm catalog: docs/METHODS.md · citations: docs/REFERENCES.bib.
Bundled presets (UR family) and URDF / xacro loaders; analytic IK for Universal Robots, numerical IK for generic chains. Parallel Stewart (Family=stewart, leg lengths in meters) and legged gait preview (Family=legged, radians) are first-class siblings of serial tip chains.
Licensed under MIT.
Contents
- Packages
- Quick start
- Planners
- Algorithms and references
- Context: attach, groups, SRDF
- Units and export
- Build and test
- Releases
- Safety
- Attribution
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. Stub/NuGet builds often expose only RrtConnect in the planner registry; extra OMPL IDs need a full native build. Check MotusCapabilities.Describe().
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 / PRM* / … 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)
}));
Pick/place programs support explicit gripper contact, obstacle-aware transfers, and attachment timelines that survive retiming and export. See docs/pick-place.md.
Algorithms and references
Canonical detail (API, units, failure codes): docs/METHODS.md. BibTeX: docs/REFERENCES.bib.
<details> <summary><strong>Method catalog</strong> — area, behavior, citations (click to expand)</summary>
| Area | What Motus does | References |
|---|---|---|
| URDF / xacro | In-process xacro subset → kinematic tree (LoadTreeXacro) |
docs/urdf-import.md |
| Joint LIN | Free-space joint interpolation + optional collision | Deterministic managed |
| Cartesian LIN | TCP-linear path, IK per sample | Deterministic managed |
| PoE FK / numerical IK | Modern Robotics screws + body Jacobian for URDF serial | Lynch & Park, Modern Robotics |
| TOTG retime | Managed TOPP-RA-style retiming (RetimerAlgorithm.Totg) |
Pham & Pham 2018, DOI 10.1109/TRO.2018.2819195 |
| Path constraints | MoveIt-shaped position/orientation checks | Sucan et al. 2012, DOI 10.1109/MRA.2012.2205651 |
| RRT-Connect | Default sampling (managed; native OMPL optional) | Kuffner & LaValle, ICRA 2000; OMPL |
| PRM* | Managed roadmap sampling | Karaman & Frazzoli 2011, DOI 10.1177/0278364911406761 |
| CHOMP-lite | Post-process smoother | Zucker et al. 2013, DOI 10.1177/0278364913488805 |
| Stewart / Gough | Leg-length IK/FK, stroke-space collision/RRT (Family=stewart, meters) |
Merlet; Dasgupta & Mruthyunjaya — see METHODS |
| Group / tree planning | PlanningGroup / GroupMap over named drivers |
Kinematic-tree ADRs / METHODS |
| Holonomic SE(2) | Base x/y/yaw appended to sampling | LaValle, Planning Algorithms (2006) |
| Legged gait | Duty-cycle gait + SSM validation (Family=legged, radians) |
Lynch & Park; Song & Waldron; McGhee & Frank — see METHODS |
</details>
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.
Units & export
Internal units: radians, seconds, meters (Motus.Core.Units for °↔rad). Stewart configurations are meters (leg stroke); legged joints are radians.
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.
Changelog: CHANGELOG.md. Package/Directory.Build.props targets 2.0.0 (NuGet publish on v2.0.0 tag). Latest published NuGet is 1.8.0 (GitHub v1.8.0). Use sibling project references until 2.0.0 is tagged and published.
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 (>= 2.0.0)
- Motus.Native (>= 2.0.0)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Motus.Geometry:
| Package | Downloads |
|---|---|
|
Motus.Presets
JSON robot presets and URDF loader for Motus.NET with bundled UR and KUKA defaults. |
|
|
Motus.OMPL.NET
OMPL adapter layer for Motus.NET: native RRT-Connect when built, managed fallback otherwise. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.0.0 | 210 | 9/19/2026 |
| 1.9.0 | 139 | 9/19/2026 |
| 1.8.0 | 171 | 9/19/2026 |
| 0.17.0 | 157 | 9/19/2026 |
| 0.13.2 | 217 | 7/27/2026 |
| 0.13.1 | 168 | 7/27/2026 |
| 0.13.0 | 172 | 7/27/2026 |
| 0.12.0 | 165 | 7/27/2026 |
| 0.11.0 | 159 | 7/26/2026 |
| 0.10.0 | 163 | 7/26/2026 |
| 0.9.1 | 163 | 7/24/2026 |
| 0.8.0 | 160 | 7/22/2026 |
| 0.7.2 | 178 | 7/19/2026 |
| 0.7.1 | 174 | 7/19/2026 |
| 0.7.0 | 156 | 7/19/2026 |
| 0.6.9 | 181 | 7/18/2026 |
| 0.6.8 | 217 | 7/18/2026 |
| 0.6.7 | 184 | 7/18/2026 |
| 0.6.6 | 188 | 7/13/2026 |
| 0.6.4 | 156 | 7/12/2026 |
See CHANGELOG.md.