From 6557a0af4810eab1084a3796d517ad4d73811953 Mon Sep 17 00:00:00 2001 From: simondlevy Date: Sat, 30 Jun 2018 15:01:47 -0400 Subject: [PATCH] Removed support for Matlab, Java. --- README.md | 51 +- examples/MinesRover.m | 69 --- examples/log2pgm.cpp | 439 ------------------ examples/logdemo.m | 175 ------- .../levy/breezyslam/algorithms/CoreSLAM.java | 133 ------ .../algorithms/DeterministicSLAM.java | 52 --- .../cs/levy/breezyslam/algorithms/Makefile | 90 ---- .../levy/breezyslam/algorithms/RMHCSLAM.java | 103 ---- .../algorithms/SinglePositionSLAM.java | 118 ----- .../algorithms/jnibreezyslam_algorithms.c | 67 --- .../cs/levy/breezyslam/components/Laser.java | 108 ----- .../cs/levy/breezyslam/components/Makefile | 89 ---- .../cs/levy/breezyslam/components/Map.java | 96 ---- .../breezyslam/components/PoseChange.java | 115 ----- .../levy/breezyslam/components/Position.java | 81 ---- .../cs/levy/breezyslam/components/Scan.java | 97 ---- .../levy/breezyslam/components/URG04LX.java | 29 -- .../components/jnibreezyslam_components.c | 132 ------ java/edu/wlu/cs/levy/breezyslam/jni_utils.h | 64 --- .../levy/breezyslam/robots/WheeledRobot.java | 130 ------ matlab/CoreSLAM.m | 136 ------ matlab/Deterministic_SLAM.m | 44 -- matlab/Map.m | 59 --- matlab/RMHC_SLAM.m | 72 --- matlab/Scan.m | 66 --- matlab/SinglePositionSLAM.m | 101 ---- matlab/WheeledRobot.m | 112 ----- matlab/make.m | 19 - matlab/mex_breezyslam.c | 294 ------------ matlab/mex_breezyslam.mexa64 | Bin 23466 -> 0 bytes matlab/mex_breezyslam.mexmaci64 | Bin 23440 -> 0 bytes matlab/mex_breezyslam.mexw64 | Bin 18432 -> 0 bytes python/breezyslam/algorithms.py | 2 - 33 files changed, 8 insertions(+), 3135 deletions(-) delete mode 100755 examples/MinesRover.m delete mode 100644 examples/log2pgm.cpp delete mode 100644 examples/logdemo.m delete mode 100644 java/edu/wlu/cs/levy/breezyslam/algorithms/CoreSLAM.java delete mode 100644 java/edu/wlu/cs/levy/breezyslam/algorithms/DeterministicSLAM.java delete mode 100644 java/edu/wlu/cs/levy/breezyslam/algorithms/Makefile delete mode 100644 java/edu/wlu/cs/levy/breezyslam/algorithms/RMHCSLAM.java delete mode 100644 java/edu/wlu/cs/levy/breezyslam/algorithms/SinglePositionSLAM.java delete mode 100644 java/edu/wlu/cs/levy/breezyslam/algorithms/jnibreezyslam_algorithms.c delete mode 100644 java/edu/wlu/cs/levy/breezyslam/components/Laser.java delete mode 100644 java/edu/wlu/cs/levy/breezyslam/components/Makefile delete mode 100644 java/edu/wlu/cs/levy/breezyslam/components/Map.java delete mode 100644 java/edu/wlu/cs/levy/breezyslam/components/PoseChange.java delete mode 100644 java/edu/wlu/cs/levy/breezyslam/components/Position.java delete mode 100644 java/edu/wlu/cs/levy/breezyslam/components/Scan.java delete mode 100644 java/edu/wlu/cs/levy/breezyslam/components/URG04LX.java delete mode 100644 java/edu/wlu/cs/levy/breezyslam/components/jnibreezyslam_components.c delete mode 100644 java/edu/wlu/cs/levy/breezyslam/jni_utils.h delete mode 100644 java/edu/wlu/cs/levy/breezyslam/robots/WheeledRobot.java delete mode 100644 matlab/CoreSLAM.m delete mode 100644 matlab/Deterministic_SLAM.m delete mode 100644 matlab/Map.m delete mode 100644 matlab/RMHC_SLAM.m delete mode 100644 matlab/Scan.m delete mode 100644 matlab/SinglePositionSLAM.m delete mode 100644 matlab/WheeledRobot.m delete mode 100644 matlab/make.m delete mode 100644 matlab/mex_breezyslam.c delete mode 100755 matlab/mex_breezyslam.mexa64 delete mode 100644 matlab/mex_breezyslam.mexmaci64 delete mode 100644 matlab/mex_breezyslam.mexw64 diff --git a/README.md b/README.md index 22f5479..16f0287 100644 --- a/README.md +++ b/README.md @@ -5,19 +5,20 @@ BreezySLAM

