Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Error Reference

Every KineticError variant with display message, cause, fix, and code example.

All kinetic operations return kinetic_core::Result<T>, which is an alias for std::result::Result<T, KineticError>. The error type is #[non_exhaustive], so match arms should include a wildcard.

Error Classification

#![allow(unused)]
fn main() {
let err: KineticError = ...;

// Retryable errors: try again with different parameters
if err.is_retryable() { /* PlanningTimeout, IKNotConverged, CartesianPathIncomplete */ }

// Input errors: fix the input, do not retry
if err.is_input_error() { /* UrdfParse, DimensionMismatch, GoalUnreachable, ... */ }
}

UrdfParse

Display: URDF parse error: {detail}

Cause: The URDF file contains malformed XML, missing required tags, or invalid attribute values.

Fix: Validate the URDF with an XML linter. Ensure every <joint> has type, <parent>, <child>, <origin>, <axis>, and <limit> tags.

IKNotConverged

Display: IK did not converge after {iterations} iterations (residual: {residual:.6})

Cause: Iterative solver did not reach tolerance. Common near workspace boundaries or with poor seeds.

Fix: Increase num_restarts, provide a better seed, lower damping, or use IKConfig::with_fallback().

PlanningTimeout

Display: Planning timed out after {elapsed:?} ({iterations} iterations)

Cause: Planner exhausted time budget. Constrained environments or short timeouts.

Fix: Use PlannerConfig::offline(), try EST/KPIECE, verify start/goal are not in collision.

StartInCollision / GoalInCollision

StartInCollision: Start joints collide with scene or self. Check planner.is_in_collision(&start) before planning.

GoalInCollision: Resolved goal collides with scene. Verify goal is collision-free. Try different IK seeds for pose goals.

GoalUnreachable

Display: Goal is unreachable

Cause: Goal joints violate URDF limits, or IK cannot find a valid solution for a pose goal within joint limits.

Fix: Check that goal values are within robot.joint_limits.

NoIKSolution

Display: No valid IK solution found for target pose

Cause: Target is outside the robot’s workspace or no solution exists within limits.

Fix: Verify the target is reachable. Use ReachabilityMap for workspace analysis.

JointLimitViolation

Display: Joint '{name}' value {value} outside limits [{min}, {max}]

Cause: A joint value exceeds URDF-defined limits.

Fix: Clamp or adjust the offending joint value.

RobotConfigNotFound

Display: Robot config not found: {name}

Cause: No config directory for the given robot name.

Fix: Check spelling. Verify robot_configs/{name}/kinetic.toml exists.

CartesianPathIncomplete

Display: Cartesian path only achieved {fraction:.1}% of requested path

Cause: Cartesian planner hit IK failures, collisions, or joint jumps.

Fix: Lower max_step in CartesianConfig or break into shorter segments.

CollisionDetected

Display: Collision detected at waypoint {waypoint_index}

Fix: Replan with updated scene. Increase collision_margin.

TrajectoryLimitExceeded

Display: Trajectory limit exceeded at waypoint {waypoint_index}: {detail}

Fix: Re-run time parameterization with correct limits. Lower velocity scaling.

DimensionMismatch

Display: Dimension mismatch in {context}: expected {expected}, got {got}

Cause: Array length does not match the expected DOF. Common when mixing full robot DOF with chain DOF on mobile manipulators.

Fix: Check robot.dof and chain.dof. For mobile manipulators (Fetch, TIAGo), chain.dof may be less than robot.dof.

#![allow(unused)]
fn main() {
let chain = KinematicChain::extract(&robot, "base_link", "tool0")?;
// Use chain.dof for joint arrays passed to plan/fk/ik
let joints = vec![0.0; chain.dof];
}

SingularityLockup

Display: Singularity lockup: pseudoinverse failed {consecutive_failures} consecutive times

Cause: The servo controller’s pseudoinverse computation failed repeatedly because the robot is at or near a kinematic singularity.

Fix: Move the robot away from the singular configuration. Increase singularity_damping in ServoConfig. Check condition_number on IK solutions to detect approaching singularities early.

PlannerOutputInvalid

Display: Planner output invalid at waypoint {waypoint}: {reason}

Cause: The planner’s output failed internal safety validation. Either a waypoint violates joint limits (safety gate 1) or the end-effector exits the configured workspace bounds (safety gate 2).

Fix: If joint limits: verify URDF limit accuracy. If workspace bounds: widen the bounds or remove workspace_bounds from the config. If this error persists, it may indicate a planner bug – please report it.

#![allow(unused)]
fn main() {
match planner.plan(&start, &goal) {
    Err(KineticError::PlannerOutputInvalid { waypoint, reason }) => {
        eprintln!("Safety gate failed at waypoint {waypoint}: {reason}");
    }
    _ => {}
}
}

Display: Robot has no links / Link '{name}' not found / Joint '{name}' not found

Cause: Empty URDF, or a typo in a link/joint name string.

Fix: Print robot.links or robot.joints to see available names.

NamedConfigNotFound

Display: Named configuration '{name}' not found

Cause: The named pose does not exist in kinetic.toml.

Fix: Check the [named_poses] section. Available names can be queried via robot.named_pose_names().

Other

Display: {message}

Cause: Catch-all for errors that do not fit a specific variant.

Fix: Read the message for context. Common cases include non-finite joint values (NaN/Infinity) passed to the planner.