57 for(i = 0; i < pfs->
num ; i++)
62 fmod(rand(), M_PI * 2));
104 for(i = 0; i < pfs->
num; i++)
122 for(i = 0; i < pfs->
num; i++)
141 for(i = 0; i < pfs->
num; i++)
156 int i, index = (rand() % pfs->
num);
158 float mw = 0, w_sum = 0;
162 for(i = 0; i < pfs->
num; i++)
168 for(i = 0; i < pfs->
num; i++)
170 if(mw < pfs->particles[i].weight)
178 for(i = 0; i < pfs->
num; i++)
180 beta += (float)rand() / ((float)RAND_MAX / (mw * 2));
184 index = (index + 1) % pfs->
num;
195 for(i = 0; i < pfs->
num; i++)
202 for(i = 0; i < pfs->
num; i++)
218 float ex = 0, ey = 0;
219 float vx = 0, vy = 0, va = 0;
222 for(i = 0; i < pfs->
num; i++)
234 if(vy >= 0 && vx > 0)
236 else if(vy <= 0 && vx > 0)
237 va = 2 * M_PI + atan(vy / vx);
239 va = M_PI + atan(vy / vx);
264 int num = rand() % 100;
268 for(i = 0; i < num; i++)
271 particle_id = rand() % pfs->
num;
274 pfs->
particles[particle_id].
x = envs->
tags[tag_num].
x + (300 - (rand() % 600));
275 pfs->
particles[particle_id].
y = envs->
tags[tag_num].
y + (300 - (rand() % 600));
297 int xmin = 99999, xmax = 0, ymin = 99999, ymax = 0;
298 int width, height, area, field_area;
303 for(i = 0; i < pfs->
num; i++)
316 if(xmax < pfs->particles[i].x)
319 if(ymax < pfs->particles[i].y)
325 height = ymax - ymin;
326 area = width * height;
329 accuracy = 1 - ((float)area / (
float)field_area);
336 percent = (int)(accuracy * 100);
340 debug_printf(
"accuracy: %d [%f] - %d [%d x %d], %d\n", percent, accuracy, area, width, height, field_area);
void debug_printf(const char *format,...)
float robot_eval_wall(robot_t *robot, enviroment_t *envs)
void pf_random(pf_t *pfs, enviroment_t *envs, int tag_num)
float robot_eval_tag(robot_t *robot, enviroment_t *envs)
Particle filter structure.
void robot_set_noise(robot_t *robot, int move_noise, float turn_noise, int sense_tag_noise, int sense_wall_noise)
void robot_drive(robot_t *robot, int distance, int angle, int uncertain)
void pf_drive(pf_t *pfs, int distance, int angle, int uncertain)
void pf_destroy(pf_t *pfs)
void pf_estimate(pf_t *pfs, robot_t *robot)
void robot_set_pose(robot_t *robot, int x, int y, int a)
void pf_weight_tag(pf_t *pfs, enviroment_t *envs, int tag_num)
int pf_accuracy(pf_t *pfs, enviroment_t *envs)
void pf_weight_wall(pf_t *pfs, enviroment_t *envs)
pf_t * pf_init(int num, enviroment_t *envs, int move_noise, float turn_noise, int sense_tag_noise, int sense_wall_noise, int radius)
void pf_resample(pf_t *pfs)
Enviroment Structure - room points, tags, room point number, tag number.