-Simple, efficient, open-source package for Simultaneous Localization and Mapping in Python, Matlab, Java, and C++ +Simple, efficient, open-source package for Simultaneous Localization and Mapping in Python and C++ This repository contains everything you need to start working with Lidar -based SLAM -in Python, Matlab or C++. BreezySLAM works with Python 2 and 3 on Linux and Mac OS X, and -with C++ on Linux and Windows. -By using Python C extensions, we were able to get the Python and Matlab versions to run -as fast as C++. For maximum effiency on 32-bit platforms, we use Streaming -SIMD extensions (Intel) and NEON (ARMv7) in the compute-intensive part -of the code. +in Python or C++. (For those interested in Matlab or Java, there is a +[legacy](https://github.com/simondlevy/BreezySLAM/tree/legacy) branch, which I +am no longer maintaining.) BreezySLAM works with Python 2 and 3 on Linux and +Mac OS X, and with C++ on Linux and Windows. By using Python C extensions, we +were able to get the Python version to run as fast as C++. For maximum effiency +on 32-bit platforms, we use Streaming SIMD extensions (Intel) and NEON (ARMv7) +in the compute-intensive part of the code.

BreezySLAM was inspired by the Breezy approach to Graphical User Interfaces developed by my colleague @@ -120,27 +121,6 @@ To try it out, you'll also need the these instructions very helpful when I ran into trouble. -

Installing for C++

Just cd to BreezySLAM/cpp, and do @@ -166,21 +146,6 @@ the Makefile in this directory as well, if you don't use /usr/local/lib

-

Installing for Java

- -In BreezySLAM/java/edu/wlu/cs/levy/breezyslam/algorithms and -BreezySLAM/java/edu/wlu/cs/levy/breezyslam/components, -edit the JDKINC variable in the Makefile to reflect where you installed the JDK. -Then run make in these directories. - -

- -For a quick demo, you can then cd to BreezySLAM/examples and do - -

-make javatest
-
-

Notes on Windows installation

diff --git a/examples/MinesRover.m b/examples/MinesRover.m deleted file mode 100755 index a0f2378..0000000 --- a/examples/MinesRover.m +++ /dev/null @@ -1,69 +0,0 @@ -classdef MinesRover < WheeledRobot - %MinesRover Class for MinesRover custom robot - % - % 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 . - - properties (Access = 'private') - TICKS_PER_CYCLE = 2000; - end - - methods (Access = 'private') - - function degrees = ticks_to_degrees(obj, ticks) - - degrees = ticks * (180. / obj.TICKS_PER_CYCLE); - - end - - end - - methods (Access = 'public') - - function robot = MinesRover() - - robot = robot@WheeledRobot(77, 165); - - end - - function disp(obj) - % Displays information about this MinesRover - - fprintf('<%s ticks_per_cycle=%d>\n', obj.str(), obj.TICKS_PER_CYCLE) - - end - - function [poseChange, obj] = computePoseChange(obj, odometry) - - [poseChange, obj] = computePoseChange@WheeledRobot(obj, odometry(1), odometry(2), odometry(3)); - - end - - function [timestampSeconds, leftWheelDegrees, rightWheelDegrees] = ... - extractOdometry(obj, timestamp, leftWheel, rightWheel) - - % Convert microseconds to seconds - timestampSeconds = timestamp / 1e6; - - % Convert ticks to angles - leftWheelDegrees = obj.ticks_to_degrees(leftWheel); - rightWheelDegrees = obj.ticks_to_degrees(rightWheel); - - end - - end - -end - diff --git a/examples/log2pgm.cpp b/examples/log2pgm.cpp deleted file mode 100644 index a88789d..0000000 --- a/examples/log2pgm.cpp +++ /dev/null @@ -1,439 +0,0 @@ -/* -log2pgm.cpp : BreezySLAM demo. Reads logfile with odometry and scan data from -Paris Mines Tech and produces a .PGM image file showing robot path -and final map. - -For details see - -@inproceedings{, - author = {Bruno Steux and Oussama El Hamzaoui}, - title = {SinglePositionSLAM: a SLAM Algorithm in less than 200 lines of C code}, - booktitle = {11th International Conference on Control, Automation, Robotics and Vision, ICARCV 2010, Singapore, 7-10 - December 2010, Proceedings}, - pages = {1975-1979}, - publisher = {IEEE}, - year = {2010} -} - -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 . - -Change log: - -20-APR-2014 - Simon D. Levy - Get params from command line -05-JUN-2014 - SDL - get random seed from command line -*/ - -// SinglePositionSLAM params: gives us a nice-size map -static const int MAP_SIZE_PIXELS = 800; -static const double MAP_SIZE_METERS = 32; - -static const int SCAN_SIZE = 682; - -// Arbitrary maximum length of line in input logfile -#define MAXLINE 10000 - -#include -#include -using namespace std; - -#include -#include -#include -#include -#include - -#include "Position.hpp" -#include "Laser.hpp" -#include "WheeledRobot.hpp" -#include "PoseChange.hpp" -#include "algorithms.hpp" - - -// Methods to load all data from file ------------------------------------------ -// Each line in the file has the format: -// -// TIMESTAMP ... Q1 Q1 ... Distances -// (usec) (mm) -// 0 ... 2 3 ... 24 ... -// -//where Q1, Q2 are odometry values - -static void skiptok(char ** cpp) -{ - *cpp = strtok(NULL, " "); -} - -static int nextint(char ** cpp) -{ - skiptok(cpp); - - return atoi(*cpp); -} - -static void load_data( - const char * dataset, - vector & scans, - vector & odometries) -{ - char filename[256]; - - sprintf(filename, "%s.dat", dataset); - printf("Loading data from %s ... \n", filename); - - FILE * fp = fopen(filename, "rt"); - - if (!fp) - { - fprintf(stderr, "Failed to open file\n"); - exit(1); - } - - char s[MAXLINE]; - - while (fgets(s, MAXLINE, fp)) - { - char * cp = strtok(s, " "); - - long * odometry = new long [3]; - odometry[0] = atol(cp); - skiptok(&cp); - odometry[1] = nextint(&cp); - odometry[2] = nextint(&cp); - - odometries.push_back(odometry); - - // Skip unused fields - for (int k=0; k<20; ++k) - { - skiptok(&cp); - } - - int * scanvals = new int [SCAN_SIZE]; - - for (int k=0; kTICKS_PER_CYCLE); - } - -private: - - double ticksToDegrees(double ticks) - { - return ticks * (180. / this->TICKS_PER_CYCLE); - } - - static const int TICKS_PER_CYCLE = 2000; -}; - -// Progress-bar class -// Adapted from http://code.activestate.com/recipes/168639-progress-bar-class/ -// Downloaded 12 January 2014 - -class ProgressBar -{ -public: - - ProgressBar(int minValue, int maxValue, int totalWidth) - { - strcpy(this->progBar, "[]"); // This holds the progress bar string - this->min = minValue; - this->max = maxValue; - this->span = maxValue - minValue; - this->width = totalWidth; - this->amount = 0; // When amount == max, we are 100% done - this->updateAmount(0); // Build progress bar string - } - - void updateAmount(int newAmount) - { - if (newAmount < this->min) - { - newAmount = this->min; - } - if (newAmount > this->max) - { - newAmount = this->max; - } - - this->amount = newAmount; - - // Figure out the new percent done, round to an integer - float diffFromMin = float(this->amount - this->min); - int percentDone = (int)round((diffFromMin / float(this->span)) * 100.0); - - // Figure out how many hash bars the percentage should be - int allFull = this->width - 2; - int numHashes = (int)round((percentDone / 100.0) * allFull); - - - // Build a progress bar with hashes and spaces - strcpy(this->progBar, "["); - this->addToProgBar("#", numHashes); - this->addToProgBar(" ", allFull-numHashes); - strcat(this->progBar, "]"); - - // Figure out where to put the percentage, roughly centered - int percentPlace = (strlen(this->progBar) / 2) - ((int)(log10(percentDone+1)) + 1); - char percentString[5]; - sprintf(percentString, "%d%%", percentDone); - - // Put it there - for (int k=0; kprogBar[percentPlace+k] = percentString[k]; - } - - } - - char * str() - { - return this->progBar; - } - -private: - - char progBar[1000]; // more than we should ever need - int min; - int max; - int span; - int width; - int amount; - - void addToProgBar(const char * s, int n) - { - for (int k=0; kprogBar, s); - } - } -}; - -// Helpers ---------------------------------------------------------------- - -int coords2index(double x, double y) -{ - return y * MAP_SIZE_PIXELS + x; -} - - -int mm2pix(double mm) -{ - return (int)(mm / (MAP_SIZE_METERS * 1000. / MAP_SIZE_PIXELS)); -} - -int main( int argc, const char** argv ) -{ - // Bozo filter for input args - if (argc < 3) - { - fprintf(stderr, - "Usage: %s \n", - argv[0]); - fprintf(stderr, "Example: %s exp2 1 9999\n", argv[0]); - exit(1); - } - - // Grab input args - const char * dataset = argv[1]; - bool use_odometry = atoi(argv[2]) ? true : false; - int random_seed = argc > 3 ? atoi(argv[3]) : 0; - - // Load the Lidar and odometry data from the file - vector scans; - vector odometries; - load_data(dataset, scans, odometries); - - // Build a robot model in case we want odometry - Rover robot = Rover(); - - // Create a byte array to receive the computed maps - unsigned char * mapbytes = new unsigned char[MAP_SIZE_PIXELS * MAP_SIZE_PIXELS]; - - // Create SLAM object - MinesURG04LX laser; - SinglePositionSLAM * slam = random_seed ? - (SinglePositionSLAM*)new RMHC_SLAM(laser, MAP_SIZE_PIXELS, MAP_SIZE_METERS, random_seed) : - (SinglePositionSLAM*)new Deterministic_SLAM(laser, MAP_SIZE_PIXELS, MAP_SIZE_METERS); - - // Report what we're doing - int nscans = scans.size(); - printf("Processing %d scans with%s odometry / with%s particle filter...\n", - nscans, use_odometry ? "" : "out", random_seed ? "" : "out"); - ProgressBar * progbar = new ProgressBar(0, nscans, 80); - - // Start with an empty trajectory of positions - vector trajectory; - - // Start timing - time_t start_sec = time(NULL); - - // Loop over scans - for (int scanno=0; scannoupdate(lidar, poseChange); - } - else - { - slam->update(lidar); - } - - Position position = slam->getpos(); - - // Add new coordinates to trajectory - double * v = new double[2]; - v[0] = position.x_mm; - v[1] = position.y_mm; - trajectory.push_back(v); - - // Tame impatience - progbar->updateAmount(scanno); - printf("\r%s", progbar->str()); - fflush(stdout); - } - - // Report speed - time_t elapsed_sec = time(NULL) - start_sec; - printf("\n%d scans in %ld seconds = %f scans / sec\n", - nscans, elapsed_sec, (float)nscans/elapsed_sec); - - // Get final map - slam->getmap(mapbytes); - - // Put trajectory into map as black pixels - for (int k=0; k<(int)trajectory.size(); ++k) - { - double * v = trajectory[k]; - - int x = mm2pix(v[0]); - int y = mm2pix(v[1]); - - delete v; - - mapbytes[coords2index(x, y)] = 0; - } - - // Save map and trajectory as PGM file - - char filename[100]; - sprintf(filename, "%s.pgm", dataset); - printf("\nSaving map to file %s\n", filename); - - FILE * output = fopen(filename, "wt"); - - fprintf(output, "P2\n%d %d 255\n", MAP_SIZE_PIXELS, MAP_SIZE_PIXELS); - - for (int y=0; y> logdemo(dataset, [use_odometry], [random_seed]) -% -% Examples: -% -% >> logdemo('exp2') -% -% For details see -% -% @inproceedings{coreslam-2010, -% author = {Bruno Steux and Oussama El Hamzaoui}, -% title = {CoreSLAM: a SLAM Algorithm in less than 200 lines of C code}, -% booktitle = {11th International Conference on Control, Automation, -% Robotics and Vision, ICARCV 2010, Singapore, 7-10 -% December 2010, Proceedings}, -% pages = {1975-1979}, -% publisher = {IEEE}, -% year = {2010} -% } -% -% 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 . - -function logdemo(dataset, use_odometry, seed) - -% Params - -MAP_SIZE_PIXELS = 800; -MAP_SIZE_METERS = 32; -ROBOT_SIZE_PIXELS = 10; - -% Grab input args - -if nargin < 2 - use_odometry = 0; -end - -if nargin < 3 - seed = 0; -end - -% Load data from file -[times, scans, odometries] = load_data(dataset); - -% Build a robot model if we want odometry -robot = []; -if use_odometry - robot = MinesRover(); -end - -% Create a CoreSLAM object with laser params and optional robot object -if seed - slam = RMHC_SLAM(MinesLaser(), MAP_SIZE_PIXELS, MAP_SIZE_METERS, seed); -else - slam = Deterministic_SLAM(MinesLaser(), MAP_SIZE_PIXELS, MAP_SIZE_METERS); -end - -% Initialize previous time for delay -prevTime = 0; - -% Loop over scans -for scanno = 1:size(scans, 1) - - if use_odometry - - % Convert odometry to velocities - [velocities,robot] = robot.computePoseChange(odometries(scanno, :)); - - % Update SLAM with lidar and velocities - slam = slam.update(scans(scanno,:), velocities); - - else - - % Update SLAM with lidar alone - slam = slam.update(scans(scanno,:)); - end - - % Get new position - [x_mm, y_mm, theta_degrees] = slam.getpos(); - - % Get current map - map = slam.getmap(); - - % Display map - hold off - image(map/4) % Keep bytes in [0,64] for colormap - axis('square') - colormap('gray') - hold on - - % Generate a polyline to represent the robot - [x_pix, y_pix] = robot_polyline(ROBOT_SIZE_PIXELS); - - % Rotate the polyline based on the robot's angular rotation - theta_radians = pi * theta_degrees / 180; - x_pix_r = x_pix * cos(theta_radians) - y_pix * sin(theta_radians); - y_pix_r = x_pix * sin(theta_radians) + y_pix * cos(theta_radians); - - % Add the robot's position as offset to the polyline - x_pix = x_pix_r + mm2pix(x_mm, MAP_SIZE_METERS, MAP_SIZE_PIXELS); - y_pix = y_pix_r + mm2pix(y_mm, MAP_SIZE_METERS, MAP_SIZE_PIXELS); - - % Add robot image to map - fill(x_pix, y_pix, 'r') - drawnow - - % Delay based on current time in microseconds - currTime = times(scanno); - if scanno > 1 - pause((currTime-prevTime)/1e6) - end - prevTime = times(scanno); - - -end - -% Function to generate a x, y points for a polyline to display the robot -% Currently we just generate a triangle. -function [x_pix, y_pix] = robot_polyline(robot_size) -HEIGHT_RATIO = 1.25; -x_pix = [-robot_size, robot_size, -robot_size]; -y_pix = [-robot_size/HEIGHT_RATIO, 0 , robot_size/HEIGHT_RATIO]; - -% Function to convert millimeters to pixels ------------------------------- - -function pix = mm2pix(mm, MAP_SIZE_METERS, MAP_SIZE_PIXELS) -pix = floor(mm / (MAP_SIZE_METERS * 1000. / MAP_SIZE_PIXELS)); - - -% Function to load all from file ------------------------------------------ -% Each line in the file has the format: -% -% TIMESTAMP ... Q1 Q1 ... Distances -% (usec) (mm) -% 0 ... 2 3 ... 24 ... -% -%where Q1, Q2 are odometry values - -function [times, scans,odometries] = load_data(dataset) - -data = load([dataset '.dat']); - -times = data(:,1); -scans = data(:,25:end-1); % avoid final ' ' -odometries = data(:,[1,3,4]); - -% Function to build a Laser data structure for the Hokuyo URG04LX used for -% collecting the logfile data. - -function laser = MinesLaser() - -laser.scan_size = 682; -laser.scan_rate_hz = 10; -laser.detection_angle_degrees = 240; -laser.distance_no_detection_mm = 4000; -laser.detection_margin = 70; -laser.offset_mm = 145; diff --git a/java/edu/wlu/cs/levy/breezyslam/algorithms/CoreSLAM.java b/java/edu/wlu/cs/levy/breezyslam/algorithms/CoreSLAM.java deleted file mode 100644 index a57a162..0000000 --- a/java/edu/wlu/cs/levy/breezyslam/algorithms/CoreSLAM.java +++ /dev/null @@ -1,133 +0,0 @@ -/** -* -* CoreSLAM.java abstract Java class for CoreSLAM algorithm in BreezySLAM -* -* 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 . -*/ - - -package edu.wlu.cs.levy.breezyslam.algorithms; - -import edu.wlu.cs.levy.breezyslam.components.Laser; -import edu.wlu.cs.levy.breezyslam.components.PoseChange; -import edu.wlu.cs.levy.breezyslam.components.Map; -import edu.wlu.cs.levy.breezyslam.components.Scan; - -/** -* CoreSLAM is an abstract class that uses the classes Position, Map, Scan, and Laser -* to run variants of the simple CoreSLAM (tinySLAM) algorithm described in -*
-*     @inproceedings{coreslam-2010,
-*       author    = {Bruno Steux and Oussama El Hamzaoui}, 
-*       title     = {CoreSLAM: a SLAM Algorithm in less than 200 lines of C code},  
-*       booktitle = {11th International Conference on Control, Automation,   
-*                    Robotics and Vision, ICARCV 2010, Singapore, 7-10  
-*                    December 2010, Proceedings},  
-*       pages     = {1975-1979},  
-*       publisher = {IEEE},  
-*       year      = {2010}
-*     }
-*     
-* Implementing classes should provide the method -* -* void updateMapAndPointcloud(int * scan_mm, PoseChange & poseChange) -* -* to update the map and point-cloud (particle cloud). -* -*/ -public abstract class CoreSLAM { - - /** - * The quality of the map (0 through 255) - */ - public int map_quality = 50; - - /** - * The width in millimeters of each "hole" in the map (essentially, wall width) - */ - public double hole_width_mm = 600; - - protected Laser laser; - - protected PoseChange poseChange; - - protected Map map; - - protected Scan scan_for_mapbuild; - protected Scan scan_for_distance; - - public CoreSLAM(Laser laser, int map_size_pixels, double map_size_meters) - { - // Set default params - this.laser = new Laser(laser); - - // Initialize poseChange (dxyMillimeters, dthetaDegrees, dtSeconds) for odometry - this.poseChange = new PoseChange(); - - // Initialize a scan for computing distance to map, and one for updating map - this.scan_for_mapbuild = this.scan_create(3); - this.scan_for_distance = this.scan_create(1); - - // Initialize the map - this.map = new Map(map_size_pixels, map_size_meters); - } - - private Scan scan_create(int span) - { - return new Scan(this.laser, span); - } - - private void scan_update(Scan scan, int [] scan_mm) - { - scan.update(scan_mm, this.hole_width_mm, this.poseChange); - } - - - public void update(int [] scan_mm, PoseChange poseChange) - { - // Build a scan for computing distance to map, and one for updating map - this.scan_update(this.scan_for_mapbuild, scan_mm); - this.scan_update(this.scan_for_distance, scan_mm); - - // Update poseChange - this.poseChange.update(poseChange.getDxyMm(), poseChange.getDthetaDegrees(), poseChange.getDtSeconds()); - - // Implementing class updates map and pointcloud - this.updateMapAndPointcloud(poseChange); - } - - /** - * Updates the scan, and calls the the implementing class's updateMapAndPointcloud method with zero poseChange - * (no odometry). - * @param scan_mm Lidar scan values, whose count is specified in the scan_size - * attribute of the Laser object passed to the CoreSlam constructor - */ - public void update(int [] scan_mm) - { - PoseChange zero_poseChange = new PoseChange(); - - this.update(scan_mm, zero_poseChange); - } - - - protected abstract void updateMapAndPointcloud(PoseChange poseChange); - - public void getmap(byte [] mapbytes) - { - this.map.get(mapbytes); - } - -} diff --git a/java/edu/wlu/cs/levy/breezyslam/algorithms/DeterministicSLAM.java b/java/edu/wlu/cs/levy/breezyslam/algorithms/DeterministicSLAM.java deleted file mode 100644 index 458943d..0000000 --- a/java/edu/wlu/cs/levy/breezyslam/algorithms/DeterministicSLAM.java +++ /dev/null @@ -1,52 +0,0 @@ -/** -* DeterministicSLAM implements SinglePositionSLAM using by returning the starting position instead of searching -* on it; i.e., using odometry alone. -* -* 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 . -*/ - - -package edu.wlu.cs.levy.breezyslam.algorithms; - -import edu.wlu.cs.levy.breezyslam.components.Position; -import edu.wlu.cs.levy.breezyslam.components.Laser; - -public class DeterministicSLAM extends SinglePositionSLAM -{ - - /** - * Creates a DeterministicSLAM object. - * @param laser a Laser object containing parameters for your Lidar equipment - * @param map_size_pixels the size of the desired map (map is square) - * @param map_size_meters the size of the area to be mapped, in meters - * @return a new CoreSLAM object - */ - public DeterministicSLAM(Laser laser, int map_size_pixels, double map_size_meters) - { - super(laser, map_size_pixels, map_size_meters); - } - - /** - * Returns a new position identical to the starting position. Called automatically by - * SinglePositionSLAM::updateMapAndPointcloud() - * @param start_pos the starting position - */ - protected Position getNewPosition(Position start_position) - { - return new Position(start_position.x_mm, start_position.y_mm, start_position.theta_degrees); - } - -} // DeterministicSLAM diff --git a/java/edu/wlu/cs/levy/breezyslam/algorithms/Makefile b/java/edu/wlu/cs/levy/breezyslam/algorithms/Makefile deleted file mode 100644 index 45b5a43..0000000 --- a/java/edu/wlu/cs/levy/breezyslam/algorithms/Makefile +++ /dev/null @@ -1,90 +0,0 @@ -# Makefile for BreezySLAM algorithms in Java -# -# 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 . - -BASEDIR = ../../../../../../.. -JAVADIR = $(BASEDIR)/java -CDIR = $(BASEDIR)/c -JFLAGS = -Xlint -JDKINC = -I /usr/lib/jvm/java-7-openjdk-amd64/include -#JDKINC = -I /opt/jdk1.7.0_67/include -I /opt/jdk1.7.0_67/include/linux - -# Set library extension based on OS -ifeq ("$(shell uname)","Darwin") - LIBEXT = dylib -else ifeq ("$(shell uname)","Linux") - CFLAGS = -fPIC - LIBEXT = so -else - LIBEXT = dll -endif - -# Set SIMD compile params based on architecture -ifeq ("$(ARCH)","armv7l") - SIMD_FLAGS = -mfpu=neon -else ifeq ("$(ARCH)","i686") - SIMD_FLAGS = -msse3 -else - ARCH = sisd -endif - - -ALL = libjnibreezyslam_algorithms.$(LIBEXT) CoreSLAM.class SinglePositionSLAM.class DeterministicSLAM.class RMHCSLAM.class - -all: $(ALL) - -libjnibreezyslam_algorithms.$(LIBEXT): jnibreezyslam_algorithms.o coreslam.o random.o ziggurat.o coreslam_$(ARCH).o - gcc -shared -Wl,-soname,libjnibreezyslam_algorithms.so -o libjnibreezyslam_algorithms.so jnibreezyslam_algorithms.o \ - coreslam.o coreslam_$(ARCH).o random.o ziggurat.o - -jnibreezyslam_algorithms.o: jnibreezyslam_algorithms.c RMHCSLAM.h ../jni_utils.h - gcc $(JDKINC) -fPIC -c jnibreezyslam_algorithms.c - - -CoreSLAM.class: CoreSLAM.java - javac -classpath $(JAVADIR):. CoreSLAM.java - - -SinglePositionSLAM.class: SinglePositionSLAM.java - javac -classpath $(JAVADIR):. SinglePositionSLAM.java - -DeterministicSLAM.class: DeterministicSLAM.java - javac -classpath $(JAVADIR):. DeterministicSLAM.java - -RMHCSLAM.class: RMHCSLAM.java - javac -classpath $(JAVADIR):. RMHCSLAM.java - -RMHCSLAM.h: RMHCSLAM.class - javah -o RMHCSLAM.h -classpath $(JAVADIR) -jni edu.wlu.cs.levy.breezyslam.algorithms.RMHCSLAM - -coreslam.o: $(CDIR)/coreslam.c $(CDIR)/coreslam.h - gcc -O3 -c -Wall $(CFLAGS) $(CDIR)/coreslam.c - -coreslam_$(ARCH).o: $(CDIR)/coreslam_$(ARCH).c $(CDIR)/coreslam.h - gcc -O3 -c -Wall $(CFLAGS) $(SIMD_FLAGS) $(CDIR)/coreslam_$(ARCH).c - -random.o: $(CDIR)/random.c - gcc -O3 -c -Wall $(CFLAGS) $(CDIR)/random.c - -ziggurat.o: $(CDIR)/ziggurat.c - gcc -O3 -c -Wall $(CFLAGS) $(CDIR)/ziggurat.c - -clean: - rm -f *.class *.o *.h *.$(LIBEXT) *~ - -backup: - cp *.java bak - cp Makefile bak diff --git a/java/edu/wlu/cs/levy/breezyslam/algorithms/RMHCSLAM.java b/java/edu/wlu/cs/levy/breezyslam/algorithms/RMHCSLAM.java deleted file mode 100644 index 06269ab..0000000 --- a/java/edu/wlu/cs/levy/breezyslam/algorithms/RMHCSLAM.java +++ /dev/null @@ -1,103 +0,0 @@ -/** -* RMHCSLAM implements SinglePositionSLAM using random-mutation hill-climbing search on the starting position. -* -* 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 . -*/ - -package edu.wlu.cs.levy.breezyslam.algorithms; - -import edu.wlu.cs.levy.breezyslam.components.Position; -import edu.wlu.cs.levy.breezyslam.components.Laser; -import edu.wlu.cs.levy.breezyslam.components.PoseChange; -import edu.wlu.cs.levy.breezyslam.components.Map; -import edu.wlu.cs.levy.breezyslam.components.Scan; - -public class RMHCSLAM extends SinglePositionSLAM -{ - private static final double DEFAULT_SIGMA_XY_MM = 100; - private static final double DEFAULT_SIGMA_THETA_DEGREES = 20; - private static final int DEFAULT_MAX_SEARCH_ITER = 1000; - - static - { - System.loadLibrary("jnibreezyslam_algorithms"); - } - - private native void init(int random_seed); - - private native Object positionSearch( - Position start_pos, - Map map, - Scan scan, - double sigma_xy_mm, - double sigma_theta_degrees, - int max_search_iter); - - - private long native_ptr; - - /** - * Creates an RMHCSLAM object. - * @param laser a Laser object containing parameters for your Lidar equipment - * @param map_size_pixels the size of the desired map (map is square) - * @param map_size_meters the size of the area to be mapped, in meters - * @param random_seed seed for psuedorandom number generator in particle filter - * @return a new CoreSLAM object - */ - public RMHCSLAM(Laser laser, int map_size_pixels, double map_size_meters, int random_seed) - { - super(laser, map_size_pixels, map_size_meters); - - this.init(random_seed); - } - - /** - * The standard deviation in millimeters of the Gaussian distribution of - * the (X,Y) component of position in the particle filter; default = 100 - */ - public double sigma_xy_mm = DEFAULT_SIGMA_XY_MM;; - - /** - * The standard deviation in degrees of the Gaussian distribution of - * the angular rotation component of position in the particle filter; default = 20 - */ - public double sigma_theta_degrees = DEFAULT_SIGMA_THETA_DEGREES; - - /** - * The maximum number of iterations for particle-filter search; default = 1000 - */ - public int max_search_iter = DEFAULT_MAX_SEARCH_ITER; - - /** - * Returns a new position based on RMHC search from a starting position. Called automatically by - * SinglePositionSLAM::updateMapAndPointcloud() - * @param start_position the starting position - */ - protected Position getNewPosition(Position start_position) - { - Position newpos = - (Position)positionSearch( - start_position, - this.map, - this.scan_for_distance, - this.sigma_xy_mm, - this.sigma_theta_degrees, - this.max_search_iter); - - return newpos; - } - -} // RMHCSLAM diff --git a/java/edu/wlu/cs/levy/breezyslam/algorithms/SinglePositionSLAM.java b/java/edu/wlu/cs/levy/breezyslam/algorithms/SinglePositionSLAM.java deleted file mode 100644 index 085064b..0000000 --- a/java/edu/wlu/cs/levy/breezyslam/algorithms/SinglePositionSLAM.java +++ /dev/null @@ -1,118 +0,0 @@ -/** -* SinglePositionSLAM is an abstract class that implements CoreSLAM using a point-cloud -* with a single point (particle, position). Implementing classes should provide the method -* -* Position getNewPosition(Position start_position) -* -* to compute a new position based on searching from a starting position. -* -* 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 . -*/ - -package edu.wlu.cs.levy.breezyslam.algorithms; - -import edu.wlu.cs.levy.breezyslam.components.Position; -import edu.wlu.cs.levy.breezyslam.components.PoseChange; -import edu.wlu.cs.levy.breezyslam.components.Laser; - - -public abstract class SinglePositionSLAM extends CoreSLAM -{ - /** - * Returns the current position. - * @return the current position as a Position object. - */ - public Position getpos() - { - return this.position; - } - - /** - * Creates a SinglePositionSLAM object. - * @param laser a Laser object containing parameters for your Lidar equipment - * @param map_size_pixels the size of the desired map (map is square) - * @param map_size_meters the size of the area to be mapped, in meters - * @return a new SinglePositionSLAM object - */ - protected SinglePositionSLAM(Laser laser, int map_size_pixels, double map_size_meters) - { - super(laser, map_size_pixels, map_size_meters); - - this.position = new Position(this.init_coord_mm(), this.init_coord_mm(), 0); - } - - - /** - * Updates the map and point-cloud (particle cloud). Called automatically by CoreSLAM::update() - * @param poseChange poseChange for odometry - */ - protected void updateMapAndPointcloud(PoseChange poseChange) - { - // Start at current position - Position start_pos = new Position(this.position); - - // Add effect of poseChange - start_pos.x_mm += poseChange.getDxyMm() * this.costheta(); - start_pos.y_mm += poseChange.getDxyMm() * this.sintheta(); - start_pos.theta_degrees += poseChange.getDthetaDegrees(); - - // Add offset from laser - start_pos.x_mm += this.laser.getOffsetMm() * this.costheta(); - start_pos.y_mm += this.laser.getOffsetMm() * this.sintheta(); - - // Get new position from implementing class - Position new_position = this.getNewPosition(start_pos); - - // Update the map with this new position - this.map.update(this.scan_for_mapbuild, new_position, this.map_quality, this.hole_width_mm); - - // Update the current position with this new position, adjusted by laser offset - this.position = new Position(new_position); - this.position.x_mm -= this.laser.getOffsetMm() * this.costheta(); - this.position.y_mm -= this.laser.getOffsetMm() * this.sintheta(); - } - - /** - * Returns a new position based on searching from a starting position. Called automatically by - * SinglePositionSLAM::updateMapAndPointcloud() - * @param start_pos the starting position - */ - - protected abstract Position getNewPosition(Position start_pos); - - private Position position; - - private double theta_radians() - { - return java.lang.Math.toRadians(this.position.theta_degrees); - } - - private double costheta() - { - return java.lang.Math.cos(this.theta_radians()); - } - - private double sintheta() - { - return java.lang.Math.sin(this.theta_radians()); - } - - private double init_coord_mm() - { - // Center of map - return 500 * this.map.sizeMeters(); - } -} diff --git a/java/edu/wlu/cs/levy/breezyslam/algorithms/jnibreezyslam_algorithms.c b/java/edu/wlu/cs/levy/breezyslam/algorithms/jnibreezyslam_algorithms.c deleted file mode 100644 index e2e8d8f..0000000 --- a/java/edu/wlu/cs/levy/breezyslam/algorithms/jnibreezyslam_algorithms.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * jnibreezyslam_algorithms.c Java Native Interface code for BreezySLAM algorithms - * - * 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 . - */ - - -#include "../../../../../../../c/random.h" -#include "../jni_utils.h" - -#include - - -// RMHC_SLAM methods ----------------------------------------------------------------------------------------- - -JNIEXPORT void JNICALL Java_edu_wlu_cs_levy_breezyslam_algorithms_RMHCSLAM_init (JNIEnv *env, jobject thisobject, jint random_seed) -{ - ptr_to_obj(env, thisobject, random_new(random_seed)); -} - -JNIEXPORT jobject JNICALL Java_edu_wlu_cs_levy_breezyslam_algorithms_RMHCSLAM_positionSearch (JNIEnv *env, jobject thisobject, - jobject startpos_object, - jobject map_object, - jobject scan_object, - jdouble sigma_xy_mm, - jdouble sigma_theta_degrees, - jint max_search_iter) -{ - position_t startpos; - - startpos.x_mm = get_double_field(env, startpos_object, "x_mm"); - startpos.y_mm = get_double_field(env, startpos_object, "y_mm"); - startpos.theta_degrees = get_double_field(env, startpos_object, "theta_degrees"); - - void * random = ptr_from_obj(env, thisobject); - - position_t newpos = - rmhc_position_search( - startpos, - cmap_from_jmap(env, map_object), - cscan_from_jscan(env, scan_object), - sigma_xy_mm, - sigma_theta_degrees, - max_search_iter, - random); - - jclass cls = (*env)->FindClass(env, "edu/wlu/cs/levy/breezyslam/components/Position"); - - jmethodID constructor = (*env)->GetMethodID(env, cls, "", "(DDD)V"); - - jobject newpos_object = (*env)->NewObject(env, cls, constructor, newpos.x_mm, newpos.y_mm, newpos.theta_degrees); - - return newpos_object; -} diff --git a/java/edu/wlu/cs/levy/breezyslam/components/Laser.java b/java/edu/wlu/cs/levy/breezyslam/components/Laser.java deleted file mode 100644 index aa77425..0000000 --- a/java/edu/wlu/cs/levy/breezyslam/components/Laser.java +++ /dev/null @@ -1,108 +0,0 @@ -/** -* -* BreezySLAM: Simple, efficient SLAM in Java -* -* Laser.java - Java code for Laser model class -* -* 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 . -*/ - -package edu.wlu.cs.levy.breezyslam.components; - -/** -* A class for scanning laser rangefinder (Lidar) parameters. -*/ -public class Laser -{ - - protected int scan_size; - protected double scan_rate_hz; - protected double detection_angle_degrees; - protected double distance_no_detection_mm; - protected int detection_margin; - protected double offset_mm; - - /** - * Builds a Laser object from parameters based on the specifications for your - * Lidar unit. - * @param scan_size number of rays per scan - * @param scan_rate_hz laser scan rate in Hertz - * @param detection_angle_degrees detection angle in degrees (e.g. 240, 360) - * @param detection_margin number of rays at edges of scan to ignore - * @param offset_mm forward/backward offset of laser motor from robot center - * @return a new Laser object - * - */ - public Laser( - int scan_size, - double scan_rate_hz, - double detection_angle_degrees, - double distance_no_detection_mm, - int detection_margin, - double offset_mm) - { - this.scan_size = scan_size; - this.scan_rate_hz = scan_rate_hz; - this.detection_angle_degrees = detection_angle_degrees; - this.distance_no_detection_mm = distance_no_detection_mm; - this.detection_margin = detection_margin; - this.offset_mm = offset_mm; - } - - /** - * Builds a Laser object by copying another Laser object. - * Lidar unit. - * @param laser the other Laser object - * - */ - public Laser(Laser laser) - { - this.scan_size = laser.scan_size; - this.scan_rate_hz = laser.scan_rate_hz; - this.detection_angle_degrees = laser.detection_angle_degrees; - this.distance_no_detection_mm = laser.distance_no_detection_mm; - this.detection_margin = laser.detection_margin; - this.offset_mm = laser.offset_mm; - } - - /** - * Returns a string representation of this Laser object. - */ - - public String toString() - { - String format = "scan_size=%d | scan_rate=%3.3f hz | " + - "detection_angle=%3.3f deg | " + - "distance_no_detection=%7.4f mm | " + - "detection_margin=%d | offset=%4.4f m"; - - return String.format(format, this.scan_size, this.scan_rate_hz, - this.detection_angle_degrees, - this.distance_no_detection_mm, - this.detection_margin, - this.offset_mm); - - } - - /** - * Returns the offset of the laser in mm, from the center of the robot. - * - */ - public double getOffsetMm() - { - return this.offset_mm; - } -} diff --git a/java/edu/wlu/cs/levy/breezyslam/components/Makefile b/java/edu/wlu/cs/levy/breezyslam/components/Makefile deleted file mode 100644 index 35a37bc..0000000 --- a/java/edu/wlu/cs/levy/breezyslam/components/Makefile +++ /dev/null @@ -1,89 +0,0 @@ -# Makefile for BreezySLAM components in Java -# -# 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 . - -BASEDIR = ../../../../../../.. -JAVADIR = $(BASEDIR)/java -CDIR = $(BASEDIR)/c -JFLAGS = -Xlint -JDKINC = -I /usr/lib/jvm/java-7-openjdk-amd64/include -#JDKINC = -I /opt/jdk1.7.0_67/include -I /opt/jdk1.7.0_67/include/linux - -# Set library extension based on OS -ifeq ("$(shell uname)","Darwin") - LIBEXT = dylib -else ifeq ("$(shell uname)","Linux") - CFLAGS = -fPIC - LIBEXT = so -else - LIBEXT = dll -endif - -ARCH = $(shell uname -m) - -# Set SIMD compile params based on architecture -ifeq ("$(ARCH)","armv7l") - SIMD_FLAGS = -mfpu=neon -else ifeq ("$(ARCH)","i686") - SIMD_FLAGS = -msse3 -else - ARCH = sisd -endif - -ALL = libjnibreezyslam_components.$(LIBEXT) Laser.class Position.class PoseChange.class URG04LX.class - -all: $(ALL) - -libjnibreezyslam_components.$(LIBEXT): jnibreezyslam_components.o coreslam.o coreslam_$(ARCH).o - gcc -shared -Wl,-soname,libjnibreezyslam_components.so -o libjnibreezyslam_components.so jnibreezyslam_components.o \ - coreslam.o coreslam_$(ARCH).o - -jnibreezyslam_components.o: jnibreezyslam_components.c Map.h Scan.h ../jni_utils.h - gcc $(JDKINC) -fPIC -c jnibreezyslam_components.c - -coreslam.o: $(CDIR)/coreslam.c $(CDIR)/coreslam.h - gcc -O3 -c -Wall $(CFLAGS) $(CDIR)/coreslam.c - -coreslam_$(ARCH).o: $(CDIR)/coreslam_$(ARCH).c $(CDIR)/coreslam.h - gcc -O3 -c -Wall $(CFLAGS) $(SIMD_FLAGS) $(CDIR)/coreslam_$(ARCH).c - -Map.h: Map.class - javah -o Map.h -classpath $(JAVADIR) -jni edu.wlu.cs.levy.breezyslam.components.Map - -Map.class: Map.java Scan.class Position.class - javac $(JFLAGS) -classpath $(JAVADIR) Map.java - -Scan.h: Scan.class - javah -o Scan.h -classpath $(JAVADIR) -jni edu.wlu.cs.levy.breezyslam.components.Scan - -Scan.class: Scan.java Laser.class - javac $(JFLAGS) -classpath $(JAVADIR) Scan.java - -Laser.class: Laser.java - javac $(JFLAGS) Laser.java - -URG04LX.class: URG04LX.java Laser.class - javac $(JFLAGS) -classpath $(JAVADIR) URG04LX.java - -PoseChange.class: PoseChange.java - javac $(JFLAGS) PoseChange.java - - -Position.class: Position.java - javac $(JFLAGS) Position.java - -clean: - rm -f *.so *.class *.o *.h *~ diff --git a/java/edu/wlu/cs/levy/breezyslam/components/Map.java b/java/edu/wlu/cs/levy/breezyslam/components/Map.java deleted file mode 100644 index 4bfa2f6..0000000 --- a/java/edu/wlu/cs/levy/breezyslam/components/Map.java +++ /dev/null @@ -1,96 +0,0 @@ -/** -* -* BreezySLAM: Simple, efficient SLAM in Java -* -* Map.java - Java code for Map class -* -* 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 . -*/ - -package edu.wlu.cs.levy.breezyslam.components; - -/** -* A class for maps used in SLAM. -*/ -public class Map -{ - static - { - System.loadLibrary("jnibreezyslam_components"); - } - - private native void init(int size_pixels, double size_meters); - - private double size_meters; - - private native void update( - Scan scan, - double position_x_mm, - double position_y_mm, - double position_theta_degrees, - int quality, - double hole_width_mm); - - private long native_ptr; - - /** - * Returns a string representation of this Map object. - */ - public native String toString(); - - /** - * Builds a square Map object. - * @param size_pixels size in pixels - * @param size_meters size in meters - * - */ - public Map(int size_pixels, double size_meters) - { - this.init(size_pixels, size_meters); - - // for public accessor - this.size_meters = size_meters; - } - - /** - * Puts current map values into bytearray, which should of which should be of - * this.size map_size_pixels ^ 2. - * @param bytes byte array that gets the map values - */ - public native void get(byte [] bytes); - - /** - * Updates this map object based on new data. - * @param scan a new scan - * @param position a new postion - * @param quality speed with which scan is integerate into map (0 through 255) - * @param hole_width_mm hole width in millimeters - * - */ - public void update(Scan scan, Position position, int quality, double hole_width_mm) - { - this.update(scan, position.x_mm, position.y_mm, position.theta_degrees, quality, hole_width_mm); - } - - /** - * Returns the size of this map in meters. - */ - public double sizeMeters() - { - return this.size_meters; - } - -} diff --git a/java/edu/wlu/cs/levy/breezyslam/components/PoseChange.java b/java/edu/wlu/cs/levy/breezyslam/components/PoseChange.java deleted file mode 100644 index 7682724..0000000 --- a/java/edu/wlu/cs/levy/breezyslam/components/PoseChange.java +++ /dev/null @@ -1,115 +0,0 @@ -/** -* -* BreezySLAM: Simple, efficient SLAM in Java -* -* PoseChange.java - Java code for PoseChange class, encoding triple -* (dxy_mm, dtheta_degrees, dt_seconds) -* -* 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 . -*/ - -package edu.wlu.cs.levy.breezyslam.components; - -/** -* A class representing the forward and angular velocities of a robot as determined by odometry. -*/ -public class PoseChange -{ - - /** - * Creates a new PoseChange object with specified velocities. - */ - public PoseChange(double dxy_mm, double dtheta_degrees, double dtSeconds) - { - this.dxy_mm = dxy_mm; - this.dtheta_degrees = dtheta_degrees; - this.dt_seconds = dtSeconds; - } - - /** - * Creates a new PoseChange object with zero velocities. - */ - public PoseChange() - { - this.dxy_mm = 0; - this.dtheta_degrees = 0; - this.dt_seconds = 0; - } - - /** - * Updates this PoseChange object. - * @param dxy_mm new forward distance traveled in millimeters - * @param dtheta_degrees new angular rotation in degrees - * @param dtSeconds time in seconds since last velocities - */ - public void update(double dxy_mm, double dtheta_degrees, double dtSeconds) - { - double velocity_factor = (dtSeconds > 0) ? (1 / dtSeconds) : 0; - - this.dxy_mm = dxy_mm * velocity_factor; - - this.dtheta_degrees = dtheta_degrees * velocity_factor; - } - - /** - * Returns a string representation of this PoseChange object. - */ - public String toString() - { - return String.format(". - */ - -package edu.wlu.cs.levy.breezyslam.components; - -/** - * A class representing the position of a robot. - */ -public class Position -{ - - /** - * Distance of robot from left edge of map, in millimeters. - */ - public double x_mm; - - /** - * Distance of robot from top edge of map, in millimeters. - */ - public double y_mm; - - /** - * Clockwise rotation of robot with respect to three o'clock (east), in degrees. - */ - public double theta_degrees; - - /** - * Constructs a new position. - * @param x_mm X coordinate in millimeters - * @param y_mm Y coordinate in millimeters - * @param theta_degrees rotation angle in degrees - */ - public Position(double x_mm, double y_mm, double theta_degrees) - { - this.x_mm = x_mm; - this.y_mm = y_mm; - this.theta_degrees = theta_degrees; - } - - /** - * Constructs a new Position object by copying another. - * @param the other Positon object - */ - - public Position(Position position) - { - this.x_mm = position.x_mm; - this.y_mm = position.y_mm; - this.theta_degrees = position.theta_degrees; - } - - /** - * Returns a string representation of this Position object. - */ - public String toString() - { - String format = ""; - - return String.format(format, this.x_mm, this.y_mm, this.theta_degrees); - - } -} diff --git a/java/edu/wlu/cs/levy/breezyslam/components/Scan.java b/java/edu/wlu/cs/levy/breezyslam/components/Scan.java deleted file mode 100644 index 9f898a8..0000000 --- a/java/edu/wlu/cs/levy/breezyslam/components/Scan.java +++ /dev/null @@ -1,97 +0,0 @@ -/** -* -* BreezySLAM: Simple, efficient SLAM in Java -* -* Scan.java - Java code for Scan class -* -* 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 . -*/ - -package edu.wlu.cs.levy.breezyslam.components; - -/** -* A class for Lidar scans. -*/ -public class Scan -{ - static - { - System.loadLibrary("jnibreezyslam_components"); - } - - private native void init( - int span, - int scan_size, - double scan_rate_hz, - double detection_angle_degrees, - double distance_no_detection_mm, - int detection_margin, - double offset_mm); - - private long native_ptr; - - public native String toString(); - - /** - * Returns a string representation of this Scan object. - */ - public native void update( - int [] lidar_mm, - double hole_width_mm, - double poseChange_dxy_mm, - double poseChange_dtheta_degrees); - - - /** - * Builds a Scan object. - * @param laser laser parameters - * @param span supports spanning laser scan to cover the space better. - * - */ - public Scan(Laser laser, int span) - { - this.init(span, - laser.scan_size, - laser.scan_rate_hz, - laser.detection_angle_degrees, - laser.distance_no_detection_mm, - laser.detection_margin, - laser.offset_mm); - } - - /** - * Builds a Scan object. - * @param laser laser parameters - * - */ - public Scan(Laser laser) - { - this(laser, 1); - } - - /** - * Updates this Scan object with new values from a Lidar scan. - * @param scanvals_mm scanned Lidar distance values in millimeters - * @param hole_width_millimeters hole width in millimeters - * @param poseChange forward velocity and angular velocity of robot at scan time - * - */ - public void update(int [] scanvals_mm, double hole_width_millimeters, PoseChange poseChange) - { - this.update(scanvals_mm, hole_width_millimeters, poseChange.dxy_mm, poseChange.dtheta_degrees); - } -} - diff --git a/java/edu/wlu/cs/levy/breezyslam/components/URG04LX.java b/java/edu/wlu/cs/levy/breezyslam/components/URG04LX.java deleted file mode 100644 index 053b174..0000000 --- a/java/edu/wlu/cs/levy/breezyslam/components/URG04LX.java +++ /dev/null @@ -1,29 +0,0 @@ -package edu.wlu.cs.levy.breezyslam.components; - -/** - * A class for the Hokuyo URG-04LX laser. - */ -public class URG04LX extends Laser -{ - - /** - * Builds a URG04LX object. - * Lidar unit. - * @param detection_margin number of rays at edges of scan to ignore - * @param offset_mm forward/backward offset of laser motor from robot center - * @return a new URG04LX object - * - */ - public URG04LX(int detection_margin, double offset_mm) - { - super(682, 10, 240, 4000, detection_margin, offset_mm); - } - - /** - * Builds a URG04LX object with zero detection margin, offset mm. - */ - public URG04LX() - { - this(0, 0); - } -} diff --git a/java/edu/wlu/cs/levy/breezyslam/components/jnibreezyslam_components.c b/java/edu/wlu/cs/levy/breezyslam/components/jnibreezyslam_components.c deleted file mode 100644 index 6e4d8fa..0000000 --- a/java/edu/wlu/cs/levy/breezyslam/components/jnibreezyslam_components.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * jnibreezyslam_components.c Java Native Interface code for BreezySLAM components - * - * 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 . - */ - -#include "../jni_utils.h" - -#include "Map.h" -#include "Scan.h" - -#include -#include - -#define MAXSTR 100 - -// Map methods ----------------------------------------------------------------------------------------- - -JNIEXPORT void JNICALL Java_edu_wlu_cs_levy_breezyslam_components_Map_init (JNIEnv *env, jobject thisobject, jint size_pixels, jdouble size_meters) -{ - map_t * map = (map_t *)malloc(sizeof(map_t)); - map_init(map, (int)size_pixels, (double)size_meters); - ptr_to_obj(env, thisobject, map); -} - -JNIEXPORT jstring JNICALL Java_edu_wlu_cs_levy_breezyslam_components_Map_toString (JNIEnv *env, jobject thisobject) -{ - map_t * map = cmap_from_jmap(env, thisobject); - - char str[MAXSTR]; - - map_string(*map, str); - - return (*env)->NewStringUTF(env, str); -} - -JNIEXPORT void JNICALL Java_edu_wlu_cs_levy_breezyslam_components_Map_get (JNIEnv *env, jobject thisobject, jbyteArray bytes) -{ - map_t * map = cmap_from_jmap(env, thisobject); - - jbyte * ptr = (*env)->GetByteArrayElements(env, bytes, NULL); - - map_get(map, ptr); - - (*env)->ReleaseByteArrayElements(env, bytes, ptr, 0); -} - -JNIEXPORT void JNICALL Java_edu_wlu_cs_levy_breezyslam_components_Map_update (JNIEnv *env, jobject thisobject, - jobject scanobject, - jdouble position_x_mm, - jdouble position_y_mm, - jdouble position_theta_degrees, - jint quality, - jdouble hole_width_mm) -{ - map_t * map = cmap_from_jmap(env, thisobject); - - scan_t * scan = cscan_from_jscan(env, scanobject); - - position_t position; - - position.x_mm = position_x_mm; - position.y_mm = position_y_mm; - position.theta_degrees = position_theta_degrees; - - map_update(map, scan, position, quality, hole_width_mm); -} - - -// Scan methods ----------------------------------------------------------------------------------------- - -JNIEXPORT void JNICALL Java_edu_wlu_cs_levy_breezyslam_components_Scan_init (JNIEnv *env, jobject thisobject, - jint span, - jint scan_size, - jdouble scan_rate_hz, - jdouble detection_angle_degrees, - jdouble distance_no_detection_mm, - jint detection_margin, - jdouble offset_mm) - { - scan_t * scan = (scan_t *)malloc(sizeof(scan_t)); - - scan_init(scan, - span, - scan_size, - scan_rate_hz, - detection_angle_degrees, - distance_no_detection_mm, - detection_margin, - offset_mm); - - ptr_to_obj(env, thisobject, scan); -} - -JNIEXPORT jstring JNICALL Java_edu_wlu_cs_levy_breezyslam_components_Scan_toString (JNIEnv *env, jobject thisobject) -{ - scan_t * scan = cscan_from_jscan(env, thisobject); - - char str[MAXSTR]; - - scan_string(*scan, str); - - return (*env)->NewStringUTF(env, str); -} - -JNIEXPORT void JNICALL Java_edu_wlu_cs_levy_breezyslam_components_Scan_update (JNIEnv *env, jobject thisobject, - jintArray lidar_mm, - jdouble hole_width_mm, - jdouble velocities_dxy_mm, - jdouble velocities_dtheta_degrees) -{ - scan_t * scan = cscan_from_jscan(env, thisobject); - - jint * lidar_mm_c = (*env)->GetIntArrayElements(env, lidar_mm, 0); - - scan_update(scan, lidar_mm_c, hole_width_mm, velocities_dxy_mm, velocities_dtheta_degrees); - - (*env)->ReleaseIntArrayElements(env, lidar_mm, lidar_mm_c, 0); -} diff --git a/java/edu/wlu/cs/levy/breezyslam/jni_utils.h b/java/edu/wlu/cs/levy/breezyslam/jni_utils.h deleted file mode 100644 index acaa3a5..0000000 --- a/java/edu/wlu/cs/levy/breezyslam/jni_utils.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * jni_utils.h Utilities for Java Native Interface code - * - * 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 . - */ - - -#include -#include -#include "../../../../../../c/coreslam.h" - -#include -#include - -static jfieldID get_fid(JNIEnv *env, jobject object, const char * fieldname, const char * fieldsig) -{ - jclass cls = (*env)->GetObjectClass(env, object); - return (*env)->GetFieldID(env, cls, fieldname, fieldsig); -} - -static jfieldID get_this_fid(JNIEnv *env, jobject thisobject) -{ - return get_fid(env, thisobject, "native_ptr", "J"); -} - -static void * ptr_from_obj(JNIEnv *env, jobject thisobject) -{ - return (void *)(*env)->GetLongField (env, thisobject, get_this_fid(env, thisobject)); -} - -static void ptr_to_obj(JNIEnv *env, jobject thisobject, void * ptr) -{ - (*env)->SetLongField (env, thisobject, get_this_fid(env, thisobject), (long)ptr); -} - -static scan_t * cscan_from_jscan(JNIEnv *env, jobject thisobject) -{ - return (scan_t *)ptr_from_obj(env, thisobject); -} - -static map_t * cmap_from_jmap(JNIEnv *env, jobject thisobject) -{ - return (map_t *)ptr_from_obj(env, thisobject); -} - -static double get_double_field(JNIEnv *env, jobject object, const char * fieldname) -{ - return (*env)->GetDoubleField (env, object, get_fid(env, object, fieldname, "D")); -} - - diff --git a/java/edu/wlu/cs/levy/breezyslam/robots/WheeledRobot.java b/java/edu/wlu/cs/levy/breezyslam/robots/WheeledRobot.java deleted file mode 100644 index f2b2822..0000000 --- a/java/edu/wlu/cs/levy/breezyslam/robots/WheeledRobot.java +++ /dev/null @@ -1,130 +0,0 @@ -/** - * - * BreezySLAM: Simple, efficient SLAM in Java - * - * WheeledRobot.java - Java class for wheeled robots - * - * 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 . - */ - - -package edu.wlu.cs.levy.breezyslam.robots; - -import edu.wlu.cs.levy.breezyslam.components.PoseChange; - - -/** - * An abstract class for wheeled robots. Supports computation of forward and angular - * poseChange based on odometry. Your subclass should should implement the - * extractOdometry method. - */ -public abstract class WheeledRobot -{ - - /** - * Builds a WheeledRobot object. Parameters should be based on the specifications for - * your robot. - * @param wheel_radius_mm radius of each odometry wheel, in meters - * @param half_axle_length_mm half the length of the axle between the odometry wheels, in meters - * @return a new WheeledRobot object - */ - protected WheeledRobot(double wheel_radius_mm, double half_axle_length_mm) - { - this.wheel_radius_mm = wheel_radius_mm; - this.half_axle_length_mm = half_axle_length_mm; - - this.timestamp_seconds_prev = 0; - this.left_wheel_degrees_prev = 0; - this.right_wheel_degrees_prev = 0; - } - - public String toString() - { - - return String.format("", - this.wheel_radius_mm, this.half_axle_length_mm, this.descriptorString()); - } - - /** - * Computes forward and angular poseChange based on odometry. - * @param timestamp time stamp, in whatever units your robot uses - * @param left_wheel_odometry odometry for left wheel, in whatever units your robot uses - * @param right_wheel_odometry odometry for right wheel, in whatever units your robot uses - * @return poseChange object representing poseChange for these odometry values - */ - - public PoseChange computePoseChange( double timestamp, double left_wheel_odometry, double right_wheel_odometry) - { - WheelOdometry odometry = this.extractOdometry(timestamp, left_wheel_odometry, right_wheel_odometry); - - double dxy_mm = 0; - double dtheta_degrees = 0; - double dt_seconds = 0; - - if (this.timestamp_seconds_prev > 0) - { - double left_diff_degrees = odometry.left_wheel_degrees - this.left_wheel_degrees_prev; - double right_diff_degrees = odometry.right_wheel_degrees - this.right_wheel_degrees_prev; - - dxy_mm = this.wheel_radius_mm * (java.lang.Math.toRadians(left_diff_degrees) + java.lang.Math.toRadians(right_diff_degrees)); - - dtheta_degrees = this.wheel_radius_mm / this.half_axle_length_mm * (right_diff_degrees - left_diff_degrees); - - dt_seconds = odometry.timestamp_seconds - this.timestamp_seconds_prev; - } - - // Store current odometry for next time - this.timestamp_seconds_prev = odometry.timestamp_seconds; - this.left_wheel_degrees_prev = odometry.left_wheel_degrees; - this.right_wheel_degrees_prev = odometry.right_wheel_degrees; - - return new PoseChange(dxy_mm, dtheta_degrees, dt_seconds); - } - - /** - * Extracts usable odometry values from your robot's odometry. - * @param timestamp time stamp, in whatever units your robot uses - * @param left_wheel_odometry odometry for left wheel, in whatever units your robot uses - * @param right_wheel_odometry odometry for right wheel, in whatever units your robot uses - * @return WheelOdometry object containing timestamp in seconds, left wheel degrees, right wheel degrees - */ - protected abstract WheelOdometry extractOdometry(double timestamp, double left_wheel_odometry, double right_wheel_odometry); - - protected abstract String descriptorString(); - - protected class WheelOdometry - { - public WheelOdometry(double timestamp_seconds, double left_wheel_degrees, double right_wheel_degrees) - { - this.timestamp_seconds = timestamp_seconds; - this.left_wheel_degrees = left_wheel_degrees; - this.right_wheel_degrees = right_wheel_degrees; - } - - public double timestamp_seconds; - public double left_wheel_degrees; - public double right_wheel_degrees; - - } - - - private double wheel_radius_mm; - private double half_axle_length_mm; - - private double timestamp_seconds_prev; - private double left_wheel_degrees_prev; - private double right_wheel_degrees_prev; -} diff --git a/matlab/CoreSLAM.m b/matlab/CoreSLAM.m deleted file mode 100644 index ad17c74..0000000 --- a/matlab/CoreSLAM.m +++ /dev/null @@ -1,136 +0,0 @@ -classdef CoreSLAM - %CoreSLAM CoreSLAM abstract class for BreezySLAM - % CoreSLAM is an abstract class that uses the classes Position, - % Map, Scan, and Laser to run variants of the simple CoreSLAM - % (tinySLAM) algorithm described in - % - % @inproceedings{coreslam-2010, - % author = {Bruno Steux and Oussama El Hamzaoui}, - % title = {CoreSLAM: a SLAM Algorithm in less than 200 lines of C code}, - % booktitle = {11th International Conference on Control, Automation, - % Robotics and Vision, ICARCV 2010, Singapore, 7-10 - % December 2010, Proceedings}, - % pages = {1975-1979}, - % publisher = {IEEE}, - % year = {2010} - % } - % - % - % Implementing classes should provide the method - % - % updateMapAndPointcloud(scan_mm, velocities) - % - % to update the map and point-cloud (particle cloud). - % - % 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 . - - properties (Access = 'public') - map_quality = 50; % The quality of the map (0 through 255); default = 50 - hole_width_mm = 600; % The width in millimeters of each "hole" in the map (essentially, wall width); default = 600 - end - - properties (Access = 'protected') - laser % (internal) - scan_for_distance % (internal) - scan_for_mapbuild % (internal) - map % (internal) - velocities % (internal) - end - - methods (Abstract, Access = 'protected') - - updateMapAndPointcloud(slam, velocities) - - end - - methods (Access = 'private') - - function scan_update(slam, scanobj, scans_mm) - scanobj.update(scans_mm, slam.hole_width_mm, slam.velocities) - end - - end - - methods (Access = 'protected') - - function slam = CoreSLAM(laser, map_size_pixels, map_size_meters) - % Creates a CoreSLAM object suitable for updating with new Lidar and odometry data. - % CoreSLAM(laser, map_size_pixels, map_size_meters) - % laser is a Laser object representing the specifications of your Lidar unit - % map_size_pixels is the size of the square map in pixels - % map_size_meters is the size of the square map in meters - - % Store laser for later - slam.laser = laser; - - % Initialize velocities (dxyMillimeters, dthetaDegrees, dtSeconds) for odometry - slam.velocities = [0, 0, 0]; - - % Initialize a scan for computing distance to map, and one for updating map - slam.scan_for_distance = Scan(laser, 1); - slam.scan_for_mapbuild = Scan(laser, 3); - - % Initialize the map - slam.map = Map(map_size_pixels, map_size_meters); - - end - end - - methods (Access = 'public') - - function slam = update(slam, scans_mm, velocities) - % Updates the scan and odometry. - % Calls the the implementing class's updateMapAndPointcloud() - % method with the specified velocities. - % - % slam = update(slam, scans_mm, [velocities]) - % - % scan_mm is a list of Lidar scan values, whose count is specified in the scan_size - % velocities is an optional list of velocities [dxy_mm, dtheta_degrees, dt_seconds] for odometry - - % Build a scan for computing distance to map, and one for updating map - slam.scan_update(slam.scan_for_mapbuild, scans_mm) - slam.scan_update(slam.scan_for_distance, scans_mm) - - % Default to zero velocities - if nargin < 3 - velocities = [0, 0, 0]; - end - - % Update velocities - velocity_factor = 0; - if velocities(3) > 0 - velocity_factor = 1 / velocities(3); - end - new_dxy_mm = velocities(1) * velocity_factor; - new_dtheta_degrees = velocities(2) * velocity_factor; - slam.velocities = [new_dxy_mm, new_dtheta_degrees, 0]; - - % Implementing class updates map and pointcloud - slam = slam.updateMapAndPointcloud(velocities); - - end - - function map = getmap(slam) - % Returns the current map. - % Map is returned as an occupancy grid (matrix of pixels). - map = slam.map.get(); - end - - end - -end - diff --git a/matlab/Deterministic_SLAM.m b/matlab/Deterministic_SLAM.m deleted file mode 100644 index 2b7c8e7..0000000 --- a/matlab/Deterministic_SLAM.m +++ /dev/null @@ -1,44 +0,0 @@ -classdef Deterministic_SLAM < SinglePositionSLAM - %Deterministic_SLAM SLAM with no Monte Carlo search - % Implements the getNewPosition() method of SinglePositionSLAM - % by copying the start position. - % - % 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 . - - methods - - function slam = Deterministic_SLAM(laser, map_size_pixels, map_size_meters) - %Creates a Deterministic_SLAM object suitable for updating with new Lidar and odometry data. - % slam = Deterministic_SLAM(laser, map_size_pixels, map_size_meters) - % laser is a Laser object representing the specifications of your Lidar unit - % map_size_pixels is the size of the square map in pixels - % map_size_meters is the size of the square map in meters - - slam = slam@SinglePositionSLAM(laser, map_size_pixels, map_size_meters); - - end - - function new_pos = getNewPosition(~, start_pos) - % Implements the _getNewPosition() method of SinglePositionSLAM. - % new_pos = getNewPosition(~, start_pos) simply returns start_pos - - new_pos = start_pos; - end - - end - -end - diff --git a/matlab/Map.m b/matlab/Map.m deleted file mode 100644 index e3f960e..0000000 --- a/matlab/Map.m +++ /dev/null @@ -1,59 +0,0 @@ -classdef Map - %A class for maps (occupancy grids) used in SLAM - % - % 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 . - - properties (Access = {?RMHC_SLAM}) - - c_map - end - - methods (Access = 'public') - - function map = Map(size_pixels, size_meters) - % Map creates an empty square map - % map = Map(size_pixels, size_meters) - map.c_map = mex_breezyslam('Map_init', size_pixels, size_meters); - - end - - function disp(map) - % Displays data about this map - mex_breezyslam('Map_disp', map.c_map) - - end - - function update(map, scan, new_position, map_quality, hole_width_mm) - % Updates this map with a new scan and position - % - % update(map, scan, new_position, map_quality, hole_width_mm) - mex_breezyslam('Map_update', map.c_map, scan.c_scan, new_position, int32(map_quality), hole_width_mm) - - end - - function bytes = get(map) - % Returns occupancy grid matrix of bytes for this map - % - % bytes = get(map) - - % Transpose for uniformity with Python, C++ versions - bytes = mex_breezyslam('Map_get', map.c_map)'; - - end - - end % methods - -end % classdef diff --git a/matlab/RMHC_SLAM.m b/matlab/RMHC_SLAM.m deleted file mode 100644 index 0062574..0000000 --- a/matlab/RMHC_SLAM.m +++ /dev/null @@ -1,72 +0,0 @@ -classdef RMHC_SLAM < SinglePositionSLAM - %RMHC_SLAM Random Mutation Hill-Climbing SLAM - % Implements the getNewPosition() method of SinglePositionSLAM - % using Random-Mutation Hill-Climbing search. Uses its own internal - % pseudorandom-number generator for efficiency. - % - % 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 . - - properties (Access = 'public') - sigma_xy_mm = 100; % std. dev. of X/Y component of search - sigma_theta_degrees = 20; % std. dev. of angular component of search - max_search_iter = 1000; % max. # of search iterations per update - end - - properties (Access = 'private') - c_randomizer - end - - methods - - function slam = RMHC_SLAM(laser, map_size_pixels, map_size_meters, random_seed) - %Creates an RMHC_SLAM object suitable for updating with new Lidar and odometry data. - % slam = RMHC_SLAM(laser, map_size_pixels, map_size_meters, random_seed) - % laser is a Laser object representing the specifications of your Lidar unit - % map_size_pixels is the size of the square map in pixels - % map_size_meters is the size of the square map in meters - % random_seed supports reproducible results; defaults to system time if unspecified - - slam = slam@SinglePositionSLAM(laser, map_size_pixels, map_size_meters); - - if nargin < 3 - random_seed = floor(cputime) & hex2dec('FFFF'); - end - - slam.c_randomizer = mex_breezyslam('Randomizer_init', random_seed); - - end - - function new_pos = getNewPosition(slam, start_pos) - % Implements the _getNewPosition() method of SinglePositionSLAM. - % Uses Random-Mutation Hill-Climbing search to look for a - % better position based on a starting position. - - [new_pos.x_mm,new_pos.y_mm,new_pos.theta_degrees] = ... - mex_breezyslam('rmhcPositionSearch', ... - start_pos, ... - slam.map.c_map, ... - slam.scan_for_distance.c_scan, ... - slam.laser,... - slam.sigma_xy_mm,... - slam.sigma_theta_degrees,... - slam.max_search_iter,... - slam.c_randomizer); - end - - end - -end - diff --git a/matlab/Scan.m b/matlab/Scan.m deleted file mode 100644 index 4004572..0000000 --- a/matlab/Scan.m +++ /dev/null @@ -1,66 +0,0 @@ -classdef Scan - %A class for Lidar scans used in SLAM - % - % 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 . - - properties (Access = {?Map, ?RMHC_SLAM}) - - c_scan - end - - methods - - function scan = Scan(laser, span) - % Creates a new scan object - % scan = Scan(laser, [span]) - % laser is a structure with the fields: - % scan_size - % scan_rate_hz - % detection_angle_degrees - % distance_no_detection_mm - % distance_no_detection_mm - % detection_margin - % offset_mm = offset_mm - % span (default=1) supports spanning laser scan to cover the space better - - if nargin < 2 - span = 1; - end - - scan.c_scan = mex_breezyslam('Scan_init', laser, span); - - end - - function disp(scan) - % Displays information about this Scan - - mex_breezyslam('Scan_disp', scan.c_scan) - - end - - function update(scan, scans_mm, hole_width_mm, velocities) - % Updates scan with new lidar and velocity data - % update(scans_mm, hole_width_mm, [velocities]) - % scans_mm is a list of integers representing scanned distances in mm. - % hole_width_mm is the width of holes (obstacles, walls) in millimeters. - % velocities is an optional list[dxy_mm, dtheta_degrees] - % i.e., robot's (forward, rotational velocity) for improving the quality of the scan. - mex_breezyslam('Scan_update', scan.c_scan, int32(scans_mm), hole_width_mm, velocities) - end - - end - -end diff --git a/matlab/SinglePositionSLAM.m b/matlab/SinglePositionSLAM.m deleted file mode 100644 index 787753c..0000000 --- a/matlab/SinglePositionSLAM.m +++ /dev/null @@ -1,101 +0,0 @@ -classdef SinglePositionSLAM < CoreSLAM - %SinglePositionSLAM Abstract class for CoreSLAM with single-point cloud - % Implementing classes should provide the method - % - % getNewPosition(self, start_position) - % - % to compute a new position based on searching from a starting position. - % - % 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 . - - properties (Access = 'private') - position - end - - methods (Abstract) - getNewPosition(slam, start_pos) - end - - methods (Access = 'private') - - function c = costheta(slam) - c = cosd(slam.position.theta_degrees); - end - - function s = sintheta(slam) - s = sind(slam.position.theta_degrees); - end - - end - - methods (Access = 'public') - - function slam = SinglePositionSLAM(laser, map_size_pixels, map_size_meters) - - slam = slam@CoreSLAM(laser, map_size_pixels, map_size_meters); - - % Initialize the position (x, y, theta) - init_coord_mm = 500 * map_size_meters; % center of map - slam.position.x_mm = init_coord_mm; - slam.position.y_mm = init_coord_mm; - slam.position.theta_degrees = 0; - - end - - function [x_mm, y_mm, theta_degrees] = getpos(slam) - % Returns the current position. - % [x_mm, y_mm, theta_degrees] = getpos(slam) - - x_mm = slam.position.x_mm; - y_mm = slam.position.y_mm; - theta_degrees = slam.position.theta_degrees; - end - - end - - methods (Access = 'protected') - - function slam = updateMapAndPointcloud(slam, velocities) - - % Start at current position - start_pos = slam.position; - - % Add effect of velocities - start_pos.x_mm = start_pos.x_mm + velocities(1) * slam.costheta(); - start_pos.y_mm = start_pos.y_mm + velocities(1) * slam.sintheta(); - start_pos.theta_degrees = start_pos.theta_degrees + velocities(2); - - % Add offset from laser - start_pos.x_mm = start_pos.x_mm + slam.laser.offset_mm * slam.costheta(); - start_pos.y_mm = start_pos.y_mm + slam.laser.offset_mm * slam.sintheta(); - - % Get new position from implementing class - new_position = slam.getNewPosition(start_pos); - - % Update the map with this new position - slam.map.update(slam.scan_for_mapbuild, new_position, slam.map_quality, slam.hole_width_mm) - - % Update the current position with this new position, adjusted by laser offset - slam.position = new_position; - slam.position.x_mm = slam.position.x_mm - slam.laser.offset_mm * slam.costheta(); - slam.position.y_mm = slam.position.y_mm - slam.laser.offset_mm * slam.sintheta(); - - end - - end - -end - diff --git a/matlab/WheeledRobot.m b/matlab/WheeledRobot.m deleted file mode 100644 index ac155c7..0000000 --- a/matlab/WheeledRobot.m +++ /dev/null @@ -1,112 +0,0 @@ -classdef WheeledRobot - %WheeledRobot An abstract class supporting ododmetry for wheeled robots. - % Your implementing class should provide the method: - % - % extractOdometry(obj, timestamp, leftWheel, rightWheel) --> - % (timestampSeconds, leftWheelDegrees, rightWheelDegrees) - % - % 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 . - - properties (Access = 'private') - - wheelRadiusMillimeters - halfAxleLengthMillimeters - - timestampSecondsPrev - leftWheelDegreesPrev - rightWheelDegreesPrev - - end - - methods (Access = 'protected') - - function s = str(obj) - % Returns a string representation of this WheeledRobot - s = sprintf('', ... - obj.wheelRadiusMillimeters, obj.halfAxleLengthMillimeters); - end - - function robot = WheeledRobot(wheelRadiusMillimeters, halfAxleLengthMillimeters) - % Constructs a WheeledRobot object - % robot = WheeledRobot(wheelRadiusMillimeters, halfAxleLengthMillimeters) - robot.wheelRadiusMillimeters = wheelRadiusMillimeters; - robot.halfAxleLengthMillimeters = halfAxleLengthMillimeters; - - end - - function r = deg2rad(~, d) - % Converts degrees to radians - r = d * pi / 180; - end - - end - - methods (Abstract) - - extractOdometry(obj, timestamp, leftWheel, rightWheel) - - end - - methods (Access = 'public') - - function [poseChange, obj] = computePoseChange(obj, timestamp, leftWheelOdometry, rightWheelOdometry) - % Computes forward and angular poseChange based on odometry. - % - % Parameters: - - % timestamp time stamp, in whatever units your robot uses - % leftWheelOdometry odometry for left wheel, in whatever form your robot uses - % rightWheelOdometry odometry for right wheel, in whatever form your robot uses - % - % Returns a tuple (dxyMillimeters, dthetaDegrees, dtSeconds) - - % dxyMillimeters forward distance traveled, in millimeters - % dthetaDegrees change in angular position, in degrees - % dtSeconds elapsed time since previous odometry, in seconds - - dxyMillimeters = 0; - dthetaDegrees = 0; - dtSeconds = 0; - - [timestampSecondsCurr, leftWheelDegreesCurr, rightWheelDegreesCurr] = ... - obj.extractOdometry(timestamp, leftWheelOdometry, rightWheelOdometry); - - if obj.timestampSecondsPrev - - leftDiffDegrees = leftWheelDegreesCurr - obj.leftWheelDegreesPrev; - rightDiffDegrees = rightWheelDegreesCurr - obj.rightWheelDegreesPrev; - - dxyMillimeters = obj.wheelRadiusMillimeters * ... - (obj.deg2rad(leftDiffDegrees) + obj.deg2rad(rightDiffDegrees)); - - dthetaDegrees = (obj.wheelRadiusMillimeters / obj.halfAxleLengthMillimeters) * ... - (rightDiffDegrees - leftDiffDegrees); - - dtSeconds = timestampSecondsCurr - obj.timestampSecondsPrev; - end - - % Store current odometry for next time - obj.timestampSecondsPrev = timestampSecondsCurr; - obj.leftWheelDegreesPrev = leftWheelDegreesCurr; - obj.rightWheelDegreesPrev = rightWheelDegreesCurr; - - % Return linear velocity, angular velocity, time difference - poseChange = [dxyMillimeters, dthetaDegrees, dtSeconds]; - - end - end -end - diff --git a/matlab/make.m b/matlab/make.m deleted file mode 100644 index b00df47..0000000 --- a/matlab/make.m +++ /dev/null @@ -1,19 +0,0 @@ -% Script for building BreezySLAM C extensions - -% 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 . - - -mex mex_breezyslam.c ../c/coreslam.c ../c/coreslam_sisd.c ../c/random.c ../c/ziggurat.c diff --git a/matlab/mex_breezyslam.c b/matlab/mex_breezyslam.c deleted file mode 100644 index b74cbf3..0000000 --- a/matlab/mex_breezyslam.c +++ /dev/null @@ -1,294 +0,0 @@ -/* - * mex_breezyslam.c : C extensions for BreezySLAM in Matlab - * - * 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 . - */ - -#include "mex.h" - -#include "../c/coreslam.h" -#include "../c/random.h" - -#define MAXSTR 100 - -/* Helpers ------------------------------------------------------------- */ - -static int _streq(char * s, const char * t) -{ - return !strcmp(s, t); -} - -static void _insert_obj_lhs(mxArray *plhs[], void * obj, int pos) -{ - long * outptr = NULL; - - plhs[pos] = mxCreateNumericMatrix(1, 1, mxINT64_CLASS, mxREAL); - - outptr = (long *) mxGetPr(plhs[pos]); - - mexMakeMemoryPersistent(obj); - - *outptr = (long)obj; -} - -static double _get_field(const mxArray * pm, const char * fieldname) -{ - mxArray * field_array_ptr = mxGetField(pm, 0, fieldname); - - return mxGetScalar(field_array_ptr); -} - -static long _rhs2ptr(const mxArray * prhs[], int index) -{ - long * inptr = (long *) mxGetPr(prhs[index]); - - return *inptr; -} - -static scan_t * _rhs2scan(const mxArray * prhs[], int index) -{ - long inptr = _rhs2ptr(prhs, index); - - return (scan_t *)inptr; -} - -static map_t * _rhs2map(const mxArray * prhs[], int index) -{ - long inptr = _rhs2ptr(prhs, index); - - return (map_t *)inptr; -} - -static position_t _rhs2pos(const mxArray * prhs[], int index) -{ - position_t position; - - position.x_mm = _get_field(prhs[index], "x_mm"); - position.y_mm = _get_field(prhs[index], "y_mm"); - position.theta_degrees = _get_field(prhs[index], "theta_degrees"); - - return position; -} - -/* Class methods ------------------------------------------------------- */ - -static void _map_init(mxArray *plhs[], const mxArray * prhs[]) -{ - - int size_pixels = (int)mxGetScalar(prhs[1]); - - double size_meters = mxGetScalar(prhs[2]); - - map_t * map = (map_t *)mxMalloc(sizeof(map_t)); - - map_init(map, size_pixels, size_meters); - - _insert_obj_lhs(plhs, map, 0); -} - -static void _map_disp(const mxArray * prhs[]) -{ - char str[MAXSTR]; - - map_t * map = _rhs2map(prhs, 1); - - map_string(*map, str); - - printf("%s\n", str); -} - -static void _map_update(const mxArray * prhs[]) -{ - map_t * map = _rhs2map(prhs, 1); - - scan_t * scan = _rhs2scan(prhs, 2); - - position_t position = _rhs2pos(prhs, 3); - - int map_quality = (int)mxGetScalar(prhs[4]); - - double hole_width_mm = mxGetScalar(prhs[5]); - - map_update(map, scan, position, map_quality, hole_width_mm); -} - -static void _map_get(mxArray *plhs[], const mxArray * prhs[]) -{ - map_t * map = _rhs2map(prhs, 1); - - unsigned char * pointer = NULL; - - plhs[0] = mxCreateNumericMatrix(map->size_pixels, map->size_pixels, - mxUINT8_CLASS, mxREAL); - - pointer = (unsigned char *)mxGetPr(plhs[0]); - - map_get(map, pointer); -} - - -static void _scan_init(mxArray *plhs[], const mxArray * prhs[]) -{ - - scan_t * scan = (scan_t *)mxMalloc(sizeof(scan_t)); - - int span = (int)mxGetScalar(prhs[2]); - - const mxArray * laser = prhs[1]; - int scan_size = (int)_get_field(laser, "scan_size"); - double scan_rate_hz = _get_field(laser, "scan_rate_hz"); - double detection_angle_degrees = _get_field(laser, "detection_angle_degrees"); - double distance_no_detection_mm = _get_field(laser, "distance_no_detection_mm"); - int detection_margin = (int)_get_field(laser, "detection_margin"); - double offset_mm = _get_field(laser, "offset_mm"); - - scan_init( - scan, - span, - scan_size, - scan_rate_hz, - detection_angle_degrees, - distance_no_detection_mm, - detection_margin, - offset_mm); - - _insert_obj_lhs(plhs, scan, 0); -} - -static void _scan_disp(const mxArray * prhs[]) -{ - char str[MAXSTR]; - - scan_t * scan = _rhs2scan(prhs, 1); - - scan_string(*scan, str); - - printf("%s\n", str); -} - -static void _scan_update(const mxArray * prhs[]) -{ - scan_t * scan = _rhs2scan(prhs, 1); - - int scansize = (int)mxGetNumberOfElements(prhs[2]); - - int * lidar_mm = (int *)mxGetPr(prhs[2]); - - double hole_width_mm = mxGetScalar(prhs[3]); - - double * velocities = mxGetPr(prhs[4]); - - scan_update(scan, lidar_mm, hole_width_mm, velocities[0], velocities[1]); -} - -static void _randomizer_init(mxArray *plhs[], const mxArray * prhs[]) -{ - int seed = (int)mxGetScalar(prhs[1]); - - void * r = mxMalloc(random_size()); - - random_init(r, seed); - - _insert_obj_lhs(plhs, r, 0); -} - -static void _rmhcPositionSearch(mxArray *plhs[], const mxArray * prhs[]) -{ - position_t start_pos = _rhs2pos(prhs, 1); - - map_t * map = _rhs2map(prhs, 2); - - scan_t * scan = _rhs2scan(prhs, 3); - - position_t new_pos; - - double sigma_xy_mm = mxGetScalar(prhs[5]); - - double sigma_theta_degrees = mxGetScalar(prhs[6]); - - int max_search_iter = (int)mxGetScalar(prhs[7]); - - void * randomizer = (void *)(long)mxGetScalar(prhs[8]); - - new_pos = rmhc_position_search( - start_pos, - map, - scan, - sigma_xy_mm, - sigma_theta_degrees, - max_search_iter, - randomizer); - - plhs[0] = mxCreateDoubleScalar(new_pos.x_mm); - plhs[1] = mxCreateDoubleScalar(new_pos.y_mm); - plhs[2] = mxCreateDoubleScalar(new_pos.theta_degrees); -} - -/* The gateway function ------------------------------------------------ */ -void mexFunction( int nlhs, mxArray *plhs[], - int nrhs, const mxArray * prhs[]) -{ - - char methodname[MAXSTR]; - - mxGetString(prhs[0], methodname, 100); - - if (_streq(methodname, "Map_init")) - { - _map_init(plhs, prhs); - } - - else if (_streq(methodname, "Map_disp")) - { - _map_disp(prhs); - } - - else if (_streq(methodname, "Map_update")) - { - _map_update(prhs); - } - - else if (_streq(methodname, "Map_get")) - { - _map_get(plhs, prhs); - } - - else if (_streq(methodname, "Scan_init")) - { - _scan_init(plhs, prhs); - } - - else if (_streq(methodname, "Scan_disp")) - { - _scan_disp(prhs); - } - - else if (_streq(methodname, "Scan_update")) - { - _scan_update(prhs); - } - - else if (_streq(methodname, "Randomizer_init")) - { - _randomizer_init(plhs, prhs); - } - - else if (_streq(methodname, "rmhcPositionSearch")) - { - _rmhcPositionSearch(plhs, prhs); - } -} - diff --git a/matlab/mex_breezyslam.mexa64 b/matlab/mex_breezyslam.mexa64 deleted file mode 100755 index 0e9425666089018199330fdca8ff0426ea80a9e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23466 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 diff --git a/matlab/mex_breezyslam.mexmaci64 b/matlab/mex_breezyslam.mexmaci64 deleted file mode 100644 index 97fc14b98362a43e56b32a23d6f4d933e4b04536..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23440 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 diff --git a/matlab/mex_breezyslam.mexw64 b/matlab/mex_breezyslam.mexw64 deleted file mode 100644 index 28bdc0a3788bb8904aa184b6dfab3d2f8c9fa44b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18432 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 AaR2}S diff --git a/python/breezyslam/algorithms.py b/python/breezyslam/algorithms.py index f9a7b7d..5a823e1 100644 --- a/python/breezyslam/algorithms.py +++ b/python/breezyslam/algorithms.py @@ -308,5 +308,3 @@ class Deterministic_SLAM(SinglePositionSLAM): ''' return start_position.copy() - -