Pure J-PARSE algorithm. Only requires numpy.
solver = jparse.JParseCore(gamma=0.1)| Parameter | Type | Default | Description |
|---|---|---|---|
gamma |
float | 0.1 | Singularity threshold (0 < gamma < 1). Directions with σᵢ/σₘₐₓ < gamma are treated as singular. |
Compute the J-PARSE pseudo-inverse of a Jacobian matrix.
J_parse = solver.compute(J)
J_parse, nullspace = solver.compute(J, return_nullspace=True)| Parameter | Type | Default | Description |
|---|---|---|---|
jacobian |
ndarray | required | m × n Jacobian matrix |
singular_direction_gain_position |
float | 1.0 | Gain for position singular directions |
singular_direction_gain_angular |
float | 1.0 | Gain for angular singular directions |
position_dimensions |
int | None | Number of position rows (e.g., 3 for 3D) |
angular_dimensions |
int | None | Number of angular rows (e.g., 3 for 3D) |
return_nullspace |
bool | False | Also return nullspace projection matrix |
Returns:
J_parse(ndarray): n × m J-PARSE pseudo-inverse matrixnullspace(ndarray, optional): n × n nullspace projection matrix
Standard Moore-Penrose pseudo-inverse (for comparison).
Returns: n × m pseudo-inverse matrix
Damped least squares pseudo-inverse (for comparison).
| Parameter | Type | Default | Description |
|---|---|---|---|
jacobian |
ndarray | required | m × n Jacobian matrix |
damping |
float | 0.01 | Damping factor λ |
Returns: n × m DLS pseudo-inverse matrix
High-level robot interface with URDF support (requires Pinocchio).
robot = jparse.Robot.from_urdf("robot.urdf", "base_link", "ee_link", gamma=0.1)| Parameter | Type | Default | Description |
|---|---|---|---|
urdf |
str | required | Path to URDF file or XML string |
base_link |
str | required | Name of base link |
end_link |
str | required | Name of end-effector link |
gamma |
float | 0.1 | J-PARSE singularity threshold |
| Property | Type | Description |
|---|---|---|
num_joints |
int | Number of actuated joints |
gamma |
float | Current singularity threshold (settable) |
Compute the 6 × n geometric Jacobian.
Returns: 6 × n Jacobian matrix (rows 0-2: linear, rows 3-5: angular)
Compute J-PARSE pseudo-inverse at configuration q.
J_parse = robot.jparse(q)
J_parse = robot.jparse(q, position_only=True) # 3D position only
J_parse, nullspace = robot.jparse(q, return_nullspace=True)| Parameter | Type | Default | Description |
|---|---|---|---|
q |
ndarray | required | Joint configuration |
position_only |
bool | False | Use only position rows (3×n) |
return_nullspace |
bool | False | Also return nullspace matrix |
singular_direction_gain_position |
float | 1.0 | Position gain |
singular_direction_gain_angular |
float | 1.0 | Angular gain |
Returns: J-PARSE pseudo-inverse (and optionally nullspace)
Compute end-effector pose.
Returns: (position, rotation) - 3D position and 3×3 rotation matrix
Compute Yoshikawa's manipulability measure: √det(JJᵀ)
Returns: float (higher = better conditioned)
Compute σₘᵢₙ/σₘₐₓ of the Jacobian.
Returns: float in [0, 1] (0 = singular, 1 = isotropic)
# Manipulability measure
m = jparse.manipulability_measure(J) # √det(JJᵀ)
# Inverse condition number
icn = jparse.inverse_condition_number(J) # σₘᵢₙ/σₘₐₓfrom jparse_robotics.ros import ROSRobot
robot = ROSRobot.from_parameter_server("base_link", "ee_link", gamma=0.1)
robot.publish_ellipsoids(q, end_effector_pose) # Visualize in RViz