Name Last modified Size Description
Parent Directory -
logs.zip 09-Sep-2007 12:18 75M
logs/ 15-Sep-2007 19:24 -
matlab.zip 09-Sep-2007 12:19 11K
matlab/ 15-Sep-2007 19:24 -
These are the log files and the code used for the paper:
A. Censi, L. Marchionni, G. Oriolo “Simultaneous maximum-likelihood calibration of robot and sensor parameters”
The paper is available at http://purl.org/censi/2007/calib
Table of contents:
We kept all logs we generated; however, some of them are unusable because of bugs or other accidents (dieing batteries, etc.).
In general:
k01 to k05 we were still developing the software: odometry has spikes in the millions, etc. We include them here for sentimental purposes.k06 to k21, we were still using the old Hokuyo firmware with which we could not synchronize the Hokuyo timestamp: the timestamp in the laser log is gettimeofday() when the laser was received. These are used in the paper.k22 to k30: good logs for robot “number 2”. Finally, laser and odometry are synchronized. MUCH better results. These are used in the paper.k31 to k35: good logs for another robot. We tried to strip some weight to the side to change the odometry parameters, but to no avail.k40 to k45: good logs for robot “number 2”, this time with the laser mounted in a different pose. See the photos below. These are used in the paper.

Please note that:
For each experiment, there are two logs produced: one for the laser data, and one for the odometry data.
For example, for the experiment “k42”, there are the two files:
k42l.log.bz2
k42r.data.bz2
They are both compressed with bzip2. In the scripts, a string like “k42” is called the prefix.
We have saved all the processed logs in Matlab format, so you do not have to install any other software.
By loading the file icra08_final.mat:
>> load icra08_final.mat
you can see the logs and the results after preprocessing and do not need to install any other software.
In icra08_final.mat, there is a variable cal holding all the logs. This does the calibration using log k45:
>> res = full_calibration(cal.logs{45})
To merge two logs together:
>> big_one = merge_experiments({cal.logs{44}, cal.logs{45}});
>> res = full_calibration(big_one)
For the iterative trimming, use:
>> calib_iterative(cal.logs{44})
Prerequisites:
The C(anonical) Scan Matcher:
http://purl.org/censi/2007/csm
Make sure that the executables are on your path. Moreover, make sure that also the Matlab scripts contained in the CSM package are reachable by Matlab.
>> addpath(genpath('../../csm/'))
CMake, for the build process of CSM:
http://www.cmake.org
The GNU Scientific Libraries (pre-requisite for CSM).
Ruby, for some scripts used for handling logs.
To process a log, use these commands:
$ cd logs
$ ./prepare_one_log_compact.sh k42
this runs scan matching, and creates two files:
k22r.m # odometry log in Matlab format
k22l_sm_stats.m # scan-matching results in Matlab format
Load these files in Matlab using the command:
>> log22 = calib_load_log('k22')
Run the calibration algorithm using:
>> full_calibration(log22)
The following does the iterative trimming:
>> calib_iterative(log22)
and shows the outliers.
This is a complete description of what goes one when running the prepare_one_log_compact.sh log.
Decompression of the logs
$ bunzip2 k22r.bz2
The script prepare_robot_log.rb translates the .dat to the JSON format.
$ ./prepare_robot_log.rb < k03r.dat > k03r.json
Translate the JSON in Matlab, using the json2matlab.rb Ruby script contained in CSM.
$ ../../csm/scripts/json2matlab.rb k03r.json
This creates the file k03r.m.
Load k03r.m into Matlab.
odo03 = k03r;
This is a cell array (one cell per interval).
We use the sm2 program in CSM. The program has two outputs: the scan-matched log (-out) and the statistics about the matching (-out_stats).
$ sm2 -in k03l.log -out k03l_sm.log -out_stats k03l_sm_stats.json
Convert the JSON in Matlab:
$ ~/csm/csm/scripts/json2matlab.rb k03l_sm_stats.json
Read all of this in Matlab:
$ laser03 = k03l_sm_stats;
Use the function
log03 = merge_logs(laser03, odo03);
Run the method using:
res = full_calibration(log03);
or, for the iterative version, use:
res = calib_iterative(log03)
.log)The laser scans are in Carmen format.
FLASER n_rays readings ... 0 0 0 0 0 0 timestamp_sec "hokuyo" timestamp_usec
.dat)Each row is in this format:
x y theta left_ticks left_sec left_usec right_ticks right_sec right_usec
x y theta odometry as reconstructed by the robot – ignore this if you are doing calibration (mm, mm, rad).
left_ticks, right_ticks: number of ticks from the encoders.
For converting from ticks to radians, use the formula:
radians = ticks_to_rad * ticks
where
ticks_to_rad = 2 * pi / ( 691.2 * 4 );
The maximum value for the ticks field is 65536, then it should go over and restart at 0.
*_sec *_usec: timestamp in seconds and milliseconds.