Skip to content
This repository was archived by the owner on Sep 22, 2018. It is now read-only.

Commit 952eb52

Browse files
committed
Correction of NaN bugs and switch to a median filter instead of an average filter
1 parent d9922fa commit 952eb52

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
lines changed

code/ViveBeacons/ViveBeacons.cydsn/Position_finder.c

+43-5
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ void Position_finder_init(Position_finder *position_finder, Position3D* beacon_p
4343

4444
void Position_finder_find_position(Position_finder *position_finder, VIVE_sensors_data* vive_sensors_data) {
4545
Position2D* led_positions[8];
46+
double *heading_values = NULL;
47+
48+
for(int i = 0; i < 8; i++) {
49+
led_positions[i] = NULL;
50+
}
4651

4752
// Update data
4853
if(vive_sensors_data->axis == VERTICAL_AXIS) {
@@ -59,7 +64,7 @@ void Position_finder_find_position(Position_finder *position_finder, VIVE_sensor
5964

6065
// Process LED angles
6166
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]))
6368
continue;
6469

6570
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
7681
double sum = 0;
7782
int nb_couple = 0;
7883

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) {
8186
if(led_positions[i] == NULL || led_positions[j] == NULL)
8287
continue;
8388

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+
8492
double applied_delta_x = led_positions[j]->x - led_positions[i]->x;
8593
double applied_delta_y = led_positions[j]->y - led_positions[i]->y;
8694
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
8997
double theorical_delta_y = position_finder->tracker_led_offset[j][Y_AXIS] - position_finder->tracker_led_offset[i][Y_AXIS];
9098
double theorical_angle = atan2(theorical_delta_y, theorical_delta_x);
9199

92-
sum += Position_finder_normalize_angle(applied_angle - theorical_angle);
93100
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);
94103
}
95104
}
96105

@@ -100,7 +109,19 @@ void Position_finder_find_position(Position_finder *position_finder, VIVE_sensor
100109
free(current_led_position);
101110
}
102111

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;
104125
}
105126

106127
double Position_finder_normalize_angle(double angle) {
@@ -112,4 +133,21 @@ double Position_finder_normalize_angle(double angle) {
112133

113134
return angle;
114135
}
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+
}
115153
/* [] END OF FILE */

code/ViveBeacons/ViveBeacons.cydsn/Position_finder.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ void Position_finder_find_position(Position_finder *position_finder, VIVE_sensor
3838

3939
// Utils
4040
double Position_finder_normalize_angle(double angle);
41-
41+
static int Position_finder_compare(void const *a, void const *b); // For median filter
4242

4343
#endif
4444

0 commit comments

Comments
 (0)