Singularity API Reference#
This page documents ManipulaPy.singularity, the module for comprehensive singularity analysis of robotic manipulators including detection, visualization, and workspace analysis with optional CUDA acceleration.
Tip
For conceptual explanations, see Singularity Analysis User Guide.
β
Singularity Class#
- class ManipulaPy.singularity.Singularity(serial_manipulator)[source]#
Bases:
objectSingularity and manipulability analysis for a serial manipulator.
Main class for singularity analysis of robotic manipulators providing detection, manipulability analysis, workspace visualization, and condition number computations.
Constructor
- Parameters:
serial_manipulator (Any)
- __init__(serial_manipulator)[source]#
Initialize the Singularity class with a SerialManipulator object.
- Parameters:
serial_manipulator (SerialManipulator) β An instance of SerialManipulator.
- Return type:
None
Parameters:
serial_manipulator (SerialManipulator) β Instance of SerialManipulator for kinematic computations
β
Singularity Detection#
Primary Detection Methods#
- Singularity.singularity_analysis(thetalist)[source]#
Detect singularity using smallest singular value (works for any Jacobian shape).
Computes the space-frame Jacobian at the given configuration and flags a singularity when its smallest singular value falls below
1e-4.- Parameters:
thetalist (ndarray[tuple[Any, ...], dtype[float64]] | List[float]) β Joint angles in radians, length-N array or list, where N is the number of joints.
- Returns:
True if the configuration is (near-)singular, otherwise False.
- Return type:
Analyzes if the manipulator is at a singularity by computing the determinant of the Jacobian matrix. Uses a threshold of 1e-4 for determinant comparison.
Parameters:
thetalist (numpy.ndarray) β Array of joint angles in radians
Returns:
bool β True if at singularity (\(\lvert \det(J) \rvert\) < 1e-4), False otherwise
- Singularity.near_singularity_detection(thetalist, threshold=0.01)[source]#
Detect if the manipulator is near a singularity by comparing the condition number with a threshold.
- Parameters:
thetalist (numpy.ndarray) β Array of joint angles in radians.
threshold (float, optional) β Threshold value for the condition number. Defaults to 1e-2.
- Returns:
True if the manipulator is near a singularity, False otherwise.
- Return type:
Detects proximity to singularities using condition number analysis.
Parameters:
thetalist (numpy.ndarray) β Array of joint angles in radians
threshold (float, optional) β Condition number threshold (default: 1e-2)
Returns:
bool β True if near singularity (condition number > threshold), False otherwise
Condition Analysis#
- Singularity.condition_number(thetalist)[source]#
Calculate the condition number of the Jacobian for a given set of joint angles.
- Parameters:
thetalist (numpy.ndarray) β Array of joint angles in radians.
- Returns:
The condition number of the Jacobian matrix.
- Return type:
Computes the condition number of the Jacobian matrix using singular value decomposition.
Parameters:
thetalist (numpy.ndarray) β Array of joint angles in radians
Returns:
float β Condition number of the Jacobian matrix
β
Manipulability Analysis#
Ellipsoid Visualization#
- Singularity.manipulability_ellipsoid(thetalist, ax=None)[source]#
Plot the manipulability ellipsoid for a given set of joint angles.
- Parameters:
thetalist (numpy.ndarray) β Array of joint angles in radians.
ax (matplotlib.axes._subplots.Axes3DSubplot, optional) β Matplotlib 3D axis to plot on. Defaults to None.
- Return type:
None
Generates and plots manipulability ellipsoids for linear and angular velocity components. Uses SVD to compute ellipsoid radii and orientations from Jacobian submatrices.
Parameters:
thetalist (numpy.ndarray) β Array of joint angles in radians
ax (matplotlib.axes._subplots.Axes3DSubplot, optional) β 3D axis for plotting
Technical Details:
Separates Jacobian into linear (J[:3,:]) and angular (J[3:,:]) components
Computes SVD for each component: U, S, V = svd(J_component)
Ellipsoid radii calculated as 1/sqrt(singular_values)
Generates sphere points and transforms using U and radii
Creates dual plot with blue (linear) and red (angular) ellipsoids
β
Workspace Analysis#
Monte Carlo Methods#
- Singularity.plot_workspace_monte_carlo(joint_limits, num_samples=10000)[source]#
Estimate the robot workspace using Monte Carlo sampling.
- Parameters:
- Return type:
None
Estimates robot workspace using CUDA-accelerated Monte Carlo sampling. Generates random joint configurations and computes reachable end-effector positions.
Parameters:
joint_limits (list) β List of (min, max) tuples for each joint
num_samples (int, optional) β Number of Monte Carlo samples (default: 10000)
CUDA Implementation Details:
Uses numba.cuda for GPU acceleration
Random number generation via xoroshiro128p_uniform_float32
Parallel joint angle sampling with configurable thread blocks
Thread block size: 256 threads per block
Grid size: (num_samples + 255) // 256 blocks
Processing Pipeline:
Initialize CUDA device arrays for joint samples
Generate random states with create_xoroshiro128p_states
Launch CUDA kernel for parallel sampling
Copy samples to host and compute forward kinematics
Generate convex hull from workspace points
Visualize using matplotlib plot_trisurf
β
Mathematical Implementation#
Jacobian Analysis#
All methods rely on the Jacobian matrix computation from the SerialManipulator:
Frame: Uses βspaceβ frame for consistency
Dimensions: 6Γn matrix (6 DOF Γ n joints)
Components: Upper 3 rows (linear), lower 3 rows (angular)
Determinant Computation#
Singularity detection uses numpy.linalg.det() with absolute value comparison:
Threshold: 1e-4 (configurable in source)
Method: Direct determinant calculation
Precision: Double precision floating point
Condition Number Calculation#
Uses numpy.linalg.cond() which implements:
Method: Ratio of largest to smallest singular values
Algorithm: SVD-based computation
Stability: Numerically stable for ill-conditioned matrices
SVD Implementation#
Manipulability ellipsoid generation uses numpy.linalg.svd():
Decomposition: J = U @ diag(S) @ V.T
Radii computation: 1.0 / sqrt(S)
Transformation: Ellipsoid points = U @ diag(radii) @ sphere_points
Convex Hull Generation#
Workspace visualization uses scipy.spatial.ConvexHull:
Algorithm: Quickhull algorithm
Input: NΓ3 array of workspace points
Output: Triangulated surface mesh
Visualization: Matplotlib plot_trisurf with viridis colormap
β
Performance Characteristics#
Computational Complexity#
Method |
Complexity |
Primary Operations |
|---|---|---|
|
O(nΒ³) |
Jacobian + determinant |
|
O(nΒ³) |
Jacobian + SVD |
|
O(nΒ³ + m) |
2ΓSVD + sphere generation |
|
O(kΓnΒ²) |
kΓforward_kinematics + convex_hull |
Memory Requirements#
CUDA kernel memory allocation:
joint_samples: num_samples Γ num_joints Γ float32
rng_states: num_samples Γ state_size
device_joint_limits: num_joints Γ 2 Γ float32
Thread Configuration#
CUDA kernel execution parameters:
threads_per_block: 256 (fixed)
blocks_per_grid: ceil(num_samples / 256)
total_threads: blocks_per_grid Γ threads_per_block
β
Data Flow Architecture#
Singularity Analysis Pipeline#
Input: Joint angles (numpy.ndarray)
Jacobian Computation: SerialManipulator.jacobian()
Analysis: Determinant or condition number calculation
Output: Boolean or float result
Manipulability Ellipsoid Pipeline#
Input: Joint angles + optional axis
Jacobian Decomposition: Split into linear/angular components
SVD Analysis: Compute singular values and vectors
Ellipsoid Generation: Transform unit sphere using SVD results
Visualization: Matplotlib 3D surface plotting
Workspace Analysis Pipeline#
CUDA Setup: Initialize device memory and random states
Parallel Sampling: Generate random joint configurations
Host Transfer: Copy samples from GPU to CPU
Forward Kinematics: Batch computation of end-effector positions
Convex Hull: Geometric analysis of workspace boundary
Visualization: 3D triangulated surface rendering
β
Error Handling and Validation#
Input Validation#
Joint angles: Verified as numpy arrays with correct dimensions
Joint limits: Validated as list of tuples with numeric values
Thresholds: Checked for positive numeric values
Numerical Stability#
Singular matrices: Handled gracefully in condition number computation
Zero determinants: Managed with absolute value thresholding
Ill-conditioned systems: SVD provides robust decomposition
CUDA Error Management#
Memory allocation: Automatic cleanup on kernel completion
Thread synchronization: Implicit synchronization after kernel launch
Device compatibility: Runtime detection of CUDA availability
β
See Also#
Kinematics API Reference β SerialManipulator class for Jacobian computation
Utils Module β Mathematical utilities and matrix operations
Path Planning API Reference β Trajectory planning with singularity considerations
Control API Reference β Control algorithms affected by singularities