Moro 0.5.0 Release Notes
Moro 0.5.0 expands the library from symbolic robot modeling and position inverse kinematics into a broader teaching-oriented workflow for differential kinematics, local capability analysis, full-pose IK, trajectories, numerical dynamics, simulation, and sampled workspace analysis.
Highlights
Orientation and transformations
0.5.0 completes the accepted orientation-tooling foundation with:
proper-Euler and Tait-Bryan sequence support;
quaternion conversions using scalar-first ordering;
rotation-vector conversions;
vex();descriptive
is_rotation_matrix()andis_homogeneous_transform()predicates.
The legacy predicates is_SO3(), is_SE3(), isrot(), and ishtm() remain temporarily available and emit DeprecationWarning.
Differential kinematics and local capability
The new moro.differential_kinematics module provides:
task Jacobian selection;
Cartesian velocity propagation;
pseudoinverse and damped-least-squares velocity IK;
singular values;
numerical rank;
condition number;
singularity detection;
Yoshikawa manipulability.
The canonical geometric-twist ordering is:
(vx, vy, vz, wx, wy, wz)
Full-pose inverse kinematics
solve_pose_ik() extends numerical IK to homogeneous-transform targets while preserving the existing position-only IK APIs.
CCD remains intentionally position-only in 0.5.0.
Trajectory generation
The new moro.trajectory module provides linear, cubic, and quintic point-to-point trajectories in:
joint space;
Cartesian position space.
Time-series arrays follow the time-major convention:
(N, dof)
and Cartesian position arrays use:
(N, 3)
including planar cases.
Numerical dynamics and simulation
The new moro.dynamics module provides:
inverse_dynamics();forward_dynamics();state_derivative();simulate();DynamicsSolution.
Simulation uses SciPy solve_ivp and supports zero, constant, time-varying, and state-feedback generalized-force inputs.
Workspace sampling
The new moro.workspace module provides reproducible sampled reachable-workspace analysis with:
finite joint-space domains;
local NumPy RNG seeding;
symbolic parameter substitution;
preserved configuration/point correspondence;
Matplotlib point-cloud visualization through
plot_workspace().
Workspace samples are uniform in joint coordinates, not Cartesian space.
Important migration: dynamic_model()
Moro 0.5.0 intentionally changes the meaning of:
robot.dynamic_model()
In 0.4.x it returned per-joint Euler-Lagrange equations.
In 0.5.0 it returns the standard matrix manipulator equation:
M(q) qdd + C(q, qd) qd + G(q) = tau
Code that relied on the old behavior should migrate to:
robot.euler_lagrange_equations()
The old matrix-form helper remains temporarily available as:
robot.dynamic_model_matrix_form()
but is deprecated and will emit DeprecationWarning.
Transformation predicate migration
Prefer:
from moro.transformations import (
is_rotation_matrix,
is_homogeneous_transform,
)
over the legacy utility names:
is_SO3()
is_SE3()
isrot()
ishtm()
The legacy wrappers preserve their Boolean return contract during the deprecation period.
Python and dependencies
Moro 0.5.x supports Python 3.11 and newer.
The main runtime dependencies are:
SymPy;
NumPy;
Matplotlib;
SciPy.
SciPy is now required because numerical time integration is a core 0.5.0 capability.
Package API policy
New 0.5.0 capabilities are primarily module-oriented. Existing root imports remain intentionally compact.
Recommended imports include:
from moro.differential_kinematics import solve_velocity_ik
from moro.inverse_kinematics import solve_pose_ik
from moro.trajectory import joint_trajectory
from moro.dynamics import simulate
from moro.workspace import sample_workspace
from moro.visualization import plot_workspace
Scope intentionally deferred
Moro 0.5.0 does not add general motion planning, collision-aware IK, pose trajectories, SLERP trajectory interpolation, constrained/contact dynamics, controller classes, exact analytical workspace boundaries, or manipulability-colored workspace maps.