Lost robot in Gates Basement (Data courtesy of Doug Johnston)
A poor O-ring bot is lost in Gates Basement.
Your task is to implement a Monte Carlo Localization algorithm to help the robot find its way.
There are three types of entries in the log files: LASER, POSITION, SYNC.
You may ignore the SYNC entries. The formats for POSITION and LASER readings are:
log_time robot_name port position 0 reading_time x y theta dx dy dtheta 0
log_time robot_name port laser 0 reading_time -pi/2 pi/2 pi/361 0361 reading_1 0 reading_2 0 reading_3 0 ...
Try starting with dataset #1.
We may collect more datasets for you to test your algorithm.
You should generate animations demonstrating your results.
Here are some sample animations.
A few things to help you get started...
Here are a few things to help you get started on the warm-up project.
Sample code to read in the log files (RobotLogFile.h)
Sample program (SimpleOpenGL.cpp or SimpleOpenGL-linux.cpp) in OpenGL/SDL capable of drawing:
on the map of Gates basement (plus some basic zooming+scrolling functionalities). For anyone who doesn't want to have to deal with graphics, you should be able to use this code for debugging your algorithm. Start from the section that reads "robot localization algorithm goes in here..."
- robot pose
- laser scan measurments
- history of robot path
Sample code to produce output logs (LocalizationOutputFile.h). Please make sure your program can generate two log files for each data set. I'll post the format of the log files on the web.
- Windows: use SimpleOpenGL.cpp or Visual Studio .NET Project SimpleOpenGL.vcproj
- Linux: use SimpleOpenGL-linux.cpp
To re-compile the graphics interface, you need Simple DirectMedia Layer (SDL).
A compiled windows executable is included if you just want a rough idea of what paths look like.
The other two header files are self-contained and uses only the Standard Template Library.
Please produce two log files per dataset. The first file contains a history of robot pose per timestep:
time x y theta
The second file contains particles per timestep. You do not need to include all particles (100 per timestep is more than enough):
time x_0 y_0 theta_0 x_1 y_1 theta_1 x_2 y_2 theta_2 ...