00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00099
#ifndef LODO_H
00100
#define LODO_H
00101
00102
#ifdef __cplusplus
00103
extern "C"
00104 {
00105
#endif
00106
00107
#include <gsl/gsl_min.h>
00108
#include "slap.h"
00109
00110
00112 #define LODO_MAX_RANGES 401
00113
00114
00116 typedef struct
00117
{
00119 pose2_t opose;
00120
00122 pose2_t cpose;
00123
00125 double ranges[
LODO_MAX_RANGES];
00126
00127 }
lodo_scan_t;
00128
00129
00131 typedef struct
00132
{
00134 vector3_t local;
00135
00137 vector3_t polar;
00138
00139 }
lodo_map_point_t;
00140
00141
00143 typedef struct
00144
{
00146 int ni;
00147
00148 }
lodo_scan_point_t;
00149
00150
00152 typedef struct
00153
{
00155 int num_ranges;
00156
00158 double range_max;
00159
00161 double range_start;
00162
00164 double range_step;
00165
00167 pose2_t laser_pose;
00168
00170 double max_error;
00171
00173 int pef_num_ranges, pef_num_bearings;
00174
00176 double pef_range_start, pef_range_step;
00177
00181 double pef_bearing_start, pef_bearing_step;
00182
00184 int pef_size;
00185
int *pef;
00186
00189 double fit_interval;
00190
00193 double fit_err_thresh;
00194
00197 double fit_outlier_dist;
00198
00201 double fit_outlier_frac;
00202
00204 double odom_dist, odom_turn;
00205
00207 double map_dist_interval, map_turn_interval;
00208
00210 double map_last_dist, map_last_turn;
00211
00213 int map_scan_count, max_map_scans;
00214
lodo_scan_t *map_scans;
00215
00217 int scan_count;
00218
lodo_scan_t scan;
00219
00221 lodo_scan_point_t scan_points[
LODO_MAX_RANGES];
00222
00224 int num_map_points, max_map_points;
00225
lodo_map_point_t *map_points;
00226
00228 gsl_min_fminimizer *mini;
00229
00231 double fit_correct;
00232
00234 int fit_valid;
00235
00237 int fit_add;
00238
00239 }
lodo_t;
00240
00241
00250
lodo_t *
lodo_alloc(
int num_ranges,
double range_max,
double range_res,
00251
double range_start,
double range_step);
00252
00254
void lodo_free(
lodo_t *
self);
00255
00262
pose2_t lodo_add_scan(
lodo_t *
self,
pose2_t odom_pose,
int num_ranges,
double *ranges);
00263
00266
void lodo_project_map(
lodo_t *
self);
00267
00270
void lodo_project_map_free(
lodo_t *
self,
lodo_scan_t *scan_m,
00271
matrix33_t Pd,
matrix33_t Pm);
00272
00275
double lodo_correct(
lodo_t *
self);
00276
00279
double lodo_test_offset(
lodo_t *
self,
double offset,
double *outliers);
00280
00282
void lodo_print_map(
lodo_t *
self);
00283
00285
void lodo_print_pef(
lodo_t *
self);
00286
00288
void lodo_print_err(
lodo_t *
self);
00289
00291
void lodo_draw_scan(
lodo_t *
self,
lodo_scan_t *scan);
00292
00294
void lodo_draw_map(
lodo_t *
self);
00295
00296
#ifdef __cplusplus
00297
}
00298
#endif
00299
00300
#endif