Forum Xamarin.iOS

Calculating Lean Angle with core motion of iOS device

ADeCraemerADeCraemer USMember ✭✭
edited October 2015 in Xamarin.iOS

Hi all,

I am trying to calculate the lean angle/inclination of my iOS device. I did a lot of research and found a way how to give me the most accurate lean angle/inclincation. I used quaternion to calculate it.

This is the code that I use to calculate it.

public void CalculateLeanAngle ()

{           
    motionManager = new CMMotionManager ();
    motionManager.DeviceMotionUpdateInterval = 0.02; 
    if (motionManager.DeviceMotionAvailable) {
        motionManager.StartDeviceMotionUpdates (CMAttitudeReferenceFrame.XArbitraryZVertical, NSOperationQueue.CurrentQueue, (data, error) => { 
            CMQuaternion quat = motionManager.DeviceMotion.Attitude.Quaternion;
            double x = quat.x;
            double y = quat.y;
            double w = quat.w;
            double z = quat.z;
            double degrees = 0.0;

            //Roll
            double roll = Math.Atan2 (2 * y * w - 2 * x * z, 1 - 2 * y * y - 2 * z * z);                        
            Console.WriteLine("Roll: " + Math.Round(-roll * 180.0/Constants.M_PI));
            degrees = Math.Round (-applyKalmanFiltering (roll) * 180.0 / Constants.M_PI);

            string degreeStr = string.Concat (degrees.ToString (), "°");
            this.LeanAngleLbl.Text = degreeStr;
    });
}

public double applyKalmanFiltering (double yaw)

{
    // kalman filtering
    if (motionLastYaw == 0) {
        motionLastYaw = yaw;
    }

    float q = 0.1f;   // process noise
    float r = 0.1f;   // sensor noise
    float p = 0.1f;   // estimated error
    float k = 0.5f;   // kalman filter gain

    double x = motionLastYaw;
    p = p + q;
    k = p / (p + r);
    x = x + k * (yaw - x);
    p = (1 - k) * p;
    motionLastYaw = x;

    return motionLastYaw;
}

This works perfect when you walk and tilt your device. But when I drive my car something happens that the quaternion isn't giving me the correct lean angle/inclincation. It just gives me 180°.. Or suddenly it shows me a totally wrong lean angle/inclination.. Like when I am standing still (at trafic lights) it shows me 23°... Then after driving a bit it works again or it shows again 180°.

Could it be that the quaternion is effected by the acceleration of my car? So that because my car is driving at a certain speed it isn't giving me the correct value?

Does anyone have any solution for this? I would like to calculate my lean angle/inclincation when I drive my bike/car. So I really want to know how to calulate the right lean angle/inclincation independent if I drive my car/bike or not.

Thanks in advance!!

Answers

  • AngryKebabAngryKebab NGMember ✭✭

    Hi there!

    Was looking for a way to get the angle of a phone and saw many different ways online but none of them gave me exactly what I was looking for till I saw your post. I don't normally comment but I signed in this time just so I can saythis:

    Thank you! Years later and your post helped someone else.

    Hope you found the solution to your problem eventually.

Sign In or Register to comment.