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.
β
Singularity Classο
- class ManipulaPy.singularity.Singularity(serial_manipulator)[source]ο
Bases:
objectMain class for singularity analysis of robotic manipulators providing detection, manipulability analysis, workspace visualization, and condition number computations.
Constructor
- __init__(serial_manipulator)[source]ο
Initialize the Singularity class with a SerialManipulator object.
- Parameters:
serial_manipulator (SerialManipulator) β An instance of SerialManipulator.
Parameters:
serial_manipulator (SerialManipulator) β Instance of SerialManipulator for kinematic computations
- singularity_analysis(thetalist)[source]ο
Analyze if the manipulator is at a singularity based on the determinant of the Jacobian matrix.
- Parameters:
thetalist (numpy.ndarray) β Array of joint angles in radians.
- Returns:
True if the manipulator is at a singularity, False otherwise.
- Return type:
- 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.
- plot_workspace_monte_carlo(joint_limits, num_samples=10000)[source]ο
Estimate the robot workspace using Monte Carlo sampling.
- 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:
- 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:
β
Singularity Detectionο
Primary Detection Methodsο
- Singularity.singularity_analysis(thetalist)[source]ο
Analyze if the manipulator is at a singularity based on the determinant of the Jacobian matrix.
- Parameters:
thetalist (numpy.ndarray) β Array of joint angles in radians.
- Returns:
True if the manipulator is at a singularity, False otherwise.
- 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 (|det(J)| < 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.
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:
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