mirror of
https://github.com/introlab/rtabmap.git
synced 2026-10-09 19:39:50 +08:00
Compare commits
193
Commits
0.20.2
...
0.20.9-melodic
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a58ec494d1 | ||
|
|
69735b6271 | ||
|
|
d002711f21 | ||
|
|
06e85e140c | ||
|
|
c4d127cae4 | ||
|
|
21737f9937 | ||
|
|
ccc519ec58 | ||
|
|
1e4b172a7d | ||
|
|
752509fb15 | ||
|
|
f6e17be2b4 | ||
|
|
da2e2f810c | ||
|
|
5b44c557b3 | ||
|
|
600d68932d | ||
|
|
800d087b07 | ||
|
|
db43479e44 | ||
|
|
736c8aceae | ||
|
|
351c659beb | ||
|
|
ab8f0e2b34 | ||
|
|
4f46d8e904 | ||
|
|
98c69c4578 | ||
|
|
4e4207a6dd | ||
|
|
ea4cc7cb6c | ||
|
|
f7bc47572b | ||
|
|
d119487dd7 | ||
|
|
967c57d165 | ||
|
|
862eb0a90a | ||
|
|
cad184e82b | ||
|
|
d61e463595 | ||
|
|
5cdb346a35 | ||
|
|
8696a38343 | ||
|
|
e59aad03ed | ||
|
|
9bf12742b1 | ||
|
|
bb7e9edb9b | ||
|
|
f871e4359d | ||
|
|
03cfaf2063 | ||
|
|
089441a496 | ||
|
|
481a140f84 | ||
|
|
c42a4e3d7e | ||
|
|
c1a22609f3 | ||
|
|
b759b1b4d1 | ||
|
|
6b119c1f90 | ||
|
|
7e298e1999 | ||
|
|
c9472962d7 | ||
|
|
4d75361fe0 | ||
|
|
e99c658276 | ||
|
|
57326214f1 | ||
|
|
47e40ef34d | ||
|
|
aa31a900fb | ||
|
|
28e624e6b2 | ||
|
|
731b073ed8 | ||
|
|
5d777469ff | ||
|
|
70e9dff7da | ||
|
|
814a243693 | ||
|
|
c49785061f | ||
|
|
0bc483b6d3 | ||
|
|
eae5f2b428 | ||
|
|
94cf1dfd32 | ||
|
|
1a967127d9 | ||
|
|
792c967d46 | ||
|
|
a67dbc26f2 | ||
|
|
f1993d9cd7 | ||
|
|
da99d7e4a0 | ||
|
|
e896ffb5c0 | ||
|
|
04cbf56cc0 | ||
|
|
c5051bf82a | ||
|
|
7a9f01b9a3 | ||
|
|
70094edb75 | ||
|
|
eb2af19a89 | ||
|
|
af227bad51 | ||
|
|
ee63ce338a | ||
|
|
1b3a6abb82 | ||
|
|
4a8a20c7d1 | ||
|
|
a125797e50 | ||
|
|
a6f0877045 | ||
|
|
b5cae38eb9 | ||
|
|
d8ebbc2645 | ||
|
|
d700d09339 | ||
|
|
3104dff006 | ||
|
|
839045a538 | ||
|
|
a824945816 | ||
|
|
1acf8ff193 | ||
|
|
51826c9a97 | ||
|
|
7a5d04062d | ||
|
|
049238dd59 | ||
|
|
3271723034 | ||
|
|
da8e76ffed | ||
|
|
3131474102 | ||
|
|
3ffc8ce73f | ||
|
|
ee44adeb1f | ||
|
|
96c1c81e22 | ||
|
|
0022b6b993 | ||
|
|
721e046f5d | ||
|
|
d733029565 | ||
|
|
7859313beb | ||
|
|
80199f23b5 | ||
|
|
bce7ae6acd | ||
|
|
f88845e138 | ||
|
|
bdc7be40b4 | ||
|
|
e4cb59b74d | ||
|
|
dab407e5b9 | ||
|
|
98a499b603 | ||
|
|
f5d7dc2814 | ||
|
|
ab1aa5578a | ||
|
|
ccbdb586da | ||
|
|
f467f2af7f | ||
|
|
7c4d2bbdf4 | ||
|
|
fb206b4f1e | ||
|
|
ddecefbb9c | ||
|
|
ad44b65a28 | ||
|
|
fdaaa6ccfa | ||
|
|
34e1af7e22 | ||
|
|
54e2688a1d | ||
|
|
f9abcf9e35 | ||
|
|
01eb57f293 | ||
|
|
7be22d1b67 | ||
|
|
4b527f9c36 | ||
|
|
4d965c2089 | ||
|
|
47cbd633c3 | ||
|
|
b95537a680 | ||
|
|
e102243f0e | ||
|
|
e7a2f206a0 | ||
|
|
d04b1a13be | ||
|
|
92b1dabf1c | ||
|
|
e269067d4c | ||
|
|
596cd10b69 | ||
|
|
6a730b51c7 | ||
|
|
4ecf37a3ab | ||
|
|
99275fba1d | ||
|
|
25c2a51ee3 | ||
|
|
600484e12c | ||
|
|
8878d9fcdf | ||
|
|
72e1649cdd | ||
|
|
afbc0edbd6 | ||
|
|
fbc30042c4 | ||
|
|
a4da1e14b4 | ||
|
|
3047b7da6b | ||
|
|
bbb3c56008 | ||
|
|
f71f00277c | ||
|
|
0e5ec91280 | ||
|
|
3aae79270f | ||
|
|
1b4a992b55 | ||
|
|
384b120d2e | ||
|
|
304c365ae6 | ||
|
|
d5572d03ad | ||
|
|
6d552b7873 | ||
|
|
32eb266c79 | ||
|
|
2cb509c825 | ||
|
|
168c87b5ba | ||
|
|
a80e062bef | ||
|
|
9e321971ef | ||
|
|
8260733b11 | ||
|
|
bbccbd63e4 | ||
|
|
bedc771fa4 | ||
|
|
933ac736f1 | ||
|
|
c5158cade5 | ||
|
|
eef0a23b1b | ||
|
|
3d33370e4c | ||
|
|
4e6e404951 | ||
|
|
29368ebdb3 | ||
|
|
a24211583d | ||
|
|
d50b33a7b8 | ||
|
|
a689d8a23f | ||
|
|
bd80811ea1 | ||
|
|
cabf03af44 | ||
|
|
f93cdc31a6 | ||
|
|
e0973fea92 | ||
|
|
49cb470b8d | ||
|
|
d2784095a3 | ||
|
|
1db17dd118 | ||
|
|
23d8353540 | ||
|
|
96a628877c | ||
|
|
24052a6ebe | ||
|
|
775c9318d3 | ||
|
|
f263d560b4 | ||
|
|
729f96f467 | ||
|
|
8d63e9eae1 | ||
|
|
39f68c44c6 | ||
|
|
0a9d237ac2 | ||
|
|
07d21e6b03 | ||
|
|
53a759e2da | ||
|
|
6741355842 | ||
|
|
1460c56254 | ||
|
|
dec135a3fb | ||
|
|
9edd9b741d | ||
|
|
43eba76a20 | ||
|
|
bf45a0cba2 | ||
|
|
4be07fc3e9 | ||
|
|
4e32e8846c | ||
|
|
6468245317 | ||
|
|
169b79215d | ||
|
|
4a09c4bdcf | ||
|
|
3505611fb5 | ||
|
|
55228aa574 |
+15
-1
@@ -35,7 +35,7 @@ install:
|
|||||||
# OpenCV
|
# OpenCV
|
||||||
#- ps: wget 'http://kent.dl.sourceforge.net/project/opencvlibrary/opencv-win/3.3.1/opencv-3.3.1-vc14.exe' -outfile opencv-3.3.1-vc14.exe
|
#- ps: wget 'http://kent.dl.sourceforge.net/project/opencvlibrary/opencv-win/3.3.1/opencv-3.3.1-vc14.exe' -outfile opencv-3.3.1-vc14.exe
|
||||||
#- cmd: opencv-3.3.1-vc14.exe -o"C:\Program Files" -y
|
#- cmd: opencv-3.3.1-vc14.exe -o"C:\Program Files" -y
|
||||||
- ps: wget 'http://kent.dl.sourceforge.net/project/opencvlibrary/opencv-win/2.4.13/opencv-2.4.13.6-vc14.exe' -outfile opencv-2.4.13.6-vc14.exe
|
- ps: $url = "https://downloads.sourceforge.net/project/opencvlibrary/opencv-win/2.4.13/opencv-2.4.13.6-vc14.exe?r=&ts="+([int64](([datetime]::UtcNow)-(get-date "1/1/1970")).TotalSeconds) ; wget $url -outfile opencv-2.4.13.6-vc14.exe
|
||||||
- cmd: opencv-2.4.13.6-vc14.exe -o"C:\Program Files" -y
|
- cmd: opencv-2.4.13.6-vc14.exe -o"C:\Program Files" -y
|
||||||
- ECHO "Installed OpenCV:"
|
- ECHO "Installed OpenCV:"
|
||||||
- ps: "ls \"C:/Program Files/opencv/build\""
|
- ps: "ls \"C:/Program Files/opencv/build\""
|
||||||
@@ -115,6 +115,20 @@ install:
|
|||||||
- cmd: yaml-cpp.exe -o"C:\Program Files" -y
|
- cmd: yaml-cpp.exe -o"C:\Program Files" -y
|
||||||
- ECHO "Installed yaml-cpp:"
|
- ECHO "Installed yaml-cpp:"
|
||||||
- ps: "ls \"C:/Program Files/yaml-cpp\""
|
- ps: "ls \"C:/Program Files/yaml-cpp\""
|
||||||
|
# RealSense2
|
||||||
|
- ps: wget 'https://github.com/IntelRealSense/librealsense/releases/download/v2.40.0/Intel.RealSense.SDK-WIN10-2.40.0.2482.exe' -outfile realsense2.exe
|
||||||
|
- cmd: realsense2.exe /VERYSILENT
|
||||||
|
- ECHO "Installed RealSense2:"
|
||||||
|
- ps: "ls \"C:/Program Files (x86)/Intel RealSense SDK 2.0\""
|
||||||
|
- set PATH=%PATH%;C:\Program Files (x86)\Intel RealSense SDK 2.0\bin\x64
|
||||||
|
- set RealSense2_ROOT_DIR=C:\Program Files (x86)\Intel RealSense SDK 2.0
|
||||||
|
# Kinect 4 Azure
|
||||||
|
- ps: wget 'https://download.microsoft.com/download/3/d/6/3d6d9e99-a251-4cf3-8c6a-8e108e960b4b/Azure%20Kinect%20SDK%201.4.1.exe' -outfile azure.exe
|
||||||
|
- cmd: azure.exe /quiet
|
||||||
|
- ECHO "Installed Kinect For Azure:"
|
||||||
|
- ps: "ls \"C:/Program Files/Azure Kinect SDK v1.4.1\""
|
||||||
|
- set PATH=%PATH%;C:\Program Files\Azure Kinect SDK v1.4.1\tools
|
||||||
|
- set K4A_ROOT_DIR=C:\Program Files\Azure Kinect SDK v1.4.1
|
||||||
|
|
||||||
before_build:
|
before_build:
|
||||||
- cd c:\projects\rtabmap\build
|
- cd c:\projects\rtabmap\build
|
||||||
|
|||||||
@@ -8,3 +8,5 @@ app/android/.classpath
|
|||||||
app/android/.project
|
app/android/.project
|
||||||
app/android/AndroidManifest.xml
|
app/android/AndroidManifest.xml
|
||||||
app/android/res/raw/
|
app/android/res/raw/
|
||||||
|
compile_flags.txt
|
||||||
|
tags
|
||||||
|
|||||||
+30
-23
@@ -1,14 +1,19 @@
|
|||||||
sudo: true
|
|
||||||
language: cpp
|
language: cpp
|
||||||
group: deprecated-2017Q3
|
|
||||||
|
|
||||||
compiler:
|
jobs:
|
||||||
- gcc
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
include:
|
include:
|
||||||
|
# - name: osx
|
||||||
|
# compiler: clang
|
||||||
|
# os: osx
|
||||||
|
# install:
|
||||||
|
# - brew install sqlite
|
||||||
|
# - brew install pcl
|
||||||
|
# - brew install opencv@3
|
||||||
|
|
||||||
- dist: trusty
|
- name: linux-trusty
|
||||||
|
compiler: gcc
|
||||||
|
os: linux
|
||||||
|
dist: trusty
|
||||||
install:
|
install:
|
||||||
- sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list'
|
- sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list'
|
||||||
- wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
|
- wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
|
||||||
@@ -17,13 +22,13 @@ matrix:
|
|||||||
- sudo apt-get -y install ros-indigo-rtabmap-ros
|
- sudo apt-get -y install ros-indigo-rtabmap-ros
|
||||||
- sudo apt-get -y remove ros-indigo-rtabmap
|
- sudo apt-get -y remove ros-indigo-rtabmap
|
||||||
|
|
||||||
script:
|
before_script:
|
||||||
- source /opt/ros/indigo/setup.bash
|
- source /opt/ros/indigo/setup.bash
|
||||||
- mkdir -p build && cd build
|
|
||||||
- cmake ..
|
|
||||||
- make
|
|
||||||
|
|
||||||
- dist: xenial
|
- name: linux-xenial
|
||||||
|
compiler: gcc
|
||||||
|
os: linux
|
||||||
|
dist: xenial
|
||||||
install:
|
install:
|
||||||
- sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu xenial main" > /etc/apt/sources.list.d/ros-latest.list'
|
- sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu xenial main" > /etc/apt/sources.list.d/ros-latest.list'
|
||||||
- wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
|
- wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
|
||||||
@@ -32,13 +37,13 @@ matrix:
|
|||||||
- sudo apt-get -y install ros-kinetic-rtabmap-ros
|
- sudo apt-get -y install ros-kinetic-rtabmap-ros
|
||||||
- sudo apt-get -y remove ros-kinetic-rtabmap
|
- sudo apt-get -y remove ros-kinetic-rtabmap
|
||||||
|
|
||||||
script:
|
before_script:
|
||||||
- source /opt/ros/kinetic/setup.bash
|
- source /opt/ros/kinetic/setup.bash
|
||||||
- mkdir -p build && cd build
|
|
||||||
- cmake ..
|
|
||||||
- make
|
|
||||||
|
|
||||||
- dist: bionic
|
- name: linux-bionic
|
||||||
|
compiler: gcc
|
||||||
|
os: linux
|
||||||
|
dist: bionic
|
||||||
install:
|
install:
|
||||||
- sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu bionic main" > /etc/apt/sources.list.d/ros-latest.list'
|
- sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu bionic main" > /etc/apt/sources.list.d/ros-latest.list'
|
||||||
- wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
|
- wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
|
||||||
@@ -47,13 +52,13 @@ matrix:
|
|||||||
- sudo apt-get -y install ros-melodic-rtabmap-ros
|
- sudo apt-get -y install ros-melodic-rtabmap-ros
|
||||||
- sudo apt-get -y remove ros-melodic-rtabmap
|
- sudo apt-get -y remove ros-melodic-rtabmap
|
||||||
|
|
||||||
script:
|
before_script:
|
||||||
- source /opt/ros/melodic/setup.bash
|
- source /opt/ros/melodic/setup.bash
|
||||||
- mkdir -p build && cd build
|
|
||||||
- cmake ..
|
|
||||||
- make
|
|
||||||
|
|
||||||
- dist: focal
|
- name: linux-focal
|
||||||
|
compiler: gcc
|
||||||
|
os: linux
|
||||||
|
dist: focal
|
||||||
install:
|
install:
|
||||||
- sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros-latest.list'
|
- sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros-latest.list'
|
||||||
- wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
|
- wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
|
||||||
@@ -62,8 +67,10 @@ matrix:
|
|||||||
- sudo apt-get -y install ros-noetic-rtabmap-ros
|
- sudo apt-get -y install ros-noetic-rtabmap-ros
|
||||||
- sudo apt-get -y remove ros-noetic-rtabmap
|
- sudo apt-get -y remove ros-noetic-rtabmap
|
||||||
|
|
||||||
script:
|
before_script:
|
||||||
- source /opt/ros/noetic/setup.bash
|
- source /opt/ros/noetic/setup.bash
|
||||||
|
|
||||||
|
script:
|
||||||
- mkdir -p build && cd build
|
- mkdir -p build && cd build
|
||||||
- cmake ..
|
- cmake ..
|
||||||
- make
|
- make
|
||||||
|
|||||||
+162
-55
@@ -21,7 +21,7 @@ SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake_modules")
|
|||||||
#######################
|
#######################
|
||||||
SET(RTABMAP_MAJOR_VERSION 0)
|
SET(RTABMAP_MAJOR_VERSION 0)
|
||||||
SET(RTABMAP_MINOR_VERSION 20)
|
SET(RTABMAP_MINOR_VERSION 20)
|
||||||
SET(RTABMAP_PATCH_VERSION 2)
|
SET(RTABMAP_PATCH_VERSION 9)
|
||||||
SET(RTABMAP_VERSION
|
SET(RTABMAP_VERSION
|
||||||
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ ELSE ()
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
if(POLICY CMP0020)
|
if(POLICY CMP0020)
|
||||||
cmake_policy(SET CMP0020 OLD)
|
cmake_policy(SET CMP0020 NEW)
|
||||||
endif()
|
endif()
|
||||||
if(POLICY CMP0043)
|
if(POLICY CMP0043)
|
||||||
cmake_policy(SET CMP0043 OLD)
|
cmake_policy(SET CMP0043 OLD)
|
||||||
@@ -163,8 +163,10 @@ ELSE()
|
|||||||
option(WITH_QT "Include Qt support" ON)
|
option(WITH_QT "Include Qt support" ON)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
option(WITH_ORB_OCTREE "Include ORB Octree feature support" ON)
|
option(WITH_ORB_OCTREE "Include ORB Octree feature support" ON)
|
||||||
option(WITH_SUPERPOINT_TORCH "Include SuperPoint Torch feature support" ON)
|
option(WITH_TORCH "Include Torch support (SuperPoint)" OFF)
|
||||||
option(WITH_PYMATCHER "Include Python3 matchers support" OFF)
|
option(WITH_PYTHON "Include Python3 support (PyMatcher, PyDetector)" OFF)
|
||||||
|
option(WITH_PYTHON_THREADING "Use more than one Python interpreter." OFF)
|
||||||
|
option(WITH_PDAL "Include PDAL support" ON)
|
||||||
option(WITH_FREENECT "Include Freenect support" ON)
|
option(WITH_FREENECT "Include Freenect support" ON)
|
||||||
option(WITH_FREENECT2 "Include Freenect2 support" ON)
|
option(WITH_FREENECT2 "Include Freenect2 support" ON)
|
||||||
option(WITH_K4W2 "Include Kinect for Windows v2 support" ON)
|
option(WITH_K4W2 "Include Kinect for Windows v2 support" ON)
|
||||||
@@ -178,13 +180,16 @@ option(WITH_CERES "Include Ceres support" ON)
|
|||||||
option(WITH_VERTIGO "Include Vertigo support" ON)
|
option(WITH_VERTIGO "Include Vertigo support" ON)
|
||||||
option(WITH_CVSBA "Include cvsba support" ON)
|
option(WITH_CVSBA "Include cvsba support" ON)
|
||||||
option(WITH_POINTMATCHER "Include libpointmatcher support" ON)
|
option(WITH_POINTMATCHER "Include libpointmatcher support" ON)
|
||||||
|
option(WITH_CCCORELIB "Include CCCoreLib support" ON)
|
||||||
option(WITH_LOAM "Include LOAM support" ON)
|
option(WITH_LOAM "Include LOAM support" ON)
|
||||||
option(WITH_FLYCAPTURE2 "Include FlyCapture2/Triclops support" ON)
|
option(WITH_FLYCAPTURE2 "Include FlyCapture2/Triclops support" ON)
|
||||||
option(WITH_ZED "Include ZED sdk support" ON)
|
option(WITH_ZED "Include ZED sdk support" ON)
|
||||||
|
option(WITH_ZEDOC "Include ZED Open Capture support" ON)
|
||||||
option(WITH_REALSENSE "Include RealSense support" ON)
|
option(WITH_REALSENSE "Include RealSense support" ON)
|
||||||
option(WITH_REALSENSE_SLAM "Include RealSenseSlam support" ON)
|
option(WITH_REALSENSE_SLAM "Include RealSenseSlam support" ON)
|
||||||
option(WITH_REALSENSE2 "Include RealSense support" ON)
|
option(WITH_REALSENSE2 "Include RealSense support" ON)
|
||||||
option(WITH_MYNTEYE "Include mynteye-s support" ON)
|
option(WITH_MYNTEYE "Include mynteye-s support" ON)
|
||||||
|
option(WITH_DEPTHAI "Include depthai-core support" ON)
|
||||||
option(WITH_OCTOMAP "Include Octomap support" ON)
|
option(WITH_OCTOMAP "Include Octomap support" ON)
|
||||||
option(WITH_CPUTSDF "Include CPUTSDF support" ON)
|
option(WITH_CPUTSDF "Include CPUTSDF support" ON)
|
||||||
option(WITH_OPENCHISEL "Include open_chisel support" ON)
|
option(WITH_OPENCHISEL "Include open_chisel support" ON)
|
||||||
@@ -192,7 +197,7 @@ option(WITH_ALICE_VISION "Include AliceVision support" OFF)
|
|||||||
option(WITH_FOVIS "Include FOVIS support" ON)
|
option(WITH_FOVIS "Include FOVIS support" ON)
|
||||||
option(WITH_VISO2 "Include VISO2 support" ON)
|
option(WITH_VISO2 "Include VISO2 support" ON)
|
||||||
option(WITH_DVO "Include DVO support" ON)
|
option(WITH_DVO "Include DVO support" ON)
|
||||||
option(WITH_ORB_SLAM2 "Include ORB_SLAM2 support" ON)
|
option(WITH_ORB_SLAM "Include ORB_SLAM2 or ORB_SLAM3 support" ON)
|
||||||
option(WITH_OKVIS "Include OKVIS support" ON)
|
option(WITH_OKVIS "Include OKVIS support" ON)
|
||||||
option(WITH_MSCKF_VIO "Include MSCKF_VIO support" OFF)
|
option(WITH_MSCKF_VIO "Include MSCKF_VIO support" OFF)
|
||||||
option(WITH_VINS "Include VINS-Fusion support" ON)
|
option(WITH_VINS "Include VINS-Fusion support" ON)
|
||||||
@@ -322,19 +327,26 @@ IF(WITH_QT)
|
|||||||
ENDIF(QT4_FOUND OR Qt5_FOUND)
|
ENDIF(QT4_FOUND OR Qt5_FOUND)
|
||||||
ENDIF(WITH_QT)
|
ENDIF(WITH_QT)
|
||||||
|
|
||||||
IF(WITH_SUPERPOINT_TORCH)
|
IF(WITH_TORCH)
|
||||||
FIND_PACKAGE(Torch QUIET)
|
FIND_PACKAGE(Torch QUIET)
|
||||||
IF(TORCH_FOUND)
|
IF(TORCH_FOUND)
|
||||||
MESSAGE(STATUS "Found Torch: ${TORCH_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found Torch: ${TORCH_INCLUDE_DIRS}")
|
||||||
ENDIF(TORCH_FOUND)
|
ENDIF(TORCH_FOUND)
|
||||||
ENDIF(WITH_SUPERPOINT_TORCH)
|
ENDIF(WITH_TORCH)
|
||||||
|
|
||||||
IF(WITH_PYMATCHER)
|
IF(WITH_PYTHON)
|
||||||
FIND_PACKAGE(Python3 COMPONENTS Interpreter Development)
|
FIND_PACKAGE(Python3 COMPONENTS Interpreter Development)
|
||||||
IF(Python3_FOUND)
|
IF(Python3_FOUND)
|
||||||
MESSAGE(STATUS "Found Python3")
|
MESSAGE(STATUS "Found Python3")
|
||||||
ENDIF(Python3_FOUND)
|
ENDIF(Python3_FOUND)
|
||||||
ENDIF(WITH_PYMATCHER)
|
ENDIF(WITH_PYTHON)
|
||||||
|
|
||||||
|
IF(WITH_PDAL)
|
||||||
|
FIND_PACKAGE(PDAL QUIET)
|
||||||
|
IF(PDAL_FOUND)
|
||||||
|
MESSAGE(STATUS "Found PDAL ${PDAL_VERSION}: ${PDAL_INCLUDE_DIRS}")
|
||||||
|
ENDIF(PDAL_FOUND)
|
||||||
|
ENDIF(WITH_PDAL)
|
||||||
|
|
||||||
IF(WITH_FREENECT)
|
IF(WITH_FREENECT)
|
||||||
FIND_PACKAGE(Freenect QUIET)
|
FIND_PACKAGE(Freenect QUIET)
|
||||||
@@ -402,7 +414,14 @@ IF(WITH_G2O)
|
|||||||
FIND_PACKAGE(G2O QUIET)
|
FIND_PACKAGE(G2O QUIET)
|
||||||
IF(G2O_FOUND)
|
IF(G2O_FOUND)
|
||||||
MESSAGE(STATUS "Found g2o: ${G2O_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found g2o: ${G2O_INCLUDE_DIRS}")
|
||||||
ENDIF(G2O_FOUND)
|
ELSE()
|
||||||
|
FIND_PACKAGE(g2o QUIET)
|
||||||
|
IF(g2o_FOUND)
|
||||||
|
SET(G2O_FOUND ${g2o_FOUND})
|
||||||
|
SET(G2O_CPP11 1)
|
||||||
|
MESSAGE(STATUS "Found g2o (targets)")
|
||||||
|
ENDIF(g2o_FOUND)
|
||||||
|
ENDIF()
|
||||||
ENDIF(WITH_G2O)
|
ENDIF(WITH_G2O)
|
||||||
|
|
||||||
IF(WITH_GTSAM)
|
IF(WITH_GTSAM)
|
||||||
@@ -431,6 +450,24 @@ IF(WITH_POINTMATCHER)
|
|||||||
ENDIF(libpointmatcher_FOUND)
|
ENDIF(libpointmatcher_FOUND)
|
||||||
ENDIF(WITH_POINTMATCHER)
|
ENDIF(WITH_POINTMATCHER)
|
||||||
|
|
||||||
|
IF(libpointmatcher_FOUND OR GTSAM_FOUND)
|
||||||
|
find_package(Boost COMPONENTS thread filesystem system program_options date_time REQUIRED)
|
||||||
|
IF(Boost_MINOR_VERSION GREATER 47)
|
||||||
|
find_package(Boost COMPONENTS thread filesystem system program_options date_time chrono timer REQUIRED)
|
||||||
|
ENDIF(Boost_MINOR_VERSION GREATER 47)
|
||||||
|
IF(WIN32)
|
||||||
|
MESSAGE(STATUS "Boost_LIBRARY_DIRS=${Boost_LIBRARY_DIRS}")
|
||||||
|
link_directories(${Boost_LIBRARY_DIRS})
|
||||||
|
ENDIF(WIN32)
|
||||||
|
ENDIF(libpointmatcher_FOUND OR GTSAM_FOUND)
|
||||||
|
|
||||||
|
IF(WITH_CCCORELIB)
|
||||||
|
find_package(CCCoreLib QUIET)
|
||||||
|
IF(CCCoreLib_FOUND)
|
||||||
|
MESSAGE(STATUS "Found CCCoreLib: ${CCCoreLib_INCLUDE_DIRS}")
|
||||||
|
ENDIF(CCCoreLib_FOUND)
|
||||||
|
ENDIF(WITH_CCCORELIB)
|
||||||
|
|
||||||
IF(WITH_LOAM)
|
IF(WITH_LOAM)
|
||||||
find_package(loam_velodyne QUIET)
|
find_package(loam_velodyne QUIET)
|
||||||
IF(loam_velodyne_FOUND)
|
IF(loam_velodyne_FOUND)
|
||||||
@@ -454,6 +491,20 @@ IF(WITH_ZED)
|
|||||||
ENDIF(ZED_FOUND)
|
ENDIF(ZED_FOUND)
|
||||||
ENDIF(WITH_ZED)
|
ENDIF(WITH_ZED)
|
||||||
|
|
||||||
|
IF(WITH_ZEDOC)
|
||||||
|
find_package(ZEDOC QUIET)
|
||||||
|
IF(ZEDOC_FOUND)
|
||||||
|
MESSAGE(STATUS "Found ZED Open Capture: ${ZEDOC_INCLUDE_DIRS}")
|
||||||
|
## look for HIDAPI
|
||||||
|
find_package(HIDAPI)
|
||||||
|
IF(HIDAPI_FOUND)
|
||||||
|
MESSAGE(STATUS "Found HIDAPI: ${HIDAPI_INCLUDE_DIRS}")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(FATAL_ERROR "HIDAPI is required to build with Zed Open Capture! Set -DWITH_ZEDOC=OFF if you don't have HIDAPI.")
|
||||||
|
ENDIF()
|
||||||
|
ENDIF(ZEDOC_FOUND)
|
||||||
|
ENDIF(WITH_ZEDOC)
|
||||||
|
|
||||||
IF(WITH_REALSENSE)
|
IF(WITH_REALSENSE)
|
||||||
IF(WITH_REALSENSE_SLAM)
|
IF(WITH_REALSENSE_SLAM)
|
||||||
FIND_PACKAGE(RealSense QUIET COMPONENTS slam)
|
FIND_PACKAGE(RealSense QUIET COMPONENTS slam)
|
||||||
@@ -486,6 +537,13 @@ IF(WITH_MYNTEYE)
|
|||||||
ENDIF(mynteye_FOUND)
|
ENDIF(mynteye_FOUND)
|
||||||
ENDIF(WITH_MYNTEYE)
|
ENDIF(WITH_MYNTEYE)
|
||||||
|
|
||||||
|
IF(WITH_DEPTHAI)
|
||||||
|
FIND_PACKAGE(depthai 2 QUIET)
|
||||||
|
IF(depthai_FOUND)
|
||||||
|
MESSAGE(STATUS "Found depthai-core (targets)")
|
||||||
|
ENDIF(depthai_FOUND)
|
||||||
|
ENDIF(WITH_DEPTHAI)
|
||||||
|
|
||||||
IF(WITH_OCTOMAP)
|
IF(WITH_OCTOMAP)
|
||||||
FIND_PACKAGE(octomap QUIET)
|
FIND_PACKAGE(octomap QUIET)
|
||||||
IF(octomap_FOUND)
|
IF(octomap_FOUND)
|
||||||
@@ -515,9 +573,9 @@ IF(WITH_ALICE_VISION)
|
|||||||
IF(AliceVision_FOUND)
|
IF(AliceVision_FOUND)
|
||||||
SET(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};/usr/local/lib/cmake/modules")
|
SET(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};/usr/local/lib/cmake/modules")
|
||||||
find_package(Geogram REQUIRED QUIET)
|
find_package(Geogram REQUIRED QUIET)
|
||||||
# Make sure the two following lines are also commented in AliceVision to avoid Eigen memory alignment error
|
add_definitions("-DRTABMAP_ALICE_VISION_MAJOR=${AliceVision_VERSION_MAJOR}")
|
||||||
#add_definitions("-DEIGEN_DONT_ALIGN_STATICALLY=1")
|
add_definitions("-DRTABMAP_ALICE_VISION_MINOR=${AliceVision_VERSION_MINOR}")
|
||||||
#add_definitions("-DEIGEN_DONT_VECTORIZE=1")
|
add_definitions("-DRTABMAP_ALICE_VISION_PATCH=${AliceVision_VERSION_PATCH}")
|
||||||
ENDIF(AliceVision_FOUND)
|
ENDIF(AliceVision_FOUND)
|
||||||
ENDIF(WITH_ALICE_VISION)
|
ENDIF(WITH_ALICE_VISION)
|
||||||
|
|
||||||
@@ -584,47 +642,42 @@ IF(WITH_FASTCV)
|
|||||||
ENDIF(FastCV_FOUND)
|
ENDIF(FastCV_FOUND)
|
||||||
ENDIF(WITH_FASTCV)
|
ENDIF(WITH_FASTCV)
|
||||||
|
|
||||||
IF(WITH_ORB_SLAM2 AND NOT G2O_FOUND)
|
IF(WITH_ORB_SLAM AND NOT G2O_FOUND)
|
||||||
FIND_PACKAGE(ORB_SLAM2 QUIET)
|
FIND_PACKAGE(ORB_SLAM QUIET)
|
||||||
IF(ORB_SLAM2_FOUND)
|
IF(ORB_SLAM_FOUND)
|
||||||
MESSAGE(STATUS "Found ORB_SLAM2: ${ORB_SLAM2_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found ORB_SLAM${ORB_SLAM_VERSION}: ${ORB_SLAM_INCLUDE_DIRS}")
|
||||||
FIND_PACKAGE(Pangolin QUIET)
|
ENDIF(ORB_SLAM_FOUND)
|
||||||
IF(NOT Pangolin_FOUND)
|
ENDIF(WITH_ORB_SLAM AND NOT G2O_FOUND)
|
||||||
SET(ORB_SLAM2_FOUND FALSE)
|
|
||||||
MESSAGE(STATUS "Found ORB_SLAM2 but not Pangolin, disabling ORB_SLAM2.")
|
|
||||||
ELSE()
|
|
||||||
MESSAGE(STATUS "Found Pangolin: ${Pangolin_INCLUDE_DIRS}")
|
|
||||||
SET(ORB_SLAM2_INCLUDE_DIRS ${ORB_SLAM2_INCLUDE_DIRS} ${Pangolin_INCLUDE_DIRS})
|
|
||||||
SET(ORB_SLAM2_LIBRARIES ${ORB_SLAM2_LIBRARIES} ${Pangolin_LIBRARIES})
|
|
||||||
ENDIF()
|
|
||||||
ENDIF(ORB_SLAM2_FOUND)
|
|
||||||
ENDIF(WITH_ORB_SLAM2 AND NOT G2O_FOUND)
|
|
||||||
|
|
||||||
IF(loam_velodyne_FOUND OR PCL_VERSION VERSION_GREATER "1.9.1" OR TORCH_FOUND)
|
IF(NOT MSVC)
|
||||||
#LOAM and PCL>=1.10 require c++14
|
IF(loam_velodyne_FOUND OR PCL_VERSION VERSION_GREATER "1.9.1" OR TORCH_FOUND OR G2O_FOUND OR CCCoreLib_FOUND)
|
||||||
IF(NOT MSVC)
|
#LOAM, PCL>=1.10, latest g2o and CCCoreLib require c++14
|
||||||
include(CheckCXXCompilerFlag)
|
include(CheckCXXCompilerFlag)
|
||||||
CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14)
|
CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14)
|
||||||
IF(COMPILER_SUPPORTS_CXX14)
|
IF(COMPILER_SUPPORTS_CXX14)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
|
||||||
|
set(CMAKE_CXX_STANDARD 14)
|
||||||
ELSE()
|
ELSE()
|
||||||
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler if you want to use LOAM (set \"-DWITH_LOAM=OFF\" to build without LOAM).")
|
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler if you want to use LOAM, latest PCL or g2o.")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF(loam_velodyne_FOUND OR PCL_VERSION VERSION_GREATER "1.9.1" OR TORCH_FOUND OR G2O_FOUND OR CCCoreLib_FOUND)
|
||||||
ELSEIF(G2O_FOUND OR
|
|
||||||
|
IF( (NOT (${CMAKE_CXX_STANDARD} STREQUAL "14")) AND (
|
||||||
|
G2O_FOUND OR
|
||||||
GTSAM_FOUND OR
|
GTSAM_FOUND OR
|
||||||
CERES_FOUND OR
|
CERES_FOUND OR
|
||||||
ZED_FOUND OR
|
ZED_FOUND OR
|
||||||
|
ZEDOC_FOUND OR
|
||||||
ANDROID OR
|
ANDROID OR
|
||||||
RealSense_FOUND OR
|
RealSense_FOUND OR
|
||||||
realsense2_FOUND OR
|
realsense2_FOUND OR
|
||||||
ORB_SLAM2_FOUND OR
|
ORB_SLAM_FOUND OR
|
||||||
okvis_FOUND OR
|
okvis_FOUND OR
|
||||||
open_chisel_FOUND OR
|
open_chisel_FOUND OR
|
||||||
msckf_vio_FOUND OR
|
msckf_vio_FOUND OR
|
||||||
vins_FOUND)
|
vins_FOUND OR
|
||||||
|
libpointmatcher_FOUND))
|
||||||
#Newest versions require std11
|
#Newest versions require std11
|
||||||
IF(NOT MSVC)
|
|
||||||
include(CheckCXXCompilerFlag)
|
include(CheckCXXCompilerFlag)
|
||||||
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
|
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
|
||||||
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
|
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
|
||||||
@@ -719,9 +772,15 @@ ENDIF()
|
|||||||
IF(NOT libpointmatcher_FOUND)
|
IF(NOT libpointmatcher_FOUND)
|
||||||
SET(POINTMATCHER "//")
|
SET(POINTMATCHER "//")
|
||||||
ENDIF(NOT libpointmatcher_FOUND)
|
ENDIF(NOT libpointmatcher_FOUND)
|
||||||
|
IF(NOT CCCoreLib_FOUND)
|
||||||
|
SET(CCCORELIB "//")
|
||||||
|
ENDIF(NOT CCCoreLib_FOUND)
|
||||||
IF(NOT FastCV_FOUND)
|
IF(NOT FastCV_FOUND)
|
||||||
SET(FASTCV "//")
|
SET(FASTCV "//")
|
||||||
ENDIF(NOT FastCV_FOUND)
|
ENDIF(NOT FastCV_FOUND)
|
||||||
|
IF(NOT PDAL_FOUND)
|
||||||
|
SET(PDAL "//")
|
||||||
|
ENDIF(NOT PDAL_FOUND)
|
||||||
IF(NOT loam_velodyne_FOUND)
|
IF(NOT loam_velodyne_FOUND)
|
||||||
SET(LOAM "//")
|
SET(LOAM "//")
|
||||||
ENDIF(NOT loam_velodyne_FOUND)
|
ENDIF(NOT loam_velodyne_FOUND)
|
||||||
@@ -765,6 +824,11 @@ IF(NOT ZED_FOUND)
|
|||||||
ELSE()
|
ELSE()
|
||||||
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${ZED_LIBRARIES} ${CUDA_LIBRARIES})
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${ZED_LIBRARIES} ${CUDA_LIBRARIES})
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
IF(NOT ZEDOC_FOUND)
|
||||||
|
SET(ZEDOC "//")
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${ZEDOC_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
IF(NOT RealSense_FOUND)
|
IF(NOT RealSense_FOUND)
|
||||||
SET(REALSENSE "//")
|
SET(REALSENSE "//")
|
||||||
ELSE()
|
ELSE()
|
||||||
@@ -781,6 +845,9 @@ ENDIF()
|
|||||||
IF(NOT mynteye_FOUND)
|
IF(NOT mynteye_FOUND)
|
||||||
SET(MYNTEYE "//")
|
SET(MYNTEYE "//")
|
||||||
ENDIF(NOT mynteye_FOUND)
|
ENDIF(NOT mynteye_FOUND)
|
||||||
|
IF(NOT depthai_FOUND)
|
||||||
|
SET(DEPTHAI "//")
|
||||||
|
ENDIF(NOT depthai_FOUND)
|
||||||
IF(NOT octomap_FOUND)
|
IF(NOT octomap_FOUND)
|
||||||
SET(OCTOMAP "//")
|
SET(OCTOMAP "//")
|
||||||
ELSE()
|
ELSE()
|
||||||
@@ -829,19 +896,19 @@ IF(NOT vins_FOUND)
|
|||||||
ELSE()
|
ELSE()
|
||||||
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${vins_LIBRARIES})
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${vins_LIBRARIES})
|
||||||
ENDIF()
|
ENDIF()
|
||||||
IF(NOT ORB_SLAM2_FOUND)
|
IF(NOT ORB_SLAM_FOUND)
|
||||||
SET(ORB_SLAM2 "//")
|
SET(ORB_SLAM "//")
|
||||||
ELSE()
|
ELSE()
|
||||||
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${ORB_SLAM2_LIBRARIES})
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${ORB_SLAM_LIBRARIES})
|
||||||
ENDIF()
|
ENDIF()
|
||||||
IF(NOT WITH_ORB_OCTREE)
|
IF(NOT WITH_ORB_OCTREE)
|
||||||
SET(ORB_OCTREE "//")
|
SET(ORB_OCTREE "//")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
IF(NOT TORCH_FOUND)
|
IF(NOT TORCH_FOUND)
|
||||||
SET(SUPERPOINT_TORCH "//")
|
SET(TORCH "//")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
IF(NOT Python3_FOUND)
|
IF(NOT Python3_FOUND)
|
||||||
SET(PYMATCHER "//")
|
SET(PYTHON "//")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
IF(ADD_VTK_GUI_SUPPORT_QT_TO_CONF)
|
IF(ADD_VTK_GUI_SUPPORT_QT_TO_CONF)
|
||||||
SET(CONF_VTK_QT true)
|
SET(CONF_VTK_QT true)
|
||||||
@@ -1059,12 +1126,20 @@ IF(OpenCV_FOUND)
|
|||||||
ELSE()
|
ELSE()
|
||||||
IF(OPENCV_XFEATURES2D_FOUND)
|
IF(OPENCV_XFEATURES2D_FOUND)
|
||||||
IF(NONFREE STREQUAL "//")
|
IF(NONFREE STREQUAL "//")
|
||||||
|
IF((OpenCV_VERSION_MAJOR LESS 4) OR ((OpenCV_VERSION_MAJOR EQUAL 4) AND (OpenCV_VERSION_MINOR LESS 5)))
|
||||||
MESSAGE(STATUS " *With OpenCV ${OpenCV_VERSION} xfeatures2d = YES, nonfree = NO (License: BSD)")
|
MESSAGE(STATUS " *With OpenCV ${OpenCV_VERSION} xfeatures2d = YES, nonfree = NO (License: BSD)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " *With OpenCV ${OpenCV_VERSION} xfeatures2d = YES, nonfree = NO (License: Apache 2)")
|
||||||
|
ENDIF()
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS " *With OpenCV ${OpenCV_VERSION} xfeatures2d = YES, nonfree = YES (License: Non commercial)")
|
MESSAGE(STATUS " *With OpenCV ${OpenCV_VERSION} xfeatures2d = YES, nonfree = YES (License: Non commercial)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ELSE()
|
ELSE()
|
||||||
|
IF((OpenCV_VERSION_MAJOR LESS 4) OR ((OpenCV_VERSION_MAJOR EQUAL 4) AND (OpenCV_VERSION_MINOR LESS 5)))
|
||||||
MESSAGE(STATUS " *With OpenCV ${OpenCV_VERSION} xfeatures2d = NO, nonfree = NO (License: BSD)")
|
MESSAGE(STATUS " *With OpenCV ${OpenCV_VERSION} xfeatures2d = NO, nonfree = NO (License: BSD)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " *With OpenCV ${OpenCV_VERSION} xfeatures2d = NO, nonfree = NO (License: Apache 2)")
|
||||||
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF(OpenCV_FOUND)
|
ENDIF(OpenCV_FOUND)
|
||||||
@@ -1096,18 +1171,18 @@ ENDIF()
|
|||||||
|
|
||||||
IF(TORCH_FOUND)
|
IF(TORCH_FOUND)
|
||||||
MESSAGE(STATUS " With SupertPoint = YES (License: GPLv3) libtorch=${Torch_VERSION}")
|
MESSAGE(STATUS " With SupertPoint = YES (License: GPLv3) libtorch=${Torch_VERSION}")
|
||||||
ELSEIF(NOT WITH_SUPERPOINT_TORCH)
|
ELSEIF(NOT WITH_TORCH)
|
||||||
MESSAGE(STATUS " With SupertPoint = NO (WITH_SUPERPOINT_TORCH=OFF)")
|
MESSAGE(STATUS " With SupertPoint = NO (WITH_TORCH=OFF)")
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS " With SupertPoint = NO (libtorch not found)")
|
MESSAGE(STATUS " With SupertPoint = NO (libtorch not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(Python3_FOUND)
|
IF(Python3_FOUND)
|
||||||
MESSAGE(STATUS " With Python3 = YES (License: PSF)")
|
MESSAGE(STATUS " With Python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} = YES (License: PSF)")
|
||||||
ELSEIF(NOT WITH_PYMATCHER)
|
ELSEIF(NOT WITH_PYTHON)
|
||||||
MESSAGE(STATUS " With Python3 = NO (WITH_PYMATCHER=OFF)")
|
MESSAGE(STATUS " With Python3 = NO (WITH_PYTHON=OFF)")
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS " With Python3 = NO (python3 not found)")
|
MESSAGE(STATUS " With Python3 = NO (python not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(WITH_MADGWICK)
|
IF(WITH_MADGWICK)
|
||||||
@@ -1124,6 +1199,14 @@ ELSE()
|
|||||||
MESSAGE(STATUS " With FastCV = NO (FastCV not found)")
|
MESSAGE(STATUS " With FastCV = NO (FastCV not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF(PDAL_FOUND)
|
||||||
|
MESSAGE(STATUS " With PDAL = YES (License: BSD)")
|
||||||
|
ELSEIF(NOT WITH_PDAL)
|
||||||
|
MESSAGE(STATUS " With PDAL = NO (WITH_PDAL=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With PDAL = NO (PDAL not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
MESSAGE(STATUS "")
|
MESSAGE(STATUS "")
|
||||||
MESSAGE(STATUS " Solvers:")
|
MESSAGE(STATUS " Solvers:")
|
||||||
IF(WITH_TORO)
|
IF(WITH_TORO)
|
||||||
@@ -1182,6 +1265,14 @@ ELSE()
|
|||||||
MESSAGE(STATUS " *With libpointmatcher = NO (libpointmatcher not found)")
|
MESSAGE(STATUS " *With libpointmatcher = NO (libpointmatcher not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF(CCCoreLib_FOUND)
|
||||||
|
MESSAGE(STATUS " *With CCCoreLib = YES (License: GPLv2)")
|
||||||
|
ELSEIF(NOT WITH_POINTMATCHER)
|
||||||
|
MESSAGE(STATUS " *With CCCoreLib = NO (WITH_CCCORELIB=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " *With CCCoreLib = NO (CCCoreLib not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
MESSAGE(STATUS "")
|
MESSAGE(STATUS "")
|
||||||
MESSAGE(STATUS " Reconstruction Approaches:")
|
MESSAGE(STATUS " Reconstruction Approaches:")
|
||||||
IF(octomap_FOUND)
|
IF(octomap_FOUND)
|
||||||
@@ -1209,7 +1300,7 @@ MESSAGE(STATUS " With OpenChisel = NO (open_chisel not found)")
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(AliceVision_FOUND)
|
IF(AliceVision_FOUND)
|
||||||
MESSAGE(STATUS " With AliceVision = YES (License: MPLv2)")
|
MESSAGE(STATUS " With AliceVision ${AliceVision_VERSION} = YES (License: MPLv2)")
|
||||||
ELSEIF(NOT WITH_ALICE_VISION)
|
ELSEIF(NOT WITH_ALICE_VISION)
|
||||||
MESSAGE(STATUS " With AliceVision = NO (WITH_ALICE_VISION=OFF)")
|
MESSAGE(STATUS " With AliceVision = NO (WITH_ALICE_VISION=OFF)")
|
||||||
ELSE()
|
ELSE()
|
||||||
@@ -1282,6 +1373,14 @@ ELSE()
|
|||||||
MESSAGE(STATUS " With ZED = NO (ZED sdk and/or cuda not found)")
|
MESSAGE(STATUS " With ZED = NO (ZED sdk and/or cuda not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF(ZEDOC_FOUND)
|
||||||
|
MESSAGE(STATUS " With ZEDOC = YES")
|
||||||
|
ELSEIF(NOT WITH_ZEDOC)
|
||||||
|
MESSAGE(STATUS " With ZEDOC = NO (WITH_ZEDOC=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With ZEDOC = NO (ZED Open Capture not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(RealSense_FOUND)
|
IF(RealSense_FOUND)
|
||||||
MESSAGE(STATUS " With RealSense = YES (License: Apache-2)")
|
MESSAGE(STATUS " With RealSense = YES (License: Apache-2)")
|
||||||
IF(RealSenseSlam_FOUND)
|
IF(RealSenseSlam_FOUND)
|
||||||
@@ -1313,6 +1412,14 @@ ELSE()
|
|||||||
MESSAGE(STATUS " With MyntEyeS = NO (mynteye s sdk not found)")
|
MESSAGE(STATUS " With MyntEyeS = NO (mynteye s sdk not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF(depthai_FOUND)
|
||||||
|
MESSAGE(STATUS " With DepthAI = YES (License: MIT)")
|
||||||
|
ELSEIF(NOT WITH_DEPTHAI)
|
||||||
|
MESSAGE(STATUS " With DepthAI = NO (WITH_DEPTHAI=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With DepthAI = NO (depthai-core not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
MESSAGE(STATUS "")
|
MESSAGE(STATUS "")
|
||||||
MESSAGE(STATUS " Odometry Approaches:")
|
MESSAGE(STATUS " Odometry Approaches:")
|
||||||
IF(loam_velodyne_FOUND)
|
IF(loam_velodyne_FOUND)
|
||||||
@@ -1371,14 +1478,14 @@ ELSE()
|
|||||||
MESSAGE(STATUS " With VINS-Fusion = NO (VINS-Fusion not found)")
|
MESSAGE(STATUS " With VINS-Fusion = NO (VINS-Fusion not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(ORB_SLAM2_FOUND)
|
IF(ORB_SLAM_FOUND)
|
||||||
MESSAGE(STATUS " With ORB_SLAM2 = YES (License: GPLv3)")
|
MESSAGE(STATUS " With ORB_SLAM${ORB_SLAM_VERSION} = YES (License: GPLv3)")
|
||||||
ELSEIF(NOT WITH_ORB_SLAM2)
|
ELSEIF(NOT WITH_ORB_SLAM)
|
||||||
MESSAGE(STATUS " With ORB_SLAM2 = NO (WITH_ORB_SLAM2=OFF)")
|
MESSAGE(STATUS " With ORB_SLAM = NO (WITH_ORB_SLAM=OFF)")
|
||||||
ELSEIF(G2O_FOUND)
|
ELSEIF(G2O_FOUND)
|
||||||
MESSAGE(STATUS " With ORB_SLAM2 = NO (WITH_G2O should be OFF as ORB_SLAM2 uses its own g2o version)")
|
MESSAGE(STATUS " With ORB_SLAM = NO (WITH_G2O should be OFF as ORB_SLAM uses its own g2o version)")
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS " With ORB_SLAM2 = NO (ORB_SLAM2 not found, make sure environment variable ORB_SLAM2_ROOT_DIR is set)")
|
MESSAGE(STATUS " With ORB_SLAM = NO (ORB_SLAM2 and ORB_SLAM3 not found, make sure environment variable ORB_SLAM_ROOT_DIR is set)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
MESSAGE(STATUS "Show all options with: cmake -LA | grep WITH_")
|
MESSAGE(STATUS "Show all options with: cmake -LA | grep WITH_")
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ rtabmap ](https://travis-ci.org/introlab/rtabmap) Windows: [](https://ci.appveyor.com/project/matlabbe/rtabmap/branch/master)
|
Linux: [](https://travis-ci.org/introlab/rtabmap) Windows: [](https://ci.appveyor.com/project/matlabbe/rtabmap/branch/master)
|
||||||
|
|
||||||
[release-image]: https://img.shields.io/badge/release-0.18.0-green.svg?style=flat
|
[release-image]: https://img.shields.io/badge/release-0.20.7-green.svg?style=flat
|
||||||
[releases]: https://github.com/introlab/rtabmap/releases
|
[releases]: https://github.com/introlab/rtabmap/releases
|
||||||
|
|
||||||
[license-image]: https://img.shields.io/badge/license-BSD-green.svg?style=flat
|
[license-image]: https://img.shields.io/badge/license-BSD-green.svg?style=flat
|
||||||
|
|||||||
+18
-3
@@ -51,15 +51,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
@K4A@#define RTABMAP_K4A
|
@K4A@#define RTABMAP_K4A
|
||||||
@CVSBA@#define RTABMAP_CVSBA
|
@CVSBA@#define RTABMAP_CVSBA
|
||||||
@POINTMATCHER@#define RTABMAP_POINTMATCHER
|
@POINTMATCHER@#define RTABMAP_POINTMATCHER
|
||||||
|
@CCCORELIB@#define RTABMAP_CCCORELIB
|
||||||
@FASTCV@#define RTABMAP_FASTCV
|
@FASTCV@#define RTABMAP_FASTCV
|
||||||
|
@PDAL@#define RTABMAP_PDAL
|
||||||
@LOAM@#define RTABMAP_LOAM
|
@LOAM@#define RTABMAP_LOAM
|
||||||
@DC1394@#define RTABMAP_DC1394
|
@DC1394@#define RTABMAP_DC1394
|
||||||
@FLYCAPTURE2@#define RTABMAP_FLYCAPTURE2
|
@FLYCAPTURE2@#define RTABMAP_FLYCAPTURE2
|
||||||
@ZED@#define RTABMAP_ZED
|
@ZED@#define RTABMAP_ZED
|
||||||
|
@ZEDOC@#define RTABMAP_ZEDOC
|
||||||
@REALSENSE@#define RTABMAP_REALSENSE
|
@REALSENSE@#define RTABMAP_REALSENSE
|
||||||
@REALSENSESLAM@#define RTABMAP_REALSENSE_SLAM
|
@REALSENSESLAM@#define RTABMAP_REALSENSE_SLAM
|
||||||
@REALSENSE2@#define RTABMAP_REALSENSE2
|
@REALSENSE2@#define RTABMAP_REALSENSE2
|
||||||
@MYNTEYE@#define RTABMAP_MYNTEYE
|
@MYNTEYE@#define RTABMAP_MYNTEYE
|
||||||
|
@DEPTHAI@#define RTABMAP_DEPTHAI
|
||||||
@OCTOMAP@#define RTABMAP_OCTOMAP
|
@OCTOMAP@#define RTABMAP_OCTOMAP
|
||||||
@CPUTSDF@#define RTABMAP_CPUTSDF
|
@CPUTSDF@#define RTABMAP_CPUTSDF
|
||||||
@ALICE_VISION@#define RTABMAP_ALICE_VISION
|
@ALICE_VISION@#define RTABMAP_ALICE_VISION
|
||||||
@@ -70,12 +74,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
@OKVIS@#define RTABMAP_OKVIS
|
@OKVIS@#define RTABMAP_OKVIS
|
||||||
@MSCKF_VIO@#define RTABMAP_MSCKF_VIO
|
@MSCKF_VIO@#define RTABMAP_MSCKF_VIO
|
||||||
@VINS@#define RTABMAP_VINS
|
@VINS@#define RTABMAP_VINS
|
||||||
@ORB_SLAM2@#define RTABMAP_ORB_SLAM2
|
@ORB_SLAM@#define RTABMAP_ORB_SLAM @ORB_SLAM_VERSION@
|
||||||
@ORB_OCTREE@#define RTABMAP_ORB_OCTREE
|
@ORB_OCTREE@#define RTABMAP_ORB_OCTREE
|
||||||
@SUPERPOINT_TORCH@#define RTABMAP_SUPERPOINT_TORCH
|
@TORCH@#define RTABMAP_TORCH
|
||||||
@PYMATCHER@#define RTABMAP_PYMATCHER
|
@PYTHON@#define RTABMAP_PYTHON
|
||||||
@MADGWICK@#define RTABMAP_MADGWICK
|
@MADGWICK@#define RTABMAP_MADGWICK
|
||||||
|
|
||||||
|
#include <pcl/pcl_config.h>
|
||||||
|
|
||||||
|
#if PCL_VERSION_COMPARE(>, 1, 11, 1)
|
||||||
|
#include <pcl/types.h>
|
||||||
|
#define RTABMAP_PCL_INDEX pcl::index_t
|
||||||
|
#elif PCL_VERSION_COMPARE(>=, 1, 10, 0)
|
||||||
|
#define RTABMAP_PCL_INDEX std::uint32_t
|
||||||
|
#else
|
||||||
|
#include <pcl/pcl_macros.h>
|
||||||
|
#define RTABMAP_PCL_INDEX pcl::uint32_t
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* VERSION_H_ */
|
#endif /* VERSION_H_ */
|
||||||
|
|
||||||
|
|||||||
@@ -308,7 +308,7 @@ int RTABMapApp::openDatabase(const std::string & databasePath, bool databaseInMe
|
|||||||
optRefPose_ = 0;
|
optRefPose_ = 0;
|
||||||
}
|
}
|
||||||
cv::Mat cloudMat;
|
cv::Mat cloudMat;
|
||||||
std::vector<std::vector<std::vector<unsigned int> > > polygons;
|
std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > polygons;
|
||||||
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > texCoords;
|
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > texCoords;
|
||||||
#else
|
#else
|
||||||
@@ -2901,8 +2901,8 @@ bool RTABMapApp::exportMesh(
|
|||||||
// save in database
|
// save in database
|
||||||
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBNormal>);
|
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBNormal>);
|
||||||
pcl::fromPCLPointCloud2(polygonMesh->cloud, *cloud);
|
pcl::fromPCLPointCloud2(polygonMesh->cloud, *cloud);
|
||||||
cv::Mat cloudMat = rtabmap::compressData2(rtabmap::util3d::laserScanFromPointCloud(*cloud, rtabmap::Transform(), false)); // for database
|
cv::Mat cloudMat = rtabmap::compressData2(rtabmap::util3d::laserScanFromPointCloud(*cloud, rtabmap::Transform(), false).data()); // for database
|
||||||
std::vector<std::vector<std::vector<unsigned int> > > polygons(1);
|
std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > polygons(1);
|
||||||
polygons[0].resize(polygonMesh->polygons.size());
|
polygons[0].resize(polygonMesh->polygons.size());
|
||||||
for(unsigned int p=0; p<polygonMesh->polygons.size(); ++p)
|
for(unsigned int p=0; p<polygonMesh->polygons.size(); ++p)
|
||||||
{
|
{
|
||||||
@@ -2918,10 +2918,10 @@ bool RTABMapApp::exportMesh(
|
|||||||
{
|
{
|
||||||
pcl::PointCloud<pcl::PointNormal>::Ptr cloud(new pcl::PointCloud<pcl::PointNormal>);
|
pcl::PointCloud<pcl::PointNormal>::Ptr cloud(new pcl::PointCloud<pcl::PointNormal>);
|
||||||
pcl::fromPCLPointCloud2(textureMesh->cloud, *cloud);
|
pcl::fromPCLPointCloud2(textureMesh->cloud, *cloud);
|
||||||
cv::Mat cloudMat = rtabmap::compressData2(rtabmap::util3d::laserScanFromPointCloud(*cloud, rtabmap::Transform(), false)); // for database
|
cv::Mat cloudMat = rtabmap::compressData2(rtabmap::util3d::laserScanFromPointCloud(*cloud, rtabmap::Transform(), false).data()); // for database
|
||||||
|
|
||||||
// save in database
|
// save in database
|
||||||
std::vector<std::vector<std::vector<unsigned int> > > polygons(textureMesh->tex_polygons.size());
|
std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > polygons(textureMesh->tex_polygons.size());
|
||||||
for(unsigned int t=0; t<textureMesh->tex_polygons.size(); ++t)
|
for(unsigned int t=0; t<textureMesh->tex_polygons.size(); ++t)
|
||||||
{
|
{
|
||||||
polygons[t].resize(textureMesh->tex_polygons[t].size());
|
polygons[t].resize(textureMesh->tex_polygons[t].size());
|
||||||
@@ -3054,7 +3054,7 @@ bool RTABMapApp::exportMesh(
|
|||||||
|
|
||||||
// save in database
|
// save in database
|
||||||
{
|
{
|
||||||
cv::Mat cloudMat = rtabmap::compressData2(rtabmap::util3d::laserScanFromPointCloud(*mergedClouds)); // for database
|
cv::Mat cloudMat = rtabmap::compressData2(rtabmap::util3d::laserScanFromPointCloud(*mergedClouds).data()); // for database
|
||||||
boost::mutex::scoped_lock lock(rtabmapMutex_);
|
boost::mutex::scoped_lock lock(rtabmapMutex_);
|
||||||
rtabmap_->getMemory()->saveOptimizedMesh(cloudMat);
|
rtabmap_->getMemory()->saveOptimizedMesh(cloudMat);
|
||||||
success = true;
|
success = true;
|
||||||
@@ -3114,7 +3114,7 @@ bool RTABMapApp::postExportation(bool visualize)
|
|||||||
{
|
{
|
||||||
visualizingMesh_ = false;
|
visualizingMesh_ = false;
|
||||||
cv::Mat cloudMat;
|
cv::Mat cloudMat;
|
||||||
std::vector<std::vector<std::vector<unsigned int> > > polygons;
|
std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > polygons;
|
||||||
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > texCoords;
|
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > texCoords;
|
||||||
#else
|
#else
|
||||||
@@ -3171,7 +3171,7 @@ bool RTABMapApp::writeExportedMesh(const std::string & directory, const std::str
|
|||||||
pcl::PolygonMesh::Ptr polygonMesh(new pcl::PolygonMesh);
|
pcl::PolygonMesh::Ptr polygonMesh(new pcl::PolygonMesh);
|
||||||
pcl::TextureMesh::Ptr textureMesh(new pcl::TextureMesh);
|
pcl::TextureMesh::Ptr textureMesh(new pcl::TextureMesh);
|
||||||
cv::Mat cloudMat;
|
cv::Mat cloudMat;
|
||||||
std::vector<std::vector<std::vector<unsigned int> > > polygons;
|
std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > polygons;
|
||||||
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > texCoords;
|
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > texCoords;
|
||||||
#else
|
#else
|
||||||
@@ -3186,7 +3186,7 @@ bool RTABMapApp::writeExportedMesh(const std::string & directory, const std::str
|
|||||||
LOGI("writeExportedMesh: Found optimized mesh!");
|
LOGI("writeExportedMesh: Found optimized mesh!");
|
||||||
if(textures.empty())
|
if(textures.empty())
|
||||||
{
|
{
|
||||||
polygonMesh = rtabmap::util3d::assemblePolygonMesh(cloudMat, polygons.size() == 1?polygons[0]:std::vector<std::vector<unsigned int> >());
|
polygonMesh = rtabmap::util3d::assemblePolygonMesh(cloudMat, polygons.size() == 1?polygons[0]:std::vector<std::vector<RTABMAP_PCL_INDEX> >());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -21,7 +21,6 @@
|
|||||||
#include <GLES2/gl2ext.h>
|
#include <GLES2/gl2ext.h>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
#include <arcore_c_api.h>
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
static const GLfloat BackgroundRenderer_kVertices[] = {
|
static const GLfloat BackgroundRenderer_kVertices[] = {
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ enum PointCloudShaders
|
|||||||
|
|
||||||
// PointCloud shaders
|
// PointCloud shaders
|
||||||
const std::string kPointCloudVertexShader =
|
const std::string kPointCloudVertexShader =
|
||||||
"precision mediump float;\n"
|
"precision highp float;\n"
|
||||||
"precision mediump int;\n"
|
"precision mediump int;\n"
|
||||||
"attribute vec3 aVertex;\n"
|
"attribute vec3 aVertex;\n"
|
||||||
"attribute vec3 aColor;\n"
|
"attribute vec3 aColor;\n"
|
||||||
@@ -75,7 +75,7 @@ const std::string kPointCloudVertexShader =
|
|||||||
" vColor = aColor;\n"
|
" vColor = aColor;\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
const std::string kPointCloudLightingVertexShader =
|
const std::string kPointCloudLightingVertexShader =
|
||||||
"precision mediump float;\n"
|
"precision highp float;\n"
|
||||||
"precision mediump int;\n"
|
"precision mediump int;\n"
|
||||||
"attribute vec3 aVertex;\n"
|
"attribute vec3 aVertex;\n"
|
||||||
"attribute vec3 aNormal;\n"
|
"attribute vec3 aNormal;\n"
|
||||||
@@ -100,7 +100,7 @@ const std::string kPointCloudLightingVertexShader =
|
|||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
const std::string kPointCloudFragmentShader =
|
const std::string kPointCloudFragmentShader =
|
||||||
"precision mediump float;\n"
|
"precision highp float;\n"
|
||||||
"precision mediump int;\n"
|
"precision mediump int;\n"
|
||||||
"uniform float uGainR;\n"
|
"uniform float uGainR;\n"
|
||||||
"uniform float uGainG;\n"
|
"uniform float uGainG;\n"
|
||||||
@@ -127,7 +127,8 @@ const std::string kPointCloudBlendingFragmentShader =
|
|||||||
" vec4 textureColor = vec4(vColor.z, vColor.y, vColor.x, 1.0);\n"
|
" vec4 textureColor = vec4(vColor.z, vColor.y, vColor.x, 1.0);\n"
|
||||||
" float alpha = 1.0;\n"
|
" float alpha = 1.0;\n"
|
||||||
" vec2 coord = uScreenScale * gl_FragCoord.xy;\n;"
|
" vec2 coord = uScreenScale * gl_FragCoord.xy;\n;"
|
||||||
" float depth = texture2D(uDepthTexture, coord).r;\n"
|
" vec4 depthPacked = texture2D(uDepthTexture, coord);\n"
|
||||||
|
" float depth = dot(depthPacked, 1./vec4(1.,255.,65025.,16581375.));\n"
|
||||||
" float num = (2.0 * uNearZ * uFarZ);\n"
|
" float num = (2.0 * uNearZ * uFarZ);\n"
|
||||||
" float diff = (uFarZ - uNearZ);\n"
|
" float diff = (uFarZ - uNearZ);\n"
|
||||||
" float add = (uFarZ + uNearZ);\n"
|
" float add = (uFarZ + uNearZ);\n"
|
||||||
@@ -141,7 +142,7 @@ const std::string kPointCloudBlendingFragmentShader =
|
|||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
const std::string kPointCloudDepthPackingVertexShader =
|
const std::string kPointCloudDepthPackingVertexShader =
|
||||||
"precision mediump float;\n"
|
"precision highp float;\n"
|
||||||
"precision mediump int;\n"
|
"precision mediump int;\n"
|
||||||
"attribute vec3 aVertex;\n"
|
"attribute vec3 aVertex;\n"
|
||||||
"uniform mat4 uMVP;\n"
|
"uniform mat4 uMVP;\n"
|
||||||
@@ -154,15 +155,15 @@ const std::string kPointCloudDepthPackingFragmentShader =
|
|||||||
"precision highp float;\n"
|
"precision highp float;\n"
|
||||||
"precision mediump int;\n"
|
"precision mediump int;\n"
|
||||||
"void main() {\n"
|
"void main() {\n"
|
||||||
" float toFixed = 255.0/256.0;\n"
|
" vec4 enc = vec4(1.,255.,65025.,16581375.) * gl_FragCoord.z;\n"
|
||||||
" vec4 enc = vec4(1.0, 255.0, 65025.0, 160581375.0) * toFixed * gl_FragCoord.z;\n"
|
|
||||||
" enc = fract(enc);\n"
|
" enc = fract(enc);\n"
|
||||||
|
" enc -= enc.yzww * vec2(1./255., 0.).xxxy;\n"
|
||||||
" gl_FragColor = enc;\n"
|
" gl_FragColor = enc;\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
// Texture shaders
|
// Texture shaders
|
||||||
const std::string kTextureMeshVertexShader =
|
const std::string kTextureMeshVertexShader =
|
||||||
"precision mediump float;\n"
|
"precision highp float;\n"
|
||||||
"precision mediump int;\n"
|
"precision mediump int;\n"
|
||||||
"attribute vec3 aVertex;\n"
|
"attribute vec3 aVertex;\n"
|
||||||
"attribute vec2 aTexCoord;\n"
|
"attribute vec2 aTexCoord;\n"
|
||||||
@@ -185,7 +186,7 @@ const std::string kTextureMeshVertexShader =
|
|||||||
" vLightWeighting = 1.0;\n"
|
" vLightWeighting = 1.0;\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
const std::string kTextureMeshLightingVertexShader =
|
const std::string kTextureMeshLightingVertexShader =
|
||||||
"precision mediump float;\n"
|
"precision highp float;\n"
|
||||||
"precision mediump int;\n"
|
"precision mediump int;\n"
|
||||||
"attribute vec3 aVertex;\n"
|
"attribute vec3 aVertex;\n"
|
||||||
"attribute vec3 aNormal;\n"
|
"attribute vec3 aNormal;\n"
|
||||||
@@ -214,7 +215,7 @@ const std::string kTextureMeshLightingVertexShader =
|
|||||||
" vLightWeighting=0.5;\n"
|
" vLightWeighting=0.5;\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
const std::string kTextureMeshFragmentShader =
|
const std::string kTextureMeshFragmentShader =
|
||||||
"precision mediump float;\n"
|
"precision highp float;\n"
|
||||||
"precision mediump int;\n"
|
"precision mediump int;\n"
|
||||||
"uniform sampler2D uTexture;\n"
|
"uniform sampler2D uTexture;\n"
|
||||||
"uniform float uGainR;\n"
|
"uniform float uGainR;\n"
|
||||||
@@ -245,7 +246,8 @@ const std::string kTextureMeshBlendingFragmentShader =
|
|||||||
" vec4 textureColor = texture2D(uTexture, vTexCoord);\n"
|
" vec4 textureColor = texture2D(uTexture, vTexCoord);\n"
|
||||||
" float alpha = 1.0;\n"
|
" float alpha = 1.0;\n"
|
||||||
" vec2 coord = uScreenScale * gl_FragCoord.xy;\n;"
|
" vec2 coord = uScreenScale * gl_FragCoord.xy;\n;"
|
||||||
" float depth = texture2D(uDepthTexture, coord).r;\n"
|
" vec4 depthPacked = texture2D(uDepthTexture, coord);\n"
|
||||||
|
" float depth = dot(depthPacked, 1./vec4(1.,255.,65025.,16581375.));\n"
|
||||||
" float num = (2.0 * uNearZ * uFarZ);\n"
|
" float num = (2.0 * uNearZ * uFarZ);\n"
|
||||||
" float diff = (uFarZ - uNearZ);\n"
|
" float diff = (uFarZ - uNearZ);\n"
|
||||||
" float add = (uFarZ + uNearZ);\n"
|
" float add = (uFarZ + uNearZ);\n"
|
||||||
|
|||||||
+23
-15
@@ -97,6 +97,7 @@ Scene::Scene() :
|
|||||||
g_(0.0f),
|
g_(0.0f),
|
||||||
b_(0.0f),
|
b_(0.0f),
|
||||||
fboId_(0),
|
fboId_(0),
|
||||||
|
rboId_(0),
|
||||||
depthTexture_(0),
|
depthTexture_(0),
|
||||||
screenWidth_(0),
|
screenWidth_(0),
|
||||||
screenHeight_(0),
|
screenHeight_(0),
|
||||||
@@ -176,6 +177,8 @@ void Scene::DeleteResources() {
|
|||||||
{
|
{
|
||||||
glDeleteFramebuffers(1, &fboId_);
|
glDeleteFramebuffers(1, &fboId_);
|
||||||
fboId_ = 0;
|
fboId_ = 0;
|
||||||
|
glDeleteRenderbuffers(1, &rboId_);
|
||||||
|
rboId_ = 0;
|
||||||
glDeleteTextures(1, &depthTexture_);
|
glDeleteTextures(1, &depthTexture_);
|
||||||
depthTexture_ = 0;
|
depthTexture_ = 0;
|
||||||
}
|
}
|
||||||
@@ -220,16 +223,23 @@ void Scene::SetupViewPort(int w, int h) {
|
|||||||
UASSERT(gesture_camera_ != 0);
|
UASSERT(gesture_camera_ != 0);
|
||||||
gesture_camera_->SetWindowSize(static_cast<float>(w), static_cast<float>(h));
|
gesture_camera_->SetWindowSize(static_cast<float>(w), static_cast<float>(h));
|
||||||
glViewport(0, 0, w, h);
|
glViewport(0, 0, w, h);
|
||||||
if(screenWidth_ != w || fboId_ == 0)
|
if(screenWidth_ != w || screenHeight_ != h || fboId_ == 0)
|
||||||
{
|
{
|
||||||
if(fboId_>0)
|
if(fboId_>0)
|
||||||
{
|
{
|
||||||
glDeleteFramebuffers(1, &fboId_);
|
glDeleteFramebuffers(1, &fboId_);
|
||||||
fboId_ = 0;
|
fboId_ = 0;
|
||||||
|
glDeleteRenderbuffers(1, &rboId_);
|
||||||
|
rboId_ = 0;
|
||||||
glDeleteTextures(1, &depthTexture_);
|
glDeleteTextures(1, &depthTexture_);
|
||||||
depthTexture_ = 0;
|
depthTexture_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// regenerate fbo texture
|
||||||
|
// create a framebuffer object, you need to delete them when program exits.
|
||||||
|
glGenFramebuffers(1, &fboId_);
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, fboId_);
|
||||||
|
|
||||||
// Create depth texture
|
// Create depth texture
|
||||||
glGenTextures(1, &depthTexture_);
|
glGenTextures(1, &depthTexture_);
|
||||||
glBindTexture(GL_TEXTURE_2D, depthTexture_);
|
glBindTexture(GL_TEXTURE_2D, depthTexture_);
|
||||||
@@ -237,16 +247,17 @@ void Scene::SetupViewPort(int w, int h) {
|
|||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, w, h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
|
||||||
// regenerate fbo texture
|
glGenRenderbuffers(1, &rboId_);
|
||||||
// create a framebuffer object, you need to delete them when program exits.
|
glBindRenderbuffer(GL_RENDERBUFFER, rboId_);
|
||||||
glGenFramebuffers(1, &fboId_);
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, w, h);
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, fboId_);
|
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
||||||
|
|
||||||
// Set the texture to be at the depth attachment point of the FBO
|
// Set the texture to be at the color attachment point of the FBO (we pack depth 32 bits in color)
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture_, 0);
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, depthTexture_, 0);
|
||||||
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboId_);
|
||||||
|
|
||||||
GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
|
GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
|
||||||
if ( status != GL_FRAMEBUFFER_COMPLETE)
|
if ( status != GL_FRAMEBUFFER_COMPLETE)
|
||||||
@@ -464,14 +475,13 @@ int Scene::Render(const float * uvsTransformed, glm::mat4 arViewMatrix, glm::mat
|
|||||||
// set the rendering destination to FBO
|
// set the rendering destination to FBO
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, fboId_);
|
glBindFramebuffer(GL_FRAMEBUFFER, fboId_);
|
||||||
|
|
||||||
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
glClearColor(0, 0, 0, 0);
|
||||||
glClearColor(1, 1, 1, 1);
|
|
||||||
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
|
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
if(renderBackgroundCamera)
|
if(renderBackgroundCamera)
|
||||||
{
|
{
|
||||||
PointCloudDrawable drawable(occlusionMesh);
|
PointCloudDrawable drawable(occlusionMesh);
|
||||||
drawable.Render(projectionMatrix, viewMatrix, true, pointSize_, false, false, 999.0f);
|
drawable.Render(projectionMatrix, viewMatrix, true, pointSize_, false, false, 999.0f, 0, 0, 0, 0, 0, true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -479,13 +489,12 @@ int Scene::Render(const float * uvsTransformed, glm::mat4 arViewMatrix, glm::mat
|
|||||||
for(std::vector<PointCloudDrawable*>::const_iterator iter=cloudsToDraw.begin(); iter!=cloudsToDraw.end(); ++iter)
|
for(std::vector<PointCloudDrawable*>::const_iterator iter=cloudsToDraw.begin(); iter!=cloudsToDraw.end(); ++iter)
|
||||||
{
|
{
|
||||||
// set large distance to cam to use low res polygons for fast processing
|
// set large distance to cam to use low res polygons for fast processing
|
||||||
(*iter)->Render(projectionMatrix, viewMatrix, meshRendering_, pointSize_, false, false, 999.0f);
|
(*iter)->Render(projectionMatrix, viewMatrix, meshRendering_, pointSize_, false, false, 999.0f, 0, 0, 0, 0, 0, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// back to normal window-system-provided framebuffer
|
// back to normal window-system-provided framebuffer
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0); // unbind
|
glBindFramebuffer(GL_FRAMEBUFFER, 0); // unbind
|
||||||
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(doubleTapOn_ && gesture_camera_->GetCameraType() != tango_gl::GestureCamera::kFirstPerson)
|
if(doubleTapOn_ && gesture_camera_->GetCameraType() != tango_gl::GestureCamera::kFirstPerson)
|
||||||
@@ -501,8 +510,7 @@ int Scene::Render(const float * uvsTransformed, glm::mat4 arViewMatrix, glm::mat
|
|||||||
|
|
||||||
GLubyte zValue[4];
|
GLubyte zValue[4];
|
||||||
glReadPixels(doubleTapPos_.x*screenWidth_, screenHeight_-doubleTapPos_.y*screenHeight_, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, zValue);
|
glReadPixels(doubleTapPos_.x*screenWidth_, screenHeight_-doubleTapPos_.y*screenHeight_, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, zValue);
|
||||||
float fromFixed = 256.0f/255.0f;
|
float zValueF = float(zValue[0]/255.0f) + float(zValue[1]/255.0f)/255.0f + float(zValue[2]/255.0f)/65025.0f + float(zValue[3]/255.0f)/160581375.0f;
|
||||||
float zValueF = float(zValue[0]/255.0f)*fromFixed + float(zValue[1]/255.0f)*fromFixed/255.0f + float(zValue[2]/255.0f)*fromFixed/65025.0f + float(zValue[3]/255.0f)*fromFixed/160581375.0f;
|
|
||||||
|
|
||||||
if(zValueF != 0.0f)
|
if(zValueF != 0.0f)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -204,6 +204,7 @@ class Scene {
|
|||||||
float g_;
|
float g_;
|
||||||
float b_;
|
float b_;
|
||||||
GLuint fboId_;
|
GLuint fboId_;
|
||||||
|
GLuint rboId_;
|
||||||
GLuint depthTexture_;
|
GLuint depthTexture_;
|
||||||
GLsizei screenWidth_;
|
GLsizei screenWidth_;
|
||||||
GLsizei screenHeight_;
|
GLsizei screenHeight_;
|
||||||
|
|||||||
@@ -1,19 +1,6 @@
|
|||||||
|
|
||||||
### Qt Gui stuff ###
|
|
||||||
SET(headers_ui
|
|
||||||
./ObjDeletionHandler.h
|
|
||||||
)
|
|
||||||
|
|
||||||
#This will generate moc_* for Qt
|
|
||||||
IF(QT4_FOUND)
|
|
||||||
QT4_WRAP_CPP(moc_srcs ${headers_ui})
|
|
||||||
ELSE()
|
|
||||||
QT5_WRAP_CPP(moc_srcs ${headers_ui})
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
SET(SRC_FILES
|
SET(SRC_FILES
|
||||||
main.cpp
|
main.cpp
|
||||||
${moc_srcs}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
SET(INCLUDE_DIRS
|
SET(INCLUDE_DIRS
|
||||||
|
|||||||
+8
-1
@@ -35,7 +35,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "rtabmap/utilite/UObjDeletionThread.h"
|
#include "rtabmap/utilite/UObjDeletionThread.h"
|
||||||
#include "rtabmap/utilite/UFile.h"
|
#include "rtabmap/utilite/UFile.h"
|
||||||
#include "rtabmap/utilite/UConversion.h"
|
#include "rtabmap/utilite/UConversion.h"
|
||||||
#include "ObjDeletionHandler.h"
|
|
||||||
|
#ifdef RTABMAP_PYTHON
|
||||||
|
#include "rtabmap/core/PythonInterface.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
using namespace rtabmap;
|
using namespace rtabmap;
|
||||||
|
|
||||||
@@ -45,6 +48,10 @@ int main(int argc, char* argv[])
|
|||||||
ULogger::setType(ULogger::kTypeConsole);
|
ULogger::setType(ULogger::kTypeConsole);
|
||||||
ULogger::setLevel(ULogger::kWarning);
|
ULogger::setLevel(ULogger::kWarning);
|
||||||
|
|
||||||
|
#ifdef RTABMAP_PYTHON
|
||||||
|
PythonInterface python; // Make sure we initialize python in main thread
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Create tasks */
|
/* Create tasks */
|
||||||
QApplication * app = new QApplication(argc, argv);
|
QApplication * app = new QApplication(argc, argv);
|
||||||
app->setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }"); // selectable message box
|
app->setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }"); // selectable message box
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
## Multi-Session Visual SLAM for Illumination Invariant Localization in Indoor Environments
|
||||||
|
|
||||||
|
* Paper: https://arxiv.org/abs/2103.03827
|
||||||
|
|
||||||
|
* The setup: we did 6 mapping sessions at dusk to evaluate how well RTAB-Map can localize (only by vision) on maps taken at different illumination conditions. The data has been collected with [RTAB-Map Tango](https://play.google.com/store/apps/details?id=com.introlab.rtabmap&hl=en_CA&gl=US).
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
This folder contains scripts to re-generate results from the paper. The main idea behind this work is that using Multi-Session mapping can help to localize visually in illumination changing environments even with features that are not very robust to such conditions. We compared common hand-made visual features like SIFT, SURF, BRIEF, BRISK, FREAK, DAISY, KAZE with learned descriptor SuperPoint. The following picture show how robust are the visual features tested when localizing against single session recorded at different time. For example, the bottom-left and top-right cells are when the robot tries to localize the night on a map taken the day or vice-versa. The diagonal is localization performance when the localization session is about the same time than when the map was recorded. SuperPoint has clearly an advantage on this single-session experiment.
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
The following image shows when we do the same localization experiment at different hours, but against maps created by assembling maps taken at different hours. In this case, we can see that even binary features like BRIEF can work relatively well in illumination-variant environments. See the paper for more detailled results and comments. The line `1+2+3+4+5+6` refers to the assembled map shown below containing all mapping sessions linked together in same database.
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 224 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 98 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 253 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 110 KiB |
@@ -0,0 +1,135 @@
|
|||||||
|
|
||||||
|
clear all
|
||||||
|
close all
|
||||||
|
|
||||||
|
pkg load signal
|
||||||
|
|
||||||
|
# rtabmap-report --loc 32 Loop/Odom_correction_norm/m Loop/Visual_inliers/ Timing/Total/ms . Keypoint/Current_frame/words
|
||||||
|
# Right-click on thr legend of the figure, copy all data to clipboard
|
||||||
|
# Paste in correction#.txt, inliers#.txt and time#.txt where # is the
|
||||||
|
# number of the descriptor used
|
||||||
|
|
||||||
|
skipFrameDir = '0';
|
||||||
|
prefix = 'Stat';
|
||||||
|
RAMaddOverhead = 1;
|
||||||
|
% Inliers_ratio = 'Loop/Visual_inliers/' ./ 'Keypoint/Current_frame/words'
|
||||||
|
% Odometry_average = 'Memory/Distance_travelled/m'(2:end) - 'Memory/Distance_travelled/m'(1:end-1)
|
||||||
|
statNames = {'Loop/Odom_correction_norm/m', 'Inliers_ratio_%', 'Timing/Total/ms', 'Memory/RAM_usage/MB', 'Memory/RAM_estimated/MB', 'Keypoint/Current_frame/words', 'Loop/Map_id/'}; % 'Odometry_average'
|
||||||
|
|
||||||
|
datasets = [ 0 1 6 7 9 12 14 11]; % 0 1 6 7 8 9 11 12
|
||||||
|
sep = [0, 1000, 3000, 5000, 7000, 9000, 12000];
|
||||||
|
sepName = {'16:51', '17:31', '17:58', '18:30', '18:59', '19:42'};
|
||||||
|
|
||||||
|
allCumResults = {};
|
||||||
|
allMaxResults = {};
|
||||||
|
|
||||||
|
for s=1:length(statNames)
|
||||||
|
|
||||||
|
avgResults = {};
|
||||||
|
maxResults = {};
|
||||||
|
totalResults = {};
|
||||||
|
absResults = {};
|
||||||
|
|
||||||
|
statName = strrep(statNames{s},'/','-');
|
||||||
|
|
||||||
|
for d=1:length(datasets)
|
||||||
|
|
||||||
|
if strcmp(statName,'Inliers_ratio_%')
|
||||||
|
data = dlmread([skipFrameDir '/' prefix num2str(datasets(d)) '-' 'Loop-Visual_inliers-' '.txt'], '\t', 1, 0, "emptyvalue", 0);
|
||||||
|
dataWords = dlmread([skipFrameDir '/' prefix num2str(datasets(d)) '-' 'Keypoint-Current_frame-words' '.txt'], '\t', 1, 0, "emptyvalue", 0);
|
||||||
|
data(:, 2:end) = data(:, 2:end) ./ dataWords(:, 2:end) * 100;
|
||||||
|
elseif strcmp(statName, 'Odometry_average')
|
||||||
|
data = dlmread([skipFrameDir '/' prefix num2str(datasets(d)) '-' 'Memory-Distance_travelled-m' '.txt'], '\t', 1, 0, "emptyvalue", 0);
|
||||||
|
else
|
||||||
|
data = dlmread([skipFrameDir '/' prefix num2str(datasets(d)) '-' statName '.txt'], '\t', 1, 0, "emptyvalue", 0);
|
||||||
|
endif
|
||||||
|
sessions = size(data,2)-1;
|
||||||
|
|
||||||
|
avgResultsTmp = zeros(sessions, length(sep)-1);
|
||||||
|
maxResultsTmp = zeros(sessions, length(sep)-1);
|
||||||
|
totalResultsTmp = zeros(sessions, length(sep)-1);
|
||||||
|
absResultsTmp = zeros(sessions, length(sep)-1);
|
||||||
|
|
||||||
|
for i = 1:sessions
|
||||||
|
for j = 1:length(sep)-1
|
||||||
|
x = data(:,1);
|
||||||
|
y = data(:,i+1);
|
||||||
|
y = y(x>=sep(j) & x<=sep(j+1), :);
|
||||||
|
x = x(x>=sep(j) & x<=sep(j+1), :);
|
||||||
|
if strcmp(statName, 'Odometry_average')
|
||||||
|
y(2:end) = y(2:end) - y(1:end-1);
|
||||||
|
y(y < 0.05) = 0;
|
||||||
|
elseif strcmp(statName, 'Loop-Map_id-')
|
||||||
|
y = y+1;
|
||||||
|
y(y>0) = 1;
|
||||||
|
end
|
||||||
|
if strcmp(statName, 'Memory-RAM_estimated-MB') && RAMaddOverhead == 1
|
||||||
|
% Valgrind estimated around 90 MB constant overhead
|
||||||
|
y = y + 90;
|
||||||
|
if datasets(d) == 7
|
||||||
|
%% 135 MB overhead for BRISK kernel
|
||||||
|
y = y + 135;
|
||||||
|
elseif datasets(d) == 11
|
||||||
|
%% 645 MB (library cuda) + 800 MB (network) for SuperPoint
|
||||||
|
y = y + 645+800;
|
||||||
|
elseif datasets(d) == 13 || datasets(d) == 14
|
||||||
|
%% 64 MB overhead for DAISY
|
||||||
|
y = y + 64;
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
nonzeros = y(y>0);
|
||||||
|
if strcmp(statName, 'Loop-Map_id-')
|
||||||
|
nonzeros = y;
|
||||||
|
end
|
||||||
|
if length(nonzeros) > 0
|
||||||
|
avgValue = sum(nonzeros)/length(nonzeros);
|
||||||
|
avgResultsTmp(i,j) = avgValue;
|
||||||
|
maxResultsTmp(i,j) = max(nonzeros);
|
||||||
|
totalResultsTmp(i,j) = length(nonzeros);
|
||||||
|
absResultsTmp(i,j) = sum(nonzeros);
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endfor
|
||||||
|
avgResults{1,d} = avgResultsTmp;
|
||||||
|
maxResults{1,d} = maxResultsTmp;
|
||||||
|
totalResults{1,d} = totalResultsTmp;
|
||||||
|
absResults{1,d} = absResultsTmp;
|
||||||
|
endfor
|
||||||
|
|
||||||
|
% compute cumulative results
|
||||||
|
cumResults = zeros(sessions+2, length(datasets)+1);
|
||||||
|
for d=1:length(datasets)
|
||||||
|
cumResults(1,d+1) = datasets(d);
|
||||||
|
if sum(totalResults{1,d}, 2)
|
||||||
|
cumResults(2:end-1,d+1) = sum(absResults{1,d}, 2) ./ sum(totalResults{1,d}, 2);
|
||||||
|
endif
|
||||||
|
cumResults(end,d+1) = sum(sum(absResults{1,d}(1:6,1:6).*eye(6,6))) / sum(sum(totalResults{1,d}(1:6,1:6).*eye(6,6)));
|
||||||
|
end
|
||||||
|
cumResults(2:end-1,1) = 1:sessions;
|
||||||
|
|
||||||
|
allCumResults{1,s} = statNames{s};
|
||||||
|
if strcmp(statNames{s}, 'Loop/Odom_correction_norm/m')
|
||||||
|
cumResults(2:end,2:end) = cumResults(2:end,2:end) * 1000;
|
||||||
|
allCumResults{1,s} = 'Loop/Odom_correction_norm/mm';
|
||||||
|
elseif strcmp(statNames{s}, 'Loop/Map_id/')
|
||||||
|
cumResults(2:end,2:end) = cumResults(2:end,2:end) * 100;
|
||||||
|
endif
|
||||||
|
allCumResults{2,s} = round(cumResults);
|
||||||
|
|
||||||
|
% compute max results
|
||||||
|
cumMaxResults = zeros(sessions+2, length(datasets)+1);
|
||||||
|
for d=1:length(datasets)
|
||||||
|
cumMaxResults(1,d+1) = datasets(d);
|
||||||
|
if sum(totalResults{1,d}, 2)
|
||||||
|
cumMaxResults(2:end-1,d+1) = max(maxResults{1,d}, [], 2);
|
||||||
|
endif
|
||||||
|
cumMaxResults(end,d+1) = max(max(maxResults{1,d}(1:6,1:6).*eye(6,6)));
|
||||||
|
end
|
||||||
|
cumMaxResults(2:end-1,1) = 1:sessions;
|
||||||
|
|
||||||
|
allMaxResults{1,s} = statNames{s};
|
||||||
|
allMaxResults{2,s} = cumMaxResults;
|
||||||
|
|
||||||
|
endfor % statNames
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,235 @@
|
|||||||
|
|
||||||
|
close all
|
||||||
|
clear all
|
||||||
|
|
||||||
|
pkg load signal
|
||||||
|
|
||||||
|
# rtabmap-report --loc 32 Loop/Map_id/ loc
|
||||||
|
# Right-click on thr legend of the figure, copy all data to clipboard
|
||||||
|
# Paste in data#.txt where # is the number of the descriptor used
|
||||||
|
|
||||||
|
resultsToShow = 1; % 1=single loc, 2=merged loc, 3=consecutive
|
||||||
|
skipFrameDir = '0';
|
||||||
|
|
||||||
|
datasetPrefix = 'Stat';
|
||||||
|
datasets = [0 1 6 7 9 12 14 11]; % 0 1 6 7 8 9 11 12
|
||||||
|
datasetsName = {'SURF' 'SIFT' 'ORB' 'FAST/FREAK' 'FAST/BRIEF' 'GFTT/FREAK' 'GFTT/BRIEF' 'BRISK' 'GFTT/ORB' 'KAZE' 'ORB-OCTREE' 'SuperPoint' 'SURF/FREAK' 'GFTT/DAISY' 'SURF/DAISY'};
|
||||||
|
sep = [0, 1000, 3000, 5000, 7000, 9000, 12000];
|
||||||
|
sepName = {'16:51', '17:31', '17:58', '18:30', '18:59', '19:42'};
|
||||||
|
|
||||||
|
if resultsToShow == 3
|
||||||
|
sep = [0, 1000, 3000, 5000, 7000, 9000];
|
||||||
|
sepName = {'17:27', '17:54', '18:27', '18:56', '19:35'};
|
||||||
|
datasetPrefix = 'Consecutive'
|
||||||
|
endif
|
||||||
|
|
||||||
|
percentResults = {};
|
||||||
|
totalResults = {};
|
||||||
|
locResults = {};
|
||||||
|
|
||||||
|
figure
|
||||||
|
|
||||||
|
colors = get(gca, 'ColorOrder');
|
||||||
|
tmp=colors(3,:);
|
||||||
|
colors(3,:) = colors(5,:);
|
||||||
|
colors(5,:) = tmp;
|
||||||
|
|
||||||
|
globalSeparators = [];
|
||||||
|
globalx = [];
|
||||||
|
globaly = [];
|
||||||
|
globalc = [];
|
||||||
|
|
||||||
|
for d=1:length(datasets)
|
||||||
|
|
||||||
|
data = dlmread([skipFrameDir '/' datasetPrefix num2str(datasets(d)) '-Loop-Map_id-' '.txt'], '\t', 1, 0, "emptyvalue", NaN);
|
||||||
|
|
||||||
|
curvesBeg = 2;
|
||||||
|
curvesEnd = size(data,2)-4;
|
||||||
|
|
||||||
|
if resultsToShow == 2
|
||||||
|
curvesBeg = 8;
|
||||||
|
curvesEnd = size(data,2);
|
||||||
|
elseif resultsToShow == 3
|
||||||
|
curvesEnd = size(data,2);
|
||||||
|
endif
|
||||||
|
curves = curvesEnd - curvesBeg + 1;
|
||||||
|
|
||||||
|
percentResultsTmp = zeros(curves, length(sep)-1);
|
||||||
|
totalResultsTmp = zeros(curves, length(sep)-1);
|
||||||
|
locResultsTmp = zeros(curves, length(sep)-1);
|
||||||
|
|
||||||
|
offset = 1;
|
||||||
|
|
||||||
|
for i = 1:curves
|
||||||
|
index = i + curvesBeg - 1;
|
||||||
|
separators = [];
|
||||||
|
x_all = [];
|
||||||
|
y_all = [];
|
||||||
|
m_all = [];
|
||||||
|
previousMax = 0;
|
||||||
|
for j = 1:length(sep)-1
|
||||||
|
x = data(:,1);
|
||||||
|
y = data(:,index);
|
||||||
|
y = y(x>=sep(j) & x<=sep(j+1), :);
|
||||||
|
x = x(x>=sep(j) & x<=sep(j+1), :);
|
||||||
|
minimum = x(1,1);
|
||||||
|
separators = [separators previousMax];
|
||||||
|
x = x - (minimum-previousMax);
|
||||||
|
previousMax = x(end,1);
|
||||||
|
y = y + 1;
|
||||||
|
m = y;
|
||||||
|
y(y>0) = 1;
|
||||||
|
y(isnan(y)) = 0;
|
||||||
|
percent = sum(y)/length(y);
|
||||||
|
percentResultsTmp(i,j) = percent;
|
||||||
|
locResultsTmp(i,j) = sum(y);
|
||||||
|
totalResultsTmp(i,j) = length(y);
|
||||||
|
y(y>0) = -(d-1)*curves -i - (d-1)*offset;
|
||||||
|
%x(y==0) = nan;
|
||||||
|
m(y==0) = nan;
|
||||||
|
y(y==0) = nan;
|
||||||
|
if resultsToShow == 2
|
||||||
|
if i==1 %% Merged 1, 6
|
||||||
|
m(m==1) = 1;
|
||||||
|
m(m==2) = 6;
|
||||||
|
elseif i==2 %% Merged 1,3(2 sessions),5
|
||||||
|
m(m==1) = 1;
|
||||||
|
m(m==2) = 3;
|
||||||
|
m(m==3) = 3;
|
||||||
|
m(m==4) = 5;
|
||||||
|
elseif i==3 %% Merged 2(2 sessions),4,6
|
||||||
|
m(m==1) = 2;
|
||||||
|
m(m==2) = 2;
|
||||||
|
m(m==4) = 6;
|
||||||
|
m(m==3) = 4;
|
||||||
|
elseif i>=4 %% Merged 1, 2(2 sessions), 3(2 sessions),4,5,6
|
||||||
|
m(m==1) = 1;
|
||||||
|
m(m==2) = 2;
|
||||||
|
m(m==3) = 2;
|
||||||
|
m(m==4) = 3;
|
||||||
|
m(m==5) = 3;
|
||||||
|
m(m==6) = 4;
|
||||||
|
m(m==7) = 5;
|
||||||
|
m(m==8) = 6;
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
x = upsample(x, 2);
|
||||||
|
y = upsample(y, 2);
|
||||||
|
m = upsample(m, 2);
|
||||||
|
x(2:2:end-1) = x(3:2:end);
|
||||||
|
y(2:2:end-1) = y(3:2:end);
|
||||||
|
m(2:2:end) = m(1:2:end);
|
||||||
|
x = x(1:end-1);
|
||||||
|
y = y(1:end-1);
|
||||||
|
m = m(1:end-1);
|
||||||
|
|
||||||
|
x_all = [x_all nan x'];
|
||||||
|
y_all = [y_all nan y'];
|
||||||
|
m_all = [m_all nan m'];
|
||||||
|
endfor
|
||||||
|
if resultsToShow == 2
|
||||||
|
globalx = [globalx x_all];
|
||||||
|
globaly = [globaly y_all];
|
||||||
|
globalc = [globalc m_all];
|
||||||
|
else
|
||||||
|
plot(x_all,y_all, 'linewidth', 3, 'color', colors(i,:))
|
||||||
|
hold on
|
||||||
|
endif
|
||||||
|
separators = [separators previousMax];
|
||||||
|
globalSeparators = separators;
|
||||||
|
endfor
|
||||||
|
percentResults{1,d} = percentResultsTmp;
|
||||||
|
totalResults{1,d} = totalResultsTmp;
|
||||||
|
locResults{1,d} = locResultsTmp;
|
||||||
|
endfor
|
||||||
|
|
||||||
|
if resultsToShow == 2
|
||||||
|
indColors = ones(length(globalc), 3);
|
||||||
|
for j=1:length(globalc)
|
||||||
|
if ~isnan(globalc(j))
|
||||||
|
indColors(j,:) = colors(globalc(j),:);
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
for i=1:6
|
||||||
|
tmpx = globalx;
|
||||||
|
tmpy = globaly;
|
||||||
|
tmpx(globalc~=i) = nan;
|
||||||
|
tmpy(globalc~=i) = nan;
|
||||||
|
plot(tmpx, tmpy, 'linewidth', 3, 'color', colors(i,:));
|
||||||
|
if i==1
|
||||||
|
hold on
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
|
||||||
|
for j=1:length(globalSeparators)
|
||||||
|
x = globalSeparators(j);
|
||||||
|
plot([x,x],[(-length(datasets)*(curves+1)) ,0], 'k','linewidth', 2);
|
||||||
|
endfor
|
||||||
|
|
||||||
|
for d=1:length(datasets)
|
||||||
|
annotation ("textbox", [0, 0.96-((d-0.5)/length(datasets))*0.95, 0,0], 'string', datasetsName{datasets(d)+1})
|
||||||
|
endfor
|
||||||
|
for s=1:length(sep)-1
|
||||||
|
annotation ("textbox", [0.1 + ((separators(s+1)-separators(s))/2+separators(s))/separators(end)*0.75, 0.98, 0,0], 'string', sepName{s})
|
||||||
|
endfor
|
||||||
|
axis('tight')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
set(gca, 'units', 'normalized');
|
||||||
|
Tight = get(gca, 'Position');
|
||||||
|
NewPos = [Tight(1) 0.01 0.77 0.95]; %New plot position [X Y W H]
|
||||||
|
set(gca, 'Position', NewPos);
|
||||||
|
if length(sep) == 7
|
||||||
|
legend('16:46', '17:27', '17:54', '18:27', '18:56', '19:35', "location", 'northeastoutside' )
|
||||||
|
else
|
||||||
|
legend('16:46', '17:27', '17:54', '18:27', '18:56', "location", 'northeastoutside' )
|
||||||
|
endif
|
||||||
|
box off
|
||||||
|
axis off
|
||||||
|
|
||||||
|
#disp(percentResults);
|
||||||
|
#disp(totalResults);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
for d=1:length(datasets)
|
||||||
|
subplot(4,2,d)
|
||||||
|
data=percentResults{1,d}*100;
|
||||||
|
data(isnan(data)) = 0;
|
||||||
|
hAxes = gca;
|
||||||
|
imagesc( hAxes, data, [0, 100])
|
||||||
|
%title({"",datasetsName{datasets(d)+1}})
|
||||||
|
colors = [ones(100,1) [1:100]'*0.01 [1:100]'*0];
|
||||||
|
colors(1,:) = 1;
|
||||||
|
colormap( hAxes , colors)
|
||||||
|
c = colorbar;
|
||||||
|
labels = {};
|
||||||
|
for v=get(c,'ytick'), labels{end+1} = sprintf('%d%%',v); end
|
||||||
|
set(c,'yticklabel',labels);
|
||||||
|
if mod(d,2) == 1
|
||||||
|
ylabel("Map")
|
||||||
|
endif
|
||||||
|
xlabel([datasetsName{datasets(d)+1} " Localization"])
|
||||||
|
set (gca, "xaxislocation", "top");
|
||||||
|
set(gca, 'XTickLabel', sepName, 'fontsize',7)
|
||||||
|
if resultsToShow == 3
|
||||||
|
set(gca, 'YTickLabel', {'16:46', '17:27', '17:54', '18:27', '18:56'}, 'fontsize',7)
|
||||||
|
elseif resultsToShow == 2
|
||||||
|
set(gca, 'YTickLabel', {'1+6', '1+3+5', '2+4+6', '1+2+3+4+6', 'bundle', 'reduced'}, 'fontsize',7)
|
||||||
|
else
|
||||||
|
set(gca, 'YTickLabel', {'16:46', '17:27', '17:54', '18:27', '18:56', '19:35'}, 'fontsize',7)
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
% compute cumulative localizations
|
||||||
|
cumResults = zeros(curves+2, length(datasets)+1);
|
||||||
|
for d=1:length(datasets)
|
||||||
|
cumResults(1,d+1) = datasets(d);
|
||||||
|
cumResults(2:end-1,d+1) = round(sum(locResults{1,d}, 2) ./ sum(totalResults{1,d}, 2) * 100);
|
||||||
|
if resultsToShow == 1
|
||||||
|
cumResults(end,d+1) = round(sum(sum(locResults{1,d}.*eye(curves,curves))) / sum(totalResults{1,d},2)(1,1) * 100);
|
||||||
|
endif
|
||||||
|
end
|
||||||
|
cumResults(2:end-1,1) = 1:curves;
|
||||||
|
cumResults
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
SKIP=0
|
||||||
|
if [ $# -eq 1 ]
|
||||||
|
then
|
||||||
|
SKIP=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
DETECTOR=(0 1 6 7 9 11 12 14) #0 1 6 7 8 9 11 12 13 14
|
||||||
|
|
||||||
|
PREFIX="/home/mathieu/workspace/rtabmap_cv_latest/bin/"
|
||||||
|
REPORT_TOOL="${PREFIX}rtabmap-report"
|
||||||
|
|
||||||
|
for d in "${DETECTOR[@]}"
|
||||||
|
do
|
||||||
|
$REPORT_TOOL --export --export_prefix "Stat$d" --loc 32 Loop/Odom_correction_norm/m Loop/Visual_inliers/ Timing/Total/ms Loop/Map_id/ Keypoint/Current_frame/words Memory/RAM_usage/MB Memory/RAM_estimated/MB Memory/Distance_travelled/m "$SKIP/$d/loc"
|
||||||
|
$REPORT_TOOL --export --export_prefix "Consecutive$d" --loc 32 Loop/Map_id/ "$SKIP/$d/consecutive_loc"
|
||||||
|
done
|
||||||
|
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ $# -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "No arguments supplied. It should be the detector number type (0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB 9=KAZE 10=ORB-OCTREE 11=SuperPoint)."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
TYPE=$1
|
||||||
|
|
||||||
|
SKIP=0
|
||||||
|
if [ $# -eq 2 ]
|
||||||
|
then
|
||||||
|
SKIP=$2
|
||||||
|
fi
|
||||||
|
|
||||||
|
PREFIX="/home/mathieu/workspace/rtabmap_cv_latest/bin/"
|
||||||
|
REPROCESS_TOOL="${PREFIX}rtabmap-reprocess"
|
||||||
|
DETECT_MORE_LOOP_CLOSURE_TOOL="${PREFIX}rtabmap-detectMoreLoopClosures"
|
||||||
|
|
||||||
|
[ ! -d "$SKIP" ] && mkdir $SKIP
|
||||||
|
[ ! -d "$SKIP/$TYPE" ] && mkdir $SKIP/$TYPE
|
||||||
|
# 'map_190321-164651.db' 'map_190321-172717.db' 'map_190321-175428.db' 'map_190321-182709.db' 'map_190321-185608.db' 'map_190321-193556.db'
|
||||||
|
DATABASES=( 'map_190321-164651.db' 'map_190321-172717.db' 'map_190321-175428.db' 'map_190321-182709.db' 'map_190321-185608.db' 'map_190321-193556.db' )
|
||||||
|
|
||||||
|
PARAMS="--Kp/DetectorStrategy $TYPE --Vis/FeatureType $TYPE"
|
||||||
|
|
||||||
|
if [ $TYPE -eq 2 ] || [ $TYPE -eq 3 ] || [ $TYPE -eq 4 ] || [ $TYPE -eq 5 ] || [ $TYPE -eq 6 ] || [ $TYPE -eq 7 ] || [ $TYPE -eq 8 ] || [ $TYPE -eq 10 ] || [ $TYPE -eq 12 ]
|
||||||
|
then
|
||||||
|
# binary descriptors
|
||||||
|
PARAMS="--Vis/CorNNDR 0.8 $PARAMS"
|
||||||
|
else
|
||||||
|
# float descriptors
|
||||||
|
PARAMS="--Vis/CorNNDR 0.6 $PARAMS"
|
||||||
|
if
|
||||||
|
|
||||||
|
echo $PARAMS
|
||||||
|
for db in "${DATABASES[@]}"
|
||||||
|
do
|
||||||
|
$REPROCESS_TOOL --skip $SKIP --RGBD/MarkerDetection false --RGBD/ProximityBySpace true --RGBD/LocalRadius 1 --Mem/InitWMWithAllNodes true --Rtabmap/TimeThr 0 --Mem/UseOdomFeatures false --Optimizer/GravitySigma 0.1 --Mem/UseOdomGravity true --RGBD/OptimizeFromGraphEnd false --Mem/DepthAsMask false --RGBD/OptimizeMaxError 4 --RGBD/ProximityOdomGuess false --Vis/MaxFeatures 1000 --Kp/MaxFeatures 400 --Vis/EpipolarGeometryVar 0.1 --Vis/EstimationType 1 --Vis/MinInliers 20 --Rtabmap/MaxRetrieved 2 --Optimizer/Iterations 20 --Mem/CompressionParallelized true --Kp/Parallelized true --Kp/MaxDepth 0 --Kp/BadSignRatio 0.2 --BRIEF/Bytes 32 --Kp/ByteToFloat true --SURF/HessianThreshold 100 --SIFT/ContrastThreshold 0.02 --BRISK/Thresh 10 --SuperPoint/ModelPath superpoint.pt --Rtabmap/PublishRAMUsage true --ORB/EdgeThreshold 19 --ORB/ScaleFactor 2 --ORB/NLevels 3 --uerror $PARAMS $db $SKIP/$TYPE/$db
|
||||||
|
$DETECT_MORE_LOOP_CLOSURE_TOOL --uwarn $SKIP/$TYPE/$db
|
||||||
|
done
|
||||||
|
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
SKIP=0
|
||||||
|
if [ $# -eq 1 ]
|
||||||
|
then
|
||||||
|
SKIP=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
DETECTOR=(0 1 6 7 9 11 12 14)
|
||||||
|
|
||||||
|
for d in "${DETECTOR[@]}"
|
||||||
|
do
|
||||||
|
./reprocess_maps.sh $d $SKIP
|
||||||
|
./run_merge.sh $d $SKIP
|
||||||
|
done
|
||||||
|
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
SKIP=0
|
||||||
|
if [ $# -eq 1 ]
|
||||||
|
then
|
||||||
|
SKIP=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
./reprocess_maps_all.sh $SKIP
|
||||||
|
./run_merge.sh $SKIP
|
||||||
|
./run_localization_single_all.sh $SKIP
|
||||||
|
./run_consecutive_localization_all.sh $SKIP
|
||||||
|
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ $# -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "No arguments supplied. It should be the detector number type (0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB 9=KAZE 10=ORB-OCTREE 11=SuperPoint)."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
TYPE=$1
|
||||||
|
|
||||||
|
SKIP=0
|
||||||
|
if [ $# -eq 2 ]
|
||||||
|
then
|
||||||
|
SKIP=$2
|
||||||
|
fi
|
||||||
|
|
||||||
|
PREFIX="/home/mathieu/workspace/rtabmap_cv_latest/bin/"
|
||||||
|
REPROCESS_TOOL="${PREFIX}rtabmap-reprocess"
|
||||||
|
|
||||||
|
SOURCE=('map_190321-164651.db' 'map_190321-172717.db' 'map_190321-175428.db' 'map_190321-182709.db' 'map_190321-185608.db')
|
||||||
|
TARGETS=($SKIP/$TYPE'/map_190321-172717.db;'$SKIP/$TYPE'/map_190321-175428.db;'$SKIP/$TYPE'/map_190321-193556.db' $SKIP/$TYPE'/map_190321-175428.db;'$SKIP/$TYPE'/map_190321-182709.db;' $SKIP/$TYPE'/map_190321-182709.db;'$SKIP/$TYPE'/map_190321-185608.db' $SKIP/$TYPE'/map_190321-185608.db;'$SKIP/$TYPE'/map_190321-193556.db' $SKIP/$TYPE'/map_190321-193556.db' )
|
||||||
|
|
||||||
|
|
||||||
|
[ ! -d "$SKIP/$TYPE/consecutive_loc" ] && mkdir $SKIP/$TYPE/consecutive_loc
|
||||||
|
|
||||||
|
for i in ${!SOURCE[@]}
|
||||||
|
do
|
||||||
|
db=${SOURCE[$i]}
|
||||||
|
loc_dbs=${TARGETS[$i]}
|
||||||
|
$REPROCESS_TOOL --Mem/IncrementalMemory false --RGBD/ProximityBySpace true --Mem/LocalizationDataSaved true --Mem/BinDataKept false --RGBD/SavedLocalizationIgnored true --uwarn "$SKIP/$TYPE/$db;$loc_dbs" $SKIP/$TYPE/consecutive_loc/loc_$db
|
||||||
|
done
|
||||||
|
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
SKIP=0
|
||||||
|
if [ $# -eq 1 ]
|
||||||
|
then
|
||||||
|
SKIP=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
DETECTOR=(0 1 6 7 9 11 12 14)
|
||||||
|
|
||||||
|
for d in "${DETECTOR[@]}"
|
||||||
|
do
|
||||||
|
./run_consecutive_localization.sh $d $SKIP
|
||||||
|
done
|
||||||
|
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ $# -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "No arguments supplied. It should be the detector number type (0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB 9=KAZE 10=ORB-OCTREE 11=SuperPoint)."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
TYPE=$1
|
||||||
|
|
||||||
|
SKIP=0
|
||||||
|
if [ $# -eq 2 ]
|
||||||
|
then
|
||||||
|
SKIP=$2
|
||||||
|
fi
|
||||||
|
|
||||||
|
PREFIX="/home/mathieu/workspace/rtabmap_cv_latest/bin/"
|
||||||
|
REPROCESS_TOOL="${PREFIX}rtabmap-reprocess"
|
||||||
|
|
||||||
|
# loc_190321-165128.db;loc_190321-173134.db;loc_190321-175823.db;loc_190321-183051.db;loc_190321-185950.db;loc_190321-194226.db
|
||||||
|
LOCALIZATION_DATABASES="loc_190321-165128.db;loc_190321-173134.db;loc_190321-175823.db;loc_190321-183051.db;loc_190321-185950.db;loc_190321-194226.db"
|
||||||
|
|
||||||
|
[ ! -d "$SKIP/$TYPE/loc" ] && mkdir $SKIP/$TYPE/accuracy
|
||||||
|
|
||||||
|
db=merged_9999.db
|
||||||
|
|
||||||
|
$REPROCESS_TOOL --skip $SKIP --Mem/IncrementalMemory false --RGBD/ProximityBySpace true --Mem/LocalizationDataSaved true --Mem/BinDataKept false --RGBD/SavedLocalizationIgnored true --Kp/IncrementalFlann false --Vis/MinInliers 20 --Rtabmap/PublishRAMUsage true --RGBD/ProximityOdomGuess false --Reg/RepeatOnce true --Vis/BundleAdjustment 1 --uwarn "$SKIP/$TYPE/$db;$LOCALIZATION_DATABASES" $SKIP/$TYPE/accuracy/ProxOff_DoubleRegOn_BaOn_$db
|
||||||
|
|
||||||
|
$REPROCESS_TOOL --skip $SKIP --Mem/IncrementalMemory false --RGBD/ProximityBySpace true --Mem/LocalizationDataSaved true --Mem/BinDataKept false --RGBD/SavedLocalizationIgnored true --Kp/IncrementalFlann false --Vis/MinInliers 20 --Rtabmap/PublishRAMUsage true --RGBD/ProximityOdomGuess false --Reg/RepeatOnce false --Vis/BundleAdjustment 1 --uwarn "$SKIP/$TYPE/$db;$LOCALIZATION_DATABASES" $SKIP/$TYPE/accuracy/ProxOff_DoubleRegOff_BaOn_$db
|
||||||
|
|
||||||
|
$REPROCESS_TOOL --skip $SKIP --Mem/IncrementalMemory false --RGBD/ProximityBySpace true --Mem/LocalizationDataSaved true --Mem/BinDataKept false --RGBD/SavedLocalizationIgnored true --Kp/IncrementalFlann false --Vis/MinInliers 20 --Rtabmap/PublishRAMUsage true --RGBD/ProximityOdomGuess false --Reg/RepeatOnce true --Vis/BundleAdjustment 0 --uwarn "$SKIP/$TYPE/$db;$LOCALIZATION_DATABASES" $SKIP/$TYPE/accuracy/ProxOff_DoubleRegOn_BaOff_$db
|
||||||
|
|
||||||
|
$REPROCESS_TOOL --skip $SKIP --Mem/IncrementalMemory false --RGBD/ProximityBySpace true --Mem/LocalizationDataSaved true --Mem/BinDataKept false --RGBD/SavedLocalizationIgnored true --Kp/IncrementalFlann false --Vis/MinInliers 20 --Rtabmap/PublishRAMUsage true --RGBD/ProximityOdomGuess false --Reg/RepeatOnce false --Vis/BundleAdjustment 0 --uwarn "$SKIP/$TYPE/$db;$LOCALIZATION_DATABASES" $SKIP/$TYPE/accuracy/ProxOff_DoubleRegOff_BaOff_$db
|
||||||
|
|
||||||
|
$REPROCESS_TOOL --skip $SKIP --Mem/IncrementalMemory false --RGBD/ProximityBySpace true --Mem/LocalizationDataSaved true --Mem/BinDataKept false --RGBD/SavedLocalizationIgnored true --Kp/IncrementalFlann false --Vis/MinInliers 20 --Rtabmap/PublishRAMUsage true --RGBD/ProximityOdomGuess true --Reg/RepeatOnce true --Vis/BundleAdjustment 1 --uwarn "$SKIP/$TYPE/$db;$LOCALIZATION_DATABASES" $SKIP/$TYPE/accuracy/ProxOn_DoubleRegOn_BaOn_$db
|
||||||
|
|
||||||
|
$REPROCESS_TOOL --skip $SKIP --Mem/IncrementalMemory false --RGBD/ProximityBySpace true --Mem/LocalizationDataSaved true --Mem/BinDataKept false --RGBD/SavedLocalizationIgnored true --Kp/IncrementalFlann false --Vis/MinInliers 20 --Rtabmap/PublishRAMUsage true --RGBD/ProximityOdomGuess true --Reg/RepeatOnce true --Vis/BundleAdjustment 0 --uwarn "$SKIP/$TYPE/$db;$LOCALIZATION_DATABASES" $SKIP/$TYPE/accuracy/ProxOn_DoubleRegOn_BaOff_$db
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ $# -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "No arguments supplied. It should be the detector number type (0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB 9=KAZE 10=ORB-OCTREE 11=SuperPoint)."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
TYPE=$1
|
||||||
|
|
||||||
|
SKIP=0
|
||||||
|
if [ $# -eq 2 ]
|
||||||
|
then
|
||||||
|
SKIP=$2
|
||||||
|
fi
|
||||||
|
|
||||||
|
PREFIX="/home/mathieu/workspace/rtabmap_cv_latest/bin/"
|
||||||
|
REPROCESS_TOOL="${PREFIX}rtabmap-reprocess"
|
||||||
|
|
||||||
|
# 'map_190321-164651.db' 'map_190321-172717.db' 'map_190321-175428.db' 'map_190321-182709.db' 'map_190321-185608.db' 'map_190321-193556.db' 'merged_9999.db' 'merged_135.db' 'merged_246.db' 'merged_16.db' 'merged_9999_reduced.db'
|
||||||
|
DATABASES=( 'map_190321-164651.db' 'map_190321-172717.db' 'map_190321-175428.db' 'map_190321-182709.db' 'map_190321-185608.db' 'map_190321-193556.db' 'merged_9999.db' 'merged_135.db' 'merged_246.db' 'merged_16.db' )
|
||||||
|
# loc_190321-165128.db;loc_190321-173134.db;loc_190321-175823.db;loc_190321-183051.db;loc_190321-185950.db;loc_190321-194226.db
|
||||||
|
LOCALIZATION_DATABASES="loc_190321-165128.db;loc_190321-173134.db;loc_190321-175823.db;loc_190321-183051.db;loc_190321-185950.db;loc_190321-194226.db"
|
||||||
|
|
||||||
|
[ ! -d "$SKIP/$TYPE/loc" ] && mkdir $SKIP/$TYPE/loc
|
||||||
|
|
||||||
|
echo $PARAMS
|
||||||
|
for db in "${DATABASES[@]}"
|
||||||
|
do
|
||||||
|
$REPROCESS_TOOL --skip $SKIP --Mem/IncrementalMemory false --RGBD/ProximityBySpace true --Mem/LocalizationDataSaved true --Mem/BinDataKept false --RGBD/SavedLocalizationIgnored true --Kp/IncrementalFlann false --Vis/MinInliers 20 --Rtabmap/PublishRAMUsage true --RGBD/ProximityOdomGuess false --uwarn "$SKIP/$TYPE/$db;$LOCALIZATION_DATABASES" $SKIP/$TYPE/loc/loc_$db
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
SKIP=0
|
||||||
|
if [ $# -eq 1 ]
|
||||||
|
then
|
||||||
|
SKIP=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
DETECTOR=(0 1 6 7 9 11 12 14)
|
||||||
|
|
||||||
|
for d in "${DETECTOR[@]}"
|
||||||
|
do
|
||||||
|
./run_localization_single.sh $d $SKIP
|
||||||
|
done
|
||||||
|
|
||||||
+38
@@ -0,0 +1,38 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ $# -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "No arguments supplied. It should be the detector number type (0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB 9=KAZE 10=ORB-OCTREE 11=SuperPoint)."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
TYPE=$1
|
||||||
|
|
||||||
|
SKIP=0
|
||||||
|
if [ $# -eq 2 ]
|
||||||
|
then
|
||||||
|
SKIP=$2
|
||||||
|
fi
|
||||||
|
|
||||||
|
PREFIX="/home/mathieu/workspace/rtabmap_cv_latest/bin/"
|
||||||
|
REPROCESS_TOOL="${PREFIX}rtabmap-reprocess"
|
||||||
|
DETECT_MORE_LOOP_CLOSURE_TOOL="${PREFIX}rtabmap-detectMoreLoopClosures"
|
||||||
|
|
||||||
|
DATABASES="$SKIP/$TYPE/map_190321-164651.db;$SKIP/$TYPE/map_190321-172717.db;$SKIP/$TYPE/map_190321-175428.db;$SKIP/$TYPE/map_190321-182709.db;$SKIP/$TYPE/map_190321-185608.db;$SKIP/$TYPE/map_190321-193556.db"
|
||||||
|
|
||||||
|
$REPROCESS_TOOL --uwarn --RGBD/OptimizeMaxError 0 "$DATABASES" $SKIP/$TYPE/merged_9999.db
|
||||||
|
$DETECT_MORE_LOOP_CLOSURE_TOOL $SKIP/$TYPE/merged_9999.db
|
||||||
|
|
||||||
|
#$REPROCESS_TOOL --uwarn --RGBD/OptimizeMaxError 0 --Mem/ReduceGraph true --Vis/MinInliers 60 "$DATABASES" $SKIP/$TYPE/merged_9999_reduced.db
|
||||||
|
#$DETECT_MORE_LOOP_CLOSURE_TOOL $SKIP/$TYPE/merged_9999_reduced.db
|
||||||
|
|
||||||
|
$REPROCESS_TOOL --uwarn --RGBD/OptimizeMaxError 0 "$SKIP/$TYPE/map_190321-164651.db;$SKIP/$TYPE/map_190321-193556.db" $SKIP/$TYPE/merged_16.db
|
||||||
|
$DETECT_MORE_LOOP_CLOSURE_TOOL $SKIP/$TYPE/merged_16.db
|
||||||
|
|
||||||
|
$REPROCESS_TOOL --uwarn --RGBD/OptimizeMaxError 0 "$SKIP/$TYPE/map_190321-164651.db;$SKIP/$TYPE/map_190321-175428.db;$SKIP/$TYPE/map_190321-185608.db" $SKIP/$TYPE/merged_135.db
|
||||||
|
$DETECT_MORE_LOOP_CLOSURE_TOOL $SKIP/$TYPE/merged_135.db
|
||||||
|
|
||||||
|
$REPROCESS_TOOL --uwarn --RGBD/OptimizeMaxError 0 "$SKIP/$TYPE/map_190321-172717.db;$SKIP/$TYPE/map_190321-182709.db;$SKIP/$TYPE/map_190321-193556.db" $SKIP/$TYPE/merged_246.db
|
||||||
|
$DETECT_MORE_LOOP_CLOSURE_TOOL $SKIP/$TYPE/merged_246.db
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
SKIP=0
|
||||||
|
if [ $# -eq 1 ]
|
||||||
|
then
|
||||||
|
SKIP=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
DETECTOR=(0 1 6 7 8 9 11 12 14)
|
||||||
|
|
||||||
|
PREFIX="/home/mathieu/workspace/rtabmap_cv_latest/bin/"
|
||||||
|
REPORT_TOOL="${PREFIX}rtabmap-report"
|
||||||
|
|
||||||
|
for d in "${DETECTOR[@]}"
|
||||||
|
do
|
||||||
|
valgrind --tool=massif --time-unit=ms --detailed-freq=1 --max-snapshots=100 ${PREFIX}rtabmap-reprocess --Mem/IncrementalMemory false --Kp/IncrementalFlann false "${SKIP}/${d}/merged_9999.db;map_190321-164651.db" output.db
|
||||||
|
rm output.db
|
||||||
|
done
|
||||||
|
|
||||||
@@ -0,0 +1,234 @@
|
|||||||
|
#.rst:
|
||||||
|
# FindHIDAPI
|
||||||
|
# ----------
|
||||||
|
#
|
||||||
|
# Try to find HIDAPI library, from http://www.signal11.us/oss/hidapi/
|
||||||
|
#
|
||||||
|
# Cache Variables: (probably not for direct use in your scripts)
|
||||||
|
# HIDAPI_INCLUDE_DIR
|
||||||
|
# HIDAPI_LIBRARY
|
||||||
|
#
|
||||||
|
# Non-cache variables you might use in your CMakeLists.txt:
|
||||||
|
# HIDAPI_FOUND
|
||||||
|
# HIDAPI_INCLUDE_DIRS
|
||||||
|
# HIDAPI_LIBRARIES
|
||||||
|
#
|
||||||
|
# COMPONENTS
|
||||||
|
# ^^^^^^^^^^
|
||||||
|
#
|
||||||
|
# This module respects several COMPONENTS specifying the backend you prefer:
|
||||||
|
# ``any`` (the default), ``libusb``, and ``hidraw``.
|
||||||
|
# The availablility of the latter two depends on your platform.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# IMPORTED Targets
|
||||||
|
# ^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
# This module defines :prop_tgt:`IMPORTED` target ``HIDAPI::hidapi`` (in all cases or
|
||||||
|
# if no components specified), ``HIDAPI::hidapi-libusb`` (if you requested the libusb component),
|
||||||
|
# and ``HIDAPI::hidapi-hidraw`` (if you requested the hidraw component),
|
||||||
|
#
|
||||||
|
# Result Variables
|
||||||
|
# ^^^^^^^^^^^^^^^^
|
||||||
|
#
|
||||||
|
# ``HIDAPI_FOUND``
|
||||||
|
# True if HIDAPI or the requested components (if any) were found.
|
||||||
|
#
|
||||||
|
# We recommend using the imported targets instead of the following.
|
||||||
|
#
|
||||||
|
# ``HIDAPI_INCLUDE_DIRS``
|
||||||
|
# ``HIDAPI_LIBRARIES``
|
||||||
|
#
|
||||||
|
# Original Author:
|
||||||
|
# 2009-2010, 2019 Ryan Pavlik <[email protected]> <[email protected]>
|
||||||
|
# http://academic.cleardefinition.com
|
||||||
|
#
|
||||||
|
# Copyright Iowa State University 2009-2010.
|
||||||
|
# Copyright Collabora, Ltd. 2019.
|
||||||
|
# Distributed under the Boost Software License, Version 1.0.
|
||||||
|
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
# http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
cmake_policy(SET CMP0045 NEW)
|
||||||
|
cmake_policy(SET CMP0053 NEW)
|
||||||
|
cmake_policy(SET CMP0054 NEW)
|
||||||
|
|
||||||
|
set(HIDAPI_ROOT_DIR
|
||||||
|
"${HIDAPI_ROOT_DIR}"
|
||||||
|
CACHE PATH "Root to search for HIDAPI")
|
||||||
|
|
||||||
|
# Clean up components
|
||||||
|
if("${HIDAPI_FIND_COMPONENTS}")
|
||||||
|
if(WIN32 OR APPLE)
|
||||||
|
# This makes no sense on Windows or Mac, which have native APIs
|
||||||
|
list(REMOVE HIDAPI_FIND_COMPONENTS libusb)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT ${CMAKE_SYSTEM} MATCHES "Linux")
|
||||||
|
# hidraw is only on linux
|
||||||
|
list(REMOVE HIDAPI_FIND_COMPONENTS hidraw)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if(NOT "${HIDAPI_FIND_COMPONENTS}")
|
||||||
|
# Default to any
|
||||||
|
set(HIDAPI_FIND_COMPONENTS any)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Ask pkg-config for hints
|
||||||
|
find_package(PkgConfig QUIET)
|
||||||
|
if(PKG_CONFIG_FOUND)
|
||||||
|
set(_old_prefix_path "${CMAKE_PREFIX_PATH}")
|
||||||
|
# So pkg-config uses HIDAPI_ROOT_DIR too.
|
||||||
|
if(HIDAPI_ROOT_DIR)
|
||||||
|
list(APPEND CMAKE_PREFIX_PATH ${HIDAPI_ROOT_DIR})
|
||||||
|
endif()
|
||||||
|
pkg_check_modules(PC_HIDAPI_LIBUSB QUIET hidapi-libusb)
|
||||||
|
pkg_check_modules(PC_HIDAPI_HIDRAW QUIET hidapi-hidraw)
|
||||||
|
# Restore
|
||||||
|
set(CMAKE_PREFIX_PATH "${_old_prefix_path}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Actually search
|
||||||
|
find_library(
|
||||||
|
HIDAPI_UNDECORATED_LIBRARY
|
||||||
|
NAMES hidapi
|
||||||
|
PATHS "${HIDAPI_ROOT_DIR}"
|
||||||
|
PATH_SUFFIXES lib)
|
||||||
|
|
||||||
|
find_library(
|
||||||
|
HIDAPI_LIBUSB_LIBRARY
|
||||||
|
NAMES hidapi hidapi-libusb
|
||||||
|
PATHS "${HIDAPI_ROOT_DIR}"
|
||||||
|
PATH_SUFFIXES lib
|
||||||
|
HINTS ${PC_HIDAPI_LIBUSB_LIBRARY_DIRS})
|
||||||
|
|
||||||
|
if(CMAKE_SYSTEM MATCHES "Linux")
|
||||||
|
find_library(
|
||||||
|
HIDAPI_HIDRAW_LIBRARY
|
||||||
|
NAMES hidapi-hidraw
|
||||||
|
HINTS ${PC_HIDAPI_HIDRAW_LIBRARY_DIRS})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_path(
|
||||||
|
HIDAPI_INCLUDE_DIR
|
||||||
|
NAMES hidapi.h
|
||||||
|
PATHS "${HIDAPI_ROOT_DIR}"
|
||||||
|
PATH_SUFFIXES hidapi include include/hidapi
|
||||||
|
HINTS ${PC_HIDAPI_HIDRAW_INCLUDE_DIRS} ${PC_HIDAPI_LIBUSB_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
find_package(Threads QUIET)
|
||||||
|
|
||||||
|
###
|
||||||
|
# Compute the "I don't care which backend" library
|
||||||
|
###
|
||||||
|
set(HIDAPI_LIBRARY)
|
||||||
|
|
||||||
|
# First, try to use a preferred backend if supplied
|
||||||
|
if("${HIDAPI_FIND_COMPONENTS}" MATCHES "libusb"
|
||||||
|
AND HIDAPI_LIBUSB_LIBRARY
|
||||||
|
AND NOT HIDAPI_LIBRARY)
|
||||||
|
set(HIDAPI_LIBRARY ${HIDAPI_LIBUSB_LIBRARY})
|
||||||
|
endif()
|
||||||
|
if("${HIDAPI_FIND_COMPONENTS}" MATCHES "hidraw"
|
||||||
|
AND HIDAPI_HIDRAW_LIBRARY
|
||||||
|
AND NOT HIDAPI_LIBRARY)
|
||||||
|
set(HIDAPI_LIBRARY ${HIDAPI_HIDRAW_LIBRARY})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Then, if we don't have a preferred one, settle for anything.
|
||||||
|
if(NOT HIDAPI_LIBRARY)
|
||||||
|
if(HIDAPI_LIBUSB_LIBRARY)
|
||||||
|
set(HIDAPI_LIBRARY ${HIDAPI_LIBUSB_LIBRARY})
|
||||||
|
elseif(HIDAPI_HIDRAW_LIBRARY)
|
||||||
|
set(HIDAPI_LIBRARY ${HIDAPI_HIDRAW_LIBRARY})
|
||||||
|
elseif(HIDAPI_UNDECORATED_LIBRARY)
|
||||||
|
set(HIDAPI_LIBRARY ${HIDAPI_UNDECORATED_LIBRARY})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
###
|
||||||
|
# Determine if the various requested components are found.
|
||||||
|
###
|
||||||
|
set(_hidapi_component_required_vars)
|
||||||
|
|
||||||
|
foreach(_comp IN LISTS HIDAPI_FIND_COMPONENTS)
|
||||||
|
if("${_comp}" STREQUAL "any")
|
||||||
|
list(APPEND _hidapi_component_required_vars HIDAPI_INCLUDE_DIR
|
||||||
|
HIDAPI_LIBRARY)
|
||||||
|
if(HIDAPI_INCLUDE_DIR AND EXISTS "${HIDAPI_LIBRARY}")
|
||||||
|
set(HIDAPI_any_FOUND TRUE)
|
||||||
|
mark_as_advanced(HIDAPI_INCLUDE_DIR)
|
||||||
|
else()
|
||||||
|
set(HIDAPI_any_FOUND FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
elseif("${_comp}" STREQUAL "libusb")
|
||||||
|
list(APPEND _hidapi_component_required_vars HIDAPI_INCLUDE_DIR
|
||||||
|
HIDAPI_LIBUSB_LIBRARY)
|
||||||
|
if(HIDAPI_INCLUDE_DIR AND EXISTS "${HIDAPI_LIBUSB_LIBRARY}")
|
||||||
|
set(HIDAPI_libusb_FOUND TRUE)
|
||||||
|
mark_as_advanced(HIDAPI_INCLUDE_DIR HIDAPI_LIBUSB_LIBRARY)
|
||||||
|
else()
|
||||||
|
set(HIDAPI_libusb_FOUND FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
elseif("${_comp}" STREQUAL "hidraw")
|
||||||
|
list(APPEND _hidapi_component_required_vars HIDAPI_INCLUDE_DIR
|
||||||
|
HIDAPI_HIDRAW_LIBRARY)
|
||||||
|
if(HIDAPI_INCLUDE_DIR AND EXISTS "${HIDAPI_HIDRAW_LIBRARY}")
|
||||||
|
set(HIDAPI_hidraw_FOUND TRUE)
|
||||||
|
mark_as_advanced(HIDAPI_INCLUDE_DIR HIDAPI_HIDRAW_LIBRARY)
|
||||||
|
else()
|
||||||
|
set(HIDAPI_hidraw_FOUND FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
else()
|
||||||
|
message(WARNING "${_comp} is not a recognized HIDAPI component")
|
||||||
|
set(HIDAPI_${_comp}_FOUND FALSE)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
unset(_comp)
|
||||||
|
|
||||||
|
###
|
||||||
|
# FPHSA call
|
||||||
|
###
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(
|
||||||
|
HIDAPI REQUIRED_VARS ${_hidapi_component_required_vars} THREADS_FOUND
|
||||||
|
HANDLE_COMPONENTS)
|
||||||
|
|
||||||
|
if(HIDAPI_FOUND)
|
||||||
|
set(HIDAPI_LIBRARIES "${HIDAPI_LIBRARY}")
|
||||||
|
set(HIDAPI_INCLUDE_DIRS "${HIDAPI_INCLUDE_DIR}")
|
||||||
|
if(NOT TARGET HIDAPI::hidapi)
|
||||||
|
add_library(HIDAPI::hidapi UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(
|
||||||
|
HIDAPI::hidapi
|
||||||
|
PROPERTIES
|
||||||
|
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
|
||||||
|
IMPORTED_LOCATION ${HIDAPI_LIBRARY})
|
||||||
|
set_property(
|
||||||
|
TARGET HIDAPI::hidapi PROPERTY IMPORTED_LINK_INTERFACE_LIBRARIES
|
||||||
|
Threads::Threads)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(HIDAPI_libusb_FOUND AND NOT TARGET HIDAPI::hidapi-libusb)
|
||||||
|
add_library(HIDAPI::hidapi-libusb UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(
|
||||||
|
HIDAPI::hidapi-libusb
|
||||||
|
PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" IMPORTED_LOCATION
|
||||||
|
${HIDAPI_LIBUSB_LIBRARY})
|
||||||
|
set_property(TARGET HIDAPI::hidapi-libusb
|
||||||
|
PROPERTY IMPORTED_LINK_INTERFACE_LIBRARIES Threads::Threads)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(HIDAPI_hidraw_FOUND AND NOT TARGET HIDAPI::hidapi-hidraw)
|
||||||
|
add_library(HIDAPI::hidapi-hidraw UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(
|
||||||
|
HIDAPI::hidapi-hidraw
|
||||||
|
PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" IMPORTED_LOCATION
|
||||||
|
${HIDAPI_HIDRAW_LIBRARY})
|
||||||
|
set_property(TARGET HIDAPI::hidapi-hidraw
|
||||||
|
PROPERTY IMPORTED_LINK_INTERFACE_LIBRARIES Threads::Threads)
|
||||||
|
endif()
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
# - Find ORB_SLAM2 OR ORB_SLAM3
|
||||||
|
#
|
||||||
|
# It sets the following variables:
|
||||||
|
# ORB_SLAM_FOUND - Set to false, or undefined, if ORB_SLAM isn't found.
|
||||||
|
# ORB_SLAM_INCLUDE_DIRS - The ORB_SLAM include directory.
|
||||||
|
# ORB_SLAM_LIBRARIES - The ORB_SLAM library to link against.
|
||||||
|
# ORB_SLAM_VERSION - The ORB_SLAM major version.
|
||||||
|
#
|
||||||
|
# Set ORB_SLAM_ROOT_DIR environment variable as the path to ORB_SLAM2 or ORB_SLAM3 root folder.
|
||||||
|
|
||||||
|
find_path(ORB_SLAM_INCLUDE_DIR NAMES System.h PATHS $ENV{ORB_SLAM_ROOT_DIR}/include)
|
||||||
|
find_library(ORB_SLAM2_LIBRARY NAMES ORB_SLAM2 PATHS $ENV{ORB_SLAM_ROOT_DIR}/lib)
|
||||||
|
find_library(ORB_SLAM3_LIBRARY NAMES ORB_SLAM3 PATHS $ENV{ORB_SLAM_ROOT_DIR}/lib)
|
||||||
|
find_path(g2o_INCLUDE_DIR NAMES g2o/core/sparse_optimizer.h PATHS $ENV{ORB_SLAM_ROOT_DIR}/Thirdparty/g2o NO_DEFAULT_PATH)
|
||||||
|
find_library(g2o_LIBRARY NAMES g2o PATHS $ENV{ORB_SLAM_ROOT_DIR}/Thirdparty/g2o/lib NO_DEFAULT_PATH)
|
||||||
|
find_library(DBoW2_LIBRARY NAMES DBoW2 PATHS $ENV{ORB_SLAM_ROOT_DIR}/Thirdparty/DBoW2/lib NO_DEFAULT_PATH)
|
||||||
|
|
||||||
|
IF(ORB_SLAM2_LIBRARY)
|
||||||
|
SET(ORB_SLAM_VERSION 2)
|
||||||
|
SET(ORB_SLAM_LIBRARY ${ORB_SLAM2_LIBRARY})
|
||||||
|
ELSEIF(ORB_SLAM3_LIBRARY)
|
||||||
|
SET(ORB_SLAM_VERSION 3)
|
||||||
|
SET(ORB_SLAM_LIBRARY ${ORB_SLAM3_LIBRARY})
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF (ORB_SLAM_INCLUDE_DIR AND ORB_SLAM_LIBRARY AND DBoW2_LIBRARY AND g2o_INCLUDE_DIR AND g2o_LIBRARY)
|
||||||
|
SET(ORB_SLAM_FOUND TRUE)
|
||||||
|
SET(ORB_SLAM_INCLUDE_DIRS ${ORB_SLAM_INCLUDE_DIR} ${ORB_SLAM_INCLUDE_DIR}/CameraModels ${g2o_INCLUDE_DIR} $ENV{ORB_SLAM_ROOT_DIR})
|
||||||
|
SET(ORB_SLAM_LIBRARIES ${g2o_LIBRARY} ${ORB_SLAM_LIBRARY} ${DBoW2_LIBRARY})
|
||||||
|
ENDIF (ORB_SLAM_INCLUDE_DIR AND ORB_SLAM_LIBRARY AND DBoW2_LIBRARY AND g2o_INCLUDE_DIR AND g2o_LIBRARY)
|
||||||
|
|
||||||
|
FIND_PACKAGE(Pangolin QUIET)
|
||||||
|
IF(NOT Pangolin_FOUND)
|
||||||
|
SET(ORB_SLAM_FOUND FALSE)
|
||||||
|
MESSAGE(STATUS "Found ORB_SLAM but not Pangolin, disabling ORB_SLAM.")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS "Found Pangolin: ${Pangolin_INCLUDE_DIRS}")
|
||||||
|
SET(ORB_SLAM_INCLUDE_DIRS ${ORB_SLAM_INCLUDE_DIRS} ${Pangolin_INCLUDE_DIRS})
|
||||||
|
SET(ORB_SLAM_LIBRARIES ${ORB_SLAM_LIBRARIES} ${Pangolin_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF (ORB_SLAM_FOUND)
|
||||||
|
# show which ORB_SLAM was found only if not quiet
|
||||||
|
IF (NOT ORB_SLAM_FIND_QUIETLY)
|
||||||
|
MESSAGE(STATUS "Found ORB_SLAM${ORB_SLAM_VERSION}: ${ORB_SLAM_LIBRARIES}")
|
||||||
|
ENDIF (NOT ORB_SLAM_FIND_QUIETLY)
|
||||||
|
ELSE (ORB_SLAM_FOUND)
|
||||||
|
# fatal error if ORB_SLAM is required but not found
|
||||||
|
IF (ORB_SLAM_FIND_REQUIRED)
|
||||||
|
MESSAGE(FATAL_ERROR "Could not find ORB_SLAM")
|
||||||
|
ENDIF (ORB_SLAM_FIND_REQUIRED)
|
||||||
|
ENDIF (ORB_SLAM_FOUND)
|
||||||
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
# - Find ORB_SLAM2
|
|
||||||
#
|
|
||||||
# It sets the following variables:
|
|
||||||
# ORB_SLAM2_FOUND - Set to false, or undefined, if ORB_SLAM2 isn't found.
|
|
||||||
# ORB_SLAM2_INCLUDE_DIRS - The ORB_SLAM2 include directory.
|
|
||||||
# ORB_SLAM2_LIBRARIES - The ORB_SLAM2 library to link against.
|
|
||||||
#
|
|
||||||
# Set ORB_SLAM2_ROOT_DIR environment variable as the path to ORB_SLAM2 root folder.
|
|
||||||
|
|
||||||
find_path(ORB_SLAM2_INCLUDE_DIR NAMES System.h PATHS $ENV{ORB_SLAM2_ROOT_DIR}/include)
|
|
||||||
find_library(ORB_SLAM2_LIBRARY NAMES ORB_SLAM2 PATHS $ENV{ORB_SLAM2_ROOT_DIR}/lib)
|
|
||||||
find_path(g2o_INCLUDE_DIR NAMES g2o/core/sparse_optimizer.h PATHS $ENV{ORB_SLAM2_ROOT_DIR}/Thirdparty/g2o NO_DEFAULT_PATH)
|
|
||||||
find_library(g2o_LIBRARY NAMES g2o PATHS $ENV{ORB_SLAM2_ROOT_DIR}/Thirdparty/g2o/lib NO_DEFAULT_PATH)
|
|
||||||
find_library(DBoW2_LIBRARY NAMES DBoW2 PATHS $ENV{ORB_SLAM2_ROOT_DIR}/Thirdparty/DBoW2/lib NO_DEFAULT_PATH)
|
|
||||||
|
|
||||||
IF (ORB_SLAM2_INCLUDE_DIR AND ORB_SLAM2_LIBRARY AND DBoW2_LIBRARY AND g2o_INCLUDE_DIR AND g2o_LIBRARY)
|
|
||||||
SET(ORB_SLAM2_FOUND TRUE)
|
|
||||||
SET(ORB_SLAM2_INCLUDE_DIRS ${ORB_SLAM2_INCLUDE_DIR} ${g2o_INCLUDE_DIR} $ENV{ORB_SLAM2_ROOT_DIR})
|
|
||||||
SET(ORB_SLAM2_LIBRARIES ${g2o_LIBRARY} ${ORB_SLAM2_LIBRARY} ${DBoW2_LIBRARY})
|
|
||||||
ENDIF (ORB_SLAM2_INCLUDE_DIR AND ORB_SLAM2_LIBRARY AND DBoW2_LIBRARY AND g2o_INCLUDE_DIR AND g2o_LIBRARY)
|
|
||||||
|
|
||||||
IF (ORB_SLAM2_FOUND)
|
|
||||||
# show which ORB_SLAM2 was found only if not quiet
|
|
||||||
IF (NOT ORB_SLAM2_FIND_QUIETLY)
|
|
||||||
MESSAGE(STATUS "Found ORB_SLAM2: ${ORB_SLAM2_LIBRARIES}")
|
|
||||||
ENDIF (NOT ORB_SLAM2_FIND_QUIETLY)
|
|
||||||
ELSE (ORB_SLAM2_FOUND)
|
|
||||||
# fatal error if ORB_SLAM2 is required but not found
|
|
||||||
IF (ORB_SLAM2_FIND_REQUIRED)
|
|
||||||
MESSAGE(FATAL_ERROR "Could not find ORB_SLAM2")
|
|
||||||
ENDIF (ORB_SLAM2_FIND_REQUIRED)
|
|
||||||
ENDIF (ORB_SLAM2_FOUND)
|
|
||||||
|
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
# - Find ZED Open Capture
|
||||||
|
# This module finds zed open capture library
|
||||||
|
#
|
||||||
|
# It sets the following variables:
|
||||||
|
# ZEDOC_FOUND - Set to false, or undefined, if ZEDOC isn't found.
|
||||||
|
# ZEDOC_INCLUDE_DIRS - The ZEDOC include directory.
|
||||||
|
# ZEDOC_LIBRARIES - The ZEDOC library to link against.
|
||||||
|
|
||||||
|
find_library(ZEDOC_LIBRARY NAMES zed_open_capture PATHS $ENV{ZEDOC_ROOT_DIR}/lib)
|
||||||
|
find_path(ZEDOC_INCLUDE_DIR NAMES zed-open-capture/videocapture.hpp PATHS $ENV{ZEDOC_ROOT_DIR}/include)
|
||||||
|
|
||||||
|
IF (ZEDOC_INCLUDE_DIR AND ZEDOC_LIBRARY)
|
||||||
|
SET(ZEDOC_FOUND TRUE)
|
||||||
|
SET(ZEDOC_INCLUDE_DIRS ${ZEDOC_INCLUDE_DIR})
|
||||||
|
SET(ZEDOC_LIBRARIES ${ZEDOC_LIBRARY})
|
||||||
|
ENDIF (ZEDOC_INCLUDE_DIR AND ZEDOC_LIBRARY)
|
||||||
|
|
||||||
|
IF (ZEDOC_FOUND)
|
||||||
|
# show which ZEDOC was found only if not quiet
|
||||||
|
IF (NOT _FIND_QUIETLY)
|
||||||
|
MESSAGE(STATUS "Found ZEDOC: ${ZEDOC_LIBRARIES}")
|
||||||
|
ENDIF (NOT ZEDOC_FIND_QUIETLY)
|
||||||
|
ELSE (ZEDOC_FOUND)
|
||||||
|
# fatal error if ZEDOC is required but not found
|
||||||
|
IF (ZEDOC_FIND_REQUIRED)
|
||||||
|
MESSAGE(FATAL_ERROR "Could not find ZEDOC (Zed Open Capture)")
|
||||||
|
ENDIF (ZEDOC_FIND_REQUIRED)
|
||||||
|
ENDIF (ZEDOC_FOUND)
|
||||||
@@ -61,6 +61,8 @@ public:
|
|||||||
|
|
||||||
cv::Mat generatePrediction(const Memory * memory, const std::vector<int> & ids);
|
cv::Mat generatePrediction(const Memory * memory, const std::vector<int> & ids);
|
||||||
|
|
||||||
|
unsigned long getMemoryUsed() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
cv::Mat updatePrediction(const cv::Mat & oldPrediction,
|
cv::Mat updatePrediction(const cv::Mat & oldPrediction,
|
||||||
const Memory * memory,
|
const Memory * memory,
|
||||||
|
|||||||
@@ -158,5 +158,7 @@ private:
|
|||||||
Transform localTransform_;
|
Transform localTransform_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
RTABMAP_EXP std::ostream& operator<<(std::ostream& os, const CameraModel& model);
|
||||||
|
|
||||||
} /* namespace rtabmap */
|
} /* namespace rtabmap */
|
||||||
#endif /* CAMERAMODEL_H_ */
|
#endif /* CAMERAMODEL_H_ */
|
||||||
|
|||||||
@@ -32,5 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <rtabmap/core/camera/CameraStereoImages.h>
|
#include <rtabmap/core/camera/CameraStereoImages.h>
|
||||||
#include <rtabmap/core/camera/CameraStereoVideo.h>
|
#include <rtabmap/core/camera/CameraStereoVideo.h>
|
||||||
#include <rtabmap/core/camera/CameraStereoZed.h>
|
#include <rtabmap/core/camera/CameraStereoZed.h>
|
||||||
|
#include <rtabmap/core/camera/CameraStereoZedOC.h>
|
||||||
#include <rtabmap/core/camera/CameraStereoTara.h>
|
#include <rtabmap/core/camera/CameraStereoTara.h>
|
||||||
#include <rtabmap/core/camera/CameraMyntEye.h>
|
#include <rtabmap/core/camera/CameraMyntEye.h>
|
||||||
|
#include <rtabmap/core/camera/CameraDepthAI.h>
|
||||||
|
|||||||
@@ -69,9 +69,18 @@ public:
|
|||||||
void setDistortionModel(const std::string & path);
|
void setDistortionModel(const std::string & path);
|
||||||
void enableBilateralFiltering(float sigmaS, float sigmaR);
|
void enableBilateralFiltering(float sigmaS, float sigmaR);
|
||||||
void disableBilateralFiltering() {_bilateralFiltering = false;}
|
void disableBilateralFiltering() {_bilateralFiltering = false;}
|
||||||
void enableIMUFiltering(int filteringStrategy=1, const ParametersMap & parameters = ParametersMap());
|
void enableIMUFiltering(int filteringStrategy=1, const ParametersMap & parameters = ParametersMap(), bool baseFrameConversion = false);
|
||||||
void disableIMUFiltering();
|
void disableIMUFiltering();
|
||||||
|
|
||||||
|
RTABMAP_DEPRECATED(void setScanParameters(
|
||||||
|
bool fromDepth,
|
||||||
|
int downsampleStep, // decimation of the depth image in case the scan is from depth image
|
||||||
|
float rangeMin,
|
||||||
|
float rangeMax,
|
||||||
|
float voxelSize,
|
||||||
|
int normalsK,
|
||||||
|
int normalsRadius,
|
||||||
|
bool forceGroundNormalsUp) , "Use new version of this function with groundNormalsUp=0.8 for forceGroundNormalsUp=True and groundNormalsUp=0.0 for forceGroundNormalsUp=False.");
|
||||||
void setScanParameters(
|
void setScanParameters(
|
||||||
bool fromDepth,
|
bool fromDepth,
|
||||||
int downsampleStep=1, // decimation of the depth image in case the scan is from depth image
|
int downsampleStep=1, // decimation of the depth image in case the scan is from depth image
|
||||||
@@ -80,17 +89,7 @@ public:
|
|||||||
float voxelSize = 0.0f,
|
float voxelSize = 0.0f,
|
||||||
int normalsK = 0,
|
int normalsK = 0,
|
||||||
int normalsRadius = 0.0f,
|
int normalsRadius = 0.0f,
|
||||||
bool forceGroundNormalsUp = false)
|
float groundNormalsUp = 0.0f);
|
||||||
{
|
|
||||||
_scanFromDepth = fromDepth;
|
|
||||||
_scanDownsampleStep=downsampleStep;
|
|
||||||
_scanRangeMin = rangeMin;
|
|
||||||
_scanRangeMax = rangeMax;
|
|
||||||
_scanVoxelSize = voxelSize;
|
|
||||||
_scanNormalsK = normalsK;
|
|
||||||
_scanNormalsRadius = normalsRadius;
|
|
||||||
_scanForceGroundNormalsUp = forceGroundNormalsUp;
|
|
||||||
}
|
|
||||||
|
|
||||||
void postUpdate(SensorData * data, CameraInfo * info = 0) const;
|
void postUpdate(SensorData * data, CameraInfo * info = 0) const;
|
||||||
|
|
||||||
@@ -119,13 +118,14 @@ private:
|
|||||||
float _scanVoxelSize;
|
float _scanVoxelSize;
|
||||||
int _scanNormalsK;
|
int _scanNormalsK;
|
||||||
float _scanNormalsRadius;
|
float _scanNormalsRadius;
|
||||||
bool _scanForceGroundNormalsUp;
|
float _scanForceGroundNormalsUp;
|
||||||
StereoDense * _stereoDense;
|
StereoDense * _stereoDense;
|
||||||
clams::DiscreteDepthDistortionModel * _distortionModel;
|
clams::DiscreteDepthDistortionModel * _distortionModel;
|
||||||
bool _bilateralFiltering;
|
bool _bilateralFiltering;
|
||||||
float _bilateralSigmaS;
|
float _bilateralSigmaS;
|
||||||
float _bilateralSigmaR;
|
float _bilateralSigmaR;
|
||||||
IMUFilter * _imuFilter;
|
IMUFilter * _imuFilter;
|
||||||
|
bool _imuBaseFrameConversion;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ public:
|
|||||||
virtual void parseParameters(const ParametersMap & parameters);
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
virtual bool isInMemory() const {return _url.empty();}
|
virtual bool isInMemory() const {return _url.empty();}
|
||||||
const std::string & getUrl() const {return _url;}
|
const std::string & getUrl() const {return _url;}
|
||||||
|
const std::string & getTargetVersion() const {return _targetVersion;}
|
||||||
|
|
||||||
void beginTransaction() const;
|
void beginTransaction() const;
|
||||||
void commit() const;
|
void commit() const;
|
||||||
@@ -109,7 +110,7 @@ public:
|
|||||||
cv::Mat load2DMap(float & xMin, float & yMin, float & cellSize) const;
|
cv::Mat load2DMap(float & xMin, float & yMin, float & cellSize) const;
|
||||||
void saveOptimizedMesh(
|
void saveOptimizedMesh(
|
||||||
const cv::Mat & cloud,
|
const cv::Mat & cloud,
|
||||||
const std::vector<std::vector<std::vector<unsigned int> > > & polygons = std::vector<std::vector<std::vector<unsigned int> > >(), // Textures -> polygons -> vertices
|
const std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > & polygons = std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > >(), // Textures -> polygons -> vertices
|
||||||
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords = std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > >(), // Textures -> uv coords for each vertex of the polygons
|
const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords = std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > >(), // Textures -> uv coords for each vertex of the polygons
|
||||||
#else
|
#else
|
||||||
@@ -117,7 +118,7 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
const cv::Mat & textures = cv::Mat()) const; // concatenated textures (assuming square textures with all same size);
|
const cv::Mat & textures = cv::Mat()) const; // concatenated textures (assuming square textures with all same size);
|
||||||
cv::Mat loadOptimizedMesh(
|
cv::Mat loadOptimizedMesh(
|
||||||
std::vector<std::vector<std::vector<unsigned int> > > * polygons = 0,
|
std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > * polygons = 0,
|
||||||
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords = 0,
|
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords = 0,
|
||||||
#else
|
#else
|
||||||
@@ -131,7 +132,7 @@ public:
|
|||||||
bool openConnection(const std::string & url, bool overwritten = false);
|
bool openConnection(const std::string & url, bool overwritten = false);
|
||||||
void closeConnection(bool save = true, const std::string & outputUrl = "");
|
void closeConnection(bool save = true, const std::string & outputUrl = "");
|
||||||
bool isConnected() const;
|
bool isConnected() const;
|
||||||
long getMemoryUsed() const; // In bytes
|
unsigned long getMemoryUsed() const; // In bytes
|
||||||
std::string getDatabaseVersion() const;
|
std::string getDatabaseVersion() const;
|
||||||
long getNodesMemoryUsed() const;
|
long getNodesMemoryUsed() const;
|
||||||
long getLinksMemoryUsed() const;
|
long getLinksMemoryUsed() const;
|
||||||
@@ -188,7 +189,7 @@ protected:
|
|||||||
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false) = 0;
|
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false) = 0;
|
||||||
virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "") = 0;
|
virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "") = 0;
|
||||||
virtual bool isConnectedQuery() const = 0;
|
virtual bool isConnectedQuery() const = 0;
|
||||||
virtual long getMemoryUsedQuery() const = 0; // In bytes
|
virtual unsigned long getMemoryUsedQuery() const = 0; // In bytes
|
||||||
virtual bool getDatabaseVersionQuery(std::string & version) const = 0;
|
virtual bool getDatabaseVersionQuery(std::string & version) const = 0;
|
||||||
virtual long getNodesMemoryUsedQuery() const = 0;
|
virtual long getNodesMemoryUsedQuery() const = 0;
|
||||||
virtual long getLinksMemoryUsedQuery() const = 0;
|
virtual long getLinksMemoryUsedQuery() const = 0;
|
||||||
@@ -247,7 +248,7 @@ protected:
|
|||||||
virtual cv::Mat load2DMapQuery(float & xMin, float & yMin, float & cellSize) const = 0;
|
virtual cv::Mat load2DMapQuery(float & xMin, float & yMin, float & cellSize) const = 0;
|
||||||
virtual void saveOptimizedMeshQuery(
|
virtual void saveOptimizedMeshQuery(
|
||||||
const cv::Mat & cloud,
|
const cv::Mat & cloud,
|
||||||
const std::vector<std::vector<std::vector<unsigned int> > > & polygons,
|
const std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > & polygons,
|
||||||
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords,
|
const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords,
|
||||||
#else
|
#else
|
||||||
@@ -255,7 +256,7 @@ protected:
|
|||||||
#endif
|
#endif
|
||||||
const cv::Mat & textures) const = 0;
|
const cv::Mat & textures) const = 0;
|
||||||
virtual cv::Mat loadOptimizedMeshQuery(
|
virtual cv::Mat loadOptimizedMeshQuery(
|
||||||
std::vector<std::vector<std::vector<unsigned int> > > * polygons,
|
std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > * polygons,
|
||||||
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords,
|
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords,
|
||||||
#else
|
#else
|
||||||
@@ -300,6 +301,7 @@ private:
|
|||||||
USemaphore _addSem;
|
USemaphore _addSem;
|
||||||
double _emptyTrashesTime;
|
double _emptyTrashesTime;
|
||||||
std::string _url;
|
std::string _url;
|
||||||
|
std::string _targetVersion;
|
||||||
bool _timestampUpdate;
|
bool _timestampUpdate;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ protected:
|
|||||||
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false);
|
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false);
|
||||||
virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "");
|
virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "");
|
||||||
virtual bool isConnectedQuery() const;
|
virtual bool isConnectedQuery() const;
|
||||||
virtual long getMemoryUsedQuery() const; // In bytes
|
virtual unsigned long getMemoryUsedQuery() const; // In bytes
|
||||||
virtual bool getDatabaseVersionQuery(std::string & version) const;
|
virtual bool getDatabaseVersionQuery(std::string & version) const;
|
||||||
virtual long getNodesMemoryUsedQuery() const;
|
virtual long getNodesMemoryUsedQuery() const;
|
||||||
virtual long getLinksMemoryUsedQuery() const;
|
virtual long getLinksMemoryUsedQuery() const;
|
||||||
@@ -113,7 +113,7 @@ protected:
|
|||||||
virtual cv::Mat load2DMapQuery(float & xMin, float & yMin, float & cellSize) const;
|
virtual cv::Mat load2DMapQuery(float & xMin, float & yMin, float & cellSize) const;
|
||||||
virtual void saveOptimizedMeshQuery(
|
virtual void saveOptimizedMeshQuery(
|
||||||
const cv::Mat & cloud,
|
const cv::Mat & cloud,
|
||||||
const std::vector<std::vector<std::vector<unsigned int> > > & polygons,
|
const std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > & polygons,
|
||||||
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords,
|
const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords,
|
||||||
#else
|
#else
|
||||||
@@ -121,7 +121,7 @@ protected:
|
|||||||
#endif
|
#endif
|
||||||
const cv::Mat & textures) const;
|
const cv::Mat & textures) const;
|
||||||
virtual cv::Mat loadOptimizedMeshQuery(
|
virtual cv::Mat loadOptimizedMeshQuery(
|
||||||
std::vector<std::vector<std::vector<unsigned int> > > * polygons,
|
std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > * polygons,
|
||||||
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords,
|
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords,
|
||||||
#else
|
#else
|
||||||
@@ -189,7 +189,7 @@ protected:
|
|||||||
std::string _version;
|
std::string _version;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
long _memoryUsedEstimate;
|
unsigned long _memoryUsedEstimate;
|
||||||
bool _dbInMemory;
|
bool _dbInMemory;
|
||||||
unsigned int _cacheSize;
|
unsigned int _cacheSize;
|
||||||
int _journalMode;
|
int _journalMode;
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
||||||
#include "rtabmap/core/Parameters.h"
|
#include "rtabmap/core/Parameters.h"
|
||||||
|
#include "rtabmap/utilite/UStl.h"
|
||||||
#include <opencv2/core/core.hpp>
|
#include <opencv2/core/core.hpp>
|
||||||
#include <opencv2/features2d/features2d.hpp>
|
#include <opencv2/features2d/features2d.hpp>
|
||||||
#include <pcl/point_cloud.h>
|
#include <pcl/point_cloud.h>
|
||||||
@@ -91,41 +92,133 @@ public:
|
|||||||
* if a=[1 2 3 4 6], b=[1 2 4 5 6], results= [(1,1) (2,2) (4,4) (6,6)]
|
* if a=[1 2 3 4 6], b=[1 2 4 5 6], results= [(1,1) (2,2) (4,4) (6,6)]
|
||||||
* realPairsCount = 4
|
* realPairsCount = 4
|
||||||
*/
|
*/
|
||||||
|
template<typename T>
|
||||||
static int findPairs(
|
static int findPairs(
|
||||||
const std::map<int, cv::KeyPoint> & wordsA,
|
const std::map<int, T> & wordsA,
|
||||||
const std::map<int, cv::KeyPoint> & wordsB,
|
const std::map<int, T> & wordsB,
|
||||||
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs,
|
std::list<std::pair<int, std::pair<T, T> > > & pairs,
|
||||||
bool ignoreNegativeIds = true);
|
bool ignoreNegativeIds = true)
|
||||||
|
{
|
||||||
|
int realPairsCount = 0;
|
||||||
|
pairs.clear();
|
||||||
|
for(typename std::map<int, T>::const_iterator i=wordsA.begin(); i!=wordsA.end(); ++i)
|
||||||
|
{
|
||||||
|
if(!ignoreNegativeIds || (ignoreNegativeIds && i->first>=0))
|
||||||
|
{
|
||||||
|
std::map<int, cv::KeyPoint>::const_iterator ptB = wordsB.find(i->first);
|
||||||
|
if(ptB != wordsB.end())
|
||||||
|
{
|
||||||
|
pairs.push_back(std::pair<int, std::pair<T, T> >(i->first, std::make_pair(i->second, ptB->second)));
|
||||||
|
++realPairsCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return realPairsCount;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* if a=[1 2 3 4 6 6], b=[1 1 2 4 5 6 6], results= [(1,1a) (2,2) (4,4) (6a,6a) (6b,6b)]
|
* if a=[1 2 3 4 6 6], b=[1 1 2 4 5 6 6], results= [(1,1a) (2,2) (4,4) (6a,6a) (6b,6b)]
|
||||||
* realPairsCount = 5
|
* realPairsCount = 5
|
||||||
*/
|
*/
|
||||||
|
template<typename T>
|
||||||
static int findPairs(
|
static int findPairs(
|
||||||
const std::multimap<int, cv::KeyPoint> & wordsA,
|
const std::multimap<int, T> & wordsA,
|
||||||
const std::multimap<int, cv::KeyPoint> & wordsB,
|
const std::multimap<int, T> & wordsB,
|
||||||
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs,
|
std::list<std::pair<int, std::pair<T, T> > > & pairs,
|
||||||
bool ignoreNegativeIds = true);
|
bool ignoreNegativeIds = true)
|
||||||
|
{
|
||||||
|
const std::list<int> & ids = uUniqueKeys(wordsA);
|
||||||
|
typename std::multimap<int, T>::const_iterator iterA;
|
||||||
|
typename std::multimap<int, T>::const_iterator iterB;
|
||||||
|
pairs.clear();
|
||||||
|
int realPairsCount = 0;
|
||||||
|
for(std::list<int>::const_iterator i=ids.begin(); i!=ids.end(); ++i)
|
||||||
|
{
|
||||||
|
if(!ignoreNegativeIds || (ignoreNegativeIds && *i >= 0))
|
||||||
|
{
|
||||||
|
iterA = wordsA.find(*i);
|
||||||
|
iterB = wordsB.find(*i);
|
||||||
|
while(iterA != wordsA.end() && iterB != wordsB.end() && (*iterA).first == (*iterB).first && (*iterA).first == *i)
|
||||||
|
{
|
||||||
|
pairs.push_back(std::pair<int, std::pair<T, T> >(*i, std::make_pair((*iterA).second, (*iterB).second)));
|
||||||
|
++iterA;
|
||||||
|
++iterB;
|
||||||
|
++realPairsCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return realPairsCount;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* if a=[1 2 3 4 6 6], b=[1 1 2 4 5 6 6], results= [(2,2) (4,4)]
|
* if a=[1 2 3 4 6 6], b=[1 1 2 4 5 6 6], results= [(2,2) (4,4)]
|
||||||
* realPairsCount = 5
|
* realPairsCount = 5
|
||||||
*/
|
*/
|
||||||
|
template<typename T>
|
||||||
static int findPairsUnique(
|
static int findPairsUnique(
|
||||||
const std::multimap<int, cv::KeyPoint> & wordsA,
|
const std::multimap<int, T> & wordsA,
|
||||||
const std::multimap<int, cv::KeyPoint> & wordsB,
|
const std::multimap<int, T> & wordsB,
|
||||||
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs,
|
std::list<std::pair<int, std::pair<T, T> > > & pairs,
|
||||||
bool ignoreNegativeIds = true);
|
bool ignoreNegativeIds = true)
|
||||||
|
{
|
||||||
|
const std::list<int> & ids = uUniqueKeys(wordsA);
|
||||||
|
int realPairsCount = 0;
|
||||||
|
pairs.clear();
|
||||||
|
for(std::list<int>::const_iterator i=ids.begin(); i!=ids.end(); ++i)
|
||||||
|
{
|
||||||
|
if(!ignoreNegativeIds || (ignoreNegativeIds && *i>=0))
|
||||||
|
{
|
||||||
|
std::list<T> ptsA = uValues(wordsA, *i);
|
||||||
|
std::list<T> ptsB = uValues(wordsB, *i);
|
||||||
|
if(ptsA.size() == 1 && ptsB.size() == 1)
|
||||||
|
{
|
||||||
|
pairs.push_back(std::pair<int, std::pair<T, T> >(*i, std::pair<T, T>(ptsA.front(), ptsB.front())));
|
||||||
|
++realPairsCount;
|
||||||
|
}
|
||||||
|
else if(ptsA.size()>1 && ptsB.size()>1)
|
||||||
|
{
|
||||||
|
// just update the count
|
||||||
|
realPairsCount += ptsA.size() > ptsB.size() ? ptsB.size() : ptsA.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return realPairsCount;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* if a=[1 2 3 4 6 6], b=[1 1 2 4 5 6 6], results= [(1,1a) (1,1b) (2,2) (4,4) (6a,6a) (6a,6b) (6b,6a) (6b,6b)]
|
* if a=[1 2 3 4 6 6], b=[1 1 2 4 5 6 6], results= [(1,1a) (1,1b) (2,2) (4,4) (6a,6a) (6a,6b) (6b,6a) (6b,6b)]
|
||||||
* realPairsCount = 5
|
* realPairsCount = 5
|
||||||
*/
|
*/
|
||||||
|
template<typename T>
|
||||||
static int findPairsAll(
|
static int findPairsAll(
|
||||||
const std::multimap<int, cv::KeyPoint> & wordsA,
|
const std::multimap<int, T> & wordsA,
|
||||||
const std::multimap<int, cv::KeyPoint> & wordsB,
|
const std::multimap<int, T> & wordsB,
|
||||||
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs,
|
std::list<std::pair<int, std::pair<T, T> > > & pairs,
|
||||||
bool ignoreNegativeIds = true);
|
bool ignoreNegativeIds = true)
|
||||||
|
{
|
||||||
|
const std::list<int> & ids = uUniqueKeys(wordsA);
|
||||||
|
pairs.clear();
|
||||||
|
int realPairsCount = 0;;
|
||||||
|
for(std::list<int>::const_iterator iter=ids.begin(); iter!=ids.end(); ++iter)
|
||||||
|
{
|
||||||
|
if(!ignoreNegativeIds || (ignoreNegativeIds && *iter>=0))
|
||||||
|
{
|
||||||
|
std::list<T> ptsA = uValues(wordsA, *iter);
|
||||||
|
std::list<T> ptsB = uValues(wordsB, *iter);
|
||||||
|
|
||||||
|
realPairsCount += ptsA.size() > ptsB.size() ? ptsB.size() : ptsA.size();
|
||||||
|
|
||||||
|
for(typename std::list<T>::iterator jter=ptsA.begin(); jter!=ptsA.end(); ++jter)
|
||||||
|
{
|
||||||
|
for(typename std::list<T>::iterator kter=ptsB.begin(); kter!=ptsB.end(); ++kter)
|
||||||
|
{
|
||||||
|
pairs.push_back(std::pair<int, std::pair<T, T> >(*iter, std::pair<T, T>(*jter, *kter)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return realPairsCount;
|
||||||
|
}
|
||||||
|
|
||||||
static cv::Mat linearLSTriangulation(
|
static cv::Mat linearLSTriangulation(
|
||||||
cv::Point3d u, //homogenous image point (u,v,1)
|
cv::Point3d u, //homogenous image point (u,v,1)
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ typedef cv::gpu::FAST_GPU CV_FAST_GPU;
|
|||||||
namespace cv{
|
namespace cv{
|
||||||
namespace xfeatures2d {
|
namespace xfeatures2d {
|
||||||
class FREAK;
|
class FREAK;
|
||||||
|
class DAISY;
|
||||||
class BriefDescriptorExtractor;
|
class BriefDescriptorExtractor;
|
||||||
#if CV_MAJOR_VERSION < 3 || (CV_MAJOR_VERSION == 4 && CV_MINOR_VERSION <= 3) || (CV_MAJOR_VERSION == 3 && (CV_MINOR_VERSION < 4 || (CV_MINOR_VERSION==4 && CV_SUBMINOR_VERSION<11)))
|
#if CV_MAJOR_VERSION < 3 || (CV_MAJOR_VERSION == 4 && CV_MINOR_VERSION <= 3) || (CV_MAJOR_VERSION == 3 && (CV_MINOR_VERSION < 4 || (CV_MINOR_VERSION==4 && CV_SUBMINOR_VERSION<11)))
|
||||||
class SIFT;
|
class SIFT;
|
||||||
@@ -81,6 +82,7 @@ typedef cv::SIFT CV_SIFT; // SIFT is back in features2d since 4.4.0 / 3.4.11
|
|||||||
typedef cv::xfeatures2d::SURF CV_SURF;
|
typedef cv::xfeatures2d::SURF CV_SURF;
|
||||||
typedef cv::FastFeatureDetector CV_FAST;
|
typedef cv::FastFeatureDetector CV_FAST;
|
||||||
typedef cv::xfeatures2d::FREAK CV_FREAK;
|
typedef cv::xfeatures2d::FREAK CV_FREAK;
|
||||||
|
typedef cv::xfeatures2d::DAISY CV_DAISY;
|
||||||
typedef cv::GFTTDetector CV_GFTT;
|
typedef cv::GFTTDetector CV_GFTT;
|
||||||
typedef cv::xfeatures2d::BriefDescriptorExtractor CV_BRIEF;
|
typedef cv::xfeatures2d::BriefDescriptorExtractor CV_BRIEF;
|
||||||
typedef cv::BRISK CV_BRISK;
|
typedef cv::BRISK CV_BRISK;
|
||||||
@@ -115,7 +117,12 @@ public:
|
|||||||
kFeatureGfttOrb=8, //new 0.10.11
|
kFeatureGfttOrb=8, //new 0.10.11
|
||||||
kFeatureKaze=9, //new 0.13.2
|
kFeatureKaze=9, //new 0.13.2
|
||||||
kFeatureOrbOctree=10, //new 0.19.2
|
kFeatureOrbOctree=10, //new 0.19.2
|
||||||
kFeatureSuperPointTorch=11}; //new 0.19.7
|
kFeatureSuperPointTorch=11, //new 0.19.7
|
||||||
|
kFeatureSurfFreak=12, //new 0.20.4
|
||||||
|
kFeatureGfttDaisy=13, //new 0.20.6
|
||||||
|
kFeatureSurfDaisy=14, //new 0.20.6
|
||||||
|
kFeaturePyDetector=15}; //new 0.20.8
|
||||||
|
|
||||||
static std::string typeName(Type type)
|
static std::string typeName(Type type)
|
||||||
{
|
{
|
||||||
switch(type){
|
switch(type){
|
||||||
@@ -143,6 +150,12 @@ public:
|
|||||||
return "ORB-OCTREE";
|
return "ORB-OCTREE";
|
||||||
case kFeatureSuperPointTorch:
|
case kFeatureSuperPointTorch:
|
||||||
return "SUPERPOINT";
|
return "SUPERPOINT";
|
||||||
|
case kFeatureSurfFreak:
|
||||||
|
return "SURF+Freak";
|
||||||
|
case kFeatureGfttDaisy:
|
||||||
|
return "GFTT+Daisy";
|
||||||
|
case kFeatureSurfDaisy:
|
||||||
|
return "SURF+Daisy";
|
||||||
default:
|
default:
|
||||||
return "Unknown";
|
return "Unknown";
|
||||||
}
|
}
|
||||||
@@ -455,6 +468,28 @@ private:
|
|||||||
cv::Ptr<CV_FREAK> _freak;
|
cv::Ptr<CV_FREAK> _freak;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//SURF_FREAK
|
||||||
|
class RTABMAP_EXP SURF_FREAK : public SURF
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SURF_FREAK(const ParametersMap & parameters = ParametersMap());
|
||||||
|
virtual ~SURF_FREAK();
|
||||||
|
|
||||||
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
|
virtual Feature2D::Type getType() const {return kFeatureSurfFreak;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool orientationNormalized_;
|
||||||
|
bool scaleNormalized_;
|
||||||
|
float patternScale_;
|
||||||
|
int nOctaves_;
|
||||||
|
|
||||||
|
cv::Ptr<CV_FREAK> _freak;
|
||||||
|
};
|
||||||
|
|
||||||
//GFTT_ORB
|
//GFTT_ORB
|
||||||
class RTABMAP_EXP GFTT_ORB : public GFTT
|
class RTABMAP_EXP GFTT_ORB : public GFTT
|
||||||
{
|
{
|
||||||
@@ -538,6 +573,8 @@ private:
|
|||||||
private:
|
private:
|
||||||
float scaleFactor_;
|
float scaleFactor_;
|
||||||
int nLevels_;
|
int nLevels_;
|
||||||
|
int patchSize_;
|
||||||
|
int edgeThreshold_;
|
||||||
int fastThreshold_;
|
int fastThreshold_;
|
||||||
int fastMinThreshold_;
|
int fastMinThreshold_;
|
||||||
|
|
||||||
@@ -568,6 +605,54 @@ private:
|
|||||||
bool cuda_;
|
bool cuda_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//GFTT_DAISY
|
||||||
|
class RTABMAP_EXP GFTT_DAISY : public GFTT
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GFTT_DAISY(const ParametersMap & parameters = ParametersMap());
|
||||||
|
virtual ~GFTT_DAISY();
|
||||||
|
|
||||||
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
|
virtual Feature2D::Type getType() const {return kFeatureGfttDaisy;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool orientationNormalized_;
|
||||||
|
bool scaleNormalized_;
|
||||||
|
float patternScale_;
|
||||||
|
int nOctaves_;
|
||||||
|
|
||||||
|
#if CV_MAJOR_VERSION > 2
|
||||||
|
cv::Ptr<CV_DAISY> _daisy;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
//SURF_DAISY
|
||||||
|
class RTABMAP_EXP SURF_DAISY : public SURF
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SURF_DAISY(const ParametersMap & parameters = ParametersMap());
|
||||||
|
virtual ~SURF_DAISY();
|
||||||
|
|
||||||
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
|
virtual Feature2D::Type getType() const {return kFeatureSurfDaisy;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool orientationNormalized_;
|
||||||
|
bool scaleNormalized_;
|
||||||
|
float patternScale_;
|
||||||
|
int nOctaves_;
|
||||||
|
|
||||||
|
#if CV_MAJOR_VERSION > 2
|
||||||
|
cv::Ptr<CV_DAISY> _daisy;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* FEATURES2D_H_ */
|
#endif /* FEATURES2D_H_ */
|
||||||
|
|||||||
@@ -43,8 +43,8 @@ public:
|
|||||||
void release();
|
void release();
|
||||||
unsigned int indexedFeatures() const;
|
unsigned int indexedFeatures() const;
|
||||||
|
|
||||||
// return KB
|
// return Bytes
|
||||||
unsigned int memoryUsed() const;
|
unsigned long memoryUsed() const;
|
||||||
|
|
||||||
// Note that useDistanceL1 doesn't have any effect if LSH is used
|
// Note that useDistanceL1 doesn't have any effect if LSH is used
|
||||||
void buildLinearIndex(
|
void buildLinearIndex(
|
||||||
@@ -74,7 +74,7 @@ public:
|
|||||||
int featuresType() const {return featuresType_;}
|
int featuresType() const {return featuresType_;}
|
||||||
int featuresDim() const {return featuresDim_;}
|
int featuresDim() const {return featuresDim_;}
|
||||||
|
|
||||||
unsigned int addPoints(const cv::Mat & features);
|
std::vector<unsigned int> addPoints(const cv::Mat & features);
|
||||||
|
|
||||||
void removePoint(unsigned int index);
|
void removePoint(unsigned int index);
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <rtabmap/core/Parameters.h>
|
#include <rtabmap/core/Parameters.h>
|
||||||
#include <rtabmap/core/Link.h>
|
#include <rtabmap/core/Link.h>
|
||||||
#include <rtabmap/core/GPS.h>
|
#include <rtabmap/core/GPS.h>
|
||||||
|
#include <rtabmap/core/CameraModel.h>
|
||||||
|
|
||||||
namespace rtabmap {
|
namespace rtabmap {
|
||||||
class Memory;
|
class Memory;
|
||||||
@@ -55,10 +56,10 @@ namespace graph {
|
|||||||
|
|
||||||
bool RTABMAP_EXP importPoses(
|
bool RTABMAP_EXP importPoses(
|
||||||
const std::string & filePath,
|
const std::string & filePath,
|
||||||
int format, // 0=Raw, 1=RGBD-SLAM motion capture (10=without change of coordinate frame), 2=KITTI, 3=TORO, 4=g2o, 5=NewCollege(t,x,y), 6=Malaga Urban GPS, 7=St Lucia INS, 8=Karlsruhe
|
int format, // 0=Raw, 1=RGBD-SLAM motion capture (10=without change of coordinate frame), 2=KITTI, 3=TORO, 4=g2o, 5=NewCollege(t,x,y), 6=Malaga Urban GPS, 7=St Lucia INS, 8=Karlsruhe, 9=EuRoC MAV
|
||||||
std::map<int, Transform> & poses,
|
std::map<int, Transform> & poses,
|
||||||
std::multimap<int, Link> * constraints = 0, // optional for formats 3 and 4
|
std::multimap<int, Link> * constraints = 0, // optional for formats 3 and 4
|
||||||
std::map<int, double> * stamps = 0); // optional for format 1
|
std::map<int, double> * stamps = 0); // optional for format 1 and 9
|
||||||
|
|
||||||
bool RTABMAP_EXP exportGPS(
|
bool RTABMAP_EXP exportGPS(
|
||||||
const std::string & filePath,
|
const std::string & filePath,
|
||||||
@@ -155,12 +156,20 @@ std::list<Link> RTABMAP_EXP findLinks(
|
|||||||
|
|
||||||
std::multimap<int, Link> RTABMAP_EXP filterDuplicateLinks(
|
std::multimap<int, Link> RTABMAP_EXP filterDuplicateLinks(
|
||||||
const std::multimap<int, Link> & links);
|
const std::multimap<int, Link> & links);
|
||||||
|
/**
|
||||||
|
* Return links not of type "filteredType". If inverted=true, return links of of type "filteredType".
|
||||||
|
*/
|
||||||
std::multimap<int, Link> RTABMAP_EXP filterLinks(
|
std::multimap<int, Link> RTABMAP_EXP filterLinks(
|
||||||
const std::multimap<int, Link> & links,
|
const std::multimap<int, Link> & links,
|
||||||
Link::Type filteredType);
|
Link::Type filteredType,
|
||||||
|
bool inverted = false);
|
||||||
|
/**
|
||||||
|
* Return links not of type "filteredType". If inverted=true, return links of of type "filteredType".
|
||||||
|
*/
|
||||||
std::map<int, Link> RTABMAP_EXP filterLinks(
|
std::map<int, Link> RTABMAP_EXP filterLinks(
|
||||||
const std::map<int, Link> & links,
|
const std::map<int, Link> & links,
|
||||||
Link::Type filteredType);
|
Link::Type filteredType,
|
||||||
|
bool inverted = false);
|
||||||
|
|
||||||
//Note: This assumes a coordinate system where X is forward, * Y is up, and Z is right.
|
//Note: This assumes a coordinate system where X is forward, * Y is up, and Z is right.
|
||||||
std::map<int, Transform> RTABMAP_EXP frustumPosesFiltering(
|
std::map<int, Transform> RTABMAP_EXP frustumPosesFiltering(
|
||||||
@@ -255,11 +264,26 @@ std::list<std::pair<int, Transform> > RTABMAP_EXP computePath(
|
|||||||
float linearVelocity = 0.0f, // m/sec
|
float linearVelocity = 0.0f, // m/sec
|
||||||
float angularVelocity = 0.0f); // rad/sec
|
float angularVelocity = 0.0f); // rad/sec
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the nearest node of the target pose
|
||||||
|
* @param nodes the nodes to search for
|
||||||
|
* @param targetPose the target pose to search around
|
||||||
|
* @param distance squared distance of the nearest node found (optional)
|
||||||
|
* @return the node id.
|
||||||
|
*/
|
||||||
int RTABMAP_EXP findNearestNode(
|
int RTABMAP_EXP findNearestNode(
|
||||||
const std::map<int, rtabmap::Transform> & nodes,
|
const std::map<int, rtabmap::Transform> & nodes,
|
||||||
const rtabmap::Transform & targetPose);
|
const rtabmap::Transform & targetPose,
|
||||||
|
float * distance = 0);
|
||||||
|
|
||||||
std::vector<int> RTABMAP_EXP findNearestNodes(
|
/**
|
||||||
|
* Get K nearest nodes of the target pose
|
||||||
|
* @param nodes the nodes to search for
|
||||||
|
* @param targetPose the target pose to search around
|
||||||
|
* @param k number of nearest neighbors to search for
|
||||||
|
* @return the node ids with squared distance to target pose.
|
||||||
|
*/
|
||||||
|
std::map<int, float> RTABMAP_EXP findNearestNodes(
|
||||||
const std::map<int, rtabmap::Transform> & nodes,
|
const std::map<int, rtabmap::Transform> & nodes,
|
||||||
const rtabmap::Transform & targetPose,
|
const rtabmap::Transform & targetPose,
|
||||||
int k);
|
int k);
|
||||||
@@ -275,11 +299,20 @@ std::map<int, float> RTABMAP_EXP getNodesInRadius(
|
|||||||
int nodeId,
|
int nodeId,
|
||||||
const std::map<int, Transform> & nodes,
|
const std::map<int, Transform> & nodes,
|
||||||
float radius);
|
float radius);
|
||||||
|
std::map<int, float> RTABMAP_EXP getNodesInRadius(
|
||||||
|
const Transform & targetPose,
|
||||||
|
const std::map<int, Transform> & nodes,
|
||||||
|
float radius);
|
||||||
std::map<int, Transform> RTABMAP_EXP getPosesInRadius(
|
std::map<int, Transform> RTABMAP_EXP getPosesInRadius(
|
||||||
int nodeId,
|
int nodeId,
|
||||||
const std::map<int, Transform> & nodes,
|
const std::map<int, Transform> & nodes,
|
||||||
float radius,
|
float radius,
|
||||||
float angle = 0.0f);
|
float angle = 0.0f);
|
||||||
|
std::map<int, Transform> RTABMAP_EXP getPosesInRadius(
|
||||||
|
const Transform & targetPose,
|
||||||
|
const std::map<int, Transform> & nodes,
|
||||||
|
float radius,
|
||||||
|
float angle = 0.0f);
|
||||||
|
|
||||||
float RTABMAP_EXP computePathLength(
|
float RTABMAP_EXP computePathLength(
|
||||||
const std::vector<std::pair<int, Transform> > & path,
|
const std::vector<std::pair<int, Transform> > & path,
|
||||||
@@ -294,6 +327,9 @@ std::list<std::map<int, Transform> > RTABMAP_EXP getPaths(
|
|||||||
std::map<int, Transform> poses,
|
std::map<int, Transform> poses,
|
||||||
const std::multimap<int, Link> & links);
|
const std::multimap<int, Link> & links);
|
||||||
|
|
||||||
|
void RTABMAP_EXP computeMinMax(const std::map<int, Transform> & poses,
|
||||||
|
cv::Vec3f & min,
|
||||||
|
cv::Vec3f & max);
|
||||||
|
|
||||||
} /* namespace graph */
|
} /* namespace graph */
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,8 @@
|
|||||||
#define IMU_H_
|
#define IMU_H_
|
||||||
|
|
||||||
#include <opencv2/core/core.hpp>
|
#include <opencv2/core/core.hpp>
|
||||||
#include <rtabmap/utilite/ULogger.h>
|
#include <rtabmap/utilite/UEvent.h>
|
||||||
|
#include <rtabmap/core/Transform.h>
|
||||||
|
|
||||||
namespace rtabmap {
|
namespace rtabmap {
|
||||||
|
|
||||||
@@ -60,6 +61,9 @@ public:
|
|||||||
|
|
||||||
const Transform & localTransform() const {return localTransform_;}
|
const Transform & localTransform() const {return localTransform_;}
|
||||||
|
|
||||||
|
// apply local transform rotation to data, and set Identity rotation for local transform
|
||||||
|
void convertToBaseFrame();
|
||||||
|
|
||||||
bool empty() const
|
bool empty() const
|
||||||
{
|
{
|
||||||
return localTransform_.isNull();
|
return localTransform_.isNull();
|
||||||
|
|||||||
@@ -71,11 +71,35 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
LaserScan();
|
LaserScan();
|
||||||
|
LaserScan(const LaserScan & data,
|
||||||
|
int maxPoints,
|
||||||
|
float maxRange,
|
||||||
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
RTABMAP_DEPRECATED(LaserScan(const LaserScan & data,
|
||||||
|
int maxPoints,
|
||||||
|
float maxRange,
|
||||||
|
Format format,
|
||||||
|
const Transform & localTransform = Transform::getIdentity()), "Use version without \"format\" argument.");
|
||||||
LaserScan(const cv::Mat & data,
|
LaserScan(const cv::Mat & data,
|
||||||
int maxPoints,
|
int maxPoints,
|
||||||
float maxRange,
|
float maxRange,
|
||||||
Format format,
|
Format format,
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
RTABMAP_DEPRECATED(LaserScan(const LaserScan & data,
|
||||||
|
Format format,
|
||||||
|
float minRange,
|
||||||
|
float maxRange,
|
||||||
|
float angleMin,
|
||||||
|
float angleMax,
|
||||||
|
float angleIncrement,
|
||||||
|
const Transform & localTransform = Transform::getIdentity()), "Use version without \"format\" argument.");
|
||||||
|
LaserScan(const LaserScan & data,
|
||||||
|
float minRange,
|
||||||
|
float maxRange,
|
||||||
|
float angleMin,
|
||||||
|
float angleMax,
|
||||||
|
float angleIncrement,
|
||||||
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
LaserScan(const cv::Mat & data,
|
LaserScan(const cv::Mat & data,
|
||||||
Format format,
|
Format format,
|
||||||
float minRange,
|
float minRange,
|
||||||
@@ -97,6 +121,7 @@ public:
|
|||||||
float angleIncrement() const {return angleIncrement_;}
|
float angleIncrement() const {return angleIncrement_;}
|
||||||
Transform localTransform() const {return localTransform_;}
|
Transform localTransform() const {return localTransform_;}
|
||||||
|
|
||||||
|
bool empty() const {return data_.empty();}
|
||||||
bool isEmpty() const {return data_.empty();}
|
bool isEmpty() const {return data_.empty();}
|
||||||
int size() const {return data_.cols;}
|
int size() const {return data_.cols;}
|
||||||
int dataType() const {return data_.type();}
|
int dataType() const {return data_.type();}
|
||||||
@@ -113,6 +138,17 @@ public:
|
|||||||
|
|
||||||
void clear() {data_ = cv::Mat();}
|
void clear() {data_ = cv::Mat();}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void init(const cv::Mat & data,
|
||||||
|
Format format,
|
||||||
|
float minRange,
|
||||||
|
float maxRange,
|
||||||
|
float angleMin,
|
||||||
|
float angleMax,
|
||||||
|
float angleIncrement,
|
||||||
|
int maxPoints,
|
||||||
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
|
||||||
private:
|
private:
|
||||||
cv::Mat data_;
|
cv::Mat data_;
|
||||||
Format format_;
|
Format format_;
|
||||||
|
|||||||
@@ -50,6 +50,8 @@ private:
|
|||||||
cv::Ptr<cv::aruco::DetectorParameters> detectorParams_;
|
cv::Ptr<cv::aruco::DetectorParameters> detectorParams_;
|
||||||
float markerLength_;
|
float markerLength_;
|
||||||
float maxDepthError_;
|
float maxDepthError_;
|
||||||
|
float maxRange_;
|
||||||
|
float minRange_;
|
||||||
int dictionaryId_;
|
int dictionaryId_;
|
||||||
cv::Ptr<cv::aruco::Dictionary> dictionary_;
|
cv::Ptr<cv::aruco::Dictionary> dictionary_;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ public:
|
|||||||
cv::Mat load2DMap(float & xMin, float & yMin, float & cellSize) const;
|
cv::Mat load2DMap(float & xMin, float & yMin, float & cellSize) const;
|
||||||
void saveOptimizedMesh(
|
void saveOptimizedMesh(
|
||||||
const cv::Mat & cloud,
|
const cv::Mat & cloud,
|
||||||
const std::vector<std::vector<std::vector<unsigned int> > > & polygons = std::vector<std::vector<std::vector<unsigned int> > >(), // Textures -> polygons -> vertices
|
const std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > & polygons = std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > >(), // Textures -> polygons -> vertices
|
||||||
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords = std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > >(), // Textures -> uv coords for each vertex of the polygons
|
const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords = std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > >(), // Textures -> uv coords for each vertex of the polygons
|
||||||
#else
|
#else
|
||||||
@@ -110,7 +110,7 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
const cv::Mat & textures = cv::Mat()) const; // concatenated textures (assuming square textures with all same size)
|
const cv::Mat & textures = cv::Mat()) const; // concatenated textures (assuming square textures with all same size)
|
||||||
cv::Mat loadOptimizedMesh(
|
cv::Mat loadOptimizedMesh(
|
||||||
std::vector<std::vector<std::vector<unsigned int> > > * polygons = 0,
|
std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > * polygons = 0,
|
||||||
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords = 0,
|
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords = 0,
|
||||||
#else
|
#else
|
||||||
@@ -199,9 +199,10 @@ public:
|
|||||||
cv::Mat getImageCompressed(int signatureId) const;
|
cv::Mat getImageCompressed(int signatureId) const;
|
||||||
SensorData getNodeData(int locationId, bool images, bool scan, bool userData, bool occupancyGrid) const;
|
SensorData getNodeData(int locationId, bool images, bool scan, bool userData, bool occupancyGrid) const;
|
||||||
void getNodeWordsAndGlobalDescriptors(int nodeId,
|
void getNodeWordsAndGlobalDescriptors(int nodeId,
|
||||||
std::multimap<int, cv::KeyPoint> & words,
|
std::multimap<int, int> & words,
|
||||||
std::multimap<int, cv::Point3f> & words3,
|
std::vector<cv::KeyPoint> & wordsKpts,
|
||||||
std::multimap<int, cv::Mat> & wordsDescriptors,
|
std::vector<cv::Point3f> & words3,
|
||||||
|
cv::Mat & wordsDescriptors,
|
||||||
std::vector<GlobalDescriptor> & globalDescriptors) const;
|
std::vector<GlobalDescriptor> & globalDescriptors) const;
|
||||||
void getNodeCalibration(int nodeId,
|
void getNodeCalibration(int nodeId,
|
||||||
std::vector<CameraModel> & models,
|
std::vector<CameraModel> & models,
|
||||||
@@ -225,6 +226,7 @@ public:
|
|||||||
virtual void dumpMemory(std::string directory) const;
|
virtual void dumpMemory(std::string directory) const;
|
||||||
virtual void dumpSignatures(const char * fileNameSign, bool words3D) const;
|
virtual void dumpSignatures(const char * fileNameSign, bool words3D) const;
|
||||||
void dumpDictionary(const char * fileNameRef, const char * fileNameDesc) const;
|
void dumpDictionary(const char * fileNameRef, const char * fileNameDesc) const;
|
||||||
|
unsigned long getMemoryUsed() const; //Bytes
|
||||||
|
|
||||||
void generateGraph(const std::string & fileName, const std::set<int> & ids = std::set<int>());
|
void generateGraph(const std::string & fileName, const std::set<int> & ids = std::set<int>());
|
||||||
|
|
||||||
|
|||||||
@@ -104,6 +104,8 @@ public:
|
|||||||
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & getMapObstacles() const {return assembledObstacles_;}
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & getMapObstacles() const {return assembledObstacles_;}
|
||||||
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & getMapEmptyCells() const {return assembledEmptyCells_;}
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & getMapEmptyCells() const {return assembledEmptyCells_;}
|
||||||
|
|
||||||
|
unsigned long getMemoryUsed() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ParametersMap parameters_;
|
ParametersMap parameters_;
|
||||||
int cloudDecimation_;
|
int cloudDecimation_;
|
||||||
|
|||||||
@@ -168,9 +168,6 @@ class RtabmapColorOcTree : public octomap::OccupancyOcTreeBase <RtabmapColorOcTr
|
|||||||
};
|
};
|
||||||
|
|
||||||
class RTABMAP_EXP OctoMap {
|
class RTABMAP_EXP OctoMap {
|
||||||
public:
|
|
||||||
static void HSVtoRGB(float *r, float *g, float *b, float h, float s, float v);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OctoMap(const ParametersMap & parameters);
|
OctoMap(const ParametersMap & parameters);
|
||||||
OctoMap(float cellSize = 0.1f, float occupancyThr = 0.5f, bool fullUpdate = false, float updateError=0.01f);
|
OctoMap(float cellSize = 0.1f, float occupancyThr = 0.5f, bool fullUpdate = false, float updateError=0.01f);
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ public:
|
|||||||
kTypeFovis = 2,
|
kTypeFovis = 2,
|
||||||
kTypeViso2 = 3,
|
kTypeViso2 = 3,
|
||||||
kTypeDVO = 4,
|
kTypeDVO = 4,
|
||||||
kTypeORBSLAM2 = 5,
|
kTypeORBSLAM = 5,
|
||||||
kTypeOkvis = 6,
|
kTypeOkvis = 6,
|
||||||
kTypeLOAM = 7,
|
kTypeLOAM = 7,
|
||||||
kTypeMSCKF = 8,
|
kTypeMSCKF = 8,
|
||||||
@@ -67,7 +67,7 @@ public:
|
|||||||
virtual void reset(const Transform & initialPose = Transform::getIdentity());
|
virtual void reset(const Transform & initialPose = Transform::getIdentity());
|
||||||
virtual Odometry::Type getType() = 0;
|
virtual Odometry::Type getType() = 0;
|
||||||
virtual bool canProcessRawImages() const {return false;}
|
virtual bool canProcessRawImages() const {return false;}
|
||||||
virtual bool canProcessIMU() const {return false;}
|
virtual bool canProcessAsyncIMU() const {return false;}
|
||||||
|
|
||||||
//getters
|
//getters
|
||||||
const Transform & getPose() const {return _pose;}
|
const Transform & getPose() const {return _pose;}
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ public:
|
|||||||
output.transformFiltered = transformFiltered;
|
output.transformFiltered = transformFiltered;
|
||||||
output.transformGroundTruth = transformGroundTruth;
|
output.transformGroundTruth = transformGroundTruth;
|
||||||
output.guessVelocity = guessVelocity;
|
output.guessVelocity = guessVelocity;
|
||||||
|
output.guess = guess;
|
||||||
output.distanceTravelled = distanceTravelled;
|
output.distanceTravelled = distanceTravelled;
|
||||||
output.memoryUsage = memoryUsage;
|
output.memoryUsage = memoryUsage;
|
||||||
output.gravityRollError = gravityRollError;
|
output.gravityRollError = gravityRollError;
|
||||||
@@ -111,7 +112,8 @@ public:
|
|||||||
Transform transform;
|
Transform transform;
|
||||||
Transform transformFiltered;
|
Transform transformFiltered;
|
||||||
Transform transformGroundTruth;
|
Transform transformGroundTruth;
|
||||||
Transform guessVelocity;
|
Transform guessVelocity; // deprecated, will be removed. Use guess and interval instead.
|
||||||
|
Transform guess;
|
||||||
float distanceTravelled;
|
float distanceTravelled;
|
||||||
int memoryUsage; //MB
|
int memoryUsage; //MB
|
||||||
double gravityRollError;
|
double gravityRollError;
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2021, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the Universite de Sherbrooke nor the
|
||||||
|
names of its contributors may be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CORELIB_INCLUDE_RTABMAP_CORE_PDALWRITER_H_
|
||||||
|
#define CORELIB_INCLUDE_RTABMAP_CORE_PDALWRITER_H_
|
||||||
|
|
||||||
|
#include <pcl/point_cloud.h>
|
||||||
|
#include <pcl/point_types.h>
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
std::string getPDALSupportedWriters();
|
||||||
|
|
||||||
|
int savePDALFile(const std::string & filePath, const pcl::PointCloud<pcl::PointXYZ> & cloud, const std::vector<int> & cameraIds = std::vector<int>(), bool binary = false);
|
||||||
|
int savePDALFile(const std::string & filePath, const pcl::PointCloud<pcl::PointXYZRGB> & cloud, const std::vector<int> & cameraIds = std::vector<int>(), bool binary = false);
|
||||||
|
int savePDALFile(const std::string & filePath, const pcl::PointCloud<pcl::PointXYZRGBNormal> & cloud, const std::vector<int> & cameraIds = std::vector<int>(), bool binary = false);
|
||||||
|
int savePDALFile(const std::string & filePath, const pcl::PointCloud<pcl::PointXYZI> & cloud, const std::vector<int> & cameraIds = std::vector<int>(), bool binary = false);
|
||||||
|
int savePDALFile(const std::string & filePath, const pcl::PointCloud<pcl::PointXYZINormal> & cloud, const std::vector<int> & cameraIds = std::vector<int>(), bool binary = false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* CORELIB_INCLUDE_RTABMAP_CORE_PDALWRITER_H_ */
|
||||||
@@ -236,6 +236,7 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(Kp, IncrementalDictionary, bool, true, "");
|
RTABMAP_PARAM(Kp, IncrementalDictionary, bool, true, "");
|
||||||
RTABMAP_PARAM(Kp, IncrementalFlann, bool, true, uFormat("When using FLANN based strategy, add/remove points to its index without always rebuilding the index (the index is built only when the dictionary increases of the factor \"%s\" in size).", kKpFlannRebalancingFactor().c_str()));
|
RTABMAP_PARAM(Kp, IncrementalFlann, bool, true, uFormat("When using FLANN based strategy, add/remove points to its index without always rebuilding the index (the index is built only when the dictionary increases of the factor \"%s\" in size).", kKpFlannRebalancingFactor().c_str()));
|
||||||
RTABMAP_PARAM(Kp, FlannRebalancingFactor, float, 2.0, uFormat("Factor used when rebuilding the incremental FLANN index (see \"%s\"). Set <=1 to disable.", kKpIncrementalFlann().c_str()));
|
RTABMAP_PARAM(Kp, FlannRebalancingFactor, float, 2.0, uFormat("Factor used when rebuilding the incremental FLANN index (see \"%s\"). Set <=1 to disable.", kKpIncrementalFlann().c_str()));
|
||||||
|
RTABMAP_PARAM(Kp, ByteToFloat, bool, false, uFormat("For %s=1, binary descriptors are converted to float by converting each byte to float instead of converting each bit to float. When converting bytes instead of bits, less memory is used and search is faster at the cost of slightly less accurate matching.", kKpNNStrategy().c_str()));
|
||||||
RTABMAP_PARAM(Kp, MaxDepth, float, 0, "Filter extracted keypoints by depth (0=inf).");
|
RTABMAP_PARAM(Kp, MaxDepth, float, 0, "Filter extracted keypoints by depth (0=inf).");
|
||||||
RTABMAP_PARAM(Kp, MinDepth, float, 0, "Filter extracted keypoints by depth.");
|
RTABMAP_PARAM(Kp, MinDepth, float, 0, "Filter extracted keypoints by depth.");
|
||||||
RTABMAP_PARAM(Kp, MaxFeatures, int, 500, "Maximum features extracted from the images (0 means not bounded, <0 means no extraction).");
|
RTABMAP_PARAM(Kp, MaxFeatures, int, 500, "Maximum features extracted from the images (0 means not bounded, <0 means no extraction).");
|
||||||
@@ -243,9 +244,9 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(Kp, NndrRatio, float, 0.8, "NNDR ratio (A matching pair is detected, if its distance is closer than X times the distance of the second nearest neighbor.)");
|
RTABMAP_PARAM(Kp, NndrRatio, float, 0.8, "NNDR ratio (A matching pair is detected, if its distance is closer than X times the distance of the second nearest neighbor.)");
|
||||||
#if CV_MAJOR_VERSION > 2 && !defined(HAVE_OPENCV_XFEATURES2D)
|
#if CV_MAJOR_VERSION > 2 && !defined(HAVE_OPENCV_XFEATURES2D)
|
||||||
// OpenCV>2 without xFeatures2D module doesn't have BRIEF
|
// OpenCV>2 without xFeatures2D module doesn't have BRIEF
|
||||||
RTABMAP_PARAM(Kp, DetectorStrategy, int, 8, "0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB 9=KAZE 10=ORB-OCTREE 11=SuperPoint Torch.");
|
RTABMAP_PARAM(Kp, DetectorStrategy, int, 8, "0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB 9=KAZE 10=ORB-OCTREE 11=SuperPoint 12=SURF/FREAK 13=GFTT/DAISY 14=SURF/DAISY 15=PyDetector");
|
||||||
#else
|
#else
|
||||||
RTABMAP_PARAM(Kp, DetectorStrategy, int, 6, "0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB 9=KAZE 10=ORB-OCTREE 11=SuperPoint Torch.");
|
RTABMAP_PARAM(Kp, DetectorStrategy, int, 6, "0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB 9=KAZE 10=ORB-OCTREE 11=SuperPoint 12=SURF/FREAK 13=GFTT/DAISY 14=SURF/DAISY 15=PyDetector");
|
||||||
#endif
|
#endif
|
||||||
RTABMAP_PARAM(Kp, TfIdfLikelihoodUsed, bool, true, "Use of the td-idf strategy to compute the likelihood.");
|
RTABMAP_PARAM(Kp, TfIdfLikelihoodUsed, bool, true, "Use of the td-idf strategy to compute the likelihood.");
|
||||||
RTABMAP_PARAM(Kp, Parallelized, bool, true, "If the dictionary update and signature creation were parallelized.");
|
RTABMAP_PARAM(Kp, Parallelized, bool, true, "If the dictionary update and signature creation were parallelized.");
|
||||||
@@ -264,6 +265,7 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(DbSqlite3, JournalMode, int, 3, "0=DELETE, 1=TRUNCATE, 2=PERSIST, 3=MEMORY, 4=OFF (see sqlite3 doc : \"PRAGMA journal_mode\")");
|
RTABMAP_PARAM(DbSqlite3, JournalMode, int, 3, "0=DELETE, 1=TRUNCATE, 2=PERSIST, 3=MEMORY, 4=OFF (see sqlite3 doc : \"PRAGMA journal_mode\")");
|
||||||
RTABMAP_PARAM(DbSqlite3, Synchronous, int, 0, "0=OFF, 1=NORMAL, 2=FULL (see sqlite3 doc : \"PRAGMA synchronous\")");
|
RTABMAP_PARAM(DbSqlite3, Synchronous, int, 0, "0=OFF, 1=NORMAL, 2=FULL (see sqlite3 doc : \"PRAGMA synchronous\")");
|
||||||
RTABMAP_PARAM(DbSqlite3, TempStore, int, 2, "0=DEFAULT, 1=FILE, 2=MEMORY (see sqlite3 doc : \"PRAGMA temp_store\")");
|
RTABMAP_PARAM(DbSqlite3, TempStore, int, 2, "0=DEFAULT, 1=FILE, 2=MEMORY (see sqlite3 doc : \"PRAGMA temp_store\")");
|
||||||
|
RTABMAP_PARAM_STR(Db, TargetVersion, "", "Target database version for backward compatibility purpose. Only Major and minor versions are used and should be set (e.g., 0.19 vs 0.20 or 1.0 vs 2.0). Patch version is ignored (e.g., 0.20.1 and 0.20.3 will generate a 0.20 database).");
|
||||||
|
|
||||||
// Keypoints descriptors/detectors
|
// Keypoints descriptors/detectors
|
||||||
RTABMAP_PARAM(SURF, Extended, bool, false, "Extended descriptor flag (true - use extended 128-element descriptors; false - use 64-element descriptors).");
|
RTABMAP_PARAM(SURF, Extended, bool, false, "Extended descriptor flag (true - use extended 128-element descriptors; false - use 64-element descriptors).");
|
||||||
@@ -294,14 +296,14 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(FAST, CV, int, 0, "Enable FastCV implementation if non-zero (and RTAB-Map is built with FastCV support). Values should be 9 and 10.");
|
RTABMAP_PARAM(FAST, CV, int, 0, "Enable FastCV implementation if non-zero (and RTAB-Map is built with FastCV support). Values should be 9 and 10.");
|
||||||
|
|
||||||
RTABMAP_PARAM(GFTT, QualityLevel, double, 0.001, "");
|
RTABMAP_PARAM(GFTT, QualityLevel, double, 0.001, "");
|
||||||
RTABMAP_PARAM(GFTT, MinDistance, double, 3, "");
|
RTABMAP_PARAM(GFTT, MinDistance, double, 7, "");
|
||||||
RTABMAP_PARAM(GFTT, BlockSize, int, 3, "");
|
RTABMAP_PARAM(GFTT, BlockSize, int, 3, "");
|
||||||
RTABMAP_PARAM(GFTT, UseHarrisDetector, bool, false, "");
|
RTABMAP_PARAM(GFTT, UseHarrisDetector, bool, false, "");
|
||||||
RTABMAP_PARAM(GFTT, K, double, 0.04, "");
|
RTABMAP_PARAM(GFTT, K, double, 0.04, "");
|
||||||
|
|
||||||
RTABMAP_PARAM(ORB, ScaleFactor, float, 1.2, "Pyramid decimation ratio, greater than 1. scaleFactor==2 means the classical pyramid, where each next level has 4x less pixels than the previous, but such a big scale factor will degrade feature matching scores dramatically. On the other hand, too close to 1 scale factor will mean that to cover certain scale range you will need more pyramid levels and so the speed will suffer.");
|
RTABMAP_PARAM(ORB, ScaleFactor, float, 2, "Pyramid decimation ratio, greater than 1. scaleFactor==2 means the classical pyramid, where each next level has 4x less pixels than the previous, but such a big scale factor will degrade feature matching scores dramatically. On the other hand, too close to 1 scale factor will mean that to cover certain scale range you will need more pyramid levels and so the speed will suffer.");
|
||||||
RTABMAP_PARAM(ORB, NLevels, int, 8, "The number of pyramid levels. The smallest level will have linear size equal to input_image_linear_size/pow(scaleFactor, nlevels).");
|
RTABMAP_PARAM(ORB, NLevels, int, 3, "The number of pyramid levels. The smallest level will have linear size equal to input_image_linear_size/pow(scaleFactor, nlevels).");
|
||||||
RTABMAP_PARAM(ORB, EdgeThreshold, int, 31, "This is size of the border where the features are not detected. It should roughly match the patchSize parameter.");
|
RTABMAP_PARAM(ORB, EdgeThreshold, int, 19, "This is size of the border where the features are not detected. It should roughly match the patchSize parameter.");
|
||||||
RTABMAP_PARAM(ORB, FirstLevel, int, 0, "It should be 0 in the current implementation.");
|
RTABMAP_PARAM(ORB, FirstLevel, int, 0, "It should be 0 in the current implementation.");
|
||||||
RTABMAP_PARAM(ORB, WTA_K, int, 2, "The number of points that produce each element of the oriented BRIEF descriptor. The default value 2 means the BRIEF where we take a random point pair and compare their brightnesses, so we get 0/1 response. Other possible values are 3 and 4. For example, 3 means that we take 3 random points (of course, those point coordinates are random, but they are generated from the pre-defined seed, so each element of BRIEF descriptor is computed deterministically from the pixel rectangle), find point of maximum brightness and output index of the winner (0, 1 or 2). Such output will occupy 2 bits, and therefore it will need a special variant of Hamming distance, denoted as NORM_HAMMING2 (2 bits per bin). When WTA_K=4, we take 4 random points to compute each bin (that will also occupy 2 bits with possible values 0, 1, 2 or 3).");
|
RTABMAP_PARAM(ORB, WTA_K, int, 2, "The number of points that produce each element of the oriented BRIEF descriptor. The default value 2 means the BRIEF where we take a random point pair and compare their brightnesses, so we get 0/1 response. Other possible values are 3 and 4. For example, 3 means that we take 3 random points (of course, those point coordinates are random, but they are generated from the pre-defined seed, so each element of BRIEF descriptor is computed deterministically from the pixel rectangle), find point of maximum brightness and output index of the winner (0, 1 or 2). Such output will occupy 2 bits, and therefore it will need a special variant of Hamming distance, denoted as NORM_HAMMING2 (2 bits per bin). When WTA_K=4, we take 4 random points to compute each bin (that will also occupy 2 bits with possible values 0, 1, 2 or 3).");
|
||||||
RTABMAP_PARAM(ORB, ScoreType, int, 0, "The default HARRIS_SCORE=0 means that Harris algorithm is used to rank features (the score is written to KeyPoint::score and is used to retain best nfeatures features); FAST_SCORE=1 is alternative value of the parameter that produces slightly less stable keypoints, but it is a little faster to compute.");
|
RTABMAP_PARAM(ORB, ScoreType, int, 0, "The default HARRIS_SCORE=0 means that Harris algorithm is used to rank features (the score is written to KeyPoint::score and is used to retain best nfeatures features); FAST_SCORE=1 is alternative value of the parameter that produces slightly less stable keypoints, but it is a little faster to compute.");
|
||||||
@@ -330,6 +332,9 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(SuperPoint, NMSRadius, int, 4, uFormat("[%s=true] Minimum distance (pixels) between keypoints.", kSuperPointNMS().c_str()));
|
RTABMAP_PARAM(SuperPoint, NMSRadius, int, 4, uFormat("[%s=true] Minimum distance (pixels) between keypoints.", kSuperPointNMS().c_str()));
|
||||||
RTABMAP_PARAM(SuperPoint, Cuda, bool, true, "Use Cuda device for Torch, otherwise CPU device is used by default.");
|
RTABMAP_PARAM(SuperPoint, Cuda, bool, true, "Use Cuda device for Torch, otherwise CPU device is used by default.");
|
||||||
|
|
||||||
|
RTABMAP_PARAM_STR(PyDetector, Path, "", "Path to python script file (see available ones in rtabmap/corelib/src/python/*). See the header to see where the script should be copied.");
|
||||||
|
RTABMAP_PARAM(PyDetector, Cuda, bool, true, "Use cuda.");
|
||||||
|
|
||||||
// BayesFilter
|
// BayesFilter
|
||||||
RTABMAP_PARAM(Bayes, VirtualPlacePriorThr, float, 0.9, "Virtual place prior");
|
RTABMAP_PARAM(Bayes, VirtualPlacePriorThr, float, 0.9, "Virtual place prior");
|
||||||
RTABMAP_PARAM_STR(Bayes, PredictionLC, "0.1 0.36 0.30 0.16 0.062 0.0151 0.00255 0.000324 2.5e-05 1.3e-06 4.8e-08 1.2e-09 1.9e-11 2.2e-13 1.7e-15 8.5e-18 2.9e-20 6.9e-23", "Prediction of loop closures (Gaussian-like, here with sigma=1.6) - Format: {VirtualPlaceProb, LoopClosureProb, NeighborLvl1, NeighborLvl2, ...}.");
|
RTABMAP_PARAM_STR(Bayes, PredictionLC, "0.1 0.36 0.30 0.16 0.062 0.0151 0.00255 0.000324 2.5e-05 1.3e-06 4.8e-08 1.2e-09 1.9e-11 2.2e-13 1.7e-15 8.5e-18 2.9e-20 6.9e-23", "Prediction of loop closures (Gaussian-like, here with sigma=1.6) - Format: {VirtualPlaceProb, LoopClosureProb, NeighborLvl1, NeighborLvl2, ...}.");
|
||||||
@@ -342,7 +347,7 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(VhEp, RansacParam2, float, 0.99, "Fundamental matrix (see cvFindFundamentalMat()): Performance of RANSAC.");
|
RTABMAP_PARAM(VhEp, RansacParam2, float, 0.99, "Fundamental matrix (see cvFindFundamentalMat()): Performance of RANSAC.");
|
||||||
|
|
||||||
// RGB-D SLAM
|
// RGB-D SLAM
|
||||||
RTABMAP_PARAM(RGBD, Enabled, bool, true, "");
|
RTABMAP_PARAM(RGBD, Enabled, bool, true, "Activate metric SLAM. If set to false, classic RTAB-Map loop closure detection is done using only images and without any metric information.");
|
||||||
RTABMAP_PARAM(RGBD, LinearUpdate, float, 0.1, "Minimum linear displacement (m) to update the map. Rehearsal is done prior to this, so weights are still updated.");
|
RTABMAP_PARAM(RGBD, LinearUpdate, float, 0.1, "Minimum linear displacement (m) to update the map. Rehearsal is done prior to this, so weights are still updated.");
|
||||||
RTABMAP_PARAM(RGBD, AngularUpdate, float, 0.1, "Minimum angular displacement (rad) to update the map. Rehearsal is done prior to this, so weights are still updated.");
|
RTABMAP_PARAM(RGBD, AngularUpdate, float, 0.1, "Minimum angular displacement (rad) to update the map. Rehearsal is done prior to this, so weights are still updated.");
|
||||||
RTABMAP_PARAM(RGBD, LinearSpeedUpdate, float, 0.0, "Maximum linear speed (m/s) to update the map (0 means not limit).");
|
RTABMAP_PARAM(RGBD, LinearSpeedUpdate, float, 0.0, "Maximum linear speed (m/s) to update the map (0 means not limit).");
|
||||||
@@ -351,7 +356,7 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(RGBD, OptimizeFromGraphEnd, bool, false, "Optimize graph from the newest node. If false, the graph is optimized from the oldest node of the current graph (this adds an overhead computation to detect to oldest node of the current graph, but it can be useful to preserve the map referential from the oldest node). Warning when set to false: when some nodes are transferred, the first referential of the local map may change, resulting in momentary changes in robot/map position (which are annoying in teleoperation).");
|
RTABMAP_PARAM(RGBD, OptimizeFromGraphEnd, bool, false, "Optimize graph from the newest node. If false, the graph is optimized from the oldest node of the current graph (this adds an overhead computation to detect to oldest node of the current graph, but it can be useful to preserve the map referential from the oldest node). Warning when set to false: when some nodes are transferred, the first referential of the local map may change, resulting in momentary changes in robot/map position (which are annoying in teleoperation).");
|
||||||
RTABMAP_PARAM(RGBD, OptimizeMaxError, float, 3.0, uFormat("Reject loop closures if optimization error ratio is greater than this value (0=disabled). Ratio is computed as absolute error over standard deviation of each link. This will help to detect when a wrong loop closure is added to the graph. Not compatible with \"%s\" if enabled.", kOptimizerRobust().c_str()));
|
RTABMAP_PARAM(RGBD, OptimizeMaxError, float, 3.0, uFormat("Reject loop closures if optimization error ratio is greater than this value (0=disabled). Ratio is computed as absolute error over standard deviation of each link. This will help to detect when a wrong loop closure is added to the graph. Not compatible with \"%s\" if enabled.", kOptimizerRobust().c_str()));
|
||||||
RTABMAP_PARAM(RGBD, MaxLoopClosureDistance, float, 0.0, "Reject loop closures/localizations if the distance from the map is over this distance (0=disabled).");
|
RTABMAP_PARAM(RGBD, MaxLoopClosureDistance, float, 0.0, "Reject loop closures/localizations if the distance from the map is over this distance (0=disabled).");
|
||||||
RTABMAP_PARAM(RGBD, SavedLocalizationIgnored, bool, false, "Ignore last saved localization pose from previous session. If true, RTAB-Map won't assume it is restarting from the same place than where it shut down previously.");
|
RTABMAP_PARAM(RGBD, StartAtOrigin, bool, false, uFormat("If true, rtabmap will assume the robot is starting from origin of the map. If false, rtabmap will assume the robot is restarting from the last saved localization pose from previous session (the place where it shut down previously). Used only in localization mode (%s=false).", kMemIncrementalMemory().c_str()));
|
||||||
RTABMAP_PARAM(RGBD, GoalReachedRadius, float, 0.5, "Goal reached radius (m).");
|
RTABMAP_PARAM(RGBD, GoalReachedRadius, float, 0.5, "Goal reached radius (m).");
|
||||||
RTABMAP_PARAM(RGBD, PlanStuckIterations, int, 0, "Mark the current goal node on the path as unreachable if it is not updated after X iterations (0=disabled). If all upcoming nodes on the path are unreachabled, the plan fails.");
|
RTABMAP_PARAM(RGBD, PlanStuckIterations, int, 0, "Mark the current goal node on the path as unreachable if it is not updated after X iterations (0=disabled). If all upcoming nodes on the path are unreachabled, the plan fails.");
|
||||||
RTABMAP_PARAM(RGBD, PlanLinearVelocity, float, 0, "Linear velocity (m/sec) used to compute path weights.");
|
RTABMAP_PARAM(RGBD, PlanLinearVelocity, float, 0, "Linear velocity (m/sec) used to compute path weights.");
|
||||||
@@ -360,8 +365,9 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(RGBD, MaxLocalRetrieved, unsigned int, 2, "Maximum local locations retrieved (0=disabled) near the current pose in the local map or on the current planned path (those on the planned path have priority).");
|
RTABMAP_PARAM(RGBD, MaxLocalRetrieved, unsigned int, 2, "Maximum local locations retrieved (0=disabled) near the current pose in the local map or on the current planned path (those on the planned path have priority).");
|
||||||
RTABMAP_PARAM(RGBD, LocalRadius, float, 10, "Local radius (m) for nodes selection in the local map. This parameter is used in some approaches about the local map management.");
|
RTABMAP_PARAM(RGBD, LocalRadius, float, 10, "Local radius (m) for nodes selection in the local map. This parameter is used in some approaches about the local map management.");
|
||||||
RTABMAP_PARAM(RGBD, LocalImmunizationRatio, float, 0.25, "Ratio of working memory for which local nodes are immunized from transfer.");
|
RTABMAP_PARAM(RGBD, LocalImmunizationRatio, float, 0.25, "Ratio of working memory for which local nodes are immunized from transfer.");
|
||||||
RTABMAP_PARAM(RGBD, ScanMatchingIdsSavedInLinks, bool, true, "Save scan matching IDs in link's user data.");
|
RTABMAP_PARAM(RGBD, ScanMatchingIdsSavedInLinks, bool, true, "Save scan matching IDs from one-to-many proximity detection in link's user data.");
|
||||||
RTABMAP_PARAM(RGBD, NeighborLinkRefining, bool, false, uFormat("When a new node is added to the graph, the transformation of its neighbor link to the previous node is refined using registration approach selected (%s).", kRegStrategy().c_str()));
|
RTABMAP_PARAM(RGBD, NeighborLinkRefining, bool, false, uFormat("When a new node is added to the graph, the transformation of its neighbor link to the previous node is refined using registration approach selected (%s).", kRegStrategy().c_str()));
|
||||||
|
RTABMAP_PARAM(RGBD, LoopClosureIdentityGuess, bool, false, uFormat("Use Identity matrix as guess when computing loop closure transform, otherwise no guess is used, thus assuming that registration strategy selected (%s) can deal with transformation estimation without guess.", kRegStrategy().c_str()));
|
||||||
RTABMAP_PARAM(RGBD, LoopClosureReextractFeatures, bool, false, "Extract features even if there are some already in the nodes.");
|
RTABMAP_PARAM(RGBD, LoopClosureReextractFeatures, bool, false, "Extract features even if there are some already in the nodes.");
|
||||||
RTABMAP_PARAM(RGBD, LocalBundleOnLoopClosure, bool, false, "Do local bundle adjustment with neighborhood of the loop closure.");
|
RTABMAP_PARAM(RGBD, LocalBundleOnLoopClosure, bool, false, "Do local bundle adjustment with neighborhood of the loop closure.");
|
||||||
RTABMAP_PARAM(RGBD, CreateOccupancyGrid, bool, false, "Create local occupancy grid maps. See \"Grid\" group for parameters.");
|
RTABMAP_PARAM(RGBD, CreateOccupancyGrid, bool, false, "Create local occupancy grid maps. See \"Grid\" group for parameters.");
|
||||||
@@ -373,12 +379,12 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(RGBD, ProximityByTime, bool, false, "Detection over all locations in STM.");
|
RTABMAP_PARAM(RGBD, ProximityByTime, bool, false, "Detection over all locations in STM.");
|
||||||
RTABMAP_PARAM(RGBD, ProximityBySpace, bool, true, "Detection over locations (in Working Memory) near in space.");
|
RTABMAP_PARAM(RGBD, ProximityBySpace, bool, true, "Detection over locations (in Working Memory) near in space.");
|
||||||
RTABMAP_PARAM(RGBD, ProximityMaxGraphDepth, int, 50, "Maximum depth from the current/last loop closure location and the local loop closure hypotheses. Set 0 to ignore.");
|
RTABMAP_PARAM(RGBD, ProximityMaxGraphDepth, int, 50, "Maximum depth from the current/last loop closure location and the local loop closure hypotheses. Set 0 to ignore.");
|
||||||
RTABMAP_PARAM(RGBD, ProximityMaxPaths, int, 3, "Maximum paths compared (from the most recent) for proximity detection by space. 0 means no limit.");
|
RTABMAP_PARAM(RGBD, ProximityMaxPaths, int, 3, "Maximum paths compared (from the most recent) for proximity detection. 0 means no limit.");
|
||||||
RTABMAP_PARAM(RGBD, ProximityPathFilteringRadius, float, 1, "Path filtering radius to reduce the number of nodes to compare in a path. A path should also be inside that radius to be considered for proximity detection.");
|
RTABMAP_PARAM(RGBD, ProximityPathFilteringRadius, float, 1, "Path filtering radius to reduce the number of nodes to compare in a path in one-to-many proximity detection. The nearest node in a path should be inside that radius to be considered for one-to-one proximity detection.");
|
||||||
RTABMAP_PARAM(RGBD, ProximityPathMaxNeighbors, int, 0, "Maximum neighbor nodes compared on each path. Set to 0 to disable merging the laser scans.");
|
RTABMAP_PARAM(RGBD, ProximityPathMaxNeighbors, int, 0, "Maximum neighbor nodes compared on each path for one-to-many proximity detection. Set to 0 to disable one-to-many proximity detection (by merging the laser scans).");
|
||||||
RTABMAP_PARAM(RGBD, ProximityPathRawPosesUsed, bool, true, "When comparing to a local path, merge the scan using the odometry poses (with neighbor link optimizations) instead of the ones in the optimized local graph.");
|
RTABMAP_PARAM(RGBD, ProximityPathRawPosesUsed, bool, true, "When comparing to a local path for one-to-many proximity detection, merge the scans using the odometry poses (with neighbor link optimizations) instead of the ones in the optimized local graph.");
|
||||||
RTABMAP_PARAM(RGBD, ProximityAngle, float, 45, "Maximum angle (degrees) for visual proximity detection.");
|
RTABMAP_PARAM(RGBD, ProximityAngle, float, 45, "Maximum angle (degrees) for one-to-one proximity detection.");
|
||||||
RTABMAP_PARAM(RGBD, ProximityOdomGuess, bool, false, "Use odometry as motion guess for visual proximity detection.");
|
RTABMAP_PARAM(RGBD, ProximityOdomGuess, bool, false, "Use odometry as motion guess for one-to-one proximity detection.");
|
||||||
|
|
||||||
// Graph optimization
|
// Graph optimization
|
||||||
#ifdef RTABMAP_GTSAM
|
#ifdef RTABMAP_GTSAM
|
||||||
@@ -406,9 +412,13 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(Optimizer, Robust, bool, false, uFormat("Robust graph optimization using Vertigo (only work for g2o and GTSAM optimization strategies). Not compatible with \"%s\" if enabled.", kRGBDOptimizeMaxError().c_str()));
|
RTABMAP_PARAM(Optimizer, Robust, bool, false, uFormat("Robust graph optimization using Vertigo (only work for g2o and GTSAM optimization strategies). Not compatible with \"%s\" if enabled.", kRGBDOptimizeMaxError().c_str()));
|
||||||
RTABMAP_PARAM(Optimizer, PriorsIgnored, bool, true, "Ignore prior constraints (global pose or GPS) while optimizing. Currently only g2o and gtsam optimization supports this.");
|
RTABMAP_PARAM(Optimizer, PriorsIgnored, bool, true, "Ignore prior constraints (global pose or GPS) while optimizing. Currently only g2o and gtsam optimization supports this.");
|
||||||
RTABMAP_PARAM(Optimizer, LandmarksIgnored, bool, false, "Ignore landmark constraints while optimizing. Currently only g2o and gtsam optimization supports this.");
|
RTABMAP_PARAM(Optimizer, LandmarksIgnored, bool, false, "Ignore landmark constraints while optimizing. Currently only g2o and gtsam optimization supports this.");
|
||||||
|
#if defined(RTABMAP_G2O) || defined(RTABMAP_GTSAM)
|
||||||
|
RTABMAP_PARAM(Optimizer, GravitySigma, float, 0.3, uFormat("Gravity sigma value (>=0, typically between 0.1 and 0.3). Optimization is done while preserving gravity orientation of the poses. This should be used only with visual/lidar inertial odometry approaches, for which we assume that all odometry poses are aligned with gravity. Set to 0 to disable gravity constraints. Currently supported only with g2o and GTSAM optimization strategies (see %s).", kOptimizerStrategy().c_str()));
|
||||||
|
#else
|
||||||
RTABMAP_PARAM(Optimizer, GravitySigma, float, 0.0, uFormat("Gravity sigma value (>=0, typically between 0.1 and 0.3). Optimization is done while preserving gravity orientation of the poses. This should be used only with visual/lidar inertial odometry approaches, for which we assume that all odometry poses are aligned with gravity. Set to 0 to disable gravity constraints. Currently supported only with g2o and GTSAM optimization strategies (see %s).", kOptimizerStrategy().c_str()));
|
RTABMAP_PARAM(Optimizer, GravitySigma, float, 0.0, uFormat("Gravity sigma value (>=0, typically between 0.1 and 0.3). Optimization is done while preserving gravity orientation of the poses. This should be used only with visual/lidar inertial odometry approaches, for which we assume that all odometry poses are aligned with gravity. Set to 0 to disable gravity constraints. Currently supported only with g2o and GTSAM optimization strategies (see %s).", kOptimizerStrategy().c_str()));
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef RTABMAP_ORB_SLAM2
|
#ifdef RTABMAP_ORB_SLAM
|
||||||
RTABMAP_PARAM(g2o, Solver, int, 3, "0=csparse 1=pcg 2=cholmod 3=Eigen");
|
RTABMAP_PARAM(g2o, Solver, int, 3, "0=csparse 1=pcg 2=cholmod 3=Eigen");
|
||||||
#else
|
#else
|
||||||
RTABMAP_PARAM(g2o, Solver, int, 0, "0=csparse 1=pcg 2=cholmod 3=Eigen");
|
RTABMAP_PARAM(g2o, Solver, int, 0, "0=csparse 1=pcg 2=cholmod 3=Eigen");
|
||||||
@@ -450,7 +460,7 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(OdomF2M, ScanSubtractAngle, float, 45, uFormat("[Geometry] Max angle (degrees) used to filter points of a new added scan to local map (when \"%s\">0). 0 means any angle.", kOdomF2MScanSubtractRadius().c_str()).c_str());
|
RTABMAP_PARAM(OdomF2M, ScanSubtractAngle, float, 45, uFormat("[Geometry] Max angle (degrees) used to filter points of a new added scan to local map (when \"%s\">0). 0 means any angle.", kOdomF2MScanSubtractRadius().c_str()).c_str());
|
||||||
RTABMAP_PARAM(OdomF2M, ScanRange, float, 0, "[Geometry] Distance Range used to filter points of local map (when > 0). 0 means local map is updated using time and not range.");
|
RTABMAP_PARAM(OdomF2M, ScanRange, float, 0, "[Geometry] Distance Range used to filter points of local map (when > 0). 0 means local map is updated using time and not range.");
|
||||||
RTABMAP_PARAM(OdomF2M, ValidDepthRatio, float, 0.75, "If a new frame has points without valid depth, they are added to local feature map only if points with valid depth on total points is over this ratio. Setting to 1 means no points without valid depth are added to local feature map.");
|
RTABMAP_PARAM(OdomF2M, ValidDepthRatio, float, 0.75, "If a new frame has points without valid depth, they are added to local feature map only if points with valid depth on total points is over this ratio. Setting to 1 means no points without valid depth are added to local feature map.");
|
||||||
#if defined(RTABMAP_G2O) || defined(RTABMAP_ORB_SLAM2)
|
#if defined(RTABMAP_G2O) || defined(RTABMAP_ORB_SLAM)
|
||||||
RTABMAP_PARAM(OdomF2M, BundleAdjustment, int, 1, "Local bundle adjustment: 0=disabled, 1=g2o, 2=cvsba, 3=Ceres.");
|
RTABMAP_PARAM(OdomF2M, BundleAdjustment, int, 1, "Local bundle adjustment: 0=disabled, 1=g2o, 2=cvsba, 3=Ceres.");
|
||||||
#else
|
#else
|
||||||
RTABMAP_PARAM(OdomF2M, BundleAdjustment, int, 0, "Local bundle adjustment: 0=disabled, 1=g2o, 2=cvsba, 3=Ceres.");
|
RTABMAP_PARAM(OdomF2M, BundleAdjustment, int, 0, "Local bundle adjustment: 0=disabled, 1=g2o, 2=cvsba, 3=Ceres.");
|
||||||
@@ -511,12 +521,12 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(OdomViso2, BucketHeight, double, 50, "Height of bucket.");
|
RTABMAP_PARAM(OdomViso2, BucketHeight, double, 50, "Height of bucket.");
|
||||||
|
|
||||||
// Odometry ORB_SLAM2
|
// Odometry ORB_SLAM2
|
||||||
RTABMAP_PARAM_STR(OdomORBSLAM2, VocPath, "", "Path to ORB vocabulary (*.txt).");
|
RTABMAP_PARAM_STR(OdomORBSLAM, VocPath, "", "Path to ORB vocabulary (*.txt).");
|
||||||
RTABMAP_PARAM(OdomORBSLAM2, Bf, double, 0.076, "Fake IR projector baseline (m) used only when stereo is not used.");
|
RTABMAP_PARAM(OdomORBSLAM, Bf, double, 0.076, "Fake IR projector baseline (m) used only when stereo is not used.");
|
||||||
RTABMAP_PARAM(OdomORBSLAM2, ThDepth, double, 40.0, "Close/Far threshold. Baseline times.");
|
RTABMAP_PARAM(OdomORBSLAM, ThDepth, double, 40.0, "Close/Far threshold. Baseline times.");
|
||||||
RTABMAP_PARAM(OdomORBSLAM2, Fps, float, 0.0, "Camera FPS.");
|
RTABMAP_PARAM(OdomORBSLAM, Fps, float, 0.0, "Camera FPS.");
|
||||||
RTABMAP_PARAM(OdomORBSLAM2, MaxFeatures, int, 1000, "Maximum ORB features extracted per frame.");
|
RTABMAP_PARAM(OdomORBSLAM, MaxFeatures, int, 1000, "Maximum ORB features extracted per frame.");
|
||||||
RTABMAP_PARAM(OdomORBSLAM2, MapSize, int, 3000, "Maximum size of the feature map (0 means infinite).");
|
RTABMAP_PARAM(OdomORBSLAM, MapSize, int, 3000, "Maximum size of the feature map (0 means infinite).");
|
||||||
|
|
||||||
// Odometry OKVIS
|
// Odometry OKVIS
|
||||||
RTABMAP_PARAM_STR(OdomOKVIS, ConfigPath, "", "Path of OKVIS config file.");
|
RTABMAP_PARAM_STR(OdomOKVIS, ConfigPath, "", "Path of OKVIS config file.");
|
||||||
@@ -572,7 +582,7 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(Vis, RefineIterations, int, 5, uFormat("[%s = 0] Number of iterations used to refine the transformation found by RANSAC. 0 means that the transformation is not refined.", kVisEstimationType().c_str()));
|
RTABMAP_PARAM(Vis, RefineIterations, int, 5, uFormat("[%s = 0] Number of iterations used to refine the transformation found by RANSAC. 0 means that the transformation is not refined.", kVisEstimationType().c_str()));
|
||||||
RTABMAP_PARAM(Vis, PnPReprojError, float, 2, uFormat("[%s = 1] PnP reprojection error.", kVisEstimationType().c_str()));
|
RTABMAP_PARAM(Vis, PnPReprojError, float, 2, uFormat("[%s = 1] PnP reprojection error.", kVisEstimationType().c_str()));
|
||||||
RTABMAP_PARAM(Vis, PnPFlags, int, 0, uFormat("[%s = 1] PnP flags: 0=Iterative, 1=EPNP, 2=P3P", kVisEstimationType().c_str()));
|
RTABMAP_PARAM(Vis, PnPFlags, int, 0, uFormat("[%s = 1] PnP flags: 0=Iterative, 1=EPNP, 2=P3P", kVisEstimationType().c_str()));
|
||||||
#if defined(RTABMAP_G2O) || defined(RTABMAP_ORB_SLAM2)
|
#if defined(RTABMAP_G2O) || defined(RTABMAP_ORB_SLAM)
|
||||||
RTABMAP_PARAM(Vis, PnPRefineIterations, int, 0, uFormat("[%s = 1] Refine iterations. Set to 0 if \"%s\" is also used.", kVisEstimationType().c_str(), kVisBundleAdjustment().c_str()));
|
RTABMAP_PARAM(Vis, PnPRefineIterations, int, 0, uFormat("[%s = 1] Refine iterations. Set to 0 if \"%s\" is also used.", kVisEstimationType().c_str(), kVisBundleAdjustment().c_str()));
|
||||||
#else
|
#else
|
||||||
RTABMAP_PARAM(Vis, PnPRefineIterations, int, 1, uFormat("[%s = 1] Refine iterations. Set to 0 if \"%s\" is also used.", kVisEstimationType().c_str(), kVisBundleAdjustment().c_str()));
|
RTABMAP_PARAM(Vis, PnPRefineIterations, int, 1, uFormat("[%s = 1] Refine iterations. Set to 0 if \"%s\" is also used.", kVisEstimationType().c_str(), kVisBundleAdjustment().c_str()));
|
||||||
@@ -586,9 +596,9 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(Vis, Iterations, int, 300, "Maximum iterations to compute the transform.");
|
RTABMAP_PARAM(Vis, Iterations, int, 300, "Maximum iterations to compute the transform.");
|
||||||
#if CV_MAJOR_VERSION > 2 && !defined(HAVE_OPENCV_XFEATURES2D)
|
#if CV_MAJOR_VERSION > 2 && !defined(HAVE_OPENCV_XFEATURES2D)
|
||||||
// OpenCV>2 without xFeatures2D module doesn't have BRIEF
|
// OpenCV>2 without xFeatures2D module doesn't have BRIEF
|
||||||
RTABMAP_PARAM(Vis, FeatureType, int, 8, "0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB 9=KAZE 10=ORB-OCTREE 11=SuperPoint Torch.");
|
RTABMAP_PARAM(Vis, FeatureType, int, 8, "0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB 9=KAZE 10=ORB-OCTREE 11=SuperPoint 12=SURF/FREAK 13=GFTT/DAISY 14=SURF/DAISY 15=PyDetector");
|
||||||
#else
|
#else
|
||||||
RTABMAP_PARAM(Vis, FeatureType, int, 6, "0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB 9=KAZE 10=ORB-OCTREE 11=SuperPoint Torch.");
|
RTABMAP_PARAM(Vis, FeatureType, int, 6, "0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB 9=KAZE 10=ORB-OCTREE 11=SuperPoint 12=SURF/FREAK 13=GFTT/DAISY 14=SURF/DAISY 15=PyDetector");
|
||||||
#endif
|
#endif
|
||||||
RTABMAP_PARAM(Vis, MaxFeatures, int, 1000, "0 no limits.");
|
RTABMAP_PARAM(Vis, MaxFeatures, int, 1000, "0 no limits.");
|
||||||
RTABMAP_PARAM(Vis, MaxDepth, float, 0, "Max depth of the features (0 means no limit).");
|
RTABMAP_PARAM(Vis, MaxDepth, float, 0, "Max depth of the features (0 means no limit).");
|
||||||
@@ -602,21 +612,21 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(Vis, GridCols, int, 1, uFormat("Number of columns of the grid used to extract uniformly \"%s / grid cells\" features from each cell.", kVisMaxFeatures().c_str()));
|
RTABMAP_PARAM(Vis, GridCols, int, 1, uFormat("Number of columns of the grid used to extract uniformly \"%s / grid cells\" features from each cell.", kVisMaxFeatures().c_str()));
|
||||||
RTABMAP_PARAM(Vis, CorType, int, 0, "Correspondences computation approach: 0=Features Matching, 1=Optical Flow");
|
RTABMAP_PARAM(Vis, CorType, int, 0, "Correspondences computation approach: 0=Features Matching, 1=Optical Flow");
|
||||||
RTABMAP_PARAM(Vis, CorNNType, int, 1, uFormat("[%s=0] kNNFlannNaive=0, kNNFlannKdTree=1, kNNFlannLSH=2, kNNBruteForce=3, kNNBruteForceGPU=4, BruteForceCrossCheck=5, SuperGlue=6, GMS=7. Used for features matching approach.", kVisCorType().c_str()));
|
RTABMAP_PARAM(Vis, CorNNType, int, 1, uFormat("[%s=0] kNNFlannNaive=0, kNNFlannKdTree=1, kNNFlannLSH=2, kNNBruteForce=3, kNNBruteForceGPU=4, BruteForceCrossCheck=5, SuperGlue=6, GMS=7. Used for features matching approach.", kVisCorType().c_str()));
|
||||||
RTABMAP_PARAM(Vis, CorNNDR, float, 0.6, uFormat("[%s=0] NNDR: nearest neighbor distance ratio. Used for knn features matching approach.", kVisCorType().c_str()));
|
RTABMAP_PARAM(Vis, CorNNDR, float, 0.8, uFormat("[%s=0] NNDR: nearest neighbor distance ratio. Used for knn features matching approach.", kVisCorType().c_str()));
|
||||||
RTABMAP_PARAM(Vis, CorGuessWinSize, int, 20, uFormat("[%s=0] Matching window size (pixels) around projected points when a guess transform is provided to find correspondences. 0 means disabled.", kVisCorType().c_str()));
|
RTABMAP_PARAM(Vis, CorGuessWinSize, int, 40, uFormat("[%s=0] Matching window size (pixels) around projected points when a guess transform is provided to find correspondences. 0 means disabled.", kVisCorType().c_str()));
|
||||||
RTABMAP_PARAM(Vis, CorGuessMatchToProjection, bool, false, uFormat("[%s=0] Match frame's corners to source's projected points (when guess transform is provided) instead of projected points to frame's corners.", kVisCorType().c_str()));
|
RTABMAP_PARAM(Vis, CorGuessMatchToProjection, bool, false, uFormat("[%s=0] Match frame's corners to source's projected points (when guess transform is provided) instead of projected points to frame's corners.", kVisCorType().c_str()));
|
||||||
RTABMAP_PARAM(Vis, CorFlowWinSize, int, 16, uFormat("[%s=1] See cv::calcOpticalFlowPyrLK(). Used for optical flow approach.", kVisCorType().c_str()));
|
RTABMAP_PARAM(Vis, CorFlowWinSize, int, 16, uFormat("[%s=1] See cv::calcOpticalFlowPyrLK(). Used for optical flow approach.", kVisCorType().c_str()));
|
||||||
RTABMAP_PARAM(Vis, CorFlowIterations, int, 30, uFormat("[%s=1] See cv::calcOpticalFlowPyrLK(). Used for optical flow approach.", kVisCorType().c_str()));
|
RTABMAP_PARAM(Vis, CorFlowIterations, int, 30, uFormat("[%s=1] See cv::calcOpticalFlowPyrLK(). Used for optical flow approach.", kVisCorType().c_str()));
|
||||||
RTABMAP_PARAM(Vis, CorFlowEps, float, 0.01, uFormat("[%s=1] See cv::calcOpticalFlowPyrLK(). Used for optical flow approach.", kVisCorType().c_str()));
|
RTABMAP_PARAM(Vis, CorFlowEps, float, 0.01, uFormat("[%s=1] See cv::calcOpticalFlowPyrLK(). Used for optical flow approach.", kVisCorType().c_str()));
|
||||||
RTABMAP_PARAM(Vis, CorFlowMaxLevel, int, 3, uFormat("[%s=1] See cv::calcOpticalFlowPyrLK(). Used for optical flow approach.", kVisCorType().c_str()));
|
RTABMAP_PARAM(Vis, CorFlowMaxLevel, int, 3, uFormat("[%s=1] See cv::calcOpticalFlowPyrLK(). Used for optical flow approach.", kVisCorType().c_str()));
|
||||||
#if defined(RTABMAP_G2O) || defined(RTABMAP_ORB_SLAM2)
|
#if defined(RTABMAP_G2O) || defined(RTABMAP_ORB_SLAM)
|
||||||
RTABMAP_PARAM(Vis, BundleAdjustment, int, 1, "Optimization with bundle adjustment: 0=disabled, 1=g2o, 2=cvsba, 3=Ceres.");
|
RTABMAP_PARAM(Vis, BundleAdjustment, int, 1, "Optimization with bundle adjustment: 0=disabled, 1=g2o, 2=cvsba, 3=Ceres.");
|
||||||
#else
|
#else
|
||||||
RTABMAP_PARAM(Vis, BundleAdjustment, int, 0, "Optimization with bundle adjustment: 0=disabled, 1=g2o, 2=cvsba, 3=Ceres.");
|
RTABMAP_PARAM(Vis, BundleAdjustment, int, 0, "Optimization with bundle adjustment: 0=disabled, 1=g2o, 2=cvsba, 3=Ceres.");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Features matching approaches
|
// Features matching approaches
|
||||||
RTABMAP_PARAM_STR(PyMatcher, Path, "", "Path to python script file (see available ones in rtabmap/corelib/src/pymatcher/*). See the header to see where the script should be copied.");
|
RTABMAP_PARAM_STR(PyMatcher, Path, "", "Path to python script file (see available ones in rtabmap/corelib/src/python/*). See the header to see where the script should be copied.");
|
||||||
RTABMAP_PARAM(PyMatcher, Iterations, int, 20, "Sinkhorn iterations. Used by SuperGlue.");
|
RTABMAP_PARAM(PyMatcher, Iterations, int, 20, "Sinkhorn iterations. Used by SuperGlue.");
|
||||||
RTABMAP_PARAM(PyMatcher, Threshold, float, 0.2, "Used by SuperGlue.");
|
RTABMAP_PARAM(PyMatcher, Threshold, float, 0.2, "Used by SuperGlue.");
|
||||||
RTABMAP_PARAM(PyMatcher, Cuda, bool, true, "Used by SuperGlue.");
|
RTABMAP_PARAM(PyMatcher, Cuda, bool, true, "Used by SuperGlue.");
|
||||||
@@ -627,9 +637,14 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(GMS, ThresholdFactor, double, 6.0, "The higher, the less matches.");
|
RTABMAP_PARAM(GMS, ThresholdFactor, double, 6.0, "The higher, the less matches.");
|
||||||
|
|
||||||
// ICP registration parameters
|
// ICP registration parameters
|
||||||
|
#ifdef RTABMAP_POINTMATCHER
|
||||||
|
RTABMAP_PARAM(Icp, Strategy, int, 1, "ICP implementation: 0=Point Cloud Library, 1=libpointmatcher, 2=CCCoreLib (CloudCompare).");
|
||||||
|
#else
|
||||||
|
RTABMAP_PARAM(Icp, Strategy, int, 0, "ICP implementation: 0=Point Cloud Library, 1=libpointmatcher, 2=CCCoreLib (CloudCompare).");
|
||||||
|
#endif
|
||||||
RTABMAP_PARAM(Icp, MaxTranslation, float, 0.2, "Maximum ICP translation correction accepted (m).");
|
RTABMAP_PARAM(Icp, MaxTranslation, float, 0.2, "Maximum ICP translation correction accepted (m).");
|
||||||
RTABMAP_PARAM(Icp, MaxRotation, float, 0.78, "Maximum ICP rotation correction accepted (rad).");
|
RTABMAP_PARAM(Icp, MaxRotation, float, 0.78, "Maximum ICP rotation correction accepted (rad).");
|
||||||
RTABMAP_PARAM(Icp, VoxelSize, float, 0.0, "Uniform sampling voxel size (0=disabled).");
|
RTABMAP_PARAM(Icp, VoxelSize, float, 0.05, "Uniform sampling voxel size (0=disabled).");
|
||||||
RTABMAP_PARAM(Icp, DownsamplingStep, int, 1, "Downsampling step size (1=no sampling). This is done before uniform sampling.");
|
RTABMAP_PARAM(Icp, DownsamplingStep, int, 1, "Downsampling step size (1=no sampling). This is done before uniform sampling.");
|
||||||
RTABMAP_PARAM(Icp, RangeMin, float, 0, "Minimum range filtering (0=disabled).");
|
RTABMAP_PARAM(Icp, RangeMin, float, 0, "Minimum range filtering (0=disabled).");
|
||||||
RTABMAP_PARAM(Icp, RangeMax, float, 0, "Maximum range filtering (0=disabled).");
|
RTABMAP_PARAM(Icp, RangeMax, float, 0, "Maximum range filtering (0=disabled).");
|
||||||
@@ -641,6 +656,7 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(Icp, Iterations, int, 30, "Max iterations.");
|
RTABMAP_PARAM(Icp, Iterations, int, 30, "Max iterations.");
|
||||||
RTABMAP_PARAM(Icp, Epsilon, float, 0, "Set the transformation epsilon (maximum allowable difference between two consecutive transformations) in order for an optimization to be considered as having converged to the final solution.");
|
RTABMAP_PARAM(Icp, Epsilon, float, 0, "Set the transformation epsilon (maximum allowable difference between two consecutive transformations) in order for an optimization to be considered as having converged to the final solution.");
|
||||||
RTABMAP_PARAM(Icp, CorrespondenceRatio, float, 0.1, "Ratio of matching correspondences to accept the transform.");
|
RTABMAP_PARAM(Icp, CorrespondenceRatio, float, 0.1, "Ratio of matching correspondences to accept the transform.");
|
||||||
|
RTABMAP_PARAM(Icp, Force4DoF, bool, false, uFormat("Limit ICP to x, y, z and yaw DoF. Available if %s > 0.", kIcpStrategy().c_str()));
|
||||||
#ifdef RTABMAP_POINTMATCHER
|
#ifdef RTABMAP_POINTMATCHER
|
||||||
RTABMAP_PARAM(Icp, PointToPlane, bool, true, "Use point to plane ICP.");
|
RTABMAP_PARAM(Icp, PointToPlane, bool, true, "Use point to plane ICP.");
|
||||||
#else
|
#else
|
||||||
@@ -648,18 +664,20 @@ class RTABMAP_EXP Parameters
|
|||||||
#endif
|
#endif
|
||||||
RTABMAP_PARAM(Icp, PointToPlaneK, int, 5, "Number of neighbors to compute normals for point to plane if the cloud doesn't have already normals.");
|
RTABMAP_PARAM(Icp, PointToPlaneK, int, 5, "Number of neighbors to compute normals for point to plane if the cloud doesn't have already normals.");
|
||||||
RTABMAP_PARAM(Icp, PointToPlaneRadius, float, 1.0, "Search radius to compute normals for point to plane if the cloud doesn't have already normals.");
|
RTABMAP_PARAM(Icp, PointToPlaneRadius, float, 1.0, "Search radius to compute normals for point to plane if the cloud doesn't have already normals.");
|
||||||
RTABMAP_PARAM(Icp, PointToPlaneMinComplexity, float, 0.02, "Minimum structural complexity (0.0=low, 1.0=high) of the scan to do point to plane registration, otherwise point to point registration is done instead.");
|
RTABMAP_PARAM(Icp, PointToPlaneGroundNormalsUp, float, 0.0, "Invert normals on ground if they are pointing down (useful for ring-like 3D LiDARs). 0 means disabled, 1 means only normals perfectly aligned with -z axis. This is only done with 3D scans.");
|
||||||
|
RTABMAP_PARAM(Icp, PointToPlaneMinComplexity, float, 0.02, uFormat("Minimum structural complexity (0.0=low, 1.0=high) of the scan to do PointToPlane registration, otherwise PointToPoint registration is done instead and strategy from %s is used. This check is done only when %s=true.", kIcpPointToPlaneLowComplexityStrategy().c_str(), kIcpPointToPlane().c_str()));
|
||||||
|
RTABMAP_PARAM(Icp, PointToPlaneLowComplexityStrategy, int, 1, uFormat("If structural complexity is below %s: set to 0 to so that the transform is automatically rejected, set to 1 to limit ICP correction in axes with most constraints (e.g., for a corridor-like environment, the resulting transform will be limited in y and yaw, x will taken from the guess), set to 2 to accept \"as is\" the transform computed by PointToPoint.", kIcpPointToPlaneMinComplexity().c_str()));
|
||||||
|
RTABMAP_PARAM(Icp, OutlierRatio, float, 0.85, uFormat("Outlier ratio used with %s>0. For libpointmatcher, this parameter set TrimmedDistOutlierFilter/ratio for convenience when configuration file is not set. For CCCoreLib, this parameter set the \"finalOverlapRatio\". The value should be between 0 and 1.", kIcpStrategy().c_str()));
|
||||||
|
|
||||||
// libpointmatcher
|
// libpointmatcher
|
||||||
#ifdef RTABMAP_POINTMATCHER
|
|
||||||
RTABMAP_PARAM(Icp, PM, bool, true, "Use libpointmatcher for ICP registration instead of PCL's implementation.");
|
|
||||||
#else
|
|
||||||
RTABMAP_PARAM(Icp, PM, bool, false, "Use libpointmatcher for ICP registration instead of PCL's implementation.");
|
|
||||||
#endif
|
|
||||||
RTABMAP_PARAM_STR(Icp, PMConfig, "", uFormat("Configuration file (*.yaml) used by libpointmatcher. Note that data filters set for libpointmatcher are done after filtering done by rtabmap (i.e., %s, %s), so make sure to disable those in rtabmap if you want to use only those from libpointmatcher. Parameters %s, %s and %s are also ignored if configuration file is set.", kIcpVoxelSize().c_str(), kIcpDownsamplingStep().c_str(), kIcpIterations().c_str(), kIcpEpsilon().c_str(), kIcpMaxCorrespondenceDistance().c_str()).c_str());
|
RTABMAP_PARAM_STR(Icp, PMConfig, "", uFormat("Configuration file (*.yaml) used by libpointmatcher. Note that data filters set for libpointmatcher are done after filtering done by rtabmap (i.e., %s, %s), so make sure to disable those in rtabmap if you want to use only those from libpointmatcher. Parameters %s, %s and %s are also ignored if configuration file is set.", kIcpVoxelSize().c_str(), kIcpDownsamplingStep().c_str(), kIcpIterations().c_str(), kIcpEpsilon().c_str(), kIcpMaxCorrespondenceDistance().c_str()).c_str());
|
||||||
RTABMAP_PARAM(Icp, PMMatcherKnn, int, 1, "KDTreeMatcher/knn: number of nearest neighbors to consider it the reference. For convenience when configuration file is not set.");
|
RTABMAP_PARAM(Icp, PMMatcherKnn, int, 1, "KDTreeMatcher/knn: number of nearest neighbors to consider it the reference. For convenience when configuration file is not set.");
|
||||||
RTABMAP_PARAM(Icp, PMMatcherEpsilon, float, 0.0, "KDTreeMatcher/epsilon: approximation to use for the nearest-neighbor search. For convenience when configuration file is not set.");
|
RTABMAP_PARAM(Icp, PMMatcherEpsilon, float, 0.0, "KDTreeMatcher/epsilon: approximation to use for the nearest-neighbor search. For convenience when configuration file is not set.");
|
||||||
RTABMAP_PARAM(Icp, PMOutlierRatio, float, 0.95, "TrimmedDistOutlierFilter/ratio: For convenience when configuration file is not set. For kinect-like point cloud, use 0.65.");
|
RTABMAP_PARAM(Icp, PMMatcherIntensity, bool, false, uFormat("KDTreeMatcher: among nearest neighbors, keep only the one with the most similar intensity. This only work with %s>1.", kIcpPMMatcherKnn().c_str()));
|
||||||
|
|
||||||
|
RTABMAP_PARAM(Icp, CCSamplingLimit, unsigned int, 50000, "Maximum number of points per cloud (they are randomly resampled below this limit otherwise).");
|
||||||
|
RTABMAP_PARAM(Icp, CCFilterOutFarthestPoints, bool, false, "If true, the algorithm will automatically ignore farthest points from the reference, for better convergence.");
|
||||||
|
RTABMAP_PARAM(Icp, CCMaxFinalRMS, float, 0.2, "Maximum final RMS error.");
|
||||||
|
|
||||||
// Stereo disparity
|
// Stereo disparity
|
||||||
RTABMAP_PARAM(Stereo, WinWidth, int, 15, "Window width.");
|
RTABMAP_PARAM(Stereo, WinWidth, int, 15, "Window width.");
|
||||||
@@ -740,6 +758,7 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(GridGlobal, MinSize, float, 0.0, "Minimum map size (m).");
|
RTABMAP_PARAM(GridGlobal, MinSize, float, 0.0, "Minimum map size (m).");
|
||||||
RTABMAP_PARAM(GridGlobal, Eroded, bool, false, "Erode obstacle cells.");
|
RTABMAP_PARAM(GridGlobal, Eroded, bool, false, "Erode obstacle cells.");
|
||||||
RTABMAP_PARAM(GridGlobal, MaxNodes, int, 0, "Maximum nodes assembled in the map starting from the last node (0=unlimited).");
|
RTABMAP_PARAM(GridGlobal, MaxNodes, int, 0, "Maximum nodes assembled in the map starting from the last node (0=unlimited).");
|
||||||
|
RTABMAP_PARAM(GridGlobal, AltitudeDelta, float, 0, "Assemble only nodes that have the same altitude of +-delta meters of the current pose (0=disabled). This is used to generate 2D occupancy grid based on the current altitude (e.g., multi-floor building).");
|
||||||
RTABMAP_PARAM(GridGlobal, OccupancyThr, float, 0.5, "Occupancy threshold (value between 0 and 1).");
|
RTABMAP_PARAM(GridGlobal, OccupancyThr, float, 0.5, "Occupancy threshold (value between 0 and 1).");
|
||||||
RTABMAP_PARAM(GridGlobal, ProbHit, float, 0.7, "Probability of a hit (value between 0.5 and 1).");
|
RTABMAP_PARAM(GridGlobal, ProbHit, float, 0.7, "Probability of a hit (value between 0.5 and 1).");
|
||||||
RTABMAP_PARAM(GridGlobal, ProbMiss, float, 0.4, "Probability of a miss (value between 0 and 0.5).");
|
RTABMAP_PARAM(GridGlobal, ProbMiss, float, 0.4, "Probability of a miss (value between 0 and 0.5).");
|
||||||
@@ -752,6 +771,8 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(Marker, VarianceLinear, float, 0.001, "Linear variance to set on marker detections.");
|
RTABMAP_PARAM(Marker, VarianceLinear, float, 0.001, "Linear variance to set on marker detections.");
|
||||||
RTABMAP_PARAM(Marker, VarianceAngular, float, 0.01, "Angular variance to set on marker detections. Set to >=9999 to use only position (xyz) constraint in graph optimization.");
|
RTABMAP_PARAM(Marker, VarianceAngular, float, 0.01, "Angular variance to set on marker detections. Set to >=9999 to use only position (xyz) constraint in graph optimization.");
|
||||||
RTABMAP_PARAM(Marker, CornerRefinementMethod, int, 0, "Corner refinement method (0: None, 1: Subpixel, 2:contour, 3: AprilTag2). For OpenCV <3.3.0, this is \"doCornerRefinement\" parameter: set 0 for false and 1 for true.");
|
RTABMAP_PARAM(Marker, CornerRefinementMethod, int, 0, "Corner refinement method (0: None, 1: Subpixel, 2:contour, 3: AprilTag2). For OpenCV <3.3.0, this is \"doCornerRefinement\" parameter: set 0 for false and 1 for true.");
|
||||||
|
RTABMAP_PARAM(Marker, MaxRange, float, 0.0, "Maximum range in which markers will be detected. <=0 for unlimited range.");
|
||||||
|
RTABMAP_PARAM(Marker, MinRange, float, 0.0, "Miniminum range in which markers will be detected. <=0 for unlimited range.");
|
||||||
|
|
||||||
RTABMAP_PARAM(ImuFilter, MadgwickGain, double, 0.1, "Gain of the filter. Higher values lead to faster convergence but more noise. Lower values lead to slower convergence but smoother signal, belongs in [0, 1].");
|
RTABMAP_PARAM(ImuFilter, MadgwickGain, double, 0.1, "Gain of the filter. Higher values lead to faster convergence but more noise. Lower values lead to slower convergence but smoother signal, belongs in [0, 1].");
|
||||||
RTABMAP_PARAM(ImuFilter, MadgwickZeta, double, 0.0, "Gyro drift gain (approx. rad/s), belongs in [-1, 1].");
|
RTABMAP_PARAM(ImuFilter, MadgwickZeta, double, 0.0, "Gyro drift gain (approx. rad/s), belongs in [-1, 1].");
|
||||||
@@ -839,4 +860,3 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* PARAMETERS_H_ */
|
#endif /* PARAMETERS_H_ */
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* PythonInterface.h
|
||||||
|
*
|
||||||
|
* Created on: Jan. 14, 2021
|
||||||
|
* Author: mathieu
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CORELIB_SRC_PYTHON_PYTHONINTERFACE_H_
|
||||||
|
#define CORELIB_SRC_PYTHON_PYTHONINTERFACE_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <rtabmap/utilite/UMutex.h>
|
||||||
|
#include <Python.h>
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class PythonInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PythonInterface();
|
||||||
|
virtual ~PythonInterface();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::string getTraceback(); // should be called between lock() and unlock()
|
||||||
|
void lock();
|
||||||
|
void unlock();
|
||||||
|
|
||||||
|
private:
|
||||||
|
static UMutex mutex_;
|
||||||
|
static int refCount_;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static PyThreadState * mainThreadState_;
|
||||||
|
static unsigned long mainThreadID_;
|
||||||
|
PyThreadState * threadState_;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CORELIB_SRC_PYTHON_PYTHONINTERFACE_H_ */
|
||||||
@@ -56,6 +56,7 @@ protected:
|
|||||||
virtual float getMinGeometryCorrespondencesRatioImpl() const {return _correspondenceRatio;}
|
virtual float getMinGeometryCorrespondencesRatioImpl() const {return _correspondenceRatio;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
int _strategy;
|
||||||
float _maxTranslation;
|
float _maxTranslation;
|
||||||
float _maxRotation;
|
float _maxRotation;
|
||||||
float _voxelSize;
|
float _voxelSize;
|
||||||
@@ -66,16 +67,24 @@ private:
|
|||||||
int _maxIterations;
|
int _maxIterations;
|
||||||
float _epsilon;
|
float _epsilon;
|
||||||
float _correspondenceRatio;
|
float _correspondenceRatio;
|
||||||
|
bool _force4DoF;
|
||||||
bool _pointToPlane;
|
bool _pointToPlane;
|
||||||
int _pointToPlaneK;
|
int _pointToPlaneK;
|
||||||
float _pointToPlaneRadius;
|
float _pointToPlaneRadius;
|
||||||
|
float _pointToPlaneGroundNormalsUp;
|
||||||
float _pointToPlaneMinComplexity;
|
float _pointToPlaneMinComplexity;
|
||||||
bool _libpointmatcher;
|
int _pointToPlaneLowComplexityStrategy;
|
||||||
std::string _libpointmatcherConfig;
|
std::string _libpointmatcherConfig;
|
||||||
int _libpointmatcherKnn;
|
int _libpointmatcherKnn;
|
||||||
float _libpointmatcherEpsilon;
|
float _libpointmatcherEpsilon;
|
||||||
float _libpointmatcherOutlierRatio;
|
bool _libpointmatcherIntensity;
|
||||||
|
float _outlierRatio;
|
||||||
|
unsigned int _ccSamplingLimit;
|
||||||
|
bool _ccFilterOutFarthestPoints;
|
||||||
|
double _ccMaxFinalRMS;
|
||||||
|
|
||||||
void * _libpointmatcherICP;
|
void * _libpointmatcherICP;
|
||||||
|
void * _libpointmatcherICPFilters;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ public:
|
|||||||
|
|
||||||
// RegistrationVis
|
// RegistrationVis
|
||||||
int inliers;
|
int inliers;
|
||||||
|
float inliersRatio;
|
||||||
float inliersMeanDistance;
|
float inliersMeanDistance;
|
||||||
float inliersDistribution;
|
float inliersDistribution;
|
||||||
std::vector<int> inliersIDs;
|
std::vector<int> inliersIDs;
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ namespace rtabmap {
|
|||||||
|
|
||||||
class Feature2D;
|
class Feature2D;
|
||||||
|
|
||||||
#ifdef RTABMAP_PYMATCHER
|
#ifdef RTABMAP_PYTHON
|
||||||
class PyMatcher;
|
class PyMatcher;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ private:
|
|||||||
Feature2D * _detectorFrom;
|
Feature2D * _detectorFrom;
|
||||||
Feature2D * _detectorTo;
|
Feature2D * _detectorTo;
|
||||||
|
|
||||||
#ifdef RTABMAP_PYMATCHER
|
#ifdef RTABMAP_PYTHON
|
||||||
PyMatcher * _pyMatcher;
|
PyMatcher * _pyMatcher;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -136,11 +136,9 @@ public:
|
|||||||
std::map<int, int> getWeights() const;
|
std::map<int, int> getWeights() const;
|
||||||
int getTotalMemSize() const;
|
int getTotalMemSize() const;
|
||||||
double getLastProcessTime() const {return _lastProcessTime;};
|
double getLastProcessTime() const {return _lastProcessTime;};
|
||||||
std::multimap<int, cv::KeyPoint> getWords(int locationId) const;
|
|
||||||
bool isInSTM(int locationId) const;
|
bool isInSTM(int locationId) const;
|
||||||
bool isIDsGenerated() const;
|
bool isIDsGenerated() const;
|
||||||
const Statistics & getStatistics() const;
|
const Statistics & getStatistics() const;
|
||||||
//bool getMetricData(int locationId, cv::Mat & rgb, cv::Mat & depth, float & depthConstant, Transform & pose, Transform & localTransform) const;
|
|
||||||
const std::map<int, Transform> & getLocalOptimizedPoses() const {return _optimizedPoses;}
|
const std::map<int, Transform> & getLocalOptimizedPoses() const {return _optimizedPoses;}
|
||||||
const std::multimap<int, Link> & getLocalConstraints() const {return _constraints;}
|
const std::multimap<int, Link> & getLocalConstraints() const {return _constraints;}
|
||||||
Transform getPose(int locationId) const;
|
Transform getPose(int locationId) const;
|
||||||
@@ -198,13 +196,16 @@ public:
|
|||||||
bool withGrid = false,
|
bool withGrid = false,
|
||||||
bool withWords = true,
|
bool withWords = true,
|
||||||
bool withGlobalDescriptors = true) const;
|
bool withGlobalDescriptors = true) const;
|
||||||
|
std::map<int, Transform> getNodesInRadius(const Transform & pose, float radius); // If radius=0, RGBD/LocalRadius is used. Can return landmarks.
|
||||||
|
std::map<int, Transform> getNodesInRadius(int nodeId, float radius); // If nodeId==0, return poses around latest node. If radius=0, RGBD/LocalRadius is used. Can return landmarks and use landmark id (negative) as request.
|
||||||
int detectMoreLoopClosures(
|
int detectMoreLoopClosures(
|
||||||
float clusterRadius = 0.5f,
|
float clusterRadiusMax = 0.5f,
|
||||||
float clusterAngle = M_PI/6.0f,
|
float clusterAngle = M_PI/6.0f,
|
||||||
int iterations = 1,
|
int iterations = 1,
|
||||||
bool intraSession = true,
|
bool intraSession = true,
|
||||||
bool interSession = true,
|
bool interSession = true,
|
||||||
const ProgressState * state = 0);
|
const ProgressState * state = 0,
|
||||||
|
float clusterRadiusMin = 0.0f);
|
||||||
int refineLinks();
|
int refineLinks();
|
||||||
bool addLink(const Link & link);
|
bool addLink(const Link & link);
|
||||||
cv::Mat getInformation(const cv::Mat & covariance) const;
|
cv::Mat getInformation(const cv::Mat & covariance) const;
|
||||||
@@ -281,6 +282,7 @@ private:
|
|||||||
bool _proximityByTime;
|
bool _proximityByTime;
|
||||||
bool _proximityBySpace;
|
bool _proximityBySpace;
|
||||||
bool _scanMatchingIdsSavedInLinks;
|
bool _scanMatchingIdsSavedInLinks;
|
||||||
|
bool _loopClosureIdentityGuess;
|
||||||
float _localRadius;
|
float _localRadius;
|
||||||
float _localImmunizationRatio;
|
float _localImmunizationRatio;
|
||||||
int _proximityMaxGraphDepth;
|
int _proximityMaxGraphDepth;
|
||||||
@@ -300,7 +302,7 @@ private:
|
|||||||
int _pathStuckIterations;
|
int _pathStuckIterations;
|
||||||
float _pathLinearVelocity;
|
float _pathLinearVelocity;
|
||||||
float _pathAngularVelocity;
|
float _pathAngularVelocity;
|
||||||
bool _savedLocalizationIgnored;
|
bool _restartAtOrigin;
|
||||||
bool _loopCovLimited;
|
bool _loopCovLimited;
|
||||||
bool _loopGPS;
|
bool _loopGPS;
|
||||||
int _maxOdomCacheSize;
|
int _maxOdomCacheSize;
|
||||||
@@ -310,6 +312,7 @@ private:
|
|||||||
double _lastProcessTime;
|
double _lastProcessTime;
|
||||||
bool _someNodesHaveBeenTransferred;
|
bool _someNodesHaveBeenTransferred;
|
||||||
float _distanceTravelled;
|
float _distanceTravelled;
|
||||||
|
float _distanceTravelledSinceLastLocalization;
|
||||||
bool _optimizeFromGraphEndChanged;
|
bool _optimizeFromGraphEndChanged;
|
||||||
|
|
||||||
// Abstract classes containing all loop closure
|
// Abstract classes containing all loop closure
|
||||||
|
|||||||
@@ -275,7 +275,7 @@ public:
|
|||||||
void setLandmarks(const Landmarks & landmarks) {_landmarks = landmarks;}
|
void setLandmarks(const Landmarks & landmarks) {_landmarks = landmarks;}
|
||||||
const Landmarks & landmarks() const {return _landmarks;}
|
const Landmarks & landmarks() const {return _landmarks;}
|
||||||
|
|
||||||
long getMemoryUsed() const; // Return memory usage in Bytes
|
unsigned long getMemoryUsed() const; // Return memory usage in Bytes
|
||||||
/**
|
/**
|
||||||
* Clear compressed rgb/depth (left/right) images, compressed laser scan and compressed user data.
|
* Clear compressed rgb/depth (left/right) images, compressed laser scan and compressed user data.
|
||||||
* Raw data are kept is set.
|
* Raw data are kept is set.
|
||||||
|
|||||||
@@ -104,19 +104,18 @@ public:
|
|||||||
|
|
||||||
//visual words stuff
|
//visual words stuff
|
||||||
void removeAllWords();
|
void removeAllWords();
|
||||||
void removeWord(int wordId);
|
|
||||||
void changeWordsRef(int oldWordId, int activeWordId);
|
void changeWordsRef(int oldWordId, int activeWordId);
|
||||||
void setWords(const std::multimap<int, cv::KeyPoint> & words);
|
void setWords(const std::multimap<int, int> & words, const std::vector<cv::KeyPoint> & keypoints, const std::vector<cv::Point3f> & words3, const cv::Mat & descriptors);
|
||||||
bool isEnabled() const {return _enabled;}
|
bool isEnabled() const {return _enabled;}
|
||||||
void setEnabled(bool enabled) {_enabled = enabled;}
|
void setEnabled(bool enabled) {_enabled = enabled;}
|
||||||
const std::multimap<int, cv::KeyPoint> & getWords() const {return _words;}
|
const std::multimap<int, int> & getWords() const {return _words;}
|
||||||
|
const std::vector<cv::KeyPoint> & getWordsKpts() const {return _wordsKpts;}
|
||||||
int getInvalidWordsCount() const {return _invalidWordsCount;}
|
int getInvalidWordsCount() const {return _invalidWordsCount;}
|
||||||
const std::map<int, int> & getWordsChanged() const {return _wordsChanged;}
|
const std::map<int, int> & getWordsChanged() const {return _wordsChanged;}
|
||||||
const std::multimap<int, cv::Mat> & getWordsDescriptors() const {return _wordsDescriptors;}
|
const cv::Mat & getWordsDescriptors() const {return _wordsDescriptors;}
|
||||||
void setWordsDescriptors(const std::multimap<int, cv::Mat> & descriptors) {_wordsDescriptors = descriptors;}
|
void setWordsDescriptors(const cv::Mat & descriptors);
|
||||||
|
|
||||||
//metric stuff
|
//metric stuff
|
||||||
void setWords3(const std::multimap<int, cv::Point3f> & words3) {_words3 = words3;}
|
|
||||||
void setPose(const Transform & pose) {_pose = pose;}
|
void setPose(const Transform & pose) {_pose = pose;}
|
||||||
void setGroundTruthPose(const Transform & pose) {_groundTruthPose = pose;}
|
void setGroundTruthPose(const Transform & pose) {_groundTruthPose = pose;}
|
||||||
void setVelocity(float vx, float vy, float vz, float vroll, float vpitch, float vyaw) {
|
void setVelocity(float vx, float vy, float vz, float vroll, float vpitch, float vyaw) {
|
||||||
@@ -129,7 +128,7 @@ public:
|
|||||||
_velocity[5]=vyaw;
|
_velocity[5]=vyaw;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::multimap<int, cv::Point3f> & getWords3() const {return _words3;}
|
const std::vector<cv::Point3f> & getWords3() const {return _words3;}
|
||||||
const Transform & getPose() const {return _pose;}
|
const Transform & getPose() const {return _pose;}
|
||||||
cv::Mat getPoseCovariance() const;
|
cv::Mat getPoseCovariance() const;
|
||||||
const Transform & getGroundTruthPose() const {return _groundTruthPose;}
|
const Transform & getGroundTruthPose() const {return _groundTruthPose;}
|
||||||
@@ -138,7 +137,7 @@ public:
|
|||||||
SensorData & sensorData() {return _sensorData;}
|
SensorData & sensorData() {return _sensorData;}
|
||||||
const SensorData & sensorData() const {return _sensorData;}
|
const SensorData & sensorData() const {return _sensorData;}
|
||||||
|
|
||||||
long getMemoryUsed(bool withSensorData=true) const; // Return memory usage in Bytes
|
unsigned long getMemoryUsed(bool withSensorData=true) const; // Return memory usage in Bytes
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int _id;
|
int _id;
|
||||||
@@ -155,9 +154,10 @@ private:
|
|||||||
// Contains all words (Some can be duplicates -> if a word appears 2
|
// Contains all words (Some can be duplicates -> if a word appears 2
|
||||||
// times in the signature, it will be 2 times in this list)
|
// times in the signature, it will be 2 times in this list)
|
||||||
// Words match with the CvSeq keypoints and descriptors
|
// Words match with the CvSeq keypoints and descriptors
|
||||||
std::multimap<int, cv::KeyPoint> _words; // word <id, keypoint>
|
std::multimap<int, int> _words; // word <id, keypoint index>
|
||||||
std::multimap<int, cv::Point3f> _words3; // word <id, point> // in base_link frame (localTransform applied))
|
std::vector<cv::KeyPoint> _wordsKpts;
|
||||||
std::multimap<int, cv::Mat> _wordsDescriptors;
|
std::vector<cv::Point3f> _words3; // in base_link frame (localTransform applied))
|
||||||
|
cv::Mat _wordsDescriptors;
|
||||||
std::map<int, int> _wordsChanged; // <oldId, newId>
|
std::map<int, int> _wordsChanged; // <oldId, newId>
|
||||||
bool _enabled;
|
bool _enabled;
|
||||||
int _invalidWordsCount;
|
int _invalidWordsCount;
|
||||||
|
|||||||
@@ -65,7 +65,9 @@ class RTABMAP_EXP Statistics
|
|||||||
RTABMAP_STATS(Loop, Map_id,);
|
RTABMAP_STATS(Loop, Map_id,);
|
||||||
RTABMAP_STATS(Loop, Visual_words,);
|
RTABMAP_STATS(Loop, Visual_words,);
|
||||||
RTABMAP_STATS(Loop, Visual_inliers,);
|
RTABMAP_STATS(Loop, Visual_inliers,);
|
||||||
|
RTABMAP_STATS(Loop, Visual_inliers_ratio,);
|
||||||
RTABMAP_STATS(Loop, Visual_matches,);
|
RTABMAP_STATS(Loop, Visual_matches,);
|
||||||
|
RTABMAP_STATS(Loop, Distance_since_last_loc,);
|
||||||
RTABMAP_STATS(Loop, Last_id,);
|
RTABMAP_STATS(Loop, Last_id,);
|
||||||
RTABMAP_STATS(Loop, Optimization_max_error, m);
|
RTABMAP_STATS(Loop, Optimization_max_error, m);
|
||||||
RTABMAP_STATS(Loop, Optimization_max_error_ratio, );
|
RTABMAP_STATS(Loop, Optimization_max_error_ratio, );
|
||||||
@@ -148,6 +150,7 @@ class RTABMAP_EXP Statistics
|
|||||||
RTABMAP_STATS(Memory, Odometry_variance_lin,);
|
RTABMAP_STATS(Memory, Odometry_variance_lin,);
|
||||||
RTABMAP_STATS(Memory, Distance_travelled, m);
|
RTABMAP_STATS(Memory, Distance_travelled, m);
|
||||||
RTABMAP_STATS(Memory, RAM_usage, MB);
|
RTABMAP_STATS(Memory, RAM_usage, MB);
|
||||||
|
RTABMAP_STATS(Memory, RAM_estimated, MB);
|
||||||
RTABMAP_STATS(Memory, Triangulated_points, );
|
RTABMAP_STATS(Memory, Triangulated_points, );
|
||||||
|
|
||||||
RTABMAP_STATS(Timing, Memory_update, ms);
|
RTABMAP_STATS(Timing, Memory_update, ms);
|
||||||
@@ -170,6 +173,7 @@ class RTABMAP_EXP Statistics
|
|||||||
RTABMAP_STATS(Timing, Joining_trash, ms);
|
RTABMAP_STATS(Timing, Joining_trash, ms);
|
||||||
RTABMAP_STATS(Timing, Emptying_trash, ms);
|
RTABMAP_STATS(Timing, Emptying_trash, ms);
|
||||||
RTABMAP_STATS(Timing, Finalizing_statistics, ms);
|
RTABMAP_STATS(Timing, Finalizing_statistics, ms);
|
||||||
|
RTABMAP_STATS(Timing, RAM_estimation, ms);
|
||||||
|
|
||||||
RTABMAP_STATS(TimingMem, Pre_update, ms);
|
RTABMAP_STATS(TimingMem, Pre_update, ms);
|
||||||
RTABMAP_STATS(TimingMem, Signature_creation, ms);
|
RTABMAP_STATS(TimingMem, Signature_creation, ms);
|
||||||
|
|||||||
@@ -140,6 +140,8 @@ private:
|
|||||||
cv::Mat F_;
|
cv::Mat F_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
RTABMAP_EXP std::ostream& operator<<(std::ostream& os, const StereoCameraModel& model);
|
||||||
|
|
||||||
} // rtabmap
|
} // rtabmap
|
||||||
|
|
||||||
#endif /* STEREOCAMERAMODEL_H_ */
|
#endif /* STEREOCAMERAMODEL_H_ */
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ public:
|
|||||||
|
|
||||||
float theta() const;
|
float theta() const;
|
||||||
|
|
||||||
|
bool isInvertible() const;
|
||||||
Transform inverse() const;
|
Transform inverse() const;
|
||||||
Transform rotation() const;
|
Transform rotation() const;
|
||||||
Transform translation() const;
|
Transform translation() const;
|
||||||
|
|||||||
@@ -100,8 +100,9 @@ public:
|
|||||||
int getLastIndexedWordId() const;
|
int getLastIndexedWordId() const;
|
||||||
int getTotalActiveReferences() const {return _totalActiveReferences;}
|
int getTotalActiveReferences() const {return _totalActiveReferences;}
|
||||||
unsigned int getIndexedWordsCount() const;
|
unsigned int getIndexedWordsCount() const;
|
||||||
unsigned int getIndexMemoryUsed() const;
|
unsigned int getIndexMemoryUsed() const; // KB
|
||||||
void setNNStrategy(NNStrategy strategy);
|
unsigned long getMemoryUsed() const; //Bytes
|
||||||
|
bool setNNStrategy(NNStrategy strategy); // Return true if the search tree has been re-initialized
|
||||||
bool isIncremental() const {return _incrementalDictionary;}
|
bool isIncremental() const {return _incrementalDictionary;}
|
||||||
bool isIncrementalFlann() const {return _incrementalFlann;}
|
bool isIncrementalFlann() const {return _incrementalFlann;}
|
||||||
void setIncrementalDictionary();
|
void setIncrementalDictionary();
|
||||||
@@ -117,8 +118,8 @@ public:
|
|||||||
void deleteUnusedWords();
|
void deleteUnusedWords();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static cv::Mat convertBinTo32F(const cv::Mat & descriptorsIn);
|
static cv::Mat convertBinTo32F(const cv::Mat & descriptorsIn, bool byteToFloat = true);
|
||||||
static cv::Mat convert32FToBin(const cv::Mat & descriptorsIn);
|
static cv::Mat convert32FToBin(const cv::Mat & descriptorsIn, bool byteToFloat = true);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
int getNextId();
|
int getNextId();
|
||||||
@@ -131,6 +132,7 @@ private:
|
|||||||
bool _incrementalDictionary;
|
bool _incrementalDictionary;
|
||||||
bool _incrementalFlann;
|
bool _incrementalFlann;
|
||||||
float _rebalancingFactor;
|
float _rebalancingFactor;
|
||||||
|
bool _byteToFloat;
|
||||||
float _nndrRatio;
|
float _nndrRatio;
|
||||||
std::string _dictionaryPath; // a pre-computed dictionary (.txt or .db)
|
std::string _dictionaryPath; // a pre-computed dictionary (.txt or .db)
|
||||||
std::string _newDictionaryPath; // a pre-computed dictionary (.txt or .db)
|
std::string _newDictionaryPath; // a pre-computed dictionary (.txt or .db)
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ public:
|
|||||||
|
|
||||||
void addRef(int signatureId);
|
void addRef(int signatureId);
|
||||||
int removeAllRef(int signatureId);
|
int removeAllRef(int signatureId);
|
||||||
|
unsigned long getMemoryUsed() const;
|
||||||
|
|
||||||
int getTotalReferences() const {return _totalReferences;}
|
int getTotalReferences() const {return _totalReferences;}
|
||||||
int id() const {return _id;}
|
int id() const {return _id;}
|
||||||
|
|||||||
@@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2021, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the Universite de Sherbrooke nor the
|
||||||
|
names of its contributors may be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
||||||
|
|
||||||
|
#include "rtabmap/core/StereoCameraModel.h"
|
||||||
|
#include "rtabmap/core/Camera.h"
|
||||||
|
#include "rtabmap/core/Version.h"
|
||||||
|
|
||||||
|
#ifdef RTABMAP_DEPTHAI
|
||||||
|
#ifndef DEPTHAI_OPENCV_SUPPORT
|
||||||
|
#define DEPTHAI_OPENCV_SUPPORT
|
||||||
|
#endif
|
||||||
|
#include <depthai/depthai.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace rtabmap
|
||||||
|
{
|
||||||
|
|
||||||
|
class RTABMAP_EXP CameraDepthAI :
|
||||||
|
public Camera
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static bool available();
|
||||||
|
|
||||||
|
public:
|
||||||
|
CameraDepthAI(
|
||||||
|
const std::string & deviceSerial = "",
|
||||||
|
int resolution = 1, // 0=720p, 1=800p, 2=400p
|
||||||
|
float imageRate=0.0f,
|
||||||
|
const Transform & localTransform = CameraModel::opticalRotation());
|
||||||
|
virtual ~CameraDepthAI();
|
||||||
|
|
||||||
|
void setOutputDepth(bool enabled, int confidence = 200);
|
||||||
|
|
||||||
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
|
virtual bool isCalibrated() const;
|
||||||
|
virtual std::string getSerial() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
#ifdef RTABMAP_DEPTHAI
|
||||||
|
StereoCameraModel stereoModel_;
|
||||||
|
std::string deviceSerial_;
|
||||||
|
bool outputDepth_;
|
||||||
|
int depthConfidence_;
|
||||||
|
int resolution_;
|
||||||
|
std::shared_ptr<dai::Device> device_;
|
||||||
|
std::shared_ptr<dai::DataOutputQueue> leftQueue_;
|
||||||
|
std::shared_ptr<dai::DataOutputQueue> rightOrDepthQueue_;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace rtabmap
|
||||||
@@ -74,6 +74,11 @@ public:
|
|||||||
_syncImageRateWithStamps = syncImageRateWithStamps;
|
_syncImageRateWithStamps = syncImageRateWithStamps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setConfigForEachFrame(bool value)
|
||||||
|
{
|
||||||
|
_hasConfigForEachFrame = value;
|
||||||
|
}
|
||||||
|
|
||||||
void setScanPath(
|
void setScanPath(
|
||||||
const std::string & dir,
|
const std::string & dir,
|
||||||
int maxScanPts = 0,
|
int maxScanPts = 0,
|
||||||
@@ -116,6 +121,8 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
bool readPoses(
|
bool readPoses(
|
||||||
std::list<Transform> & outputPoses,
|
std::list<Transform> & outputPoses,
|
||||||
std::list<double> & stamps,
|
std::list<double> & stamps,
|
||||||
@@ -151,6 +158,7 @@ private:
|
|||||||
bool _depthFromScanFillHolesFromBorder;
|
bool _depthFromScanFillHolesFromBorder;
|
||||||
|
|
||||||
bool _filenamesAreTimestamps;
|
bool _filenamesAreTimestamps;
|
||||||
|
bool _hasConfigForEachFrame;
|
||||||
std::string _timestampsPath;
|
std::string _timestampsPath;
|
||||||
bool _syncImageRateWithStamps;
|
bool _syncImageRateWithStamps;
|
||||||
|
|
||||||
@@ -162,8 +170,10 @@ private:
|
|||||||
|
|
||||||
std::list<double> _stamps;
|
std::list<double> _stamps;
|
||||||
std::list<Transform> odometry_;
|
std::list<Transform> odometry_;
|
||||||
|
std::list<cv::Mat> covariances_;
|
||||||
std::list<Transform> groundTruth_;
|
std::list<Transform> groundTruth_;
|
||||||
CameraModel _model;
|
CameraModel _model;
|
||||||
|
std::list<CameraModel> _models;
|
||||||
|
|
||||||
UTimer _captureTimer;
|
UTimer _captureTimer;
|
||||||
double _captureDelay;
|
double _captureDelay;
|
||||||
|
|||||||
@@ -35,7 +35,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "rtabmap/utilite/UTimer.h"
|
#include "rtabmap/utilite/UTimer.h"
|
||||||
|
|
||||||
#ifdef RTABMAP_K4A
|
#ifdef RTABMAP_K4A
|
||||||
#include <k4a/k4atypes.h>
|
#include <k4a/k4atypes.h>
|
||||||
|
#include <k4arecord/playback.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace rtabmap
|
namespace rtabmap
|
||||||
@@ -72,15 +73,14 @@ private:
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
#ifdef RTABMAP_K4A
|
#ifdef RTABMAP_K4A
|
||||||
k4a_device_t device_;
|
k4a_device_t deviceHandle_;
|
||||||
k4a_device_configuration_t config_;
|
k4a_device_configuration_t config_;
|
||||||
k4a_calibration_t calibration_;
|
k4a_calibration_t calibration_;
|
||||||
k4a_transformation_t transformation_;
|
k4a_transformation_t transformationHandle_;
|
||||||
k4a_capture_t capture_;
|
k4a_capture_t captureHandle_;
|
||||||
|
k4a_playback_t playbackHandle_;
|
||||||
std::string serial_number_;
|
std::string serial_number_;
|
||||||
|
|
||||||
void* playbackHandle_;
|
|
||||||
void* transformationHandle_;
|
|
||||||
CameraModel model_;
|
CameraModel model_;
|
||||||
int deviceId_;
|
int deviceId_;
|
||||||
std::string fileName_;
|
std::string fileName_;
|
||||||
|
|||||||
@@ -48,8 +48,6 @@ public:
|
|||||||
virtual ~CameraRGBDImages();
|
virtual ~CameraRGBDImages();
|
||||||
|
|
||||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
virtual bool isCalibrated() const;
|
|
||||||
virtual std::string getSerial() const;
|
|
||||||
|
|
||||||
virtual void setStartIndex(int index) {CameraImages::setStartIndex(index);cameraDepth_.setStartIndex(index);} // negative means last
|
virtual void setStartIndex(int index) {CameraImages::setStartIndex(index);cameraDepth_.setStartIndex(index);} // negative means last
|
||||||
virtual void setMaxFrames(int value) {CameraImages::setMaxFrames(value);cameraDepth_.setMaxFrames(value);}
|
virtual void setMaxFrames(int value) {CameraImages::setMaxFrames(value);cameraDepth_.setMaxFrames(value);}
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <pcl/pcl_config.h>
|
#include <pcl/pcl_config.h>
|
||||||
|
|
||||||
#ifdef RTABMAP_REALSENSE2
|
#ifdef RTABMAP_REALSENSE2
|
||||||
|
#include <librealsense2/rs.hpp>
|
||||||
#include <librealsense2/hpp/rs_frame.hpp>
|
#include <librealsense2/hpp/rs_frame.hpp>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -75,6 +76,8 @@ public:
|
|||||||
void setEmitterEnabled(bool enabled);
|
void setEmitterEnabled(bool enabled);
|
||||||
void setIRFormat(bool enabled, bool useDepthInsteadOfRightImage);
|
void setIRFormat(bool enabled, bool useDepthInsteadOfRightImage);
|
||||||
void setResolution(int width, int height, int fps = 30);
|
void setResolution(int width, int height, int fps = 30);
|
||||||
|
void setDepthResolution(int width, int height, int fps = 30);
|
||||||
|
void setGlobalTimeSync(bool enabled);
|
||||||
void publishInterIMU(bool enabled);
|
void publishInterIMU(bool enabled);
|
||||||
void setDualMode(bool enabled, const Transform & extrinsics);
|
void setDualMode(bool enabled, const Transform & extrinsics);
|
||||||
void setJsonConfig(const std::string & json);
|
void setJsonConfig(const std::string & json);
|
||||||
@@ -84,6 +87,7 @@ public:
|
|||||||
|
|
||||||
#ifdef RTABMAP_REALSENSE2
|
#ifdef RTABMAP_REALSENSE2
|
||||||
private:
|
private:
|
||||||
|
void close();
|
||||||
void imu_callback(rs2::frame frame);
|
void imu_callback(rs2::frame frame);
|
||||||
void pose_callback(rs2::frame frame);
|
void pose_callback(rs2::frame frame);
|
||||||
void frame_callback(rs2::frame frame);
|
void frame_callback(rs2::frame frame);
|
||||||
@@ -93,7 +97,7 @@ private:
|
|||||||
Transform & pose,
|
Transform & pose,
|
||||||
unsigned int & poseConfidence,
|
unsigned int & poseConfidence,
|
||||||
IMU & imu,
|
IMU & imu,
|
||||||
int maxWaitTimeMs = 35) const;
|
int maxWaitTimeMs = 35);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -101,14 +105,14 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
#ifdef RTABMAP_REALSENSE2
|
#ifdef RTABMAP_REALSENSE2
|
||||||
rs2::context * ctx_;
|
rs2::context ctx_;
|
||||||
std::vector<rs2::device *> dev_;
|
std::vector<rs2::device> dev_;
|
||||||
std::string deviceId_;
|
std::string deviceId_;
|
||||||
rs2::syncer * syncer_;
|
rs2::syncer syncer_;
|
||||||
float depth_scale_meters_;
|
float depth_scale_meters_;
|
||||||
rs2_intrinsics * depthIntrinsics_;
|
rs2_intrinsics depthIntrinsics_;
|
||||||
rs2_intrinsics * rgbIntrinsics_;
|
rs2_intrinsics rgbIntrinsics_;
|
||||||
rs2_extrinsics * depthToRGBExtrinsics_;
|
rs2_extrinsics depthToRGBExtrinsics_;
|
||||||
cv::Mat depthBuffer_;
|
cv::Mat depthBuffer_;
|
||||||
cv::Mat rgbBuffer_;
|
cv::Mat rgbBuffer_;
|
||||||
CameraModel model_;
|
CameraModel model_;
|
||||||
@@ -121,6 +125,7 @@ private:
|
|||||||
UMutex imuMutex_;
|
UMutex imuMutex_;
|
||||||
double lastImuStamp_;
|
double lastImuStamp_;
|
||||||
bool clockSyncWarningShown_;
|
bool clockSyncWarningShown_;
|
||||||
|
bool imuGlobalSyncWarningShown_;
|
||||||
|
|
||||||
bool emitterEnabled_;
|
bool emitterEnabled_;
|
||||||
bool ir_;
|
bool ir_;
|
||||||
@@ -130,6 +135,10 @@ private:
|
|||||||
int cameraWidth_;
|
int cameraWidth_;
|
||||||
int cameraHeight_;
|
int cameraHeight_;
|
||||||
int cameraFps_;
|
int cameraFps_;
|
||||||
|
int cameraDepthWidth_;
|
||||||
|
int cameraDepthHeight_;
|
||||||
|
int cameraDepthFps_;
|
||||||
|
bool globalTimeSync_;
|
||||||
bool publishInterIMU_;
|
bool publishInterIMU_;
|
||||||
bool dualMode_;
|
bool dualMode_;
|
||||||
Transform dualExtrinsics_;
|
Transform dualExtrinsics_;
|
||||||
|
|||||||
@@ -70,6 +70,8 @@ public:
|
|||||||
virtual bool isCalibrated() const;
|
virtual bool isCalibrated() const;
|
||||||
virtual std::string getSerial() const;
|
virtual std::string getSerial() const;
|
||||||
|
|
||||||
|
void setResolution(int width, int height) {_width=width, _height=height;}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
@@ -84,6 +86,8 @@ private:
|
|||||||
CameraVideo::Source src_;
|
CameraVideo::Source src_;
|
||||||
int usbDevice_;
|
int usbDevice_;
|
||||||
int usbDevice2_;
|
int usbDevice2_;
|
||||||
|
int _width;
|
||||||
|
int _height;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
|||||||
+45
-28
@@ -25,42 +25,59 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef OBJDELETIONHANDLER_H_
|
#pragma once
|
||||||
#define OBJDELETIONHANDLER_H_
|
|
||||||
|
|
||||||
#include "rtabmap/utilite/UEventsHandler.h"
|
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
||||||
#include "rtabmap/utilite/UEvent.h"
|
|
||||||
#include <QtCore/QObject>
|
|
||||||
|
|
||||||
class ObjDeletionHandler : public QObject, public UEventsHandler
|
#include "rtabmap/core/StereoCameraModel.h"
|
||||||
|
#include "rtabmap/core/Camera.h"
|
||||||
|
#include "rtabmap/core/Version.h"
|
||||||
|
|
||||||
|
namespace sl_oc {
|
||||||
|
namespace video {
|
||||||
|
class VideoCapture;
|
||||||
|
}
|
||||||
|
namespace sensors {
|
||||||
|
class SensorCapture;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace rtabmap
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
class ZedOCThread;
|
||||||
|
|
||||||
|
class RTABMAP_EXP CameraStereoZedOC :
|
||||||
|
public Camera
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static bool available();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ObjDeletionHandler(int watchedId, QObject * receiver = 0, const char * member = 0) : _watchedId(watchedId)
|
CameraStereoZedOC(
|
||||||
{
|
int deviceId,
|
||||||
if(receiver && member)
|
int resolution = 3, // 0=HD2K, 1=HD1080, 2=HD720, 3=VGA
|
||||||
{
|
float imageRate=0.0f,
|
||||||
connect(this, SIGNAL(objDeletionEventReceived(int)), receiver, member);
|
const Transform & localTransform = CameraModel::opticalRotation());
|
||||||
}
|
virtual ~CameraStereoZedOC();
|
||||||
}
|
|
||||||
virtual ~ObjDeletionHandler() {}
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
void objDeletionEventReceived(int);
|
virtual bool isCalibrated() const;
|
||||||
|
virtual std::string getSerial() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool handleEvent(UEvent * event)
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
{
|
|
||||||
if(event->getClassName().compare("UObjDeletedEvent") == 0 &&
|
|
||||||
event->getCode() == _watchedId)
|
|
||||||
{
|
|
||||||
Q_EMIT objDeletionEventReceived(_watchedId);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
private:
|
private:
|
||||||
int _watchedId;
|
#ifdef RTABMAP_ZEDOC
|
||||||
|
sl_oc::video::VideoCapture * zed_;
|
||||||
|
sl_oc::sensors::SensorCapture * sensors_;
|
||||||
|
ZedOCThread * imuThread_;
|
||||||
|
StereoCameraModel stereoModel_;
|
||||||
|
int usbDevice_;
|
||||||
|
int resolution_;
|
||||||
|
uint64_t lastStamp_;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* OBJDELETIONHANDLER_H_ */
|
|
||||||
|
} // namespace rtabmap
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user