mirror of
https://github.com/introlab/rtabmap.git
synced 2026-10-12 21:09:50 +08:00
Merge branch 'master' of https://github.com/introlab/rtabmap.wiki
+7
-1
@@ -1,6 +1,6 @@
|
||||
Welcome to the rtabmap wiki!
|
||||
|
||||
The main sections are:
|
||||
## The main sections
|
||||
* [Installation](https://github.com/introlab/rtabmap/wiki/Installation)
|
||||
* [Tutorials](https://github.com/introlab/rtabmap/wiki/Tutorials)
|
||||
* [Kinect mapping](https://github.com/introlab/rtabmap/wiki/Kinect-mapping)
|
||||
@@ -9,7 +9,13 @@ The main sections are:
|
||||
* [Loop closure detection](https://github.com/introlab/rtabmap/wiki/Loop-closure-detection)
|
||||
* [Benchmark](https://github.com/introlab/rtabmap/wiki/Benchmark)
|
||||
* [Plot statistics](https://github.com/introlab/rtabmap/wiki/Plot-statistics)
|
||||
* [ICP](https://github.com/introlab/rtabmap/wiki/ICP)
|
||||
* [C++ RGB-D Mapping](https://github.com/introlab/rtabmap/wiki/Cplusplus-RGBD-Mapping)
|
||||
* [C++ Loop closure detection](https://github.com/introlab/rtabmap/wiki/Cplusplus-Loop-Closure-Detection)
|
||||
* [Tools](https://github.com/introlab/rtabmap/wiki/Tools)
|
||||
* [IROS 2014 Kinect Challenge](https://github.com/introlab/rtabmap/wiki/IROS-2014-Kinect-Challenge)
|
||||
|
||||
## Home pages
|
||||
* [Home page for RGB-D Mapping](http://introlab.github.io/rtabmap)
|
||||
* [Home page for loop closure detection on IntRoLab](https://introlab.3it.usherbrooke.ca/mediawiki-introlab/index.php/RTAB-Map)
|
||||
* [Home page on ROS.org](http://wiki.ros.org/rtabmap)
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
## Introduction
|
||||
|
||||
In this page, I'll discuss about why ICP (Iterative Closest Point) is deactivated by default. For some cases, enabling ICP will increase precision of the loop closure and the visual odometry. However for some other cases, it will add difficult detectable errors. The next sections show two cases: where ICP helps to give better transformations and where ICP doesn't help at all, even increase the error.
|
||||
|
||||
## A good case for ICP
|
||||
|
||||
When a loop closure happens between two images, we compute the visual transformation using the corresponding visual words. When ICP is enabled, this transformation is used as a guess for the ICP algorithm. The image below shows this process.
|
||||
1. We have two corresponding images.
|
||||
2. We compute the visual transformation, the results show a little orientation error (see he first yellow circle) on the transformed clouds using this first guess.
|
||||
3. Using ICP, we refine this transformation using only geometric information. This orientation error is corrected (second yellow circle).
|
||||
In this case, ICP increases precision.
|
||||
|
||||
<img src="https://raw.githubusercontent.com/wiki/introlab/rtabmap/doc/icp_error/ok.png" alt="" width="800">
|
||||
|
||||
## A bad case for ICP
|
||||
|
||||
In this case, we do the same: we compute a visual transformation to find a guess for the ICP. The process is shown in the image below.
|
||||
1. We have two corresponding images.
|
||||
2. We compute the visual transformation, the results show that the clouds of the screen are correctly aligned (first yellow circle).
|
||||
3. Using ICP, we refine this transformation using only geometric information. However, here ICP decreases the precision. What happens is that ICP tries to match as many corresponding points as it can. Here the background behind the screen has more points that the screen itself on the two scans. ICP will then align the clouds to maximize the correspondences on the background. The screen is then misaligned (second yellow circle).
|
||||
|
||||
<img src="https://raw.githubusercontent.com/wiki/introlab/rtabmap/doc/icp_error/wrong.png" alt="" width="800">
|
||||
|
||||
## Discussion
|
||||
The ICP error on the second case is difficult to detect. For example, the euclidean fitness score (e.g., sum of squared distances from the source to the target) of the first case is 0.005312 and the second case is 0.002064. Generally, a fitness under 0.1 gives good results. However, in the second case, the fitness is even lower than in the first case, which makes this criterion not robust to detect such wrong cases. For this reason, ICP is disabled by default in RTAB-Map.
|
||||
|
||||
You can try the examples above on the corresponding PCD files:
|
||||
|
||||
| First case | Second case |
|
||||
| ---------- | ----------- |
|
||||
| [old.pcd](https://raw.githubusercontent.com/wiki/introlab/rtabmap/doc/icp_error/ok/old.pcd) | [old.pcd](https://raw.githubusercontent.com/wiki/introlab/rtabmap/doc/icp_error/wrong/old.pcd) |
|
||||
| [new.pcd](https://raw.githubusercontent.com/wiki/introlab/rtabmap/doc/icp_error/ok/new.pcd) | [new.pcd](https://raw.githubusercontent.com/wiki/introlab/rtabmap/doc/icp_error/wrong/new.pcd) |
|
||||
| [icp.pcd](https://raw.githubusercontent.com/wiki/introlab/rtabmap/doc/icp_error/ok/icp.pcd) | [icp.pcd](https://raw.githubusercontent.com/wiki/introlab/rtabmap/doc/icp_error/wrong/icp.pcd) |
|
||||
|
||||
```
|
||||
$ pcl_viewer old.pcd guess.pcd //see transform using visual transformation guess only
|
||||
$ pcl_icp old.pcd guess.pcd
|
||||
$ pcl_viewer old.pcd guess.pcd //see transform with icp
|
||||
```
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
## Database viewer
|
||||
This tool is useful to browse stuff saved in a RTAB-Map database. You can also generate 3D map, TORO graph, DOT graph and extract images from the database. For example with this database: [5MappingSessions_OnlineConstraint700ms.db.zip](https://drive.google.com/uc?id=0B46akLGdg-uaYVpSZWpoSW1NTVE)
|
||||
```
|
||||
$ rtabmap-databaseViewer 5MappingSessions_OnlineConstraint700ms.db
|
||||
```
|
||||
You can browse images in the database. Explore also the right clicks over the views, more options available as well as in the menus.
|
||||
|
||||
[[doc/Tools/database_viewer.png]]
|
||||
|
||||
## Odometry viewer
|
||||
This tool is a simple application from the terminal to try different odometry approaches implemented in RTAB-Map. This mostly the same as in RTAB-Map->Edit->Preferences->Odometry->"Test odometry" but from the terminal. Look at the examples shown in the usage below.
|
||||
```
|
||||
$ rtabmap-odometryViewer
|
||||
Usage:
|
||||
odometryViewer [options]
|
||||
Options:
|
||||
-bow # Use bag-of-words odometry (default 0): 0=SURF, 1=SIFT
|
||||
-bin Use binary odometry (FAST+BRIEF)
|
||||
-icp Use ICP odometry
|
||||
|
||||
-hz #.# Camera rate (default 0, 0 means as fast as the camera can)
|
||||
-db "input.db" Use database instead of camera (recorded with rtabmap-dataRecorder)
|
||||
-clouds # Maximum clouds shown (default 10, zero means inf)
|
||||
-sec #.# Delay (seconds) before reading the database (if set)
|
||||
|
||||
-in #.# Inliers maximum distance, features/ICP (default 0.005 m)
|
||||
-max # Max features used for matching (default 0=inf)
|
||||
-min # Minimum inliers to accept the transform (default 20)
|
||||
-depth #.# Maximum features depth (default 5.0 m)
|
||||
-i # RANSAC/ICP iterations (default 100)
|
||||
-lu # Linear update (default 0.0 m)
|
||||
-au # Angular update (default 0.0 radian)
|
||||
-reset # Reset countdown (default 0 = disabled)
|
||||
|
||||
-bin_brief_bytes # BRIEF bytes (default 32)
|
||||
-bin_fast_thr # FAST threshold (default 30)
|
||||
-bin_lsh Use nearest neighbor LSH (default brute force hamming)
|
||||
|
||||
-d # ICP decimation (default 4)
|
||||
-v # ICP voxel size (default 0.005)
|
||||
-s # ICP samples (default 0, not used if voxel is set.)
|
||||
-f #.# ICP fitness (default 0.01)
|
||||
|
||||
-debug Log debug messages
|
||||
|
||||
Examples:
|
||||
odometryViewer -bow 0 SURF example
|
||||
odometryViewer -bow 1 SIFT example
|
||||
odometryViewer -bin -hz 10 FAST/BRIEF example
|
||||
odometryViewer -icp -in 0.05 -i 30 ICP example
|
||||
```
|
||||
|
||||
Using this database: [input.db](https://docs.google.com/uc?id=0B46akLGdg-uaUnowOFpkM0RTUEE), the four techniques are compared:
|
||||
|
||||
* In order: SURF, SIFT, BRIEF/FAST and ICP
|
||||
|
||||
```
|
||||
./rtabmap-odometryViewer -hz 10 -db input.db -bow 0 -clouds 0
|
||||
./rtabmap-odometryViewer -hz 10 -db input.db -bow 1 -clouds 0
|
||||
./rtabmap-odometryViewer -hz 10 -db input.db -bin -clouds 0 -in 0.005 -bin_brief_bytes 64
|
||||
./rtabmap-odometryViewer -hz 10 -db input.db -icp -in 0.04 -v 0.02 -clouds 0 -f 1 -i 30
|
||||
```
|
||||
|
||||
[ [[doc/video_screenshots/odomcomparison.jpeg]] ](http://www.youtube.com/watch?v=3xggFmS5-1s)
|
||||
|
||||
## Data recorder
|
||||
This tool can be used to record images from a webcam or an OpenNI camera (with depth) to RTAB-Map database format, which can be after used as input for RTAB-Map.
|
||||
|
||||
```
|
||||
$ rtabmap-dataRecorder
|
||||
Usage:
|
||||
dataRecorder [options] output.db
|
||||
Options:
|
||||
-hide Don't display the current cloud recorded.
|
||||
-debug Set debug level for the logger.
|
||||
-rate #.# Input rate Hz (default 0=inf)
|
||||
-openni Use openni camera instead of the usb camera.
|
||||
```
|
||||
+3
-1
@@ -7,6 +7,8 @@
|
||||
* [Loop closure detection](https://github.com/introlab/rtabmap/wiki/Loop-closure-detection)
|
||||
* [Benchmark](https://github.com/introlab/rtabmap/wiki/Benchmark)
|
||||
* [Plot statistics](https://github.com/introlab/rtabmap/wiki/Plot-statistics)
|
||||
* [ICP](https://github.com/introlab/rtabmap/wiki/ICP)
|
||||
* [C++ RGB-D Mapping](https://github.com/introlab/rtabmap/wiki/Cplusplus-RGBD-Mapping)
|
||||
* [C++ Loop closure detection](https://github.com/introlab/rtabmap/wiki/Cplusplus-Loop-Closure-Detection)
|
||||
* [Tools](https://github.com/introlab/rtabmap/wiki/Tools)
|
||||
* [Tools](https://github.com/introlab/rtabmap/wiki/Tools)
|
||||
* [IROS 2014 Kinect Challenge](https://github.com/introlab/rtabmap/wiki/IROS-2014-Kinect-Challenge)
|
||||
Reference in New Issue
Block a user