Motion planner overview
Create smooth robot trajectories offline, with velocity, acceleration and jerk limits, using FANUC motion instructions (J, L, C, FINE, CNT, CR).
The Motion module creates smooth robot trajectories that respect velocity, acceleration and jerk limits. It works offline, without robot connection, and its trajectories can be sent with Stream Motion, used in a simulation, or checked before use.
Motions are described as in a TP program: joint (J), linear (L) and circular (C) motions, with a speed and a FINE, CNT or CR termination. The module also creates splines through points, geometric shapes, and trajectories from your own positions.
The planner is in the UnderAutomation.Robotics.Motion namespace. This namespace is the same in all UnderAutomation robot SDKs, so the same code can plan trajectories for other robot brands. The FanucMotion class of UnderAutomation.Fanuc.Motion converts FANUC positions, FINE, CNT and CR terminations and I/O to the types of the planner.
Quick start
new double[] { 1125, 1125, 1687, 2530, 1265, 2530 });var cartesianLimits = new CartesianLimits(500, 2000, 10000, 90, 360, 1800);var planner = new MotionPlanner(jointLimits, cartesianLimits);// Joint motions, as J instructions of a TP programvar home = new JointValues(0, 0, 0, 0, -90, 0);var pick = new JointValues(30, 20, -10, 0, -70, 30);Trajectory trajectory = planner.CreateJointPath(home).MoveJoint(pick, 50, FanucMotion.Cnt(100)) // 50% speed, CNT100.MoveJoint(home, 50, FanucMotion.Fine()).Build();Console.WriteLine($"Duration: {trajectory.Duration:0.000} s");// Position at any time, or one position per communication cycleJointValues middle = trajectory.GetJoints(trajectory.Duration / 2);JointValues[] samples = trajectory.SampleJoints(0.008);// FANUC joint position, when neededJointsPosition fanucMiddle = FanucMotion.ToJointsPosition(middle);// Velocity, acceleration and jerk of each axis, computed as the robot doesTrajectoryReport report = trajectory.Check(jointLimits, 0.008, false);Console.WriteLine(report.IsValid);}}
Try it in the Showcase app
The Showcase demo application (Windows, WinForms) has a Stream Motion page with two buttons that build trajectories with the motion planner and send them to the robot with Stream Motion. Download it from the download page.
- Joint demo uses a
JointPathBuilder: J1 moves to +amplitude, then to -amplitude with aCnttermination between the two moves, then back to the start withFine. - Cartesian demo uses a
CartesianPathBuilder: a horizontal circle of the given radius, starting and ending at the current position.
Change the amplitude, the radius or the speed and send the demo again: the duration of the resulting trajectory is shown in the log, and the joint and Cartesian positions update in real time while the robot moves.

The C# source of this page is in the StreamMotionControl.cs file of the Fanuc.NET repository.
Main concepts
| Class | Role |
|---|---|
JointLimits | Velocity, acceleration and jerk of each axis (9 axes). Read them from the robot with StreamMotion.ReadLimits() |
CartesianLimits | Linear and angular velocity, acceleration and jerk, for Cartesian motions. You choose them |
MotionPlanner | Creates joint and Cartesian paths with the limits, and optional tool and user frames |
JointPathBuilder, CartesianPathBuilder | Chain motions, waits and I/O, then Build() the trajectory |
Trajectory | Result: position at any time, samples at a fixed period, I/O events, limit checks |
JointValues, CartesianPose | Joint and Cartesian positions of the planner. A CartesianPose has X, Y, Z, an Orientation and optional external axes |
FanucMotion | Conversions with JointsPosition and XYZWPRPosition, FINE, CNT and CR terminations, I/O signals, FANUC positions of a trajectory |
All motions use jerk limited profiles: the acceleration changes progressively, which gives smooth motions and avoids the jerk alarms of the robot. 100% speed means the velocity limits, and the acceleration percentage (ACC) scales the acceleration and the jerk.
What do you want to do?
| Need | Page |
|---|---|
| Move to positions with J, L, C motions, FINE, CNT, CR | Joint & Cartesian motions |
| Pass through a list of points, draw a circle, a rectangle or a helix | Splines & shapes |
| Use positions computed by your application, check or slow down a trajectory | Trajectories from points |
| Convert orientations and positions between frames | Frames & orientations |
Units and conventions
- Joint positions in degrees (mm for linear axes), Cartesian positions in mm, angles in degrees.
- Velocities per second, accelerations per second squared, jerks per second cubed.
- The W, P, R angles of FANUC use the fixed XYZ convention:
CartesianPose.FromEuler(x, y, z, w, p, r, EulerConvention.FixedXYZ)gives the same pose asFanucMotion.ToCartesianPose(new XYZWPRPosition(x, y, z, w, p, r)). FanucMotion.SampleCartesian()gives FANUC positions whose W, P, R angles stay continuous: an angle can go beyond 180 degrees instead of jumping to -180.