@@ -43,6 +43,11 @@ void Position_finder_init(Position_finder *position_finder, Position3D* beacon_p
43
43
44
44
void Position_finder_find_position (Position_finder * position_finder , VIVE_sensors_data * vive_sensors_data ) {
45
45
Position2D * led_positions [8 ];
46
+ double * heading_values = NULL ;
47
+
48
+ for (int i = 0 ; i < 8 ; i ++ ) {
49
+ led_positions [i ] = NULL ;
50
+ }
46
51
47
52
// Update data
48
53
if (vive_sensors_data -> axis == VERTICAL_AXIS ) {
@@ -59,7 +64,7 @@ void Position_finder_find_position(Position_finder *position_finder, VIVE_sensor
59
64
60
65
// Process LED angles
61
66
for (int i = 0 ; i < 8 ; i ++ ) {
62
- if (position_finder -> vive_sensors_data_h -> angles [i ] == ANGLE_invalid_value || position_finder -> vive_sensors_data_v -> angles [i ] == ANGLE_invalid_value )
67
+ if (isnan ( position_finder -> vive_sensors_data_h -> angles [i ]) || isnan ( position_finder -> vive_sensors_data_v -> angles [i ]) )
63
68
continue ;
64
69
65
70
double v_angle = position_finder -> beacon_position -> alpha + position_finder -> vive_sensors_data_v -> angles [i ];
@@ -76,11 +81,14 @@ void Position_finder_find_position(Position_finder *position_finder, VIVE_sensor
76
81
double sum = 0 ;
77
82
int nb_couple = 0 ;
78
83
79
- for (int i = 0 ; i < 8 ; i ++ ) {
80
- for (int j = i + 1 ; j < 8 ; j ++ ) {
84
+ for (int i = 0 ; i < 8 ; i += 2 ) {
85
+ for (int j = i + 2 ; j < 8 ; j += 2 ) {
81
86
if (led_positions [i ] == NULL || led_positions [j ] == NULL )
82
87
continue ;
83
88
89
+ if (isnan (led_positions [i ]-> x ) || isnan (led_positions [i ]-> y ) || isnan (led_positions [j ]-> x ) || isnan (led_positions [j ]-> y ))
90
+ continue ;
91
+
84
92
double applied_delta_x = led_positions [j ]-> x - led_positions [i ]-> x ;
85
93
double applied_delta_y = led_positions [j ]-> y - led_positions [i ]-> y ;
86
94
double applied_angle = atan2 (applied_delta_y , applied_delta_x );
@@ -89,8 +97,9 @@ void Position_finder_find_position(Position_finder *position_finder, VIVE_sensor
89
97
double theorical_delta_y = position_finder -> tracker_led_offset [j ][Y_AXIS ] - position_finder -> tracker_led_offset [i ][Y_AXIS ];
90
98
double theorical_angle = atan2 (theorical_delta_y , theorical_delta_x );
91
99
92
- sum += Position_finder_normalize_angle (applied_angle - theorical_angle );
93
100
nb_couple ++ ;
101
+ heading_values = (double * ) realloc (heading_values , nb_couple * sizeof (double ));
102
+ heading_values [nb_couple - 1 ] = Position_finder_normalize_angle (applied_angle - theorical_angle );
94
103
}
95
104
}
96
105
@@ -100,7 +109,19 @@ void Position_finder_find_position(Position_finder *position_finder, VIVE_sensor
100
109
free (current_led_position );
101
110
}
102
111
103
- position_finder -> current_position .a = sum / nb_couple ;
112
+ if (nb_couple > 1 ) {
113
+ // -- Median filter --
114
+ qsort (heading_values , nb_couple , sizeof (double ), Position_finder_compare ); // sort
115
+
116
+ if ((nb_couple % 2 ) == 0 ) // If length of heading_values is even
117
+ position_finder -> current_position .a = (heading_values [(int ) floor (nb_couple /2.0 )] + heading_values [(int ) ceil (nb_couple /2.0 )]) / 2 ;
118
+ else
119
+ position_finder -> current_position .a = heading_values [nb_couple /2 ];
120
+ } else if (nb_couple == 1 ) {
121
+ position_finder -> current_position .a = heading_values [0 ];
122
+ }
123
+ else
124
+ position_finder -> current_position .a = NAN ;
104
125
}
105
126
106
127
double Position_finder_normalize_angle (double angle ) {
@@ -112,4 +133,21 @@ double Position_finder_normalize_angle(double angle) {
112
133
113
134
return angle ;
114
135
}
136
+
137
+ static int Position_finder_compare (void const * a , void const * b )
138
+ {
139
+ int ret = 0 ;
140
+ double const * pa = a ;
141
+ double const * pb = b ;
142
+ double diff = * pa - * pb ;
143
+
144
+ if (diff > 0 )
145
+ ret = 1 ;
146
+ else if (diff < 0 )
147
+ ret = -1 ;
148
+ else
149
+ ret = 0 ;
150
+
151
+ return ret ;
152
+ }
115
153
/* [] END OF FILE */
0 commit comments