Skip to content

Commit 784c4eb

Browse files
Added functionality to fine tune sensor orientation.
1 parent fc7aa5d commit 784c4eb

File tree

1 file changed

+39
-10
lines changed

1 file changed

+39
-10
lines changed

NAV_Algorithms/organizer.h

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,20 +64,21 @@ class organizer_t
6464
u_front_sensor.normalize();
6565

6666
// calculate the new rotation matrix using our calibration data
67-
sensor_mapping.e[0][0]=u_front_sensor[0];
68-
sensor_mapping.e[0][1]=u_front_sensor[1];
69-
sensor_mapping.e[0][2]=u_front_sensor[2];
67+
float3matrix new_sensor_mapping;
68+
new_sensor_mapping.e[0][0]=u_front_sensor[0];
69+
new_sensor_mapping.e[0][1]=u_front_sensor[1];
70+
new_sensor_mapping.e[0][2]=u_front_sensor[2];
7071

71-
sensor_mapping.e[1][0]=u_right_sensor[0];
72-
sensor_mapping.e[1][1]=u_right_sensor[1];
73-
sensor_mapping.e[1][2]=u_right_sensor[2];
72+
new_sensor_mapping.e[1][0]=u_right_sensor[0];
73+
new_sensor_mapping.e[1][1]=u_right_sensor[1];
74+
new_sensor_mapping.e[1][2]=u_right_sensor[2];
7475

75-
sensor_mapping.e[2][0]=u_down_sensor[0];
76-
sensor_mapping.e[2][1]=u_down_sensor[1];
77-
sensor_mapping.e[2][2]=u_down_sensor[2];
76+
new_sensor_mapping.e[2][0]=u_down_sensor[0];
77+
new_sensor_mapping.e[2][1]=u_down_sensor[1];
78+
new_sensor_mapping.e[2][2]=u_down_sensor[2];
7879

7980
quaternion<float> q;
80-
q.from_rotation_matrix( sensor_mapping);
81+
q.from_rotation_matrix( new_sensor_mapping);
8182
eulerangle<float> euler = q;
8283

8384
// make the change permanent
@@ -88,6 +89,34 @@ class organizer_t
8889
lock_EEPROM( true);
8990
}
9091

92+
void fine_tune_sensor_orientation( const vector_average_collection_t & values)
93+
{
94+
float3vector observed_body_acc = sensor_mapping * values.acc_observed_level;
95+
float pitch_correction = - ATAN2( - observed_body_acc[FRONT], - observed_body_acc[DOWN]);
96+
float roll_correction = + ATAN2( - observed_body_acc[RIGHT], - observed_body_acc[DOWN]);
97+
98+
quaternion<float> q_correction;
99+
q_correction.from_euler( roll_correction, pitch_correction, ZERO);
100+
101+
quaternion<float> q_present_setting;
102+
q_present_setting.from_euler (
103+
configuration (SENS_TILT_ROLL),
104+
configuration (SENS_TILT_PITCH),
105+
configuration (SENS_TILT_YAW));
106+
107+
quaternion<float> q_new_setting;
108+
q_new_setting = q_correction * q_present_setting;
109+
110+
eulerangle<float> new_euler = q_new_setting;
111+
112+
// make the change permanent
113+
lock_EEPROM( false);
114+
write_EEPROM_value( SENS_TILT_ROLL, new_euler.roll);
115+
write_EEPROM_value( SENS_TILT_PITCH, new_euler.pitch);
116+
write_EEPROM_value( SENS_TILT_YAW, new_euler.yaw);
117+
lock_EEPROM( true);
118+
}
119+
91120
void initialize_before_measurement( void)
92121
{
93122
pitot_offset= configuration (PITOT_OFFSET);

0 commit comments

Comments
 (0)