code of robot bike

Dependencies:   SDFileSystem mbed

Fork of Robot_Bicycle by Chris LU

Revision:
0:830ddddc129f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SensorFusion.cpp	Thu Jun 09 09:46:38 2016 +0000
@@ -0,0 +1,229 @@
+#include "SensorFusion.h"
+#include "SPI_9dSensor.h"
+#include "RobotBicycleConst.h"
+#include <math.h>
+
+///Gyro and Acce data
+float axm = 0.0f;
+float aym = 0.0f;
+float azm = 0.0f;
+float u1 = 0.0f;
+float u2 = 0.0f;
+float u3 = 0.0f;
+float mx = 0.0f;
+float my = 0.0f;
+float mz = 0.0f;
+float Ac[3] = {0.0f, 0.0f, 0.0f};
+
+float axm_f = 0.0f;
+float axm_f_old = 0.0f;
+float u3aym_f = 0.0f;
+float u3aym_f_old = 0.0f;
+float u2azm_f = 0.0f;
+float u2azm_f_old = 0.0f;
+
+float aym_f = 0.0f;
+float aym_f_old = 0.0f;
+float u3axm_f = 0.0f;
+float u3axm_f_old = 0.0f;
+float u1azm_f = 0.0f;
+float u1azm_f_old = 0.0f;
+
+float azm_f = 0.0f;
+float azm_f_old = 0.0f;
+float u2axm_f = 0.0f;
+float u2axm_f_old = 0.0f;
+float u1aym_f = 0.0f;
+float u1aym_f_old = 0.0f;
+
+float x1_hat = 0.0f;
+float x2_hat = 0.0f;
+float x3_hat = 0.0f;
+float sinroll = 0.0f;
+float cosroll = 0.0f;
+float roll_angle = 0.0f;
+float droll_angle= 0.0f;
+float droll_angle_old= 0.0f;
+float sinpitch = 0.0f;
+float cospitch = 0.0f;
+float yaw_ref = 0.0f;
+float yaw_angle = 0.0f;
+float yaw_angle_old = 0.0f;
+float dyaw_angle = 0.0f;
+float dyaw_angle_old = 0.0f;
+
+///magnetometer's data
+float mx_f = 0.0f;
+float mx_f_old = 0.0f;
+float u3my_f = 0.0f;
+float u3my_f_old = 0.0f;
+float u2mz_f = 0.0f;
+float u2mz_f_old = 0.0f;
+
+float my_f = 0.0f;
+float my_f_old = 0.0f;
+float u3mx_f = 0.0f;
+float u3mx_f_old = 0.0f;
+float u1mz_f = 0.0f;
+float u1mz_f_old = 0.0f;
+
+float mz_f = 0.0f;
+float mz_f_old = 0.0f;
+float u2mx_f = 0.0f;
+float u2mx_f_old = 0.0f;
+float u1my_f = 0.0f;
+float u1my_f_old = 0.0f;
+
+float mx1_hat = 0.0f;
+float mx2_hat = 0.0f;
+float mx3_hat = 0.0f;
+float m_sinyaw = 0.0f;
+float m_cosyaw = 0.0f;
+float m_yaw_angle = 0.0f;
+
+void get_9axis_data(unsigned char speed_state)
+{
+    Ac[0] = l_rs * Gyro_scale[2] * Gyro_scale[2];
+    if(speed_state == 3) Ac[1] = (-1.0) * v_high * Gyro_scale[2];
+    else if(speed_state == 2) Ac[1] = (-1.0) * v_low * Gyro_scale[2];
+    else Ac[1] = 0.0;///(-1.0) * Vx * Gyro_scale[2];///
+    Ac[2] = 0.0;
+
+    axm = Acce_scale[0] - Ac[0];
+    aym = Acce_scale[1] - Ac[1];
+    azm = Acce_scale[2];
+    u1  = Gyro_scale[0];
+    u2  = Gyro_scale[1];
+    u3  = Gyro_scale[2];
+    mx  = Magn_scale[0];
+    my  = Magn_scale[1];
+    mz  = Magn_scale[2]*(-1);
+    B_total = sqrt(mx*mx+my*my+mz*mz);
+}
+
+float lpf(float input,float input_old,float frequency)
+{
+    float output = 0;
+    output = input*frequency*sample_time+input_old*(1-frequency*sample_time);
+    return output;
+}
+
+void x1_hat_estimat(float a_xm,float a_ym,float a_zm,float u_3,float u_2,float alpha)
+{
+    axm_f = lpf(a_xm,axm_f_old,alpha);
+    axm_f_old = axm_f;
+    u3aym_f = lpf(u_3*a_ym,u3aym_f_old,alpha);
+    u3aym_f_old = u3aym_f;
+    u2azm_f = lpf(u_2*a_zm,u2azm_f_old,alpha);
+    u2azm_f_old = u2azm_f;
+
+    x1_hat = axm_f + u3aym_f/alpha - u2azm_f/alpha;
+}
+
+void roll_fusion(float a_xm,float a_ym,float a_zm,float u_3,float u_1,float alpha)
+{
+    aym_f = lpf(a_ym,aym_f_old,alpha);
+    aym_f_old = aym_f;
+    u3axm_f = lpf(u_3*a_xm,u3axm_f_old,alpha);
+    u3axm_f_old = u3axm_f;
+    u1azm_f = lpf(u_1*a_zm,u1azm_f_old,alpha);
+    u1azm_f_old = u1azm_f;
+
+    x2_hat = -u3axm_f/alpha + aym_f + u1azm_f/alpha;
+    sinroll = x2_hat*(-0.1020);
+    if(sinroll >= 1.0f)
+    {
+        sinroll = 1.0;
+        cosroll = 0.0;
+    }
+    else if(sinroll <= -1.0f)
+    {
+        sinroll = -1.0;
+        cosroll = 0.0;
+    }
+    else cosroll = sqrt(1-(sinroll*sinroll));
+
+    roll_angle = asin(sinroll);///By 312 Rotation
+}
+
+void x3_hat_estimat(float a_xm,float a_ym,float a_zm,float u_2,float u_1,float alpha)
+{
+    u2axm_f = lpf(u_2*a_xm,u2axm_f_old,alpha);
+    u2axm_f_old = u2axm_f;
+    u1aym_f = lpf(u_1*a_ym,u1aym_f_old,alpha);
+    u1aym_f_old = u1aym_f;
+    azm_f = lpf(a_zm,azm_f_old,alpha);
+    azm_f_old = azm_f;
+
+    x3_hat = u2axm_f/alpha - u1aym_f/alpha + azm_f;
+}
+
+void m_x1_hat(float m_x, float m_y,float m_z,float u_3,float u_2,float alpha)
+{
+    mx_f = lpf(m_x,mx_f_old,alpha);
+    mx_f_old = mx_f;
+    u3my_f = lpf(u_3*m_y,u3my_f_old,alpha);
+    u3my_f_old = u3my_f;
+    u2mz_f = lpf(u_2*m_z,u2mz_f_old,alpha);
+    u2mz_f_old = u2mz_f;
+
+    mx1_hat = (mx_f + u3my_f/alpha - u2mz_f/alpha)/B_total;
+}
+
+void m_x2_hat(float m_x,float m_y,float m_z,float u_3,float u_1,float alpha)
+{
+    my_f = lpf(m_y,my_f_old,alpha);
+    my_f_old = my_f;
+    u3mx_f = lpf(u_3*m_x,u3mx_f_old,alpha);
+    u3mx_f_old = u3mx_f;
+    u1mz_f = lpf(u_1*m_z,u1mz_f_old,alpha);
+    u1mz_f_old = u1mz_f;
+
+    mx2_hat = (my_f - u3mx_f/alpha + u1mz_f/alpha)/B_total;
+}
+
+void m_x3_hat(float m_x,float m_y,float m_z,float u_2,float u_1,float alpha)
+{
+    u2mx_f = lpf(u_2*m_x,u2mx_f_old,alpha);
+    u2mx_f_old = u2mx_f;
+    u1my_f = lpf(u_1*m_y,u1my_f_old,alpha);
+    u1my_f_old = u1my_f;
+    mz_f = lpf(m_z,mz_f_old,alpha);
+    mz_f_old = mz_f;
+
+    mx3_hat = (u2mx_f/alpha - u1my_f/alpha + mz_f)/B_total;
+}
+
+void m_yaw_fusion(void)
+{
+    float delta, delta_1, delta_2;
+
+    delta = Determinant((B_x*cospitch+B_y*sinpitch*sinroll), (B_y*cospitch-B_x*sinpitch*sinroll), (B_y*cosroll), (-B_x*cosroll));
+    delta_1 = Determinant((mx1_hat+B_z*sinpitch*cosroll), (B_y*cospitch-B_x*sinpitch*sinroll), (mx2_hat-B_z*sinroll), (-B_x*cosroll));
+    delta_2 = Determinant((B_x*cospitch+B_y*sinpitch*sinroll), (mx1_hat+B_z*sinpitch*cosroll), (B_y*cosroll), (mx2_hat-B_z*sinroll));
+    ///B_y = 0
+//    delta = Determinant((B_x*cospitch), (-B_x*sinpitch*sinroll), (0.0), (-B_x*cosroll));
+//    delta_1 = Determinant((mx1_hat+B_z*sinpitch*cosroll), (-B_x*sinpitch*sinroll), (mx2_hat-B_z*sinroll), (-B_x*cosroll));
+//    delta_2 = Determinant((B_x*cospitch), (mx1_hat+B_z*sinpitch*cosroll), (0.0), (mx2_hat-B_z*sinroll));
+
+    m_cosyaw = delta_1/delta;
+    m_sinyaw = delta_2/delta;
+}
+
+float Determinant(float x11, float x12, float x21, float x22)
+{
+    return (x11*x22 - x12*x21);
+}
+
+float absolute(float value)
+{
+    if(value < 0)return -value;
+    else return value;
+}
+
+void Reset_data(void)
+{
+    axm_f = axm_f_old = u3aym_f = u3aym_f_old = u2azm_f = u2azm_f_old = 0.0;
+    aym_f = aym_f_old = u3axm_f = u3axm_f_old = u1azm_f = u1azm_f_old = 0.0;
+    azm_f = azm_f_old = u2axm_f = u2axm_f_old = u1aym_f = u1aym_f_old = 0.0;
+}