40 #include <sys/types.h>
50 return atan2(sin(z),cos(z));
59 d2 = 2*M_PI - fabs(d1);
62 if(fabs(d1) < fabs(d2))
149 double delta_trans, delta_rot, delta_bearing;
150 double delta_trans_hat, delta_rot_hat, delta_strafe_hat;
152 delta_trans = sqrt(
data->delta.v[0]*
data->delta.v[0] +
154 delta_rot =
data->delta.v[2];
157 double trans_hat_stddev = (
self->alpha3 * (delta_trans*delta_trans) +
158 self->alpha1 * (delta_rot*delta_rot));
159 double rot_hat_stddev = (
self->alpha4 * (delta_rot*delta_rot) +
160 self->alpha2 * (delta_trans*delta_trans));
161 double strafe_hat_stddev = (
self->alpha1 * (delta_rot*delta_rot) +
162 self->alpha5 * (delta_trans*delta_trans));
164 if(pf->model.use_optimal_filter)
165 for (
int i = 0; i <
set->sample_count; i++)
169 old_pose.v[2]) + sample->
pose.
v[2];
170 double cs_bearing = cos(delta_bearing);
171 double sn_bearing = sin(delta_bearing);
172 for (
int j = 0; j < pf->N_aux_particles; j++)
174 aux_sample =
set->aux_samples + (i*pf->N_aux_particles+j) ;
182 aux_sample->pose.v[0] = (delta_trans_hat * cs_bearing +
183 delta_strafe_hat * sn_bearing) + sample->
pose.
v[0];
184 aux_sample->pose.v[1] = (delta_trans_hat * sn_bearing -
185 delta_strafe_hat * cs_bearing) + sample->
pose.
v[1];
186 aux_sample->pose.v[2] = delta_rot_hat + sample->
pose.
v[2];
191 for (
int i = 0; i <
set->sample_count; i++)
196 old_pose.v[2]) + sample->
pose.
v[2];
197 double cs_bearing = cos(delta_bearing);
198 double sn_bearing = sin(delta_bearing);
205 sample->
pose.
v[0] += (delta_trans_hat * cs_bearing +
206 delta_strafe_hat * sn_bearing);
207 sample->
pose.
v[1] += (delta_trans_hat * sn_bearing -
208 delta_strafe_hat * cs_bearing);
209 sample->
pose.
v[2] += delta_rot_hat ;
227 double delta_rot1, delta_trans, delta_rot2;
228 double delta_rot1_hat, delta_trans_hat, delta_rot2_hat;
229 double delta_rot1_noise, delta_rot2_noise;
233 if(sqrt(
data->delta.v[1]*
data->delta.v[1] +
234 data->delta.v[0]*
data->delta.v[0]) < 0.01)
239 delta_trans = sqrt(
data->delta.v[0]*
data->delta.v[0] +
246 delta_rot1_noise = std::min(fabs(
angle_diff(delta_rot1,0.0)),
248 delta_rot2_noise = std::min(fabs(
angle_diff(delta_rot2,0.0)),
251 if(pf->model.use_optimal_filter)
252 for (
int i = 0; i <
set->sample_count; i++)
255 for (
int j = 0; j < pf->N_aux_particles; j++)
257 aux_sample =
set->aux_samples + (i*pf->N_aux_particles+j) ;
262 self->alpha2*delta_trans*delta_trans));
263 delta_trans_hat = delta_trans -
265 self->alpha4*delta_rot1_noise*delta_rot1_noise +
266 self->alpha4*delta_rot2_noise*delta_rot2_noise);
269 self->alpha2*delta_trans*delta_trans));
272 aux_sample->pose.v[0] = delta_trans_hat *
273 cos(sample->
pose.
v[2] + delta_rot1_hat) + sample->
pose.
v[0];
274 aux_sample->pose.v[1] = delta_trans_hat *
275 sin(sample->
pose.
v[2] + delta_rot1_hat) + sample->
pose.
v[1];
276 aux_sample->pose.v[2] = delta_rot1_hat + delta_rot2_hat + sample->
pose.
v[2];
281 for (
int i = 0; i <
set->sample_count; i++)
288 self->alpha2*delta_trans*delta_trans));
289 delta_trans_hat = delta_trans -
291 self->alpha4*delta_rot1_noise*delta_rot1_noise +
292 self->alpha4*delta_rot2_noise*delta_rot2_noise);
295 self->alpha2*delta_trans*delta_trans));
298 sample->
pose.
v[0] += delta_trans_hat *
299 cos(sample->
pose.
v[2] + delta_rot1_hat);
300 sample->
pose.
v[1] += delta_trans_hat *
301 sin(sample->
pose.
v[2] + delta_rot1_hat);
302 sample->
pose.
v[2] += delta_rot1_hat + delta_rot2_hat;
315 double delta_trans, delta_rot, delta_bearing;
316 double delta_trans_hat, delta_rot_hat, delta_strafe_hat;
318 delta_trans = sqrt(
data->delta.v[0]*
data->delta.v[0] +
320 delta_rot =
data->delta.v[2];
322 double trans_hat_stddev = sqrt( self->alpha3 * (delta_trans*delta_trans) +
323 self->alpha4 * (delta_rot*delta_rot) );
324 double rot_hat_stddev = sqrt( self->alpha1 * (delta_rot*delta_rot) +
325 self->alpha2 * (delta_trans*delta_trans) );
326 double strafe_hat_stddev = sqrt( self->alpha4 * (delta_rot*delta_rot) +
327 self->alpha5 * (delta_trans*delta_trans) );
328 if(pf->model.use_optimal_filter)
329 for (
int i = 0; i <
set->sample_count; i++)
333 old_pose.v[2]) + sample->
pose.
v[2];
334 double cs_bearing = cos(delta_bearing);
335 double sn_bearing = sin(delta_bearing);
336 for (
int j = 0; j < pf->N_aux_particles; j++)
338 aux_sample =
set->aux_samples + (i*pf->N_aux_particles+j) ;
346 aux_sample->pose.v[0] = (delta_trans_hat * cs_bearing +
347 delta_strafe_hat * sn_bearing) + sample->
pose.
v[0];
348 aux_sample->pose.v[1] = (delta_trans_hat * sn_bearing -
349 delta_strafe_hat * cs_bearing) + sample->
pose.
v[1];
350 aux_sample->pose.v[2] = delta_rot_hat + sample->
pose.
v[2];
355 for (
int i = 0; i <
set->sample_count; i++)
360 old_pose.v[2]) + sample->
pose.
v[2];
361 double cs_bearing = cos(delta_bearing);
362 double sn_bearing = sin(delta_bearing);
369 sample->
pose.
v[0] += (delta_trans_hat * cs_bearing +
370 delta_strafe_hat * sn_bearing);
371 sample->
pose.
v[1] += (delta_trans_hat * sn_bearing -
372 delta_strafe_hat * cs_bearing);
373 sample->
pose.
v[2] += delta_rot_hat ;
386 double delta_rot1, delta_trans, delta_rot2;
387 double delta_rot1_hat, delta_trans_hat, delta_rot2_hat;
388 double delta_rot1_noise, delta_rot2_noise;
392 if(sqrt(
data->delta.v[1]*
data->delta.v[1] +
393 data->delta.v[0]*
data->delta.v[0]) < 0.01)
398 delta_trans = sqrt(
data->delta.v[0]*
data->delta.v[0] +
405 delta_rot1_noise = std::min(fabs(
angle_diff(delta_rot1,0.0)),
407 delta_rot2_noise = std::min(fabs(
angle_diff(delta_rot2,0.0)),
409 if(pf->model.use_optimal_filter)
410 for (
int i = 0; i <
set->sample_count; i++)
413 for (
int j = 0; j < pf->N_aux_particles; j++)
415 aux_sample =
set->aux_samples + (i*pf->N_aux_particles+j) ;
420 self->alpha2*delta_trans*delta_trans)));
421 delta_trans_hat = delta_trans -
423 self->alpha4*delta_rot1_noise*delta_rot1_noise +
424 self->alpha4*delta_rot2_noise*delta_rot2_noise));
427 self->alpha2*delta_trans*delta_trans)));
430 aux_sample->pose.v[0] = delta_trans_hat *
431 cos(sample->
pose.
v[2] + delta_rot1_hat) + sample->
pose.
v[0];
432 aux_sample->pose.v[1] = delta_trans_hat *
433 sin(sample->
pose.
v[2] + delta_rot1_hat) + sample->
pose.
v[1];
434 aux_sample->pose.v[2] = delta_rot1_hat + delta_rot2_hat + sample->
pose.
v[2];
439 for (
int i = 0; i <
set->sample_count; i++)
446 self->alpha2*delta_trans*delta_trans)));
447 delta_trans_hat = delta_trans -
449 self->alpha4*delta_rot1_noise*delta_rot1_noise +
450 self->alpha4*delta_rot2_noise*delta_rot2_noise));
453 self->alpha2*delta_trans*delta_trans)));
456 sample->
pose.
v[0] += delta_trans_hat *
457 cos(sample->
pose.
v[2] + delta_rot1_hat);
458 sample->
pose.
v[1] += delta_trans_hat *
459 sin(sample->
pose.
v[2] + delta_rot1_hat);
460 sample->
pose.
v[2] += delta_rot1_hat + delta_rot2_hat;