Untitled

 avatar
unknown
plain_text
a year ago
2.7 kB
6
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