Untitled
unknown
plain_text
2 years ago
2.7 kB
8
Indexable
public class HandConstraints {
// Define anatomical range of motion (ROM) for joints in degrees
// adjust these values based on your reference data
public static final int SHOULDER_FLEXION_MIN = -30;
public static final int SHOULDER_FLEXION_MAX = 120;
public static final int SHOULDER_ABDUCTION_MIN = -30;
public static final int SHOULDER_ABDUCTION_MAX = 90;
public static final int SHOULDER_EXTERNAL_ROTATION_MIN = -90;
public static final int SHOULDER_EXTERNAL_ROTATION_MAX = 0;
public static final int ELBOW_FLEXION_MIN = 0;
public static final int ELBOW_FLEXION_MAX = 135; // Adjust based on your reference data
public static final int WRIST_FLEXION_MIN = -60;
public static final int WRIST_FLEXION_MAX = 80;
public static final int WRIST_RADIAL_DEVIATION_MIN = -20;
public static final int WRIST_RADIAL_DEVIATION_MAX = 20;
public static final int WRIST_ULNAR_DEVIATION_MIN = -20;
public static final int WRIST_ULNAR_DEVIATION_MAX = 20;
public static float[] applyConstraints(float[] rotations) {
// Assumes rotations array contains rotation data in a specific order (e.g., shoulder rotations, elbow flexion, wrist rotations)
rotations[0] = clampRotation(rotations[0], SHOULDER_FLEXION_MIN, SHOULDER_FLEXION_MAX); // Shoulder Flexion
float maxElbowFlexion = calculateMaxElbowFlexion(rotations[0]); // Calculate dependent elbow limit
rotations[3] = clampRotation(rotations[3], ELBOW_FLEXION_MIN, maxElbowFlexion); // Elbow Flexion with constraint
rotations[1] = clampRotation(rotations[1], SHOULDER_ABDUCTION_MIN, SHOULDER_ABDUCTION_MAX); // Shoulder Abduction
rotations[2] = clampRotation(rotations[2], SHOULDER_EXTERNAL_ROTATION_MIN, SHOULDER_EXTERNAL_ROTATION_MAX); // Shoulder External Rotation
rotations[4] = clampRotation(rotations[4], WRIST_FLEXION_MIN, WRIST_FLEXION_MAX); // Wrist Flexion
rotations[5] = clampRotation(rotations[5], WRIST_RADIAL_DEVIATION_MIN, WRIST_RADIAL_DEVIATION_MAX); // Wrist Radial Deviation
rotations[6] = clampRotation(rotations[6], WRIST_ULNAR_DEVIATION_MIN, WRIST_ULNAR_DEVIATION_MAX); // Wrist Ulnar Deviation
return rotations;
}
private static float clampRotation(float rotation, float min, float max) {
return Math.min(Math.max(rotation, min), max);
}
private static float calculateMaxElbowFlexion(float shoulderFlexion) {
// Simple example: Reduce max elbow flexion based on shoulder flexion (adjust as needed)
float reductionFactor = Math.abs(shoulderFlexion) / 100.0f; // Adjust factor based on desired dependency
return ELBOW_FLEXION_MAX * (1.0f - reductionFactor);
}
}Editor is loading...
Leave a Comment