package com.campus.gomotion.util;
import com.campus.gomotion.sensorData.Accelerometer;
import com.campus.gomotion.sensorData.AngularVelocity;
import com.campus.gomotion.sensorData.AttitudeAngle;
import com.campus.gomotion.sensorData.Quaternion;
/**
* Author: zhong.zhou
* Date: 16/4/24
* Email: muxin_zg@163.com
*/
public class PhysicalConversionUtil {
/**
* transfer quaternion to attitude angle
*
* @param quaternion Quaternion
* @return AttitudeAngle
*/
public static AttitudeAngle quaternionToAttitudeAngle(Quaternion quaternion) {
AttitudeAngle attitudeAngle = new AttitudeAngle();
float w = quaternion.getW();
float x = quaternion.getX();
float y = quaternion.getY();
float z = quaternion.getZ();
attitudeAngle.setYaw((float) Math.atan2(2 * w * z + 2 * x * y, 1 - 2 * y * y - 2 * z * z) * (float) (180 / 3.1415));
attitudeAngle.setPitch((float) Math.asin(2 * w * y - 2 * z * x) * (float) (180 / 3.1415));
attitudeAngle.setRoll((float) Math.atan2(2 * w * x + 2 * y * z, 1 - 2 * x * x - 2 * y * y) * (float) (180 / 3.1415));
return attitudeAngle;
}
/**
* calculate geometric mean acceleration on the basis of attitude angle
*
* @param attitudeAngle AttitudeAngle
* @return float
*/
public static float calculateGeometricMeanAcceleration(AttitudeAngle attitudeAngle) {
float roll = attitudeAngle.getRoll();
float pitch = attitudeAngle.getPitch();
float yaw = attitudeAngle.getYaw();
float ax = -(float) Math.sin(pitch);
float ay = (float) (Math.sin(roll) * Math.cos(pitch));
float az = (float) (Math.cos(roll) * Math.cos(pitch));
return (float) Math.sqrt((double) (ax * ax + ay * ay + az * az) / (double) (3));
}
/**
* calculate geometric mean acceleration
*
* @param accelerometer Accelerometer
* @return float
*/
public static float calculateGeometricMeanAcceleration(Accelerometer accelerometer) {
float x = accelerometer.getX();
float y = accelerometer.getY();
float z = accelerometer.getZ();
return (float) Math.sqrt(x * x + y * y + z * z);
}
/**
* calculate geometric mean angularVelocity
*
* @param angularVelocity AngularVelocity
* @return float
*/
public static float calculateGeometricMeanAngular(AngularVelocity angularVelocity) {
float x = angularVelocity.getX();
float y = angularVelocity.getY();
float z = angularVelocity.getZ();
return (float) Math.sqrt(x * x + y * y + z * z);
}
}