From f874a7d88cfefb94e0f86c33371bcdc6686b6835 Mon Sep 17 00:00:00 2001 From: "Simon D. Levy" Date: Sun, 7 Sep 2014 20:43:06 -0400 Subject: [PATCH] Create coreslam.h --- c/coreslam.h | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 c/coreslam.h diff --git a/c/coreslam.h b/c/coreslam.h new file mode 100644 index 0000000..3c887a1 --- /dev/null +++ b/c/coreslam.h @@ -0,0 +1,177 @@ +/* + +coreslam.h adapted from CoreSLAM.h downloaded from openslam.org on 01 January 2014. +Contains efficient implementations of scan and map structures. + +Copyright (C) 2014 Simon D. Levy + +This code is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this code. If not, see . +*/ + +/* Default parameters --------------------------------------------------------*/ + +static const int DEFAULT_MAP_QUALITY = 50; /* out of 255 */ +static const double DEFAULT_HOLE_WIDTH_MM = 600; + +static const double DEFAULT_SIGMA_XY_MM = 100; +static const double DEFAULT_SIGMA_THETA_DEGREES = 20; + +static const double DEFAULT_MAX_SEARCH_ITER = 1000; + + +/* Core types --------------------------------------------------------------- */ + +typedef struct position_t +{ + double x_mm; + double y_mm; + double theta_degrees; + +} position_t; + +typedef unsigned short pixel_t; + +typedef struct map_t { + + pixel_t * pixels; + int size_pixels; + double size_meters; + + double scale_pixels_per_mm; + +} map_t; + + +typedef struct scan_t +{ + double * x_mm; + double * y_mm; + int * value; + int npoints; + int span; + + /* for SSE */ + float * obst_x_mm; + float * obst_y_mm; + int obst_npoints; + +} scan_t; + + +typedef struct laser_t +{ + int scan_size; /* number of points per scan */ + double scan_rate_hz; /* scans per second */ + double detection_angle_degrees; /* e.g. 240, 360 */ + double distance_no_detection_mm; /* default value when the laser returns 0 */ + int detection_margin; /* first scan element to consider */ + double offset_mm; /* position of the laser wrt center of rotation */ + +} laser_t; + + +/* Exported functions ------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" +{ +#endif + +int * +int_alloc( + int size); + +void +map_init( + map_t * map, + int size_pixels, + double size_meters); + +void +map_free( + map_t * map); + +void map_string( + map_t map, + char * str); + +void +map_update( + map_t * map, + scan_t * scan, + position_t position, + int map_quality, + double hole_width_mm); + +void scan_init( + scan_t * scan, + int size, + int span); + +void +scan_free( + scan_t * scan); + +void scan_string( + scan_t scan, + char * str); + +void +scan_update( + scan_t * scan, + int * lidar_mm, + laser_t laser, + double hole_width_mm, + double velocities_dxy_mm, + double velocities_dtheta_degrees); + +void +map_get( + map_t * map, + char * bytes); + +void +map_set( + map_t * map, + char * bytes); + +void +laser_string( + laser_t laser, + char * str); + +/* Returns -1 for infinity */ +int +distance_scan_to_map( + map_t * map, + scan_t * scan, + position_t position); + + +/* Random-Mutation Hill-Climbing search */ +position_t +rmhc_position_search( + position_t start_pos, + map_t * map, + scan_t * scan, + laser_t laser, + double sigma_xy_mm, + double sigma_theta_degrees, + int max_search_iter, + void * randomizer); + +#ifdef __cplusplus +} +#endif +