m_quat_driv = m_quat_driv + (quat_diff * (TYPE) m_gyro_dt * (TYPE) PI);
m_quat_driv.quat_normalize();
+
quat_output = phase_correction(m_quat_driv, m_quat_aid);
+ m_quaternion = quat_output;
+
orientation = quat2euler(quat_output);
m_orientation.m_ang.m_vec[0] = orientation.m_ang.m_vec[0] * m_pitch_phase_compensation;
return m_rot_matrix;
}
+template <typename TYPE>
+quaternion<TYPE> orientation_filter<TYPE>::get_quaternion(const sensor_data<TYPE> accel,
+ const sensor_data<TYPE> gyro, const sensor_data<TYPE> magnetic)
+{
+
+ get_orientation(accel, gyro, magnetic);
+
+ return m_quaternion;
+}
+
#endif //_ORIENTATION_FILTER_H_
quaternion<TYPE> m_quat_driv;
rotation_matrix<TYPE> m_rot_matrix;
euler_angles<TYPE> m_orientation;
+ quaternion<TYPE> m_quaternion;
TYPE m_gyro_dt;
int m_pitch_phase_compensation;
const sensor_data<TYPE> gyro, const sensor_data<TYPE> magnetic);
rotation_matrix<TYPE> get_rotation_matrix(const sensor_data<TYPE> accel,
const sensor_data<TYPE> gyro, const sensor_data<TYPE> magnetic);
+ quaternion<TYPE> get_quaternion(const sensor_data<TYPE> accel,
+ const sensor_data<TYPE> gyro, const sensor_data<TYPE> magnetic);
};
#include "orientation_filter.cpp"
rotation_matrix<float> orientation_sensor::get_rotation_matrix(sensor_data<float> accel_data,
sensor_data<float> gyro_data, sensor_data<float> magnetic_data)
{
-
pre_process_data(accel_data, accel_data, bias_accel, sign_accel, scale_accel);
normalize(accel_data);
pre_process_data(gyro_data, gyro_data, bias_gyro, sign_gyro, scale_gyro);
return orien_filter.get_rotation_matrix(accel_data, gyro_data, magnetic_data);
}
+quaternion<float> orientation_sensor::get_quaternion(sensor_data<float> accel_data,
+ sensor_data<float> gyro_data, sensor_data<float> magnetic_data)
+{
+ pre_process_data(accel_data, accel_data, bias_accel, sign_accel, scale_accel);
+ normalize(accel_data);
+ pre_process_data(gyro_data, gyro_data, bias_gyro, sign_gyro, scale_gyro);
+ pre_process_data(magnetic_data, magnetic_data, bias_magnetic, sign_magnetic, scale_magnetic);
+ normalize(magnetic_data);
+
+ orien_filter.m_pitch_phase_compensation = pitch_phase_compensation;
+ orien_filter.m_roll_phase_compensation = roll_phase_compensation;
+ orien_filter.m_azimuth_phase_compensation = azimuth_phase_compensation;
+ orien_filter.m_magnetic_alignment_factor = magnetic_alignment_factor;
+
+ return orien_filter.get_quaternion(accel_data, gyro_data, magnetic_data);
+}
+
#endif
sensor_data<float> gyro, sensor_data<float> magnetic);
rotation_matrix<float> get_rotation_matrix(sensor_data<float> accel,
sensor_data<float> gyro, sensor_data<float> magnetic);
+ quaternion<float> get_quaternion(sensor_data<float> accel,
+ sensor_data<float> gyro, sensor_data<float> magnetic);
};
#include "orientation_sensor.cpp"
unsigned long long time_stamp;
euler_angles<float> orientation;
rotation_matrix<float> orientation_mat;
- orientation_sensor orien_sensor1, orien_sensor2;
+ quaternion<float> orientation_quat;
+ orientation_sensor orien_sensor1, orien_sensor2, orien_sensor3;
accel_in.open(((string)ORIENTATION_DATA_PATH + (string)"accel.txt").c_str());
gyro_in.open(((string)ORIENTATION_DATA_PATH + (string)"gyro.txt").c_str());
cout << "Orientation angles\t" << orientation.m_ang << "\n\n";
- orientation_mat = orien_sensor1.get_rotation_matrix(accel_data, gyro_data, magnetic_data);
+ orientation_mat = orien_sensor2.get_rotation_matrix(accel_data, gyro_data, magnetic_data);
cout << "Orientation matrix\t" << orientation_mat.m_rot_mat << "\n\n";
+
+ orientation_quat = orien_sensor3.get_quaternion(accel_data, gyro_data, magnetic_data);
+
+ cout << "Orientation quaternion\t" << orientation_quat.m_quat << "\n\n";
}
accel_in.close();