m_orientation_filter.m_azimuth_phase_compensation = m_azimuth_rotation_compensation;
m_orientation_filter.m_magnetic_alignment_factor = m_magnetic_alignment_factor;
- euler_orientation = m_orientation_filter.get_orientation(&m_accel, &m_gyro, &m_magnetic);
+ m_orientation_filter.get_device_orientation(&m_accel, &m_gyro, &m_magnetic);
+
+ euler_orientation = m_orientation_filter.m_orientation;
if(m_raw_data_unit == "DEGREES") {
euler_orientation = rad2deg(euler_orientation);
m_orientation_filter_poll.m_azimuth_phase_compensation = m_azimuth_rotation_compensation;
m_orientation_filter_poll.m_magnetic_alignment_factor = m_magnetic_alignment_factor;
- euler_orientation = m_orientation_filter_poll.get_orientation(&m_accel, &m_gyro, &m_magnetic);
+ m_orientation_filter_poll.get_device_orientation(&m_accel, &m_gyro, &m_magnetic);
+
+ euler_orientation = m_orientation_filter_poll.m_orientation;
if(m_raw_data_unit == "DEGREES") {
euler_orientation = rad2deg(euler_orientation);
if (m_enable_gaming_rv == GAMING_RV_ENABLED) {
m_enable_gaming_rv = 0;
- quaternion_gaming_rv = m_orientation_filter.get_gaming_quaternion(&m_accel, &m_gyro);
+ m_orientation_filter.get_device_orientation(&m_accel, &m_gyro, NULL);
+
+ quaternion_gaming_rv = m_orientation_filter.m_quat_gaming_rv;
m_time = get_timestamp();
rv_event.sensor_id = get_id();
accel.m_time_stamp = accel_data.timestamp;
gyro.m_time_stamp = gyro_data.timestamp;
- quaternion_gaming_rv = m_orientation_filter_poll.get_gaming_quaternion(&m_accel, &m_gyro);
+ m_orientation_filter_poll.get_device_orientation(&m_accel, &m_gyro, NULL);
+
+ quaternion_gaming_rv = m_orientation_filter_poll.m_quat_gaming_rv;
data.accuracy = SENSOR_ACCURACY_GOOD;
data.timestamp = get_timestamp();
m_orientation_filter.m_magnetic_alignment_factor = m_magnetic_alignment_factor;
- quaternion_geo_rv = m_orientation_filter.get_geomagnetic_quaternion(&m_accel, &m_magnetic);
+ m_orientation_filter.get_device_orientation(&m_accel, NULL, &m_magnetic);
+
+ quaternion_geo_rv = m_orientation_filter.m_quat_aid;
m_time = get_timestamp();
rv_event.sensor_id = get_id();
m_orientation_filter_poll.m_magnetic_alignment_factor = m_magnetic_alignment_factor;
- quaternion_geo_rv = m_orientation_filter_poll.get_geomagnetic_quaternion(&m_accel, &m_magnetic);
+ m_orientation_filter_poll.get_device_orientation(&m_accel, NULL, &m_magnetic);
+
+ quaternion_geo_rv = m_orientation_filter_poll.m_quat_aid;
data.accuracy = SENSOR_ACCURACY_GOOD;
data.timestamp = get_timestamp();
m_orientation_filter.m_azimuth_phase_compensation = m_azimuth_rotation_compensation;
m_orientation_filter.m_magnetic_alignment_factor = m_magnetic_alignment_factor;
- quaternion_orientation = m_orientation_filter.get_9axis_quaternion(&m_accel, &m_gyro, &m_magnetic);
+ m_orientation_filter.get_device_orientation(&m_accel, &m_gyro, &m_magnetic);
+
+ quaternion_orientation = m_orientation_filter.m_quat_9axis;
m_time = get_timestamp();
rv_event.sensor_id = get_id();
m_orientation_filter_poll.m_azimuth_phase_compensation = m_azimuth_rotation_compensation;
m_orientation_filter_poll.m_magnetic_alignment_factor = m_magnetic_alignment_factor;
- quaternion_orientation = m_orientation_filter_poll.get_9axis_quaternion(&m_accel, &m_gyro, &m_magnetic);
+ m_orientation_filter_poll.get_device_orientation(&m_accel, &m_gyro, &m_magnetic);
+
+ quaternion_orientation = m_orientation_filter_poll.m_quat_9axis;
data.accuracy = SENSOR_ACCURACY_GOOD;
data.timestamp = get_timestamp();
inline void orientation_filter<TYPE>::initialize_sensor_data(const sensor_data<TYPE> *accel,
const sensor_data<TYPE> *gyro, const sensor_data<TYPE> *magnetic)
{
- if (accel != NULL) {
- m_accel.m_data = accel->m_data;
- m_accel.m_time_stamp = accel->m_time_stamp;
-
- normalize(m_accel);
- }
+ m_accel.m_data = accel->m_data;
+ m_accel.m_time_stamp = accel->m_time_stamp;
+ normalize(m_accel);
if (gyro != NULL) {
unsigned long long sample_interval_gyro = SAMPLE_INTV;
m_magnetic.m_data = magnetic->m_data;
m_magnetic.m_time_stamp = magnetic->m_time_stamp;
}
-
}
template <typename TYPE>
quat_output = phase_correction(m_quat_driv, m_quat_aid);
m_quat_9axis = quat_output;
+ m_quat_gaming_rv = m_quat_9axis;
orientation = quat2euler(quat_output);
}
template <typename TYPE>
-euler_angles<TYPE> orientation_filter<TYPE>::get_device_rotation(const sensor_data<TYPE> *accel,
+void orientation_filter<TYPE>::get_device_orientation(const sensor_data<TYPE> *accel,
const sensor_data<TYPE> *gyro, const sensor_data<TYPE> *magnetic)
{
initialize_sensor_data(accel, gyro, magnetic);
if (magnetic != NULL)
orientation_triad_algorithm();
- else if(gyro != NULL)
+ else if (gyro != NULL)
compute_accel_orientation();
if (gyro != NULL) {
compute_covariance();
- if(magnetic != NULL)
+ if (magnetic != NULL)
time_update();
else
time_update_gaming_rv();
measurement_update();
}
-
- return m_orientation;
-}
-
-template <typename TYPE>
-euler_angles<TYPE> orientation_filter<TYPE>::get_orientation(const sensor_data<TYPE> *accel,
- const sensor_data<TYPE> *gyro, const sensor_data<TYPE> *magnetic)
-{
- get_device_rotation(accel, gyro, magnetic);
-
- return m_orientation;
-}
-
-template <typename TYPE>
-rotation_matrix<TYPE> orientation_filter<TYPE>::get_rotation_matrix(const sensor_data<TYPE> *accel,
- const sensor_data<TYPE> *gyro, const sensor_data<TYPE> *magnetic)
-{
- get_device_rotation(accel, gyro, magnetic);
-
- return m_rot_matrix;
}
-template <typename TYPE>
-quaternion<TYPE> orientation_filter<TYPE>::get_9axis_quaternion(const sensor_data<TYPE> *accel,
- const sensor_data<TYPE> *gyro, const sensor_data<TYPE> *magnetic)
-{
-
- get_device_rotation(accel, gyro, magnetic);
-
- return m_quat_9axis;
-}
-
-template <typename TYPE>
-quaternion<TYPE> orientation_filter<TYPE>::get_geomagnetic_quaternion(const sensor_data<TYPE> *accel,
- const sensor_data<TYPE> *magnetic)
-{
- get_device_rotation(accel, NULL, magnetic);
-
- return m_quat_aid;
-}
-
-template <typename TYPE>
-quaternion<TYPE> orientation_filter<TYPE>::get_gaming_quaternion(const sensor_data<TYPE> *accel,
- const sensor_data<TYPE> *gyro)
-{
- get_device_rotation(accel, gyro, NULL);
-
- return m_quat_gaming_rv;
-}
#endif //_ORIENTATION_FILTER_H_
inline void time_update_gaming_rv();
inline void measurement_update();
- euler_angles<TYPE> get_orientation(const sensor_data<TYPE> *accel,
- 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_9axis_quaternion(const sensor_data<TYPE> *accel,
- const sensor_data<TYPE> *gyro, const sensor_data<TYPE> *magnetic);
- quaternion<TYPE> get_geomagnetic_quaternion(const sensor_data<TYPE> *accel,
- const sensor_data<TYPE> *magnetic);
- quaternion<TYPE> get_gaming_quaternion(const sensor_data<TYPE> *accel,
- const sensor_data<TYPE> *gyro);
- euler_angles<TYPE> get_device_rotation(const sensor_data<TYPE> *accel,
+ void get_device_orientation(const sensor_data<TYPE> *accel,
const sensor_data<TYPE> *gyro, const sensor_data<TYPE> *magnetic);
};
int sign_gyro[] = {+1, +1, +1};
int sign_magnetic[] = {+1, +1, +1};
float scale_accel = 1;
-float scale_gyro = 575;
+float scale_gyro = 1150;
float scale_magnetic = 1;
int pitch_phase_compensation = -1;
data_out->m_time_stamp = data_in->m_time_stamp;
}
-euler_angles<float> orientation_sensor::get_orientation(sensor_data<float> *accel_data,
+void orientation_sensor::get_device_orientation(sensor_data<float> *accel_data,
sensor_data<float> *gyro_data, sensor_data<float> *magnetic_data)
{
orien_filter.m_azimuth_phase_compensation = azimuth_phase_compensation;
orien_filter.m_magnetic_alignment_factor = magnetic_alignment_factor;
- return orien_filter.get_orientation(accel_data, gyro_data, magnetic_data);
+ orien_filter.get_device_orientation(accel_data, gyro_data, magnetic_data);
}
-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);
- 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_rotation_matrix(accel_data, gyro_data, magnetic_data);
-}
-
-quaternion<float> orientation_sensor::get_9axis_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_9axis_quaternion(accel_data, gyro_data, magnetic_data);
-}
-
-quaternion<float> orientation_sensor::get_geomagnetic_quaternion(sensor_data<float> *accel_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(magnetic_data, magnetic_data, bias_magnetic, sign_magnetic, scale_magnetic);
- normalize(*magnetic_data);
-
- return orien_filter.get_geomagnetic_quaternion(accel_data, magnetic_data);
-}
-
-
-quaternion<float> orientation_sensor::get_gaming_quaternion(sensor_data<float> *accel_data,
- sensor_data<float> *gyro_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_gaming_quaternion(accel_data, gyro_data);
-}
#endif
public:
orientation_filter<float> orien_filter;
- euler_angles<float> get_orientation(sensor_data<float> *accel,
+ void get_device_orientation(sensor_data<float> *accel,
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_9axis_quaternion(sensor_data<float> *accel,
- sensor_data<float> *gyro, sensor_data<float> *magnetic);
- quaternion<float> get_geomagnetic_quaternion(sensor_data<float> *accel,
- sensor_data<float> *magnetic);
- quaternion<float> get_gaming_quaternion(sensor_data<float> *accel,
- sensor_data<float> *gyro);
};
#include "orientation_sensor.cpp"
quaternion<float> orientation_9axis_quat;
quaternion<float> orientation_geomagnetic_quat;
quaternion<float> orientation_gaming_quat;
- orientation_sensor orien_sensor1, orien_sensor2, orien_sensor3, orien_sensor4, orien_sensor5;
+ orientation_sensor orien_sensor;
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 << "Magnetic Data\t" << magnetic_data.m_data << "\t Time Stamp\t" << magnetic_data.m_time_stamp << "\n\n";
- orientation = orien_sensor1.get_orientation(&accel_data, &gyro_data, &magnetic_data);
+ orien_sensor.get_device_orientation(&accel_data, &gyro_data, &magnetic_data);
- orien_file << orientation.m_ang;
+ orien_file << orien_sensor.orien_filter.m_orientation.m_ang;
- cout << "Orientation angles\t" << orientation.m_ang << "\n\n";
+ cout << "Orientation angles\t" << orien_sensor.orien_filter.m_orientation.m_ang << "\n\n";
- orientation_mat = orien_sensor2.get_rotation_matrix(&accel_data, &gyro_data, &magnetic_data);
+ cout << "Orientation matrix\t" << orien_sensor.orien_filter.m_rot_matrix.m_rot_mat << "\n\n";
- cout << "Orientation matrix\t" << orientation_mat.m_rot_mat << "\n\n";
+ cout << "Orientation 9-axis quaternion\t" << orien_sensor.orien_filter.m_quat_9axis.m_quat << "\n\n";
- orientation_9axis_quat = orien_sensor3.get_9axis_quaternion(&accel_data, &gyro_data, &magnetic_data);
+ cout << "Orientation geomagnetic quaternion\t" << orien_sensor.orien_filter.m_quat_aid.m_quat << "\n\n";
- cout << "Orientation 9-axis quaternion\t" << orientation_9axis_quat.m_quat << "\n\n";
-
- orientation_geomagnetic_quat = orien_sensor4.get_geomagnetic_quaternion(&accel_data, &magnetic_data);
-
- cout << "Orientation geomagnetic quaternion\t" << orientation_geomagnetic_quat.m_quat << "\n\n";
-
- orientation_gaming_quat = orien_sensor5.get_gaming_quaternion(&accel_data, &gyro_data);
-
- cout << "Orientation gaming quaternion\t" << orientation_gaming_quat.m_quat << "\n\n";
+ cout << "Orientation gaming quaternion\t" << orien_sensor.orien_filter.m_quat_gaming_rv.m_quat << "\n\n";
}
accel_in.close();