@@ -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