mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-08 12:30:20 +08:00
Compare commits
192
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cbbe7a6b82 | ||
|
|
bc724a2125 | ||
|
|
1a3beebcbb | ||
|
|
a9dcc52d4c | ||
|
|
9f464db7c9 | ||
|
|
1dddb350b9 | ||
|
|
468f6e6f28 | ||
|
|
f29676deb0 | ||
|
|
6f34498651 | ||
|
|
bb95cc081a | ||
|
|
4756474367 | ||
|
|
49aa566613 | ||
|
|
a9146f5be6 | ||
|
|
27ca7ec058 | ||
|
|
8d0692eab0 | ||
|
|
afe8aadff1 | ||
|
|
440e143d87 | ||
|
|
72833c89bb | ||
|
|
f04067fa16 | ||
|
|
c1ef13a8d6 | ||
|
|
37f8fa63c5 | ||
|
|
0cf2e45c81 | ||
|
|
f48db0ee51 | ||
|
|
2314c4dfa5 | ||
|
|
ebba7e4878 | ||
|
|
aa6d20775f | ||
|
|
9cbe84e445 | ||
|
|
cc86af4399 | ||
|
|
79ff91d293 | ||
|
|
aa7546ec62 | ||
|
|
a8fd7f043d | ||
|
|
a9f63bd5fd | ||
|
|
8fd701aabe | ||
|
|
1ea8fa2e06 | ||
|
|
51cfc37923 | ||
|
|
26bab2ba15 | ||
|
|
20409d2bf6 | ||
|
|
94bd3601fc | ||
|
|
f94a963463 | ||
|
|
5b985f69be | ||
|
|
0151f8cdfb | ||
|
|
018b804a46 | ||
|
|
8051be45b3 | ||
|
|
0ef907757b | ||
|
|
d6cf470402 | ||
|
|
b3b8fbddbe | ||
|
|
b47c4093a6 | ||
|
|
e23c38f471 | ||
|
|
040de14ec8 | ||
|
|
e6bc39028a | ||
|
|
da55168f60 | ||
|
|
48f529b4c6 | ||
|
|
42faef3941 | ||
|
|
7db14533f1 | ||
|
|
93ca4ed8d7 | ||
|
|
92aff2129f | ||
|
|
af10d6b778 | ||
|
|
6f715b4a8d | ||
|
|
72bd453078 | ||
|
|
86d5c99f5d | ||
|
|
07c3b8c901 | ||
|
|
26573456c2 | ||
|
|
af7ff60a6c | ||
|
|
106874845f | ||
|
|
1e7ad82af6 | ||
|
|
65867c47ae | ||
|
|
c7da53ac3d | ||
|
|
16c0d2fec5 | ||
|
|
90d7cc3045 | ||
|
|
3268707c00 | ||
|
|
3093df8e71 | ||
|
|
1edb6a8647 | ||
|
|
0bf2160939 | ||
|
|
e75baec73e | ||
|
|
82fb7ff5d2 | ||
|
|
d1b5d62d21 | ||
|
|
e612d103bf | ||
|
|
c97f0c10dd | ||
|
|
e3a60c8672 | ||
|
|
e9c6180d56 | ||
|
|
5e4fd171e2 | ||
|
|
f44a4fc478 | ||
|
|
a20e161a5b | ||
|
|
b04f607828 | ||
|
|
a3076392b5 | ||
|
|
210aadb92b | ||
|
|
1def668578 | ||
|
|
b9d7e8077c | ||
|
|
098db33547 | ||
|
|
5cc16e371c | ||
|
|
edebf18043 | ||
|
|
1c8ac2b82b | ||
|
|
17fc6e3485 | ||
|
|
4e5a094491 | ||
|
|
56aa26ce1d | ||
|
|
739628aef9 | ||
|
|
f54b7685f3 | ||
|
|
99471819d5 | ||
|
|
ad8bbdc4b2 | ||
|
|
059cda85dc | ||
|
|
d60c15593d | ||
|
|
1abb70ef36 | ||
|
|
40ac961079 | ||
|
|
f0dab18005 | ||
|
|
5aec9bacec | ||
|
|
5f1eccb2cd | ||
|
|
11577fb553 | ||
|
|
05f077b950 | ||
|
|
0f37bafd66 | ||
|
|
a552bdfb2f | ||
|
|
c774ef641a | ||
|
|
cb0cc9ed18 | ||
|
|
6a435c968f | ||
|
|
a96d574517 | ||
|
|
668494948c | ||
|
|
efcfb9be16 | ||
|
|
4603f09389 | ||
|
|
349580299c | ||
|
|
52e770e2d4 | ||
|
|
b9db73a239 | ||
|
|
be5cd3998d | ||
|
|
7d1a987d5d | ||
|
|
4970474320 | ||
|
|
f2b9cc1cdd | ||
|
|
8328b22c3f | ||
|
|
330fda6522 | ||
|
|
9650b71d8e | ||
|
|
df6300e0ba | ||
|
|
94e31dcad1 | ||
|
|
8ec754deca | ||
|
|
fa6deba7df | ||
|
|
d34962f908 | ||
|
|
e5655b0b96 | ||
|
|
14d270241c | ||
|
|
0579d4f39c | ||
|
|
2e71831324 | ||
|
|
2fdd2337c7 | ||
|
|
963ba42a1a | ||
|
|
c9292bea5b | ||
|
|
30962119cb | ||
|
|
ee98be9ef7 | ||
|
|
0536ddf0c9 | ||
|
|
6e439d2342 | ||
|
|
4a37855526 | ||
|
|
db59344007 | ||
|
|
105ac3bf9e | ||
|
|
471ed6ade2 | ||
|
|
366a4a0174 | ||
|
|
dbfc4b1dad | ||
|
|
1f44d23a08 | ||
|
|
332dde6d74 | ||
|
|
80d463ed20 | ||
|
|
e19b0c3dc4 | ||
|
|
6d73ba46e2 | ||
|
|
a6b71f4716 | ||
|
|
47e49207ad | ||
|
|
2a5af18bf2 | ||
|
|
41684644a1 | ||
|
|
7b69bf6696 | ||
|
|
6d4e8a4173 | ||
|
|
90d195237f | ||
|
|
9394c0a170 | ||
|
|
6781930100 | ||
|
|
9e862cec68 | ||
|
|
eb2a8f132c | ||
|
|
7a317b9f39 | ||
|
|
f5f51bc792 | ||
|
|
683a1dc554 | ||
|
|
478e909742 | ||
|
|
a02621ef30 | ||
|
|
43d2e1bfde | ||
|
|
802b8f9870 | ||
|
|
f03139d4ff | ||
|
|
96f8466fa7 | ||
|
|
5b368fb2f1 | ||
|
|
a3d4028faa | ||
|
|
6b5b1c9617 | ||
|
|
087a2cecd8 | ||
|
|
d2a430ce57 | ||
|
|
26f036173d | ||
|
|
16e21697f8 | ||
|
|
d4e55c3a1d | ||
|
|
0445ae7c33 | ||
|
|
ce1e91b9f1 | ||
|
|
a19163fc75 | ||
|
|
eba90c1869 | ||
|
|
4af0e7dbea | ||
|
|
344fe4e4cf | ||
|
|
5e79fc559b | ||
|
|
04fdc0d9e2 | ||
|
|
f2df35be01 | ||
|
|
da9ff08198 |
-152
@@ -1,152 +0,0 @@
|
|||||||
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
- devel
|
|
||||||
|
|
||||||
os: Visual Studio 2015
|
|
||||||
|
|
||||||
clone_folder: c:\projects\rtabmap
|
|
||||||
|
|
||||||
platform: x64
|
|
||||||
configuration: Release
|
|
||||||
|
|
||||||
init:
|
|
||||||
- cmake --version
|
|
||||||
- call "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64
|
|
||||||
- call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64
|
|
||||||
|
|
||||||
install:
|
|
||||||
# To download from google drive
|
|
||||||
- set PATH=C:\Python38-x64;C:\Python38-x64\Scripts;%PATH%
|
|
||||||
- ps: py -m pip --disable-pip-version-check install gdown>=5.1.0
|
|
||||||
# Qt
|
|
||||||
- set QTDIR=C:\Qt\5.10.1\msvc2015_64
|
|
||||||
# make sure Qt bin path is before cmake bin path to avoid copying qt5 dlls from cmake before qt installation
|
|
||||||
- set PATH=%QTDIR%\bin;%PATH%
|
|
||||||
# Boost
|
|
||||||
- set PATH=%PATH%;C:\Libraries\boost_1_62_0\lib64-msvc-14.0
|
|
||||||
# Openni2
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/d98jv79l6oy9fxz/OpenNI2.exe?dl=0' -outfile OpenNI2.exe
|
|
||||||
- cmd: OpenNI2.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed OpenNI2:"
|
|
||||||
- ps: "ls \"C:/Program Files/OpenNI2\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\OpenNI2\Redist
|
|
||||||
- set OPENNI2_INCLUDE64=C:\Program Files\OpenNI2\Include
|
|
||||||
- set OPENNI2_LIB64=C:\Program Files\OpenNI2\Lib
|
|
||||||
- set OPENNI2_REDIST64=C:\Program Files\OpenNI2\Redist
|
|
||||||
# OpenCV
|
|
||||||
#- appveyor-retry appveyor DownloadFile http://downloads.sourceforge.net/project/opencvlibrary/4.5.2/opencv-4.5.2-vc14_vc15.exe
|
|
||||||
#- cmd: opencv-4.5.2-vc14_vc15.exe -o"C:\Program Files" -y
|
|
||||||
#- ECHO "Installed OpenCV:"
|
|
||||||
#- ps: "ls \"C:/Program Files/opencv/build\""
|
|
||||||
#- set PATH=%PATH%;C:\Program Files\opencv\build\x64\vc14\bin
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/o6ofn491bc0jso1/opencv450_vc14.exe?dl=0' -outfile opencv.exe
|
|
||||||
- cmd: opencv.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed OpenCV:"
|
|
||||||
- ps: "ls \"C:/Program Files/opencv\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\opencv\x64\vc14\bin
|
|
||||||
# VTK (including QVTK)
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/1l33b5l3f3y52gf/VTK-6_3-msvc140.exe?dl=0' -outfile VTK-6_3.exe
|
|
||||||
- cmd: VTK-6_3.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed VTK:"
|
|
||||||
- ps: "ls \"C:/Program Files/VTK\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\VTK\bin
|
|
||||||
# QHull
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/9widnk9msdsh2b8/Qhull-msvc140.exe?dl=0' -outfile Qhull.exe
|
|
||||||
- cmd: Qhull.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed QHull:"
|
|
||||||
- ps: "ls \"C:/Program Files/Qhull\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\Qhull\bin
|
|
||||||
# FLANN
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/7k58jbmqa51sxmh/FLANN-msvc140.exe?dl=0' -outfile FLANN.exe
|
|
||||||
- cmd: FLANN.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed FLANN:"
|
|
||||||
- ps: "ls \"C:/Program Files/FLANN\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\FLANN\bin
|
|
||||||
# Eigen
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/3v6i9i8dxj4o8ji/Eigen.exe?dl=0' -outfile Eigen.exe
|
|
||||||
- cmd: Eigen.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed Eigen:"
|
|
||||||
- ps: "ls \"C:/Program Files/Eigen\""
|
|
||||||
# PCL
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/2iayr4lyqa50i9j/PCL_181_August2018_x64_vc14.exe?dl=0' -outfile PCL_1.8.1.exe
|
|
||||||
- cmd: PCL_1.8.1.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed PCL:"
|
|
||||||
- ps: "ls \"C:/Program Files/PCL\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\PCL\bin
|
|
||||||
# zlib
|
|
||||||
- ps: gdown -q 0B46akLGdg-uaYm9MTTI4MUtUcmc
|
|
||||||
- ps: Expand-Archive zlib-1.2.8-vc2010-x64.zip -DestinationPath 'C:\Program Files'
|
|
||||||
- ECHO "Installed zlib:"
|
|
||||||
- ps: "ls \"C:/Program Files/zlib\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\zlib\bin
|
|
||||||
# g2o
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/ht74s5pa21wokzw/g2o.exe?dl=0' -outfile g2o.exe
|
|
||||||
- cmd: g2o.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed g2o:"
|
|
||||||
- ps: "ls \"C:/Program Files/g2o\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\g2o\bin
|
|
||||||
# GTSAM
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/0fpr6r4cgsqmvhf/GTSAM-4_0_0_alpha2-msvc140.exe?dl=0' -outfile GTSAM.exe
|
|
||||||
- cmd: GTSAM.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed GTSAM:"
|
|
||||||
- ps: "ls \"C:/Program Files/GTSAM\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\GTSAM\bin
|
|
||||||
# OctoMap
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/6jpxu0nm8ne6e54/octomap_x64_vc14.exe?dl=0' -outfile octomap.exe
|
|
||||||
- cmd: octomap.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed OctoMap:"
|
|
||||||
- ps: "ls \"C:/Program Files/octomap-distribution\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\octomap-distribution\bin
|
|
||||||
# CPU-TSDF
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/mgges9va1uzxr0q/cpu_tsdf_sept2015_x64_vc14.exe?dl=0' -outfile cpu_tsdf.exe
|
|
||||||
- cmd: cpu_tsdf.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed CPU-TSDF:"
|
|
||||||
- ps: "ls \"C:/Program Files/cpu_tsdf\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\cpu_tsdf\bin
|
|
||||||
# Open Chisel
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/0aaphcde4acrinm/open_chisel_x64_vc14.exe?dl=0' -outfile open_chisel.exe
|
|
||||||
- cmd: open_chisel.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed Open Chisel:"
|
|
||||||
- ps: "ls \"C:/Program Files/open_chisel\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\open_chisel\bin
|
|
||||||
# yaml-cpp
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/22qfvftwj6zq8tj/yaml-cpp_x64_vc14.exe?dl=0' -outfile yaml-cpp.exe
|
|
||||||
- cmd: yaml-cpp.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed 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:
|
|
||||||
- cd c:\projects\rtabmap\build
|
|
||||||
- ECHO %PROGRAMFILES%
|
|
||||||
- ECHO %PATH%
|
|
||||||
- cmake -G "Visual Studio 14 2015 Win64" -DOpenCV_DIR="C:\Program Files\opencv\build" -DPCL_DIR="C:\Program Files\PCL\cmake" -DCPUTSDF_DIR="C:\Program Files\cpu_tsdf\share\cpu_tsdf" -Dyaml-cpp_DIR="C:\Program Files\yaml-cpp\CMake" -DBUILD_AS_BUNDLE=ON ..
|
|
||||||
|
|
||||||
after_build :
|
|
||||||
- cmake --build . --config Release --target package
|
|
||||||
|
|
||||||
artifacts:
|
|
||||||
- path: build\RTABMap-*
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
- provider: Email
|
|
||||||
to:
|
|
||||||
- matlabbe@gmail.com
|
|
||||||
on_build_success: false
|
|
||||||
on_build_failure: false
|
|
||||||
on_build_status_changed: true
|
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
FROM introlab3it/rtabmap:android-noble-deps
|
||||||
|
|
||||||
|
# remove ubuntu user
|
||||||
|
RUN touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
ARG USERNAME=vscode
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=1000
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
groupadd --gid ${USER_GID} ${USERNAME} && \
|
||||||
|
useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
|
||||||
|
usermod -a -G sudo ${USERNAME} && \
|
||||||
|
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \
|
||||||
|
chmod 0440 /etc/sudoers.d/${USERNAME}
|
||||||
|
|
||||||
|
RUN chmod +x /opt/android-sdk/tools/android
|
||||||
|
|
||||||
|
RUN echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
|
||||||
|
|
||||||
@@ -1,9 +1,21 @@
|
|||||||
{
|
{
|
||||||
"image": "introlab3it/rtabmap:android-deps",
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
"customizations": {
|
"customizations": {
|
||||||
"vscode": {
|
"vscode": {
|
||||||
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools", "vscjava.vscode-java-pack"]
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools", "vscjava.vscode-java-pack"]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/rtabmap,type=bind",
|
||||||
|
"workspaceFolder": "/home/vscode/rtabmap",
|
||||||
|
"postStartCommand": "./.devcontainer/android/init.sh",
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
"runArgs": ["--privileged", "--network=host"]
|
"runArgs": ["--privileged", "--network=host"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Executable
+17
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "Running post-start initialization..."
|
||||||
|
|
||||||
|
# copy required jars
|
||||||
|
cp /opt/android/lib/*.jar app/android/libs/.
|
||||||
|
|
||||||
|
mkdir -p build_android/arm64-v8a
|
||||||
|
|
||||||
|
# resource tool
|
||||||
|
cd build_android
|
||||||
|
cmake -DANDROID_PREBUILD=ON ..
|
||||||
|
make
|
||||||
|
|
||||||
|
echo -e "\nTo build the APK, do (adjust API number):"
|
||||||
|
echo -e '\nexport ANDROID_API=30 && cd build_android/arm64-v8a && cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_NDK=$ANDROID_NDK -DANDROID_NATIVE_API_LEVEL=$ANDROID_API -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/android/arm64-v8a -DCMAKE_FIND_ROOT_PATH="/opt/android/arm64-v8a/bin;/opt/android/arm64-v8a;/opt/android/arm64-v8a/share" -DBUILD_EXAMPLES=OFF -DBUILD_TOOLS=OFF -DOpenCV_DIR=/opt/android/arm64-v8a/sdk/native/jni ../..\nmake -j6\n'
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
FROM introlab3it/rtabmap:focal-deps
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
ARG USERNAME=vscode
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=1000
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
groupadd --gid ${USER_GID} ${USERNAME} && \
|
||||||
|
useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
|
||||||
|
usermod -a -G sudo ${USERNAME} && \
|
||||||
|
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \
|
||||||
|
chmod 0440 /etc/sudoers.d/${USERNAME}
|
||||||
|
|
||||||
|
RUN mkdir -p /home/${USERNAME}/Documents/RTAB-Map && chown -R ${USERNAME} /home/${USERNAME}
|
||||||
|
|
||||||
|
RUN echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
|
||||||
|
|
||||||
@@ -1,8 +1,18 @@
|
|||||||
{
|
{
|
||||||
"image": "introlab3it/rtabmap:20.04",
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
"customizations": {
|
"customizations": {
|
||||||
"vscode": {
|
"vscode": {
|
||||||
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools"]
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools"]
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/rtabmap,type=bind",
|
||||||
|
"workspaceFolder": "/home/vscode/rtabmap",
|
||||||
|
//"mounts": ["source=${localEnv:HOME}/Documents/RTAB-Map,target=/home/vscode/Documents/RTAB-Map,type=bind,consistency=cached"],
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
"runArgs": ["--privileged", "--network=host"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
FROM introlab3it/rtabmap:jammy-deps
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
ARG USERNAME=vscode
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=1000
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
groupadd --gid ${USER_GID} ${USERNAME} && \
|
||||||
|
useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
|
||||||
|
usermod -a -G sudo ${USERNAME} && \
|
||||||
|
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \
|
||||||
|
chmod 0440 /etc/sudoers.d/${USERNAME}
|
||||||
|
|
||||||
|
RUN mkdir -p /home/${USERNAME}/Documents/RTAB-Map && chown -R ${USERNAME} /home/${USERNAME}
|
||||||
|
|
||||||
|
RUN echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
|
||||||
|
|
||||||
@@ -1,8 +1,18 @@
|
|||||||
{
|
{
|
||||||
"image": "introlab3it/rtabmap:22.04",
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
"customizations": {
|
"customizations": {
|
||||||
"vscode": {
|
"vscode": {
|
||||||
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools"]
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools"]
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/rtabmap,type=bind",
|
||||||
|
"workspaceFolder": "/home/vscode/rtabmap",
|
||||||
|
//"mounts": ["source=${localEnv:HOME}/Documents/RTAB-Map,target=/home/vscode/Documents/RTAB-Map,type=bind,consistency=cached"],
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
"runArgs": ["--privileged", "--network=host"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,104 @@
|
|||||||
|
ARG ROS_DISTRO=jazzy
|
||||||
|
|
||||||
|
FROM osrf/ros:${ROS_DISTRO}-desktop
|
||||||
|
|
||||||
|
# Install build dependencies with Qt6 (issue: rtabmap has black window)
|
||||||
|
#RUN apt-get update && \
|
||||||
|
# apt-get install -y git software-properties-common ros-${ROS_DISTRO}-rtabmap-ros libqt6* qt6* qml6* && \
|
||||||
|
# apt-get remove -y ros-${ROS_DISTRO}-rtabmap* ros-${ROS_DISTRO}-gtsam ros-${ROS_DISTRO}-libg2o libpcl* libqt5* qt5* libvtk* libopencv* && \
|
||||||
|
# apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
# Install build dependencies with Qt5
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y git software-properties-common ros-${ROS_DISTRO}-rtabmap-ros && \
|
||||||
|
apt-get remove -y ros-${ROS_DISTRO}-rtabmap* ros-${ROS_DISTRO}-gtsam ros-${ROS_DISTRO}-libg2o libpcl* libvtk* libopencv* && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
# remove ubuntu user
|
||||||
|
RUN touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
ARG USERNAME=vscode
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=1000
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
groupadd --gid ${USER_GID} ${USERNAME} && \
|
||||||
|
useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
|
||||||
|
usermod -a -G sudo ${USERNAME} && \
|
||||||
|
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \
|
||||||
|
chmod 0440 /etc/sudoers.d/${USERNAME}
|
||||||
|
|
||||||
|
RUN mkdir -p /home/${USERNAME}/Documents/RTAB-Map
|
||||||
|
|
||||||
|
RUN echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
|
||||||
|
WORKDIR /home/${USERNAME}/
|
||||||
|
|
||||||
|
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
|
||||||
|
|
||||||
|
# We build main dependencies from source, cleaning up the
|
||||||
|
# build directory after install but keeping the source code
|
||||||
|
# to change version/reinstall from inside the dev container
|
||||||
|
# if needed.
|
||||||
|
|
||||||
|
# Build latest VTK with Qt6
|
||||||
|
RUN git clone https://github.com/Kitware/VTK.git
|
||||||
|
RUN cd VTK && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DVTK_GROUP_ENABLE_Qt=YES .. && \
|
||||||
|
make -j$(nproc) && \
|
||||||
|
make install && \
|
||||||
|
make clean
|
||||||
|
|
||||||
|
# Build latest PCL with latest VTK
|
||||||
|
# Make sure all libraries depending on Eigen are built with same CXX standard (17)
|
||||||
|
RUN git clone https://github.com/PointCloudLibrary/pcl.git
|
||||||
|
RUN cd pcl && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_CXX_STANDARD=17 -DBUILD_tools=ON -DPCL_ENABLE_AVX=OFF -DPCL_ENABLE_MARCHNATIVE=OFF -DPCL_ENABLE_SSE=OFF .. && \
|
||||||
|
make -j$(nproc) && \
|
||||||
|
make install && \
|
||||||
|
make clean
|
||||||
|
|
||||||
|
# Build latest OpenCV
|
||||||
|
RUN git clone https://github.com/opencv/opencv.git
|
||||||
|
RUN git clone https://github.com/opencv/opencv_contrib.git
|
||||||
|
RUN cd opencv && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DBUILD_opencv_python3=OFF -DBUILD_opencv_python_bindings_generator=OFF -DBUILD_opencv_python_tests=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF -DOPENCV_ENABLE_NONFREE=ON -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules .. && \
|
||||||
|
make -j$(nproc) && \
|
||||||
|
make install && \
|
||||||
|
make clean
|
||||||
|
|
||||||
|
# Build latest gtsam
|
||||||
|
RUN git clone https://github.com/borglab/gtsam.git
|
||||||
|
RUN cd gtsam && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_CXX_STANDARD=17 -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF -DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF -DGTSAM_BUILD_TESTS=OFF -DGTSAM_BUILD_STATIC_LIBRARY=OFF -DGTSAM_BUILD_UNSTABLE=OFF -DGTSAM_INSTALL_CPPUNILITE=OFF -DGTSAM_USE_SYSTEM_EIGEN=ON -DCMAKE_BUILD_TYPE=Release .. && \
|
||||||
|
make -j$(nproc) && \
|
||||||
|
make install && \
|
||||||
|
make clean
|
||||||
|
|
||||||
|
# Build latest g2o
|
||||||
|
RUN git clone https://github.com/RainerKuemmerle/g2o.git
|
||||||
|
RUN cd g2o && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_CXX_STANDARD=17 -DBUILD_WITH_MARCH_NATIVE=OFF -DG2O_BUILD_APPS=OFF -DG2O_BUILD_EXAMPLES=OFF -DG2O_USE_OPENGL=OFF -DCMAKE_BUILD_TYPE=Release .. && \
|
||||||
|
make -j$(nproc) && \
|
||||||
|
make install && \
|
||||||
|
make clean
|
||||||
|
|
||||||
|
# ros2 seems not sourcing by default its multi-arch folders
|
||||||
|
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ros/${ROS_DISTRO}/lib/x86_64-linux-gnu
|
||||||
|
|
||||||
|
RUN ldconfig
|
||||||
|
|
||||||
|
RUN chown -R ${USERNAME} /home/${USERNAME}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile",
|
||||||
|
"args": {
|
||||||
|
"ROS_DISTRO": "jazzy"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/rtabmap,type=bind",
|
||||||
|
"workspaceFolder": "/home/vscode/rtabmap",
|
||||||
|
//"mounts": ["source=${localEnv:HOME}/Documents/RTAB-Map,target=/home/vscode/Documents/RTAB-Map,type=bind,consistency=cached"],
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
"runArgs": ["--privileged", "--network=host"]
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
FROM introlab3it/rtabmap:noble-deps
|
||||||
|
|
||||||
|
# For devcontainer
|
||||||
|
# remove ubuntu user
|
||||||
|
RUN touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
ARG USERNAME=vscode
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=1000
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
groupadd --gid ${USER_GID} ${USERNAME} && \
|
||||||
|
useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
|
||||||
|
usermod -a -G sudo ${USERNAME} && \
|
||||||
|
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \
|
||||||
|
chmod 0440 /etc/sudoers.d/${USERNAME}
|
||||||
|
|
||||||
|
RUN mkdir -p /home/${USERNAME}/Documents/RTAB-Map && chown -R ${USERNAME} /home/${USERNAME}
|
||||||
|
|
||||||
|
RUN echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
|
||||||
|
|
||||||
@@ -1,8 +1,30 @@
|
|||||||
{
|
{
|
||||||
"image": "introlab3it/rtabmap:24.04",
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
"customizations": {
|
"customizations": {
|
||||||
"vscode": {
|
"vscode": {
|
||||||
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools"]
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools", "ms-vscode.cpptools-extension-pack"]
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/rtabmap,type=bind",
|
||||||
|
"workspaceFolder": "/home/vscode/rtabmap",
|
||||||
|
//"mounts": ["source=${localEnv:HOME}/Documents/RTAB-Map,target=/home/vscode/Documents/RTAB-Map,type=bind,consistency=cached"],
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
"hostRequirements": {
|
||||||
|
"gpu": "optional"
|
||||||
|
},
|
||||||
|
"runArgs": ["--privileged",
|
||||||
|
"--network=host",
|
||||||
|
"--gpus=all",
|
||||||
|
//"--runtime=nvidia", // uncommment this if rtabmap doesn't show up in nvidia-smi on the host computer
|
||||||
|
"--env=DISPLAY",
|
||||||
|
"--env=QT_X11_NO_MITSHM=1",
|
||||||
|
"--volume=/tmp/.X11-unix:/tmp/.X11-unix"],
|
||||||
|
"containerEnv": {
|
||||||
|
"NVIDIA_VISIBLE_DEVICES": "all"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
FROM introlab3it/rtabmap:resolute-deps
|
||||||
|
|
||||||
|
# For devcontainer
|
||||||
|
# remove ubuntu user
|
||||||
|
RUN touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
ARG USERNAME=vscode
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=1000
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
groupadd --gid ${USER_GID} ${USERNAME} && \
|
||||||
|
useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
|
||||||
|
usermod -a -G sudo ${USERNAME} && \
|
||||||
|
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \
|
||||||
|
chmod 0440 /etc/sudoers.d/${USERNAME}
|
||||||
|
|
||||||
|
RUN mkdir -p /home/${USERNAME}/Documents/RTAB-Map && chown -R ${USERNAME} /home/${USERNAME}
|
||||||
|
|
||||||
|
RUN echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools", "ms-vscode.cpptools-extension-pack"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/rtabmap,type=bind",
|
||||||
|
"workspaceFolder": "/home/vscode/rtabmap",
|
||||||
|
//"mounts": ["source=${localEnv:HOME}/Documents/RTAB-Map,target=/home/vscode/Documents/RTAB-Map,type=bind,consistency=cached"],
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
"hostRequirements": {
|
||||||
|
"gpu": "optional"
|
||||||
|
},
|
||||||
|
"runArgs": ["--privileged",
|
||||||
|
"--network=host",
|
||||||
|
"--gpus=all",
|
||||||
|
//"--runtime=nvidia", // uncommment this if rtabmap doesn't show up in nvidia-smi on the host computer
|
||||||
|
"--env=DISPLAY",
|
||||||
|
"--env=QT_X11_NO_MITSHM=1",
|
||||||
|
"--volume=/tmp/.X11-unix:/tmp/.X11-unix"],
|
||||||
|
"containerEnv": {
|
||||||
|
"NVIDIA_VISIBLE_DEVICES": "all"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
|
||||||
|
FROM ubuntu:24.04
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
# Install ROS2
|
||||||
|
RUN apt update && \
|
||||||
|
apt install software-properties-common -y && \
|
||||||
|
add-apt-repository universe -y && \
|
||||||
|
apt update && \
|
||||||
|
apt install curl -y && \
|
||||||
|
export ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F\" '{print $4}') && \
|
||||||
|
curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb" && \
|
||||||
|
apt install /tmp/ros2-apt-source.deb && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
# Install build dependencies
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt upgrade -y && \
|
||||||
|
apt-get install -y \
|
||||||
|
git \
|
||||||
|
wget \
|
||||||
|
libtbb-dev \
|
||||||
|
libproj-dev \
|
||||||
|
libpcl-dev \
|
||||||
|
liboctomap-dev \
|
||||||
|
libfreenect-dev \
|
||||||
|
ros-rolling-ros-base \
|
||||||
|
ros-dev-tools \
|
||||||
|
ros-rolling-cv-bridge \
|
||||||
|
ros-rolling-image-geometry \
|
||||||
|
ros-rolling-laser-geometry \
|
||||||
|
ros-rolling-pcl-conversions \
|
||||||
|
ros-rolling-rviz-common \
|
||||||
|
ros-rolling-rviz-rendering \
|
||||||
|
ros-rolling-rviz-default-plugins \
|
||||||
|
ros-rolling-pcl-ros \
|
||||||
|
ros-rolling-imu-filter-madgwick \
|
||||||
|
ros-rolling-image-transport \
|
||||||
|
ros-rolling-octomap-msgs \
|
||||||
|
ros-rolling-libg2o \
|
||||||
|
ros-rolling-gtsam \
|
||||||
|
ros-rolling-libpointmatcher \
|
||||||
|
ros-rolling-qt-gui-cpp \
|
||||||
|
ros-rolling-diagnostic-updater && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
WORKDIR /root/
|
||||||
|
|
||||||
|
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
|
||||||
|
|
||||||
|
RUN echo -e '#!/bin/bash\nset -e\n\n# setup ros2 environment\nsource "/opt/ros/rolling/setup.bash" --\nexec "$@"' > /ros_entrypoint.sh
|
||||||
|
RUN chmod +x /ros_entrypoint.sh
|
||||||
|
ENTRYPOINT [ "/ros_entrypoint.sh" ]
|
||||||
|
|
||||||
|
# ros2 seems not sourcing by default its multi-arch folders
|
||||||
|
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ros/rolling/lib/x86_64-linux-gnu
|
||||||
|
|
||||||
|
# For devcontainer
|
||||||
|
# remove ubuntu user
|
||||||
|
RUN touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
ARG USERNAME=vscode
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=1000
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
groupadd --gid ${USER_GID} ${USERNAME} && \
|
||||||
|
useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
|
||||||
|
usermod -a -G sudo ${USERNAME} && \
|
||||||
|
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \
|
||||||
|
chmod 0440 /etc/sudoers.d/${USERNAME}
|
||||||
|
|
||||||
|
RUN mkdir -p /home/${USERNAME}/Documents/RTAB-Map && chown -R ${USERNAME} /home/${USERNAME}
|
||||||
|
|
||||||
|
RUN echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/rtabmap,type=bind",
|
||||||
|
"workspaceFolder": "/home/vscode/rtabmap",
|
||||||
|
//"mounts": ["source=${localEnv:HOME}/Documents/RTAB-Map,target=/home/vscode/Documents/RTAB-Map,type=bind,consistency=cached"],
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
"hostRequirements": {
|
||||||
|
"gpu": "optional"
|
||||||
|
},
|
||||||
|
"runArgs": ["--privileged",
|
||||||
|
"--network=host",
|
||||||
|
"--gpus=all",
|
||||||
|
//"--runtime=nvidia", // uncommment this if rtabmap doesn't show up in nvidia-smi on the host computer
|
||||||
|
"--env=DISPLAY",
|
||||||
|
"--env=QT_X11_NO_MITSHM=1",
|
||||||
|
"--volume=/tmp/.X11-unix:/tmp/.X11-unix"],
|
||||||
|
"containerEnv": {
|
||||||
|
"NVIDIA_VISIBLE_DEVICES": "all"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
name: 'Install Windows Dependencies with CUDA'
|
||||||
|
description: 'Installs PCL, Qt, VTK, g2o and others'
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Set up MSVC Developer Command Prompt
|
||||||
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
|
with:
|
||||||
|
arch: x64
|
||||||
|
|
||||||
|
- name: Install CUDA
|
||||||
|
uses: Jimver/cuda-toolkit@v0.2.30
|
||||||
|
id: cuda-toolkit
|
||||||
|
with:
|
||||||
|
cuda: '13.0.0'
|
||||||
|
use-github-cache: True
|
||||||
|
|
||||||
|
- name: Verify CUDA
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
nvcc --version
|
||||||
|
echo "CUDA Path: $CUDA_PATH"
|
||||||
|
|
||||||
|
- name: Cache vcpkg
|
||||||
|
id: cache-vcpkg
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.workspace }}/vcpkg_installed
|
||||||
|
key: ${{ runner.os }}-vcpkg-export-66c0373d-x64-vs2022-cuda130_v1
|
||||||
|
|
||||||
|
- name: Download and Install vcpkg
|
||||||
|
if: steps.cache-vcpkg.outputs.cache-hit != 'true'
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$install_dir = "${{ runner.workspace }}\vcpkg_installed"
|
||||||
|
$archivePath = "${{ runner.workspace }}\vcpkg-export.7z"
|
||||||
|
|
||||||
|
# The file has been built locally with bundle-windows-deps.bat
|
||||||
|
$url = "https://github.com/introlab/rtabmap/releases/download/0.23.1/vcpkg-export-66c0373d-x64-vs2022-cuda130.7z"
|
||||||
|
|
||||||
|
Invoke-WebRequest -Uri $url -OutFile $archivePath
|
||||||
|
& 7z x $archivePath "-o$install_dir" -y
|
||||||
|
|
||||||
|
- name: Add vcpkg to PATH and env variable
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$vcpkg_path = "${{ runner.workspace }}\vcpkg_installed"
|
||||||
|
echo "VCPKG_EXPORT_PATH=$vcpkg_path" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
|
||||||
|
echo "$vcpkg_path\installed\x64-windows-release\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
|
echo "${{env.CUDA_PATH}}\bin\x64" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
|
echo "${{env.CUDA_PATH}}\extras\CUPTI\lib64" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
|
echo "$vcpkg_path\installed\x64-windows-release\tools\python3\Lib\site-packages\torch\lib" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
|
echo "$vcpkg_path\installed\x64-windows-release\tools\python3\Lib\site-packages\numpy.libs" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
name: 'Install Windows Dependencies'
|
||||||
|
description: 'Installs PCL, Qt, VTK, g2o and others'
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Set up MSVC Developer Command Prompt
|
||||||
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
|
with:
|
||||||
|
arch: x64
|
||||||
|
|
||||||
|
- name: Cache vcpkg
|
||||||
|
id: cache-vcpkg
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.workspace }}/vcpkg_installed
|
||||||
|
key: ${{ runner.os }}-vcpkg-export-66c0373d-x64-vs2022-v4
|
||||||
|
|
||||||
|
- name: Download and Install vcpkg
|
||||||
|
if: steps.cache-vcpkg.outputs.cache-hit != 'true'
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$install_dir = "${{ runner.workspace }}\vcpkg_installed"
|
||||||
|
$archivePath = "${{ runner.workspace }}\vcpkg-export.7z"
|
||||||
|
|
||||||
|
# The file has been built locally with bundle-windows-deps.bat
|
||||||
|
$url = "https://github.com/introlab/rtabmap/releases/download/0.23.1/vcpkg-export-66c0373d-x64-vs2022.7z"
|
||||||
|
|
||||||
|
Invoke-WebRequest -Uri $url -OutFile $archivePath
|
||||||
|
& 7z x $archivePath "-o$install_dir" -y
|
||||||
|
|
||||||
|
- name: Add vcpkg to PATH and env variable
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$vcpkg_path = "${{ runner.workspace }}\vcpkg_installed"
|
||||||
|
echo "VCPKG_EXPORT_PATH=$vcpkg_path" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
|
||||||
|
echo "$vcpkg_path\installed\x64-windows-release\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
|
echo "$vcpkg_path\installed\x64-windows-release\tools\python3\Lib\site-packages\numpy.libs" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
name: Cleanup PR Artifacts
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [closed]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
delete-artifacts:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
actions: write
|
||||||
|
steps:
|
||||||
|
- name: Delete PR Artifacts
|
||||||
|
uses: geekyeggo/delete-artifact@v5
|
||||||
|
with:
|
||||||
|
name: build-output-*
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
name: CMake-Linux
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
|
||||||
|
env:
|
||||||
|
BUILD_TYPE: Release
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: ${{ matrix.build_name }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
matrix:
|
||||||
|
build_name: [ubuntu-22.04, ubuntu-24.04, ubuntu-24.04-with-opengv, ubuntu-26.04]
|
||||||
|
include:
|
||||||
|
- build_name: ubuntu-22.04
|
||||||
|
os: ubuntu-22.04
|
||||||
|
extra_deps: "libunwind-dev libceres-dev"
|
||||||
|
extra_cmake_def: "-DWITH_CERES=ON -DWITH_PYTHON=ON"
|
||||||
|
- build_name: ubuntu-24.04
|
||||||
|
os: ubuntu-24.04
|
||||||
|
extra_deps: "libg2o-dev libceres-dev"
|
||||||
|
extra_cmake_def: "-DWITH_CERES=ON -DWITH_PYTHON=ON"
|
||||||
|
- build_name: ubuntu-24.04-with-opengv
|
||||||
|
os: ubuntu-24.04
|
||||||
|
extra_deps: "libg2o-dev libceres-dev"
|
||||||
|
extra_cmake_def: "-DWITH_CERES=ON -DWITH_PYTHON=ON -DBUILD_OPENGV=ON"
|
||||||
|
- build_name: ubuntu-26.04
|
||||||
|
os: ubuntu-26.04
|
||||||
|
extra_deps: "libg2o-dev libceres-dev"
|
||||||
|
extra_cmake_def: "-DWITH_CERES=ON -DWITH_PYTHON=ON -DBUILD_OPENGV=ON"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install Linux Dependencies
|
||||||
|
run: |
|
||||||
|
DEBIAN_FRONTEND=noninteractive
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get -y install libopencv-dev libpcl-dev git cmake software-properties-common libyaml-cpp-dev ${{ matrix.extra_deps }}
|
||||||
|
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: '3.x'
|
||||||
|
|
||||||
|
- name: Install Python Dependencies
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
pip install numpy pybind11
|
||||||
|
|
||||||
|
- name: Configure CMake
|
||||||
|
run: |
|
||||||
|
cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DPython3_EXECUTABLE=$(which python3) -Dpybind11_DIR=$(python3 -m pybind11 --cmakedir) ${{ matrix.extra_cmake_def }}
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
|
||||||
|
|
||||||
|
- name: Info
|
||||||
|
working-directory: ${{github.workspace}}/build/bin
|
||||||
|
run: |
|
||||||
|
./rtabmap-console --version
|
||||||
|
|
||||||
|
# - name: Test
|
||||||
|
# working-directory: ${{github.workspace}}/build
|
||||||
|
# # Execute tests defined by the CMake configuration.
|
||||||
|
# # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
|
||||||
|
# run: ctest -C ${{env.BUILD_TYPE}}
|
||||||
|
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
name: CMake-MacOS
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
|
||||||
|
env:
|
||||||
|
BUILD_TYPE: Release
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: ${{ matrix.build_name }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
matrix:
|
||||||
|
build_name: [macos-sequoia-intel, macos-sequoia-apple-silicon, macos-tahoe-intel, macos-tahoe-apple-silicon]
|
||||||
|
include:
|
||||||
|
- build_name: macos-sequoia-intel
|
||||||
|
os: macos-15-intel
|
||||||
|
extra_deps: ""
|
||||||
|
extra_cmake_def: '-DBUILD_AS_BUNDLE=ON'
|
||||||
|
- build_name: macos-sequoia-apple-silicon
|
||||||
|
os: macos-15
|
||||||
|
extra_deps: ""
|
||||||
|
extra_cmake_def: '-DBUILD_AS_BUNDLE=ON'
|
||||||
|
- build_name: macos-tahoe-intel
|
||||||
|
os: macos-26-intel
|
||||||
|
extra_deps: ""
|
||||||
|
extra_cmake_def: '-DBUILD_AS_BUNDLE=ON'
|
||||||
|
- build_name: macos-tahoe-apple-silicon
|
||||||
|
os: macos-26
|
||||||
|
extra_deps: ""
|
||||||
|
extra_cmake_def: '-DBUILD_AS_BUNDLE=ON'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install Brew Dependencies
|
||||||
|
run: |
|
||||||
|
# Update brew and install from Brewfile if present, or specific packages
|
||||||
|
brew install pcl opencv octomap g2o pdal
|
||||||
|
|
||||||
|
- name: Configure CMake
|
||||||
|
run: |
|
||||||
|
cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} ${{ matrix.extra_cmake_def }}
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
|
||||||
|
|
||||||
|
- name: Info
|
||||||
|
working-directory: ${{github.workspace}}/build/bin
|
||||||
|
run: |
|
||||||
|
./rtabmap-console --version
|
||||||
|
|
||||||
|
# - name: Build MacOS Package
|
||||||
|
# run: |
|
||||||
|
# cmake --build ${{ github.workspace }}/build --config ${{ env.BUILD_TYPE }} --target package
|
||||||
|
|
||||||
|
# - name: Upload RTABMap Artifacts (DMG)
|
||||||
|
# uses: actions/upload-artifact@v4
|
||||||
|
# with:
|
||||||
|
# name: RTABMap-Binaries-${{ matrix.build_name }}-zip
|
||||||
|
# path: |
|
||||||
|
# build/RTABMap-*.dmg
|
||||||
|
# compression-level: 0
|
||||||
|
# if-no-files-found: warn
|
||||||
|
# retention-days: ${{ github.event_name == 'pull_request' && 1 || 90 }}
|
||||||
|
|
||||||
|
# - name: Test
|
||||||
|
# working-directory: ${{github.workspace}}/build
|
||||||
|
# # Execute tests defined by the CMake configuration.
|
||||||
|
# # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
|
||||||
|
# run: ctest -C ${{env.BUILD_TYPE}}
|
||||||
|
|
||||||
@@ -3,7 +3,7 @@ name: CMake-ROS
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- noetic-devel
|
- jazzy-devel
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- '**'
|
- '**'
|
||||||
@@ -12,46 +12,35 @@ env:
|
|||||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
# The CMake configure and build commands are platform agnostic and should work equally
|
# The CMake configure and build commands are platform agnostic and should work equally
|
||||||
# well on Windows or Mac. You can convert this to a matrix build if you need
|
# well on Windows or Mac. You can convert this to a matrix build if you need
|
||||||
# cross-platform coverage.
|
# cross-platform coverage.
|
||||||
# See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
|
# See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
|
||||||
name: Build on ros ${{ matrix.ros_distribution }} and ${{ matrix.os }}
|
name: ${{ matrix.ros_distribution }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
ros_distribution: [ noetic ]
|
ros_distribution: [ jazzy]
|
||||||
include:
|
include:
|
||||||
- ros_distribution: 'noetic'
|
- ros_distribution: 'jazzy'
|
||||||
os: ubuntu-20.04
|
skip_keys: ""
|
||||||
|
container:
|
||||||
|
image: osrf/ros:${{ matrix.ros_distribution }}-desktop-full
|
||||||
steps:
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
- uses: ros-tooling/setup-ros@v0.7
|
- uses: ros-tooling/setup-ros@v0.7
|
||||||
with:
|
with:
|
||||||
required-ros-distributions: ${{ matrix.ros_distribution }}
|
required-ros-distributions: ${{ matrix.ros_distribution }}
|
||||||
|
- uses: ros-tooling/action-ros-ci@v0.4
|
||||||
- uses: actions/checkout@v4
|
with:
|
||||||
|
package-name: rtabmap
|
||||||
- name: Install dependencies
|
target-ros2-distro: ${{ matrix.ros_distribution }}
|
||||||
run: |
|
rosdep-skip-keys: "${{ matrix.skip_keys }}"
|
||||||
source /opt/ros/${{ matrix.ros_distribution }}/setup.bash
|
|
||||||
rosdep update
|
|
||||||
rosdep install --from-paths ${{github.workspace}} -y
|
|
||||||
|
|
||||||
- name: Configure CMake
|
|
||||||
run: |
|
|
||||||
source /opt/ros/${{ matrix.ros_distribution }}/setup.bash
|
|
||||||
cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
|
|
||||||
|
|
||||||
- name: Info
|
|
||||||
working-directory: ${{github.workspace}}/build/bin
|
|
||||||
run: |
|
|
||||||
source /opt/ros/${{ matrix.ros_distribution }}/setup.bash
|
|
||||||
./rtabmap-console --version
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,107 @@
|
|||||||
|
name: CMake-Windows
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
|
||||||
|
env:
|
||||||
|
BUILD_TYPE: Release
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: ${{ matrix.build_name }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
matrix:
|
||||||
|
build_name: [windows-2022, windows-2022-cuda]
|
||||||
|
include:
|
||||||
|
- build_name: windows-2022
|
||||||
|
os: windows-2022
|
||||||
|
extra_deps: ""
|
||||||
|
extra_cmake_def: '-DBUILD_AS_BUNDLE=ON -DWITH_PYTHON=ON -DWITH_TORCH=OFF'
|
||||||
|
- build_name: windows-2022-cuda
|
||||||
|
os: windows-2022
|
||||||
|
extra_deps: ""
|
||||||
|
extra_cmake_def: '-DBUILD_AS_BUNDLE=ON -DWITH_PYTHON=ON -DWITH_TORCH=ON'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install Windows Dependencies
|
||||||
|
if: matrix.build_name == 'windows-2022'
|
||||||
|
uses: ./.github/actions/install-windows-deps
|
||||||
|
|
||||||
|
- name: Install Windows Dependencies with CUDA
|
||||||
|
if: matrix.build_name == 'windows-2022-cuda'
|
||||||
|
uses: ./.github/actions/install-windows-cuda-deps
|
||||||
|
|
||||||
|
- name: Configure CMake
|
||||||
|
run: |
|
||||||
|
cmake `
|
||||||
|
-B ${{github.workspace}}/build `
|
||||||
|
-DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} `
|
||||||
|
${{ matrix.extra_cmake_def }} `
|
||||||
|
-DVCPKG_MANIFEST_INSTALL=OFF `
|
||||||
|
-DVCPKG_TARGET_TRIPLET=x64-windows-release `
|
||||||
|
-DVCPKG_INSTALLED_DIR="${{env.VCPKG_EXPORT_PATH}}/installed" `
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=${{env.VCPKG_EXPORT_PATH}}/scripts/buildsystems/vcpkg.cmake `
|
||||||
|
-DTorch_DIR=${{env.VCPKG_EXPORT_PATH}}/installed/x64-windows-release/tools/python3/Lib/site-packages/torch/share/cmake/Torch
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
|
||||||
|
|
||||||
|
- name: Build Windows Package
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
if ("${{ github.event_name }}" -eq "pull_request") {
|
||||||
|
cpack --config build/CPackConfig.cmake -G ZIP -B build
|
||||||
|
} else {
|
||||||
|
cmake --build ${{ github.workspace }}/build --config ${{ env.BUILD_TYPE }} --target package
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Rename CUDA artifacts
|
||||||
|
if: matrix.build_name == 'windows-2022-cuda'
|
||||||
|
shell: pwsh
|
||||||
|
run: Get-ChildItem -Path "build" -Filter "RTABMap-*" | Rename-Item -NewName { $_.BaseName + "_cuda" + $_.Extension }
|
||||||
|
|
||||||
|
- name: Info
|
||||||
|
working-directory: ${{github.workspace}}/build/bin
|
||||||
|
run: |
|
||||||
|
./rtabmap-console --version
|
||||||
|
|
||||||
|
- name: Upload RTABMap Artifacts (ZIP)
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: RTABMap-Binaries-${{ matrix.build_name }}-zip
|
||||||
|
path: |
|
||||||
|
build/RTABMap-*.zip
|
||||||
|
compression-level: 0
|
||||||
|
if-no-files-found: warn
|
||||||
|
retention-days: ${{ github.event_name == 'pull_request' && 1 || 90 }}
|
||||||
|
|
||||||
|
- name: Upload RTABMap Artifacts (Installer)
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: RTABMap-Binaries-${{ matrix.build_name }}-exe
|
||||||
|
path: |
|
||||||
|
build/RTABMap-*.exe
|
||||||
|
compression-level: 0
|
||||||
|
if-no-files-found: warn
|
||||||
|
retention-days: ${{ github.event_name == 'pull_request' && 1 || 90 }}
|
||||||
|
|
||||||
|
# - name: Test
|
||||||
|
# working-directory: ${{github.workspace}}/build
|
||||||
|
# # Execute tests defined by the CMake configuration.
|
||||||
|
# # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
|
||||||
|
# run: ctest -C ${{env.BUILD_TYPE}}
|
||||||
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
name: CMake
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- '**'
|
|
||||||
|
|
||||||
env:
|
|
||||||
BUILD_TYPE: Release
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
name: ${{ matrix.os }}
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
os: [ubuntu-24.04, ubuntu-22.04]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
DEBIAN_FRONTEND=noninteractive
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get -y install libopencv-dev libpcl-dev git cmake software-properties-common libyaml-cpp-dev
|
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Configure CMake
|
|
||||||
run: |
|
|
||||||
cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
|
|
||||||
|
|
||||||
- name: Info
|
|
||||||
working-directory: ${{github.workspace}}/build/bin
|
|
||||||
run: |
|
|
||||||
./rtabmap-console --version
|
|
||||||
|
|
||||||
# - name: Test
|
|
||||||
# working-directory: ${{github.workspace}}/build
|
|
||||||
# # Execute tests defined by the CMake configuration.
|
|
||||||
# # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
|
|
||||||
# run: ctest -C ${{env.BUILD_TYPE}}
|
|
||||||
|
|
||||||
@@ -4,6 +4,13 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- 'master'
|
- 'master'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
docker_deps:
|
docker_deps:
|
||||||
@@ -15,14 +22,15 @@ jobs:
|
|||||||
# $ sudo apt-get upgrade qemu-user-static
|
# $ sudo apt-get upgrade qemu-user-static
|
||||||
# $ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes -c yes
|
# $ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes -c yes
|
||||||
# More info: https://github.com/introlab/rtabmap/issues/1454
|
# More info: https://github.com/introlab/rtabmap/issues/1454
|
||||||
if: false
|
# Skipped on pull requests; built and pushed only on push to master.
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
docker_tag: [focal-deps, jammy-deps, jammy-iron-deps, noble-deps]
|
docker_tag: [focal-deps, jammy-deps, noble-deps, noble-kilted-deps, resolute-deps]
|
||||||
include:
|
include:
|
||||||
- docker_tag: focal-deps
|
- docker_tag: focal-deps
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
@@ -30,7 +38,6 @@ jobs:
|
|||||||
docker_platforms: |
|
docker_platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
linux/arm64
|
linux/arm64
|
||||||
linux/arm/v7
|
|
||||||
docker_path: 'focal/deps'
|
docker_path: 'focal/deps'
|
||||||
- docker_tag: jammy-deps
|
- docker_tag: jammy-deps
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
@@ -39,12 +46,6 @@ jobs:
|
|||||||
linux/amd64
|
linux/amd64
|
||||||
linux/arm64
|
linux/arm64
|
||||||
docker_path: 'jammy/deps'
|
docker_path: 'jammy/deps'
|
||||||
- docker_tag: jammy-iron-deps
|
|
||||||
docker_tags: |
|
|
||||||
introlab3it/rtabmap:jammy-iron-deps
|
|
||||||
docker_platforms: |
|
|
||||||
linux/amd64
|
|
||||||
docker_path: 'jammy-iron/deps'
|
|
||||||
- docker_tag: noble-deps
|
- docker_tag: noble-deps
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:noble-deps
|
introlab3it/rtabmap:noble-deps
|
||||||
@@ -52,6 +53,20 @@ jobs:
|
|||||||
linux/amd64
|
linux/amd64
|
||||||
linux/arm64
|
linux/arm64
|
||||||
docker_path: 'noble/deps'
|
docker_path: 'noble/deps'
|
||||||
|
- docker_tag: noble-kilted-deps
|
||||||
|
docker_tags: |
|
||||||
|
introlab3it/rtabmap:noble-kilted-deps
|
||||||
|
docker_platforms: |
|
||||||
|
linux/amd64
|
||||||
|
linux/arm64
|
||||||
|
docker_path: 'noble-kilted/deps'
|
||||||
|
- docker_tag: resolute-deps
|
||||||
|
docker_tags: |
|
||||||
|
introlab3it/rtabmap:resolute-deps
|
||||||
|
docker_platforms: |
|
||||||
|
linux/amd64
|
||||||
|
linux/arm64
|
||||||
|
docker_path: 'resolute/deps'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
@@ -84,13 +99,15 @@ jobs:
|
|||||||
cache-to: type=inline
|
cache-to: type=inline
|
||||||
|
|
||||||
docker:
|
docker:
|
||||||
#needs: docker_deps
|
needs: docker_deps
|
||||||
|
# Run even when docker_deps is skipped (it is, on pull requests).
|
||||||
|
if: ${{ !cancelled() && !failure() }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
docker_tag: [bionic, focal, jammy, jammy-iron, noble, android23, android24, android26, android30]
|
docker_tag: [bionic, focal, jammy, noble, noble-kilted, resolute, android23, android24, android26, android30]
|
||||||
include:
|
include:
|
||||||
- docker_tag: bionic
|
- docker_tag: bionic
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
@@ -112,7 +129,6 @@ jobs:
|
|||||||
docker_platforms: |
|
docker_platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
linux/arm64
|
linux/arm64
|
||||||
linux/arm/v7
|
|
||||||
docker_path: 'focal'
|
docker_path: 'focal'
|
||||||
- docker_tag: jammy
|
- docker_tag: jammy
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
@@ -124,14 +140,6 @@ jobs:
|
|||||||
linux/amd64
|
linux/amd64
|
||||||
linux/arm64
|
linux/arm64
|
||||||
docker_path: 'jammy'
|
docker_path: 'jammy'
|
||||||
- docker_tag: jammy-iron
|
|
||||||
docker_tags: |
|
|
||||||
introlab3it/rtabmap:jammy-iron
|
|
||||||
docker_args: |
|
|
||||||
NOT_USED=0
|
|
||||||
docker_platforms: |
|
|
||||||
linux/amd64
|
|
||||||
docker_path: 'jammy-iron'
|
|
||||||
- docker_tag: noble
|
- docker_tag: noble
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:noble
|
introlab3it/rtabmap:noble
|
||||||
@@ -142,6 +150,25 @@ jobs:
|
|||||||
linux/amd64
|
linux/amd64
|
||||||
linux/arm64
|
linux/arm64
|
||||||
docker_path: 'noble'
|
docker_path: 'noble'
|
||||||
|
- docker_tag: noble-kilted
|
||||||
|
docker_tags: |
|
||||||
|
introlab3it/rtabmap:noble-kilted
|
||||||
|
docker_args: |
|
||||||
|
NOT_USED=0
|
||||||
|
docker_platforms: |
|
||||||
|
linux/amd64
|
||||||
|
linux/arm64
|
||||||
|
docker_path: 'noble-kilted'
|
||||||
|
- docker_tag: resolute
|
||||||
|
docker_tags: |
|
||||||
|
introlab3it/rtabmap:resolute
|
||||||
|
introlab3it/rtabmap:26.04
|
||||||
|
docker_args: |
|
||||||
|
NOT_USED=0
|
||||||
|
docker_platforms: |
|
||||||
|
linux/amd64
|
||||||
|
linux/arm64
|
||||||
|
docker_path: 'resolute'
|
||||||
- docker_tag: android23
|
- docker_tag: android23
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:android23
|
introlab3it/rtabmap:android23
|
||||||
@@ -150,7 +177,7 @@ jobs:
|
|||||||
API_VERSION=23
|
API_VERSION=23
|
||||||
docker_platforms: |
|
docker_platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
docker_path: 'bionic/android/rtabmap_apiXX'
|
docker_path: 'noble/android/rtabmap_apiXX'
|
||||||
- docker_tag: android24
|
- docker_tag: android24
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:android24
|
introlab3it/rtabmap:android24
|
||||||
@@ -158,7 +185,7 @@ jobs:
|
|||||||
API_VERSION=24
|
API_VERSION=24
|
||||||
docker_platforms: |
|
docker_platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
docker_path: 'bionic/android/rtabmap_apiXX'
|
docker_path: 'noble/android/rtabmap_apiXX'
|
||||||
- docker_tag: android26
|
- docker_tag: android26
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:android26
|
introlab3it/rtabmap:android26
|
||||||
@@ -166,7 +193,7 @@ jobs:
|
|||||||
API_VERSION=26
|
API_VERSION=26
|
||||||
docker_platforms: |
|
docker_platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
docker_path: 'bionic/android/rtabmap_apiXX'
|
docker_path: 'noble/android/rtabmap_apiXX'
|
||||||
- docker_tag: android30
|
- docker_tag: android30
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:android30
|
introlab3it/rtabmap:android30
|
||||||
@@ -174,7 +201,7 @@ jobs:
|
|||||||
API_VERSION=30
|
API_VERSION=30
|
||||||
docker_platforms: |
|
docker_platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
docker_path: 'bionic/android/rtabmap_apiXX'
|
docker_path: 'noble/android/rtabmap_apiXX'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
@@ -190,6 +217,9 @@ jobs:
|
|||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
-
|
-
|
||||||
name: Login to DockerHub
|
name: Login to DockerHub
|
||||||
|
# Only needed when pushing; skipped on pull requests (secrets are
|
||||||
|
# unavailable for fork PRs and we don't push there anyway).
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
@@ -199,8 +229,8 @@ jobs:
|
|||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: true
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
platforms: ${{ matrix.docker_platforms }}
|
platforms: ${{ github.event_name == 'pull_request' && 'linux/amd64' || matrix.docker_platforms }}
|
||||||
file: ./docker/${{ matrix.docker_path }}/Dockerfile
|
file: ./docker/${{ matrix.docker_path }}/Dockerfile
|
||||||
build-args: |
|
build-args: |
|
||||||
${{ matrix.docker_args }}
|
${{ matrix.docker_args }}
|
||||||
|
|||||||
@@ -0,0 +1,114 @@
|
|||||||
|
name: iOS
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
paths: &ios_paths
|
||||||
|
- '.github/workflows/ios.yml'
|
||||||
|
- 'app/ios/**'
|
||||||
|
- 'app/android/jni/**'
|
||||||
|
- 'corelib/**'
|
||||||
|
- 'utilite/**'
|
||||||
|
- 'cmake_modules/**'
|
||||||
|
- 'CMakeLists.txt'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
paths: *ios_paths
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
|
env:
|
||||||
|
# Pre-built iOS dependencies (content of app/ios/RTABMapApp/Libraries, generated by install_deps.sh).
|
||||||
|
# Bump this when the dependency set changes (must match the Xcode toolchain below).
|
||||||
|
DEPS_URL: https://github.com/introlab/rtabmap/releases/download/0.23.1/libraries-ios-xcode26.5.zip
|
||||||
|
XCODE_VERSION: '26.5'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: build-ios
|
||||||
|
# macos-26 (Tahoe) ships Xcode 26.x, matching the toolchain used to build the prebuilt libraries.
|
||||||
|
runs-on: macos-26
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Select Xcode ${{ env.XCODE_VERSION }}
|
||||||
|
uses: maxim-lobanov/setup-xcode@v1
|
||||||
|
with:
|
||||||
|
xcode-version: ${{ env.XCODE_VERSION }}
|
||||||
|
|
||||||
|
- name: Versions
|
||||||
|
run: |
|
||||||
|
xcodebuild -version
|
||||||
|
cmake --version || brew install cmake
|
||||||
|
|
||||||
|
- name: Cache prebuilt dependencies archive
|
||||||
|
id: deps-cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: deps.zip
|
||||||
|
# Keyed on the archive URL (release tag + filename), so the cache is
|
||||||
|
# reused until DEPS_URL is bumped, regardless of other workflow edits.
|
||||||
|
key: ${{ runner.os }}-ios-deps-${{ env.DEPS_URL }}
|
||||||
|
|
||||||
|
- name: Download prebuilt dependencies
|
||||||
|
if: steps.deps-cache.outputs.cache-hit != 'true'
|
||||||
|
run: curl -L "$DEPS_URL" -o deps.zip
|
||||||
|
|
||||||
|
- name: Extract dependencies into Libraries
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
mkdir -p app/ios/RTABMapApp/Libraries
|
||||||
|
rm -rf deps_extract && mkdir -p deps_extract
|
||||||
|
unzip -q deps.zip -d deps_extract
|
||||||
|
# The archive holds the *content* of the Libraries folder (include/ lib/ share/),
|
||||||
|
# but tolerate an extra top-level Libraries/ wrapper just in case.
|
||||||
|
if [ -d deps_extract/Libraries ]; then
|
||||||
|
SRC=deps_extract/Libraries
|
||||||
|
else
|
||||||
|
SRC=deps_extract
|
||||||
|
fi
|
||||||
|
cp -R "$SRC"/. app/ios/RTABMapApp/Libraries/
|
||||||
|
test -d app/ios/RTABMapApp/Libraries/include
|
||||||
|
test -d app/ios/RTABMapApp/Libraries/lib
|
||||||
|
|
||||||
|
- name: Build rtabmap core (third-party deps are skipped, already provided by the archive)
|
||||||
|
working-directory: app/ios/RTABMapApp
|
||||||
|
run: ./install_deps.sh
|
||||||
|
|
||||||
|
- name: Build RTABMapApp
|
||||||
|
run: |
|
||||||
|
xcodebuild \
|
||||||
|
-project app/ios/RTABMapApp.xcodeproj \
|
||||||
|
-scheme RTABMapApp \
|
||||||
|
-configuration Release \
|
||||||
|
-sdk iphoneos \
|
||||||
|
-destination 'generic/platform=iOS' \
|
||||||
|
-derivedDataPath build \
|
||||||
|
CODE_SIGNING_ALLOWED=NO \
|
||||||
|
CODE_SIGNING_REQUIRED=NO \
|
||||||
|
CODE_SIGN_IDENTITY="" \
|
||||||
|
DEVELOPMENT_TEAM="" \
|
||||||
|
build
|
||||||
|
|
||||||
|
- name: Package app (unsigned .ipa)
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
APP_DIR="build/Build/Products/Release-iphoneos"
|
||||||
|
rm -rf Payload && mkdir Payload
|
||||||
|
cp -R "$APP_DIR/RTABMapApp.app" Payload/
|
||||||
|
# Unsigned .ipa: not installable as-is, but ready for later (re)signing.
|
||||||
|
zip -q -r RTABMapApp-unsigned.ipa Payload
|
||||||
|
|
||||||
|
- name: Upload app artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: RTABMapApp-ios-unsigned
|
||||||
|
path: RTABMapApp-unsigned.ipa
|
||||||
|
compression-level: 0
|
||||||
|
if-no-files-found: error
|
||||||
|
retention-days: ${{ github.event_name == 'pull_request' && 1 || 90 }}
|
||||||
+284
-103
@@ -1,5 +1,6 @@
|
|||||||
# Top-Level CmakeLists.txt
|
# Top-Level CmakeLists.txt
|
||||||
cmake_minimum_required(VERSION 3.14)
|
cmake_minimum_required(VERSION 3.14)
|
||||||
|
|
||||||
PROJECT( RTABMap )
|
PROJECT( RTABMap )
|
||||||
SET(PROJECT_PREFIX rtabmap)
|
SET(PROJECT_PREFIX rtabmap)
|
||||||
|
|
||||||
@@ -11,6 +12,7 @@ IF(NOT MULTI_ARCH AND NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
|||||||
ENDIF(NOT MULTI_ARCH AND NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
ENDIF(NOT MULTI_ARCH AND NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
||||||
|
|
||||||
INCLUDE(GNUInstallDirs)
|
INCLUDE(GNUInstallDirs)
|
||||||
|
INCLUDE(FetchContent)
|
||||||
|
|
||||||
####### local cmake modules #######
|
####### local cmake modules #######
|
||||||
SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake_modules")
|
SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake_modules")
|
||||||
@@ -19,11 +21,19 @@ SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake_modules")
|
|||||||
# VERSION
|
# VERSION
|
||||||
#######################
|
#######################
|
||||||
SET(RTABMAP_MAJOR_VERSION 0)
|
SET(RTABMAP_MAJOR_VERSION 0)
|
||||||
SET(RTABMAP_MINOR_VERSION 21)
|
SET(RTABMAP_MINOR_VERSION 23)
|
||||||
SET(RTABMAP_PATCH_VERSION 13)
|
SET(RTABMAP_PATCH_VERSION 7)
|
||||||
SET(RTABMAP_VERSION
|
SET(RTABMAP_VERSION
|
||||||
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
||||||
|
|
||||||
|
# Make sure we have valid version so that RTABMAP_VERSION_COMPARE logic in Version.h works
|
||||||
|
IF(RTABMAP_MINOR_VERSION GREATER 99)
|
||||||
|
MESSAGE(FATAL_ERROR "RTABMAP_MINOR_VERSION must be < 100, bump major version and restart minor to 0!")
|
||||||
|
ENDIF()
|
||||||
|
IF(RTABMAP_PATCH_VERSION GREATER 99)
|
||||||
|
MESSAGE(FATAL_ERROR "RTABMAP_PATCH_VERSION must be < 100, bump minor version and restart patch to 0!")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
SET(PROJECT_VERSION "${RTABMAP_VERSION}")
|
SET(PROJECT_VERSION "${RTABMAP_VERSION}")
|
||||||
|
|
||||||
SET(PROJECT_VERSION_MAJOR ${RTABMAP_MAJOR_VERSION})
|
SET(PROJECT_VERSION_MAJOR ${RTABMAP_MAJOR_VERSION})
|
||||||
@@ -83,14 +93,6 @@ IF(MINGW)
|
|||||||
SET(CMAKE_SHARED_LINKER_FLAGS "-Wl,--enable-auto-import")
|
SET(CMAKE_SHARED_LINKER_FLAGS "-Wl,--enable-auto-import")
|
||||||
ENDIF(MINGW)
|
ENDIF(MINGW)
|
||||||
|
|
||||||
# GCC 4 required
|
|
||||||
IF(UNIX OR MINGW)
|
|
||||||
EXEC_PROGRAM( gcc ARGS "-dumpversion" OUTPUT_VARIABLE GCC_VERSION )
|
|
||||||
IF(GCC_VERSION VERSION_LESS "4.0.0")
|
|
||||||
MESSAGE(FATAL_ERROR "GCC ${GCC_VERSION} found, but version 4.x.x minimum is required")
|
|
||||||
ENDIF(GCC_VERSION VERSION_LESS "4.0.0")
|
|
||||||
ENDIF(UNIX OR MINGW)
|
|
||||||
|
|
||||||
#The CDT Error Parser cannot handle error messages that span
|
#The CDT Error Parser cannot handle error messages that span
|
||||||
#more than one line, which is the default gcc behavior.
|
#more than one line, which is the default gcc behavior.
|
||||||
#In order to force gcc to generate single line error messages with no line wrapping
|
#In order to force gcc to generate single line error messages with no line wrapping
|
||||||
@@ -198,15 +200,17 @@ option(WITH_CCCORELIB "Include CCCoreLib support" OFF)
|
|||||||
option(WITH_OPEN3D "Include Open3D support" OFF)
|
option(WITH_OPEN3D "Include Open3D support" OFF)
|
||||||
option(WITH_LOAM "Include LOAM support" OFF)
|
option(WITH_LOAM "Include LOAM support" OFF)
|
||||||
option(WITH_FLOAM "Include FLOAM support" OFF)
|
option(WITH_FLOAM "Include FLOAM support" OFF)
|
||||||
|
option(WITH_LIOSAM "Include LIO-SAM support" OFF)
|
||||||
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_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 RealSense2 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" OFF)
|
option(WITH_DEPTHAI "Include depthai-core support" OFF)
|
||||||
option(WITH_XVSDK "Include XVisio SDK support" OFF)
|
option(WITH_XVSDK "Include XVisio SDK support" OFF)
|
||||||
|
option(WITH_ORBBEC_SDK "Include Orbbec SDK v2 support" OFF)
|
||||||
option(WITH_OCTOMAP "Include OctoMap support" ON)
|
option(WITH_OCTOMAP "Include OctoMap support" ON)
|
||||||
option(WITH_GRIDMAP "Include GridMap support" OFF)
|
option(WITH_GRIDMAP "Include GridMap support" OFF)
|
||||||
option(WITH_CPUTSDF "Include CPUTSDF support" OFF)
|
option(WITH_CPUTSDF "Include CPUTSDF support" OFF)
|
||||||
@@ -218,12 +222,15 @@ option(WITH_DVO "Include DVO support" OFF)
|
|||||||
option(WITH_ORB_SLAM "Include ORB_SLAM2 or ORB_SLAM3 support" OFF)
|
option(WITH_ORB_SLAM "Include ORB_SLAM2 or ORB_SLAM3 support" OFF)
|
||||||
option(WITH_OKVIS "Include OKVIS support" OFF)
|
option(WITH_OKVIS "Include OKVIS support" OFF)
|
||||||
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" OFF)
|
option(WITH_VINS_FUSION "Include VINS-Fusion support" OFF)
|
||||||
option(WITH_OPENVINS "Include OpenVINS support" OFF)
|
option(WITH_OPENVINS "Include OpenVINS support" OFF)
|
||||||
|
option(WITH_CUVSLAM "Include cuVSLAM support" OFF)
|
||||||
option(WITH_MADGWICK "Include Madgwick IMU filtering support" ON)
|
option(WITH_MADGWICK "Include Madgwick IMU filtering support" ON)
|
||||||
option(WITH_FASTCV "Include FastCV support" ON)
|
option(WITH_FASTCV "Include FastCV support" ON)
|
||||||
option(WITH_OPENMP "Include OpenMP support" ON)
|
option(WITH_OPENMP "Include OpenMP support" ON)
|
||||||
option(WITH_OPENGV "Include OpenGV support" ON)
|
option(WITH_OPENGV "Include OpenGV support" ON)
|
||||||
|
option(BUILD_OPENGV "Build OpenGV internally instead of using the system one" OFF)
|
||||||
|
option(WITH_APRILTAG "Include AprilTag support" OFF)
|
||||||
IF(MOBILE_BUILD)
|
IF(MOBILE_BUILD)
|
||||||
option(PCL_OMP "With PCL OMP implementations" OFF)
|
option(PCL_OMP "With PCL OMP implementations" OFF)
|
||||||
ELSE()
|
ELSE()
|
||||||
@@ -396,7 +403,7 @@ IF(NOT VTK_FOUND)
|
|||||||
ENDIF(NOT VTK_FOUND)
|
ENDIF(NOT VTK_FOUND)
|
||||||
|
|
||||||
IF(WITH_TORCH)
|
IF(WITH_TORCH)
|
||||||
FIND_PACKAGE(Torch QUIET)
|
FIND_PACKAGE(Torch)
|
||||||
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)
|
||||||
@@ -418,14 +425,14 @@ IF(WITH_PDAL)
|
|||||||
ENDIF(WITH_PDAL)
|
ENDIF(WITH_PDAL)
|
||||||
|
|
||||||
IF(WITH_LIBLAS)
|
IF(WITH_LIBLAS)
|
||||||
FIND_PACKAGE(libLAS QUIET)
|
FIND_PACKAGE(libLAS)
|
||||||
IF(libLAS_FOUND)
|
IF(libLAS_FOUND)
|
||||||
MESSAGE(STATUS "Found libLAS ${libLAS_VERSION}: ${libLAS_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found libLAS ${libLAS_VERSION}: ${libLAS_INCLUDE_DIRS}")
|
||||||
ENDIF(libLAS_FOUND)
|
ENDIF(libLAS_FOUND)
|
||||||
ENDIF(WITH_LIBLAS)
|
ENDIF(WITH_LIBLAS)
|
||||||
|
|
||||||
IF(WITH_CUDASIFT)
|
IF(WITH_CUDASIFT)
|
||||||
FIND_PACKAGE(CudaSift 3 QUIET)
|
FIND_PACKAGE(CudaSift 3)
|
||||||
IF(CudaSift_FOUND)
|
IF(CudaSift_FOUND)
|
||||||
MESSAGE(STATUS "Found CudaSift")
|
MESSAGE(STATUS "Found CudaSift")
|
||||||
ENDIF(CudaSift_FOUND)
|
ENDIF(CudaSift_FOUND)
|
||||||
@@ -496,22 +503,30 @@ ENDIF(WITH_DC1394)
|
|||||||
IF(WITH_G2O)
|
IF(WITH_G2O)
|
||||||
FIND_PACKAGE(g2o NO_MODULE)
|
FIND_PACKAGE(g2o NO_MODULE)
|
||||||
IF(g2o_FOUND)
|
IF(g2o_FOUND)
|
||||||
MESSAGE(STATUS "Found g2o (targets)")
|
MESSAGE(STATUS "Found g2o (targets)")
|
||||||
SET(G2O_FOUND ${g2o_FOUND})
|
SET(G2O_FOUND ${g2o_FOUND})
|
||||||
get_target_property(G2O_INCLUDES g2o::core INTERFACE_INCLUDE_DIRECTORIES)
|
get_target_property(G2O_INCLUDES g2o::core INTERFACE_INCLUDE_DIRECTORIES)
|
||||||
MESSAGE(STATUS "g2o include dir: ${G2O_INCLUDES}")
|
MESSAGE(STATUS "g2o include dir: ${G2O_INCLUDES}")
|
||||||
FIND_FILE(G2O_FACTORY_FILE g2o/core/factory.h
|
FIND_FILE(G2O_FACTORY_FILE g2o/core/factory.h
|
||||||
PATHS ${G2O_INCLUDES}
|
PATHS ${G2O_INCLUDES}
|
||||||
NO_DEFAULT_PATH)
|
NO_DEFAULT_PATH)
|
||||||
FILE(READ ${G2O_FACTORY_FILE} TMPTXT)
|
FILE(READ ${G2O_FACTORY_FILE} TMPTXT)
|
||||||
STRING(FIND "${TMPTXT}" "shared_ptr" matchres)
|
STRING(FIND "${TMPTXT}" "shared_ptr" matchres)
|
||||||
IF(${matchres} EQUAL -1)
|
IF(${matchres} EQUAL -1)
|
||||||
MESSAGE(STATUS "Old g2o factory version detected without shared ptr (factory file: ${G2O_FACTORY_FILE}).")
|
MESSAGE(STATUS "Old g2o factory version detected without shared ptr (factory file: ${G2O_FACTORY_FILE}).")
|
||||||
SET(G2O_CPP11 2)
|
SET(G2O_CPP11 2)
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS "Latest g2o factory version detected with shared ptr (factory file: ${G2O_FACTORY_FILE}).")
|
MESSAGE(STATUS "Latest g2o factory version detected with shared ptr (factory file: ${G2O_FACTORY_FILE}).")
|
||||||
SET(G2O_CPP11 1)
|
SET(G2O_CPP11 1)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
FIND_FILE(G2O_SBA_UTILS_FILE g2o/types/sba/sba_utils.h
|
||||||
|
PATHS ${G2O_INCLUDES}
|
||||||
|
NO_DEFAULT_PATH)
|
||||||
|
IF(G2O_SBA_UTILS_FILE)
|
||||||
|
SET(G2O_WITH_SBA_UTILS 1)
|
||||||
|
ELSE()
|
||||||
|
SET(G2O_WITH_SBA_UTILS 0)
|
||||||
|
ENDIF()
|
||||||
ELSE()
|
ELSE()
|
||||||
FIND_PACKAGE(G2O QUIET)
|
FIND_PACKAGE(G2O QUIET)
|
||||||
IF(G2O_FOUND)
|
IF(G2O_FOUND)
|
||||||
@@ -523,6 +538,16 @@ ENDIF(WITH_G2O)
|
|||||||
IF(WITH_GTSAM)
|
IF(WITH_GTSAM)
|
||||||
# Force config mode to ignore PCL's findGTSAM.cmake file
|
# Force config mode to ignore PCL's findGTSAM.cmake file
|
||||||
FIND_PACKAGE(GTSAM CONFIG QUIET)
|
FIND_PACKAGE(GTSAM CONFIG QUIET)
|
||||||
|
IF(GTSAM_FOUND)
|
||||||
|
# For issue https://github.com/introlab/rtabmap/pull/1626
|
||||||
|
FIND_FILE(GTSAM_NOISE_MODEL_FACTOR_N_FILE gtsam/nonlinear/NoiseModelFactorN.h
|
||||||
|
PATHS ${GTSAM_INCLUDE_DIR}
|
||||||
|
NO_DEFAULT_PATH)
|
||||||
|
IF(GTSAM_NOISE_MODEL_FACTOR_N_FILE)
|
||||||
|
MESSAGE(STATUS "GTSAM with NoiseModelFactorN.h")
|
||||||
|
ADD_DEFINITIONS("-DGTSAM_WITH_NOISE_MODEL_FACTOR_N")
|
||||||
|
ENDIF(GTSAM_NOISE_MODEL_FACTOR_N_FILE)
|
||||||
|
ENDIF(GTSAM_FOUND)
|
||||||
ENDIF(WITH_GTSAM)
|
ENDIF(WITH_GTSAM)
|
||||||
|
|
||||||
IF(WITH_MRPT)
|
IF(WITH_MRPT)
|
||||||
@@ -541,7 +566,7 @@ IF(WITH_FLYCAPTURE2)
|
|||||||
ENDIF(WITH_FLYCAPTURE2)
|
ENDIF(WITH_FLYCAPTURE2)
|
||||||
|
|
||||||
IF(WITH_CVSBA)
|
IF(WITH_CVSBA)
|
||||||
FIND_PACKAGE(cvsba QUIET)
|
FIND_PACKAGE(cvsba)
|
||||||
IF(cvsba_FOUND)
|
IF(cvsba_FOUND)
|
||||||
MESSAGE(STATUS "Found cvsba: ${cvsba_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found cvsba: ${cvsba_INCLUDE_DIRS}")
|
||||||
ENDIF(cvsba_FOUND)
|
ENDIF(cvsba_FOUND)
|
||||||
@@ -567,10 +592,14 @@ IF(WITH_POINTMATCHER)
|
|||||||
ENDIF(WITH_POINTMATCHER)
|
ENDIF(WITH_POINTMATCHER)
|
||||||
|
|
||||||
IF(libpointmatcher_FOUND OR GTSAM_FOUND)
|
IF(libpointmatcher_FOUND OR GTSAM_FOUND)
|
||||||
find_package(Boost COMPONENTS thread filesystem system program_options date_time REQUIRED)
|
find_package(Boost COMPONENTS thread filesystem program_options date_time REQUIRED)
|
||||||
IF(Boost_MINOR_VERSION GREATER 47)
|
IF(Boost_MINOR_VERSION GREATER 80)
|
||||||
|
find_package(Boost COMPONENTS thread filesystem program_options date_time chrono timer serialization REQUIRED)
|
||||||
|
ELSEIF(Boost_MINOR_VERSION GREATER 47)
|
||||||
find_package(Boost COMPONENTS thread filesystem system program_options date_time chrono timer serialization REQUIRED)
|
find_package(Boost COMPONENTS thread filesystem system program_options date_time chrono timer serialization REQUIRED)
|
||||||
ENDIF(Boost_MINOR_VERSION GREATER 47)
|
ELSE()
|
||||||
|
find_package(Boost COMPONENTS thread filesystem system program_options date_time REQUIRED)
|
||||||
|
ENDIF()
|
||||||
IF(WIN32)
|
IF(WIN32)
|
||||||
MESSAGE(STATUS "Boost_LIBRARY_DIRS=${Boost_LIBRARY_DIRS}")
|
MESSAGE(STATUS "Boost_LIBRARY_DIRS=${Boost_LIBRARY_DIRS}")
|
||||||
link_directories(${Boost_LIBRARY_DIRS})
|
link_directories(${Boost_LIBRARY_DIRS})
|
||||||
@@ -578,7 +607,7 @@ IF(libpointmatcher_FOUND OR GTSAM_FOUND)
|
|||||||
ENDIF(libpointmatcher_FOUND OR GTSAM_FOUND)
|
ENDIF(libpointmatcher_FOUND OR GTSAM_FOUND)
|
||||||
|
|
||||||
IF(WITH_CCCORELIB)
|
IF(WITH_CCCORELIB)
|
||||||
find_package(CCCoreLib QUIET)
|
find_package(CCCoreLib)
|
||||||
IF(CCCoreLib_FOUND)
|
IF(CCCoreLib_FOUND)
|
||||||
MESSAGE(STATUS "Found CCCoreLib: ${CCCoreLib_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found CCCoreLib: ${CCCoreLib_INCLUDE_DIRS}")
|
||||||
ENDIF(CCCoreLib_FOUND)
|
ENDIF(CCCoreLib_FOUND)
|
||||||
@@ -590,7 +619,7 @@ IF(WITH_OPEN3D)
|
|||||||
ELSE()
|
ELSE()
|
||||||
# Build Open3D like this to avoid linker errors in rtabmap:
|
# Build Open3D like this to avoid linker errors in rtabmap:
|
||||||
# cmake -DBUILD_SHARED_LIBS=ON -DGLIBCXX_USE_CXX11_ABI=ON -DCMAKE_BUILD_TYPE=Release ..
|
# cmake -DBUILD_SHARED_LIBS=ON -DGLIBCXX_USE_CXX11_ABI=ON -DCMAKE_BUILD_TYPE=Release ..
|
||||||
find_package(Open3D QUIET)
|
find_package(Open3D)
|
||||||
IF(Open3D_FOUND)
|
IF(Open3D_FOUND)
|
||||||
MESSAGE(STATUS "Found Open3D: ${Open3DINCLUDE_DIRS}")
|
MESSAGE(STATUS "Found Open3D: ${Open3DINCLUDE_DIRS}")
|
||||||
ENDIF(Open3D_FOUND)
|
ENDIF(Open3D_FOUND)
|
||||||
@@ -598,19 +627,25 @@ IF(WITH_OPEN3D)
|
|||||||
ENDIF(WITH_OPEN3D)
|
ENDIF(WITH_OPEN3D)
|
||||||
|
|
||||||
IF(WITH_LOAM)
|
IF(WITH_LOAM)
|
||||||
find_package(loam_velodyne QUIET)
|
find_package(loam_velodyne)
|
||||||
IF(loam_velodyne_FOUND)
|
IF(loam_velodyne_FOUND)
|
||||||
MESSAGE(STATUS "Found loam_velodyne: ${loam_velodyne_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found loam_velodyne: ${loam_velodyne_INCLUDE_DIRS}")
|
||||||
ENDIF(loam_velodyne_FOUND)
|
ENDIF(loam_velodyne_FOUND)
|
||||||
ENDIF(WITH_LOAM)
|
ENDIF(WITH_LOAM)
|
||||||
|
|
||||||
IF(WITH_FLOAM)
|
IF(WITH_FLOAM)
|
||||||
find_package(floam QUIET)
|
find_package(floam)
|
||||||
IF(floam_FOUND)
|
IF(floam_FOUND)
|
||||||
MESSAGE(STATUS "Found floam: ${floam_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found floam: ${floam_INCLUDE_DIRS}")
|
||||||
FIND_PACKAGE(Ceres QUIET REQUIRED)
|
FIND_PACKAGE(Ceres REQUIRED)
|
||||||
ENDIF(floam_FOUND)
|
ENDIF(floam_FOUND)
|
||||||
ENDIF(WITH_FLOAM)
|
ENDIF(WITH_FLOAM)
|
||||||
|
IF(WITH_LIOSAM)
|
||||||
|
find_package(lio_sam QUIET)
|
||||||
|
IF(lio_sam_FOUND)
|
||||||
|
MESSAGE(STATUS "Found lio_sam: ${lio_sam_INCLUDE_DIRS}")
|
||||||
|
ENDIF(lio_sam_FOUND)
|
||||||
|
ENDIF(WITH_LIOSAM)
|
||||||
|
|
||||||
SET(ZED_FOUND FALSE)
|
SET(ZED_FOUND FALSE)
|
||||||
IF(WITH_ZED)
|
IF(WITH_ZED)
|
||||||
@@ -623,7 +658,8 @@ IF(WITH_ZED)
|
|||||||
IF(CUDA_FOUND)
|
IF(CUDA_FOUND)
|
||||||
MESSAGE(STATUS "Found CUDA: ${CUDA_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found CUDA: ${CUDA_INCLUDE_DIRS}")
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(FATAL_ERROR "CUDA is required to build with Zed sdk! Set -DWITH_ZED=OFF if you don't have CUDA.")
|
MESSAGE(WARNING "CUDA is required to build with Zed sdk! Set -DWITH_ZED=OFF if you don't have CUDA.")
|
||||||
|
SET(ZED_FOUND FALSE)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF(ZED_FOUND)
|
ENDIF(ZED_FOUND)
|
||||||
ENDIF(WITH_ZED)
|
ENDIF(WITH_ZED)
|
||||||
@@ -675,19 +711,26 @@ IF(WITH_MYNTEYE)
|
|||||||
ENDIF(WITH_MYNTEYE)
|
ENDIF(WITH_MYNTEYE)
|
||||||
|
|
||||||
IF(WITH_DEPTHAI)
|
IF(WITH_DEPTHAI)
|
||||||
FIND_PACKAGE(depthai 2.24 QUIET)
|
FIND_PACKAGE(depthai 2.24)
|
||||||
IF(depthai_FOUND)
|
IF(depthai_FOUND)
|
||||||
MESSAGE(STATUS "Found depthai-core (targets)")
|
MESSAGE(STATUS "Found depthai-core (targets)")
|
||||||
ENDIF(depthai_FOUND)
|
ENDIF(depthai_FOUND)
|
||||||
ENDIF(WITH_DEPTHAI)
|
ENDIF(WITH_DEPTHAI)
|
||||||
|
|
||||||
IF(WITH_XVSDK)
|
IF(WITH_XVSDK)
|
||||||
FIND_PACKAGE(xvsdk QUIET)
|
FIND_PACKAGE(xvsdk)
|
||||||
IF(xvsdk_FOUND)
|
IF(xvsdk_FOUND)
|
||||||
MESSAGE(STATUS "Found xvsdk (targets)")
|
MESSAGE(STATUS "Found xvsdk (targets)")
|
||||||
ENDIF(xvsdk_FOUND)
|
ENDIF(xvsdk_FOUND)
|
||||||
ENDIF(WITH_XVSDK)
|
ENDIF(WITH_XVSDK)
|
||||||
|
|
||||||
|
IF(WITH_ORBBEC_SDK)
|
||||||
|
FIND_PACKAGE(OrbbecSDK 2)
|
||||||
|
IF(OrbbecSDK_FOUND)
|
||||||
|
MESSAGE(STATUS "Found OrbbecSDK v2 (targets)")
|
||||||
|
ENDIF(OrbbecSDK_FOUND)
|
||||||
|
ENDIF(WITH_ORBBEC_SDK)
|
||||||
|
|
||||||
IF(WITH_OCTOMAP)
|
IF(WITH_OCTOMAP)
|
||||||
FIND_PACKAGE(octomap QUIET)
|
FIND_PACKAGE(octomap QUIET)
|
||||||
IF(octomap_FOUND)
|
IF(octomap_FOUND)
|
||||||
@@ -699,35 +742,35 @@ IF(WITH_OCTOMAP)
|
|||||||
ENDIF(WITH_OCTOMAP)
|
ENDIF(WITH_OCTOMAP)
|
||||||
|
|
||||||
IF(WITH_GRIDMAP)
|
IF(WITH_GRIDMAP)
|
||||||
FIND_PACKAGE(grid_map_core QUIET)
|
FIND_PACKAGE(grid_map_core)
|
||||||
IF(grid_map_core_FOUND)
|
IF(grid_map_core_FOUND)
|
||||||
MESSAGE(STATUS "Found grid_map_core ${grid_map_core_VERSION}: ${grid_map_core_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found grid_map_core ${grid_map_core_VERSION}: ${grid_map_core_INCLUDE_DIRS}")
|
||||||
ENDIF(grid_map_core_FOUND)
|
ENDIF(grid_map_core_FOUND)
|
||||||
ENDIF(WITH_GRIDMAP)
|
ENDIF(WITH_GRIDMAP)
|
||||||
|
|
||||||
IF(WITH_CPUTSDF)
|
IF(WITH_CPUTSDF)
|
||||||
FIND_PACKAGE(CPUTSDF QUIET)
|
FIND_PACKAGE(CPUTSDF)
|
||||||
IF(CPUTSDF_FOUND)
|
IF(CPUTSDF_FOUND)
|
||||||
MESSAGE(STATUS "Found CPUTSDF: ${CPUTSDF_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found CPUTSDF: ${CPUTSDF_INCLUDE_DIRS}")
|
||||||
ENDIF(CPUTSDF_FOUND)
|
ENDIF(CPUTSDF_FOUND)
|
||||||
ENDIF(WITH_CPUTSDF)
|
ENDIF(WITH_CPUTSDF)
|
||||||
|
|
||||||
IF(WITH_OPENCHISEL)
|
IF(WITH_OPENCHISEL)
|
||||||
find_package(open_chisel QUIET)
|
find_package(open_chisel)
|
||||||
if(open_chisel_FOUND)
|
if(open_chisel_FOUND)
|
||||||
MESSAGE(STATUS "Found open_chisel: ${open_chisel_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found open_chisel: ${open_chisel_INCLUDE_DIRS}")
|
||||||
endif(open_chisel_FOUND)
|
endif(open_chisel_FOUND)
|
||||||
ENDIF(WITH_OPENCHISEL)
|
ENDIF(WITH_OPENCHISEL)
|
||||||
|
|
||||||
IF(WITH_ALICE_VISION)
|
IF(WITH_ALICE_VISION)
|
||||||
find_package(AliceVision CONFIG QUIET)
|
find_package(AliceVision CONFIG)
|
||||||
IF(AliceVision_FOUND)
|
IF(AliceVision_FOUND)
|
||||||
IF(${AliceVision_VERSION} VERSION_LESS_EQUAL "2.2")
|
IF(${AliceVision_VERSION} VERSION_LESS_EQUAL "2.2")
|
||||||
find_package(Boost COMPONENTS log log_setup container REQUIRED)
|
find_package(Boost COMPONENTS log log_setup container REQUIRED)
|
||||||
ENDIF(${AliceVision_VERSION} VERSION_LESS_EQUAL "2.2")
|
ENDIF(${AliceVision_VERSION} VERSION_LESS_EQUAL "2.2")
|
||||||
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)
|
||||||
find_package(assimp QUIET)
|
find_package(assimp)
|
||||||
add_definitions("-DRTABMAP_ALICE_VISION_MAJOR=${AliceVision_VERSION_MAJOR}")
|
add_definitions("-DRTABMAP_ALICE_VISION_MAJOR=${AliceVision_VERSION_MAJOR}")
|
||||||
add_definitions("-DRTABMAP_ALICE_VISION_MINOR=${AliceVision_VERSION_MINOR}")
|
add_definitions("-DRTABMAP_ALICE_VISION_MINOR=${AliceVision_VERSION_MINOR}")
|
||||||
add_definitions("-DRTABMAP_ALICE_VISION_PATCH=${AliceVision_VERSION_PATCH}")
|
add_definitions("-DRTABMAP_ALICE_VISION_PATCH=${AliceVision_VERSION_PATCH}")
|
||||||
@@ -735,34 +778,32 @@ IF(WITH_ALICE_VISION)
|
|||||||
ENDIF(WITH_ALICE_VISION)
|
ENDIF(WITH_ALICE_VISION)
|
||||||
|
|
||||||
IF(WITH_FOVIS)
|
IF(WITH_FOVIS)
|
||||||
FIND_PACKAGE(libfovis QUIET)
|
FIND_PACKAGE(libfovis)
|
||||||
IF(libfovis_FOUND)
|
IF(libfovis_FOUND)
|
||||||
MESSAGE(STATUS "Found libfovis: ${libfovis_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found libfovis: ${libfovis_INCLUDE_DIRS}")
|
||||||
ENDIF(libfovis_FOUND)
|
ENDIF(libfovis_FOUND)
|
||||||
ENDIF(WITH_FOVIS)
|
ENDIF(WITH_FOVIS)
|
||||||
|
|
||||||
IF(WITH_VISO2)
|
IF(WITH_VISO2)
|
||||||
FIND_PACKAGE(libviso2 QUIET)
|
FIND_PACKAGE(libviso2)
|
||||||
IF(libviso2_FOUND)
|
IF(libviso2_FOUND)
|
||||||
MESSAGE(STATUS "Found libviso2: ${libviso2_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found libviso2: ${libviso2_INCLUDE_DIRS}")
|
||||||
ENDIF(libviso2_FOUND)
|
ENDIF(libviso2_FOUND)
|
||||||
ENDIF(WITH_VISO2)
|
ENDIF(WITH_VISO2)
|
||||||
|
|
||||||
IF(WITH_DVO)
|
IF(WITH_DVO)
|
||||||
FIND_PACKAGE(dvo_core QUIET)
|
FIND_PACKAGE(dvo_core)
|
||||||
IF(dvo_core_FOUND)
|
IF(dvo_core_FOUND)
|
||||||
MESSAGE(STATUS "Found dvo_core: ${dvo_core_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found dvo_core: ${dvo_core_INCLUDE_DIRS}")
|
||||||
ENDIF(dvo_core_FOUND)
|
ENDIF(dvo_core_FOUND)
|
||||||
ENDIF(WITH_DVO)
|
ENDIF(WITH_DVO)
|
||||||
|
|
||||||
IF(WITH_OKVIS)
|
IF(WITH_OKVIS)
|
||||||
FIND_PACKAGE(okvis 1.1 QUIET)
|
FIND_PACKAGE(okvis 1.1)
|
||||||
IF(okvis_FOUND)
|
IF(okvis_FOUND)
|
||||||
MESSAGE(STATUS "Found okvis: ${OKVIS_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found okvis: ${OKVIS_INCLUDE_DIRS}")
|
||||||
find_package(brisk 2 REQUIRED)
|
find_package(brisk 2 REQUIRED)
|
||||||
MESSAGE(STATUS "Found brisk: ${BRISK_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found brisk: ${BRISK_INCLUDE_DIRS}")
|
||||||
find_package(opengv REQUIRED)
|
|
||||||
MESSAGE(STATUS "Found opengv: ${OPENGV_INCLUDE_DIRS}")
|
|
||||||
find_package(Ceres 1.9.0 REQUIRED EXACT) # OKVIS requires this specific version
|
find_package(Ceres 1.9.0 REQUIRED EXACT) # OKVIS requires this specific version
|
||||||
MESSAGE(STATUS "Found ceres ${Ceres_VERSION}: ${CERES_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found ceres ${Ceres_VERSION}: ${CERES_INCLUDE_DIRS}")
|
||||||
ENDIF(okvis_FOUND)
|
ENDIF(okvis_FOUND)
|
||||||
@@ -771,7 +812,7 @@ ENDIF(WITH_OKVIS)
|
|||||||
# If built with okvis, we found already ceres above
|
# If built with okvis, we found already ceres above
|
||||||
IF(WITH_CERES)
|
IF(WITH_CERES)
|
||||||
IF(NOT okvis_FOUND AND NOT floam_FOUND)
|
IF(NOT okvis_FOUND AND NOT floam_FOUND)
|
||||||
FIND_PACKAGE(Ceres QUIET)
|
FIND_PACKAGE(Ceres)
|
||||||
MESSAGE(STATUS "Found ceres ${Ceres_VERSION}: ${CERES_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found ceres ${Ceres_VERSION}: ${CERES_INCLUDE_DIRS}")
|
||||||
ENDIF(NOT okvis_FOUND AND NOT floam_FOUND)
|
ENDIF(NOT okvis_FOUND AND NOT floam_FOUND)
|
||||||
ELSEIF(Ceres_FOUND)
|
ELSEIF(Ceres_FOUND)
|
||||||
@@ -779,39 +820,29 @@ ELSEIF(Ceres_FOUND)
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(WITH_MSCKF_VIO)
|
IF(WITH_MSCKF_VIO)
|
||||||
FIND_PACKAGE(msckf_vio QUIET)
|
FIND_PACKAGE(msckf_vio)
|
||||||
IF(msckf_vio_FOUND)
|
IF(msckf_vio_FOUND)
|
||||||
MESSAGE(STATUS "Found msckf_vio: ${msckf_vio_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found msckf_vio: ${msckf_vio_INCLUDE_DIRS}")
|
||||||
ENDIF(msckf_vio_FOUND)
|
ENDIF(msckf_vio_FOUND)
|
||||||
ENDIF(WITH_MSCKF_VIO)
|
ENDIF(WITH_MSCKF_VIO)
|
||||||
|
|
||||||
IF(WITH_VINS)
|
IF(WITH_VINS AND NOT WITH_VINS_FUSION)
|
||||||
FIND_PACKAGE(vins QUIET)
|
message(DEPRECATION "The option WITH_VINS is deprecated and will be removed in a future version. Please use WITH_VINS_FUSION instead.")
|
||||||
|
set(WITH_VINS_FUSION ON)
|
||||||
|
ENDIF(WITH_VINS AND NOT WITH_VINS_FUSION)
|
||||||
|
|
||||||
|
IF(WITH_VINS_FUSION)
|
||||||
|
FIND_PACKAGE(vins)
|
||||||
IF(vins_FOUND)
|
IF(vins_FOUND)
|
||||||
MESSAGE(STATUS "Found vins: ${vins_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found vins-fusion: ${vins_INCLUDE_DIRS}")
|
||||||
IF(okvis_FOUND)
|
IF(okvis_FOUND)
|
||||||
MESSAGE(WARNING "VINS and OKVIS will be both linked to project, make sure VINS has been built with against same Ceres version than OKVIS to avoid some crashes.")
|
MESSAGE(WARNING "VINS-Fusion and OKVIS will be both linked to project, make sure VINS-Fusion has been built with against same Ceres version than OKVIS to avoid some crashes.")
|
||||||
ENDIF(okvis_FOUND)
|
ENDIF(okvis_FOUND)
|
||||||
ENDIF(vins_FOUND)
|
ENDIF(vins_FOUND)
|
||||||
ENDIF(WITH_VINS)
|
ENDIF(WITH_VINS_FUSION)
|
||||||
|
|
||||||
IF(WITH_OPENVINS)
|
IF(WITH_OPENVINS)
|
||||||
FIND_PACKAGE(ov_msckf QUIET)
|
FIND_PACKAGE(OpenVINS)
|
||||||
# On ROS2, the indirect includes and libraries
|
|
||||||
# are not forwarded by ov_msckf target, append them manually
|
|
||||||
FIND_PACKAGE(ov_core QUIET)
|
|
||||||
FIND_PACKAGE(ov_init QUIET)
|
|
||||||
IF(ov_msckf_FOUND AND ov_core_FOUND AND ov_init_FOUND)
|
|
||||||
SET(ov_msckf_INCLUDE_DIRS
|
|
||||||
${ov_msckf_INCLUDE_DIRS}
|
|
||||||
${ov_core_INCLUDE_DIRS}
|
|
||||||
${ov_init_INCLUDE_DIRS})
|
|
||||||
SET(ov_msckf_LIBRARIES
|
|
||||||
${ov_msckf_LIBRARIES}
|
|
||||||
${ov_core_LIBRARIES}
|
|
||||||
${ov_init_LIBRARIES})
|
|
||||||
MESSAGE(STATUS "Found OpenVINS: ${ov_msckf_INCLUDE_DIRS}")
|
|
||||||
ENDIF()
|
|
||||||
ENDIF(WITH_OPENVINS)
|
ENDIF(WITH_OPENVINS)
|
||||||
|
|
||||||
IF(WITH_FASTCV)
|
IF(WITH_FASTCV)
|
||||||
@@ -821,27 +852,97 @@ IF(WITH_FASTCV)
|
|||||||
ENDIF(FastCV_FOUND)
|
ENDIF(FastCV_FOUND)
|
||||||
ENDIF(WITH_FASTCV)
|
ENDIF(WITH_FASTCV)
|
||||||
|
|
||||||
IF(WITH_OPENGV)
|
IF(WITH_APRILTAG)
|
||||||
FIND_PACKAGE(opengv QUIET)
|
FIND_PACKAGE(apriltag QUIET)
|
||||||
IF(opengv_FOUND)
|
IF(apriltag_FOUND)
|
||||||
MESSAGE(STATUS "Found OpenGV: ${opengv_INCLUDE_DIRS}")
|
get_target_property(APRILTAG_LOCATION apriltag::apriltag LOCATION)
|
||||||
ENDIF(opengv_FOUND)
|
get_target_property(APRILTAG_INCLUDES apriltag::apriltag INTERFACE_INCLUDE_DIRECTORIES)
|
||||||
ENDIF(WITH_OPENGV)
|
FIND_FILE(apriltag_aruco_4x4_50_header NAMES tagAruco4x4_50.h PATH_SUFFIXES aruco PATHS ${APRILTAG_INCLUDES} NO_DEFAULT_PATH)
|
||||||
|
SET(WITH_APRILTAG_ARUCO NO)
|
||||||
|
IF(apriltag_aruco_4x4_50_header)
|
||||||
|
SET(WITH_APRILTAG_ARUCO YES)
|
||||||
|
ENDIF()
|
||||||
|
MESSAGE(STATUS "Found apriltag (with aruco=${WITH_APRILTAG_ARUCO}): ${APRILTAG_LOCATION} ${APRILTAG_INCLUDES}")
|
||||||
|
ENDIF(apriltag_FOUND)
|
||||||
|
ENDIF(WITH_APRILTAG)
|
||||||
|
|
||||||
|
IF(WITH_OPENGV OR okvis_FOUND)
|
||||||
|
if(NOT BUILD_OPENGV)
|
||||||
|
FIND_PACKAGE(opengv QUIET)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(opengv_FOUND)
|
||||||
|
MESSAGE(STATUS "Found system-installed OpenGV: ${opengv_INCLUDE_DIRS}")
|
||||||
|
elseif(BUILD_OPENGV)
|
||||||
|
SET(PCL_USING_MARCHNATIVE OFF)
|
||||||
|
if(PCL_COMPILE_OPTIONS)
|
||||||
|
if("${PCL_COMPILE_OPTIONS}" MATCHES "-march=native")
|
||||||
|
set(PCL_USING_MARCHNATIVE ON)
|
||||||
|
endif()
|
||||||
|
elseif("${PCL_DEFINITIONS}" MATCHES "-march=native")
|
||||||
|
set(PCL_USING_MARCHNATIVE ON)
|
||||||
|
endif()
|
||||||
|
SET(MSG_EXTRA "without -march-native (not used by PCL)")
|
||||||
|
if(PCL_USING_MARCHNATIVE)
|
||||||
|
set(MSG_EXTRA "with -march-native (used by PCL)")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "Download/Build OpenGV internally (BUILD_OPENGV=ON) ${MSG_EXTRA}.")
|
||||||
|
function(add_submodule_opengv)
|
||||||
|
FetchContent_Declare(
|
||||||
|
opengv
|
||||||
|
GIT_REPOSITORY https://github.com/laurentkneip/opengv.git
|
||||||
|
GIT_TAG 91f4b19c73450833a40e463ad3648aae80b3a7f3
|
||||||
|
PATCH_COMMAND ${CMAKE_COMMAND}
|
||||||
|
-DPATCH_FILE=${CMAKE_CURRENT_LIST_DIR}/patches/opengv_91f4b19c.patch
|
||||||
|
-P ${CMAKE_CURRENT_LIST_DIR}/patches/apply_patch.cmake
|
||||||
|
)
|
||||||
|
set(BUILD_SHARED_LIBS OFF)
|
||||||
|
set(BUILD_TESTS OFF)
|
||||||
|
set(CMAKE_BUILD_TYPE Release)
|
||||||
|
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
|
||||||
|
# OpenGV's CMakeLists.txt declares cmake_minimum_required(VERSION 2.x),
|
||||||
|
# which CMake >= 4.0 (e.g. recent Ubuntu) rejects. Allow it to configure.
|
||||||
|
set(CMAKE_POLICY_VERSION_MINIMUM 3.5)
|
||||||
|
# Eigen should have been already added by PCL, just populate the compatible variables
|
||||||
|
IF(EIGEN_INCLUDE_DIRS)
|
||||||
|
set(EIGEN_INCLUDE_DIRS "${EIGEN_INCLUDE_DIRS}" CACHE PATH "Eigen include dirs" FORCE)
|
||||||
|
set(EIGEN_INCLUDE_DIR "${EIGEN_INCLUDE_DIRS}" CACHE PATH "Eigen include dir" FORCE)
|
||||||
|
ELSEIF(Eigen3_INCLUDE_DIRS)
|
||||||
|
set(EIGEN_INCLUDE_DIRS "${Eigen3_INCLUDE_DIRS}" CACHE PATH "Eigen include dirs" FORCE)
|
||||||
|
set(EIGEN_INCLUDE_DIR "${Eigen3_INCLUDE_DIRS}" CACHE PATH "Eigen include dir" FORCE)
|
||||||
|
ENDIF()
|
||||||
|
set(BUILD_WITH_MARCHNATIVE ${PCL_USING_MARCHNATIVE})
|
||||||
|
FetchContent_MakeAvailable(opengv)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
add_submodule_opengv()
|
||||||
|
set(opengv_FOUND TRUE)
|
||||||
|
set(opengv_VERSION "internal")
|
||||||
|
endif()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(WITH_ORB_SLAM AND NOT G2O_FOUND)
|
IF(WITH_ORB_SLAM AND NOT G2O_FOUND)
|
||||||
FIND_PACKAGE(ORB_SLAM QUIET)
|
FIND_PACKAGE(ORB_SLAM)
|
||||||
IF(ORB_SLAM_FOUND)
|
IF(ORB_SLAM_FOUND)
|
||||||
MESSAGE(STATUS "Found ORB_SLAM${ORB_SLAM_VERSION}: ${ORB_SLAM_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found ORB_SLAM${ORB_SLAM_VERSION}: ${ORB_SLAM_INCLUDE_DIRS}")
|
||||||
ENDIF(ORB_SLAM_FOUND)
|
ENDIF(ORB_SLAM_FOUND)
|
||||||
ENDIF(WITH_ORB_SLAM AND NOT G2O_FOUND)
|
ENDIF(WITH_ORB_SLAM AND NOT G2O_FOUND)
|
||||||
|
|
||||||
|
IF(WITH_CUVSLAM)
|
||||||
|
FIND_PACKAGE(CuVSLAM 14.0.0)
|
||||||
|
IF(CUVSLAM_FOUND)
|
||||||
|
MESSAGE(STATUS "Found cuVSLAM: ${CUVSLAM_INCLUDE_DIRS}")
|
||||||
|
ENDIF()
|
||||||
|
ENDIF(WITH_CUVSLAM)
|
||||||
|
|
||||||
SET(DISABLE_NEW_DTAGS_FLAG "--disable-new-dtags")
|
SET(DISABLE_NEW_DTAGS_FLAG "--disable-new-dtags")
|
||||||
IF(NOT (APPLE OR WIN32) AND BUILD_WITH_RPATH_NOT_RUNPATH)
|
IF(NOT (APPLE OR WIN32) AND BUILD_WITH_RPATH_NOT_RUNPATH)
|
||||||
ADD_LINK_OPTIONS(LINKER:${DISABLE_NEW_DTAGS_FLAG})
|
ADD_LINK_OPTIONS(LINKER:${DISABLE_NEW_DTAGS_FLAG})
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(NOT MSVC)
|
IF(NOT MSVC)
|
||||||
IF(Qt6_FOUND OR (G2O_FOUND AND G2O_CPP11 EQUAL 1) OR TORCH_FOUND OR MRPT_FOUND)
|
IF(Qt6_FOUND OR (G2O_FOUND AND G2O_CPP11 EQUAL 1) OR (GTSAM_FOUND AND GTSAM_VERSION VERSION_GREATER_EQUAL "4.3.0") OR TORCH_FOUND OR MRPT_FOUND)
|
||||||
# Qt6 requires c++17
|
# Qt6 requires c++17
|
||||||
include(CheckCXXCompilerFlag)
|
include(CheckCXXCompilerFlag)
|
||||||
CHECK_CXX_COMPILER_FLAG("-std=c++17" COMPILER_SUPPORTS_CXX17)
|
CHECK_CXX_COMPILER_FLAG("-std=c++17" COMPILER_SUPPORTS_CXX17)
|
||||||
@@ -929,10 +1030,14 @@ ENDIF()
|
|||||||
IF(NOT G2O_FOUND)
|
IF(NOT G2O_FOUND)
|
||||||
SET(G2O "//")
|
SET(G2O "//")
|
||||||
SET(G2O_CPP_CONF "//")
|
SET(G2O_CPP_CONF "//")
|
||||||
|
SET(G2O_WITH_SBA_UTILS "//")
|
||||||
ELSE()
|
ELSE()
|
||||||
IF(NOT G2O_CPP11)
|
IF(NOT G2O_CPP11)
|
||||||
SET(G2O_CPP_CONF "//")
|
SET(G2O_CPP_CONF "//")
|
||||||
ENDIF(NOT G2O_CPP11)
|
ENDIF(NOT G2O_CPP11)
|
||||||
|
IF(NOT G2O_WITH_SBA_UTILS)
|
||||||
|
SET(G2O_WITH_SBA_UTILS_CONF "//")
|
||||||
|
ENDIF(NOT G2O_WITH_SBA_UTILS)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
IF(NOT GTSAM_FOUND)
|
IF(NOT GTSAM_FOUND)
|
||||||
SET(GTSAM "//")
|
SET(GTSAM "//")
|
||||||
@@ -964,6 +1069,12 @@ ENDIF(NOT Open3D_FOUND)
|
|||||||
IF(NOT FastCV_FOUND)
|
IF(NOT FastCV_FOUND)
|
||||||
SET(FASTCV "//")
|
SET(FASTCV "//")
|
||||||
ENDIF(NOT FastCV_FOUND)
|
ENDIF(NOT FastCV_FOUND)
|
||||||
|
IF(NOT apriltag_FOUND)
|
||||||
|
SET(APRILTAG "//")
|
||||||
|
SET(APRILTAG_ARUCO "//")
|
||||||
|
ELSEIF(NOT WITH_APRILTAG_ARUCO)
|
||||||
|
SET(APRILTAG_ARUCO "//")
|
||||||
|
ENDIF()
|
||||||
IF(NOT opengv_FOUND OR NOT WITH_OPENGV)
|
IF(NOT opengv_FOUND OR NOT WITH_OPENGV)
|
||||||
SET(OPENGV "//")
|
SET(OPENGV "//")
|
||||||
ENDIF(NOT opengv_FOUND OR NOT WITH_OPENGV)
|
ENDIF(NOT opengv_FOUND OR NOT WITH_OPENGV)
|
||||||
@@ -982,6 +1093,9 @@ ENDIF(NOT loam_velodyne_FOUND)
|
|||||||
IF(NOT floam_FOUND)
|
IF(NOT floam_FOUND)
|
||||||
SET(FLOAM "//")
|
SET(FLOAM "//")
|
||||||
ENDIF(NOT floam_FOUND)
|
ENDIF(NOT floam_FOUND)
|
||||||
|
IF(NOT lio_sam_FOUND)
|
||||||
|
SET(LIOSAM "//")
|
||||||
|
ENDIF(NOT lio_sam_FOUND)
|
||||||
IF(NOT Freenect_FOUND)
|
IF(NOT Freenect_FOUND)
|
||||||
SET(FREENECT "//")
|
SET(FREENECT "//")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
@@ -1058,6 +1172,9 @@ IF(NOT xvsdk_FOUND)
|
|||||||
ELSE()
|
ELSE()
|
||||||
SET(CONF_WITH_XVSDK 1)
|
SET(CONF_WITH_XVSDK 1)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
IF(NOT OrbbecSDK_FOUND)
|
||||||
|
SET(ORBBEC_SDK "//")
|
||||||
|
ENDIF(NOT OrbbecSDK_FOUND)
|
||||||
IF(NOT octomap_FOUND)
|
IF(NOT octomap_FOUND)
|
||||||
SET(OCTOMAP "//")
|
SET(OCTOMAP "//")
|
||||||
SET(CONF_WITH_OCTOMAP 0)
|
SET(CONF_WITH_OCTOMAP 0)
|
||||||
@@ -1092,11 +1209,14 @@ IF(NOT msckf_vio_FOUND)
|
|||||||
SET(MSCKF_VIO "//")
|
SET(MSCKF_VIO "//")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
IF(NOT vins_FOUND)
|
IF(NOT vins_FOUND)
|
||||||
SET(VINS "//")
|
SET(VINSFUSION "//")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
IF(NOT ov_msckf_FOUND)
|
IF(NOT OpenVINS_FOUND)
|
||||||
SET(OPENVINS "//")
|
SET(OPENVINS "//")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
IF(NOT CUVSLAM_FOUND)
|
||||||
|
SET(CUVSLAM "//")
|
||||||
|
ENDIF()
|
||||||
IF(NOT ORB_SLAM_FOUND)
|
IF(NOT ORB_SLAM_FOUND)
|
||||||
SET(ORB_SLAM "//")
|
SET(ORB_SLAM "//")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
@@ -1240,7 +1360,17 @@ install(FILES package.xml DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_PR
|
|||||||
#######################
|
#######################
|
||||||
IF(BUILD_AS_BUNDLE)
|
IF(BUILD_AS_BUNDLE)
|
||||||
SET(CMAKE_INSTALL_SYSTEM_RUNTIME_COMPONENT runtime)
|
SET(CMAKE_INSTALL_SYSTEM_RUNTIME_COMPONENT runtime)
|
||||||
|
IF(WIN32)
|
||||||
|
set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE)
|
||||||
|
set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "
|
||||||
|
ExecWait '\\\"$INSTDIR\\\\vc_redist.x64.exe\\\" /quiet /norestart'
|
||||||
|
")
|
||||||
|
ENDIF()
|
||||||
INCLUDE(InstallRequiredSystemLibraries)
|
INCLUDE(InstallRequiredSystemLibraries)
|
||||||
|
set(CPACK_NSIS_COMPONENT_INSTALL OFF)
|
||||||
|
set(CPACK_ARCHIVE_COMPONENT_INSTALL ON)
|
||||||
|
set(CPACK_COMPONENTS_GROUPING ALL_COMPONENTS_IN_ONE)
|
||||||
|
set(CPACK_COMPONENTS_ALL runtime)
|
||||||
ENDIF(BUILD_AS_BUNDLE)
|
ENDIF(BUILD_AS_BUNDLE)
|
||||||
|
|
||||||
SET(CPACK_PACKAGE_NAME "${PROJECT_NAME}")
|
SET(CPACK_PACKAGE_NAME "${PROJECT_NAME}")
|
||||||
@@ -1354,28 +1484,33 @@ ENDIF(PCL_COMPILE_OPTIONS)
|
|||||||
MESSAGE(STATUS "")
|
MESSAGE(STATUS "")
|
||||||
MESSAGE(STATUS "Optional dependencies ('*' affects some default parameters) :")
|
MESSAGE(STATUS "Optional dependencies ('*' affects some default parameters) :")
|
||||||
IF(OpenCV_FOUND)
|
IF(OpenCV_FOUND)
|
||||||
|
IF(OPENCV_ARUCO_FOUND)
|
||||||
|
set(ARUCO_STR "YES")
|
||||||
|
ELSE()
|
||||||
|
set(ARUCO_STR "NO")
|
||||||
|
ENDIF()
|
||||||
IF(OpenCV_VERSION_MAJOR EQUAL 2)
|
IF(OpenCV_VERSION_MAJOR EQUAL 2)
|
||||||
IF(OPENCV_NONFREE_FOUND)
|
IF(OPENCV_NONFREE_FOUND)
|
||||||
MESSAGE(STATUS " *With OpenCV 2 nonfree module (SIFT/SURF) = YES (License: Non commercial)")
|
MESSAGE(STATUS " *With OpenCV 2 nonfree module (SIFT/SURF) = YES, aruco = ${ARUCO_STR} (License: Non commercial)")
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS " *With OpenCV 2 nonfree module (SIFT/SURF) = NO (not found, License: BSD)")
|
MESSAGE(STATUS " *With OpenCV 2 nonfree module (SIFT/SURF) = NO, aruco = ${ARUCO_STR} (not found, License: BSD)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
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)))
|
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, aruco = ${ARUCO_STR} (License: BSD)")
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS " *With OpenCV ${OpenCV_VERSION} xfeatures2d = YES, nonfree = NO (License: Apache 2)")
|
MESSAGE(STATUS " *With OpenCV ${OpenCV_VERSION} xfeatures2d = YES, nonfree = NO, aruco = ${ARUCO_STR} (License: Apache 2)")
|
||||||
ENDIF()
|
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, aruco = ${ARUCO_STR} (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)))
|
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, aruco = ${ARUCO_STR} (License: BSD)")
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS " *With OpenCV ${OpenCV_VERSION} xfeatures2d = NO, nonfree = NO (License: Apache 2)")
|
MESSAGE(STATUS " *With OpenCV ${OpenCV_VERSION} xfeatures2d = NO, nonfree = NO, aruco = ${ARUCO_STR} (License: Apache 2)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
@@ -1410,15 +1545,26 @@ MESSAGE(STATUS " With ORB OcTree = NO (WITH_ORB_OCTREE=OFF)")
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(TORCH_FOUND)
|
IF(TORCH_FOUND)
|
||||||
MESSAGE(STATUS " With SupertPoint = YES (License: GPLv3) libtorch=${Torch_VERSION}")
|
MESSAGE(STATUS " With SuperPoint = YES (License: GPLv3) libtorch=${Torch_VERSION}")
|
||||||
ELSEIF(NOT WITH_TORCH)
|
ELSEIF(NOT WITH_TORCH)
|
||||||
MESSAGE(STATUS " With SupertPoint = NO (WITH_TORCH=OFF)")
|
MESSAGE(STATUS " With SuperPoint = NO (WITH_TORCH=OFF)")
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS " With SupertPoint = NO (libtorch not found)")
|
MESSAGE(STATUS " With SuperPoint = NO (libtorch not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF(TORCH_FOUND AND WITH_PYTHON AND Python3_FOUND)
|
||||||
|
MESSAGE(STATUS " With Superpoint Rpautrat = YES (Liscense: MIT) libtorch=${Torch_VERSION}")
|
||||||
|
ELSEIF(NOT WITH_TORCH)
|
||||||
|
MESSAGE(STATUS " With Superpoint Rpautrat = NO (WITH_TORCH=OFF)")
|
||||||
|
ELSEIF(NOT WITH_PYTHON)
|
||||||
|
MESSAGE(STATUS " With Superpoint Rpautrat = NO (WITH_PYTHON=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " Wtih Superpoint Rpautrat = NO (libtorch and/or python3 not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
|
||||||
IF(WITH_PYTHON AND Python3_FOUND)
|
IF(WITH_PYTHON AND Python3_FOUND)
|
||||||
MESSAGE(STATUS " With Python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} = YES (License: PSF)")
|
MESSAGE(STATUS " With Python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} = YES (License: PSF)")
|
||||||
ELSEIF(NOT WITH_PYTHON)
|
ELSEIF(NOT WITH_PYTHON)
|
||||||
MESSAGE(STATUS " With Python3 = NO (WITH_PYTHON=OFF)")
|
MESSAGE(STATUS " With Python3 = NO (WITH_PYTHON=OFF)")
|
||||||
ELSE()
|
ELSE()
|
||||||
@@ -1439,6 +1585,14 @@ ELSE()
|
|||||||
MESSAGE(STATUS " With FastCV = NO (FastCV not found)")
|
MESSAGE(STATUS " With FastCV = NO (FastCV not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF(apriltag_FOUND)
|
||||||
|
MESSAGE(STATUS " With AprilTag ${apriltag_VERSION} = YES (aruco=${WITH_APRILTAG_ARUCO}) (License: BSD 2-Clause License)")
|
||||||
|
ELSEIF(NOT WITH_APRILTAG)
|
||||||
|
MESSAGE(STATUS " With AprilTag = NO (WITH_APRILTAG=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With AprilTag = NO (apriltag not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(PDAL_FOUND)
|
IF(PDAL_FOUND)
|
||||||
MESSAGE(STATUS " With PDAL ${PDAL_VERSION} = YES (License: BSD)")
|
MESSAGE(STATUS " With PDAL ${PDAL_VERSION} = YES (License: BSD)")
|
||||||
ELSEIF(NOT WITH_PDAL)
|
ELSEIF(NOT WITH_PDAL)
|
||||||
@@ -1548,7 +1702,11 @@ MESSAGE(STATUS " With Open3D = NO (Open3D not found)")
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(opengv_FOUND AND WITH_OPENGV)
|
IF(opengv_FOUND AND WITH_OPENGV)
|
||||||
|
IF(opengv_VERSION STREQUAL "internal")
|
||||||
|
MESSAGE(STATUS " With OpenGV (internal) = YES (License: BSD)")
|
||||||
|
ELSE()
|
||||||
MESSAGE(STATUS " With OpenGV ${opengv_VERSION} = YES (License: BSD)")
|
MESSAGE(STATUS " With OpenGV ${opengv_VERSION} = YES (License: BSD)")
|
||||||
|
ENDIF()
|
||||||
ELSEIF(NOT WITH_OPENGV)
|
ELSEIF(NOT WITH_OPENGV)
|
||||||
MESSAGE(STATUS " With OpenGV = NO (WITH_OPENGV=OFF)")
|
MESSAGE(STATUS " With OpenGV = NO (WITH_OPENGV=OFF)")
|
||||||
ELSE()
|
ELSE()
|
||||||
@@ -1567,7 +1725,7 @@ ENDIF()
|
|||||||
|
|
||||||
IF(grid_map_core_FOUND)
|
IF(grid_map_core_FOUND)
|
||||||
MESSAGE(STATUS " With GridMap ${grid_map_core_VERSION} = YES (License: BSD)")
|
MESSAGE(STATUS " With GridMap ${grid_map_core_VERSION} = YES (License: BSD)")
|
||||||
ELSEIF(NOT WITH_OCTOMAP)
|
ELSEIF(NOT WITH_GRIDMAP)
|
||||||
MESSAGE(STATUS " With GridMap = NO (WITH_GRIDMAP=OFF)")
|
MESSAGE(STATUS " With GridMap = NO (WITH_GRIDMAP=OFF)")
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS " With GridMap = NO (grid_map_core not found)")
|
MESSAGE(STATUS " With GridMap = NO (grid_map_core not found)")
|
||||||
@@ -1663,7 +1821,7 @@ ELSE()
|
|||||||
MESSAGE(STATUS " With FlyCapture2/Triclops = NO (Point Grey SDK not found)")
|
MESSAGE(STATUS " With FlyCapture2/Triclops = NO (Point Grey SDK not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(ZED_FOUND AND CUDA_FOUND)
|
IF(ZED_FOUND)
|
||||||
MESSAGE(STATUS " With ZED = YES")
|
MESSAGE(STATUS " With ZED = YES")
|
||||||
ELSEIF(NOT WITH_ZED)
|
ELSEIF(NOT WITH_ZED)
|
||||||
MESSAGE(STATUS " With ZED = NO (WITH_ZED=OFF)")
|
MESSAGE(STATUS " With ZED = NO (WITH_ZED=OFF)")
|
||||||
@@ -1730,6 +1888,14 @@ ELSE()
|
|||||||
MESSAGE(STATUS " With XVisio SDK = NO (xvsdk not found)")
|
MESSAGE(STATUS " With XVisio SDK = NO (xvsdk not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF(OrbbecSDK_FOUND)
|
||||||
|
MESSAGE(STATUS " With Orbbec SDK ${OrbbecSDK_VERSION} = YES (License: MIT)")
|
||||||
|
ELSEIF(NOT WITH_ORBBEC_SDK)
|
||||||
|
MESSAGE(STATUS " With Orbbec SDK = NO (WITH_ORBBEC_SDK=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With Orbbec SDK = NO (OrbbecSDK v2 not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
MESSAGE(STATUS "")
|
MESSAGE(STATUS "")
|
||||||
MESSAGE(STATUS " Odometry Approaches:")
|
MESSAGE(STATUS " Odometry Approaches:")
|
||||||
IF(loam_velodyne_FOUND)
|
IF(loam_velodyne_FOUND)
|
||||||
@@ -1747,6 +1913,13 @@ MESSAGE(STATUS " With floam = NO (WITH_FLOAM=OFF)")
|
|||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS " With floam = NO (floam not found)")
|
MESSAGE(STATUS " With floam = NO (floam not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
IF(lio_sam_FOUND)
|
||||||
|
MESSAGE(STATUS " With lio_sam = YES (License: BSD)")
|
||||||
|
ELSEIF(NOT WITH_LIOSAM)
|
||||||
|
MESSAGE(STATUS " With lio_sam = NO (WITH_LIOSAM=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With lio_sam = NO (lio_sam not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(libfovis_FOUND)
|
IF(libfovis_FOUND)
|
||||||
MESSAGE(STATUS " With libfovis = YES (License: GPLv2)")
|
MESSAGE(STATUS " With libfovis = YES (License: GPLv2)")
|
||||||
@@ -1791,12 +1964,12 @@ ENDIF()
|
|||||||
IF(vins_FOUND)
|
IF(vins_FOUND)
|
||||||
MESSAGE(STATUS " With VINS-Fusion = YES (License: GPLv3)")
|
MESSAGE(STATUS " With VINS-Fusion = YES (License: GPLv3)")
|
||||||
ELSEIF(NOT WITH_VINS)
|
ELSEIF(NOT WITH_VINS)
|
||||||
MESSAGE(STATUS " With VINS-Fusion = NO (WITH_VINS=OFF)")
|
MESSAGE(STATUS " With VINS-Fusion = NO (WITH_VINS_FUSION=OFF)")
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS " With VINS-Fusion = NO (VINS-Fusion not found)")
|
MESSAGE(STATUS " With VINS-Fusion = NO (VINS-Fusion not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(ov_msckf_FOUND)
|
IF(OpenVINS_FOUND)
|
||||||
MESSAGE(STATUS " With OpenVINS = YES (License: GPLv3)")
|
MESSAGE(STATUS " With OpenVINS = YES (License: GPLv3)")
|
||||||
ELSEIF(NOT WITH_OPENVINS)
|
ELSEIF(NOT WITH_OPENVINS)
|
||||||
MESSAGE(STATUS " With OpenVINS = NO (WITH_OPENVINS=OFF)")
|
MESSAGE(STATUS " With OpenVINS = NO (WITH_OPENVINS=OFF)")
|
||||||
@@ -1814,6 +1987,14 @@ ELSE()
|
|||||||
MESSAGE(STATUS " With ORB_SLAM = NO (ORB_SLAM2 and ORB_SLAM3 not found, make sure environment variable ORB_SLAM_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()
|
||||||
|
|
||||||
|
IF(CUVSLAM_FOUND)
|
||||||
|
MESSAGE(STATUS " With cuVSLAM = YES (License: NVIDIA ISAAC ROS SOFTWARE LICENSE)")
|
||||||
|
ELSEIF(NOT WITH_CUVSLAM)
|
||||||
|
MESSAGE(STATUS " With cuVSLAM = NO (WITH_CUVSLAM=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With cuVSLAM = NO (cuVSLAM not found, make sure cuVSLAM is installed)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
MESSAGE(STATUS "Show all options with: cmake -LA | grep WITH_")
|
MESSAGE(STATUS "Show all options with: cmake -LA | grep WITH_")
|
||||||
MESSAGE(STATUS "--------------------------------------------")
|
MESSAGE(STATUS "--------------------------------------------")
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ rtabmap
|
|||||||
[![Downloads][downloads-image]][downloads]
|
[![Downloads][downloads-image]][downloads]
|
||||||
[![License][license-image]][license]
|
[![License][license-image]][license]
|
||||||
|
|
||||||
[release-image]: https://img.shields.io/badge/release-0.21.4-green.svg?style=flat
|
[release-image]: https://img.shields.io/badge/release-0.23.1-green.svg?style=flat
|
||||||
[releases]: https://github.com/introlab/rtabmap/releases
|
[releases]: https://github.com/introlab/rtabmap/releases
|
||||||
|
|
||||||
[downloads-image]: https://img.shields.io/github/downloads/introlab/rtabmap/total?label=downloads
|
[downloads-image]: https://img.shields.io/github/downloads/introlab/rtabmap/total?label=downloads
|
||||||
@@ -35,13 +35,12 @@ This project is supported by [IntRoLab - Intelligent / Interactive / Integrated
|
|||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Linux</td>
|
<td>
|
||||||
<td><a href="https://github.com/introlab/rtabmap/actions/workflows/cmake.yml"><img src="https://github.com/introlab/rtabmap/actions/workflows/cmake.yml/badge.svg" alt="Build Status"/> <br> <a href="https://github.com/introlab/rtabmap/actions/workflows/cmake-ros.yml"><img src="https://github.com/introlab/rtabmap/actions/workflows/cmake-ros.yml/badge.svg" alt="Build Status"/> <br> <a href="https://github.com/introlab/rtabmap/actions/workflows/docker.yml"><img src="https://github.com/introlab/rtabmap/actions/workflows/docker.yml/badge.svg" alt="Build Status"/>
|
<a href="https://github.com/introlab/rtabmap/actions/workflows/cmake-linux.yml"><img src="https://github.com/introlab/rtabmap/actions/workflows/cmake-linux.yml/badge.svg" alt="CMake Linux Build Status"/> <br>
|
||||||
</td>
|
<a href="https://github.com/introlab/rtabmap/actions/workflows/cmake-windows.yml"><img src="https://github.com/introlab/rtabmap/actions/workflows/cmake-windows.yml/badge.svg" alt="CMake Windows Build Status"/> <br>
|
||||||
</tr>
|
<a href="https://github.com/introlab/rtabmap/actions/workflows/cmake-macos.yml"><img src="https://github.com/introlab/rtabmap/actions/workflows/cmake-macos.yml/badge.svg" alt="CMake MaCOS Build Status"/> <br>
|
||||||
<tr>
|
<a href="https://github.com/introlab/rtabmap/actions/workflows/cmake-ros.yml"><img src="https://github.com/introlab/rtabmap/actions/workflows/cmake-ros.yml/badge.svg" alt="CMake ROS Build Status"/> <br>
|
||||||
<td>Windows</td>
|
<a href="https://github.com/introlab/rtabmap/actions/workflows/docker.yml"><img src="https://github.com/introlab/rtabmap/actions/workflows/docker.yml/badge.svg" alt="Docker Build Status"/>
|
||||||
<td><a href="https://ci.appveyor.com/project/matlabbe/rtabmap/branch/master"><img src="https://ci.appveyor.com/api/projects/status/hr73xspix9oqa26h/branch/master?svg=true" alt="Build Status"/>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -59,7 +58,7 @@ This project is supported by [IntRoLab - Intelligent / Interactive / Integrated
|
|||||||
<td><a href="http://build.ros.org/job/Nbin_ufv8_uFv8__rtabmap__ubuntu_focal_arm64__binary/"><img src="http://build.ros.org/buildStatus/icon?job=Nbin_ufv8_uFv8__rtabmap__ubuntu_focal_arm64__binary" alt="Build Status"/></td>
|
<td><a href="http://build.ros.org/job/Nbin_ufv8_uFv8__rtabmap__ubuntu_focal_arm64__binary/"><img src="http://build.ros.org/buildStatus/icon?job=Nbin_ufv8_uFv8__rtabmap__ubuntu_focal_arm64__binary" alt="Build Status"/></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td rowspan="3">ROS 2</td>
|
<td rowspan="4">ROS 2</td>
|
||||||
<td>Humble</td>
|
<td>Humble</td>
|
||||||
<td><a href="http://build.ros2.org/job/Hbin_uJ64__rtabmap__ubuntu_jammy_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Hbin_uJ64__rtabmap__ubuntu_jammy_amd64__binary" alt="Build Status"/></td>
|
<td><a href="http://build.ros2.org/job/Hbin_uJ64__rtabmap__ubuntu_jammy_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Hbin_uJ64__rtabmap__ubuntu_jammy_amd64__binary" alt="Build Status"/></td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -67,6 +66,10 @@ This project is supported by [IntRoLab - Intelligent / Interactive / Integrated
|
|||||||
<td>Jazzy</td>
|
<td>Jazzy</td>
|
||||||
<td><a href="http://build.ros2.org/job/Jbin_uN64__rtabmap__ubuntu_noble_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Jbin_uN64__rtabmap__ubuntu_noble_amd64__binary" alt="Build Status"/></td>
|
<td><a href="http://build.ros2.org/job/Jbin_uN64__rtabmap__ubuntu_noble_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Jbin_uN64__rtabmap__ubuntu_noble_amd64__binary" alt="Build Status"/></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Kilted</td>
|
||||||
|
<td><a href="http://build.ros2.org/job/Kbin_uN64__rtabmap__ubuntu_noble_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Kbin_uN64__rtabmap__ubuntu_noble_amd64__binary" alt="Build Status"/></td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Rolling</td>
|
<td>Rolling</td>
|
||||||
<td><a href="http://build.ros2.org/job/Rbin_uJ64__rtabmap__ubuntu_jammy_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Rbin_uJ64__rtabmap__ubuntu_jammy_amd64__binary" alt="Build Status"/></td>
|
<td><a href="http://build.ros2.org/job/Rbin_uJ64__rtabmap__ubuntu_jammy_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Rbin_uJ64__rtabmap__ubuntu_jammy_amd64__binary" alt="Build Status"/></td>
|
||||||
|
|||||||
+8
-2
@@ -35,12 +35,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#define RTABMAP_VERSION_MINOR @PROJECT_VERSION_MINOR@
|
#define RTABMAP_VERSION_MINOR @PROJECT_VERSION_MINOR@
|
||||||
#define RTABMAP_VERSION_PATCH @PROJECT_VERSION_PATCH@
|
#define RTABMAP_VERSION_PATCH @PROJECT_VERSION_PATCH@
|
||||||
|
|
||||||
#define RTABMAP_VERSION_COMPARE(major, minor, patch) (major>=@PROJECT_VERSION_MAJOR@ || (major==@PROJECT_VERSION_MAJOR@ && minor>=@PROJECT_VERSION_MINOR@) || (major==@PROJECT_VERSION_MAJOR@ && minor==@PROJECT_VERSION_MINOR@ && patch >=@PROJECT_VERSION_PATCH@))
|
#define RTABMAP_VERSION_COMPARE(OP, MAJOR, MINOR, PATCH) (RTABMAP_VERSION_MAJOR*10000+RTABMAP_VERSION_MINOR*100+RTABMAP_VERSION_PATCH OP MAJOR*10000+MINOR*100+PATCH)
|
||||||
|
|
||||||
@NONFREE@#define RTABMAP_NONFREE
|
@NONFREE@#define RTABMAP_NONFREE
|
||||||
@TORO@#define RTABMAP_TORO
|
@TORO@#define RTABMAP_TORO
|
||||||
@G2O@#define RTABMAP_G2O
|
@G2O@#define RTABMAP_G2O
|
||||||
@G2O_CPP_CONF@#define RTABMAP_G2O_CPP11 @G2O_CPP11@
|
@G2O_CPP_CONF@#define RTABMAP_G2O_CPP11 @G2O_CPP11@
|
||||||
|
@G2O_WITH_SBA_UTILS_CONF@#define RTABMAP_G2O_WITH_SBA_UTILS
|
||||||
@GTSAM@#define RTABMAP_GTSAM
|
@GTSAM@#define RTABMAP_GTSAM
|
||||||
@CERES@#define RTABMAP_CERES
|
@CERES@#define RTABMAP_CERES
|
||||||
@MRPT@#define RTABMAP_MRPT
|
@MRPT@#define RTABMAP_MRPT
|
||||||
@@ -62,6 +63,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
@CUDASIFT@#define RTABMAP_CUDASIFT
|
@CUDASIFT@#define RTABMAP_CUDASIFT
|
||||||
@LOAM@#define RTABMAP_LOAM
|
@LOAM@#define RTABMAP_LOAM
|
||||||
@FLOAM@#define RTABMAP_FLOAM
|
@FLOAM@#define RTABMAP_FLOAM
|
||||||
|
@LIOSAM@#define RTABMAP_LIOSAM
|
||||||
@DC1394@#define RTABMAP_DC1394
|
@DC1394@#define RTABMAP_DC1394
|
||||||
@FLYCAPTURE2@#define RTABMAP_FLYCAPTURE2
|
@FLYCAPTURE2@#define RTABMAP_FLYCAPTURE2
|
||||||
@ZED@#define RTABMAP_ZED
|
@ZED@#define RTABMAP_ZED
|
||||||
@@ -72,6 +74,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
@MYNTEYE@#define RTABMAP_MYNTEYE
|
@MYNTEYE@#define RTABMAP_MYNTEYE
|
||||||
@DEPTHAI@#define RTABMAP_DEPTHAI
|
@DEPTHAI@#define RTABMAP_DEPTHAI
|
||||||
@XVSDK@#define RTABMAP_XVSDK
|
@XVSDK@#define RTABMAP_XVSDK
|
||||||
|
@ORBBEC_SDK@#define RTABMAP_ORBBEC_SDK
|
||||||
@OCTOMAP@#define RTABMAP_OCTOMAP
|
@OCTOMAP@#define RTABMAP_OCTOMAP
|
||||||
@GRIDMAP@#define RTABMAP_GRIDMAP
|
@GRIDMAP@#define RTABMAP_GRIDMAP
|
||||||
@CPUTSDF@#define RTABMAP_CPUTSDF
|
@CPUTSDF@#define RTABMAP_CPUTSDF
|
||||||
@@ -82,13 +85,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
@DVO@#define RTABMAP_DVO
|
@DVO@#define RTABMAP_DVO
|
||||||
@OKVIS@#define RTABMAP_OKVIS
|
@OKVIS@#define RTABMAP_OKVIS
|
||||||
@MSCKF_VIO@#define RTABMAP_MSCKF_VIO
|
@MSCKF_VIO@#define RTABMAP_MSCKF_VIO
|
||||||
@VINS@#define RTABMAP_VINS
|
@VINSFUSION@#define RTABMAP_VINS_FUSION
|
||||||
@OPENVINS@#define RTABMAP_OPENVINS
|
@OPENVINS@#define RTABMAP_OPENVINS
|
||||||
|
@CUVSLAM@#define RTABMAP_CUVSLAM
|
||||||
@ORB_SLAM@#define RTABMAP_ORB_SLAM @ORB_SLAM_VERSION@
|
@ORB_SLAM@#define RTABMAP_ORB_SLAM @ORB_SLAM_VERSION@
|
||||||
@ORB_OCTREE@#define RTABMAP_ORB_OCTREE
|
@ORB_OCTREE@#define RTABMAP_ORB_OCTREE
|
||||||
@TORCH@#define RTABMAP_TORCH
|
@TORCH@#define RTABMAP_TORCH
|
||||||
@PYTHON@#define RTABMAP_PYTHON
|
@PYTHON@#define RTABMAP_PYTHON
|
||||||
@MADGWICK@#define RTABMAP_MADGWICK
|
@MADGWICK@#define RTABMAP_MADGWICK
|
||||||
|
@APRILTAG@#define RTABMAP_APRILTAG
|
||||||
|
@APRILTAG_ARUCO@#define RTABMAP_APRILTAG_WITH_ARUCO
|
||||||
|
|
||||||
#include <pcl/pcl_config.h>
|
#include <pcl/pcl_config.h>
|
||||||
|
|
||||||
|
|||||||
@@ -37,8 +37,8 @@ namespace rtabmap {
|
|||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
// CameraARCore
|
// CameraARCore
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
CameraARCore::CameraARCore(void* env, void* context, void* activity, bool depthFromMotion, bool smoothing, float upstreamRelocalizationAccThr):
|
CameraARCore::CameraARCore(void* env, void* context, void* activity, bool depthFromMotion, float upstreamRelocalizationAccThr):
|
||||||
CameraMobile(smoothing, upstreamRelocalizationAccThr),
|
CameraMobile(upstreamRelocalizationAccThr),
|
||||||
env_(env),
|
env_(env),
|
||||||
context_(context),
|
context_(context),
|
||||||
activity_(activity),
|
activity_(activity),
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ namespace rtabmap {
|
|||||||
|
|
||||||
class CameraARCore : public CameraMobile {
|
class CameraARCore : public CameraMobile {
|
||||||
public:
|
public:
|
||||||
CameraARCore(void* env, void* context, void* activity, bool depthFromMotion = false, bool smoothing = false, float upstreamRelocalizationAccThr = 0.0f);
|
CameraARCore(void* env, void* context, void* activity, bool depthFromMotion = false, float upstreamRelocalizationAccThr = 0.0f);
|
||||||
virtual ~CameraARCore();
|
virtual ~CameraARCore();
|
||||||
|
|
||||||
virtual void setScreenRotationAndSize(ScreenRotation colorCameraToDisplayRotation, int width, int height);
|
virtual void setScreenRotationAndSize(ScreenRotation colorCameraToDisplayRotation, int width, int height);
|
||||||
|
|||||||
@@ -40,8 +40,8 @@ namespace rtabmap {
|
|||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
// CameraAREngine
|
// CameraAREngine
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
CameraAREngine::CameraAREngine(void* env, void* context, void* activity, bool smoothing, float upstreamRelocalizationAccThr):
|
CameraAREngine::CameraAREngine(void* env, void* context, void* activity, float upstreamRelocalizationAccThr):
|
||||||
CameraMobile(smoothing, upstreamRelocalizationAccThr),
|
CameraMobile(upstreamRelocalizationAccThr),
|
||||||
env_(env),
|
env_(env),
|
||||||
context_(context),
|
context_(context),
|
||||||
activity_(activity),
|
activity_(activity),
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ namespace rtabmap {
|
|||||||
|
|
||||||
class CameraAREngine : public CameraMobile {
|
class CameraAREngine : public CameraMobile {
|
||||||
public:
|
public:
|
||||||
CameraAREngine(void* env, void* context, void* activity, bool smoothing = false, float upstreamRelocalizationAccThr = 0.0f);
|
CameraAREngine(void* env, void* context, void* activity, float upstreamRelocalizationAccThr = 0.0f);
|
||||||
virtual ~CameraAREngine();
|
virtual ~CameraAREngine();
|
||||||
|
|
||||||
virtual void setScreenRotationAndSize(ScreenRotation colorCameraToDisplayRotation, int width, int height);
|
virtual void setScreenRotationAndSize(ScreenRotation colorCameraToDisplayRotation, int width, int height);
|
||||||
|
|||||||
+123
-116
@@ -41,9 +41,6 @@ namespace rtabmap {
|
|||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
// CameraMobile
|
// CameraMobile
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
const float CameraMobile::bilateralFilteringSigmaS = 2.0f;
|
|
||||||
const float CameraMobile::bilateralFilteringSigmaR = 0.075f;
|
|
||||||
|
|
||||||
const rtabmap::Transform CameraMobile::opticalRotation = Transform(
|
const rtabmap::Transform CameraMobile::opticalRotation = Transform(
|
||||||
0.0f, 0.0f, 1.0f, 0.0f,
|
0.0f, 0.0f, 1.0f, 0.0f,
|
||||||
-1.0f, 0.0f, 0.0f, 0.0f,
|
-1.0f, 0.0f, 0.0f, 0.0f,
|
||||||
@@ -53,13 +50,12 @@ const rtabmap::Transform CameraMobile::opticalRotationInv = Transform(
|
|||||||
0.0f, 0.0f, -1.0f, 0.0f,
|
0.0f, 0.0f, -1.0f, 0.0f,
|
||||||
1.0f, 0.0f, 0.0f, 0.0f);
|
1.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
CameraMobile::CameraMobile(bool smoothing, float upstreamRelocalizationAccThr) :
|
CameraMobile::CameraMobile(float upstreamRelocalizationAccThr) :
|
||||||
Camera(10),
|
Camera(10),
|
||||||
deviceTColorCamera_(Transform::getIdentity()),
|
deviceTColorCamera_(Transform::getIdentity()),
|
||||||
textureId_(0),
|
textureId_(0),
|
||||||
uvs_initialized_(false),
|
uvs_initialized_(false),
|
||||||
stampEpochOffset_(0.0),
|
stampEpochOffset_(0.0),
|
||||||
smoothing_(smoothing),
|
|
||||||
colorCameraToDisplayRotation_(ROTATION_0),
|
colorCameraToDisplayRotation_(ROTATION_0),
|
||||||
originUpdate_(true),
|
originUpdate_(true),
|
||||||
upstreamRelocalizationAccThr_(upstreamRelocalizationAccThr),
|
upstreamRelocalizationAccThr_(upstreamRelocalizationAccThr),
|
||||||
@@ -394,124 +390,135 @@ SensorData CameraMobile::updateDataOnRender(Transform & pose)
|
|||||||
void CameraMobile::postUpdate()
|
void CameraMobile::postUpdate()
|
||||||
{
|
{
|
||||||
if(data_.isValid())
|
if(data_.isValid())
|
||||||
{
|
{
|
||||||
// adjust origin
|
// adjust origin
|
||||||
if(!originOffset_.isNull())
|
if(!originOffset_.isNull())
|
||||||
{
|
{
|
||||||
dataPose_ = originOffset_ * dataPose_;
|
dataPose_ = originOffset_ * dataPose_;
|
||||||
viewMatrix_ = glm::inverse(rtabmap::glmFromTransform(rtabmap::opengl_world_T_rtabmap_world * originOffset_ *rtabmap::rtabmap_world_T_opengl_world)*glm::inverse(viewMatrix_));
|
viewMatrix_ = glm::inverse(rtabmap::glmFromTransform(rtabmap::opengl_world_T_rtabmap_world * originOffset_ *rtabmap::rtabmap_world_T_opengl_world)*glm::inverse(viewMatrix_));
|
||||||
occlusionModel_.setLocalTransform(originOffset_ * occlusionModel_.localTransform());
|
occlusionModel_.setLocalTransform(originOffset_ * occlusionModel_.localTransform());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(lastKnownGPS_.stamp() > 0.0 && data_.stamp()-lastKnownGPS_.stamp()<1.0)
|
if(lastKnownGPS_.stamp() > 0.0 && data_.stamp()-lastKnownGPS_.stamp()<1.0)
|
||||||
{
|
{
|
||||||
data_.setGPS(lastKnownGPS_);
|
data_.setGPS(lastKnownGPS_);
|
||||||
}
|
}
|
||||||
else if(lastKnownGPS_.stamp()>0.0)
|
else if(lastKnownGPS_.stamp()>0.0)
|
||||||
{
|
{
|
||||||
LOGD("GPS too old (current time=%f, gps time = %f)", data_.stamp(), lastKnownGPS_.stamp());
|
LOGD("GPS too old (current time=%f, gps time = %f)", data_.stamp(), lastKnownGPS_.stamp());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(lastEnvSensors_.size())
|
if(lastEnvSensors_.size())
|
||||||
{
|
{
|
||||||
data_.setEnvSensors(lastEnvSensors_);
|
data_.setEnvSensors(lastEnvSensors_);
|
||||||
lastEnvSensors_.clear();
|
lastEnvSensors_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(smoothing_ && !data_.depthRaw().empty())
|
|
||||||
{
|
|
||||||
//UTimer t;
|
|
||||||
data_.setDepthOrRightRaw(rtabmap::util2d::fastBilateralFiltering(data_.depthRaw(), bilateralFilteringSigmaS, bilateralFilteringSigmaR));
|
|
||||||
//LOGD("Bilateral filtering, time=%fs", t.ticks());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rotate image depending on the camera orientation
|
// Rotate image depending on the camera orientation
|
||||||
if(colorCameraToDisplayRotation_ == ROTATION_90)
|
if(colorCameraToDisplayRotation_ == ROTATION_90)
|
||||||
{
|
{
|
||||||
UDEBUG("ROTATION_90");
|
UDEBUG("ROTATION_90");
|
||||||
cv::Mat rgb, depth;
|
cv::Mat rgb, depth, confidence;
|
||||||
cv::Mat rgbt(data_.imageRaw().cols, data_.imageRaw().rows, data_.imageRaw().type());
|
cv::Mat rgbt;
|
||||||
cv::flip(data_.imageRaw(),rgb,1);
|
cv::flip(data_.imageRaw(),rgb,1);
|
||||||
cv::transpose(rgb,rgbt);
|
cv::transpose(rgb,rgbt);
|
||||||
rgb = rgbt;
|
rgb = rgbt;
|
||||||
cv::Mat deptht(data_.depthRaw().cols, data_.depthRaw().rows, data_.depthRaw().type());
|
cv::Mat deptht;
|
||||||
cv::flip(data_.depthRaw(),depth,1);
|
cv::flip(data_.depthRaw(),depth,1);
|
||||||
cv::transpose(depth,deptht);
|
cv::transpose(depth,deptht);
|
||||||
depth = deptht;
|
depth = deptht;
|
||||||
CameraModel model = data_.cameraModels()[0];
|
if(!data_.depthConfidenceRaw().empty()) {
|
||||||
cv::Size sizet(model.imageHeight(), model.imageWidth());
|
cv::Mat conft;
|
||||||
model = CameraModel(
|
cv::flip(data_.depthConfidenceRaw(),confidence,1);
|
||||||
model.fy(),
|
cv::transpose(confidence,conft);
|
||||||
model.fx(),
|
confidence = conft;
|
||||||
model.cy(),
|
}
|
||||||
model.cx()>0?model.imageWidth()-model.cx():0,
|
CameraModel model = data_.cameraModels()[0];
|
||||||
model.localTransform()*rtabmap::Transform(0,-1,0,0, 1,0,0,0, 0,0,1,0));
|
cv::Size sizet(model.imageHeight(), model.imageWidth());
|
||||||
model.setImageSize(sizet);
|
model = CameraModel(
|
||||||
data_.setRGBDImage(rgb, depth, model);
|
model.fy(),
|
||||||
|
model.fx(),
|
||||||
|
model.cy(),
|
||||||
|
model.cx()>0?model.imageWidth()-model.cx():0,
|
||||||
|
model.localTransform()*rtabmap::Transform(0,-1,0,0, 1,0,0,0, 0,0,1,0));
|
||||||
|
model.setImageSize(sizet);
|
||||||
|
data_.setRGBDImage(rgb, depth, confidence, model);
|
||||||
|
|
||||||
std::vector<cv::KeyPoint> keypoints = data_.keypoints();
|
std::vector<cv::KeyPoint> keypoints = data_.keypoints();
|
||||||
for(size_t i=0; i<keypoints.size(); ++i)
|
for(size_t i=0; i<keypoints.size(); ++i)
|
||||||
{
|
{
|
||||||
keypoints[i].pt.x = data_.keypoints()[i].pt.y;
|
keypoints[i].pt.x = data_.keypoints()[i].pt.y;
|
||||||
keypoints[i].pt.y = rgb.rows - data_.keypoints()[i].pt.x;
|
keypoints[i].pt.y = rgb.rows - data_.keypoints()[i].pt.x;
|
||||||
}
|
}
|
||||||
data_.setFeatures(keypoints, data_.keypoints3D(), cv::Mat());
|
data_.setFeatures(keypoints, data_.keypoints3D(), cv::Mat());
|
||||||
}
|
}
|
||||||
else if(colorCameraToDisplayRotation_ == ROTATION_180)
|
else if(colorCameraToDisplayRotation_ == ROTATION_180)
|
||||||
{
|
{
|
||||||
UDEBUG("ROTATION_180");
|
UDEBUG("ROTATION_180");
|
||||||
cv::Mat rgb, depth;
|
cv::Mat rgb, depth, confidence;
|
||||||
cv::flip(data_.imageRaw(),rgb,1);
|
cv::flip(data_.imageRaw(),rgb,1);
|
||||||
cv::flip(rgb,rgb,0);
|
cv::flip(rgb,rgb,0);
|
||||||
cv::flip(data_.depthOrRightRaw(),depth,1);
|
cv::flip(data_.depthOrRightRaw(),depth,1);
|
||||||
cv::flip(depth,depth,0);
|
cv::flip(depth,depth,0);
|
||||||
CameraModel model = data_.cameraModels()[0];
|
if(!data_.depthConfidenceRaw().empty()) {
|
||||||
cv::Size sizet(model.imageWidth(), model.imageHeight());
|
cv::flip(data_.depthConfidenceRaw(),confidence,1);
|
||||||
model = CameraModel(
|
cv::flip(confidence,confidence,0);
|
||||||
model.fx(),
|
}
|
||||||
model.fy(),
|
CameraModel model = data_.cameraModels()[0];
|
||||||
model.cx()>0?model.imageWidth()-model.cx():0,
|
cv::Size sizet(model.imageWidth(), model.imageHeight());
|
||||||
model.cy()>0?model.imageHeight()-model.cy():0,
|
model = CameraModel(
|
||||||
model.localTransform()*rtabmap::Transform(0,0,0,0,0,1,0));
|
model.fx(),
|
||||||
model.setImageSize(sizet);
|
model.fy(),
|
||||||
data_.setRGBDImage(rgb, depth, model);
|
model.cx()>0?model.imageWidth()-model.cx():0,
|
||||||
|
model.cy()>0?model.imageHeight()-model.cy():0,
|
||||||
|
model.localTransform()*rtabmap::Transform(0,0,0,0,0,1,0));
|
||||||
|
model.setImageSize(sizet);
|
||||||
|
data_.setRGBDImage(rgb, depth, confidence, model);
|
||||||
|
|
||||||
std::vector<cv::KeyPoint> keypoints = data_.keypoints();
|
std::vector<cv::KeyPoint> keypoints = data_.keypoints();
|
||||||
for(size_t i=0; i<keypoints.size(); ++i)
|
for(size_t i=0; i<keypoints.size(); ++i)
|
||||||
{
|
{
|
||||||
keypoints[i].pt.x = rgb.cols - data_.keypoints()[i].pt.x;
|
keypoints[i].pt.x = rgb.cols - data_.keypoints()[i].pt.x;
|
||||||
keypoints[i].pt.y = rgb.rows - data_.keypoints()[i].pt.y;
|
keypoints[i].pt.y = rgb.rows - data_.keypoints()[i].pt.y;
|
||||||
}
|
}
|
||||||
data_.setFeatures(keypoints, data_.keypoints3D(), cv::Mat());
|
data_.setFeatures(keypoints, data_.keypoints3D(), cv::Mat());
|
||||||
}
|
}
|
||||||
else if(colorCameraToDisplayRotation_ == ROTATION_270)
|
else if(colorCameraToDisplayRotation_ == ROTATION_270)
|
||||||
{
|
{
|
||||||
UDEBUG("ROTATION_270");
|
UDEBUG("ROTATION_270");
|
||||||
cv::Mat rgb(data_.imageRaw().cols, data_.imageRaw().rows, data_.imageRaw().type());
|
cv::Mat rgb, depth, confidence;
|
||||||
cv::transpose(data_.imageRaw(),rgb);
|
cv::transpose(data_.imageRaw(),rgb);
|
||||||
cv::flip(rgb,rgb,1);
|
cv::flip(rgb,rgb,1);
|
||||||
cv::Mat depth(data_.depthOrRightRaw().cols, data_.depthOrRightRaw().rows, data_.depthOrRightRaw().type());
|
cv::transpose(data_.depthOrRightRaw(),depth);
|
||||||
cv::transpose(data_.depthOrRightRaw(),depth);
|
cv::flip(depth,depth,1);
|
||||||
cv::flip(depth,depth,1);
|
if(!data_.depthConfidenceRaw().empty()) {
|
||||||
CameraModel model = data_.cameraModels()[0];
|
cv::transpose(data_.depthConfidenceRaw(),confidence);
|
||||||
cv::Size sizet(model.imageHeight(), model.imageWidth());
|
cv::flip(confidence,confidence,1);
|
||||||
model = CameraModel(
|
}
|
||||||
model.fy(),
|
CameraModel model = data_.cameraModels()[0];
|
||||||
model.fx(),
|
cv::Size sizet(model.imageHeight(), model.imageWidth());
|
||||||
model.cy()>0?model.imageHeight()-model.cy():0,
|
model = CameraModel(
|
||||||
model.cx(),
|
model.fy(),
|
||||||
model.localTransform()*rtabmap::Transform(0,1,0,0, -1,0,0,0, 0,0,1,0));
|
model.fx(),
|
||||||
model.setImageSize(sizet);
|
model.cy()>0?model.imageHeight()-model.cy():0,
|
||||||
data_.setRGBDImage(rgb, depth, model);
|
model.cx(),
|
||||||
|
model.localTransform()*rtabmap::Transform(0,1,0,0, -1,0,0,0, 0,0,1,0));
|
||||||
|
model.setImageSize(sizet);
|
||||||
|
data_.setRGBDImage(rgb, depth, confidence, model);
|
||||||
|
|
||||||
std::vector<cv::KeyPoint> keypoints = data_.keypoints();
|
std::vector<cv::KeyPoint> keypoints = data_.keypoints();
|
||||||
for(size_t i=0; i<keypoints.size(); ++i)
|
for(size_t i=0; i<keypoints.size(); ++i)
|
||||||
{
|
{
|
||||||
keypoints[i].pt.x = rgb.cols - data_.keypoints()[i].pt.y;
|
keypoints[i].pt.x = rgb.cols - data_.keypoints()[i].pt.y;
|
||||||
keypoints[i].pt.y = data_.keypoints()[i].pt.x;
|
keypoints[i].pt.y = data_.keypoints()[i].pt.x;
|
||||||
}
|
}
|
||||||
data_.setFeatures(keypoints, data_.keypoints3D(), cv::Mat());
|
data_.setFeatures(keypoints, data_.keypoints3D(), cv::Mat());
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UDEBUG("ROTATION_0");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -70,9 +70,6 @@ private:
|
|||||||
|
|
||||||
class CameraMobile : public Camera, public UEventsSender {
|
class CameraMobile : public Camera, public UEventsSender {
|
||||||
public:
|
public:
|
||||||
static const float bilateralFilteringSigmaS;
|
|
||||||
static const float bilateralFilteringSigmaR;
|
|
||||||
|
|
||||||
static const rtabmap::Transform opticalRotation;
|
static const rtabmap::Transform opticalRotation;
|
||||||
static const rtabmap::Transform opticalRotationInv;
|
static const rtabmap::Transform opticalRotationInv;
|
||||||
|
|
||||||
@@ -87,7 +84,7 @@ public:
|
|||||||
int kptsSize = 3);
|
int kptsSize = 3);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CameraMobile(bool smoothing = false, float upstreamRelocalizationAccThr = 0.0f);
|
CameraMobile(float upstreamRelocalizationAccThr = 0.0f);
|
||||||
virtual ~CameraMobile();
|
virtual ~CameraMobile();
|
||||||
|
|
||||||
// abstract functions
|
// abstract functions
|
||||||
@@ -110,7 +107,6 @@ public:
|
|||||||
|
|
||||||
const CameraModel & getCameraModel() const {return model_;}
|
const CameraModel & getCameraModel() const {return model_;}
|
||||||
const Transform & getDeviceTColorCamera() const {return deviceTColorCamera_;}
|
const Transform & getDeviceTColorCamera() const {return deviceTColorCamera_;}
|
||||||
void setSmoothing(bool enabled) {smoothing_ = enabled;}
|
|
||||||
virtual void setScreenRotationAndSize(ScreenRotation colorCameraToDisplayRotation, int width, int height) {colorCameraToDisplayRotation_ = colorCameraToDisplayRotation;}
|
virtual void setScreenRotationAndSize(ScreenRotation colorCameraToDisplayRotation, int width, int height) {colorCameraToDisplayRotation_ = colorCameraToDisplayRotation;}
|
||||||
void setGPS(const GPS & gps);
|
void setGPS(const GPS & gps);
|
||||||
void addEnvSensor(int type, float value);
|
void addEnvSensor(int type, float value);
|
||||||
@@ -144,7 +140,6 @@ protected:
|
|||||||
private:
|
private:
|
||||||
bool firstFrame_;
|
bool firstFrame_;
|
||||||
double stampEpochOffset_;
|
double stampEpochOffset_;
|
||||||
bool smoothing_;
|
|
||||||
ScreenRotation colorCameraToDisplayRotation_;
|
ScreenRotation colorCameraToDisplayRotation_;
|
||||||
GPS lastKnownGPS_;
|
GPS lastKnownGPS_;
|
||||||
EnvSensors lastEnvSensors_;
|
EnvSensors lastEnvSensors_;
|
||||||
|
|||||||
@@ -114,8 +114,7 @@ void onTangoEventAvailableRouter(void* context, const TangoEvent* event)
|
|||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
// CameraTango
|
// CameraTango
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
CameraTango::CameraTango(bool colorCamera, int decimation, bool publishRawScan, bool smoothing) :
|
CameraTango::CameraTango(bool colorCamera, int decimation, bool publishRawScan) :
|
||||||
CameraMobile(smoothing),
|
|
||||||
tango_config_(0),
|
tango_config_(0),
|
||||||
colorCamera_(colorCamera),
|
colorCamera_(colorCamera),
|
||||||
decimation_(decimation),
|
decimation_(decimation),
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ namespace rtabmap {
|
|||||||
|
|
||||||
class CameraTango : public CameraMobile {
|
class CameraTango : public CameraMobile {
|
||||||
public:
|
public:
|
||||||
CameraTango(bool colorCamera, int decimation, bool publishRawScan, bool smoothing);
|
CameraTango(bool colorCamera, int decimation, bool publishRawScan);
|
||||||
virtual ~CameraTango();
|
virtual ~CameraTango();
|
||||||
|
|
||||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
|
|||||||
+168
-54
@@ -84,6 +84,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
const int g_optMeshId = -100;
|
const int g_optMeshId = -100;
|
||||||
|
|
||||||
|
const float g_bilateralFilteringSigmaS = 2.0f;
|
||||||
|
const float g_bilateralFilteringSigmaR = 0.075f;
|
||||||
|
|
||||||
#ifdef __ANDROID__
|
#ifdef __ANDROID__
|
||||||
static JavaVM *jvm;
|
static JavaVM *jvm;
|
||||||
static jobject RTABMapActivity = 0;
|
static jobject RTABMapActivity = 0;
|
||||||
@@ -230,6 +233,7 @@ RTABMapApp::RTABMapApp() :
|
|||||||
trajectoryMode_(false),
|
trajectoryMode_(false),
|
||||||
rawScanSaved_(false),
|
rawScanSaved_(false),
|
||||||
smoothing_(true),
|
smoothing_(true),
|
||||||
|
depthBleedingError_(0.0f),
|
||||||
depthFromMotion_(false),
|
depthFromMotion_(false),
|
||||||
cameraColor_(true),
|
cameraColor_(true),
|
||||||
fullResolution_(false),
|
fullResolution_(false),
|
||||||
@@ -245,7 +249,11 @@ RTABMapApp::RTABMapApp() :
|
|||||||
maxGainRadius_(0.02f),
|
maxGainRadius_(0.02f),
|
||||||
renderingTextureDecimation_(4),
|
renderingTextureDecimation_(4),
|
||||||
backgroundColor_(0.2f),
|
backgroundColor_(0.2f),
|
||||||
depthConfidence_(2),
|
#ifndef RTABMAP_ARCORE
|
||||||
|
depthConfidence_(100), // iOS
|
||||||
|
#else
|
||||||
|
depthConfidence_(0),
|
||||||
|
#endif
|
||||||
upstreamRelocalizationMaxAcc_(0.0f),
|
upstreamRelocalizationMaxAcc_(0.0f),
|
||||||
exportPointCloudFormat_("ply"),
|
exportPointCloudFormat_("ply"),
|
||||||
dataRecorderMode_(false),
|
dataRecorderMode_(false),
|
||||||
@@ -266,20 +274,20 @@ RTABMapApp::RTABMapApp() :
|
|||||||
lastPoseEventTime_(0.0),
|
lastPoseEventTime_(0.0),
|
||||||
visualizingMesh_(false),
|
visualizingMesh_(false),
|
||||||
exportedMeshUpdated_(false),
|
exportedMeshUpdated_(false),
|
||||||
|
optTextureMesh_(new pcl::TextureMesh),
|
||||||
|
optRefId_(0),
|
||||||
|
optRefPose_(0),
|
||||||
measuresUpdated_(false),
|
measuresUpdated_(false),
|
||||||
targetPoint_(new pcl::PointCloud<pcl::PointXYZRGB>),
|
metricSystem_(true),
|
||||||
quadSample_(new pcl::PointCloud<pcl::PointXYZ>),
|
|
||||||
quadSamplePolygons_(2),
|
|
||||||
metricSystem_(true),
|
|
||||||
measuringTextSize_(0.05f),
|
measuringTextSize_(0.05f),
|
||||||
snapAxisThr_(0.95),
|
snapAxisThr_(0.95),
|
||||||
measuringMode_(0),
|
measuringMode_(0),
|
||||||
addMeasureClicked_(false),
|
addMeasureClicked_(false),
|
||||||
teleportClicked_(false),
|
teleportClicked_(false),
|
||||||
removeMeasureClicked_(false),
|
removeMeasureClicked_(false),
|
||||||
optTextureMesh_(new pcl::TextureMesh),
|
targetPoint_(new pcl::PointCloud<pcl::PointXYZRGB>),
|
||||||
optRefId_(0),
|
quadSample_(new pcl::PointCloud<pcl::PointXYZ>),
|
||||||
optRefPose_(0),
|
quadSamplePolygons_(2),
|
||||||
mapToOdom_(rtabmap::Transform::getIdentity())
|
mapToOdom_(rtabmap::Transform::getIdentity())
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -461,7 +469,13 @@ int RTABMapApp::openDatabase(const std::string & databasePath, bool databaseInMe
|
|||||||
LOGI("Open: Found optimized mesh! Visualizing it.");
|
LOGI("Open: Found optimized mesh! Visualizing it.");
|
||||||
optTextureMesh_ = rtabmap::util3d::assembleTextureMesh(cloudMat, polygons, texCoords, textures, true);
|
optTextureMesh_ = rtabmap::util3d::assembleTextureMesh(cloudMat, polygons, texCoords, textures, true);
|
||||||
optMesh_ = rtabmap::Mesh();
|
optMesh_ = rtabmap::Mesh();
|
||||||
optTexture_ = textures;
|
if(textures.rows > 4096) // Limitation iOS, just for rendering on device
|
||||||
|
{
|
||||||
|
cv::resize(textures, optTexture_, cv::Size(4096, 4096), 0.0f, 0.0f, cv::INTER_AREA);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
optTexture_ = textures;
|
||||||
|
}
|
||||||
if(!optTexture_.empty())
|
if(!optTexture_.empty())
|
||||||
{
|
{
|
||||||
LOGI("Open: Texture mesh: %dx%d.", optTexture_.cols, optTexture_.rows);
|
LOGI("Open: Texture mesh: %dx%d.", optTexture_.cols, optTexture_.rows);
|
||||||
@@ -569,8 +583,8 @@ int RTABMapApp::openDatabase(const std::string & databasePath, bool databaseInMe
|
|||||||
rtabmap::SensorData data = signatures.at(id).sensorData();
|
rtabmap::SensorData data = signatures.at(id).sensorData();
|
||||||
rawPoses_.insert(std::make_pair(id, signatures.at(id).getPose()));
|
rawPoses_.insert(std::make_pair(id, signatures.at(id).getPose()));
|
||||||
|
|
||||||
cv::Mat tmpA, depth;
|
cv::Mat tmpA, tmpB, tmpC;
|
||||||
data.uncompressData(&tmpA, &depth);
|
data.uncompressData(&tmpA, &tmpB, 0, 0, 0, 0, 0, depthConfidence_>0?&tmpC:0);
|
||||||
|
|
||||||
if(!(!data.imageRaw().empty() && !data.depthRaw().empty()) && !data.laserScanCompressed().isEmpty())
|
if(!(!data.imageRaw().empty() && !data.depthRaw().empty()) && !data.laserScanCompressed().isEmpty())
|
||||||
{
|
{
|
||||||
@@ -587,7 +601,29 @@ int RTABMapApp::openDatabase(const std::string & databasePath, bool databaseInMe
|
|||||||
{
|
{
|
||||||
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
||||||
|
|
||||||
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get());
|
if(smoothing_ || depthBleedingError_>0.0f)
|
||||||
|
{
|
||||||
|
cv::Mat depth = data.depthRaw();
|
||||||
|
if(depthBleedingError_ > 0.0f)
|
||||||
|
{
|
||||||
|
rtabmap::util2d::depthBleedingFiltering(depth, depthBleedingError_);
|
||||||
|
}
|
||||||
|
if(smoothing_)
|
||||||
|
{
|
||||||
|
depth = rtabmap::util2d::fastBilateralFiltering(depth, g_bilateralFilteringSigmaS, g_bilateralFilteringSigmaR);
|
||||||
|
}
|
||||||
|
data.setRGBDImage(data.imageRaw(), depth, data.depthConfidenceRaw(), data.cameraModels());
|
||||||
|
}
|
||||||
|
|
||||||
|
cloud = rtabmap::util3d::cloudRGBFromSensorData(
|
||||||
|
data,
|
||||||
|
meshDecimation,
|
||||||
|
maxCloudDepth_,
|
||||||
|
minCloudDepth_,
|
||||||
|
indices.get(),
|
||||||
|
rtabmap::ParametersMap(),
|
||||||
|
std::vector<float>(),
|
||||||
|
depthConfidence_);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -875,11 +911,11 @@ int RTABMapApp::updateMeshDecimation(int width, int height)
|
|||||||
{
|
{
|
||||||
meshDecimation = 5;
|
meshDecimation = 5;
|
||||||
}
|
}
|
||||||
else if(width % 3 == 0 && width % 3 == 0)
|
else if(width % 3 == 0 && height % 3 == 0)
|
||||||
{
|
{
|
||||||
meshDecimation = 3;
|
meshDecimation = 3;
|
||||||
}
|
}
|
||||||
else if(width % 2 == 0 && width % 2 == 0)
|
else if(width % 2 == 0 && height % 2 == 0)
|
||||||
{
|
{
|
||||||
meshDecimation = 2;
|
meshDecimation = 2;
|
||||||
}
|
}
|
||||||
@@ -946,7 +982,7 @@ bool RTABMapApp::startCamera()
|
|||||||
if(cameraDriver_ == 0) // Tango
|
if(cameraDriver_ == 0) // Tango
|
||||||
{
|
{
|
||||||
#ifdef RTABMAP_TANGO
|
#ifdef RTABMAP_TANGO
|
||||||
camera_ = new rtabmap::CameraTango(cameraColor_, !cameraColor_ || fullResolution_?1:2, rawScanSaved_, smoothing_);
|
camera_ = new rtabmap::CameraTango(cameraColor_, !cameraColor_ || fullResolution_?1:2, rawScanSaved_);
|
||||||
|
|
||||||
if (TangoService_setBinder(env, iBinder) != TANGO_SUCCESS) {
|
if (TangoService_setBinder(env, iBinder) != TANGO_SUCCESS) {
|
||||||
UERROR("TangoHandler::ConnectTango, TangoService_setBinder error");
|
UERROR("TangoHandler::ConnectTango, TangoService_setBinder error");
|
||||||
@@ -961,7 +997,7 @@ bool RTABMapApp::startCamera()
|
|||||||
else if(cameraDriver_ == 1)
|
else if(cameraDriver_ == 1)
|
||||||
{
|
{
|
||||||
#ifdef RTABMAP_ARCORE
|
#ifdef RTABMAP_ARCORE
|
||||||
camera_ = new rtabmap::CameraARCore(env, context, activity, depthFromMotion_, smoothing_, upstreamRelocalizationMaxAcc_);
|
camera_ = new rtabmap::CameraARCore(env, context, activity, depthFromMotion_, upstreamRelocalizationMaxAcc_);
|
||||||
#else
|
#else
|
||||||
UERROR("RTAB-Map is not built with ARCore support!");
|
UERROR("RTAB-Map is not built with ARCore support!");
|
||||||
#endif
|
#endif
|
||||||
@@ -969,14 +1005,14 @@ bool RTABMapApp::startCamera()
|
|||||||
else if(cameraDriver_ == 2)
|
else if(cameraDriver_ == 2)
|
||||||
{
|
{
|
||||||
#ifdef RTABMAP_ARENGINE
|
#ifdef RTABMAP_ARENGINE
|
||||||
camera_ = new rtabmap::CameraAREngine(env, context, activity, smoothing_, upstreamRelocalizationMaxAcc_);
|
camera_ = new rtabmap::CameraAREngine(env, context, activity, upstreamRelocalizationMaxAcc_);
|
||||||
#else
|
#else
|
||||||
UERROR("RTAB-Map is not built with AREngine support!");
|
UERROR("RTAB-Map is not built with AREngine support!");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if(cameraDriver_ == 3)
|
else if(cameraDriver_ == 3)
|
||||||
{
|
{
|
||||||
camera_ = new rtabmap::CameraMobile(smoothing_, upstreamRelocalizationMaxAcc_);
|
camera_ = new rtabmap::CameraMobile(upstreamRelocalizationMaxAcc_);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(camera_ == 0)
|
if(camera_ == 0)
|
||||||
@@ -1003,7 +1039,11 @@ bool RTABMapApp::startCamera()
|
|||||||
cameraJustInitialized_ = true;
|
cameraJustInitialized_ = true;
|
||||||
if(useExternalLidar_)
|
if(useExternalLidar_)
|
||||||
{
|
{
|
||||||
|
#if BOOST_VERSION >= 108700
|
||||||
|
rtabmap::LidarVLP16 * lidar = new rtabmap::LidarVLP16(boost::asio::ip::make_address("192.168.1.201"), 2368, true);
|
||||||
|
#else
|
||||||
rtabmap::LidarVLP16 * lidar = new rtabmap::LidarVLP16(boost::asio::ip::address_v4::from_string("192.168.1.201"), 2368, true);
|
rtabmap::LidarVLP16 * lidar = new rtabmap::LidarVLP16(boost::asio::ip::address_v4::from_string("192.168.1.201"), 2368, true);
|
||||||
|
#endif
|
||||||
lidar->init();
|
lidar->init();
|
||||||
camera_->setImageRate(0); // if lidar, to get close camera synchronization
|
camera_->setImageRate(0); // if lidar, to get close camera synchronization
|
||||||
sensorCaptureThread_ = new rtabmap::SensorCaptureThread(lidar, camera_, camera_, rtabmap::Transform::getIdentity());
|
sensorCaptureThread_ = new rtabmap::SensorCaptureThread(lidar, camera_, camera_, rtabmap::Transform::getIdentity());
|
||||||
@@ -1354,8 +1394,8 @@ int RTABMapApp::Render()
|
|||||||
#ifdef DEBUG_RENDERING_PERFORMANCE
|
#ifdef DEBUG_RENDERING_PERFORMANCE
|
||||||
LOGD("Camera updateOnRender %fs", time.ticks());
|
LOGD("Camera updateOnRender %fs", time.ticks());
|
||||||
#endif
|
#endif
|
||||||
// We detect if we are in measuring mode if rtabmap is not running
|
// We check if we are in measuring mode: not visualizing mesh or rtabmap is not started (localization mode)
|
||||||
if(main_scene_.background_renderer_ == 0 && camera_->getTextureId() != 0 && !(rtabmapThread_ == 0 || !rtabmapThread_->isRunning()))
|
if(main_scene_.background_renderer_ == 0 && camera_->getTextureId() != 0 && (!visualizingMesh_ || !(rtabmapThread_ == 0 || !rtabmapThread_->isRunning())))
|
||||||
{
|
{
|
||||||
main_scene_.background_renderer_ = new BackgroundRenderer();
|
main_scene_.background_renderer_ = new BackgroundRenderer();
|
||||||
main_scene_.background_renderer_->InitializeGlContent(((rtabmap::CameraMobile*)camera_)->getTextureId(), cameraDriver_ <= 2);
|
main_scene_.background_renderer_->InitializeGlContent(((rtabmap::CameraMobile*)camera_)->getTextureId(), cameraDriver_ <= 2);
|
||||||
@@ -1536,7 +1576,6 @@ int RTABMapApp::Render()
|
|||||||
int textId = 0;
|
int textId = 0;
|
||||||
int quadId = 0;
|
int quadId = 0;
|
||||||
int circleId = 0;
|
int circleId = 0;
|
||||||
float sphereRadius = 0.02f;
|
|
||||||
float quadSize=0.05f;
|
float quadSize=0.05f;
|
||||||
float quadAlpha = 0.3f;
|
float quadAlpha = 0.3f;
|
||||||
|
|
||||||
@@ -2010,8 +2049,8 @@ int RTABMapApp::Render()
|
|||||||
{
|
{
|
||||||
rtabmap::SensorData data = bufferedSensorData.at(id);
|
rtabmap::SensorData data = bufferedSensorData.at(id);
|
||||||
|
|
||||||
cv::Mat tmpA, depth;
|
cv::Mat tmpA, tmpB, tmpC;
|
||||||
data.uncompressData(&tmpA, &depth);
|
data.uncompressData(&tmpA, &tmpB, 0, 0, 0, 0, 0, depthConfidence_>0?&tmpC:0);
|
||||||
if(!(!data.imageRaw().empty() && !data.depthRaw().empty()) && !data.laserScanCompressed().isEmpty())
|
if(!(!data.imageRaw().empty() && !data.depthRaw().empty()) && !data.laserScanCompressed().isEmpty())
|
||||||
{
|
{
|
||||||
rtabmap::LaserScan scan;
|
rtabmap::LaserScan scan;
|
||||||
@@ -2029,7 +2068,20 @@ int RTABMapApp::Render()
|
|||||||
if(!data.imageRaw().empty() && !data.depthRaw().empty() && (!useExternalLidar_ || data.laserScanRaw().isEmpty()))
|
if(!data.imageRaw().empty() && !data.depthRaw().empty() && (!useExternalLidar_ || data.laserScanRaw().isEmpty()))
|
||||||
{
|
{
|
||||||
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
||||||
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get());
|
if(smoothing_ || depthBleedingError_>0.0f)
|
||||||
|
{
|
||||||
|
cv::Mat depth = data.depthRaw();
|
||||||
|
if(depthBleedingError_ > 0.0f)
|
||||||
|
{
|
||||||
|
rtabmap::util2d::depthBleedingFiltering(depth, depthBleedingError_);
|
||||||
|
}
|
||||||
|
if(smoothing_)
|
||||||
|
{
|
||||||
|
depth = rtabmap::util2d::fastBilateralFiltering(depth, g_bilateralFilteringSigmaS, g_bilateralFilteringSigmaR);
|
||||||
|
}
|
||||||
|
data.setRGBDImage(data.imageRaw(), depth, data.depthConfidenceRaw(), data.cameraModels());
|
||||||
|
}
|
||||||
|
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get(), rtabmap::ParametersMap(), std::vector<float>(), depthConfidence_);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2245,7 +2297,7 @@ int RTABMapApp::Render()
|
|||||||
if(!sensorEvent.data().imageRaw().empty() && !sensorEvent.data().depthRaw().empty() && (!useExternalLidar_ || sensorEvent.data().laserScanRaw().isEmpty()))
|
if(!sensorEvent.data().imageRaw().empty() && !sensorEvent.data().depthRaw().empty() && (!useExternalLidar_ || sensorEvent.data().laserScanRaw().isEmpty()))
|
||||||
{
|
{
|
||||||
int meshDecimation = updateMeshDecimation(sensorEvent.data().depthRaw().cols, sensorEvent.data().depthRaw().rows);
|
int meshDecimation = updateMeshDecimation(sensorEvent.data().depthRaw().cols, sensorEvent.data().depthRaw().rows);
|
||||||
cloud = rtabmap::util3d::cloudRGBFromSensorData(sensorEvent.data(), meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get());
|
cloud = rtabmap::util3d::cloudRGBFromSensorData(sensorEvent.data(), meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get(), rtabmap::ParametersMap(), std::vector<float>(), depthConfidence_);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2948,7 +3000,7 @@ void RTABMapApp::setTrajectoryMode(bool enabled)
|
|||||||
void RTABMapApp::setGraphOptimization(bool enabled)
|
void RTABMapApp::setGraphOptimization(bool enabled)
|
||||||
{
|
{
|
||||||
graphOptimization_ = enabled;
|
graphOptimization_ = enabled;
|
||||||
if((sensorCaptureThread_ == 0) && rtabmap_ && rtabmap_->getMemory()->getLastWorkingSignature()!=0)
|
if((sensorCaptureThread_ == 0) && rtabmap_ && rtabmap_->getMemory()->getLastWorkingSignature(false)!=0)
|
||||||
{
|
{
|
||||||
std::map<int, rtabmap::Transform> poses;
|
std::map<int, rtabmap::Transform> poses;
|
||||||
std::multimap<int, rtabmap::Link> links;
|
std::multimap<int, rtabmap::Link> links;
|
||||||
@@ -3015,6 +3067,11 @@ void RTABMapApp::setSmoothing(bool enabled)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RTABMapApp::setDepthBleedingError(float value)
|
||||||
|
{
|
||||||
|
depthBleedingError_ = value;
|
||||||
|
}
|
||||||
|
|
||||||
void RTABMapApp::setDepthFromMotion(bool enabled)
|
void RTABMapApp::setDepthFromMotion(bool enabled)
|
||||||
{
|
{
|
||||||
if(depthFromMotion_ != enabled)
|
if(depthFromMotion_ != enabled)
|
||||||
@@ -3107,10 +3164,10 @@ void RTABMapApp::setBackgroundColor(float gray)
|
|||||||
|
|
||||||
void RTABMapApp::setDepthConfidence(int value)
|
void RTABMapApp::setDepthConfidence(int value)
|
||||||
{
|
{
|
||||||
depthConfidence_ = value;
|
depthConfidence_ = value*50; // [0,2] -> [0,100]
|
||||||
if(depthConfidence_>2)
|
if(depthConfidence_>100)
|
||||||
{
|
{
|
||||||
depthConfidence_ = 2;
|
depthConfidence_ = 100;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3410,6 +3467,19 @@ bool RTABMapApp::exportMesh(
|
|||||||
if(!data.imageRaw().empty() && !data.depthRaw().empty() && data.cameraModels().size() == 1)
|
if(!data.imageRaw().empty() && !data.depthRaw().empty() && data.cameraModels().size() == 1)
|
||||||
{
|
{
|
||||||
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
||||||
|
if(smoothing_ || depthBleedingError_>0.0f)
|
||||||
|
{
|
||||||
|
cv::Mat depth = data.depthRaw();
|
||||||
|
if(depthBleedingError_ > 0.0f)
|
||||||
|
{
|
||||||
|
rtabmap::util2d::depthBleedingFiltering(depth, depthBleedingError_);
|
||||||
|
}
|
||||||
|
if(smoothing_)
|
||||||
|
{
|
||||||
|
depth = rtabmap::util2d::fastBilateralFiltering(depth, g_bilateralFilteringSigmaS, g_bilateralFilteringSigmaR);
|
||||||
|
}
|
||||||
|
data.setRGBDImage(data.imageRaw(), depth, data.depthConfidenceRaw(), data.cameraModels());
|
||||||
|
}
|
||||||
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get());
|
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get());
|
||||||
model = data.cameraModels()[0];
|
model = data.cameraModels()[0];
|
||||||
depth = data.depthRaw();
|
depth = data.depthRaw();
|
||||||
@@ -3677,7 +3747,20 @@ bool RTABMapApp::exportMesh(
|
|||||||
if(!data.imageRaw().empty() && !data.depthRaw().empty() && data.cameraModels().size() == 1)
|
if(!data.imageRaw().empty() && !data.depthRaw().empty() && data.cameraModels().size() == 1)
|
||||||
{
|
{
|
||||||
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
||||||
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_);
|
if(smoothing_ || depthBleedingError_>0.0f)
|
||||||
|
{
|
||||||
|
cv::Mat depth = data.depthRaw();
|
||||||
|
if(depthBleedingError_ > 0.0f)
|
||||||
|
{
|
||||||
|
rtabmap::util2d::depthBleedingFiltering(depth, depthBleedingError_);
|
||||||
|
}
|
||||||
|
if(smoothing_)
|
||||||
|
{
|
||||||
|
depth = rtabmap::util2d::fastBilateralFiltering(depth, g_bilateralFilteringSigmaS, g_bilateralFilteringSigmaR);
|
||||||
|
}
|
||||||
|
data.setRGBDImage(data.imageRaw(), depth, data.depthConfidenceRaw(), data.cameraModels());
|
||||||
|
}
|
||||||
|
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_, 0, rtabmap::ParametersMap(), std::vector<float>(), depthConfidence_);
|
||||||
polygons = rtabmap::util3d::organizedFastMesh(cloud, meshAngleToleranceDeg_*M_PI/180.0, false, meshTrianglePix_);
|
polygons = rtabmap::util3d::organizedFastMesh(cloud, meshAngleToleranceDeg_*M_PI/180.0, false, meshTrianglePix_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3935,7 +4018,20 @@ bool RTABMapApp::exportMesh(
|
|||||||
if(!data.imageRaw().empty() && !data.depthRaw().empty())
|
if(!data.imageRaw().empty() && !data.depthRaw().empty())
|
||||||
{
|
{
|
||||||
// full resolution
|
// full resolution
|
||||||
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, 1, maxCloudDepth_, minCloudDepth_, indices.get());
|
if(smoothing_ || depthBleedingError_>0.0f)
|
||||||
|
{
|
||||||
|
cv::Mat depth = data.depthRaw();
|
||||||
|
if(depthBleedingError_ > 0.0f)
|
||||||
|
{
|
||||||
|
rtabmap::util2d::depthBleedingFiltering(depth, depthBleedingError_);
|
||||||
|
}
|
||||||
|
if(smoothing_)
|
||||||
|
{
|
||||||
|
depth = rtabmap::util2d::fastBilateralFiltering(depth, g_bilateralFilteringSigmaS, g_bilateralFilteringSigmaR);
|
||||||
|
}
|
||||||
|
data.setRGBDImage(data.imageRaw(), depth, data.depthConfidenceRaw(), data.cameraModels());
|
||||||
|
}
|
||||||
|
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, 1, maxCloudDepth_, minCloudDepth_, indices.get(), rtabmap::ParametersMap(), std::vector<float>(), depthConfidence_);
|
||||||
}
|
}
|
||||||
else if(!data.laserScanRaw().empty())
|
else if(!data.laserScanRaw().empty())
|
||||||
{
|
{
|
||||||
@@ -3965,7 +4061,20 @@ bool RTABMapApp::exportMesh(
|
|||||||
if(!data.imageRaw().empty() && !data.depthRaw().empty())
|
if(!data.imageRaw().empty() && !data.depthRaw().empty())
|
||||||
{
|
{
|
||||||
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
||||||
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get());
|
if(smoothing_ || depthBleedingError_>0.0f)
|
||||||
|
{
|
||||||
|
cv::Mat depth = data.depthRaw();
|
||||||
|
if(depthBleedingError_ > 0.0f)
|
||||||
|
{
|
||||||
|
rtabmap::util2d::depthBleedingFiltering(depth, depthBleedingError_);
|
||||||
|
}
|
||||||
|
if(smoothing_)
|
||||||
|
{
|
||||||
|
depth = rtabmap::util2d::fastBilateralFiltering(depth, g_bilateralFilteringSigmaS, g_bilateralFilteringSigmaR);
|
||||||
|
}
|
||||||
|
data.setRGBDImage(data.imageRaw(), depth, data.depthConfidenceRaw(), data.cameraModels());
|
||||||
|
}
|
||||||
|
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get(), rtabmap::ParametersMap(), std::vector<float>(), depthConfidence_);
|
||||||
}
|
}
|
||||||
else if(!data.laserScanRaw().empty())
|
else if(!data.laserScanRaw().empty())
|
||||||
{
|
{
|
||||||
@@ -4117,7 +4226,13 @@ bool RTABMapApp::postExportation(bool visualize)
|
|||||||
LOGI("postExportation: Found optimized mesh! Visualizing it.");
|
LOGI("postExportation: Found optimized mesh! Visualizing it.");
|
||||||
optTextureMesh_ = rtabmap::util3d::assembleTextureMesh(cloudMat, polygons, texCoords, textures, true);
|
optTextureMesh_ = rtabmap::util3d::assembleTextureMesh(cloudMat, polygons, texCoords, textures, true);
|
||||||
optMesh_ = rtabmap::Mesh();
|
optMesh_ = rtabmap::Mesh();
|
||||||
optTexture_ = textures;
|
if(textures.rows > 4096) // Limitation iOS, just for rendering on device
|
||||||
|
{
|
||||||
|
cv::resize(textures, optTexture_, cv::Size(4096, 4096), 0.0f, 0.0f, cv::INTER_AREA);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
optTexture_ = textures;
|
||||||
|
}
|
||||||
|
|
||||||
boost::mutex::scoped_lock lock(renderingMutex_);
|
boost::mutex::scoped_lock lock(renderingMutex_);
|
||||||
visualizingMesh_ = true;
|
visualizingMesh_ = true;
|
||||||
@@ -4524,6 +4639,7 @@ void RTABMapApp::postOdometryEvent(
|
|||||||
|
|
||||||
|
|
||||||
cv::Mat outputDepth;
|
cv::Mat outputDepth;
|
||||||
|
cv::Mat outputDepthConfidence;
|
||||||
if(depth && depthHeight>0 && depthWidth>0)
|
if(depth && depthHeight>0 && depthWidth>0)
|
||||||
{
|
{
|
||||||
#ifndef DISABLE_LOG
|
#ifndef DISABLE_LOG
|
||||||
@@ -4533,32 +4649,21 @@ void RTABMapApp::postOdometryEvent(
|
|||||||
{
|
{
|
||||||
// IOS
|
// IOS
|
||||||
outputDepth = cv::Mat(depthHeight, depthWidth, CV_32FC1, (void*)depth).clone();
|
outputDepth = cv::Mat(depthHeight, depthWidth, CV_32FC1, (void*)depth).clone();
|
||||||
if(conf && confWidth == depthWidth && confHeight == depthHeight && confFormat == 1278226488 && depthConfidence_>0)
|
if(conf && confWidth == depthWidth && confHeight == depthHeight && confFormat == 1278226488)
|
||||||
{
|
{
|
||||||
const unsigned char * confPtr = (const unsigned char *)conf;
|
// https://developer.apple.com/documentation/arkit/arconfidencelevel
|
||||||
float * depthPtr = outputDepth.ptr<float>();
|
// 0 = low
|
||||||
int i=0;
|
// 1 = medium
|
||||||
for (int y = 0; y < outputDepth.rows; ++y)
|
// 2 = high
|
||||||
{
|
// Re-scale confidence from [0,2] to [0,100]
|
||||||
for (int x = 0; x < outputDepth.cols; ++x)
|
cv::Mat(depthHeight, depthWidth, CV_8UC1, (void*)conf).convertTo(outputDepthConfidence, CV_8UC1, 50, 0);
|
||||||
{
|
|
||||||
// https://developer.apple.com/documentation/arkit/arconfidencelevel
|
|
||||||
// 0 = low
|
|
||||||
// 1 = medium
|
|
||||||
// 2 = high
|
|
||||||
if(confPtr[y*outputDepth.cols + x] < depthConfidence_)
|
|
||||||
{
|
|
||||||
depthPtr[y*outputDepth.cols + x] = 0.0f;
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(depthLen == 2*depthWidth*depthHeight)
|
else if(depthLen == 2*depthWidth*depthHeight)
|
||||||
{
|
{
|
||||||
// ANDROID
|
// ANDROID
|
||||||
outputDepth = cv::Mat(depthHeight, depthWidth, CV_16UC1);
|
outputDepth = cv::Mat(depthHeight, depthWidth, CV_16UC1);
|
||||||
|
outputDepthConfidence = cv::Mat(depthHeight, depthWidth, CV_8UC1);
|
||||||
uint16_t *dataShort = (uint16_t *)depth;
|
uint16_t *dataShort = (uint16_t *)depth;
|
||||||
for (int y = 0; y < outputDepth.rows; ++y)
|
for (int y = 0; y < outputDepth.rows; ++y)
|
||||||
{
|
{
|
||||||
@@ -4567,6 +4672,13 @@ void RTABMapApp::postOdometryEvent(
|
|||||||
uint16_t depthSample = dataShort[y*outputDepth.cols + x];
|
uint16_t depthSample = dataShort[y*outputDepth.cols + x];
|
||||||
uint16_t depthRange = (depthSample & 0x1FFF); // first 3 bits are confidence
|
uint16_t depthRange = (depthSample & 0x1FFF); // first 3 bits are confidence
|
||||||
outputDepth.at<uint16_t>(y,x) = depthRange;
|
outputDepth.at<uint16_t>(y,x) = depthRange;
|
||||||
|
// https://developer.android.com/reference/android/graphics/ImageFormat#DEPTH16
|
||||||
|
// The confidence value is an estimate of correctness for this sample. It
|
||||||
|
// is encoded in the 3 most significant bits of the sample, with a value of
|
||||||
|
// 0 representing 100% confidence, a value of 1 representing 0% confidence, a
|
||||||
|
// value of 2 representing 1/7, a value of 3 representing 2/7, and so on.
|
||||||
|
uint8_t depthConfidence = uint8_t((depthSample >> 13) & 0x7);
|
||||||
|
outputDepthConfidence.at<uint8_t>(y,x) = depthConfidence == 0 ? 100 : (depthConfidence - 1)*100 / 7;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4626,7 +4738,9 @@ void RTABMapApp::postOdometryEvent(
|
|||||||
depth_fx, 0, depth_cx,
|
depth_fx, 0, depth_cx,
|
||||||
0, depth_fy, depth_cy,
|
0, depth_fy, depth_cy,
|
||||||
0, 0, 1);
|
0, 0, 1);
|
||||||
outputDepth = rtabmap::util2d::registerDepth(outputDepth, depthK, outputDepth.size(), colorK, rgbToDepth);
|
cv::Mat regConfidence;
|
||||||
|
outputDepth = rtabmap::util2d::registerDepth(outputDepth, outputDepthConfidence, depthK, outputDepth.size(), colorK, rgbToDepth, regConfidence);
|
||||||
|
outputDepthConfidence = regConfidence;
|
||||||
#ifndef DISABLE_LOG
|
#ifndef DISABLE_LOG
|
||||||
UDEBUG("Depth registration time: %fs", time.elapsed());
|
UDEBUG("Depth registration time: %fs", time.elapsed());
|
||||||
#endif
|
#endif
|
||||||
@@ -4667,7 +4781,7 @@ void RTABMapApp::postOdometryEvent(
|
|||||||
camera_->setOcclusionImage(outputDepth, depthModel);
|
camera_->setOcclusionImage(outputDepth, depthModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
rtabmap::SensorData data(scan, outputRGB, outputDepth, model, 0, stamp);
|
rtabmap::SensorData data(scan, outputRGB, outputDepth, outputDepthConfidence, model, 0, stamp);
|
||||||
data.setFeatures(kpts, kpts3, cv::Mat());
|
data.setFeatures(kpts, kpts3, cv::Mat());
|
||||||
glm::mat4 projectionMatrix(0);
|
glm::mat4 projectionMatrix(0);
|
||||||
projectionMatrix[0][0] = p00;
|
projectionMatrix[0][0] = p00;
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
void setCameraColor(bool enabled);
|
void setCameraColor(bool enabled);
|
||||||
void setFullResolution(bool enabled);
|
void setFullResolution(bool enabled);
|
||||||
void setSmoothing(bool enabled);
|
void setSmoothing(bool enabled);
|
||||||
|
void setDepthBleedingError(float value);
|
||||||
void setDepthFromMotion(bool enabled);
|
void setDepthFromMotion(bool enabled);
|
||||||
void setAppendMode(bool enabled);
|
void setAppendMode(bool enabled);
|
||||||
void setUpstreamRelocalizationAccThr(float value);
|
void setUpstreamRelocalizationAccThr(float value);
|
||||||
@@ -235,6 +236,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
bool trajectoryMode_;
|
bool trajectoryMode_;
|
||||||
bool rawScanSaved_;
|
bool rawScanSaved_;
|
||||||
bool smoothing_;
|
bool smoothing_;
|
||||||
|
float depthBleedingError_;
|
||||||
bool depthFromMotion_;
|
bool depthFromMotion_;
|
||||||
bool cameraColor_;
|
bool cameraColor_;
|
||||||
bool fullResolution_;
|
bool fullResolution_;
|
||||||
@@ -250,7 +252,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
float maxGainRadius_;
|
float maxGainRadius_;
|
||||||
int renderingTextureDecimation_;
|
int renderingTextureDecimation_;
|
||||||
float backgroundColor_;
|
float backgroundColor_;
|
||||||
int depthConfidence_;
|
unsigned char depthConfidence_;
|
||||||
float upstreamRelocalizationMaxAcc_;
|
float upstreamRelocalizationMaxAcc_;
|
||||||
std::string exportPointCloudFormat_;
|
std::string exportPointCloudFormat_;
|
||||||
|
|
||||||
|
|||||||
@@ -512,6 +512,19 @@ Java_com_introlab_rtabmap_RTABMapLib_setSmoothing(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setDepthBleedingError(
|
||||||
|
JNIEnv*, jclass, jlong native_application, float value)
|
||||||
|
{
|
||||||
|
if(native_application)
|
||||||
|
{
|
||||||
|
return native(native_application)->setDepthBleedingError(value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UERROR("native_application is null!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_setDepthFromMotion(
|
Java_com_introlab_rtabmap_RTABMapLib_setDepthFromMotion(
|
||||||
JNIEnv*, jclass, jlong native_application, bool enabled)
|
JNIEnv*, jclass, jlong native_application, bool enabled)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -114,6 +114,13 @@
|
|||||||
android:title="@string/pref_title_smoothing"
|
android:title="@string/pref_title_smoothing"
|
||||||
android:summary="@string/pref_summary_smoothing"
|
android:summary="@string/pref_summary_smoothing"
|
||||||
android:defaultValue="@string/pref_default_smoothing"/>
|
android:defaultValue="@string/pref_default_smoothing"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_depth_bleeding_error"
|
||||||
|
android:title="@string/pref_title_depth_bleeding_error"
|
||||||
|
android:summary="@string/pref_summary_depth_bleeding_error"
|
||||||
|
android:entries="@array/pref_depth_bleeding_error_keys"
|
||||||
|
android:entryValues="@array/pref_depth_bleeding_error_values"
|
||||||
|
android:defaultValue="@string/pref_default_depth_bleeding_error"/>
|
||||||
<com.introlab.rtabmap.CustomSwitchPreference
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_fisheye"
|
android:key="@string/pref_key_fisheye"
|
||||||
android:title="@string/pref_title_fisheye"
|
android:title="@string/pref_title_fisheye"
|
||||||
|
|||||||
@@ -76,6 +76,8 @@
|
|||||||
<string name="pref_default_resolution">false</string>
|
<string name="pref_default_resolution">false</string>
|
||||||
<string name="pref_key_smoothing">pref_key_smoothing</string>
|
<string name="pref_key_smoothing">pref_key_smoothing</string>
|
||||||
<string name="pref_default_smoothing">false</string>
|
<string name="pref_default_smoothing">false</string>
|
||||||
|
<string name="pref_key_depth_bleeding_error">pref_key_depth_bleeding_error</string>
|
||||||
|
<string name="pref_default_depth_bleeding_error">0.0</string>
|
||||||
<string name="pref_key_fisheye">pref_key_fisheye</string>
|
<string name="pref_key_fisheye">pref_key_fisheye</string>
|
||||||
<string name="pref_default_fisheye">false</string>
|
<string name="pref_default_fisheye">false</string>
|
||||||
|
|
||||||
@@ -337,6 +339,8 @@
|
|||||||
<string name="pref_summary_resolution">Save HD images of the color camera if you want very detailed textures. More memory will be required.</string>
|
<string name="pref_summary_resolution">Save HD images of the color camera if you want very detailed textures. More memory will be required.</string>
|
||||||
<string name="pref_title_smoothing">Smoothing</string>
|
<string name="pref_title_smoothing">Smoothing</string>
|
||||||
<string name="pref_summary_smoothing">Smooth the point clouds.</string>
|
<string name="pref_summary_smoothing">Smooth the point clouds.</string>
|
||||||
|
<string name="pref_title_depth_bleeding_error">Depth Bleeding Filtering Error</string>
|
||||||
|
<string name="pref_summary_depth_bleeding_error">Filter noisy depth points on the edges.</string>
|
||||||
<string name="pref_title_fisheye">Fish Eye Camera</string>
|
<string name="pref_title_fisheye">Fish Eye Camera</string>
|
||||||
<string name="pref_summary_fisheye">Use fish eye camera instead of the color camera. May not work on some devices.</string>
|
<string name="pref_summary_fisheye">Use fish eye camera instead of the color camera. May not work on some devices.</string>
|
||||||
<string name="pref_title_update_rate">Update Rate</string>
|
<string name="pref_title_update_rate">Update Rate</string>
|
||||||
@@ -436,6 +440,26 @@
|
|||||||
<item>"29.41995"</item>
|
<item>"29.41995"</item>
|
||||||
<item>"19.6133"</item>
|
<item>"19.6133"</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="pref_depth_bleeding_error_keys">
|
||||||
|
<item>"Disabled"</item>
|
||||||
|
<item>"2.5 cm"</item>
|
||||||
|
<item>"5 cm"</item>
|
||||||
|
<item>"10 cm"</item>
|
||||||
|
<item>"15 cm"</item>
|
||||||
|
<item>"20 cm"</item>
|
||||||
|
<item>"25 cm"</item>
|
||||||
|
<item>"30 cm"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_depth_bleeding_error_values">
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"0.025"</item>
|
||||||
|
<item>"0.05"</item>
|
||||||
|
<item>"0.10"</item>
|
||||||
|
<item>"0.15"</item>
|
||||||
|
<item>"0.20"</item>
|
||||||
|
<item>"0.25"</item>
|
||||||
|
<item>"0.30"</item>
|
||||||
|
</string-array>
|
||||||
<string-array name="pref_max_speed_keys">
|
<string-array name="pref_max_speed_keys">
|
||||||
<item>"No Limit"</item>
|
<item>"No Limit"</item>
|
||||||
<item>"High"</item>
|
<item>"High"</item>
|
||||||
|
|||||||
@@ -1140,6 +1140,7 @@ public class RTABMapActivity extends FragmentActivity implements OnClickListener
|
|||||||
RTABMapLib.setRawScanSaved(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_raw_scan_saved), Boolean.parseBoolean(getString(R.string.pref_default_raw_scan_saved))));
|
RTABMapLib.setRawScanSaved(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_raw_scan_saved), Boolean.parseBoolean(getString(R.string.pref_default_raw_scan_saved))));
|
||||||
RTABMapLib.setFullResolution(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_resolution), Boolean.parseBoolean(getString(R.string.pref_default_resolution))));
|
RTABMapLib.setFullResolution(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_resolution), Boolean.parseBoolean(getString(R.string.pref_default_resolution))));
|
||||||
RTABMapLib.setSmoothing(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_smoothing), Boolean.parseBoolean(getString(R.string.pref_default_smoothing))));
|
RTABMapLib.setSmoothing(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_smoothing), Boolean.parseBoolean(getString(R.string.pref_default_smoothing))));
|
||||||
|
RTABMapLib.setDepthBleedingError(nativeApplication, Float.parseFloat(sharedPref.getString(getString(R.string.pref_key_depth_bleeding_error), getString(R.string.pref_default_depth_bleeding_error))));
|
||||||
RTABMapLib.setDepthFromMotion(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_depth_from_motion), Boolean.parseBoolean(getString(R.string.pref_default_depth_from_motion))));
|
RTABMapLib.setDepthFromMotion(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_depth_from_motion), Boolean.parseBoolean(getString(R.string.pref_default_depth_from_motion))));
|
||||||
RTABMapLib.setCameraColor(nativeApplication, !sharedPref.getBoolean(getString(R.string.pref_key_fisheye), Boolean.parseBoolean(getString(R.string.pref_default_fisheye))));
|
RTABMapLib.setCameraColor(nativeApplication, !sharedPref.getBoolean(getString(R.string.pref_key_fisheye), Boolean.parseBoolean(getString(R.string.pref_default_fisheye))));
|
||||||
RTABMapLib.setAppendMode(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_append), Boolean.parseBoolean(getString(R.string.pref_default_append))));
|
RTABMapLib.setAppendMode(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_append), Boolean.parseBoolean(getString(R.string.pref_default_append))));
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ public class RTABMapLib
|
|||||||
public static native void setRawScanSaved(long nativeApplication, boolean enabled);
|
public static native void setRawScanSaved(long nativeApplication, boolean enabled);
|
||||||
public static native void setFullResolution(long nativeApplication, boolean enabled);
|
public static native void setFullResolution(long nativeApplication, boolean enabled);
|
||||||
public static native void setSmoothing(long nativeApplication, boolean enabled);
|
public static native void setSmoothing(long nativeApplication, boolean enabled);
|
||||||
|
public static native void setDepthBleedingError(long nativeApplication, float value);
|
||||||
public static native void setDepthFromMotion(long nativeApplication, boolean enabled);
|
public static native void setDepthFromMotion(long nativeApplication, boolean enabled);
|
||||||
public static native void setCameraColor(long nativeApplication, boolean enabled);
|
public static native void setCameraColor(long nativeApplication, boolean enabled);
|
||||||
public static native void setAppendMode(long nativeApplication, boolean enabled);
|
public static native void setAppendMode(long nativeApplication, boolean enabled);
|
||||||
|
|||||||
@@ -222,7 +222,8 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref
|
|||||||
((Preference)findPreference(getString(R.string.pref_key_background_color))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_background_color))).getEntry() + ") "+getString(R.string.pref_summary_background_color));
|
((Preference)findPreference(getString(R.string.pref_key_background_color))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_background_color))).getEntry() + ") "+getString(R.string.pref_summary_background_color));
|
||||||
((Preference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
|
((Preference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
|
||||||
|
|
||||||
((Preference)findPreference(getString(R.string.pref_key_arcore_relocalization_acc_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_arcore_relocalization_acc_thr))).getEntry() + ") "+getString(R.string.pref_summary_arcore_relocalization_acc_thr));
|
((Preference)findPreference(getString(R.string.pref_key_depth_bleeding_error))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_depth_bleeding_error))).getEntry() + ") "+getString(R.string.pref_summary_depth_bleeding_error));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_arcore_relocalization_acc_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_arcore_relocalization_acc_thr))).getEntry() + ") "+getString(R.string.pref_summary_arcore_relocalization_acc_thr));
|
||||||
((Preference)findPreference(getString(R.string.pref_key_update_rate))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_update_rate))).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
|
((Preference)findPreference(getString(R.string.pref_key_update_rate))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_update_rate))).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
|
||||||
((Preference)findPreference(getString(R.string.pref_key_max_speed))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_max_speed))).getEntry() + ") "+getString(R.string.pref_summary_max_speed));
|
((Preference)findPreference(getString(R.string.pref_key_max_speed))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_max_speed))).getEntry() + ") "+getString(R.string.pref_summary_max_speed));
|
||||||
((Preference)findPreference(getString(R.string.pref_key_time_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_time_thr))).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
((Preference)findPreference(getString(R.string.pref_key_time_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_time_thr))).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
||||||
@@ -285,7 +286,8 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref
|
|||||||
if(key.compareTo(getString(R.string.pref_key_background_color))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_background_color));
|
if(key.compareTo(getString(R.string.pref_key_background_color))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_background_color));
|
||||||
if(key.compareTo(getString(R.string.pref_key_rendering_texture_decimation))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
|
if(key.compareTo(getString(R.string.pref_key_rendering_texture_decimation))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
|
||||||
|
|
||||||
if(key.compareTo(getString(R.string.pref_key_arcore_relocalization_acc_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_arcore_relocalization_acc_thr));
|
if(key.compareTo(getString(R.string.pref_key_depth_bleeding_error))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_depth_bleeding_error));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_arcore_relocalization_acc_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_arcore_relocalization_acc_thr));
|
||||||
if(key.compareTo(getString(R.string.pref_key_update_rate))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
|
if(key.compareTo(getString(R.string.pref_key_update_rate))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
|
||||||
if(key.compareTo(getString(R.string.pref_key_max_speed))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_max_speed));
|
if(key.compareTo(getString(R.string.pref_key_max_speed))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_max_speed));
|
||||||
if(key.compareTo(getString(R.string.pref_key_time_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
if(key.compareTo(getString(R.string.pref_key_time_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
||||||
|
|||||||
@@ -8,49 +8,90 @@
|
|||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
4E0D83832621F52C00C879AC /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 4E0D83822621F52C00C879AC /* Settings.bundle */; };
|
4E0D83832621F52C00C879AC /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 4E0D83822621F52C00C879AC /* Settings.bundle */; };
|
||||||
|
4E10D89C2DE409870015926D /* librtabmap_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB0259D5BE500575D88 /* librtabmap_core.a */; };
|
||||||
|
4E10D89D2DE409870015926D /* librtabmap_utilite.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EAF259D5BE500575D88 /* librtabmap_utilite.a */; };
|
||||||
|
4E10D89E2DE409A60015926D /* libopencv_xfeatures2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED9259D5BFC00575D88 /* libopencv_xfeatures2d.a */; };
|
||||||
|
4E10D89F2DE409B20015926D /* libopencv_video.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB4259D5BFB00575D88 /* libopencv_video.a */; };
|
||||||
|
4E10D8A02DE409BB0015926D /* libopencv_tracking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECC259D5BFC00575D88 /* libopencv_tracking.a */; };
|
||||||
|
4E10D8A12DE409C00015926D /* libopencv_optflow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC3259D5BFC00575D88 /* libopencv_optflow.a */; };
|
||||||
|
4E10D8A22DE409C70015926D /* libopencv_imgproc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBE259D5BFC00575D88 /* libopencv_imgproc.a */; };
|
||||||
|
4E10D8A32DE409CA0015926D /* libopencv_features2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB8259D5BFB00575D88 /* libopencv_features2d.a */; };
|
||||||
|
4E10D8A42DE409CE0015926D /* libopencv_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED1259D5BFC00575D88 /* libopencv_core.a */; };
|
||||||
|
4E10D8A52DE409D10015926D /* libopencv_calib3d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED6259D5BFC00575D88 /* libopencv_calib3d.a */; };
|
||||||
|
4E10D8A62DE409D50015926D /* libopencv_aruco.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB5259D5BFB00575D88 /* libopencv_aruco.a */; };
|
||||||
|
4E10D8A72DE409F40015926D /* libopencv_flann.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBC259D5BFB00575D88 /* libopencv_flann.a */; };
|
||||||
|
4E10D8A82DE40A1B0015926D /* libopencv_ximgproc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EDC259D5BFC00575D88 /* libopencv_ximgproc.a */; };
|
||||||
|
4E10D8A92DE40A3A0015926D /* libopencv_photo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB6259D5BFB00575D88 /* libopencv_photo.a */; };
|
||||||
|
4E10D8AA2DE40A6C0015926D /* libopencv_objdetect.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBB259D5BFB00575D88 /* libopencv_objdetect.a */; };
|
||||||
|
4E10D8AB2DE40A8C0015926D /* libopencv_stitching.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBD259D5BFB00575D88 /* libopencv_stitching.a */; };
|
||||||
|
4E10D8AC2DE40AA20015926D /* libopencv_imgcodecs.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC4259D5BFC00575D88 /* libopencv_imgcodecs.a */; };
|
||||||
|
4E10D8AD2DE40E990015926D /* libg2o_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0D259D5C2200575D88 /* libg2o_core.a */; };
|
||||||
|
4E10D8AE2DE40E990015926D /* libg2o_solver_dense.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F07259D5C2100575D88 /* libg2o_solver_dense.a */; };
|
||||||
|
4E10D8AF2DE40E990015926D /* libg2o_solver_eigen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F12259D5C2200575D88 /* libg2o_solver_eigen.a */; };
|
||||||
|
4E10D8B02DE40E990015926D /* libg2o_solver_pcg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0B259D5C2200575D88 /* libg2o_solver_pcg.a */; };
|
||||||
|
4E10D8B12DE40E990015926D /* libg2o_solver_slam2d_linear.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F09259D5C2100575D88 /* libg2o_solver_slam2d_linear.a */; };
|
||||||
|
4E10D8B22DE40E990015926D /* libg2o_solver_structure_only.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F11259D5C2200575D88 /* libg2o_solver_structure_only.a */; };
|
||||||
|
4E10D8B32DE40E990015926D /* libg2o_stuff.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F14259D5C2200575D88 /* libg2o_stuff.a */; };
|
||||||
|
4E10D8B42DE40E990015926D /* libg2o_types_data.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0C259D5C2200575D88 /* libg2o_types_data.a */; };
|
||||||
|
4E10D8B52DE40E990015926D /* libg2o_types_icp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0F259D5C2200575D88 /* libg2o_types_icp.a */; };
|
||||||
|
4E10D8B62DE40E990015926D /* libg2o_types_sba.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F15259D5C2200575D88 /* libg2o_types_sba.a */; };
|
||||||
|
4E10D8B72DE40E990015926D /* libg2o_types_sclam2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1A259D5C2200575D88 /* libg2o_types_sclam2d.a */; };
|
||||||
|
4E10D8B82DE40E990015926D /* libg2o_types_sim3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1B259D5C2200575D88 /* libg2o_types_sim3.a */; };
|
||||||
|
4E10D8B92DE40E990015926D /* libg2o_types_slam2d_addons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F16259D5C2200575D88 /* libg2o_types_slam2d_addons.a */; };
|
||||||
|
4E10D8BA2DE40E990015926D /* libg2o_types_slam2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0A259D5C2100575D88 /* libg2o_types_slam2d.a */; };
|
||||||
|
4E10D8BB2DE40E990015926D /* libg2o_types_slam3d_addons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F17259D5C2200575D88 /* libg2o_types_slam3d_addons.a */; };
|
||||||
|
4E10D8BC2DE40E990015926D /* libg2o_types_slam3d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F18259D5C2200575D88 /* libg2o_types_slam3d.a */; };
|
||||||
|
4E10D8BD2DE40EC70015926D /* libpcl_common.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4D259D4DF100575D88 /* libpcl_common.a */; };
|
||||||
|
4E10D8BE2DE40EC70015926D /* libpcl_features.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B43259D4DF100575D88 /* libpcl_features.a */; };
|
||||||
|
4E10D8BF2DE40EC70015926D /* libpcl_filters.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B44259D4DF100575D88 /* libpcl_filters.a */; };
|
||||||
|
4E10D8C02DE40EC70015926D /* libpcl_io_ply.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4E259D4DF100575D88 /* libpcl_io_ply.a */; };
|
||||||
|
4E10D8C12DE40EC70015926D /* libpcl_io.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4C259D4DF100575D88 /* libpcl_io.a */; };
|
||||||
|
4E10D8C22DE40EC70015926D /* libpcl_kdtree.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B46259D4DF100575D88 /* libpcl_kdtree.a */; };
|
||||||
|
4E10D8C32DE40EC70015926D /* libpcl_keypoints.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B49259D4DF100575D88 /* libpcl_keypoints.a */; };
|
||||||
|
4E10D8C42DE40EC70015926D /* libpcl_ml.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4F259D4DF100575D88 /* libpcl_ml.a */; };
|
||||||
|
4E10D8C52DE40EC70015926D /* libpcl_octree.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4B259D4DF100575D88 /* libpcl_octree.a */; };
|
||||||
|
4E10D8C62DE40EC70015926D /* libpcl_registration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B42259D4DF100575D88 /* libpcl_registration.a */; };
|
||||||
|
4E10D8C72DE40EC70015926D /* libpcl_sample_consensus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B45259D4DF100575D88 /* libpcl_sample_consensus.a */; };
|
||||||
|
4E10D8C82DE40EC70015926D /* libpcl_search.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B47259D4DF100575D88 /* libpcl_search.a */; };
|
||||||
|
4E10D8C92DE40EC70015926D /* libpcl_segmentation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B50259D4DF100575D88 /* libpcl_segmentation.a */; };
|
||||||
|
4E10D8CA2DE40EC70015926D /* libpcl_stereo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B41259D4DF100575D88 /* libpcl_stereo.a */; };
|
||||||
|
4E10D8CB2DE40EC70015926D /* libpcl_surface.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B48259D4DF100575D88 /* libpcl_surface.a */; };
|
||||||
|
4E10D8CC2DE40EE30015926D /* libgtsam_unstable.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0E259D5C2200575D88 /* libgtsam_unstable.a */; };
|
||||||
|
4E10D8CD2DE40EE30015926D /* libgtsam.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1C259D5C2200575D88 /* libgtsam.a */; };
|
||||||
|
4E10D8CE2DE40EE30015926D /* libmetis-gtsam.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E10D8622DE408EE0015926D /* libmetis-gtsam.a */; };
|
||||||
|
4E10D8CF2DE40EF90015926D /* libboost_serialization.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B30259D4DE900575D88 /* libboost_serialization.a */; };
|
||||||
|
4E10D8D02DE40F060015926D /* libboost_timer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B34259D4DE900575D88 /* libboost_timer.a */; };
|
||||||
|
4E10D8D12DE40F190015926D /* liblas_c.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E10D8752DE408EF0015926D /* liblas_c.a */; };
|
||||||
|
4E10D8D22DE40F190015926D /* liblas.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFAA9422CAE4E960055DA51 /* liblas.a */; };
|
||||||
|
4E10D8D32DE40F190015926D /* liblaszip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4ED73AD02D7FECF3007899C2 /* liblaszip.a */; };
|
||||||
|
4E10D8D42DE40F2A0015926D /* libboost_thread.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B33259D4DE900575D88 /* libboost_thread.a */; };
|
||||||
|
4E10D8E12DE4101B0015926D /* liblibjpeg-turbo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E10D8D52DE40FBE0015926D /* liblibjpeg-turbo.a */; };
|
||||||
|
4E10D8E22DE4101B0015926D /* liblibpng.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E10D8D72DE40FCA0015926D /* liblibpng.a */; };
|
||||||
4E1E9CF72D618E69000CB881 /* quad_color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4E1E9CF62D618079000CB881 /* quad_color.cpp */; };
|
4E1E9CF72D618E69000CB881 /* quad_color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4E1E9CF62D618079000CB881 /* quad_color.cpp */; };
|
||||||
4E1E9CF82D618E69000CB881 /* text_drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4E1E9CF52D618079000CB881 /* text_drawable.cpp */; };
|
4E1E9CF82D618E69000CB881 /* text_drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4E1E9CF52D618079000CB881 /* text_drawable.cpp */; };
|
||||||
4E20B24E266AB94300316EE6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4E20B24D266AB94300316EE6 /* Images.xcassets */; };
|
4E20B24E266AB94300316EE6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4E20B24D266AB94300316EE6 /* Images.xcassets */; };
|
||||||
4E20B250266AB95600316EE6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4E20B24F266AB95600316EE6 /* Images.xcassets */; };
|
4E20B250266AB95600316EE6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4E20B24F266AB95600316EE6 /* Images.xcassets */; };
|
||||||
4E2C516725A63119005CEDBD /* DatabaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2C516525A63119005CEDBD /* DatabaseView.swift */; };
|
4E2C516725A63119005CEDBD /* DatabaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2C516525A63119005CEDBD /* DatabaseView.swift */; };
|
||||||
4E2C516825A63119005CEDBD /* VerticalScrollerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2C516625A63119005CEDBD /* VerticalScrollerView.swift */; };
|
4E2C516825A63119005CEDBD /* VerticalScrollerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2C516625A63119005CEDBD /* VerticalScrollerView.swift */; };
|
||||||
|
4E3525542DE4C6E500F39D8F /* libg2o_csparse_extension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F13259D5C2200575D88 /* libg2o_csparse_extension.a */; };
|
||||||
|
4E3525552DE4C6E500F39D8F /* libg2o_solver_csparse.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F10259D5C2200575D88 /* libg2o_solver_csparse.a */; };
|
||||||
|
4E3525572DE4C6E500F39D8F /* libg2o_solver_cholmod.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E3525562DE4C6E500F39D8F /* libg2o_solver_cholmod.a */; };
|
||||||
|
4E3525592DE4C6F600F39D8F /* libcholmod.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E3525582DE4C6F600F39D8F /* libcholmod.a */; };
|
||||||
|
4E35255E2DE4C71000F39D8F /* libcxsparse.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E35255A2DE4C71000F39D8F /* libcxsparse.a */; };
|
||||||
|
4E35255F2DE4C71000F39D8F /* libcolamd.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E35255B2DE4C71000F39D8F /* libcolamd.a */; };
|
||||||
|
4E3525602DE4C71000F39D8F /* libcamd.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E35255C2DE4C71000F39D8F /* libcamd.a */; };
|
||||||
|
4E3525612DE4C71000F39D8F /* libccolamd.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E35255D2DE4C71000F39D8F /* libccolamd.a */; };
|
||||||
|
4E3525642DE4C71C00F39D8F /* libsuitesparseconfig.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E3525622DE4C71C00F39D8F /* libsuitesparseconfig.a */; };
|
||||||
|
4E3525652DE4C71C00F39D8F /* libspqr.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E3525632DE4C71C00F39D8F /* libspqr.a */; };
|
||||||
|
4E3525672DE4C72D00F39D8F /* libamd.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E3525662DE4C72D00F39D8F /* libamd.a */; };
|
||||||
4E8B155426273A580037FC53 /* Zip in Frameworks */ = {isa = PBXBuildFile; productRef = 4E8B155326273A580037FC53 /* Zip */; };
|
4E8B155426273A580037FC53 /* Zip in Frameworks */ = {isa = PBXBuildFile; productRef = 4E8B155326273A580037FC53 /* Zip */; };
|
||||||
4EB1A66625A0D90B0043C7BF /* RTABMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB1A66525A0D90B0043C7BF /* RTABMap.swift */; };
|
4EB1A66625A0D90B0043C7BF /* RTABMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB1A66525A0D90B0043C7BF /* RTABMap.swift */; };
|
||||||
4ED73AD12D7FECF3007899C2 /* liblaszip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4ED73AD02D7FECF3007899C2 /* liblaszip.a */; };
|
|
||||||
4EE016B3259BE441008CCE65 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE016AF259BE441008CCE65 /* ViewController.swift */; };
|
4EE016B3259BE441008CCE65 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE016AF259BE441008CCE65 /* ViewController.swift */; };
|
||||||
4EE016B4259BE441008CCE65 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE016B0259BE441008CCE65 /* SceneDelegate.swift */; };
|
4EE016B4259BE441008CCE65 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE016B0259BE441008CCE65 /* SceneDelegate.swift */; };
|
||||||
4EE016B9259BE449008CCE65 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE016B8259BE449008CCE65 /* AppDelegate.swift */; };
|
4EE016B9259BE449008CCE65 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE016B8259BE449008CCE65 /* AppDelegate.swift */; };
|
||||||
4EE016C3259BE464008CCE65 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016BF259BE464008CCE65 /* Main.storyboard */; };
|
4EE016C3259BE464008CCE65 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016BF259BE464008CCE65 /* Main.storyboard */; };
|
||||||
4EE016C4259BE464008CCE65 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016C1259BE464008CCE65 /* LaunchScreen.storyboard */; };
|
4EE016C4259BE464008CCE65 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016C1259BE464008CCE65 /* LaunchScreen.storyboard */; };
|
||||||
4EE016C7259BE46F008CCE65 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016C6259BE46F008CCE65 /* Assets.xcassets */; };
|
4EE016C7259BE46F008CCE65 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016C6259BE46F008CCE65 /* Assets.xcassets */; };
|
||||||
4EFAA9432CAE4E960055DA51 /* liblas.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFAA9422CAE4E960055DA51 /* liblas.a */; };
|
|
||||||
4EFD0B36259D4DE900575D88 /* libboost_filesystem.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B2B259D4DE900575D88 /* libboost_filesystem.a */; };
|
|
||||||
4EFD0B37259D4DE900575D88 /* libboost_program_options.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B2C259D4DE900575D88 /* libboost_program_options.a */; };
|
|
||||||
4EFD0B38259D4DE900575D88 /* libboost_regex.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B2D259D4DE900575D88 /* libboost_regex.a */; };
|
|
||||||
4EFD0B39259D4DE900575D88 /* libboost_iostreams.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B2E259D4DE900575D88 /* libboost_iostreams.a */; };
|
|
||||||
4EFD0B3A259D4DE900575D88 /* libboost_date_time.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B2F259D4DE900575D88 /* libboost_date_time.a */; };
|
|
||||||
4EFD0B3B259D4DE900575D88 /* libboost_serialization.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B30259D4DE900575D88 /* libboost_serialization.a */; };
|
|
||||||
4EFD0B3C259D4DE900575D88 /* libboost_system.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B31259D4DE900575D88 /* libboost_system.a */; };
|
|
||||||
4EFD0B3D259D4DE900575D88 /* libboost_signals.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B32259D4DE900575D88 /* libboost_signals.a */; };
|
|
||||||
4EFD0B3E259D4DE900575D88 /* libboost_thread.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B33259D4DE900575D88 /* libboost_thread.a */; };
|
|
||||||
4EFD0B3F259D4DE900575D88 /* libboost_timer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B34259D4DE900575D88 /* libboost_timer.a */; };
|
|
||||||
4EFD0B40259D4DE900575D88 /* libboost_chrono.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B35259D4DE900575D88 /* libboost_chrono.a */; };
|
|
||||||
4EFD0B51259D4DF100575D88 /* libpcl_stereo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B41259D4DF100575D88 /* libpcl_stereo.a */; };
|
|
||||||
4EFD0B52259D4DF100575D88 /* libpcl_registration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B42259D4DF100575D88 /* libpcl_registration.a */; };
|
|
||||||
4EFD0B53259D4DF100575D88 /* libpcl_features.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B43259D4DF100575D88 /* libpcl_features.a */; };
|
|
||||||
4EFD0B54259D4DF100575D88 /* libpcl_filters.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B44259D4DF100575D88 /* libpcl_filters.a */; };
|
|
||||||
4EFD0B55259D4DF100575D88 /* libpcl_sample_consensus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B45259D4DF100575D88 /* libpcl_sample_consensus.a */; };
|
|
||||||
4EFD0B56259D4DF100575D88 /* libpcl_kdtree.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B46259D4DF100575D88 /* libpcl_kdtree.a */; };
|
|
||||||
4EFD0B57259D4DF100575D88 /* libpcl_search.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B47259D4DF100575D88 /* libpcl_search.a */; };
|
|
||||||
4EFD0B58259D4DF100575D88 /* libpcl_surface.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B48259D4DF100575D88 /* libpcl_surface.a */; };
|
|
||||||
4EFD0B59259D4DF100575D88 /* libpcl_keypoints.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B49259D4DF100575D88 /* libpcl_keypoints.a */; };
|
|
||||||
4EFD0B5A259D4DF100575D88 /* libpcl_recognition.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4A259D4DF100575D88 /* libpcl_recognition.a */; };
|
|
||||||
4EFD0B5B259D4DF100575D88 /* libpcl_octree.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4B259D4DF100575D88 /* libpcl_octree.a */; };
|
|
||||||
4EFD0B5C259D4DF100575D88 /* libpcl_io.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4C259D4DF100575D88 /* libpcl_io.a */; };
|
|
||||||
4EFD0B5D259D4DF100575D88 /* libpcl_common.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4D259D4DF100575D88 /* libpcl_common.a */; };
|
|
||||||
4EFD0B5E259D4DF100575D88 /* libpcl_io_ply.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4E259D4DF100575D88 /* libpcl_io_ply.a */; };
|
|
||||||
4EFD0B5F259D4DF100575D88 /* libpcl_ml.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4F259D4DF100575D88 /* libpcl_ml.a */; };
|
|
||||||
4EFD0B60259D4DF100575D88 /* libpcl_segmentation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B50259D4DF100575D88 /* libpcl_segmentation.a */; };
|
|
||||||
4EFD0B97259D501E00575D88 /* line.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B63259D501E00575D88 /* line.cpp */; };
|
4EFD0B97259D501E00575D88 /* line.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B63259D501E00575D88 /* line.cpp */; };
|
||||||
4EFD0B98259D501E00575D88 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B64259D501E00575D88 /* util.cpp */; };
|
4EFD0B98259D501E00575D88 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B64259D501E00575D88 /* util.cpp */; };
|
||||||
4EFD0B99259D501E00575D88 /* obj_loader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B65259D501E00575D88 /* obj_loader.cpp */; };
|
4EFD0B99259D501E00575D88 /* obj_loader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B65259D501E00575D88 /* obj_loader.cpp */; };
|
||||||
@@ -78,80 +119,8 @@
|
|||||||
4EFD0BBC259D509300575D88 /* point_cloud_drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0BBA259D509300575D88 /* point_cloud_drawable.cpp */; };
|
4EFD0BBC259D509300575D88 /* point_cloud_drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0BBA259D509300575D88 /* point_cloud_drawable.cpp */; };
|
||||||
4EFD0BC0259D50A800575D88 /* scene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0BBE259D50A800575D88 /* scene.cpp */; };
|
4EFD0BC0259D50A800575D88 /* scene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0BBE259D50A800575D88 /* scene.cpp */; };
|
||||||
4EFD0EAB259D581800575D88 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EAA259D581800575D88 /* OpenGLES.framework */; };
|
4EFD0EAB259D581800575D88 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EAA259D581800575D88 /* OpenGLES.framework */; };
|
||||||
4EFD0EB1259D5BE500575D88 /* librtabmap_utilite.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EAF259D5BE500575D88 /* librtabmap_utilite.a */; };
|
|
||||||
4EFD0EB2259D5BE500575D88 /* librtabmap_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB0259D5BE500575D88 /* librtabmap_core.a */; };
|
|
||||||
4EFD0EDD259D5BFC00575D88 /* libopencv_video.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB4259D5BFB00575D88 /* libopencv_video.a */; };
|
|
||||||
4EFD0EDE259D5BFC00575D88 /* libopencv_aruco.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB5259D5BFB00575D88 /* libopencv_aruco.a */; };
|
|
||||||
4EFD0EDF259D5BFC00575D88 /* libopencv_photo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB6259D5BFB00575D88 /* libopencv_photo.a */; };
|
|
||||||
4EFD0EE0259D5BFC00575D88 /* libopencv_line_descriptor.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB7259D5BFB00575D88 /* libopencv_line_descriptor.a */; };
|
|
||||||
4EFD0EE1259D5BFC00575D88 /* libopencv_features2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB8259D5BFB00575D88 /* libopencv_features2d.a */; };
|
|
||||||
4EFD0EE2259D5BFC00575D88 /* libopencv_bgsegm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB9259D5BFB00575D88 /* libopencv_bgsegm.a */; };
|
|
||||||
4EFD0EE3259D5BFC00575D88 /* libopencv_dnn_objdetect.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBA259D5BFB00575D88 /* libopencv_dnn_objdetect.a */; };
|
|
||||||
4EFD0EE4259D5BFC00575D88 /* libopencv_objdetect.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBB259D5BFB00575D88 /* libopencv_objdetect.a */; };
|
|
||||||
4EFD0EE5259D5BFC00575D88 /* libopencv_flann.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBC259D5BFB00575D88 /* libopencv_flann.a */; };
|
|
||||||
4EFD0EE6259D5BFC00575D88 /* libopencv_stitching.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBD259D5BFB00575D88 /* libopencv_stitching.a */; };
|
|
||||||
4EFD0EE7259D5BFC00575D88 /* libopencv_imgproc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBE259D5BFC00575D88 /* libopencv_imgproc.a */; };
|
|
||||||
4EFD0EE8259D5BFC00575D88 /* libopencv_ml.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBF259D5BFC00575D88 /* libopencv_ml.a */; };
|
|
||||||
4EFD0EE9259D5BFC00575D88 /* libopencv_rgbd.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC0259D5BFC00575D88 /* libopencv_rgbd.a */; };
|
|
||||||
4EFD0EEA259D5BFC00575D88 /* libopencv_xphoto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC1259D5BFC00575D88 /* libopencv_xphoto.a */; };
|
|
||||||
4EFD0EEB259D5BFC00575D88 /* libopencv_phase_unwrapping.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC2259D5BFC00575D88 /* libopencv_phase_unwrapping.a */; };
|
|
||||||
4EFD0EEC259D5BFC00575D88 /* libopencv_optflow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC3259D5BFC00575D88 /* libopencv_optflow.a */; };
|
|
||||||
4EFD0EED259D5BFC00575D88 /* libopencv_imgcodecs.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC4259D5BFC00575D88 /* libopencv_imgcodecs.a */; };
|
|
||||||
4EFD0EEE259D5BFC00575D88 /* libopencv_fuzzy.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC5259D5BFC00575D88 /* libopencv_fuzzy.a */; };
|
|
||||||
4EFD0EEF259D5BFC00575D88 /* libopencv_dpm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC6259D5BFC00575D88 /* libopencv_dpm.a */; };
|
|
||||||
4EFD0EF0259D5BFC00575D88 /* libopencv_plot.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC7259D5BFC00575D88 /* libopencv_plot.a */; };
|
|
||||||
4EFD0EF1259D5BFC00575D88 /* libopencv_dnn.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC8259D5BFC00575D88 /* libopencv_dnn.a */; };
|
|
||||||
4EFD0EF2259D5BFC00575D88 /* libopencv_saliency.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC9259D5BFC00575D88 /* libopencv_saliency.a */; };
|
|
||||||
4EFD0EF3259D5BFC00575D88 /* libopencv_videoio.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECA259D5BFC00575D88 /* libopencv_videoio.a */; };
|
|
||||||
4EFD0EF4259D5BFC00575D88 /* libopencv_hfs.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECB259D5BFC00575D88 /* libopencv_hfs.a */; };
|
|
||||||
4EFD0EF5259D5BFC00575D88 /* libopencv_tracking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECC259D5BFC00575D88 /* libopencv_tracking.a */; };
|
|
||||||
4EFD0EF6259D5BFC00575D88 /* libopencv_text.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECD259D5BFC00575D88 /* libopencv_text.a */; };
|
|
||||||
4EFD0EF7259D5BFC00575D88 /* libopencv_face.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECE259D5BFC00575D88 /* libopencv_face.a */; };
|
|
||||||
4EFD0EF8259D5BFC00575D88 /* libopencv_bioinspired.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECF259D5BFC00575D88 /* libopencv_bioinspired.a */; };
|
|
||||||
4EFD0EF9259D5BFC00575D88 /* libopencv_highgui.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED0259D5BFC00575D88 /* libopencv_highgui.a */; };
|
|
||||||
4EFD0EFA259D5BFC00575D88 /* libopencv_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED1259D5BFC00575D88 /* libopencv_core.a */; };
|
|
||||||
4EFD0EFB259D5BFC00575D88 /* libopencv_shape.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED2259D5BFC00575D88 /* libopencv_shape.a */; };
|
|
||||||
4EFD0EFC259D5BFC00575D88 /* libopencv_datasets.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED3259D5BFC00575D88 /* libopencv_datasets.a */; };
|
|
||||||
4EFD0EFD259D5BFC00575D88 /* libopencv_img_hash.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED4259D5BFC00575D88 /* libopencv_img_hash.a */; };
|
|
||||||
4EFD0EFE259D5BFC00575D88 /* libopencv_surface_matching.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED5259D5BFC00575D88 /* libopencv_surface_matching.a */; };
|
|
||||||
4EFD0EFF259D5BFC00575D88 /* libopencv_calib3d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED6259D5BFC00575D88 /* libopencv_calib3d.a */; };
|
|
||||||
4EFD0F00259D5BFC00575D88 /* libopencv_structured_light.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED7259D5BFC00575D88 /* libopencv_structured_light.a */; };
|
|
||||||
4EFD0F01259D5BFC00575D88 /* libopencv_reg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED8259D5BFC00575D88 /* libopencv_reg.a */; };
|
|
||||||
4EFD0F02259D5BFC00575D88 /* libopencv_xfeatures2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED9259D5BFC00575D88 /* libopencv_xfeatures2d.a */; };
|
|
||||||
4EFD0F03259D5BFC00575D88 /* libopencv_videostab.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EDA259D5BFC00575D88 /* libopencv_videostab.a */; };
|
|
||||||
4EFD0F04259D5BFC00575D88 /* libopencv_ccalib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EDB259D5BFC00575D88 /* libopencv_ccalib.a */; };
|
|
||||||
4EFD0F05259D5BFC00575D88 /* libopencv_ximgproc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EDC259D5BFC00575D88 /* libopencv_ximgproc.a */; };
|
|
||||||
4EFD0F1D259D5C2200575D88 /* libg2o_solver_dense.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F07259D5C2100575D88 /* libg2o_solver_dense.a */; };
|
|
||||||
4EFD0F1E259D5C2200575D88 /* libg2o_ext_csparse.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F08259D5C2100575D88 /* libg2o_ext_csparse.a */; };
|
|
||||||
4EFD0F1F259D5C2200575D88 /* libg2o_solver_slam2d_linear.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F09259D5C2100575D88 /* libg2o_solver_slam2d_linear.a */; };
|
|
||||||
4EFD0F20259D5C2200575D88 /* libg2o_types_slam2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0A259D5C2100575D88 /* libg2o_types_slam2d.a */; };
|
|
||||||
4EFD0F21259D5C2200575D88 /* libg2o_solver_pcg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0B259D5C2200575D88 /* libg2o_solver_pcg.a */; };
|
|
||||||
4EFD0F22259D5C2200575D88 /* libg2o_types_data.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0C259D5C2200575D88 /* libg2o_types_data.a */; };
|
|
||||||
4EFD0F23259D5C2200575D88 /* libg2o_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0D259D5C2200575D88 /* libg2o_core.a */; };
|
|
||||||
4EFD0F24259D5C2200575D88 /* libgtsam_unstable.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0E259D5C2200575D88 /* libgtsam_unstable.a */; };
|
|
||||||
4EFD0F25259D5C2200575D88 /* libg2o_types_icp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0F259D5C2200575D88 /* libg2o_types_icp.a */; };
|
|
||||||
4EFD0F26259D5C2200575D88 /* libg2o_solver_csparse.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F10259D5C2200575D88 /* libg2o_solver_csparse.a */; };
|
|
||||||
4EFD0F27259D5C2200575D88 /* libg2o_solver_structure_only.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F11259D5C2200575D88 /* libg2o_solver_structure_only.a */; };
|
|
||||||
4EFD0F28259D5C2200575D88 /* libg2o_solver_eigen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F12259D5C2200575D88 /* libg2o_solver_eigen.a */; };
|
|
||||||
4EFD0F29259D5C2200575D88 /* libg2o_csparse_extension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F13259D5C2200575D88 /* libg2o_csparse_extension.a */; };
|
|
||||||
4EFD0F2A259D5C2200575D88 /* libg2o_stuff.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F14259D5C2200575D88 /* libg2o_stuff.a */; };
|
|
||||||
4EFD0F2B259D5C2200575D88 /* libg2o_types_sba.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F15259D5C2200575D88 /* libg2o_types_sba.a */; };
|
|
||||||
4EFD0F2C259D5C2200575D88 /* libg2o_types_slam2d_addons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F16259D5C2200575D88 /* libg2o_types_slam2d_addons.a */; };
|
|
||||||
4EFD0F2D259D5C2200575D88 /* libg2o_types_slam3d_addons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F17259D5C2200575D88 /* libg2o_types_slam3d_addons.a */; };
|
|
||||||
4EFD0F2E259D5C2200575D88 /* libg2o_types_slam3d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F18259D5C2200575D88 /* libg2o_types_slam3d.a */; };
|
|
||||||
4EFD0F2F259D5C2200575D88 /* libmetis.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F19259D5C2200575D88 /* libmetis.a */; };
|
|
||||||
4EFD0F30259D5C2200575D88 /* libg2o_types_sclam2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1A259D5C2200575D88 /* libg2o_types_sclam2d.a */; };
|
|
||||||
4EFD0F31259D5C2200575D88 /* libg2o_types_sim3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1B259D5C2200575D88 /* libg2o_types_sim3.a */; };
|
|
||||||
4EFD0F32259D5C2200575D88 /* libgtsam.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1C259D5C2200575D88 /* libgtsam.a */; };
|
|
||||||
4EFD0F34259D5C2900575D88 /* libflann_cpp_s.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F33259D5C2900575D88 /* libflann_cpp_s.a */; };
|
|
||||||
4EFD0F36259D5C7300575D88 /* vtk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F35259D5C7300575D88 /* vtk.framework */; };
|
4EFD0F36259D5C7300575D88 /* vtk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F35259D5C7300575D88 /* vtk.framework */; };
|
||||||
4EFD0F3A259D5D1500575D88 /* CameraMobile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F38259D5D1500575D88 /* CameraMobile.cpp */; };
|
4EFD0F3A259D5D1500575D88 /* CameraMobile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F38259D5D1500575D88 /* CameraMobile.cpp */; };
|
||||||
4EFD0F3D259D5D5C00575D88 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F3C259D5D5C00575D88 /* libsqlite3.tbd */; };
|
|
||||||
4EFD0F50259D67D900575D88 /* liblibwebp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F4B259D67D900575D88 /* liblibwebp.a */; };
|
|
||||||
4EFD0F51259D67D900575D88 /* liblibpng.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F4C259D67D900575D88 /* liblibpng.a */; };
|
|
||||||
4EFD0F52259D67D900575D88 /* liblibjpeg-turbo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F4D259D67D900575D88 /* liblibjpeg-turbo.a */; };
|
|
||||||
4EFD0F53259D67D900575D88 /* libzlib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F4E259D67D900575D88 /* libzlib.a */; };
|
|
||||||
4EFD0F54259D67D900575D88 /* liblibprotobuf.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F4F259D67D900575D88 /* liblibprotobuf.a */; };
|
|
||||||
4EFD0F62259E341C00575D88 /* RTABMapApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F61259E341C00575D88 /* RTABMapApp.cpp */; };
|
4EFD0F62259E341C00575D88 /* RTABMapApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F61259E341C00575D88 /* RTABMapApp.cpp */; };
|
||||||
4EFD0F67259E38DE00575D88 /* NativeWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F66259E38DE00575D88 /* NativeWrapper.cpp */; };
|
4EFD0F67259E38DE00575D88 /* NativeWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F66259E38DE00575D88 /* NativeWrapper.cpp */; };
|
||||||
4EFD0F70259F847300575D88 /* background_renderer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F6E259F847300575D88 /* background_renderer.cc */; };
|
4EFD0F70259F847300575D88 /* background_renderer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F6E259F847300575D88 /* background_renderer.cc */; };
|
||||||
@@ -160,6 +129,42 @@
|
|||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
44D4681D2D538A4100B094BA /* RTABMapApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = RTABMapApp.entitlements; path = RTABMapApp/RTABMapApp.entitlements; sourceTree = "<group>"; };
|
44D4681D2D538A4100B094BA /* RTABMapApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = RTABMapApp.entitlements; path = RTABMapApp/RTABMapApp.entitlements; sourceTree = "<group>"; };
|
||||||
4E0D83822621F52C00C879AC /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
|
4E0D83822621F52C00C879AC /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
|
||||||
|
4E10D8602DE408EE0015926D /* libboost_stacktrace_noop.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_stacktrace_noop.a; path = RTABMapApp/Libraries/lib/libboost_stacktrace_noop.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8612DE408EE0015926D /* libboost_wserialization.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_wserialization.a; path = RTABMapApp/Libraries/lib/libboost_wserialization.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8622DE408EE0015926D /* libmetis-gtsam.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libmetis-gtsam.a"; path = "RTABMapApp/Libraries/lib/libmetis-gtsam.a"; sourceTree = "<group>"; };
|
||||||
|
4E10D8632DE408EE0015926D /* libopencv_wechat_qrcode.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_wechat_qrcode.a; path = RTABMapApp/Libraries/lib/libopencv_wechat_qrcode.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8642DE408EE0015926D /* libboost_container.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_container.a; path = RTABMapApp/Libraries/lib/libboost_container.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8652DE408EE0015926D /* libboost_graph.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_graph.a; path = RTABMapApp/Libraries/lib/libboost_graph.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8662DE408EE0015926D /* libboost_json.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_json.a; path = RTABMapApp/Libraries/lib/libboost_json.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8672DE408EE0015926D /* libboost_stacktrace_basic.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_stacktrace_basic.a; path = RTABMapApp/Libraries/lib/libboost_stacktrace_basic.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8682DE408EE0015926D /* libboost_atomic.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_atomic.a; path = RTABMapApp/Libraries/lib/libboost_atomic.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8692DE408EE0015926D /* libopencv_intensity_transform.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_intensity_transform.a; path = RTABMapApp/Libraries/lib/libopencv_intensity_transform.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86A2DE408EF0015926D /* libboost_locale.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_locale.a; path = RTABMapApp/Libraries/lib/libboost_locale.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86B2DE408EF0015926D /* liblz4.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblz4.a; path = RTABMapApp/Libraries/lib/liblz4.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86C2DE408EF0015926D /* libopencv_dnn_superres.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_dnn_superres.a; path = RTABMapApp/Libraries/lib/libopencv_dnn_superres.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86D2DE408EF0015926D /* libopencv_rapid.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_rapid.a; path = RTABMapApp/Libraries/lib/libopencv_rapid.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86E2DE408EF0015926D /* libopencv_quality.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_quality.a; path = RTABMapApp/Libraries/lib/libopencv_quality.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86F2DE408EF0015926D /* libboost_url.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_url.a; path = RTABMapApp/Libraries/lib/libboost_url.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8702DE408EF0015926D /* libboost_unit_test_framework.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_unit_test_framework.a; path = RTABMapApp/Libraries/lib/libboost_unit_test_framework.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8712DE408EF0015926D /* libboost_random.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_random.a; path = RTABMapApp/Libraries/lib/libboost_random.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8722DE408EF0015926D /* libboost_wave.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_wave.a; path = RTABMapApp/Libraries/lib/libboost_wave.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8732DE408EF0015926D /* libboost_charconv.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_charconv.a; path = RTABMapApp/Libraries/lib/libboost_charconv.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8742DE408EF0015926D /* libboost_type_erasure.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_type_erasure.a; path = RTABMapApp/Libraries/lib/libboost_type_erasure.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8752DE408EF0015926D /* liblas_c.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblas_c.a; path = RTABMapApp/Libraries/lib/liblas_c.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8762DE408EF0015926D /* libboost_contract.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_contract.a; path = RTABMapApp/Libraries/lib/libboost_contract.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8772DE408EF0015926D /* libopencv_gapi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_gapi.a; path = RTABMapApp/Libraries/lib/libopencv_gapi.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8782DE408EF0015926D /* libopencv_signal.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_signal.a; path = RTABMapApp/Libraries/lib/libopencv_signal.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8792DE408EF0015926D /* libboost_prg_exec_monitor.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_prg_exec_monitor.a; path = RTABMapApp/Libraries/lib/libboost_prg_exec_monitor.a; sourceTree = "<group>"; };
|
||||||
|
4E10D87A2DE408EF0015926D /* libboost_stacktrace_addr2line.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_stacktrace_addr2line.a; path = RTABMapApp/Libraries/lib/libboost_stacktrace_addr2line.a; sourceTree = "<group>"; };
|
||||||
|
4E10D87B2DE408EF0015926D /* libboost_nowide.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_nowide.a; path = RTABMapApp/Libraries/lib/libboost_nowide.a; sourceTree = "<group>"; };
|
||||||
|
4E10D87C2DE408EF0015926D /* libboost_test_exec_monitor.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_test_exec_monitor.a; path = RTABMapApp/Libraries/lib/libboost_test_exec_monitor.a; sourceTree = "<group>"; };
|
||||||
|
4E10D87D2DE408EF0015926D /* libopencv_mcc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_mcc.a; path = RTABMapApp/Libraries/lib/libopencv_mcc.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8D52DE40FBE0015926D /* liblibjpeg-turbo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "liblibjpeg-turbo.a"; path = "RTABMapApp/Libraries/lib/opencv4/3rdparty/liblibjpeg-turbo.a"; sourceTree = "<group>"; };
|
||||||
|
4E10D8D72DE40FCA0015926D /* liblibpng.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblibpng.a; path = RTABMapApp/Libraries/lib/opencv4/3rdparty/liblibpng.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8D92DE40FF60015926D /* libzlib.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libzlib.a; path = RTABMapApp/Libraries/lib/opencv4/3rdparty/libzlib.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8DA2DE40FF60015926D /* libIlmImf.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIlmImf.a; path = RTABMapApp/Libraries/lib/opencv4/3rdparty/libIlmImf.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8DB2DE40FF60015926D /* libade.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libade.a; path = RTABMapApp/Libraries/lib/opencv4/3rdparty/libade.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8DC2DE40FF60015926D /* liblibprotobuf.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblibprotobuf.a; path = RTABMapApp/Libraries/lib/opencv4/3rdparty/liblibprotobuf.a; sourceTree = "<group>"; };
|
||||||
4E1E9CF22D617D08000CB881 /* Measure.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Measure.h; path = ../android/jni/Measure.h; sourceTree = "<group>"; };
|
4E1E9CF22D617D08000CB881 /* Measure.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Measure.h; path = ../android/jni/Measure.h; sourceTree = "<group>"; };
|
||||||
4E1E9CF32D618079000CB881 /* quad_color.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = quad_color.h; path = ../android/jni/quad_color.h; sourceTree = "<group>"; };
|
4E1E9CF32D618079000CB881 /* quad_color.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = quad_color.h; path = ../android/jni/quad_color.h; sourceTree = "<group>"; };
|
||||||
4E1E9CF42D618079000CB881 /* text_drawable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = text_drawable.h; path = ../android/jni/text_drawable.h; sourceTree = "<group>"; };
|
4E1E9CF42D618079000CB881 /* text_drawable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = text_drawable.h; path = ../android/jni/text_drawable.h; sourceTree = "<group>"; };
|
||||||
@@ -170,6 +175,15 @@
|
|||||||
4E20B24F266AB95600316EE6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RTABMapApp/Images.xcassets; sourceTree = "<group>"; };
|
4E20B24F266AB95600316EE6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RTABMapApp/Images.xcassets; sourceTree = "<group>"; };
|
||||||
4E2C516525A63119005CEDBD /* DatabaseView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DatabaseView.swift; path = RTABMapApp/DatabaseView.swift; sourceTree = "<group>"; };
|
4E2C516525A63119005CEDBD /* DatabaseView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DatabaseView.swift; path = RTABMapApp/DatabaseView.swift; sourceTree = "<group>"; };
|
||||||
4E2C516625A63119005CEDBD /* VerticalScrollerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = VerticalScrollerView.swift; path = RTABMapApp/VerticalScrollerView.swift; sourceTree = "<group>"; };
|
4E2C516625A63119005CEDBD /* VerticalScrollerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = VerticalScrollerView.swift; path = RTABMapApp/VerticalScrollerView.swift; sourceTree = "<group>"; };
|
||||||
|
4E3525562DE4C6E500F39D8F /* libg2o_solver_cholmod.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libg2o_solver_cholmod.a; path = RTABMapApp/Libraries/lib/libg2o_solver_cholmod.a; sourceTree = "<group>"; };
|
||||||
|
4E3525582DE4C6F600F39D8F /* libcholmod.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcholmod.a; path = RTABMapApp/Libraries/lib/libcholmod.a; sourceTree = "<group>"; };
|
||||||
|
4E35255A2DE4C71000F39D8F /* libcxsparse.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcxsparse.a; path = RTABMapApp/Libraries/lib/libcxsparse.a; sourceTree = "<group>"; };
|
||||||
|
4E35255B2DE4C71000F39D8F /* libcolamd.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcolamd.a; path = RTABMapApp/Libraries/lib/libcolamd.a; sourceTree = "<group>"; };
|
||||||
|
4E35255C2DE4C71000F39D8F /* libcamd.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcamd.a; path = RTABMapApp/Libraries/lib/libcamd.a; sourceTree = "<group>"; };
|
||||||
|
4E35255D2DE4C71000F39D8F /* libccolamd.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libccolamd.a; path = RTABMapApp/Libraries/lib/libccolamd.a; sourceTree = "<group>"; };
|
||||||
|
4E3525622DE4C71C00F39D8F /* libsuitesparseconfig.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsuitesparseconfig.a; path = RTABMapApp/Libraries/lib/libsuitesparseconfig.a; sourceTree = "<group>"; };
|
||||||
|
4E3525632DE4C71C00F39D8F /* libspqr.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libspqr.a; path = RTABMapApp/Libraries/lib/libspqr.a; sourceTree = "<group>"; };
|
||||||
|
4E3525662DE4C72D00F39D8F /* libamd.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libamd.a; path = RTABMapApp/Libraries/lib/libamd.a; sourceTree = "<group>"; };
|
||||||
4E401BE825CC92C100240A56 /* ProgressionStatus.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ProgressionStatus.h; path = ../android/jni/ProgressionStatus.h; sourceTree = "<group>"; };
|
4E401BE825CC92C100240A56 /* ProgressionStatus.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ProgressionStatus.h; path = ../android/jni/ProgressionStatus.h; sourceTree = "<group>"; };
|
||||||
4EB1A66525A0D90B0043C7BF /* RTABMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RTABMap.swift; path = RTABMapApp/RTABMap.swift; sourceTree = "<group>"; };
|
4EB1A66525A0D90B0043C7BF /* RTABMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RTABMap.swift; path = RTABMapApp/RTABMap.swift; sourceTree = "<group>"; };
|
||||||
4ED73AD02D7FECF3007899C2 /* liblaszip.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblaszip.a; path = RTABMapApp/Libraries/lib/liblaszip.a; sourceTree = "<group>"; };
|
4ED73AD02D7FECF3007899C2 /* liblaszip.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblaszip.a; path = RTABMapApp/Libraries/lib/liblaszip.a; sourceTree = "<group>"; };
|
||||||
@@ -356,110 +370,79 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
4EFAA9432CAE4E960055DA51 /* liblas.a in Frameworks */,
|
|
||||||
4ED73AD12D7FECF3007899C2 /* liblaszip.a in Frameworks */,
|
|
||||||
4EFD0F50259D67D900575D88 /* liblibwebp.a in Frameworks */,
|
|
||||||
4EFD0F51259D67D900575D88 /* liblibpng.a in Frameworks */,
|
|
||||||
4EFD0F52259D67D900575D88 /* liblibjpeg-turbo.a in Frameworks */,
|
|
||||||
4EFD0F53259D67D900575D88 /* libzlib.a in Frameworks */,
|
|
||||||
4EFD0F54259D67D900575D88 /* liblibprotobuf.a in Frameworks */,
|
|
||||||
4EFD0F3D259D5D5C00575D88 /* libsqlite3.tbd in Frameworks */,
|
|
||||||
4EFD0F36259D5C7300575D88 /* vtk.framework in Frameworks */,
|
|
||||||
4EFD0F34259D5C2900575D88 /* libflann_cpp_s.a in Frameworks */,
|
|
||||||
4EFD0F1D259D5C2200575D88 /* libg2o_solver_dense.a in Frameworks */,
|
|
||||||
4EFD0F1E259D5C2200575D88 /* libg2o_ext_csparse.a in Frameworks */,
|
|
||||||
4EFD0F1F259D5C2200575D88 /* libg2o_solver_slam2d_linear.a in Frameworks */,
|
|
||||||
4EFD0F20259D5C2200575D88 /* libg2o_types_slam2d.a in Frameworks */,
|
|
||||||
4EFD0F21259D5C2200575D88 /* libg2o_solver_pcg.a in Frameworks */,
|
|
||||||
4EFD0F22259D5C2200575D88 /* libg2o_types_data.a in Frameworks */,
|
|
||||||
4EFD0F23259D5C2200575D88 /* libg2o_core.a in Frameworks */,
|
|
||||||
4EFD0F24259D5C2200575D88 /* libgtsam_unstable.a in Frameworks */,
|
|
||||||
4EFD0F25259D5C2200575D88 /* libg2o_types_icp.a in Frameworks */,
|
|
||||||
4EFD0F26259D5C2200575D88 /* libg2o_solver_csparse.a in Frameworks */,
|
|
||||||
4EFD0F27259D5C2200575D88 /* libg2o_solver_structure_only.a in Frameworks */,
|
|
||||||
4EFD0F28259D5C2200575D88 /* libg2o_solver_eigen.a in Frameworks */,
|
|
||||||
4EFD0F29259D5C2200575D88 /* libg2o_csparse_extension.a in Frameworks */,
|
|
||||||
4EFD0F2A259D5C2200575D88 /* libg2o_stuff.a in Frameworks */,
|
|
||||||
4EFD0F2B259D5C2200575D88 /* libg2o_types_sba.a in Frameworks */,
|
|
||||||
4EFD0F2C259D5C2200575D88 /* libg2o_types_slam2d_addons.a in Frameworks */,
|
|
||||||
4EFD0F2D259D5C2200575D88 /* libg2o_types_slam3d_addons.a in Frameworks */,
|
|
||||||
4EFD0F2E259D5C2200575D88 /* libg2o_types_slam3d.a in Frameworks */,
|
|
||||||
4EFD0F2F259D5C2200575D88 /* libmetis.a in Frameworks */,
|
|
||||||
4EFD0F30259D5C2200575D88 /* libg2o_types_sclam2d.a in Frameworks */,
|
|
||||||
4EFD0F31259D5C2200575D88 /* libg2o_types_sim3.a in Frameworks */,
|
|
||||||
4EFD0F32259D5C2200575D88 /* libgtsam.a in Frameworks */,
|
|
||||||
4E8B155426273A580037FC53 /* Zip in Frameworks */,
|
4E8B155426273A580037FC53 /* Zip in Frameworks */,
|
||||||
4EFD0EDD259D5BFC00575D88 /* libopencv_video.a in Frameworks */,
|
4EFD0F36259D5C7300575D88 /* vtk.framework in Frameworks */,
|
||||||
4EFD0EDE259D5BFC00575D88 /* libopencv_aruco.a in Frameworks */,
|
|
||||||
4EFD0EDF259D5BFC00575D88 /* libopencv_photo.a in Frameworks */,
|
|
||||||
4EFD0EE0259D5BFC00575D88 /* libopencv_line_descriptor.a in Frameworks */,
|
|
||||||
4EFD0EE1259D5BFC00575D88 /* libopencv_features2d.a in Frameworks */,
|
|
||||||
4EFD0EE2259D5BFC00575D88 /* libopencv_bgsegm.a in Frameworks */,
|
|
||||||
4EFD0EE3259D5BFC00575D88 /* libopencv_dnn_objdetect.a in Frameworks */,
|
|
||||||
4EFD0EE4259D5BFC00575D88 /* libopencv_objdetect.a in Frameworks */,
|
|
||||||
4EFD0EE5259D5BFC00575D88 /* libopencv_flann.a in Frameworks */,
|
|
||||||
4EFD0EE6259D5BFC00575D88 /* libopencv_stitching.a in Frameworks */,
|
|
||||||
4EFD0EE7259D5BFC00575D88 /* libopencv_imgproc.a in Frameworks */,
|
|
||||||
4EFD0EE8259D5BFC00575D88 /* libopencv_ml.a in Frameworks */,
|
|
||||||
4EFD0EE9259D5BFC00575D88 /* libopencv_rgbd.a in Frameworks */,
|
|
||||||
4EFD0EEA259D5BFC00575D88 /* libopencv_xphoto.a in Frameworks */,
|
|
||||||
4EFD0EEB259D5BFC00575D88 /* libopencv_phase_unwrapping.a in Frameworks */,
|
|
||||||
4EFD0EEC259D5BFC00575D88 /* libopencv_optflow.a in Frameworks */,
|
|
||||||
4EFD0EED259D5BFC00575D88 /* libopencv_imgcodecs.a in Frameworks */,
|
|
||||||
4EFD0EEE259D5BFC00575D88 /* libopencv_fuzzy.a in Frameworks */,
|
|
||||||
4EFD0EEF259D5BFC00575D88 /* libopencv_dpm.a in Frameworks */,
|
|
||||||
4EFD0EF0259D5BFC00575D88 /* libopencv_plot.a in Frameworks */,
|
|
||||||
4EFD0EF1259D5BFC00575D88 /* libopencv_dnn.a in Frameworks */,
|
|
||||||
4EFD0EF2259D5BFC00575D88 /* libopencv_saliency.a in Frameworks */,
|
|
||||||
4EFD0EF3259D5BFC00575D88 /* libopencv_videoio.a in Frameworks */,
|
|
||||||
4EFD0EF4259D5BFC00575D88 /* libopencv_hfs.a in Frameworks */,
|
|
||||||
4EFD0EF5259D5BFC00575D88 /* libopencv_tracking.a in Frameworks */,
|
|
||||||
4EFD0EF6259D5BFC00575D88 /* libopencv_text.a in Frameworks */,
|
|
||||||
4EFD0EF7259D5BFC00575D88 /* libopencv_face.a in Frameworks */,
|
|
||||||
4EFD0EF8259D5BFC00575D88 /* libopencv_bioinspired.a in Frameworks */,
|
|
||||||
4EFD0EF9259D5BFC00575D88 /* libopencv_highgui.a in Frameworks */,
|
|
||||||
4EFD0EFA259D5BFC00575D88 /* libopencv_core.a in Frameworks */,
|
|
||||||
4EFD0EFB259D5BFC00575D88 /* libopencv_shape.a in Frameworks */,
|
|
||||||
4EFD0EFC259D5BFC00575D88 /* libopencv_datasets.a in Frameworks */,
|
|
||||||
4EFD0EFD259D5BFC00575D88 /* libopencv_img_hash.a in Frameworks */,
|
|
||||||
4EFD0EFE259D5BFC00575D88 /* libopencv_surface_matching.a in Frameworks */,
|
|
||||||
4EFD0EFF259D5BFC00575D88 /* libopencv_calib3d.a in Frameworks */,
|
|
||||||
4EFD0F00259D5BFC00575D88 /* libopencv_structured_light.a in Frameworks */,
|
|
||||||
4EFD0F01259D5BFC00575D88 /* libopencv_reg.a in Frameworks */,
|
|
||||||
4EFD0F02259D5BFC00575D88 /* libopencv_xfeatures2d.a in Frameworks */,
|
|
||||||
4EFD0F03259D5BFC00575D88 /* libopencv_videostab.a in Frameworks */,
|
|
||||||
4EFD0F04259D5BFC00575D88 /* libopencv_ccalib.a in Frameworks */,
|
|
||||||
4EFD0F05259D5BFC00575D88 /* libopencv_ximgproc.a in Frameworks */,
|
|
||||||
4EFD0EB1259D5BE500575D88 /* librtabmap_utilite.a in Frameworks */,
|
|
||||||
4EFD0EB2259D5BE500575D88 /* librtabmap_core.a in Frameworks */,
|
|
||||||
4EFD0EAB259D581800575D88 /* OpenGLES.framework in Frameworks */,
|
4EFD0EAB259D581800575D88 /* OpenGLES.framework in Frameworks */,
|
||||||
4EFD0B36259D4DE900575D88 /* libboost_filesystem.a in Frameworks */,
|
4E10D89C2DE409870015926D /* librtabmap_core.a in Frameworks */,
|
||||||
4EFD0B37259D4DE900575D88 /* libboost_program_options.a in Frameworks */,
|
4E10D89D2DE409870015926D /* librtabmap_utilite.a in Frameworks */,
|
||||||
4EFD0B38259D4DE900575D88 /* libboost_regex.a in Frameworks */,
|
4E10D89E2DE409A60015926D /* libopencv_xfeatures2d.a in Frameworks */,
|
||||||
4EFD0B39259D4DE900575D88 /* libboost_iostreams.a in Frameworks */,
|
4E10D89F2DE409B20015926D /* libopencv_video.a in Frameworks */,
|
||||||
4EFD0B3A259D4DE900575D88 /* libboost_date_time.a in Frameworks */,
|
4E10D8A02DE409BB0015926D /* libopencv_tracking.a in Frameworks */,
|
||||||
4EFD0B3B259D4DE900575D88 /* libboost_serialization.a in Frameworks */,
|
4E10D8A12DE409C00015926D /* libopencv_optflow.a in Frameworks */,
|
||||||
4EFD0B3C259D4DE900575D88 /* libboost_system.a in Frameworks */,
|
4E10D8A22DE409C70015926D /* libopencv_imgproc.a in Frameworks */,
|
||||||
4EFD0B3D259D4DE900575D88 /* libboost_signals.a in Frameworks */,
|
4E10D8A32DE409CA0015926D /* libopencv_features2d.a in Frameworks */,
|
||||||
4EFD0B3E259D4DE900575D88 /* libboost_thread.a in Frameworks */,
|
4E10D8A42DE409CE0015926D /* libopencv_core.a in Frameworks */,
|
||||||
4EFD0B3F259D4DE900575D88 /* libboost_timer.a in Frameworks */,
|
4E10D8A52DE409D10015926D /* libopencv_calib3d.a in Frameworks */,
|
||||||
4EFD0B40259D4DE900575D88 /* libboost_chrono.a in Frameworks */,
|
4E10D8A62DE409D50015926D /* libopencv_aruco.a in Frameworks */,
|
||||||
4EFD0B51259D4DF100575D88 /* libpcl_stereo.a in Frameworks */,
|
4E10D8A72DE409F40015926D /* libopencv_flann.a in Frameworks */,
|
||||||
4EFD0B52259D4DF100575D88 /* libpcl_registration.a in Frameworks */,
|
4E10D8A82DE40A1B0015926D /* libopencv_ximgproc.a in Frameworks */,
|
||||||
4EFD0B53259D4DF100575D88 /* libpcl_features.a in Frameworks */,
|
4E10D8A92DE40A3A0015926D /* libopencv_photo.a in Frameworks */,
|
||||||
4EFD0B54259D4DF100575D88 /* libpcl_filters.a in Frameworks */,
|
4E10D8AA2DE40A6C0015926D /* libopencv_objdetect.a in Frameworks */,
|
||||||
4EFD0B55259D4DF100575D88 /* libpcl_sample_consensus.a in Frameworks */,
|
4E10D8AB2DE40A8C0015926D /* libopencv_stitching.a in Frameworks */,
|
||||||
4EFD0B56259D4DF100575D88 /* libpcl_kdtree.a in Frameworks */,
|
4E10D8AC2DE40AA20015926D /* libopencv_imgcodecs.a in Frameworks */,
|
||||||
4EFD0B57259D4DF100575D88 /* libpcl_search.a in Frameworks */,
|
4E3525672DE4C72D00F39D8F /* libamd.a in Frameworks */,
|
||||||
4EFD0B58259D4DF100575D88 /* libpcl_surface.a in Frameworks */,
|
4E3525642DE4C71C00F39D8F /* libsuitesparseconfig.a in Frameworks */,
|
||||||
4EFD0B59259D4DF100575D88 /* libpcl_keypoints.a in Frameworks */,
|
4E3525652DE4C71C00F39D8F /* libspqr.a in Frameworks */,
|
||||||
4EFD0B5A259D4DF100575D88 /* libpcl_recognition.a in Frameworks */,
|
4E35255E2DE4C71000F39D8F /* libcxsparse.a in Frameworks */,
|
||||||
4EFD0B5B259D4DF100575D88 /* libpcl_octree.a in Frameworks */,
|
4E35255F2DE4C71000F39D8F /* libcolamd.a in Frameworks */,
|
||||||
4EFD0B5C259D4DF100575D88 /* libpcl_io.a in Frameworks */,
|
4E3525602DE4C71000F39D8F /* libcamd.a in Frameworks */,
|
||||||
4EFD0B5D259D4DF100575D88 /* libpcl_common.a in Frameworks */,
|
4E3525612DE4C71000F39D8F /* libccolamd.a in Frameworks */,
|
||||||
4EFD0B5E259D4DF100575D88 /* libpcl_io_ply.a in Frameworks */,
|
4E3525592DE4C6F600F39D8F /* libcholmod.a in Frameworks */,
|
||||||
4EFD0B5F259D4DF100575D88 /* libpcl_ml.a in Frameworks */,
|
4E10D8AD2DE40E990015926D /* libg2o_core.a in Frameworks */,
|
||||||
4EFD0B60259D4DF100575D88 /* libpcl_segmentation.a in Frameworks */,
|
4E3525572DE4C6E500F39D8F /* libg2o_solver_cholmod.a in Frameworks */,
|
||||||
|
4E3525542DE4C6E500F39D8F /* libg2o_csparse_extension.a in Frameworks */,
|
||||||
|
4E3525552DE4C6E500F39D8F /* libg2o_solver_csparse.a in Frameworks */,
|
||||||
|
4E10D8AE2DE40E990015926D /* libg2o_solver_dense.a in Frameworks */,
|
||||||
|
4E10D8AF2DE40E990015926D /* libg2o_solver_eigen.a in Frameworks */,
|
||||||
|
4E10D8B02DE40E990015926D /* libg2o_solver_pcg.a in Frameworks */,
|
||||||
|
4E10D8B12DE40E990015926D /* libg2o_solver_slam2d_linear.a in Frameworks */,
|
||||||
|
4E10D8B22DE40E990015926D /* libg2o_solver_structure_only.a in Frameworks */,
|
||||||
|
4E10D8B32DE40E990015926D /* libg2o_stuff.a in Frameworks */,
|
||||||
|
4E10D8B42DE40E990015926D /* libg2o_types_data.a in Frameworks */,
|
||||||
|
4E10D8B52DE40E990015926D /* libg2o_types_icp.a in Frameworks */,
|
||||||
|
4E10D8B62DE40E990015926D /* libg2o_types_sba.a in Frameworks */,
|
||||||
|
4E10D8B72DE40E990015926D /* libg2o_types_sclam2d.a in Frameworks */,
|
||||||
|
4E10D8B82DE40E990015926D /* libg2o_types_sim3.a in Frameworks */,
|
||||||
|
4E10D8B92DE40E990015926D /* libg2o_types_slam2d_addons.a in Frameworks */,
|
||||||
|
4E10D8BA2DE40E990015926D /* libg2o_types_slam2d.a in Frameworks */,
|
||||||
|
4E10D8BB2DE40E990015926D /* libg2o_types_slam3d_addons.a in Frameworks */,
|
||||||
|
4E10D8BC2DE40E990015926D /* libg2o_types_slam3d.a in Frameworks */,
|
||||||
|
4E10D8BD2DE40EC70015926D /* libpcl_common.a in Frameworks */,
|
||||||
|
4E10D8BE2DE40EC70015926D /* libpcl_features.a in Frameworks */,
|
||||||
|
4E10D8BF2DE40EC70015926D /* libpcl_filters.a in Frameworks */,
|
||||||
|
4E10D8C02DE40EC70015926D /* libpcl_io_ply.a in Frameworks */,
|
||||||
|
4E10D8C12DE40EC70015926D /* libpcl_io.a in Frameworks */,
|
||||||
|
4E10D8C22DE40EC70015926D /* libpcl_kdtree.a in Frameworks */,
|
||||||
|
4E10D8C32DE40EC70015926D /* libpcl_keypoints.a in Frameworks */,
|
||||||
|
4E10D8C42DE40EC70015926D /* libpcl_ml.a in Frameworks */,
|
||||||
|
4E10D8C52DE40EC70015926D /* libpcl_octree.a in Frameworks */,
|
||||||
|
4E10D8C62DE40EC70015926D /* libpcl_registration.a in Frameworks */,
|
||||||
|
4E10D8C72DE40EC70015926D /* libpcl_sample_consensus.a in Frameworks */,
|
||||||
|
4E10D8C82DE40EC70015926D /* libpcl_search.a in Frameworks */,
|
||||||
|
4E10D8C92DE40EC70015926D /* libpcl_segmentation.a in Frameworks */,
|
||||||
|
4E10D8CA2DE40EC70015926D /* libpcl_stereo.a in Frameworks */,
|
||||||
|
4E10D8CB2DE40EC70015926D /* libpcl_surface.a in Frameworks */,
|
||||||
|
4E10D8CC2DE40EE30015926D /* libgtsam_unstable.a in Frameworks */,
|
||||||
|
4E10D8CD2DE40EE30015926D /* libgtsam.a in Frameworks */,
|
||||||
|
4E10D8CE2DE40EE30015926D /* libmetis-gtsam.a in Frameworks */,
|
||||||
|
4E10D8CF2DE40EF90015926D /* libboost_serialization.a in Frameworks */,
|
||||||
|
4E10D8D02DE40F060015926D /* libboost_timer.a in Frameworks */,
|
||||||
|
4E10D8D42DE40F2A0015926D /* libboost_thread.a in Frameworks */,
|
||||||
|
4E10D8D12DE40F190015926D /* liblas_c.a in Frameworks */,
|
||||||
|
4E10D8D22DE40F190015926D /* liblas.a in Frameworks */,
|
||||||
|
4E10D8D32DE40F190015926D /* liblaszip.a in Frameworks */,
|
||||||
|
4E10D8E12DE4101B0015926D /* liblibjpeg-turbo.a in Frameworks */,
|
||||||
|
4E10D8E22DE4101B0015926D /* liblibpng.a in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -509,6 +492,51 @@
|
|||||||
4EFD0B2A259D4DE900575D88 /* Frameworks */ = {
|
4EFD0B2A259D4DE900575D88 /* Frameworks */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
4E3525662DE4C72D00F39D8F /* libamd.a */,
|
||||||
|
4E3525632DE4C71C00F39D8F /* libspqr.a */,
|
||||||
|
4E3525622DE4C71C00F39D8F /* libsuitesparseconfig.a */,
|
||||||
|
4E35255C2DE4C71000F39D8F /* libcamd.a */,
|
||||||
|
4E35255D2DE4C71000F39D8F /* libccolamd.a */,
|
||||||
|
4E35255B2DE4C71000F39D8F /* libcolamd.a */,
|
||||||
|
4E35255A2DE4C71000F39D8F /* libcxsparse.a */,
|
||||||
|
4E3525582DE4C6F600F39D8F /* libcholmod.a */,
|
||||||
|
4E3525562DE4C6E500F39D8F /* libg2o_solver_cholmod.a */,
|
||||||
|
4E10D8DB2DE40FF60015926D /* libade.a */,
|
||||||
|
4E10D8DA2DE40FF60015926D /* libIlmImf.a */,
|
||||||
|
4E10D8DC2DE40FF60015926D /* liblibprotobuf.a */,
|
||||||
|
4E10D8D92DE40FF60015926D /* libzlib.a */,
|
||||||
|
4E10D8D72DE40FCA0015926D /* liblibpng.a */,
|
||||||
|
4E10D8D52DE40FBE0015926D /* liblibjpeg-turbo.a */,
|
||||||
|
4E10D8682DE408EE0015926D /* libboost_atomic.a */,
|
||||||
|
4E10D8732DE408EF0015926D /* libboost_charconv.a */,
|
||||||
|
4E10D8642DE408EE0015926D /* libboost_container.a */,
|
||||||
|
4E10D8762DE408EF0015926D /* libboost_contract.a */,
|
||||||
|
4E10D8652DE408EE0015926D /* libboost_graph.a */,
|
||||||
|
4E10D8662DE408EE0015926D /* libboost_json.a */,
|
||||||
|
4E10D86A2DE408EF0015926D /* libboost_locale.a */,
|
||||||
|
4E10D87B2DE408EF0015926D /* libboost_nowide.a */,
|
||||||
|
4E10D8792DE408EF0015926D /* libboost_prg_exec_monitor.a */,
|
||||||
|
4E10D8712DE408EF0015926D /* libboost_random.a */,
|
||||||
|
4E10D87A2DE408EF0015926D /* libboost_stacktrace_addr2line.a */,
|
||||||
|
4E10D8672DE408EE0015926D /* libboost_stacktrace_basic.a */,
|
||||||
|
4E10D8602DE408EE0015926D /* libboost_stacktrace_noop.a */,
|
||||||
|
4E10D87C2DE408EF0015926D /* libboost_test_exec_monitor.a */,
|
||||||
|
4E10D8742DE408EF0015926D /* libboost_type_erasure.a */,
|
||||||
|
4E10D8702DE408EF0015926D /* libboost_unit_test_framework.a */,
|
||||||
|
4E10D86F2DE408EF0015926D /* libboost_url.a */,
|
||||||
|
4E10D8722DE408EF0015926D /* libboost_wave.a */,
|
||||||
|
4E10D8612DE408EE0015926D /* libboost_wserialization.a */,
|
||||||
|
4E10D8752DE408EF0015926D /* liblas_c.a */,
|
||||||
|
4E10D86B2DE408EF0015926D /* liblz4.a */,
|
||||||
|
4E10D8622DE408EE0015926D /* libmetis-gtsam.a */,
|
||||||
|
4E10D86C2DE408EF0015926D /* libopencv_dnn_superres.a */,
|
||||||
|
4E10D8772DE408EF0015926D /* libopencv_gapi.a */,
|
||||||
|
4E10D8692DE408EE0015926D /* libopencv_intensity_transform.a */,
|
||||||
|
4E10D87D2DE408EF0015926D /* libopencv_mcc.a */,
|
||||||
|
4E10D86E2DE408EF0015926D /* libopencv_quality.a */,
|
||||||
|
4E10D86D2DE408EF0015926D /* libopencv_rapid.a */,
|
||||||
|
4E10D8782DE408EF0015926D /* libopencv_signal.a */,
|
||||||
|
4E10D8632DE408EE0015926D /* libopencv_wechat_qrcode.a */,
|
||||||
4ED73AD02D7FECF3007899C2 /* liblaszip.a */,
|
4ED73AD02D7FECF3007899C2 /* liblaszip.a */,
|
||||||
4EFAA9422CAE4E960055DA51 /* liblas.a */,
|
4EFAA9422CAE4E960055DA51 /* liblas.a */,
|
||||||
4EFD0F4D259D67D900575D88 /* liblibjpeg-turbo.a */,
|
4EFD0F4D259D67D900575D88 /* liblibjpeg-turbo.a */,
|
||||||
@@ -889,7 +917,7 @@
|
|||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
@@ -920,7 +948,7 @@
|
|||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
ENABLE_TESTABILITY = YES;
|
ENABLE_TESTABILITY = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
@@ -950,7 +978,7 @@
|
|||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
@@ -981,7 +1009,7 @@
|
|||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = "";
|
GCC_PREPROCESSOR_DEFINITIONS = "";
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
@@ -1035,8 +1063,9 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib",
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib",
|
||||||
"$(PROJECT_DIR)/RTABMapApp/Libraries/share/OpenCV/3rdparty/lib",
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/share/OpenCV/3rdparty/lib",
|
||||||
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib/opencv4/3rdparty",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 0.21.11;
|
MARKETING_VERSION = 0.23.7;
|
||||||
OTHER_CFLAGS = "";
|
OTHER_CFLAGS = "";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.introlab.rtabmap;
|
PRODUCT_BUNDLE_IDENTIFIER = com.introlab.rtabmap;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
@@ -1048,11 +1077,12 @@
|
|||||||
SYSTEM_HEADER_SEARCH_PATHS = (
|
SYSTEM_HEADER_SEARCH_PATHS = (
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/eigen3\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/eigen3\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/pcl-1.11\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/pcl-1.15\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/rtabmap-0.21\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/rtabmap-0.23\"",
|
||||||
"\"$(SRCROOT)/../android/jni/tango-gl/include\"",
|
"\"$(SRCROOT)/../android/jni/tango-gl/include\"",
|
||||||
"\"$(SRCROOT)/../android/jni/third-party/include\"",
|
"\"$(SRCROOT)/../android/jni/third-party/include\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/lib/vtk.framework/Headers\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/lib/vtk.framework/Headers\"",
|
||||||
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/opencv4\"",
|
||||||
);
|
);
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
VALIDATE_WORKSPACE = NO;
|
VALIDATE_WORKSPACE = NO;
|
||||||
@@ -1093,8 +1123,9 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib",
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib",
|
||||||
"$(PROJECT_DIR)/RTABMapApp/Libraries/share/OpenCV/3rdparty/lib",
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/share/OpenCV/3rdparty/lib",
|
||||||
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib/opencv4/3rdparty",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 0.21.11;
|
MARKETING_VERSION = 0.23.7;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
OTHER_CFLAGS = "";
|
OTHER_CFLAGS = "";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.introlab.rtabmap;
|
PRODUCT_BUNDLE_IDENTIFIER = com.introlab.rtabmap;
|
||||||
@@ -1107,11 +1138,12 @@
|
|||||||
SYSTEM_HEADER_SEARCH_PATHS = (
|
SYSTEM_HEADER_SEARCH_PATHS = (
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/eigen3\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/eigen3\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/pcl-1.11\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/pcl-1.15\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/rtabmap-0.21\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/rtabmap-0.23\"",
|
||||||
"\"$(SRCROOT)/../android/jni/tango-gl/include\"",
|
"\"$(SRCROOT)/../android/jni/tango-gl/include\"",
|
||||||
"\"$(SRCROOT)/../android/jni/third-party/include\"",
|
"\"$(SRCROOT)/../android/jni/third-party/include\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/lib/vtk.framework/Headers\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/lib/vtk.framework/Headers\"",
|
||||||
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/opencv4\"",
|
||||||
);
|
);
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
VALIDATE_WORKSPACE = NO;
|
VALIDATE_WORKSPACE = NO;
|
||||||
|
|||||||
@@ -505,6 +505,13 @@ void setSmoothingNative(const void *object, bool enabled)
|
|||||||
else
|
else
|
||||||
UERROR("object is null!");
|
UERROR("object is null!");
|
||||||
}
|
}
|
||||||
|
void setDepthBleedingErrorNative(const void *object, float value)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
native(object)->setDepthBleedingError(value);
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
void setAppendModeNative(const void *object, bool enabled)
|
void setAppendModeNative(const void *object, bool enabled)
|
||||||
{
|
{
|
||||||
if(object)
|
if(object)
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ void setGraphVisibleNative(const void *object, bool visible);
|
|||||||
void setGridVisibleNative(const void *object, bool visible);
|
void setGridVisibleNative(const void *object, bool visible);
|
||||||
void setFullResolutionNative(const void *object, bool enabled);
|
void setFullResolutionNative(const void *object, bool enabled);
|
||||||
void setSmoothingNative(const void *object, bool enabled);
|
void setSmoothingNative(const void *object, bool enabled);
|
||||||
|
void setDepthBleedingErrorNative(const void *object, float value);
|
||||||
void setAppendModeNative(const void *object, bool enabled);
|
void setAppendModeNative(const void *object, bool enabled);
|
||||||
void setUpstreamRelocalizationAccThrNative(const void *object, float value);
|
void setUpstreamRelocalizationAccThrNative(const void *object, float value);
|
||||||
void setMaxCloudDepthNative(const void *object, float value);
|
void setMaxCloudDepthNative(const void *object, float value);
|
||||||
|
|||||||
@@ -453,6 +453,9 @@ class RTABMap {
|
|||||||
func setSmoothing(enabled: Bool) {
|
func setSmoothing(enabled: Bool) {
|
||||||
setSmoothingNative(native_rtabmap, enabled)
|
setSmoothingNative(native_rtabmap, enabled)
|
||||||
}
|
}
|
||||||
|
func setDepthBleedingError(value: Float) {
|
||||||
|
setDepthBleedingErrorNative(native_rtabmap, value)
|
||||||
|
}
|
||||||
func setAppendMode(enabled: Bool) {
|
func setAppendMode(enabled: Bool) {
|
||||||
setAppendModeNative(native_rtabmap, enabled)
|
setAppendModeNative(native_rtabmap, enabled)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,7 +162,6 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
func resetNoTouchTimer(_ showHud: Bool = false) {
|
func resetNoTouchTimer(_ showHud: Bool = false) {
|
||||||
if(showHud)
|
if(showHud)
|
||||||
{
|
{
|
||||||
print("Show HUD")
|
|
||||||
mMenuOpened = false
|
mMenuOpened = false
|
||||||
mHudVisible = true
|
mHudVisible = true
|
||||||
setNeedsStatusBarAppearanceUpdate()
|
setNeedsStatusBarAppearanceUpdate()
|
||||||
@@ -184,7 +183,6 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
}
|
}
|
||||||
else if(mState != .STATE_WELCOME && mState != .STATE_CAMERA && presentedViewController as? UIAlertController == nil && !mMenuOpened)
|
else if(mState != .STATE_WELCOME && mState != .STATE_CAMERA && presentedViewController as? UIAlertController == nil && !mMenuOpened)
|
||||||
{
|
{
|
||||||
print("Hide HUD")
|
|
||||||
self.mHudVisible = false
|
self.mHudVisible = false
|
||||||
self.setNeedsStatusBarAppearanceUpdate()
|
self.setNeedsStatusBarAppearanceUpdate()
|
||||||
self.updateState(state: self.mState)
|
self.updateState(state: self.mState)
|
||||||
@@ -840,13 +838,11 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
self.isPaused = true
|
self.isPaused = true
|
||||||
view?.enableSetNeedsDisplay = true
|
view?.enableSetNeedsDisplay = true
|
||||||
self.view.setNeedsDisplay()
|
self.view.setNeedsDisplay()
|
||||||
print("enableSetNeedsDisplay")
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
view?.enableSetNeedsDisplay = false
|
view?.enableSetNeedsDisplay = false
|
||||||
self.isPaused = false
|
self.isPaused = false
|
||||||
print("disableSetNeedsDisplay")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if !self.isPaused {
|
if !self.isPaused {
|
||||||
@@ -934,7 +930,6 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
])
|
])
|
||||||
|
|
||||||
// Measuring menu
|
// Measuring menu
|
||||||
print("measuringMode = \(measuringMode)")
|
|
||||||
let measuringMenu = UIMenu(title: "Measuring...", image: UIImage(systemName: "ruler"), children: [
|
let measuringMenu = UIMenu(title: "Measuring...", image: UIImage(systemName: "ruler"), children: [
|
||||||
UIAction(title: "Plane to Plane Mode", image: measuringMode == 0 ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), handler: { _ in
|
UIAction(title: "Plane to Plane Mode", image: measuringMode == 0 ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), handler: { _ in
|
||||||
self.measuringMode = 0
|
self.measuringMode = 0
|
||||||
@@ -1516,6 +1511,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
rtabmap!.setNodesFiltering(enabled: defaults.bool(forKey: "NodesFiltering"));
|
rtabmap!.setNodesFiltering(enabled: defaults.bool(forKey: "NodesFiltering"));
|
||||||
rtabmap!.setFullResolution(enabled: defaults.bool(forKey: "HDMode"));
|
rtabmap!.setFullResolution(enabled: defaults.bool(forKey: "HDMode"));
|
||||||
rtabmap!.setSmoothing(enabled: defaults.bool(forKey: "Smoothing"));
|
rtabmap!.setSmoothing(enabled: defaults.bool(forKey: "Smoothing"));
|
||||||
|
rtabmap!.setDepthBleedingError(value: defaults.float(forKey: "DepthBleedingError"));
|
||||||
rtabmap!.setAppendMode(enabled: defaults.bool(forKey: "AppendMode"));
|
rtabmap!.setAppendMode(enabled: defaults.bool(forKey: "AppendMode"));
|
||||||
rtabmap!.setUpstreamRelocalizationAccThr(value: defaults.float(forKey: "UpstreamRelocalizationFilteringAccThr"));
|
rtabmap!.setUpstreamRelocalizationAccThr(value: defaults.float(forKey: "UpstreamRelocalizationFilteringAccThr"));
|
||||||
rtabmap!.setExportPointCloudFormat(format: defaults.string(forKey: "ExportPointCloudFormat")!);
|
rtabmap!.setExportPointCloudFormat(format: defaults.string(forKey: "ExportPointCloudFormat")!);
|
||||||
@@ -1919,6 +1915,8 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
|
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
let previousState = mState
|
||||||
|
|
||||||
updateState(state: .STATE_PROCESSING);
|
updateState(state: .STATE_PROCESSING);
|
||||||
|
|
||||||
present(alertView, animated: true, completion: {
|
present(alertView, animated: true, completion: {
|
||||||
@@ -1990,7 +1988,10 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
|
|
||||||
self.rtabmap!.postExportation(visualize: true)
|
self.rtabmap!.postExportation(visualize: true)
|
||||||
|
|
||||||
self.setGLCamera(type: 2)
|
if previousState != .STATE_VISUALIZING
|
||||||
|
{
|
||||||
|
self.setGLCamera(type: 2)
|
||||||
|
}
|
||||||
|
|
||||||
if self.openedDatabasePath == nil
|
if self.openedDatabasePath == nil
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
set -euxo pipefail
|
set -euxo pipefail
|
||||||
|
|
||||||
# Tested on Apple Silicon Mac, with cmake 3.19.2.
|
# Tested on Apple Silicon Mac, with cmake 4.0.2, XCode 16.3.
|
||||||
|
|
||||||
mkdir -p Libraries
|
mkdir -p Libraries
|
||||||
cd Libraries
|
cd Libraries
|
||||||
@@ -28,41 +28,65 @@ sysroot=iphoneos
|
|||||||
# Boost
|
# Boost
|
||||||
if [ ! -e $prefix/include/boost ]
|
if [ ! -e $prefix/include/boost ]
|
||||||
then
|
then
|
||||||
if [ ! -e boost_1_59_0 ]
|
if [ ! -e boost-1.88.0 ]
|
||||||
then
|
then
|
||||||
echo "wget boost..."
|
echo "wget boost..."
|
||||||
curl -L https://downloads.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz -o boost_1_59_0.tar.gz
|
curl -L https://github.com/boostorg/boost/releases/download/boost-1.88.0/boost-1.88.0-cmake.tar.gz -o boost-1.88.0-cmake.tar.gz
|
||||||
tar -xzf boost_1_59_0.tar.gz
|
tar -xzf boost-1.88.0-cmake.tar.gz
|
||||||
fi
|
fi
|
||||||
cd boost_1_59_0
|
cd boost-1.88.0
|
||||||
curl -L https://gist.github.com/matlabbe/0bce8feeb73a499a76afbbcc5c687221/raw/489ff2869eccd6f8d03ffb9090ef839108762741/BoostConfig.cmake.in -o BoostConfig.cmake.in
|
|
||||||
curl -L https://gist.github.com/matlabbe/0bce8feeb73a499a76afbbcc5c687221/raw/b07fe7d4e5dfe5f1d110c733e5cf660d79a26378/CMakeLists.txt -o CMakeLists.txt
|
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix ..
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DBOOST_INCOMPATIBLE_LIBRARIES="process;context;coroutine;fiber;fiber_numa;log_setup;log;cobalt" -DBOOST_IOSTREAMS_ENABLE_ZLIB=OFF -DBOOST_IOSTREAMS_ENABLE_BZIP2=OFF ..
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --build . --config Release --target install
|
cmake --build . --config Release --target install
|
||||||
cd $pwd
|
cd $pwd
|
||||||
#rm -r boost_1_59_0.tar.gz boost_1_59_0
|
#rm -r boost-1.88.0-cmake.tar.gz boost-1.88.0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# eigen
|
# eigen
|
||||||
if [ ! -e $prefix/include/eigen3 ]
|
if [ ! -e $prefix/include/eigen3 ]
|
||||||
then
|
then
|
||||||
if [ ! -e eigen-3.3.9 ]
|
if [ ! -e eigen-3.4.0 ]
|
||||||
then
|
then
|
||||||
echo "wget eigen..."
|
echo "wget eigen..."
|
||||||
curl -L https://gitlab.com/libeigen/eigen/-/archive/3.3.9/eigen-3.3.9.tar.gz -o 3.3.9.tar.gz
|
curl -L https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz -o 3.4.0.tar.gz
|
||||||
tar -xzf 3.3.9.tar.gz
|
tar -xzf 3.4.0.tar.gz
|
||||||
fi
|
fi
|
||||||
cd eigen-3.3.9
|
cd eigen-3.4.0
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix ..
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix ..
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --build . --config Release --target install
|
cmake --build . --config Release --target install
|
||||||
cd $pwd
|
cd $pwd
|
||||||
#rm -r 3.3.9.tar.gz eigen-3.3.9
|
#rm -r 3.4.0.tar.gz eigen-3.4.0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# lz4 (required by flann)
|
||||||
|
if [ ! -e $prefix/include/lz4.h ]
|
||||||
|
then
|
||||||
|
if [ ! -e lz4 ]
|
||||||
|
then
|
||||||
|
echo "wget lz4..."
|
||||||
|
git clone https://github.com/lz4/lz4.git -b v1.10.0
|
||||||
|
fi
|
||||||
|
cd lz4
|
||||||
|
if [ ! -e LZ4Config.cmake.in ]
|
||||||
|
then
|
||||||
|
curl -L https://gist.githubusercontent.com/matlabbe/abd0242305c29495bbba26065269daf2/raw/ad0b1865c02e61449f58358fdc4ddbed3cb5fb87/LZ4Config.cmake.in -o LZ4Config.cmake.in
|
||||||
|
fi
|
||||||
|
if [ ! -e CMakeLists.txt ]
|
||||||
|
then
|
||||||
|
curl -L https://gist.githubusercontent.com/matlabbe/abd0242305c29495bbba26065269daf2/raw/ad0b1865c02e61449f58358fdc4ddbed3cb5fb87/CMakeLists.txt -o CMakeLists.txt
|
||||||
|
fi
|
||||||
|
mkdir -p build
|
||||||
|
cd build
|
||||||
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix ..
|
||||||
|
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
cd $pwd
|
||||||
|
#rm -r lz4
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# FLANN
|
# FLANN
|
||||||
@@ -71,19 +95,17 @@ then
|
|||||||
if [ ! -e flann ]
|
if [ ! -e flann ]
|
||||||
then
|
then
|
||||||
echo "wget flann..."
|
echo "wget flann..."
|
||||||
git clone https://github.com/flann-lib/flann.git -b 1.8.4
|
git clone https://github.com/flann-lib/flann.git -b 1.9.2
|
||||||
fi
|
fi
|
||||||
cd flann
|
cd flann
|
||||||
if [ ! -e flann_ios.patch ]
|
if [ ! -e flann_ios_lz4.patch ]
|
||||||
then
|
then
|
||||||
curl -L https://gist.githubusercontent.com/matlabbe/c858ba36fb85d5e44d8667dfb3543e12/raw/8fc40aa9bc3267604869444020476a49f14ab424/flann_ios.patch -o flann_ios.patch
|
curl -L https://gist.githubusercontent.com/matlabbe/c858ba36fb85d5e44d8667dfb3543e12/raw/2586a356dec2b11440ec3c1bb113e709e1266d97/flann_ios_lz4.patch -o flann_ios_lz4.patch
|
||||||
git apply flann_ios.patch
|
git apply flann_ios_lz4.patch
|
||||||
fi
|
fi
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
# comment "add_subdirectory( test )" in top CMakeLists.txt
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DBUILD_PYTHON_BINDINGS=OFF -DBUILD_MATLAB_BINDINGS=OFF -DBUILD_C_BINDINGS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF -DBUILD_DOC=OFF -DUSE_OPENMP=OFF -DLZ4_DIR=$prefix/lib/lz4 ..
|
||||||
# comment "add_subdirectory( doc )" in top CMakeLists.txt
|
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DBUILD_PYTHON_BINDINGS=OFF -DBUILD_MATLAB_BINDINGS=OFF -DBUILD_C_BINDINGS=OFF ..
|
|
||||||
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
cd $pwd
|
cd $pwd
|
||||||
@@ -95,17 +117,14 @@ if [ ! -e $prefix/include/gtsam ]
|
|||||||
then
|
then
|
||||||
if [ ! -e gtsam ]
|
if [ ! -e gtsam ]
|
||||||
then
|
then
|
||||||
git clone https://bitbucket.org/gtborg/gtsam.git
|
git clone https://github.com/borglab/gtsam.git -b 4.2
|
||||||
cd gtsam
|
|
||||||
git checkout fbb9d3bdda8b88df51896bc401bfd170573e66f5
|
|
||||||
else
|
|
||||||
cd gtsam
|
|
||||||
fi
|
fi
|
||||||
|
cd gtsam
|
||||||
# patch
|
# patch
|
||||||
if [ ! -e gtsam_GKlib_ios_fix.patch ]
|
if [ ! -e gtsam_4_2_ios.patch ]
|
||||||
then
|
then
|
||||||
curl -L https://gist.github.com/matlabbe/76d658dddb841b3355ae3a6e32850cd8/raw/7033cba1c89097b0c830651d7277c04dc92cbdd9/gtsam_GKlib_ios_fix.patch -o gtsam_GKlib_ios_fix.patch
|
curl -L https://gist.githubusercontent.com/matlabbe/76d658dddb841b3355ae3a6e32850cd8/raw/e7355348c2d536ec50f41effa775ed251ae4e045/gtsam_4_2_ios.patch -o gtsam_4_2_ios.patch
|
||||||
git apply gtsam_GKlib_ios_fix.patch
|
git apply gtsam_4_2_ios.patch
|
||||||
fi
|
fi
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
@@ -116,22 +135,36 @@ cd $pwd
|
|||||||
#rm -rf gtsam
|
#rm -rf gtsam
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# suitesparse (dependency of g2o)
|
||||||
|
if [ ! -e $prefix/include/suitesparse/SuiteSparse_config.h ]
|
||||||
|
then
|
||||||
|
if [ ! -e SuiteSparse ]
|
||||||
|
then
|
||||||
|
git clone https://github.com/DrTimothyAldenDavis/SuiteSparse.git -b v7.6.1
|
||||||
|
fi
|
||||||
|
cd SuiteSparse
|
||||||
|
mkdir -p build
|
||||||
|
cd build
|
||||||
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DCMAKE_FIND_ROOT_PATH=$prefix -DSUITESPARSE_USE_OPENMP=OFF -DSUITESPARSE_ENABLE_PROJECTS="cholmod;cxsparse;spqr" ..
|
||||||
|
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
cd $pwd
|
||||||
|
fi
|
||||||
|
|
||||||
# g2o
|
# g2o
|
||||||
if [ ! -e $prefix/include/g2o ]
|
if [ ! -e $prefix/include/g2o ]
|
||||||
then
|
then
|
||||||
if [ ! -e g2o ]
|
if [ ! -e g2o ]
|
||||||
then
|
then
|
||||||
git clone https://github.com/RainerKuemmerle/g2o.git
|
git clone https://github.com/RainerKuemmerle/g2o.git -b 20241228_git
|
||||||
cd g2o
|
|
||||||
git checkout a3f7706bdbb849b2808dc3e1b7aee189f63b498e
|
|
||||||
else
|
|
||||||
cd g2o
|
|
||||||
fi
|
fi
|
||||||
|
cd g2o
|
||||||
# patch
|
# patch
|
||||||
if [ ! -e g2o_ios_fix.patch ]
|
if [ ! -e g2o_20241228_ios.patch ]
|
||||||
then
|
then
|
||||||
curl -L https://gist.github.com/matlabbe/b9ccfeae8f0744b275cab23510872680/raw/a58e06accba3976420d4b61341685c123193810e/g2o_ios_fix.patch -o g2o_ios_fix.patch
|
ls
|
||||||
git apply g2o_ios_fix.patch
|
curl -L https://gist.githubusercontent.com/matlabbe/b9ccfeae8f0744b275cab23510872680/raw/6fe2ffe5ba8fba59171adbd2f38f9c3999c61f75/g2o_20241228_ios.patch -o g2o_20241228_ios.patch
|
||||||
|
git apply g2o_20241228_ios.patch
|
||||||
fi
|
fi
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
@@ -142,6 +175,18 @@ cd $pwd
|
|||||||
#rm -rf g2o
|
#rm -rf g2o
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# g2o's installed CMake config hard-codes the absolute build-time prefix of its
|
||||||
|
# external dependencies (e.g. suitesparse) in INTERFACE_INCLUDE_DIRECTORIES. That
|
||||||
|
# path doesn't exist when the prebuilt Libraries archive is unpacked on another
|
||||||
|
# machine (CI), breaking find_package(g2o) with "includes non-existent path".
|
||||||
|
# Rewrite those absolute paths to be relocatable (relative to the config file).
|
||||||
|
# Run unconditionally (outside the build guard above) so it also fixes the prebuilt
|
||||||
|
# archive in CI, where the g2o build step is skipped.
|
||||||
|
find "$prefix/lib" -path '*/cmake/g2o/*.cmake' -print0 | while IFS= read -r -d '' f
|
||||||
|
do
|
||||||
|
sed -i '' -E 's#[^";]*/Libraries#${CMAKE_CURRENT_LIST_DIR}/../../..#g' "$f"
|
||||||
|
done
|
||||||
|
|
||||||
# VTK
|
# VTK
|
||||||
if [ ! -e $prefix/lib/vtk.framework ]
|
if [ ! -e $prefix/lib/vtk.framework ]
|
||||||
then
|
then
|
||||||
@@ -149,11 +194,10 @@ if [ ! -e VTK ]
|
|||||||
then
|
then
|
||||||
git clone https://github.com/Kitware/VTK.git
|
git clone https://github.com/Kitware/VTK.git
|
||||||
cd VTK
|
cd VTK
|
||||||
git checkout tags/v8.2.0
|
git checkout tags/v9.5.0.rc1
|
||||||
else
|
else
|
||||||
cd VTK
|
cd VTK
|
||||||
fi
|
fi
|
||||||
git cherry-pick bf3ae8072df2393c7270509bae41be0776826346
|
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_FRAMEWORK_INSTALL_PREFIX=$prefix/lib -DIOS_DEVICE_ARCHITECTURES="arm64" -DIOS_SIMULATOR_ARCHITECTURES="" -DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF -DVTK_IOS_BUILD=ON -DModule_vtkFiltersModeling=ON ..
|
cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_FRAMEWORK_INSTALL_PREFIX=$prefix/lib -DIOS_DEVICE_ARCHITECTURES="arm64" -DIOS_SIMULATOR_ARCHITECTURES="" -DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF -DVTK_IOS_BUILD=ON -DModule_vtkFiltersModeling=ON ..
|
||||||
@@ -163,26 +207,28 @@ cd $pwd
|
|||||||
#rm -rf VTK
|
#rm -rf VTK
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# PCL
|
# PCL
|
||||||
if [ ! -e $prefix/include/pcl-1.11 ]
|
if [ ! -e $prefix/include/pcl-1.15 ]
|
||||||
then
|
then
|
||||||
if [ ! -e pcl ]
|
if [ ! -e pcl ]
|
||||||
then
|
then
|
||||||
git clone https://github.com/PointCloudLibrary/pcl.git
|
git clone https://github.com/PointCloudLibrary/pcl.git
|
||||||
cd pcl
|
cd pcl
|
||||||
git checkout tags/pcl-1.11.1
|
git checkout tags/pcl-1.15.0
|
||||||
else
|
else
|
||||||
cd pcl
|
cd pcl
|
||||||
fi
|
fi
|
||||||
# patch
|
# patch
|
||||||
if [ ! -e pcl_1_11_1_vtk_ios_support.patch ]
|
if [ ! -e pcl_1_15_0_ios.patch ]
|
||||||
then
|
then
|
||||||
curl -L https://gist.github.com/matlabbe/f3ba9366eb91e1b855dadd2ddce5746d/raw/6869cf26211ab15492599e557b0e729b23b2c119/pcl_1_11_1_vtk_ios_support.patch -o pcl_1_11_1_vtk_ios_support.patch
|
curl -L https://gist.githubusercontent.com/matlabbe/f3ba9366eb91e1b855dadd2ddce5746d/raw/7231688d7fb9e86df72ca7c5f355d6b9727205d5/pcl_1_15_0_ios.patch -o pcl_1_15_0_ios.patch
|
||||||
git apply pcl_1_11_1_vtk_ios_support.patch
|
git apply pcl_1_15_0_ios.patch
|
||||||
fi
|
fi
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DBUILD_apps=OFF -DBUILD_examples=OFF -DBUILD_tools=OFF -DBUILD_visualization=OFF -DBUILD_tracking=OFF -DBUILD_people=OFF -DBUILD_global_tests=OFF -DWITH_QT=OFF -DWITH_OPENGL=OFF -DWITH_VTK=ON -DPCL_SHARED_LIBS=OFF -DPCL_ENABLE_SSE=OFF -DCMAKE_FIND_ROOT_PATH=$prefix ..
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DBUILD_apps=OFF -DBUILD_examples=OFF -DBUILD_tools=OFF -DBUILD_visualization=OFF -DBUILD_tracking=OFF -DBUILD_people=OFF -DBUILD_recognition=OFF -DBUILD_global_tests=OFF -DWITH_QT=OFF -DWITH_OPENGL=OFF -DWITH_OPENMP=OFF -DWITH_VTK=ON -DPCL_FLANN_REQUIRED_TYPE=STATIC -DPCL_SHARED_LIBS=OFF -DPCL_ENABLE_SSE=OFF -DCMAKE_FIND_ROOT_PATH=$prefix ..
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --build . --config Release --target install
|
cmake --build . --config Release --target install
|
||||||
cd $pwd
|
cd $pwd
|
||||||
@@ -190,32 +236,21 @@ cd $pwd
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# OpenCV
|
# OpenCV
|
||||||
if [ ! -e $prefix/include/opencv2 ]
|
if [ ! -e $prefix/include/opencv4 ]
|
||||||
then
|
then
|
||||||
if [ ! -e opencv_contrib ]
|
if [ ! -e opencv_contrib ]
|
||||||
then
|
then
|
||||||
git clone https://github.com/opencv/opencv_contrib.git
|
git clone https://github.com/opencv/opencv_contrib.git -b 4.11.0
|
||||||
cd opencv_contrib
|
|
||||||
git checkout tags/3.4.2
|
|
||||||
fi
|
fi
|
||||||
cd $pwd
|
cd $pwd
|
||||||
if [ ! -e opencv ]
|
if [ ! -e opencv ]
|
||||||
then
|
then
|
||||||
git clone https://github.com/opencv/opencv.git
|
git clone https://github.com/opencv/opencv.git -b 4.11.0
|
||||||
cd opencv
|
|
||||||
git checkout tags/3.4.2
|
|
||||||
else
|
|
||||||
cd opencv
|
|
||||||
fi
|
|
||||||
if [ ! -e opencv_ios.patch ]
|
|
||||||
then
|
|
||||||
curl -L https://gist.githubusercontent.com/matlabbe/fdc3ab4854f3a68fbde7277f543b4e5b/raw/f340839c09165056d3845645df24b76507542fd2/opencv_ios.patch -o opencv_ios.patch
|
|
||||||
git apply opencv_ios.patch
|
|
||||||
fi
|
fi
|
||||||
|
cd opencv
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
# add "add_definitions(-DPNG_ARM_NEON_OPT=0)" in 3rdparty/libpng/CMakeLists.txt
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DOPENCV_EXTRA_MODULES_PATH=$prefix/opencv_contrib/modules -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DWITH_CUDA=OFF -DWITH_WEBP=OFF -DWITH_OPENEXR=OFF -DBUILD_opencv_apps=OFF -DBUILD_opencv_xobjdetect=OFF -DBUILD_opencv_stereo=OFF -DOPENCV_ENABLE_NONFREE=ON ..
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DOPENCV_EXTRA_MODULES_PATH=$prefix/opencv_contrib/modules -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DWITH_CUDA=OFF -DBUILD_opencv_apps=OFF -DBUILD_opencv_xobjdetect=OFF -DBUILD_opencv_stereo=OFF ..
|
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --build . --config Release --target install
|
cmake --build . --config Release --target install
|
||||||
cd $pwd
|
cd $pwd
|
||||||
@@ -228,12 +263,10 @@ if [ ! -e $prefix/include/laszip ]
|
|||||||
then
|
then
|
||||||
if [ ! -e LASzip ]
|
if [ ! -e LASzip ]
|
||||||
then
|
then
|
||||||
git clone https://github.com/LASzip/LASzip.git
|
git clone https://github.com/LASzip/LASzip.git -b 2.0.1
|
||||||
cd LASzip
|
|
||||||
git checkout 2.0.1
|
|
||||||
else
|
|
||||||
cd LASzip
|
|
||||||
fi
|
fi
|
||||||
|
cd LASzip
|
||||||
|
sed -i '' 's/cmake_minimum_required(VERSION 2.6.0)/cmake_minimum_required(VERSION 3.5)/g' CMakeLists.txt
|
||||||
sed -i '' 's/add_subdirectory(tools)/#add_subdirectory(tools)/g' CMakeLists.txt
|
sed -i '' 's/add_subdirectory(tools)/#add_subdirectory(tools)/g' CMakeLists.txt
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
@@ -251,6 +284,7 @@ then
|
|||||||
git clone https://github.com/libLAS/libLAS.git
|
git clone https://github.com/libLAS/libLAS.git
|
||||||
fi
|
fi
|
||||||
cd libLAS
|
cd libLAS
|
||||||
|
sed -i '' 's/cmake_minimum_required(VERSION 2.8.11)/cmake_minimum_required(VERSION 3.5)/g' CMakeLists.txt
|
||||||
sed -i '' 's/SHARED/STATIC/g' src/CMakeLists.txt
|
sed -i '' 's/SHARED/STATIC/g' src/CMakeLists.txt
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
@@ -266,6 +300,6 @@ cmake -DANDROID_PREBUILD=ON ../../../../..
|
|||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
mkdir -p ios
|
mkdir -p ios
|
||||||
cd ios
|
cd ios
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DCMAKE_FIND_ROOT_PATH=$prefix -DWITH_QT=OFF -DBUILD_APP=OFF -DBUILD_TOOLS=OFF -DWITH_TORO=OFF -DWITH_VERTIGO=OFF -DWITH_MADGWICK=OFF -DWITH_ORB_OCTREE=OFF -DBUILD_EXAMPLES=OFF -DWITH_LIBLAS=ON ../../../../../..
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DCMAKE_FIND_ROOT_PATH=$prefix -DWITH_QT=OFF -DBUILD_APP=OFF -DBUILD_TOOLS=OFF -DWITH_TORO=OFF -DWITH_VERTIGO=OFF -DWITH_MADGWICK=OFF -DWITH_ORB_OCTREE=ON -DBUILD_EXAMPLES=OFF -DWITH_LIBLAS=ON -DWITH_OPENGV=OFF ../../../../../..
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --build . --config Release --target install
|
cmake --build . --config Release --target install
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>Choosing between high and low depth confidence depends on the application. If precise geometry is critical, prioritize high depth confidence even if it means fewer points. If you need a dense point cloud for analysis, even in areas with weak LiDAR signal, a lower depth confidence might be suitable at the cost of highly interpolated points (that could give a wavy look of some surfaces). Important: the points with too low confidence are not saved in the db file, so we cannot recover or filter these points in post-processing.</string>
|
<string>Choosing between high and low depth confidence depends on the application. If precise geometry is critical, prioritize high depth confidence even if it means fewer points. If you need a dense point cloud for analysis, even in areas with weak LiDAR signal, a lower depth confidence might be suitable at the cost of highly interpolated points (that could give a wavy look of some surfaces). Note: it is possible to change confidence level in post-processing.</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>DefaultValue</key>
|
<key>DefaultValue</key>
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>Smooth the point clouds.</string>
|
<string>Smooth the point clouds. Note that this can be changed in post-processing.</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
@@ -98,6 +98,44 @@
|
|||||||
<key>DefaultValue</key>
|
<key>DefaultValue</key>
|
||||||
<false/>
|
<false/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
<key>FooterText</key>
|
||||||
|
<string>Filter interpolated depth pixels between foreground and background objects. Note that values can be changed in post-processing.</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSMultiValueSpecifier</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>Depth Bleeding Filter Error</string>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>DepthBleedingError</string>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>Titles</key>
|
||||||
|
<array>
|
||||||
|
<string>Disabled</string>
|
||||||
|
<string>2.5 cm</string>
|
||||||
|
<string>5 cm</string>
|
||||||
|
<string>10 cm</string>
|
||||||
|
<string>15 cm</string>
|
||||||
|
<string>20 cm</string>
|
||||||
|
<string>25 cm</string>
|
||||||
|
<string>30 cm</string>
|
||||||
|
</array>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<string>0</string>
|
||||||
|
<string>0.025</string>
|
||||||
|
<string>0.05</string>
|
||||||
|
<string>0.10</string>
|
||||||
|
<string>0.15</string>
|
||||||
|
<string>0.20</string>
|
||||||
|
<string>0.25</string>
|
||||||
|
<string>0.30</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
@@ -590,7 +628,7 @@
|
|||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>BRIEF features are fast to compute but are not rotation invariant like FREAK. Warning: Changing feature type will automatically reset the map!</string>
|
<string>BRIEF, FREAK and ORB are binary features, which are fast to compute and use less memory. SURF and SIFT are high dimensional float descriptors (rotation/scale/shear-invariant), so they use more memory and CPU but they are significantly better to detect loop closures in large environments. Warning: Changing feature type will automatically reset the map!</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
@@ -603,13 +641,21 @@
|
|||||||
<string>6</string>
|
<string>6</string>
|
||||||
<key>Titles</key>
|
<key>Titles</key>
|
||||||
<array>
|
<array>
|
||||||
<string>BRIEF</string>
|
<string>SURF</string>
|
||||||
<string>FREAK</string>
|
<string>SIFT</string>
|
||||||
|
<string>GFTT-FREAK</string>
|
||||||
|
<string>GFTT-BRIEF</string>
|
||||||
|
<string>GFTT-ORB</string>
|
||||||
|
<string>ORB-OCTREE</string>
|
||||||
</array>
|
</array>
|
||||||
<key>Values</key>
|
<key>Values</key>
|
||||||
<array>
|
<array>
|
||||||
<string>6</string>
|
<string>0</string>
|
||||||
|
<string>1</string>
|
||||||
<string>5</string>
|
<string>5</string>
|
||||||
|
<string>6</string>
|
||||||
|
<string>8</string>
|
||||||
|
<string>10</string>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
|
|||||||
@@ -494,7 +494,7 @@
|
|||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>DefaultValue</key>
|
<key>DefaultValue</key>
|
||||||
<string>0.21.11</string>
|
<string>0.22.0</string>
|
||||||
<key>Key</key>
|
<key>Key</key>
|
||||||
<string>Version</string>
|
<string>Version</string>
|
||||||
<key>Title</key>
|
<key>Title</key>
|
||||||
|
|||||||
+144
-16
@@ -34,7 +34,7 @@ ENDIF()
|
|||||||
IF(APPLE AND BUILD_AS_BUNDLE)
|
IF(APPLE AND BUILD_AS_BUNDLE)
|
||||||
ADD_EXECUTABLE(rtabmap_app MACOSX_BUNDLE ${SRC_FILES})
|
ADD_EXECUTABLE(rtabmap_app MACOSX_BUNDLE ${SRC_FILES})
|
||||||
ELSEIF(WIN32 AND BUILD_AS_BUNDLE)
|
ELSEIF(WIN32 AND BUILD_AS_BUNDLE)
|
||||||
ADD_EXECUTABLE(rtabmap_app WIN32 ${SRC_FILES})
|
ADD_EXECUTABLE(rtabmap_app ${SRC_FILES})
|
||||||
ELSE()
|
ELSE()
|
||||||
ADD_EXECUTABLE(rtabmap_app ${SRC_FILES})
|
ADD_EXECUTABLE(rtabmap_app ${SRC_FILES})
|
||||||
ENDIF()
|
ENDIF()
|
||||||
@@ -95,9 +95,11 @@ IF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))
|
|||||||
DESTINATION ${thirdparty_dest_dir}
|
DESTINATION ${thirdparty_dest_dir}
|
||||||
COMPONENT runtime
|
COMPONENT runtime
|
||||||
REGEX ".*pdb" EXCLUDE)
|
REGEX ".*pdb" EXCLUDE)
|
||||||
INSTALL(FILES "${OpenNI2_BIN_DIR}/OpenNI.ini"
|
IF(NOT WIN32)
|
||||||
|
INSTALL(FILES "${OpenNI2_BIN_DIR}/OpenNI.ini"
|
||||||
DESTINATION ${thirdparty_dest_dir}
|
DESTINATION ${thirdparty_dest_dir}
|
||||||
COMPONENT runtime)
|
COMPONENT runtime)
|
||||||
|
ENDIF()
|
||||||
ENDIF(OpenNI2_FOUND)
|
ENDIF(OpenNI2_FOUND)
|
||||||
|
|
||||||
IF(k4a_FOUND)
|
IF(k4a_FOUND)
|
||||||
@@ -110,24 +112,135 @@ IF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))
|
|||||||
ENDIF(WIN32)
|
ENDIF(WIN32)
|
||||||
ENDIF(k4a_FOUND)
|
ENDIF(k4a_FOUND)
|
||||||
|
|
||||||
|
IF(ZED_FOUND)
|
||||||
|
# Install needed zlibwapi.dll
|
||||||
|
IF(WIN32)
|
||||||
|
file(TO_CMAKE_PATH "$ENV{ZED_SDK_ROOT_DIR}" ENV_ZED_SDK_ROOT_DIR)
|
||||||
|
INSTALL(FILES "${ENV_ZED_SDK_ROOT_DIR}/bin/zlibwapi.dll"
|
||||||
|
DESTINATION ${thirdparty_dest_dir}
|
||||||
|
COMPONENT runtime)
|
||||||
|
ENDIF(WIN32)
|
||||||
|
ENDIF(ZED_FOUND)
|
||||||
|
|
||||||
|
IF(OrbbecSDK_FOUND)
|
||||||
|
# Install needed "extensions" folder
|
||||||
|
IF(WIN32)
|
||||||
|
find_path(OrbbecSDK_BIN_DIR NAMES OrbbecSDK.dll)
|
||||||
|
IF(NOT OrbbecSDK_BIN_DIR)
|
||||||
|
MESSAGE(FATAL_ERROR "OrbbecSDK.dll not found! Verify your PATH.")
|
||||||
|
ENDIF(NOT OrbbecSDK_BIN_DIR)
|
||||||
|
MESSAGE(FATAL "OrbbecSDK_BIN_DIR=${OrbbecSDK_BIN_DIR}")
|
||||||
|
INSTALL(DIRECTORY "${OrbbecSDK_BIN_DIR}/extensions"
|
||||||
|
DESTINATION ${thirdparty_dest_dir}
|
||||||
|
COMPONENT runtime
|
||||||
|
FILES_MATCHING
|
||||||
|
PATTERN "*.lib" EXCLUDE
|
||||||
|
PATTERN "*")
|
||||||
|
ENDIF(WIN32)
|
||||||
|
ENDIF(OrbbecSDK_FOUND)
|
||||||
|
|
||||||
IF(Torch_FOUND)
|
IF(Torch_FOUND)
|
||||||
# Install needed cudnn_ops_infer64_8.dll and cudnn_cnn_infer64_8.dll
|
# Install needed cudnn dlls
|
||||||
# TODO: should be a more general way to include them if version is different
|
|
||||||
IF(WIN32 AND CUDA_FOUND)
|
IF(WIN32 AND CUDA_FOUND)
|
||||||
find_file(CUDNN_OPS_DLL NAMES cudnn_ops_infer64_8.dll)
|
find_path(cuDNN_BIN_DIR NAMES cudnn.dll cudnn64.dll cudnn64_9.dll)
|
||||||
find_file(CUDNN_CNN_DLL NAMES cudnn_cnn_infer64_8.dll)
|
IF(NOT cuDNN_BIN_DIR)
|
||||||
IF(CUDNN_OPS_DLL AND CUDNN_CNN_DLL)
|
MESSAGE(FATAL_ERROR "cudnn dlls not found! Make sure the dlls are in a directory on your PATH.")
|
||||||
MESSAGE(STATUS "Found ${CUDNN_OPS_DLL}")
|
ENDIF(NOT cuDNN_BIN_DIR)
|
||||||
MESSAGE(STATUS "Found ${CUDNN_CNN_DLL}")
|
MESSAGE(STATUS "cuDNN_BIN_DIR = ${cuDNN_BIN_DIR}")
|
||||||
INSTALL(FILES ${CUDNN_OPS_DLL} ${CUDNN_CNN_DLL}
|
file(GLOB CUDNN_DLLS "${cuDNN_BIN_DIR}/cudnn*.dll")
|
||||||
DESTINATION ${thirdparty_dest_dir}
|
IF(CUDNN_DLLS)
|
||||||
COMPONENT runtime)
|
MESSAGE(STATUS "Found cuDNN DLLs: ${CUDNN_DLLS}")
|
||||||
ELSE()
|
INSTALL(FILES ${CUDNN_DLLS}
|
||||||
MESSAGE(AUTHOR_WARNING "Using Torch with CUDA, but cudnn_ops_infer64_8.dll and cudnn_cnn_infer64_8.dll are not found on the PATH, so it won't be added to package.")
|
DESTINATION ${thirdparty_dest_dir}
|
||||||
|
COMPONENT runtime)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF(WIN32 AND CUDA_FOUND)
|
ENDIF(WIN32 AND CUDA_FOUND)
|
||||||
ENDIF(Torch_FOUND)
|
ENDIF(Torch_FOUND)
|
||||||
|
|
||||||
|
set(python_pyd_dir "")
|
||||||
|
IF(Python3_FOUND)
|
||||||
|
# bundle python3
|
||||||
|
IF(WIN32)
|
||||||
|
set(python_pyd_dir "bin/Lib/site-packages")
|
||||||
|
set(PYTHON_ZIP_NAME "python${Python3_VERSION_MAJOR}${Python3_VERSION_MINOR}.zip")
|
||||||
|
get_filename_component(PYTHON_ROOT "${Python3_EXECUTABLE}" DIRECTORY)
|
||||||
|
file(TO_CMAKE_PATH "${Python3_STDLIB}" SANITIZED_STDLIB)
|
||||||
|
|
||||||
|
MESSAGE(STATUS "Python3_EXECUTABLE=${Python3_EXECUTABLE}")
|
||||||
|
MESSAGE(STATUS "Python3_STDLIB=${SANITIZED_STDLIB}")
|
||||||
|
|
||||||
|
install(FILES "${Python3_EXECUTABLE}" DESTINATION bin COMPONENT runtime)
|
||||||
|
|
||||||
|
# when using python-opencv, it expects python3.dll, not python312.dll
|
||||||
|
get_filename_component(VCPKG_TRIPLET_ROOT "${PYTHON_TOOLS_DIR}/../../" ABSOLUTE)
|
||||||
|
set(VCPKG_BIN_DIR "${VCPKG_TRIPLET_ROOT}/bin")
|
||||||
|
find_file(PYTHON3_STABLE_DLL
|
||||||
|
NAMES python3.dll
|
||||||
|
PATHS "${VCPKG_BIN_DIR}"
|
||||||
|
NO_DEFAULT_PATH
|
||||||
|
)
|
||||||
|
if(PYTHON3_STABLE_DLL)
|
||||||
|
message(STATUS "Found python3.dll at: ${PYTHON3_STABLE_DLL}")
|
||||||
|
install(FILES "${PYTHON3_STABLE_DLL}" DESTINATION bin COMPONENT runtime)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# install python Lib in python312.zip (without site-packages, which is installed separatly afterwards)
|
||||||
|
file(TO_CMAKE_PATH "${Python3_STDLIB}" SANITIZED_STDLIB)
|
||||||
|
file(GLOB LIB_CONTENTS RELATIVE "${SANITIZED_STDLIB}" "${SANITIZED_STDLIB}/*")
|
||||||
|
list(REMOVE_ITEM LIB_CONTENTS "site-packages")
|
||||||
|
install(CODE "
|
||||||
|
execute_process(
|
||||||
|
COMMAND \"${CMAKE_COMMAND}\" -E tar cf \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin/${PYTHON_ZIP_NAME}\" --format=zip -- ${LIB_CONTENTS}
|
||||||
|
WORKING_DIRECTORY \"${SANITIZED_STDLIB}\"
|
||||||
|
)
|
||||||
|
" COMPONENT runtime)
|
||||||
|
set(PYTHON_SITE_PACKAGES "${SANITIZED_STDLIB}/site-packages")
|
||||||
|
|
||||||
|
install(DIRECTORY "${PYTHON_SITE_PACKAGES}/"
|
||||||
|
DESTINATION "${thirdparty_dest_dir}/Lib/site-packages"
|
||||||
|
COMPONENT runtime
|
||||||
|
PATTERN "*.exe" EXCLUDE
|
||||||
|
PATTERN "*.lib" EXCLUDE
|
||||||
|
PATTERN "*.hpp" EXCLUDE
|
||||||
|
PATTERN "*.h" EXCLUDE
|
||||||
|
PATTERN "*/torch/*" EXCLUDE
|
||||||
|
)
|
||||||
|
if(EXISTS "${PYTHON_SITE_PACKAGES}/torch")
|
||||||
|
install(DIRECTORY "${PYTHON_SITE_PACKAGES}/torch"
|
||||||
|
DESTINATION "${thirdparty_dest_dir}/Lib/site-packages/"
|
||||||
|
COMPONENT runtime
|
||||||
|
PATTERN "*.exe" EXCLUDE
|
||||||
|
PATTERN "*.lib" EXCLUDE
|
||||||
|
PATTERN "*.hpp" EXCLUDE
|
||||||
|
PATTERN "*.h" EXCLUDE
|
||||||
|
PATTERN "*.dll" EXCLUDE
|
||||||
|
)
|
||||||
|
file(GLOB_RECURSE PY_DLL_FILES "${PYTHON_SITE_PACKAGES}/torch/*.dll")
|
||||||
|
if(PY_DLL_FILES)
|
||||||
|
install(FILES ${PY_DLL_FILES} DESTINATION bin COMPONENT runtime)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# install python DDLs
|
||||||
|
file(GLOB_RECURSE PY_DLL_FILES \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${python_pyd_dir}/*.dll\")
|
||||||
|
install(DIRECTORY "${PYTHON_ROOT}/DLLs"
|
||||||
|
DESTINATION "${thirdparty_dest_dir}/"
|
||||||
|
COMPONENT runtime
|
||||||
|
FILES_MATCHING
|
||||||
|
PATTERN "*.dll"
|
||||||
|
PATTERN "*.pyd"
|
||||||
|
)
|
||||||
|
|
||||||
|
# install our python scripts in share for convenience
|
||||||
|
install(DIRECTORY "${PROJECT_SOURCE_DIR}/corelib/src/python/"
|
||||||
|
DESTINATION share
|
||||||
|
COMPONENT runtime
|
||||||
|
FILES_MATCHING
|
||||||
|
PATTERN "*.py"
|
||||||
|
)
|
||||||
|
ENDIF(WIN32)
|
||||||
|
ENDIF(Python3_FOUND)
|
||||||
|
|
||||||
IF(Qt6_FOUND)
|
IF(Qt6_FOUND)
|
||||||
# Reference: https://doc-snapshots.qt.io/qt6-6.4/qt-deploy-runtime-dependencies.html
|
# Reference: https://doc-snapshots.qt.io/qt6-6.4/qt-deploy-runtime-dependencies.html
|
||||||
# The following script must only be executed at install time
|
# The following script must only be executed at install time
|
||||||
@@ -230,10 +343,25 @@ IF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))
|
|||||||
# over.
|
# over.
|
||||||
# To find dependencies, cmake use "otool" on Apple and "dumpbin" on Windows (make sure you have one of them).
|
# To find dependencies, cmake use "otool" on Apple and "dumpbin" on Windows (make sure you have one of them).
|
||||||
install(CODE "
|
install(CODE "
|
||||||
file(GLOB_RECURSE QTPLUGINS \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${plugin_dest_dir}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
|
# Glob Qt Plugins
|
||||||
|
file(GLOB_RECURSE ALL_LIBS \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${plugin_dest_dir}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
|
||||||
|
|
||||||
|
if(NOT \"${python_pyd_dir}\" STREQUAL \"\")
|
||||||
|
file(GLOB_RECURSE PYD_FILES \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${python_pyd_dir}/*.pyd\")
|
||||||
|
if(PYD_FILES)
|
||||||
|
list(APPEND ALL_LIBS \${PYD_FILES})
|
||||||
|
endif()
|
||||||
|
if(WIN32)
|
||||||
|
file(GLOB_RECURSE DLL_FILES \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${python_pyd_dir}/torch/*.dll\")
|
||||||
|
if(DLL_FILES)
|
||||||
|
list(APPEND ALL_LIBS \${DLL_FILES})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
set(BU_CHMOD_BUNDLE_ITEMS ON)
|
set(BU_CHMOD_BUNDLE_ITEMS ON)
|
||||||
include(\"BundleUtilities\")
|
include(\"BundleUtilities\")
|
||||||
fixup_bundle(\"${APPS}\" \"\${QTPLUGINS}\" \"${DIRS}\")
|
fixup_bundle(\"${APPS}\" \"\${ALL_LIBS}\" \"${DIRS}\")
|
||||||
" COMPONENT runtime)
|
" COMPONENT runtime)
|
||||||
|
|
||||||
ENDIF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))
|
ENDIF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ RAMaddOverhead = 0;
|
|||||||
% Inliers_ratio = 'Loop/Visual_inliers/' ./ 'Keypoint/Current_frame/words'
|
% Inliers_ratio = 'Loop/Visual_inliers/' ./ 'Keypoint/Current_frame/words'
|
||||||
% Odometry_average = 'Memory/Distance_travelled/m'(2:end) - 'Memory/Distance_travelled/m'(1:end-1)
|
% Odometry_average = 'Memory/Distance_travelled/m'(2:end) - 'Memory/Distance_travelled/m'(1:end-1)
|
||||||
|
|
||||||
statNames = {'Loop/Odom_correction_norm/m', 'Loop/Visual_inliers/', 'Inliers_ratio_%', 'Timing/Total/ms', 'Memory/RAM_usage/MB', 'Memory/RAM_estimated/MB', 'Keypoint/Current_frame/words', 'Loop/Map_id/', 'Memory/Local_graph_size/', 'Keypoint/Dictionary_size/words', 'Loop/Distance_since_last_loc/'}; % 'Odometry_average'
|
statNames = {'Loop/Odom_correction_norm/m', 'Loop/Visual_inliers/', 'Inliers_ratio_%', 'Timing/Total/ms', 'Memory/RAM_usage/MB', 'Memory/RAM_estimated/MB', 'Keypoint/Current_frame/words', 'Loop/Map_id/', 'Memory/Local_graph_size/', 'Keypoint/Dictionary_size/words', 'Loop/Distance_since_last_loc/m'}; % 'Odometry_average'
|
||||||
|
|
||||||
|
|
||||||
datasets = [ 0 1 6 7 9 14 11 111 ]; % 0 1 6 7 9 12 14 11
|
datasets = [ 0 1 6 7 9 14 11 111 ]; % 0 1 6 7 9 12 14 11
|
||||||
@@ -26,7 +26,7 @@ if resultsToShow == 2
|
|||||||
sep = [0, 1000, 3000, 5000, 7000, 9000];
|
sep = [0, 1000, 3000, 5000, 7000, 9000];
|
||||||
sepName = {'17:27', '17:54', '18:27', '18:56', '19:35'};
|
sepName = {'17:27', '17:54', '18:27', '18:56', '19:35'};
|
||||||
prefix = 'Consecutive';
|
prefix = 'Consecutive';
|
||||||
statNames = {'Loop/Distance_since_last_loc/', 'Distance_since_last_loc_under_50cm'};
|
statNames = {'Loop/Distance_since_last_loc/m', 'Distance_since_last_loc_under_50cm'};
|
||||||
endif
|
endif
|
||||||
|
|
||||||
MapsN = length(sepName);
|
MapsN = length(sepName);
|
||||||
@@ -52,7 +52,7 @@ if strcmp(statName,'Inliers_ratio_%')
|
|||||||
elseif strcmp(statName, 'Odometry_average')
|
elseif strcmp(statName, 'Odometry_average')
|
||||||
data = dlmread([dataDir '/' prefix num2str(datasets(d)) '-' 'Memory-Distance_travelled-m' '.txt'], '\t', 1, 0, "emptyvalue", 0);
|
data = dlmread([dataDir '/' prefix num2str(datasets(d)) '-' 'Memory-Distance_travelled-m' '.txt'], '\t', 1, 0, "emptyvalue", 0);
|
||||||
elseif strcmp(statName, 'Distance_since_last_loc_under_50cm')
|
elseif strcmp(statName, 'Distance_since_last_loc_under_50cm')
|
||||||
data = dlmread([dataDir '/' prefix num2str(datasets(d)) '-' 'Loop-Distance_since_last_loc-' '.txt'], '\t', 1, 0, "emptyvalue", 0);
|
data = dlmread([dataDir '/' prefix num2str(datasets(d)) '-' 'Loop-Distance_since_last_loc-m' '.txt'], '\t', 1, 0, "emptyvalue", 0);
|
||||||
else
|
else
|
||||||
data = dlmread([dataDir '/' prefix num2str(datasets(d)) '-' statName '.txt'], '\t', 1, 0, "emptyvalue", 0);
|
data = dlmread([dataDir '/' prefix num2str(datasets(d)) '-' statName '.txt'], '\t', 1, 0, "emptyvalue", 0);
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ source rtabmap_latest.bash
|
|||||||
|
|
||||||
for d in "${DETECTOR[@]}"
|
for d in "${DETECTOR[@]}"
|
||||||
do
|
do
|
||||||
rtabmap-report --export --export_prefix "Stat$d" --loc 32 Loop/Odom_correction_norm/m Loop/Visual_inliers/ Timing/Total/ms Timing/Proximity_by_space_visual/ms Timing/Likelihood_computation/ms Timing/Posterior_computation/ms TimingMem/Keypoints_detection/ms TimingMem/Descriptors_extraction/ms TimingMem/Add_new_words/ms Loop/Map_id/ Keypoint/Current_frame/words Memory/RAM_usage/MB Memory/RAM_estimated/MB Memory/Distance_travelled/m Loop/Distance_since_last_loc/ Memory/Local_graph_size/ Keypoint/Dictionary_size/words "$DATA/$d/loc"
|
rtabmap-report --export --export_prefix "Stat$d" --loc 32 Loop/Odom_correction_norm/m Loop/Visual_inliers/ Timing/Total/ms Timing/Proximity_by_space_visual/ms Timing/Likelihood_computation/ms Timing/Posterior_computation/ms TimingMem/Keypoints_detection/ms TimingMem/Descriptors_extraction/ms TimingMem/Add_new_words/ms Loop/Map_id/ Keypoint/Current_frame/words Memory/RAM_usage/MB Memory/RAM_estimated/MB Memory/Distance_travelled/m Loop/Distance_since_last_loc/m Memory/Local_graph_size/ Keypoint/Dictionary_size/words "$DATA/$d/loc"
|
||||||
rtabmap-report --export --export_prefix "Consecutive$d" --loc 32 Loop/Map_id/ Loop/Distance_since_last_loc/ "$DATA/$d/consecutive_loc"
|
rtabmap-report --export --export_prefix "Consecutive$d" --loc 32 Loop/Map_id/ Loop/Distance_since_last_loc/m "$DATA/$d/consecutive_loc"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,227 @@
|
|||||||
|
@echo off
|
||||||
|
setlocal enabledelayedexpansion
|
||||||
|
|
||||||
|
:: --- CONFIGURATION ---
|
||||||
|
set "VCPKG_ROOT=%~dp0vcpkg"
|
||||||
|
set "EXPORT_DIR=%~dp0vcpkg_binaries"
|
||||||
|
set "TRIPLET=x64-windows-release"
|
||||||
|
set "SEVENZIP_EXE=C:\Program Files\7-Zip\7z.exe"
|
||||||
|
|
||||||
|
set "VCPKG_JSON=%~dp0vcpkg.json"
|
||||||
|
for /f "usebackq tokens=*" %%a in (`powershell -NoProfile -Command "(Get-Content '%VCPKG_JSON%' -Raw | ConvertFrom-Json).'builtin-baseline'"` ) do set "VCPKG_COMMIT=%%a"
|
||||||
|
echo [+] Detected VCPKG baseline commit: %VCPKG_COMMIT%
|
||||||
|
|
||||||
|
if "%VCPKG_COMMIT%"=="" (
|
||||||
|
echo [X] Error: Could not find 'builtin-baseline' in %VCPKG_JSON%
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
set VCPKG_COMMIT_SHORT=%VCPKG_COMMIT:~0,8%
|
||||||
|
|
||||||
|
:: 1. Setup Local vcpkg
|
||||||
|
if not exist "%VCPKG_ROOT%" (
|
||||||
|
echo [+] Local vcpkg not found. Cloning...
|
||||||
|
git clone https://github.com/microsoft/vcpkg.git "%VCPKG_ROOT%"
|
||||||
|
)
|
||||||
|
pushd "%VCPKG_ROOT%"
|
||||||
|
git checkout %VCPKG_COMMIT%
|
||||||
|
call .\bootstrap-vcpkg.bat
|
||||||
|
popd
|
||||||
|
|
||||||
|
:: 2. Install vcpkg dependencies
|
||||||
|
echo [+] Installing dependencies via vcpkg manifest...
|
||||||
|
"%VCPKG_ROOT%\vcpkg.exe" install ^
|
||||||
|
--triplet=%TRIPLET% ^
|
||||||
|
--host-triplet=%TRIPLET% ^
|
||||||
|
--clean-after-build ^
|
||||||
|
--x-feature=tools ^
|
||||||
|
--x-feature=k4w2 ^
|
||||||
|
--x-feature=octomap ^
|
||||||
|
--x-feature=openmp ^
|
||||||
|
--x-feature=realsense2 ^
|
||||||
|
--x-feature=openni2 ^
|
||||||
|
--x-feature=gtsam-deps ^
|
||||||
|
--x-feature=python ^
|
||||||
|
--x-feature=libpointmatcher-deps || exit /b !errorlevel!
|
||||||
|
|
||||||
|
:: 3. Export
|
||||||
|
echo [+] Exporting built binaries to raw folder...
|
||||||
|
set "VS_LOCATOR=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"
|
||||||
|
for /f "usebackq tokens=*" %%i in (`"%VS_LOCATOR%" -latest -property catalog_productLineVersion`) do set VS_YEAR=vs%%i
|
||||||
|
set TARGET_NAME=vcpkg-export-%VCPKG_COMMIT_SHORT%-x64-%VS_YEAR%
|
||||||
|
set TARGET_FULL_PATH=%EXPORT_DIR%\%TARGET_NAME%
|
||||||
|
if exist "%TARGET_FULL_PATH%" rd /s /q "%TARGET_FULL_PATH%"
|
||||||
|
"%VCPKG_ROOT%\vcpkg.exe" export --raw --output-dir="%EXPORT_DIR%" --triplet=%TRIPLET% || exit /b !errorlevel!
|
||||||
|
|
||||||
|
:: Find the actual exported folder name (it usually contains a date/hash)
|
||||||
|
for /d %%i in ("%EXPORT_DIR%\vcpkg-export-20??????-??????") do set "FINAL_EXPORT_PATH=%%i"
|
||||||
|
|
||||||
|
echo [+] Rename folder %FINAL_EXPORT_PATH% to %TARGET_NAME%
|
||||||
|
ren "%FINAL_EXPORT_PATH%" "%TARGET_NAME%" || exit /b !errorlevel!
|
||||||
|
set "FINAL_EXPORT_PATH=%TARGET_FULL_PATH%"
|
||||||
|
|
||||||
|
echo [+] Add numpy...
|
||||||
|
:: We install numpy<2 to be compatible with SuperPoint and SuperGlue scripts
|
||||||
|
%FINAL_EXPORT_PATH%/installed/%TRIPLET%/tools/python3/python.exe -m ensurepip --upgrade || exit /b %errorlevel%
|
||||||
|
%FINAL_EXPORT_PATH%/installed/%TRIPLET%/tools/python3/python.exe -m pip install --upgrade pip || exit /b !errorlevel!
|
||||||
|
%FINAL_EXPORT_PATH%/installed/%TRIPLET%/tools/python3/python.exe -m pip install "numpy<2" || exit /b !errorlevel!
|
||||||
|
|
||||||
|
:: 4. Other dependencies not in vcpkg
|
||||||
|
:: libnabo
|
||||||
|
echo [+] Building libnabo...
|
||||||
|
if not exist libnabo (
|
||||||
|
echo [+] Downloading...
|
||||||
|
git clone https://github.com/ethz-asl/libnabo.git
|
||||||
|
cd libnabo
|
||||||
|
:: Jan 27, 2022
|
||||||
|
git checkout c925c47
|
||||||
|
git apply ../patches/libnabo_c925c47.patch
|
||||||
|
cd ..
|
||||||
|
)
|
||||||
|
cd libnabo
|
||||||
|
cmake -S . -B build -GNinja ^
|
||||||
|
-DVCPKG_MANIFEST_INSTALL=OFF ^
|
||||||
|
-DVCPKG_TARGET_TRIPLET=x64-windows-release ^
|
||||||
|
-DVCPKG_INSTALLED_DIR="%FINAL_EXPORT_PATH%\installed" ^
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE="%FINAL_EXPORT_PATH%\scripts\buildsystems\vcpkg.cmake" ^
|
||||||
|
-DCMAKE_INSTALL_PREFIX="%FINAL_EXPORT_PATH%\installed\%TRIPLET%" ^
|
||||||
|
-DCMAKE_BUILD_TYPE=Release ^
|
||||||
|
-DSHARED_LIBS=FALSE ^
|
||||||
|
-DLIBNABO_BUILD_DOXYGEN=OFF ^
|
||||||
|
-DLIBNABO_BUILD_EXAMPLES=OFF ^
|
||||||
|
-DLIBNABO_BUILD_PYTHON=OFF ^
|
||||||
|
-DLIBNABO_BUILD_TESTS=OFF || exit /b !errorlevel!
|
||||||
|
cmake --build build --config Release --target install || exit /b !errorlevel!
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
:: libpointmatcher
|
||||||
|
echo [+] Building libpointmatcher...
|
||||||
|
if not exist libpointmatcher (
|
||||||
|
echo [+] Downloading and applying patch...
|
||||||
|
git clone https://github.com/ethz-asl/libpointmatcher.git
|
||||||
|
cd libpointmatcher
|
||||||
|
:: Mar 17, 2023
|
||||||
|
git checkout 7dc58e5
|
||||||
|
git apply ../patches/pointmatcher_7dc58e5.patch
|
||||||
|
cd ..
|
||||||
|
)
|
||||||
|
cd libpointmatcher
|
||||||
|
cmake -S . -B build -GNinja ^
|
||||||
|
-DVCPKG_MANIFEST_INSTALL=OFF ^
|
||||||
|
-DVCPKG_TARGET_TRIPLET=x64-windows-release ^
|
||||||
|
-DVCPKG_INSTALLED_DIR="%FINAL_EXPORT_PATH%\installed" ^
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE="%FINAL_EXPORT_PATH%\scripts\buildsystems\vcpkg.cmake" ^
|
||||||
|
-DCMAKE_INSTALL_PREFIX="%FINAL_EXPORT_PATH%\installed\%TRIPLET%" ^
|
||||||
|
-DCMAKE_BUILD_TYPE=Release ^
|
||||||
|
-DBUILD_TESTS=OFF ^
|
||||||
|
-DBUILD_SHARED_LIBS=ON ^
|
||||||
|
-DPOINTMATCHER_BUILD_EVALUATIONS=OFF ^
|
||||||
|
-DPOINTMATCHER_BUILD_EXAMPLES=OFF ^
|
||||||
|
-DCMAKE_CXX_FLAGS="-DBOOST_TIMER_ENABLE_DEPRECATED /EHsc -DBOOST_EXCEPTION_DISABLE" || exit /b !errorlevel!
|
||||||
|
cmake --build build --config Release --target install || exit /b !errorlevel!
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
:: We remove the files in the top-level CMake directory to force use of share/libpointmatcher/cmake
|
||||||
|
if exist "%FINAL_EXPORT_PATH%\installed\%TRIPLET%\CMake\" (
|
||||||
|
rd /s /q "%FINAL_EXPORT_PATH%\installed\%TRIPLET%\CMake"
|
||||||
|
)
|
||||||
|
|
||||||
|
:: gtsam
|
||||||
|
echo [+] Building gtsam...
|
||||||
|
if not exist gtsam (
|
||||||
|
echo [+] Downloading and applying patch...
|
||||||
|
git clone https://github.com/borglab/gtsam.git
|
||||||
|
cd gtsam
|
||||||
|
:: June 18, 2025
|
||||||
|
git checkout 4.3a0-ros
|
||||||
|
git cherry-pick 18af4e6
|
||||||
|
git apply ../patches/gtsam_4_3a0-ros.patch
|
||||||
|
cd ..
|
||||||
|
)
|
||||||
|
cd gtsam
|
||||||
|
cmake -S . -B build -GNinja ^
|
||||||
|
-DVCPKG_MANIFEST_INSTALL=OFF ^
|
||||||
|
-DVCPKG_TARGET_TRIPLET=x64-windows-release ^
|
||||||
|
-DVCPKG_INSTALLED_DIR="%FINAL_EXPORT_PATH%\installed" ^
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE="%FINAL_EXPORT_PATH%\scripts\buildsystems\vcpkg.cmake" ^
|
||||||
|
-DCMAKE_INSTALL_PREFIX="%FINAL_EXPORT_PATH%\installed\%TRIPLET%" ^
|
||||||
|
-DCMAKE_BUILD_TYPE=Release ^
|
||||||
|
-DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF ^
|
||||||
|
-DGTSAM_BUILD_TESTS=OFF ^
|
||||||
|
-DGTSAM_BUILD_UNSTABLE=OFF ^
|
||||||
|
-DGTSAM_USE_SYSTEM_EIGEN=ON ^
|
||||||
|
-DGTSAM_BUILD_WITH_PRECOMPILED_HEADERS=OFF ^
|
||||||
|
-DGTSAM_UNSTABLE_BUILD_PYTHON=OFF ^
|
||||||
|
-DGTSAM_WITH_EIGEN_MKL=OFF ^
|
||||||
|
-DGTSAM_WITH_EIGEN_MKL_OPENMP=OFF ^
|
||||||
|
-DCMAKE_CXX_FLAGS="-DBOOST_TIMER_ENABLE_DEPRECATED -DBOOST_BIND_GLOBAL_PLACEHOLDERS" || exit /b !errorlevel!
|
||||||
|
cmake --build build --config Release --target install || exit /b !errorlevel!
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
:: opengv
|
||||||
|
echo [+] Building opengv...
|
||||||
|
if not exist opengv (
|
||||||
|
echo [+] Downloading and applying patch...
|
||||||
|
git clone https://github.com/laurentkneip/opengv.git
|
||||||
|
cd opengv
|
||||||
|
:: Aug 6, 2020
|
||||||
|
git checkout 91f4b19c73450833a40e463ad3648aae80b3a7f3
|
||||||
|
git apply ../patches/opengv_91f4b19c.patch
|
||||||
|
cd ..
|
||||||
|
)
|
||||||
|
cd opengv
|
||||||
|
cmake -S . -B build -GNinja ^
|
||||||
|
-DVCPKG_MANIFEST_INSTALL=OFF ^
|
||||||
|
-DVCPKG_TARGET_TRIPLET=x64-windows-release ^
|
||||||
|
-DVCPKG_INSTALLED_DIR="%FINAL_EXPORT_PATH%\installed" ^
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE="%FINAL_EXPORT_PATH%\scripts\buildsystems\vcpkg.cmake" ^
|
||||||
|
-DCMAKE_INSTALL_PREFIX="%FINAL_EXPORT_PATH%\installed\%TRIPLET%" ^
|
||||||
|
-DBUILD_TESTS=OFF ^
|
||||||
|
-DBUILD_SHARED_LIBS=ON || exit /b !errorlevel!
|
||||||
|
cmake --build build --config Release --target install || exit /b !errorlevel!
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
:: 5. ZIP the folder
|
||||||
|
echo [+] Creating final package with 7-Zip...
|
||||||
|
:: Rip off pdb files
|
||||||
|
cd /d "%FINAL_EXPORT_PATH%"
|
||||||
|
del /s /q /f *.pdb >nul 2>&1
|
||||||
|
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
set "FINAL_ZIP=%TARGET_NAME%.7z"
|
||||||
|
|
||||||
|
:: compress contents without the root folder
|
||||||
|
"%SEVENZIP_EXE%" u -t7z -mx9 "%FINAL_ZIP%" "%FINAL_EXPORT_PATH%\*" -up0q0
|
||||||
|
|
||||||
|
if !errorlevel! EQU 0 (
|
||||||
|
echo [!] Success! Package created at %FINAL_ZIP%
|
||||||
|
) else (
|
||||||
|
echo [X] 7-Zip failed with error code !errorlevel!
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
:: Example building rtabmap afterwards
|
||||||
|
goto :EndComment
|
||||||
|
|
||||||
|
set VCPKG_UNZIPPED_EXPORT_PATH=%USERPROFILE%\Downloads\vcpkg-export-########-x64-vs2022
|
||||||
|
set PATH=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\x64-windows-release\bin;%PATH%
|
||||||
|
|
||||||
|
cmake -B build -GNinja ^
|
||||||
|
-DCMAKE_BUILD_TYPE=Release ^
|
||||||
|
-DBUILD_AS_BUNDLE=ON -DWITH_PYTHON=ON ^
|
||||||
|
-DWITH_ZED=OFF ^
|
||||||
|
-DVCPKG_MANIFEST_INSTALL=OFF ^
|
||||||
|
-DVCPKG_TARGET_TRIPLET=x64-windows-release ^
|
||||||
|
-DVCPKG_INSTALLED_DIR="%VCPKG_UNZIPPED_EXPORT_PATH%/installed" ^
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=%VCPKG_UNZIPPED_EXPORT_PATH%/scripts/buildsystems/vcpkg.cmake ^
|
||||||
|
-DGTSAM_DIR=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\x64-windows-release\CMake
|
||||||
|
|
||||||
|
cmake --build build --config Release --target package
|
||||||
|
|
||||||
|
:: To install CPU pytorch inside rtabmap package afterwards.
|
||||||
|
:: Note that python.exe is the one in the bin directory of the package, not the system one.
|
||||||
|
python.exe -m pip install torch torchvision opencv-python-headless "numpy<2"
|
||||||
|
|
||||||
|
:EndComment
|
||||||
@@ -0,0 +1,239 @@
|
|||||||
|
@echo off
|
||||||
|
setlocal enabledelayedexpansion
|
||||||
|
|
||||||
|
IF NOT DEFINED CUDA_PATH (
|
||||||
|
echo [ERROR] CUDA_PATH is not set.
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
set PATH=%CUDA_PATH%\bin;%PATH%
|
||||||
|
set PATH=%CUDA_PATH%\bin\x64;%PATH%
|
||||||
|
set PATH=%CUDA_PATH%\extras\CUPTI\lib64;%PATH%
|
||||||
|
|
||||||
|
:: CUDA Toolkit should be manually installed on the computer before running this script
|
||||||
|
:: We assume also that cuDNN is merged into CUDA installed directory.
|
||||||
|
where nvcc >nul 2>&1
|
||||||
|
if !errorlevel! neq 0 (
|
||||||
|
echo [ERROR] nvcc was not found in your PATH.
|
||||||
|
pause
|
||||||
|
exit /b
|
||||||
|
)
|
||||||
|
for /f "tokens=5" %%a in ('nvcc --version ^| findstr "release"') do (
|
||||||
|
set "RAW_VER=%%a"
|
||||||
|
:: This removes the trailing comma
|
||||||
|
set "CUDA_VER=!RAW_VER:,=!"
|
||||||
|
set "CUDA_VER_SHORT=!CUDA_VER:.=!"
|
||||||
|
)
|
||||||
|
if "!CUDA_VER!"=="" (
|
||||||
|
echo [ERROR] Could not parse CUDA version.
|
||||||
|
pause
|
||||||
|
exit /b
|
||||||
|
)
|
||||||
|
echo Installed CUDA Toolkit: %CUDA_VER%
|
||||||
|
|
||||||
|
:: --- CONFIGURATION ---
|
||||||
|
set "VCPKG_ROOT=%~dp0vcpkg"
|
||||||
|
set "EXPORT_DIR=%~dp0vcpkg_binaries"
|
||||||
|
set "TRIPLET=x64-windows-release"
|
||||||
|
set "SEVENZIP_EXE=C:\Program Files\7-Zip\7z.exe"
|
||||||
|
|
||||||
|
set "VCPKG_JSON=%~dp0vcpkg.json"
|
||||||
|
for /f "usebackq tokens=*" %%a in (`powershell -NoProfile -Command "(Get-Content '%VCPKG_JSON%' -Raw | ConvertFrom-Json).'builtin-baseline'"` ) do set "VCPKG_COMMIT=%%a"
|
||||||
|
|
||||||
|
if "%VCPKG_COMMIT%"=="" (
|
||||||
|
echo [X] Error: Could not find 'builtin-baseline' in %VCPKG_JSON%
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
set VCPKG_COMMIT_SHORT=%VCPKG_COMMIT:~0,8%
|
||||||
|
set "VS_LOCATOR=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"
|
||||||
|
for /f "usebackq tokens=*" %%i in (`"%VS_LOCATOR%" -latest -property catalog_productLineVersion`) do set VS_YEAR=vs%%i
|
||||||
|
set ORG_TARGET_NAME=vcpkg-export-%VCPKG_COMMIT_SHORT%-x64-%VS_YEAR%
|
||||||
|
set TARGET_NAME=%ORG_TARGET_NAME%-cuda%CUDA_VER_SHORT%
|
||||||
|
set VCPKG_EXPORT_PATH=%EXPORT_DIR%\%ORG_TARGET_NAME%
|
||||||
|
set FINAL_EXPORT_PATH=%EXPORT_DIR%\%TARGET_NAME%
|
||||||
|
|
||||||
|
if not exist "%FINAL_EXPORT_PATH%" (
|
||||||
|
if not exist "%VCPKG_EXPORT_PATH%" (
|
||||||
|
call bundle_windows_deps.bat || exit /b !errorlevel!
|
||||||
|
)
|
||||||
|
echo [+] Copying %VCPKG_EXPORT_PATH% to %FINAL_EXPORT_PATH%
|
||||||
|
xcopy "%VCPKG_EXPORT_PATH%" "%FINAL_EXPORT_PATH%\" /E /I /H /Y /Q || exit /b !errorlevel!
|
||||||
|
echo [+] Remove opencv built by vcpkg
|
||||||
|
rmdir /s /q "%FINAL_EXPORT_PATH%\installed\%TRIPLET%\include\opencv4" || exit /b !errorlevel!
|
||||||
|
rmdir /s /q "%FINAL_EXPORT_PATH%\installed\%TRIPLET%\share\opencv4" || exit /b !errorlevel!
|
||||||
|
rmdir /s /q "%FINAL_EXPORT_PATH%\installed\%TRIPLET%\share\opencv" || exit /b !errorlevel!
|
||||||
|
del "%FINAL_EXPORT_PATH%\installed\%TRIPLET%\bin\opencv*" || exit /b !errorlevel!
|
||||||
|
del "%FINAL_EXPORT_PATH%\installed\%TRIPLET%\lib\opencv*" || exit /b !errorlevel!
|
||||||
|
:: bundle cudnn runtime libraries
|
||||||
|
xcopy "%CUDA_PATH%\bin\x64\cudnn*.dll" "%FINAL_EXPORT_PATH%\installed\%TRIPLET%\bin\" /Y
|
||||||
|
)
|
||||||
|
|
||||||
|
:: pytorch deps
|
||||||
|
%FINAL_EXPORT_PATH%/installed/%TRIPLET%/tools/python3/python.exe -m pip install numpy packaging "setuptools<82" pyyaml typing_extensions
|
||||||
|
|
||||||
|
git config --global core.longpaths true
|
||||||
|
|
||||||
|
:: pytorch, build with local cuda libraries to avoid duplicating them when we install rtabmap
|
||||||
|
echo [+] Building pytorch with cuda support...
|
||||||
|
if not exist pytorch (
|
||||||
|
echo [+] Downloading pytorch...
|
||||||
|
git clone https://github.com/pytorch/pytorch || exit /b !errorlevel!
|
||||||
|
cd pytorch
|
||||||
|
:: Jan 21, 2026
|
||||||
|
git checkout v2.10.0
|
||||||
|
git submodule update --init --recursive || exit /b !errorlevel!
|
||||||
|
cd ..
|
||||||
|
)
|
||||||
|
|
||||||
|
set "PYTHONHOME=%FINAL_EXPORT_PATH%\installed\%TRIPLET%\tools\python3"
|
||||||
|
set "Python_ROOT_DIR=%FINAL_EXPORT_PATH%\installed\%TRIPLET%"
|
||||||
|
set CMAKE_GENERATOR=Ninja
|
||||||
|
set BUILD_TEST=0
|
||||||
|
set ATEN_NO_TEST=1
|
||||||
|
set INSTALL_TEST=OFF
|
||||||
|
set "LIB=%FINAL_EXPORT_PATH%\installed\%TRIPLET%\lib;%LIB%"
|
||||||
|
set "%FINAL_EXPORT_PATH%\installed\%TRIPLET%\include;INCLUDE=%INCLUDE%"
|
||||||
|
|
||||||
|
:: check if torch is installed
|
||||||
|
%PYTHONHOME%/python.exe -m pip show torch >nul 2>&1
|
||||||
|
if !errorlevel! neq 0 (
|
||||||
|
cd pytorch
|
||||||
|
%PYTHONHOME%/python.exe setup.py install || exit /b !errorlevel!
|
||||||
|
cd ..
|
||||||
|
)
|
||||||
|
if exist "%PYTHONHOME%\Lib\site-packages\torch\test" rd /s /q %PYTHONHOME%\Lib\site-packages\torch\test"
|
||||||
|
del "%PYTHONHOME%\Lib\site-packages\torch\bin\test_*" || exit /b !errorlevel!
|
||||||
|
|
||||||
|
echo [+] Building torchvision...
|
||||||
|
if not exist torchvision (
|
||||||
|
echo [+] Downloading torchvision...
|
||||||
|
git clone https://github.com/pytorch/vision.git torchvision || exit /b !errorlevel!
|
||||||
|
cd torchvision
|
||||||
|
:: Jan 6, 2026
|
||||||
|
git checkout v0.25.0
|
||||||
|
git submodule update --init --recursive || exit /b !errorlevel!
|
||||||
|
cd ..
|
||||||
|
)
|
||||||
|
cd torchvision
|
||||||
|
set PATH=%FINAL_EXPORT_PATH%\installed\%TRIPLET%\bin;%PATH%
|
||||||
|
set DISTUTILS_USE_SDK=1
|
||||||
|
set TORCHVISION_INCLUDE=%FINAL_EXPORT_PATH%\installed\%TRIPLET%\include
|
||||||
|
set TORCHVISION_LIBRARY=%FINAL_EXPORT_PATH%\installed\%TRIPLET%\lib
|
||||||
|
%FINAL_EXPORT_PATH%/installed/%TRIPLET%/tools/python3/python.exe -m pip install . -v --no-build-isolation || exit /b !errorlevel!
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
:: opencv_cuda
|
||||||
|
echo [+] Building opencv with cuda support...
|
||||||
|
if not exist opencv (
|
||||||
|
echo [+] Downloading opencv...
|
||||||
|
git clone https://github.com/opencv/opencv.git || exit /b !errorlevel!
|
||||||
|
cd opencv
|
||||||
|
:: 4.13.0 minimum required to be compatible with cuda 13
|
||||||
|
:: Dec 31, 2025
|
||||||
|
git checkout 4.13.0
|
||||||
|
cd ..
|
||||||
|
)
|
||||||
|
if not exist opencv_contrib (
|
||||||
|
echo [+] Downloading opencv_contrib...
|
||||||
|
git clone https://github.com/opencv/opencv_contrib.git || exit /b !errorlevel!
|
||||||
|
cd opencv
|
||||||
|
:: 4.13.0 minimum required to be compatible with cuda 13
|
||||||
|
:: Dec 31, 2025
|
||||||
|
git checkout 4.13.0
|
||||||
|
cd ..
|
||||||
|
)
|
||||||
|
cd opencv
|
||||||
|
cmake -S . -B build -GNinja ^
|
||||||
|
-DVCPKG_MANIFEST_INSTALL=OFF ^
|
||||||
|
-DVCPKG_TARGET_TRIPLET=%TRIPLET% ^
|
||||||
|
-DVCPKG_INSTALLED_DIR="%FINAL_EXPORT_PATH%\installed" ^
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE="%FINAL_EXPORT_PATH%\scripts\buildsystems\vcpkg.cmake" ^
|
||||||
|
-DCMAKE_INSTALL_PREFIX="%FINAL_EXPORT_PATH%\installed\%TRIPLET%" ^
|
||||||
|
-DCMAKE_BUILD_TYPE=Release ^
|
||||||
|
-DOPENCV_BIN_INSTALL_PATH="bin" ^
|
||||||
|
-DOPENCV_LIB_INSTALL_PATH="lib" ^
|
||||||
|
-DOPENCV_CONFIG_INSTALL_PATH="share/opencv" ^
|
||||||
|
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ^
|
||||||
|
-DBUILD_SHARED_LIBS=ON ^
|
||||||
|
-DBUILD_TESTS=OFF ^
|
||||||
|
-DBUILD_PERF_TESTS=OFF ^
|
||||||
|
-DOPENCV_ENABLE_NONFREE=ON ^
|
||||||
|
-DBUILD_opencv_apps=OFF ^
|
||||||
|
-DBUILD_opencv_python3=ON ^
|
||||||
|
-DPYTHON3_EXECUTABLE=%FINAL_EXPORT_PATH%/installed/%TRIPLET%/tools/python3/python.exe ^
|
||||||
|
-DPYTHON3_PACKAGES_PATH=bin/Lib/site-packages ^
|
||||||
|
-DBUILD_opencv_java_bindings_generator=OFF ^
|
||||||
|
-DWITH_CUDA=ON ^
|
||||||
|
-DWITH_VTK=OFF ^
|
||||||
|
-DWITH_TBB=ON || exit /b !errorlevel!
|
||||||
|
cmake --build build --config Release --target install || exit /b !errorlevel!
|
||||||
|
:: move cv2 package under tools/python3
|
||||||
|
robocopy "%FINAL_EXPORT_PATH%\installed\%TRIPLET%\bin\Lib" "%FINAL_EXPORT_PATH%\installed\%TRIPLET%\tools\python3\Lib" /E /MOVE /NFL /NDL /NJH /NC /NS /NP
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
|
||||||
|
:: 5. ZIP the folder
|
||||||
|
echo [+] Creating final package with 7-Zip...
|
||||||
|
:: Rip off pdb files
|
||||||
|
cd /d "%FINAL_EXPORT_PATH%"
|
||||||
|
del /s /q /f *.pdb >nul 2>&1
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
set "FINAL_ZIP=%TARGET_NAME%.7z"
|
||||||
|
|
||||||
|
:: compress contents without the root folder
|
||||||
|
"%SEVENZIP_EXE%" u -t7z -mx9 "%FINAL_ZIP%" "%FINAL_EXPORT_PATH%\*" -up0q0 || exit /b !errorlevel!
|
||||||
|
|
||||||
|
if !errorlevel! EQU 0 (
|
||||||
|
echo [!] Success! Package created at %FINAL_ZIP%
|
||||||
|
) else (
|
||||||
|
echo [X] 7-Zip failed with error code !errorlevel!
|
||||||
|
)
|
||||||
|
|
||||||
|
:: Example building rtabmap with opencv cuda and libtorch afterwards
|
||||||
|
goto :EndComment
|
||||||
|
|
||||||
|
:: Set path of unzipped deps
|
||||||
|
set VCPKG_UNZIPPED_EXPORT_PATH=
|
||||||
|
|
||||||
|
set TRIPLET=x64-windows-release
|
||||||
|
set PATH=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\%TRIPLET%\bin;%PATH%
|
||||||
|
set PATH=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\%TRIPLET%\tools\python3;%PATH%
|
||||||
|
set PATH=%CUDA_PATH%\bin;%PATH%
|
||||||
|
set PATH=%CUDA_PATH%\bin\x64;%PATH%
|
||||||
|
set PATH=%CUDA_PATH%\extras\CUPTI\lib64;%PATH%
|
||||||
|
set PATH=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\%TRIPLET%\tools\python3\Lib\site-packages\torch\lib;%PATH%
|
||||||
|
set PATH=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\%TRIPLET%\tools\python3\Lib\site-packages\numpy.libs;%PATH%
|
||||||
|
|
||||||
|
:: Other dependencies
|
||||||
|
|
||||||
|
:: For ZED, modify zed-config.cmake and remove all dependencies
|
||||||
|
set PATH=%PATH%;%ZED_SDK_ROOT_DIR%\bin
|
||||||
|
|
||||||
|
:: For kinect 4 windows SDK v2, move kinect20.dll from system32 to KINECTSDK20_DIR\bin
|
||||||
|
:: For kinect 4 windows SDK v1, move kinect10.dll and KinectAudio10.dll to KINECTSDK20_DIR\bin
|
||||||
|
set PATH=%PATH%;%KINECTSDK20_DIR%\bin
|
||||||
|
|
||||||
|
cmake -B build_cuda -GNinja ^
|
||||||
|
-DCMAKE_BUILD_TYPE=Release ^
|
||||||
|
-DBUILD_AS_BUNDLE=ON ^
|
||||||
|
-DWITH_PYTHON=ON ^
|
||||||
|
-DWITH_TORCH=ON ^
|
||||||
|
-DWITH_ZED=ON ^
|
||||||
|
-DVCPKG_MANIFEST_INSTALL=OFF ^
|
||||||
|
-DVCPKG_TARGET_TRIPLET=%TRIPLET% ^
|
||||||
|
-DVCPKG_INSTALLED_DIR="%VCPKG_UNZIPPED_EXPORT_PATH%/installed" ^
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=%VCPKG_UNZIPPED_EXPORT_PATH%/scripts/buildsystems/vcpkg.cmake ^
|
||||||
|
-DGTSAM_DIR=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\%TRIPLET%\CMake ^
|
||||||
|
-DTorch_DIR=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\%TRIPLET%\tools\python3\Lib\site-packages\torch\share\cmake\Torch
|
||||||
|
|
||||||
|
cmake --build build_cuda --config Release --target package
|
||||||
|
|
||||||
|
:: Generate superpoint weights (from share directory of the installed package)
|
||||||
|
curl -L -O "https://raw.githubusercontent.com/magicleap/SuperPointPretrainedNetwork/master/demo_superpoint.py"
|
||||||
|
curl -L -O "https://github.com/magicleap/SuperPointPretrainedNetwork/raw/refs/heads/master/superpoint_v1.pth"
|
||||||
|
..\bin\python.exe rtabmap_trace_superpoint.py
|
||||||
|
|
||||||
|
:EndComment
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
# - Find cuVSLAM library (https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_visual_slam)
|
||||||
|
#
|
||||||
|
# CUVSLAM_ROOT_DIR environment variable can be set to find the library.
|
||||||
|
#
|
||||||
|
# It sets the following variables:
|
||||||
|
# CUVSLAM_FOUND - Set to false, or undefined, if cuVSLAM isn't found.
|
||||||
|
# CUVSLAM_VERSION - The version of cuVSLAM found (e.g., "14.0.0").
|
||||||
|
# CUVSLAM_INCLUDE_DIRS - The cuVSLAM include directory.
|
||||||
|
# CUVSLAM_LIBRARIES - The cuVSLAM library to link against.
|
||||||
|
|
||||||
|
find_package(CUDA REQUIRED)
|
||||||
|
find_package(Eigen3 REQUIRED)
|
||||||
|
|
||||||
|
find_path(CUVSLAM_INCLUDE_DIRS
|
||||||
|
NAMES cuvslam.h
|
||||||
|
PATHS
|
||||||
|
/usr/include
|
||||||
|
/usr/local/include
|
||||||
|
/opt/cuvslam/include
|
||||||
|
/opt/ros/humble/share/isaac_ros_nitros/cuvslam/include
|
||||||
|
$ENV{CUVSLAM_ROOT}/include
|
||||||
|
$ENV{CUVSLAM_ROOT_DIR}/include
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(CUVSLAM_LIBRARY
|
||||||
|
NAMES cuvslam
|
||||||
|
PATHS
|
||||||
|
/usr/lib
|
||||||
|
/usr/local/lib
|
||||||
|
/opt/cuvslam/lib
|
||||||
|
/opt/ros/humble/share/isaac_ros_nitros/cuvslam/lib
|
||||||
|
$ENV{CUVSLAM_ROOT}/lib
|
||||||
|
$ENV{CUVSLAM_ROOT_DIR}/lib
|
||||||
|
)
|
||||||
|
|
||||||
|
if(CUVSLAM_INCLUDE_DIRS AND CUVSLAM_LIBRARY)
|
||||||
|
# Extract version from cuvslam.h header
|
||||||
|
file(STRINGS "${CUVSLAM_INCLUDE_DIRS}/cuvslam.h" CUVSLAM_VERSION_MAJOR_LINE
|
||||||
|
REGEX "^#define CUVSLAM_API_VERSION_MAJOR")
|
||||||
|
file(STRINGS "${CUVSLAM_INCLUDE_DIRS}/cuvslam.h" CUVSLAM_VERSION_MINOR_LINE
|
||||||
|
REGEX "^#define CUVSLAM_API_VERSION_MINOR")
|
||||||
|
|
||||||
|
if(CUVSLAM_VERSION_MAJOR_LINE AND CUVSLAM_VERSION_MINOR_LINE)
|
||||||
|
string(REGEX MATCH "[0-9]+" CUVSLAM_VERSION_MAJOR "${CUVSLAM_VERSION_MAJOR_LINE}")
|
||||||
|
string(REGEX MATCH "[0-9]+" CUVSLAM_VERSION_MINOR "${CUVSLAM_VERSION_MINOR_LINE}")
|
||||||
|
set(CUVSLAM_VERSION "${CUVSLAM_VERSION_MAJOR}.${CUVSLAM_VERSION_MINOR}.0")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(CUVSLAM_LIBRARIES
|
||||||
|
${CUVSLAM_LIBRARY}
|
||||||
|
${CUDA_LIBRARIES}
|
||||||
|
# Eigen3 is header-only, so we don't need to link to it
|
||||||
|
)
|
||||||
|
set(CUVSLAM_INCLUDE_DIRS
|
||||||
|
${CUVSLAM_INCLUDE_DIRS}
|
||||||
|
${CUDA_INCLUDE_DIRS}
|
||||||
|
${EIGEN3_INCLUDE_DIR}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Version compatibility check - cuVSLAM only guarantees API compatibility within the same major version
|
||||||
|
set(CUVSLAM_VERSION_MISMATCH_REASON "")
|
||||||
|
if(CuVSLAM_FIND_VERSION AND CUVSLAM_VERSION)
|
||||||
|
string(REGEX MATCH "^[0-9]+" REQUESTED_MAJOR_VERSION "${CuVSLAM_FIND_VERSION}")
|
||||||
|
if(NOT CUVSLAM_VERSION_MAJOR EQUAL REQUESTED_MAJOR_VERSION)
|
||||||
|
set(CUVSLAM_VERSION_MISMATCH_REASON "Major version mismatch: found ${CUVSLAM_VERSION_MAJOR}.x but requested ${REQUESTED_MAJOR_VERSION}.x.\ncuVSLAM only guarantees API compatibility within the same major version.\nPlease install cuVSLAM ${REQUESTED_MAJOR_VERSION}.x or update CMakeLists.txt to request version ${CUVSLAM_VERSION_MAJOR}.0.0")
|
||||||
|
|
||||||
|
if(CuVSLAM_FIND_REQUIRED)
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"cuVSLAM major version mismatch: found version ${CUVSLAM_VERSION} but version ${CuVSLAM_FIND_VERSION} is required.\n"
|
||||||
|
"cuVSLAM only guarantees API compatibility within the same major version.\n"
|
||||||
|
"Found major version ${CUVSLAM_VERSION_MAJOR} is not compatible with requested major version ${REQUESTED_MAJOR_VERSION}.\n"
|
||||||
|
"Please install cuVSLAM ${REQUESTED_MAJOR_VERSION}.x or update CMakeLists.txt to request version ${CUVSLAM_VERSION_MAJOR}.x."
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
# Clear the found variables to indicate incompatibility
|
||||||
|
unset(CUVSLAM_LIBRARIES)
|
||||||
|
unset(CUVSLAM_INCLUDE_DIRS)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Handle the QUIET and REQUIRED arguments
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(CuVSLAM
|
||||||
|
FOUND_VAR CUVSLAM_FOUND
|
||||||
|
REQUIRED_VARS CUVSLAM_LIBRARIES CUVSLAM_INCLUDE_DIRS
|
||||||
|
VERSION_VAR CUVSLAM_VERSION
|
||||||
|
REASON_FAILURE_MESSAGE "${CUVSLAM_VERSION_MISMATCH_REASON}"
|
||||||
|
HANDLE_COMPONENTS
|
||||||
|
)
|
||||||
|
|
||||||
|
if(CUVSLAM_FOUND)
|
||||||
|
# Create imported target for modern CMake usage
|
||||||
|
if(NOT TARGET cuvslam::cuvslam)
|
||||||
|
add_library(cuvslam::cuvslam UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(cuvslam::cuvslam PROPERTIES
|
||||||
|
IMPORTED_LOCATION "${CUVSLAM_LIBRARY}"
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "${CUVSLAM_INCLUDE_DIRS}"
|
||||||
|
INTERFACE_LINK_LIBRARIES "${CUVSLAM_LIBRARIES};Eigen3::Eigen"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
mark_as_advanced(CUVSLAM_INCLUDE_DIRS CUVSLAM_LIBRARY)
|
||||||
@@ -27,10 +27,10 @@
|
|||||||
|
|
||||||
if(NOT Eigen3_FIND_VERSION)
|
if(NOT Eigen3_FIND_VERSION)
|
||||||
if(NOT Eigen3_FIND_VERSION_MAJOR)
|
if(NOT Eigen3_FIND_VERSION_MAJOR)
|
||||||
set(Eigen3_FIND_VERSION_MAJOR 2)
|
set(Eigen3_FIND_VERSION_MAJOR 3)
|
||||||
endif()
|
endif()
|
||||||
if(NOT Eigen3_FIND_VERSION_MINOR)
|
if(NOT Eigen3_FIND_VERSION_MINOR)
|
||||||
set(Eigen3_FIND_VERSION_MINOR 91)
|
set(Eigen3_FIND_VERSION_MINOR 0)
|
||||||
endif()
|
endif()
|
||||||
if(NOT Eigen3_FIND_VERSION_PATCH)
|
if(NOT Eigen3_FIND_VERSION_PATCH)
|
||||||
set(Eigen3_FIND_VERSION_PATCH 0)
|
set(Eigen3_FIND_VERSION_PATCH 0)
|
||||||
|
|||||||
+27
-16
@@ -26,6 +26,10 @@ FIND_FILE(G2O_FACTORY_FILE g2o/core/factory.h
|
|||||||
PATHS ${G2O_INCLUDE_DIR}
|
PATHS ${G2O_INCLUDE_DIR}
|
||||||
NO_DEFAULT_PATH)
|
NO_DEFAULT_PATH)
|
||||||
|
|
||||||
|
FIND_FILE(G2O_SBA_UTILS_FILE g2o/types/sba/sba_utils.h
|
||||||
|
PATHS ${G2O_INCLUDE_DIR}
|
||||||
|
NO_DEFAULT_PATH)
|
||||||
|
|
||||||
#ifdef G2O_NUMBER_FORMAT_STR
|
#ifdef G2O_NUMBER_FORMAT_STR
|
||||||
#define G2O_CPP11 // we assume that if G2O_NUMBER_FORMAT_STR is defined, this is the new g2o code with c++11 interface
|
#define G2O_CPP11 // we assume that if G2O_NUMBER_FORMAT_STR is defined, this is the new g2o code with c++11 interface
|
||||||
#endif
|
#endif
|
||||||
@@ -97,16 +101,16 @@ IF(G2O_STUFF_LIBRARY AND G2O_CORE_LIBRARY AND G2O_INCLUDE_DIR AND G2O_CONFIG_FIL
|
|||||||
${G2O_TYPES_SBA}
|
${G2O_TYPES_SBA}
|
||||||
${G2O_STUFF_LIBRARY})
|
${G2O_STUFF_LIBRARY})
|
||||||
|
|
||||||
IF(CSPARSE_FOUND)
|
IF(CSPARSE_FOUND AND G2O_SOLVER_CSPARSE AND G2O_SOLVER_CSPARSE_EXTENSION)
|
||||||
SET(G2O_INCLUDE_DIRS
|
SET(G2O_INCLUDE_DIRS
|
||||||
${G2O_INCLUDE_DIRS}
|
${G2O_INCLUDE_DIRS}
|
||||||
${CSPARSE_INCLUDE_DIR})
|
${CSPARSE_INCLUDE_DIR})
|
||||||
SET(G2O_LIBRARIES
|
SET(G2O_LIBRARIES
|
||||||
${G2O_LIBRARIES}
|
${G2O_LIBRARIES}
|
||||||
${G2O_SOLVER_CSPARSE}
|
${G2O_SOLVER_CSPARSE}
|
||||||
${G2O_SOLVER_CSPARSE_EXTENSION}
|
${G2O_SOLVER_CSPARSE_EXTENSION}
|
||||||
${CSPARSE_LIBRARY})
|
${CSPARSE_LIBRARY})
|
||||||
ENDIF(CSPARSE_FOUND)
|
ENDIF(CSPARSE_FOUND AND G2O_SOLVER_CSPARSE AND G2O_SOLVER_CSPARSE_EXTENSION)
|
||||||
|
|
||||||
IF(G2O_SOLVER_CHOLMOD)
|
IF(G2O_SOLVER_CHOLMOD)
|
||||||
SET(G2O_INCLUDE_DIRS
|
SET(G2O_INCLUDE_DIRS
|
||||||
@@ -118,22 +122,29 @@ IF(G2O_STUFF_LIBRARY AND G2O_CORE_LIBRARY AND G2O_INCLUDE_DIR AND G2O_CONFIG_FIL
|
|||||||
${CHOLMOD_LIB})
|
${CHOLMOD_LIB})
|
||||||
ENDIF(G2O_SOLVER_CHOLMOD)
|
ENDIF(G2O_SOLVER_CHOLMOD)
|
||||||
|
|
||||||
FILE(READ ${G2O_CONFIG_FILE} TMPTXT)
|
FILE(READ ${G2O_FACTORY_FILE} TMPTXT)
|
||||||
STRING(FIND "${TMPTXT}" "G2O_NUMBER_FORMAT_STR" matchres)
|
STRING(FIND "${TMPTXT}" "shared_ptr" matchres)
|
||||||
IF(${matchres} EQUAL -1)
|
IF(${matchres} EQUAL -1)
|
||||||
MESSAGE(STATUS "Old g2o version detected with c++03 interface (config file: ${G2O_CONFIG_FILE}).")
|
FILE(READ ${G2O_CONFIG_FILE} TMPTXT)
|
||||||
SET(G2O_CPP11 0)
|
STRING(FIND "${TMPTXT}" "G2O_NUMBER_FORMAT_STR" matchres)
|
||||||
ELSE()
|
|
||||||
MESSAGE(WARNING "Latest g2o version detected with c++11 interface (config file: ${G2O_CONFIG_FILE}). Make sure g2o is built with \"-DBUILD_WITH_MARCH_NATIVE=OFF\" to avoid segmentation faults caused by Eigen.")
|
|
||||||
FILE(READ ${G2O_FACTORY_FILE} TMPTXT)
|
|
||||||
STRING(FIND "${TMPTXT}" "shared_ptr" matchres)
|
|
||||||
IF(${matchres} EQUAL -1)
|
IF(${matchres} EQUAL -1)
|
||||||
|
MESSAGE(STATUS "Old g2o version detected with c++03 interface (config file: ${G2O_CONFIG_FILE}).")
|
||||||
|
SET(G2O_CPP11 0)
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(WARNING "Latest g2o version detected with c++11 interface (config file: ${G2O_CONFIG_FILE}). Make sure g2o is built with \"-DBUILD_WITH_MARCH_NATIVE=OFF\" to avoid segmentation faults caused by Eigen.")
|
||||||
MESSAGE(STATUS "Old g2o factory version detected without shared ptr (factory file: ${G2O_FACTORY_FILE}).")
|
MESSAGE(STATUS "Old g2o factory version detected without shared ptr (factory file: ${G2O_FACTORY_FILE}).")
|
||||||
SET(G2O_CPP11 2)
|
SET(G2O_CPP11 2)
|
||||||
ELSE()
|
|
||||||
MESSAGE(STATUS "Latest g2o factory version detected with shared ptr (factory file: ${G2O_FACTORY_FILE}).")
|
|
||||||
SET(G2O_CPP11 1)
|
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(WARNING "Latest g2o version detected with c++11 interface (config file: ${G2O_CONFIG_FILE}). Make sure g2o is built with \"-DBUILD_WITH_MARCH_NATIVE=OFF\" to avoid segmentation faults caused by Eigen.")
|
||||||
|
MESSAGE(STATUS "Latest g2o factory version detected with shared ptr (factory file: ${G2O_FACTORY_FILE}).")
|
||||||
|
SET(G2O_CPP11 1)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(G2O_SBA_UTILS_FILE)
|
||||||
|
SET(G2O_WITH_SBA_UTILS 1)
|
||||||
|
ELSE()
|
||||||
|
SET(G2O_WITH_SBA_UTILS 0)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
SET(G2O_FOUND "YES")
|
SET(G2O_FOUND "YES")
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
find_path(ORB_SLAM_INCLUDE_DIR NAMES System.h PATHS $ENV{ORB_SLAM_ROOT_DIR}/include)
|
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_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_library(ORB_SLAM3_LIBRARY NAMES ORB_SLAM3 PATHS $ENV{ORB_SLAM_ROOT_DIR}/lib)
|
||||||
|
find_path(DBoW2_INCLUDE_DIR NAMES DBoW2/BowVector.h PATHS $ENV{ORB_SLAM_ROOT_DIR}/Thirdparty/DBoW2 NO_DEFAULT_PATH)
|
||||||
find_path(g2o_INCLUDE_DIR NAMES g2o/core/sparse_optimizer.h PATHS $ENV{ORB_SLAM_ROOT_DIR}/Thirdparty/g2o NO_DEFAULT_PATH)
|
find_path(g2o_INCLUDE_DIR NAMES g2o/core/sparse_optimizer.h PATHS $ENV{ORB_SLAM_ROOT_DIR}/Thirdparty/g2o NO_DEFAULT_PATH)
|
||||||
find_path(sophus_INCLUDE_DIR NAMES sophus/se3.hpp PATHS $ENV{ORB_SLAM_ROOT_DIR}/Thirdparty/Sophus NO_DEFAULT_PATH)
|
find_path(sophus_INCLUDE_DIR NAMES sophus/se3.hpp PATHS $ENV{ORB_SLAM_ROOT_DIR}/Thirdparty/Sophus NO_DEFAULT_PATH)
|
||||||
find_library(g2o_LIBRARY NAMES g2o PATHS $ENV{ORB_SLAM_ROOT_DIR}/Thirdparty/g2o/lib NO_DEFAULT_PATH)
|
find_library(g2o_LIBRARY NAMES g2o PATHS $ENV{ORB_SLAM_ROOT_DIR}/Thirdparty/g2o/lib NO_DEFAULT_PATH)
|
||||||
@@ -22,9 +23,9 @@ IF(ORB_SLAM2_LIBRARY)
|
|||||||
ELSEIF(ORB_SLAM3_LIBRARY)
|
ELSEIF(ORB_SLAM3_LIBRARY)
|
||||||
SET(ORB_SLAM_VERSION 3)
|
SET(ORB_SLAM_VERSION 3)
|
||||||
SET(ORB_SLAM_LIBRARY ${ORB_SLAM3_LIBRARY})
|
SET(ORB_SLAM_LIBRARY ${ORB_SLAM3_LIBRARY})
|
||||||
IF(g2o_INCLUDE_DIR AND sophus_INCLUDE_DIR) # ORB_SLAM3 v1
|
IF(g2o_INCLUDE_DIR AND sophus_INCLUDE_DIR AND DBoW2_INCLUDE_DIR) # ORB_SLAM3 v1
|
||||||
SET(g2o_INCLUDE_DIR ${g2o_INCLUDE_DIR} ${sophus_INCLUDE_DIR})
|
SET(g2o_INCLUDE_DIR ${g2o_INCLUDE_DIR} ${sophus_INCLUDE_DIR} ${DBoW2_INCLUDE_DIR} $ENV{ORB_SLAM_ROOT_DIR})
|
||||||
ENDIF(g2o_INCLUDE_DIR AND sophus_INCLUDE_DIR)
|
ENDIF(g2o_INCLUDE_DIR AND sophus_INCLUDE_DIR AND DBoW2_INCLUDE_DIR)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF (ORB_SLAM_INCLUDE_DIR AND ORB_SLAM_LIBRARY AND DBoW2_LIBRARY AND g2o_INCLUDE_DIR AND g2o_LIBRARY)
|
IF (ORB_SLAM_INCLUDE_DIR AND ORB_SLAM_LIBRARY AND DBoW2_LIBRARY AND g2o_INCLUDE_DIR AND g2o_LIBRARY)
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# Find OpenVINS
|
||||||
|
#
|
||||||
|
# We search for a vins installation in ROS/ROS2 first, then fallback on
|
||||||
|
# ros-free library in common install paths
|
||||||
|
|
||||||
|
FIND_PACKAGE(ov_msckf QUIET)
|
||||||
|
IF(ov_msckf_FOUND)
|
||||||
|
# On ROS2, the indirect includes and libraries
|
||||||
|
# are not forwarded by ov_msckf target, append them manually
|
||||||
|
FIND_PACKAGE(ov_core)
|
||||||
|
FIND_PACKAGE(ov_init)
|
||||||
|
IF(ov_msckf_FOUND AND ov_core_FOUND AND ov_init_FOUND)
|
||||||
|
SET(OpenVINS_FOUND TRUE)
|
||||||
|
SET(OpenVINS_INCLUDE_DIRS
|
||||||
|
${ov_msckf_INCLUDE_DIRS}
|
||||||
|
${ov_core_INCLUDE_DIRS}
|
||||||
|
${ov_init_INCLUDE_DIRS})
|
||||||
|
SET(OpenVINS_LIBRARIES
|
||||||
|
${ov_msckf_LIBRARIES}
|
||||||
|
${ov_core_LIBRARIES}
|
||||||
|
${ov_init_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
ELSE()
|
||||||
|
find_path(OpenVINS_INCLUDE_DIR NAMES core/VioManager.h PATH_SUFFIXES open_vins)
|
||||||
|
find_library(OpenVINS_LIBRARY NAMES ov_msckf_lib)
|
||||||
|
IF (OpenVINS_INCLUDE_DIR AND OpenVINS_LIBRARY)
|
||||||
|
SET(OpenVINS_FOUND TRUE)
|
||||||
|
SET(OpenVINS_INCLUDE_DIRS ${OpenVINS_INCLUDE_DIR})
|
||||||
|
SET(OpenVINS_LIBRARIES ${OpenVINS_LIBRARY})
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF (OpenVINS_FOUND)
|
||||||
|
# show which OpenVINS was found only if not quiet
|
||||||
|
IF (NOT OpenVINS_FIND_QUIETLY)
|
||||||
|
MESSAGE(STATUS "Found OpenVINS: ${OpenVINS_LIBRARIES} ${OpenVINS_INCLUDE_DIRS}")
|
||||||
|
ENDIF (NOT OpenVINS_FIND_QUIETLY)
|
||||||
|
ELSE (OpenVINS_FOUND)
|
||||||
|
# fatal error if OpenVINS is required but not found
|
||||||
|
IF (OpenVINS_FIND_REQUIRED)
|
||||||
|
MESSAGE(FATAL_ERROR "Could not find OpenVINS")
|
||||||
|
ENDIF (OpenVINS_FIND_REQUIRED)
|
||||||
|
ENDIF (OpenVINS_FOUND)
|
||||||
|
|
||||||
@@ -10,8 +10,6 @@
|
|||||||
<string>${MACOSX_BUNDLE_INFO_STRING}</string>
|
<string>${MACOSX_BUNDLE_INFO_STRING}</string>
|
||||||
<key>CFBundleIconFile</key>
|
<key>CFBundleIconFile</key>
|
||||||
<string>${MACOSX_BUNDLE_ICON_FILE}</string>
|
<string>${MACOSX_BUNDLE_ICON_FILE}</string>
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
|
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
<string>6.0</string>
|
<string>6.0</string>
|
||||||
<key>CFBundleLongVersionString</key>
|
<key>CFBundleLongVersionString</key>
|
||||||
@@ -32,6 +30,14 @@
|
|||||||
<true/>
|
<true/>
|
||||||
<key>NSHumanReadableCopyright</key>
|
<key>NSHumanReadableCopyright</key>
|
||||||
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
|
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
|
||||||
|
<key>com.apple.security.app-sandbox</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.files.downloads.read-write</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.files.downloads.read-only</key>
|
||||||
|
<false/>
|
||||||
|
<key>com.apple.security.device.camera</key>
|
||||||
|
<true/>
|
||||||
|
|
||||||
<!-- File type associations -->
|
<!-- File type associations -->
|
||||||
<key>CFBundleDocumentTypes</key>
|
<key>CFBundleDocumentTypes</key>
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ public:
|
|||||||
SensorData takeImage(SensorCaptureInfo * info = 0) {return takeData(info);}
|
SensorData takeImage(SensorCaptureInfo * info = 0) {return takeData(info);}
|
||||||
float getImageRate() const {return getFrameRate();}
|
float getImageRate() const {return getFrameRate();}
|
||||||
void setImageRate(float imageRate) {setFrameRate(imageRate);}
|
void setImageRate(float imageRate) {setFrameRate(imageRate);}
|
||||||
void setInterIMUPublishing(bool enabled, IMUFilter * filter = 0); // Take ownership of filter
|
void setInterIMUPublishing(bool enabled, IMUFilter * filter = 0, bool baseFrameConversion = false); // Take ownership of filter
|
||||||
bool isInterIMUPublishing() const {return publishInterIMU_;}
|
bool isInterIMUPublishing() const {return publishInterIMU_;}
|
||||||
|
|
||||||
bool initFromFile(const std::string & calibrationPath);
|
bool initFromFile(const std::string & calibrationPath);
|
||||||
@@ -73,6 +73,7 @@ private:
|
|||||||
private:
|
private:
|
||||||
IMUFilter * imuFilter_;
|
IMUFilter * imuFilter_;
|
||||||
bool publishInterIMU_;
|
bool publishInterIMU_;
|
||||||
|
bool imuBaseFrameConversion_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -38,3 +38,4 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <rtabmap/core/camera/CameraRGBDImages.h>
|
#include <rtabmap/core/camera/CameraRGBDImages.h>
|
||||||
#include <rtabmap/core/camera/CameraK4A.h>
|
#include <rtabmap/core/camera/CameraK4A.h>
|
||||||
#include <rtabmap/core/camera/CameraSeerSense.h>
|
#include <rtabmap/core/camera/CameraSeerSense.h>
|
||||||
|
#include <rtabmap/core/camera/CameraOrbbecSDK.h>
|
||||||
|
|||||||
@@ -129,11 +129,12 @@ public:
|
|||||||
std::vector<std::vector<Eigen::Vector2f> > * texCoords = 0,
|
std::vector<std::vector<Eigen::Vector2f> > * texCoords = 0,
|
||||||
#endif
|
#endif
|
||||||
cv::Mat * textures = 0) const;
|
cv::Mat * textures = 0) const;
|
||||||
|
void saveFlannIndex(const std::vector<unsigned char> & indexData) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Mutex-protected methods of abstract versions below
|
// Mutex-protected methods of abstract versions below
|
||||||
|
|
||||||
bool openConnection(const std::string & url, bool overwritten = false);
|
bool openConnection(const std::string & url, bool overwritten = false, bool readOnly = 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;
|
||||||
unsigned long getMemoryUsed() const; // In bytes
|
unsigned long getMemoryUsed() const; // In bytes
|
||||||
@@ -161,19 +162,20 @@ public:
|
|||||||
void executeNoResult(const std::string & sql) const;
|
void executeNoResult(const std::string & sql) const;
|
||||||
|
|
||||||
// Load objects
|
// Load objects
|
||||||
void load(VWDictionary * dictionary, bool lastStateOnly = true) const;
|
void load(VWDictionary & dictionary, bool lastStateOnly = true) const;
|
||||||
void loadLastNodes(std::list<Signature *> & signatures) const; // returned signatures must be freed after usage
|
void loadLastNodes(std::list<Signature *> & signatures, bool loadWordIdsOnly = false) const; // returned signatures must be freed after usage
|
||||||
Signature * loadSignature(int id, bool * loadedFromTrash = 0); // returned signature must be freed after usage, call loadSignatures() instead if more than one signature should be loaded
|
Signature * loadSignature(int id, bool * loadedFromTrash = 0); // returned signature must be freed after usage, call loadSignatures() instead if more than one signature should be loaded
|
||||||
void loadSignatures(const std::list<int> & ids, std::list<Signature *> & signatures, std::set<int> * loadedFromTrash = 0); // returned signatures must be freed after usage
|
void loadSignatures(const std::list<int> & ids, std::list<Signature *> & signatures, std::set<int> * loadedFromTrash = 0, bool loadWordIdsOnly = false); // returned signatures must be freed after usage
|
||||||
void loadWords(const std::set<int> & wordIds, std::list<VisualWord *> & vws); // returned words must be freed after usage
|
void loadWords(const std::set<int> & wordIds, std::list<VisualWord *> & vws); // returned words must be freed after usage
|
||||||
|
|
||||||
// Specific queries...
|
// Specific queries...
|
||||||
void loadNodeData(Signature * signature, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
|
void loadNodeData(Signature & signature, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
|
||||||
void loadNodeData(std::list<Signature *> & signatures, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
|
void loadNodeData(std::list<Signature *> & signatures, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
|
||||||
void getNodeData(int signatureId, SensorData & data, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
|
void getNodeData(int signatureId, SensorData & data, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
|
||||||
bool getCalibration(int signatureId, std::vector<CameraModel> & models, std::vector<StereoCameraModel> & stereoModels) const;
|
bool getCalibration(int signatureId, std::vector<CameraModel> & models, std::vector<StereoCameraModel> & stereoModels) const;
|
||||||
bool getLaserScanInfo(int signatureId, LaserScan & info) const;
|
bool getLaserScanInfo(int signatureId, LaserScan & info) const;
|
||||||
bool getNodeInfo(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps, EnvSensors & sensors) const;
|
bool getNodeInfo(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps, EnvSensors & sensors) const;
|
||||||
|
void getLocalFeatures(int signatureId, std::multimap<int, int> & words, std::vector<cv::KeyPoint> & keypoints, std::vector<cv::Point3f> & points, cv::Mat & descriptors) const;
|
||||||
void loadLinks(int signatureId, std::multimap<int, Link> & links, Link::Type type = Link::kUndef) const;
|
void loadLinks(int signatureId, std::multimap<int, Link> & links, Link::Type type = Link::kUndef) const;
|
||||||
void getWeight(int signatureId, int & weight) const;
|
void getWeight(int signatureId, int & weight) const;
|
||||||
void getLastNodeIds(std::set<int> & ids) const;
|
void getLastNodeIds(std::set<int> & ids) const;
|
||||||
@@ -191,7 +193,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
DBDriver(const ParametersMap & parameters = ParametersMap());
|
DBDriver(const ParametersMap & parameters = ParametersMap());
|
||||||
|
|
||||||
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false) = 0;
|
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false, bool readOnly = 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 unsigned long getMemoryUsedQuery() const = 0; // In bytes
|
virtual unsigned long getMemoryUsedQuery() const = 0; // In bytes
|
||||||
@@ -274,11 +276,12 @@ protected:
|
|||||||
std::vector<std::vector<Eigen::Vector2f> > * texCoords,
|
std::vector<std::vector<Eigen::Vector2f> > * texCoords,
|
||||||
#endif
|
#endif
|
||||||
cv::Mat * textures) const = 0;
|
cv::Mat * textures) const = 0;
|
||||||
|
virtual void saveFlannIndexQuery(const std::vector<unsigned char> & indexData) const = 0;
|
||||||
|
|
||||||
// Load objects
|
// Load objects
|
||||||
virtual void loadQuery(VWDictionary * dictionary, bool lastStateOnly = true) const = 0;
|
virtual void loadQuery(VWDictionary & dictionary, bool lastStateOnly = true) const = 0;
|
||||||
virtual void loadLastNodesQuery(std::list<Signature *> & signatures) const = 0;
|
virtual void loadLastNodesQuery(std::list<Signature *> & signatures, bool loadWordIdsOnly) const = 0;
|
||||||
virtual void loadSignaturesQuery(const std::list<int> & ids, std::list<Signature *> & signatures) const = 0;
|
virtual void loadSignaturesQuery(const std::list<int> & ids, std::list<Signature *> & signatures, bool loadWordIdsOnly) const = 0;
|
||||||
virtual void loadWordsQuery(const std::set<int> & wordIds, std::list<VisualWord *> & vws) const = 0;
|
virtual void loadWordsQuery(const std::set<int> & wordIds, std::list<VisualWord *> & vws) const = 0;
|
||||||
virtual void loadLinksQuery(int signatureId, std::multimap<int, Link> & links, Link::Type type = Link::kUndef) const = 0;
|
virtual void loadLinksQuery(int signatureId, std::multimap<int, Link> & links, Link::Type type = Link::kUndef) const = 0;
|
||||||
|
|
||||||
@@ -286,6 +289,7 @@ protected:
|
|||||||
virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, std::vector<StereoCameraModel> & stereoModels) const = 0;
|
virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, std::vector<StereoCameraModel> & stereoModels) const = 0;
|
||||||
virtual bool getLaserScanInfoQuery(int signatureId, LaserScan & info) const = 0;
|
virtual bool getLaserScanInfoQuery(int signatureId, LaserScan & info) const = 0;
|
||||||
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps, EnvSensors & sensors) const = 0;
|
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps, EnvSensors & sensors) const = 0;
|
||||||
|
virtual void getLocalFeaturesQuery(int signatureId, std::multimap<int, int> & words, std::vector<cv::KeyPoint> & keypoints, std::vector<cv::Point3f> & points, cv::Mat & descriptors) const = 0;
|
||||||
virtual void getLastNodeIdsQuery(std::set<int> & ids) const = 0;
|
virtual void getLastNodeIdsQuery(std::set<int> & ids) const = 0;
|
||||||
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures, bool ignoreIntermediateNodes) const = 0;
|
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures, bool ignoreIntermediateNodes) const = 0;
|
||||||
virtual void getAllOdomPosesQuery(std::map<int, Transform> & poses, bool ignoreChildren, bool ignoreIntermediateNodes) const = 0;
|
virtual void getAllOdomPosesQuery(std::map<int, Transform> & poses, bool ignoreChildren, bool ignoreIntermediateNodes) const = 0;
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ public:
|
|||||||
void setTempStore(int tempStore);
|
void setTempStore(int tempStore);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false);
|
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false, bool readOnly = 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 unsigned long getMemoryUsedQuery() const; // In bytes
|
virtual unsigned long getMemoryUsedQuery() const; // In bytes
|
||||||
@@ -135,10 +135,12 @@ protected:
|
|||||||
#endif
|
#endif
|
||||||
cv::Mat * textures) const;
|
cv::Mat * textures) const;
|
||||||
|
|
||||||
|
virtual void saveFlannIndexQuery(const std::vector<unsigned char> & indexData) const;
|
||||||
|
|
||||||
// Load objects
|
// Load objects
|
||||||
virtual void loadQuery(VWDictionary * dictionary, bool lastStateOnly = true) const;
|
virtual void loadQuery(VWDictionary & dictionary, bool lastStateOnly = true) const;
|
||||||
virtual void loadLastNodesQuery(std::list<Signature *> & signatures) const;
|
virtual void loadLastNodesQuery(std::list<Signature *> & signatures, bool loadWordIdsOnly) const;
|
||||||
virtual void loadSignaturesQuery(const std::list<int> & ids, std::list<Signature *> & signatures) const;
|
virtual void loadSignaturesQuery(const std::list<int> & ids, std::list<Signature *> & signatures, bool loadWordIdsOnly) const;
|
||||||
virtual void loadWordsQuery(const std::set<int> & wordIds, std::list<VisualWord *> & vws) const;
|
virtual void loadWordsQuery(const std::set<int> & wordIds, std::list<VisualWord *> & vws) const;
|
||||||
virtual void loadLinksQuery(int signatureId, std::multimap<int, Link> & links, Link::Type type = Link::kUndef) const;
|
virtual void loadLinksQuery(int signatureId, std::multimap<int, Link> & links, Link::Type type = Link::kUndef) const;
|
||||||
|
|
||||||
@@ -146,6 +148,7 @@ protected:
|
|||||||
virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, std::vector<StereoCameraModel> & stereoModels) const;
|
virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, std::vector<StereoCameraModel> & stereoModels) const;
|
||||||
virtual bool getLaserScanInfoQuery(int signatureId, LaserScan & info) const;
|
virtual bool getLaserScanInfoQuery(int signatureId, LaserScan & info) const;
|
||||||
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps, EnvSensors & sensors) const;
|
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps, EnvSensors & sensors) const;
|
||||||
|
virtual void getLocalFeaturesQuery(int signatureId, std::multimap<int, int> & words, std::vector<cv::KeyPoint> & keypoints, std::vector<cv::Point3f> & points, cv::Mat & descriptors) const;
|
||||||
virtual void getLastNodeIdsQuery(std::set<int> & ids) const;
|
virtual void getLastNodeIdsQuery(std::set<int> & ids) const;
|
||||||
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures, bool ignoreIntermediateNodes) const;
|
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures, bool ignoreIntermediateNodes) const;
|
||||||
virtual void getAllOdomPosesQuery(std::map<int, Transform> & poses, bool ignoreChildren, bool ignoreIntermediateNodes) const;
|
virtual void getAllOdomPosesQuery(std::map<int, Transform> & poses, bool ignoreChildren, bool ignoreIntermediateNodes) const;
|
||||||
@@ -190,6 +193,8 @@ private:
|
|||||||
const cv::Point3f & viewpoint) const;
|
const cv::Point3f & viewpoint) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void loadWordsQuery(std::list<Signature *> & signatures) const;
|
||||||
|
void loadWordIdsQuery(std::list<Signature *> & signatures) const;
|
||||||
void loadLinksQuery(std::list<Signature *> & signatures) const;
|
void loadLinksQuery(std::list<Signature *> & signatures) const;
|
||||||
int loadOrSaveDb(sqlite3 *pInMemory, const std::string & fileName, int isSave) const;
|
int loadOrSaveDb(sqlite3 *pInMemory, const std::string & fileName, int isSave) const;
|
||||||
|
|
||||||
|
|||||||
@@ -59,6 +59,8 @@ public:
|
|||||||
int startMapId = 0,
|
int startMapId = 0,
|
||||||
int stopMapId = -1,
|
int stopMapId = -1,
|
||||||
bool priorsIgnored = false,
|
bool priorsIgnored = false,
|
||||||
|
bool imuIgnored = false,
|
||||||
|
bool intermediateNodesAreNormalNodes = false,
|
||||||
const std::vector<Transform> & cameraLocalTransformOverrides = std::vector<Transform>());
|
const std::vector<Transform> & cameraLocalTransformOverrides = std::vector<Transform>());
|
||||||
DBReader(const std::list<std::string> & databasePaths,
|
DBReader(const std::list<std::string> & databasePaths,
|
||||||
float frameRate = 0.0f, // -1 = use Database stamps, 0 = inf
|
float frameRate = 0.0f, // -1 = use Database stamps, 0 = inf
|
||||||
@@ -74,6 +76,8 @@ public:
|
|||||||
int startMapId = 0,
|
int startMapId = 0,
|
||||||
int stopMapId = -1,
|
int stopMapId = -1,
|
||||||
bool priorsIgnored = false,
|
bool priorsIgnored = false,
|
||||||
|
bool imuIgnored = false,
|
||||||
|
bool intermediateNodesAreNormalNodes = false,
|
||||||
const std::vector<Transform> & cameraLocalTransformOverrides = std::vector<Transform>());
|
const std::vector<Transform> & cameraLocalTransformOverrides = std::vector<Transform>());
|
||||||
virtual ~DBReader();
|
virtual ~DBReader();
|
||||||
|
|
||||||
@@ -104,9 +108,11 @@ private:
|
|||||||
int _stopId;
|
int _stopId;
|
||||||
std::vector<unsigned int> _cameraIndices;
|
std::vector<unsigned int> _cameraIndices;
|
||||||
bool _intermediateNodesIgnored;
|
bool _intermediateNodesIgnored;
|
||||||
|
bool _intermediateNodesAreNormalNodes;
|
||||||
bool _landmarksIgnored;
|
bool _landmarksIgnored;
|
||||||
bool _featuresIgnored;
|
bool _featuresIgnored;
|
||||||
bool _priorsIgnored;
|
bool _priorsIgnored;
|
||||||
|
bool _imuIgnored;
|
||||||
int _startMapId;
|
int _startMapId;
|
||||||
int _stopMapId;
|
int _stopMapId;
|
||||||
std::vector<Transform> _cameraLocalTransformOverrides;
|
std::vector<Transform> _cameraLocalTransformOverrides;
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ namespace rtabmap {
|
|||||||
|
|
||||||
class ORBextractor;
|
class ORBextractor;
|
||||||
class SPDetector;
|
class SPDetector;
|
||||||
|
class SPDetectorRpautrat;
|
||||||
|
|
||||||
class Stereo;
|
class Stereo;
|
||||||
#if CV_MAJOR_VERSION < 3
|
#if CV_MAJOR_VERSION < 3
|
||||||
@@ -129,7 +130,8 @@ public:
|
|||||||
kFeatureSurfFreak=12, //new 0.20.4
|
kFeatureSurfFreak=12, //new 0.20.4
|
||||||
kFeatureGfttDaisy=13, //new 0.20.6
|
kFeatureGfttDaisy=13, //new 0.20.6
|
||||||
kFeatureSurfDaisy=14, //new 0.20.6
|
kFeatureSurfDaisy=14, //new 0.20.6
|
||||||
kFeaturePyDetector=15}; //new 0.20.8
|
kFeaturePyDetector=15, //new 0.20.8
|
||||||
|
kFeatureSuperPointRpautrat=16}; // new 0.23.3
|
||||||
|
|
||||||
static std::string typeName(Type type)
|
static std::string typeName(Type type)
|
||||||
{
|
{
|
||||||
@@ -164,6 +166,8 @@ public:
|
|||||||
return "GFTT+Daisy";
|
return "GFTT+Daisy";
|
||||||
case kFeatureSurfDaisy:
|
case kFeatureSurfDaisy:
|
||||||
return "SURF+Daisy";
|
return "SURF+Daisy";
|
||||||
|
case kFeatureSuperPointRpautrat:
|
||||||
|
return "SUPERPOINT-RPAUTRAT";
|
||||||
default:
|
default:
|
||||||
return "Unknown";
|
return "Unknown";
|
||||||
}
|
}
|
||||||
@@ -305,7 +309,8 @@ private:
|
|||||||
bool preciseUpscale_;
|
bool preciseUpscale_;
|
||||||
bool rootSIFT_;
|
bool rootSIFT_;
|
||||||
bool gpu_;
|
bool gpu_;
|
||||||
float guaussianThreshold_;
|
float gaussianThreshold_;
|
||||||
|
float maxGaussianThreshold_;
|
||||||
bool upscale_;
|
bool upscale_;
|
||||||
|
|
||||||
cv::Ptr<CV_SIFT> sift_;
|
cv::Ptr<CV_SIFT> sift_;
|
||||||
@@ -626,6 +631,31 @@ private:
|
|||||||
bool cuda_;
|
bool cuda_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//SuperPointRpautrat
|
||||||
|
class RTABMAP_CORE_EXPORT SuperPointRpautrat : public Feature2D
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SuperPointRpautrat(const ParametersMap & parameters = ParametersMap());
|
||||||
|
virtual ~SuperPointRpautrat();
|
||||||
|
|
||||||
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
|
virtual Feature2D::Type getType() const { return kFeatureSuperPointRpautrat; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat());
|
||||||
|
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
|
||||||
|
|
||||||
|
cv::Ptr<SPDetectorRpautrat> superPoint_;
|
||||||
|
|
||||||
|
std::string superpointWeightsPath_;
|
||||||
|
std::string superpointModelPath_;
|
||||||
|
std::string outputDir_;
|
||||||
|
float threshold_;
|
||||||
|
bool nms_;
|
||||||
|
int minDistance_;
|
||||||
|
bool cuda_;
|
||||||
|
};
|
||||||
|
|
||||||
//GFTT_DAISY
|
//GFTT_DAISY
|
||||||
class RTABMAP_CORE_EXPORT GFTT_DAISY : public GFTT
|
class RTABMAP_CORE_EXPORT GFTT_DAISY : public GFTT
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -37,37 +37,48 @@ namespace rtabmap {
|
|||||||
class RTABMAP_CORE_EXPORT FlannIndex
|
class RTABMAP_CORE_EXPORT FlannIndex
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
// A forward of the internal enum, indexes should match. See src/rtflann/defines.h
|
||||||
|
enum flann_algorithm_t
|
||||||
|
{
|
||||||
|
FLANN_INDEX_LINEAR = 0,
|
||||||
|
FLANN_INDEX_KDTREE = 1,
|
||||||
|
FLANN_INDEX_KDTREE_SINGLE = 4,
|
||||||
|
FLANN_INDEX_LSH = 6,
|
||||||
|
};
|
||||||
|
|
||||||
FlannIndex();
|
FlannIndex();
|
||||||
virtual ~FlannIndex();
|
virtual ~FlannIndex();
|
||||||
|
|
||||||
void release();
|
void release();
|
||||||
|
std::vector<unsigned char> serializeIndex(bool computeChecksum = true) const;
|
||||||
|
|
||||||
size_t indexedFeatures() const;
|
size_t indexedFeatures() const;
|
||||||
|
|
||||||
// return Bytes
|
// return Bytes
|
||||||
size_t memoryUsed() const;
|
size_t 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 buildIndex(
|
||||||
|
flann_algorithm_t algorithm,
|
||||||
const cv::Mat & features,
|
const cv::Mat & features,
|
||||||
bool useDistanceL1 = false,
|
bool useDistanceL1 = false,
|
||||||
float rebalancingFactor = 2.0f);
|
float rebalancingFactor = 2.0f);
|
||||||
void buildKDTreeIndex(
|
// Return false if the indexData doesn't correspond to expected features used and parameters.
|
||||||
const cv::Mat & features,
|
bool loadIndex(
|
||||||
int trees = 4,
|
const std::vector<unsigned char> & indexData,
|
||||||
bool useDistanceL1 = false,
|
flann_algorithm_t algorithm,
|
||||||
float rebalancingFactor = 2.0f);
|
const cv::Mat & features,
|
||||||
void buildKDTreeSingleIndex(
|
bool useDistanceL1 = false,
|
||||||
const cv::Mat & features,
|
float rebalancingFactor = 2.0f,
|
||||||
int leafMaxSize = 10,
|
std::string * errorMsg = NULL);
|
||||||
bool reorder = true,
|
bool loadIndex(
|
||||||
bool useDistanceL1 = false,
|
const unsigned char * indexData,
|
||||||
float rebalancingFactor = 2.0f);
|
size_t indexDataSize,
|
||||||
void buildLSHIndex(
|
flann_algorithm_t algorithm,
|
||||||
const cv::Mat & features,
|
const cv::Mat & features,
|
||||||
unsigned int table_number = 12,
|
bool useDistanceL1 = false,
|
||||||
unsigned int key_size = 20,
|
float rebalancingFactor = 2.0f,
|
||||||
unsigned int multi_probe_level = 2,
|
std::string * errorMsg = NULL);
|
||||||
float rebalancingFactor = 2.0f);
|
|
||||||
|
|
||||||
bool isBuilt();
|
bool isBuilt();
|
||||||
|
|
||||||
@@ -104,9 +115,9 @@ private:
|
|||||||
unsigned int nextIndex_;
|
unsigned int nextIndex_;
|
||||||
int featuresType_;
|
int featuresType_;
|
||||||
int featuresDim_;
|
int featuresDim_;
|
||||||
bool isLSH_;
|
|
||||||
bool useDistanceL1_; // true=EUCLEDIAN_L2 false=MANHATTAN_L1
|
bool useDistanceL1_; // true=EUCLEDIAN_L2 false=MANHATTAN_L1
|
||||||
float rebalancingFactor_;
|
float rebalancingFactor_;
|
||||||
|
flann_algorithm_t algorithm_;
|
||||||
|
|
||||||
// keep feature in memory until the tree is rebuilt
|
// keep feature in memory until the tree is rebuilt
|
||||||
// (in case the word is deleted when removed from the VWDictionary)
|
// (in case the word is deleted when removed from the VWDictionary)
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ public:
|
|||||||
public:
|
public:
|
||||||
virtual ~GlobalMap();
|
virtual ~GlobalMap();
|
||||||
|
|
||||||
|
bool fullUpdateNeeded(const std::map<int, Transform> & poses) const;
|
||||||
bool update(const std::map<int, Transform> & poses); // return true if map has changed
|
bool update(const std::map<int, Transform> & poses); // return true if map has changed
|
||||||
|
|
||||||
virtual void clear();
|
virtual void clear();
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ bool RTABMAP_CORE_EXPORT exportPoses(
|
|||||||
|
|
||||||
bool RTABMAP_CORE_EXPORT importPoses(
|
bool RTABMAP_CORE_EXPORT importPoses(
|
||||||
const std::string & filePath,
|
const std::string & filePath,
|
||||||
int format, // 0=Raw, 1=RGBD-SLAM motion capture (10=without change of coordinate frame, 11=10+ID), 2=KITTI, 3=TORO, 4=g2o, 5=NewCollege(t,x,y), 6=Malaga Urban GPS, 7=St Lucia INS, 8=Karlsruhe, 9=EuRoC MAV
|
int format, // 0=Raw, 1=RGBD-SLAM motion capture (10=without change of coordinate frame, 11=10+ID), 2=KITTI, 3=TORO, 4=g2o, 5=NewCollege(t,x,y), 6=Malaga Urban GPS, 7=St Lucia INS, 8=Karlsruhe, 9=EuRoC MAV, 12=rgbd_bonn
|
||||||
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 and 9
|
std::map<int, double> * stamps = 0); // optional for format 1 and 9
|
||||||
@@ -118,15 +118,18 @@ Transform RTABMAP_CORE_EXPORT calcRMSE(
|
|||||||
float & rotational_max,
|
float & rotational_max,
|
||||||
bool align2D = false);
|
bool align2D = false);
|
||||||
|
|
||||||
void RTABMAP_CORE_EXPORT computeMaxGraphErrors(
|
struct MaxGraphErrors
|
||||||
|
{
|
||||||
|
float linear=-1.0f; // absolute error (m) of the link with maximum linear error
|
||||||
|
float angular=-1.0f; // absolute error (rad) of the link with maximum angular error
|
||||||
|
float linearRatio=-1.0f; // Ratio = absolute error (m) / linear std (m), of the link with maximum linear error
|
||||||
|
float angularRatio=-1.0f; // Ratio = absolute error (rad) / angular std (rad), of the link with maximum angular error
|
||||||
|
Link linearLink; // link with maximum linear error
|
||||||
|
Link angularLink; // link with maximum angular error
|
||||||
|
};
|
||||||
|
MaxGraphErrors RTABMAP_CORE_EXPORT computeMaxGraphErrors(
|
||||||
const std::map<int, Transform> & poses,
|
const std::map<int, Transform> & poses,
|
||||||
const std::multimap<int, Link> & links,
|
const std::multimap<int, Link> & links,
|
||||||
float & maxLinearErrorRatio,
|
|
||||||
float & maxAngularErrorRatio,
|
|
||||||
float & maxLinearError,
|
|
||||||
float & maxAngularError,
|
|
||||||
const Link ** maxLinearErrorLink = 0,
|
|
||||||
const Link ** maxAngularErrorLink = 0,
|
|
||||||
bool for3DoF = false);
|
bool for3DoF = false);
|
||||||
|
|
||||||
std::vector<double> RTABMAP_CORE_EXPORT getMaxOdomInf(const std::multimap<int, Link> & links);
|
std::vector<double> RTABMAP_CORE_EXPORT getMaxOdomInf(const std::multimap<int, Link> & links);
|
||||||
@@ -277,7 +280,8 @@ std::list<std::pair<int, Transform> > RTABMAP_CORE_EXPORT computePath(
|
|||||||
bool lookInDatabase = true,
|
bool lookInDatabase = true,
|
||||||
bool updateNewCosts = false,
|
bool updateNewCosts = false,
|
||||||
float linearVelocity = 0.0f, // m/sec
|
float linearVelocity = 0.0f, // m/sec
|
||||||
float angularVelocity = 0.0f); // rad/sec
|
float angularVelocity = 0.0f, // rad/sec
|
||||||
|
bool ignoreDirectLinks = false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find the nearest node of the target pose
|
* Find the nearest node of the target pose
|
||||||
@@ -336,9 +340,7 @@ RTABMAP_DEPRECATED std::map<int, Transform> RTABMAP_CORE_EXPORT getPosesInRadius
|
|||||||
RTABMAP_DEPRECATED std::map<int, Transform> RTABMAP_CORE_EXPORT getPosesInRadius(const Transform & targetPose, const std::map<int, Transform> & nodes, float radius, float angle = 0.0f);
|
RTABMAP_DEPRECATED std::map<int, Transform> RTABMAP_CORE_EXPORT getPosesInRadius(const Transform & targetPose, const std::map<int, Transform> & nodes, float radius, float angle = 0.0f);
|
||||||
|
|
||||||
float RTABMAP_CORE_EXPORT computePathLength(
|
float RTABMAP_CORE_EXPORT computePathLength(
|
||||||
const std::vector<std::pair<int, Transform> > & path,
|
const std::vector<std::pair<int, Transform> > & path);
|
||||||
unsigned int fromIndex = 0,
|
|
||||||
unsigned int toIndex = 0);
|
|
||||||
|
|
||||||
// assuming they are all linked in map order
|
// assuming they are all linked in map order
|
||||||
float RTABMAP_CORE_EXPORT computePathLength(
|
float RTABMAP_CORE_EXPORT computePathLength(
|
||||||
|
|||||||
@@ -48,7 +48,8 @@ public:
|
|||||||
kXYZNormal=8,
|
kXYZNormal=8,
|
||||||
kXYZINormal=9,
|
kXYZINormal=9,
|
||||||
kXYZRGBNormal=10,
|
kXYZRGBNormal=10,
|
||||||
kXYZIT=11};
|
kXYZIT=11,
|
||||||
|
kXYZIRT=12};
|
||||||
|
|
||||||
static std::string formatName(const Format & format);
|
static std::string formatName(const Format & format);
|
||||||
static int channels(const Format & format);
|
static int channels(const Format & format);
|
||||||
@@ -57,6 +58,7 @@ public:
|
|||||||
static bool isScanHasRGB(const Format & format);
|
static bool isScanHasRGB(const Format & format);
|
||||||
static bool isScanHasIntensity(const Format & format);
|
static bool isScanHasIntensity(const Format & format);
|
||||||
static bool isScanHasTime(const Format & format);
|
static bool isScanHasTime(const Format & format);
|
||||||
|
static bool isScanHasRing(const Format & format);
|
||||||
static LaserScan backwardCompatibility(
|
static LaserScan backwardCompatibility(
|
||||||
const cv::Mat & oldScanFormat,
|
const cv::Mat & oldScanFormat,
|
||||||
int maxPoints = 0,
|
int maxPoints = 0,
|
||||||
@@ -135,6 +137,7 @@ public:
|
|||||||
bool hasRGB() const {return isScanHasRGB(format_);}
|
bool hasRGB() const {return isScanHasRGB(format_);}
|
||||||
bool hasIntensity() const {return isScanHasIntensity(format_);}
|
bool hasIntensity() const {return isScanHasIntensity(format_);}
|
||||||
bool hasTime() const {return isScanHasTime(format_);}
|
bool hasTime() const {return isScanHasTime(format_);}
|
||||||
|
bool hasRing() const {return isScanHasRing(format_);}
|
||||||
bool isCompressed() const {return !data_.empty() && data_.type()==CV_8UC1;}
|
bool isCompressed() const {return !data_.empty() && data_.type()==CV_8UC1;}
|
||||||
bool isOrganized() const {return data_.rows > 1;}
|
bool isOrganized() const {return data_.rows > 1;}
|
||||||
LaserScan clone() const;
|
LaserScan clone() const;
|
||||||
@@ -143,7 +146,8 @@ public:
|
|||||||
int getIntensityOffset() const {return hasIntensity()?(is2d()?2:3):-1;}
|
int getIntensityOffset() const {return hasIntensity()?(is2d()?2:3):-1;}
|
||||||
int getRGBOffset() const {return hasRGB()?(is2d()?2:3):-1;}
|
int getRGBOffset() const {return hasRGB()?(is2d()?2:3):-1;}
|
||||||
int getNormalsOffset() const {return hasNormals()?(2 + (is2d()?0:1) + ((hasRGB() || hasIntensity())?1:0)):-1;}
|
int getNormalsOffset() const {return hasNormals()?(2 + (is2d()?0:1) + ((hasRGB() || hasIntensity())?1:0)):-1;}
|
||||||
int getTimeOffset() const {return hasTime()?4:-1;}
|
int getRingOffset() const {return format_==kXYZIRT?4:-1;}
|
||||||
|
int getTimeOffset() const {return format_==kXYZIT?4:(format_==kXYZIRT?5:-1);}
|
||||||
|
|
||||||
float & field(unsigned int pointIndex, unsigned int channelOffset);
|
float & field(unsigned int pointIndex, unsigned int channelOffset);
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,12 @@ private:
|
|||||||
|
|
||||||
class RTABMAP_CORE_EXPORT MarkerDetector {
|
class RTABMAP_CORE_EXPORT MarkerDetector {
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum Strategy {
|
||||||
|
kStrategyOpencv,
|
||||||
|
kStrategyApriltag
|
||||||
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MarkerDetector(const ParametersMap & parameters = ParametersMap());
|
MarkerDetector(const ParametersMap & parameters = ParametersMap());
|
||||||
virtual ~MarkerDetector();
|
virtual ~MarkerDetector();
|
||||||
@@ -84,15 +90,19 @@ public:
|
|||||||
cv::Mat * imageWithDetections = 0);
|
cv::Mat * imageWithDetections = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
#ifdef HAVE_OPENCV_ARUCO
|
Strategy strategy_;
|
||||||
cv::Ptr<cv::aruco::DetectorParameters> detectorParams_;
|
float markerLength_;
|
||||||
float markerLength_;
|
std::map<int, float> markerLengths_;
|
||||||
float maxDepthError_;
|
float maxDepthError_;
|
||||||
float maxRange_;
|
float maxRange_;
|
||||||
float minRange_;
|
float minRange_;
|
||||||
int dictionaryId_;
|
int dictionaryId_;
|
||||||
|
#ifdef HAVE_OPENCV_ARUCO
|
||||||
|
cv::Ptr<cv::aruco::DetectorParameters> detectorParams_;
|
||||||
cv::Ptr<cv::aruco::Dictionary> dictionary_;
|
cv::Ptr<cv::aruco::Dictionary> dictionary_;
|
||||||
#endif
|
#endif
|
||||||
|
void * apriltagLibDetector_;
|
||||||
|
void * apriltagLibFamily_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace rtabmap */
|
} /* namespace rtabmap */
|
||||||
|
|||||||
@@ -140,10 +140,12 @@ public:
|
|||||||
float radius,
|
float radius,
|
||||||
const std::map<int, Transform> & optimizedPoses,
|
const std::map<int, Transform> & optimizedPoses,
|
||||||
int maxGraphDepth) const;
|
int maxGraphDepth) const;
|
||||||
|
void convertToIntermediate(int locationId);
|
||||||
void deleteLocation(int locationId, std::list<int> * deletedWords = 0);
|
void deleteLocation(int locationId, std::list<int> * deletedWords = 0);
|
||||||
void saveLocationData(int locationId);
|
void saveLocationData(int locationId);
|
||||||
void removeLink(int idA, int idB);
|
void removeLink(int idA, int idB);
|
||||||
void removeRawData(int id, bool image = true, bool scan = true, bool userData = true);
|
void removeRawData(int id, bool image = true, bool scan = true, bool userData = true, bool occupancyGrid = true);
|
||||||
|
int reduceNode(int id, float maxDistance = 0.0f, bool keepLinkedInDb = false, int direction = 0);
|
||||||
|
|
||||||
//getters
|
//getters
|
||||||
const std::map<int, double> & getWorkingMem() const {return _workingMem;}
|
const std::map<int, double> & getWorkingMem() const {return _workingMem;}
|
||||||
@@ -161,7 +163,7 @@ public:
|
|||||||
float getSimilarityThreshold() const {return _similarityThreshold;}
|
float getSimilarityThreshold() const {return _similarityThreshold;}
|
||||||
std::map<int, int> getWeights() const;
|
std::map<int, int> getWeights() const;
|
||||||
int getLastSignatureId() const;
|
int getLastSignatureId() const;
|
||||||
const Signature * getLastWorkingSignature() const;
|
const Signature * getLastWorkingSignature(bool ignoreIntermediateNodes) const;
|
||||||
std::map<int, Link> getNodesObservingLandmark(int landmarkId, bool lookInDatabase) const;
|
std::map<int, Link> getNodesObservingLandmark(int landmarkId, bool lookInDatabase) const;
|
||||||
int getSignatureIdByLabel(const std::string & label, bool lookInDatabase = true) const;
|
int getSignatureIdByLabel(const std::string & label, bool lookInDatabase = true) const;
|
||||||
bool labelSignature(int id, const std::string & label);
|
bool labelSignature(int id, const std::string & label);
|
||||||
@@ -211,6 +213,7 @@ public:
|
|||||||
std::set<int> getAllSignatureIds(bool ignoreChildren = true) const;
|
std::set<int> getAllSignatureIds(bool ignoreChildren = true) const;
|
||||||
bool memoryChanged() const {return _memoryChanged;}
|
bool memoryChanged() const {return _memoryChanged;}
|
||||||
bool isIncremental() const {return _incrementalMemory;}
|
bool isIncremental() const {return _incrementalMemory;}
|
||||||
|
bool isReadOnly() const {return !_incrementalMemory && _localizationReadOnly;}
|
||||||
bool isLocalizationDataSaved() const {return _localizationDataSaved;}
|
bool isLocalizationDataSaved() const {return _localizationDataSaved;}
|
||||||
const Signature * getSignature(int id) const;
|
const Signature * getSignature(int id) const;
|
||||||
bool isInSTM(int signatureId) const {return _stMem.find(signatureId) != _stMem.end();}
|
bool isInSTM(int signatureId) const {return _stMem.find(signatureId) != _stMem.end();}
|
||||||
@@ -264,6 +267,7 @@ private:
|
|||||||
void addSignatureToStm(Signature * signature, const cv::Mat & covariance);
|
void addSignatureToStm(Signature * signature, const cv::Mat & covariance);
|
||||||
void clear();
|
void clear();
|
||||||
void loadDataFromDb(bool postInitClosingEvents);
|
void loadDataFromDb(bool postInitClosingEvents);
|
||||||
|
void saveFlannIndex(bool postInitClosingEvents);
|
||||||
void moveToTrash(Signature * s, bool keepLinkedToGraph = true, std::list<int> * deletedWords = 0);
|
void moveToTrash(Signature * s, bool keepLinkedToGraph = true, std::list<int> * deletedWords = 0);
|
||||||
|
|
||||||
void moveSignatureToWMFromSTM(int id, int * reducedTo = 0);
|
void moveSignatureToWMFromSTM(int id, int * reducedTo = 0);
|
||||||
@@ -275,6 +279,7 @@ private:
|
|||||||
void initCountId();
|
void initCountId();
|
||||||
void rehearsal(Signature * signature, Statistics * stats = 0);
|
void rehearsal(Signature * signature, Statistics * stats = 0);
|
||||||
bool rehearsalMerge(int oldId, int newId);
|
bool rehearsalMerge(int oldId, int newId);
|
||||||
|
bool canBeReduced(const Link & link, float maxDistance, int direction);
|
||||||
|
|
||||||
const std::map<int, Signature*> & getSignatures() const {return _signatures;}
|
const std::map<int, Signature*> & getSignatures() const {return _signatures;}
|
||||||
|
|
||||||
@@ -299,13 +304,16 @@ private:
|
|||||||
float _similarityThreshold;
|
float _similarityThreshold;
|
||||||
bool _binDataKept;
|
bool _binDataKept;
|
||||||
bool _rawDescriptorsKept;
|
bool _rawDescriptorsKept;
|
||||||
|
bool _loadVisualLocalFeaturesOnInit;
|
||||||
bool _saveDepth16Format;
|
bool _saveDepth16Format;
|
||||||
bool _notLinkedNodesKeptInDb;
|
bool _notLinkedNodesKeptInDb;
|
||||||
bool _saveIntermediateNodeData;
|
bool _saveIntermediateNodeData;
|
||||||
std::string _rgbCompressionFormat;
|
std::string _rgbCompressionFormat;
|
||||||
std::string _depthCompressionFormat;
|
std::string _depthCompressionFormat;
|
||||||
bool _incrementalMemory;
|
bool _incrementalMemory;
|
||||||
|
bool _localizationReadOnly;
|
||||||
bool _localizationDataSaved;
|
bool _localizationDataSaved;
|
||||||
|
bool _flannIndexSaved;
|
||||||
bool _reduceGraph;
|
bool _reduceGraph;
|
||||||
int _maxStMemSize;
|
int _maxStMemSize;
|
||||||
float _recentWmRatio;
|
float _recentWmRatio;
|
||||||
@@ -353,6 +361,7 @@ private:
|
|||||||
bool _linksChanged; // False by default, become true when links are modified.
|
bool _linksChanged; // False by default, become true when links are modified.
|
||||||
int _signaturesAdded;
|
int _signaturesAdded;
|
||||||
bool _allNodesInWM;
|
bool _allNodesInWM;
|
||||||
|
bool _receivingOdometryFeatures;
|
||||||
GPS _gpsOrigin;
|
GPS _gpsOrigin;
|
||||||
std::vector<CameraModel> _rectCameraModels;
|
std::vector<CameraModel> _rectCameraModels;
|
||||||
std::vector<StereoCameraModel> _rectStereoCameraModels;
|
std::vector<StereoCameraModel> _rectStereoCameraModels;
|
||||||
|
|||||||
@@ -53,10 +53,12 @@ public:
|
|||||||
kTypeOkvis = 6,
|
kTypeOkvis = 6,
|
||||||
kTypeLOAM = 7,
|
kTypeLOAM = 7,
|
||||||
kTypeMSCKF = 8,
|
kTypeMSCKF = 8,
|
||||||
kTypeVINS = 9,
|
kTypeVINSFusion = 9,
|
||||||
kTypeOpenVINS = 10,
|
kTypeOpenVINS = 10,
|
||||||
kTypeFLOAM = 11,
|
kTypeFLOAM = 11,
|
||||||
kTypeOpen3D = 12
|
kTypeOpen3D = 12,
|
||||||
|
kTypeCuVSLAM = 13,
|
||||||
|
kTypeLIOSAM = 14
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#define ODOMETRYTHREAD_H_
|
#define ODOMETRYTHREAD_H_
|
||||||
|
|
||||||
#include <rtabmap/core/rtabmap_core_export.h>
|
#include <rtabmap/core/rtabmap_core_export.h>
|
||||||
|
#include <rtabmap/core/SensorEvent.h>
|
||||||
#include <rtabmap/core/SensorData.h>
|
#include <rtabmap/core/SensorData.h>
|
||||||
#include <rtabmap/utilite/UThread.h>
|
#include <rtabmap/utilite/UThread.h>
|
||||||
#include <rtabmap/utilite/UEventsHandler.h>
|
#include <rtabmap/utilite/UEventsHandler.h>
|
||||||
@@ -55,20 +56,21 @@ private:
|
|||||||
// MAIN LOOP
|
// MAIN LOOP
|
||||||
//============================================================
|
//============================================================
|
||||||
virtual void mainLoop();
|
virtual void mainLoop();
|
||||||
void addData(const SensorData & data);
|
void addData(const SensorEvent & data);
|
||||||
bool getData(SensorData & data);
|
bool getData(SensorEvent & data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
USemaphore _dataAdded;
|
USemaphore _dataAdded;
|
||||||
UMutex _dataMutex;
|
UMutex _dataMutex;
|
||||||
std::list<SensorData> _dataBuffer;
|
std::list<SensorEvent> _dataBuffer;
|
||||||
std::list<SensorData> _imuBuffer;
|
std::list<SensorData> _imuBuffer;
|
||||||
Odometry * _odometry;
|
Odometry * _odometry;
|
||||||
unsigned int _dataBufferMaxSize;
|
unsigned int _dataBufferMaxSize;
|
||||||
bool _resetOdometry;
|
bool _resetOdometry;
|
||||||
Transform _resetPose;
|
Transform _resetPose;
|
||||||
double _lastImuStamp;
|
Transform _previousGuessPose;
|
||||||
double _imuEstimatedDelay;
|
double _oldestAsyncImuStamp;
|
||||||
|
double _newestAsyncImuStamp;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
|||||||
@@ -149,14 +149,16 @@ public:
|
|||||||
const std::map<int, Signature> & signatures,
|
const std::map<int, Signature> & signatures,
|
||||||
std::map<int, cv::Point3f> & points3DMap,
|
std::map<int, cv::Point3f> & points3DMap,
|
||||||
std::map<int, std::map<int, FeatureBA> > & wordReferences, // <ID words, IDs frames + keypoint/depth/descriptor>
|
std::map<int, std::map<int, FeatureBA> > & wordReferences, // <ID words, IDs frames + keypoint/depth/descriptor>
|
||||||
bool rematchFeatures = false);
|
bool rematchFeatures = false,
|
||||||
|
const ParametersMap & registrationParameters = ParametersMap());
|
||||||
|
|
||||||
std::map<int, Transform> optimizeBA(
|
std::map<int, Transform> optimizeBA(
|
||||||
int rootId,
|
int rootId,
|
||||||
const std::map<int, Transform> & poses,
|
const std::map<int, Transform> & poses,
|
||||||
const std::multimap<int, Link> & links,
|
const std::multimap<int, Link> & links,
|
||||||
const std::map<int, Signature> & signatures,
|
const std::map<int, Signature> & signatures,
|
||||||
bool rematchFeatures = false);
|
bool rematchFeatures = false,
|
||||||
|
const ParametersMap & registrationParameters = ParametersMap());
|
||||||
|
|
||||||
Transform optimizeBA(
|
Transform optimizeBA(
|
||||||
const Link & link,
|
const Link & link,
|
||||||
@@ -172,7 +174,8 @@ public:
|
|||||||
std::map<int, cv::Point3f> & points3DMap,
|
std::map<int, cv::Point3f> & points3DMap,
|
||||||
std::map<int, std::map<int, FeatureBA > > & wordReferences, // <ID words, IDs frames + keypoint/depth/descriptor>
|
std::map<int, std::map<int, FeatureBA > > & wordReferences, // <ID words, IDs frames + keypoint/depth/descriptor>
|
||||||
bool rematchFeatures = false,
|
bool rematchFeatures = false,
|
||||||
bool useLinkTransformAsGuess = false);
|
bool useLinkTransformAsGuess = false,
|
||||||
|
ParametersMap registrationParameters = ParametersMap());
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Optimizer(
|
Optimizer(
|
||||||
|
|||||||
@@ -204,6 +204,7 @@ class RTABMAP_CORE_EXPORT Parameters
|
|||||||
RTABMAP_PARAM(Mem, ImageKept, bool, false, "Keep raw images in RAM.");
|
RTABMAP_PARAM(Mem, ImageKept, bool, false, "Keep raw images in RAM.");
|
||||||
RTABMAP_PARAM(Mem, BinDataKept, bool, true, "Keep binary data in db.");
|
RTABMAP_PARAM(Mem, BinDataKept, bool, true, "Keep binary data in db.");
|
||||||
RTABMAP_PARAM(Mem, RawDescriptorsKept, bool, true, "Raw descriptors kept in memory.");
|
RTABMAP_PARAM(Mem, RawDescriptorsKept, bool, true, "Raw descriptors kept in memory.");
|
||||||
|
RTABMAP_PARAM(Mem, LoadVisualLocalFeaturesOnInit, bool, true, "Load all local visual features (keypoints, descriptors and 3D points) in RAM when loading an existing database. This can add significant time to initialize the memory but the features will be already loaded before computing loop closure transforms. If false, the features are loaded on-demand from the database when a loop closure transformation should be estimated.");
|
||||||
RTABMAP_PARAM(Mem, MapLabelsAdded, bool, true, "Create map labels. The first node of a map will be labeled as \"map#\" where # is the map ID.");
|
RTABMAP_PARAM(Mem, MapLabelsAdded, bool, true, "Create map labels. The first node of a map will be labeled as \"map#\" where # is the map ID.");
|
||||||
RTABMAP_PARAM(Mem, SaveDepth16Format, bool, false, "Save depth image into 16 bits format to reduce memory used. Warning: values over ~65 meters are ignored (maximum 65535 millimeters).");
|
RTABMAP_PARAM(Mem, SaveDepth16Format, bool, false, "Save depth image into 16 bits format to reduce memory used. Warning: values over ~65 meters are ignored (maximum 65535 millimeters).");
|
||||||
RTABMAP_PARAM(Mem, NotLinkedNodesKept, bool, true, "Keep not linked nodes in db (rehearsed nodes and deleted nodes).");
|
RTABMAP_PARAM(Mem, NotLinkedNodesKept, bool, true, "Keep not linked nodes in db (rehearsed nodes and deleted nodes).");
|
||||||
@@ -212,17 +213,18 @@ class RTABMAP_CORE_EXPORT Parameters
|
|||||||
RTABMAP_PARAM_STR(Mem, DepthCompressionFormat, ".rvl", "Depth image compression format for 16UC1 depth type. It should be \".png\" or \".rvl\". If depth type is 32FC1, \".png\" is used.");
|
RTABMAP_PARAM_STR(Mem, DepthCompressionFormat, ".rvl", "Depth image compression format for 16UC1 depth type. It should be \".png\" or \".rvl\". If depth type is 32FC1, \".png\" is used.");
|
||||||
RTABMAP_PARAM(Mem, STMSize, unsigned int, 10, "Short-term memory size.");
|
RTABMAP_PARAM(Mem, STMSize, unsigned int, 10, "Short-term memory size.");
|
||||||
RTABMAP_PARAM(Mem, IncrementalMemory, bool, true, "SLAM mode, otherwise it is Localization mode.");
|
RTABMAP_PARAM(Mem, IncrementalMemory, bool, true, "SLAM mode, otherwise it is Localization mode.");
|
||||||
RTABMAP_PARAM(Mem, LocalizationDataSaved, bool, false, uFormat("Save localization data during localization session (when %s=false). When enabled, the database will then also grow in localization mode. This mode would be used only for debugging purpose.", kMemIncrementalMemory().c_str()).c_str());
|
RTABMAP_PARAM(Mem, LocalizationReadOnly, bool, false, uFormat("In localization mode, open the database in read-only mode (ignored if %s=true). Currrenty incompatible with memory management (%s and %s cannot be used) and if there are disjoint sessions in working memory. Last localization pose won't be saved back in the database at the end of the session, so the robot will always restart to original last localization pose, unless %s is used or an external initial pose is provided on initialization.", kMemIncrementalMemory().c_str(), kRtabmapLoopThr().c_str(), kRtabmapMemoryThr().c_str(), kRGBDStartAtOrigin().c_str()).c_str());
|
||||||
RTABMAP_PARAM(Mem, ReduceGraph, bool, false, "Reduce graph. Merge nodes when loop closures are added (ignoring those with user data set).");
|
RTABMAP_PARAM(Mem, LocalizationDataSaved, bool, false, uFormat("Save localization data during localization session (when %s=false). When enabled, the database will then also grow in localization mode. This mode would be used only for debugging purpose.", kMemIncrementalMemory().c_str()).c_str());
|
||||||
|
RTABMAP_PARAM(Mem, ReduceGraph, bool, false, uFormat("Reduce graph. Merge nodes when loop closures are added (ignoring those with user data). Note that this approach assumes that 100%% of the loop closures accepted are good, so it is highly recommended to enable \"%s\" at the same time.", kRGBDOptimizeMaxError().c_str()));
|
||||||
RTABMAP_PARAM(Mem, RecentWmRatio, float, 0.2, "Ratio of locations after the last loop closure in WM that cannot be transferred.");
|
RTABMAP_PARAM(Mem, RecentWmRatio, float, 0.2, "Ratio of locations after the last loop closure in WM that cannot be transferred.");
|
||||||
RTABMAP_PARAM(Mem, TransferSortingByWeightId, bool, false, "On transfer, signatures are sorted by weight->ID only (i.e. the oldest of the lowest weighted signatures are transferred first). If false, the signatures are sorted by weight->Age->ID (i.e. the oldest inserted in WM of the lowest weighted signatures are transferred first). Note that retrieval updates the age, not the ID.");
|
RTABMAP_PARAM(Mem, TransferSortingByWeightId, bool, false, "On transfer, signatures are sorted by weight->ID only (i.e. the oldest of the lowest weighted signatures are transferred first). If false, the signatures are sorted by weight->Age->ID (i.e. the oldest inserted in WM of the lowest weighted signatures are transferred first). Note that retrieval updates the age, not the ID.");
|
||||||
RTABMAP_PARAM(Mem, RehearsalIdUpdatedToNewOne, bool, false, "On merge, update to new id. When false, no copy.");
|
RTABMAP_PARAM(Mem, RehearsalIdUpdatedToNewOne, bool, false, uFormat("On merge, update to new id. When false, no copy. Keep this disable if %s=true.", kRtabmapCreateIntermediateNodes().c_str()));
|
||||||
RTABMAP_PARAM(Mem, RehearsalWeightIgnoredWhileMoving, bool, false, "When the robot is moving, weights are not updated on rehearsal.");
|
RTABMAP_PARAM(Mem, RehearsalWeightIgnoredWhileMoving, bool, false, "When the robot is moving, weights are not updated on rehearsal.");
|
||||||
RTABMAP_PARAM(Mem, GenerateIds, bool, true, "True=Generate location IDs, False=use input image IDs.");
|
RTABMAP_PARAM(Mem, GenerateIds, bool, true, "True=Generate location IDs, False=use input image IDs.");
|
||||||
RTABMAP_PARAM(Mem, BadSignaturesIgnored, bool, false, "Bad signatures are ignored.");
|
RTABMAP_PARAM(Mem, BadSignaturesIgnored, bool, false, "Bad signatures are ignored.");
|
||||||
RTABMAP_PARAM(Mem, InitWMWithAllNodes, bool, false, "Initialize the Working Memory with all nodes in Long-Term Memory. When false, it is initialized with nodes of the previous session.");
|
RTABMAP_PARAM(Mem, InitWMWithAllNodes, bool, false, "Initialize the Working Memory with all nodes in Long-Term Memory. When false, it is initialized with nodes of the previous session.");
|
||||||
RTABMAP_PARAM(Mem, DepthAsMask, bool, true, "Use depth image as mask when extracting features for vocabulary.");
|
RTABMAP_PARAM(Mem, DepthAsMask, bool, true, "Use depth image as mask when extracting features for vocabulary.");
|
||||||
RTABMAP_PARAM(Mem, DepthMaskFloorThr, float, 0.0, uFormat("Filter floor from depth mask below specified threshold (m) before extracting features. 0 means disabled, negative means remove all objects above the floor threshold instead. Ignored if %s is false.", kMemDepthAsMask().c_str()));
|
RTABMAP_PARAM(Mem, DepthMaskFloorThr, float, 0.0, uFormat("Filter floor from depth mask below specified threshold (m) before extracting features. 0 means disabled. Ignored if %s is false.", kMemDepthAsMask().c_str()));
|
||||||
RTABMAP_PARAM(Mem, StereoFromMotion, bool, false, uFormat("Triangulate features without depth using stereo from motion (odometry). It would be ignored if %s is true and the feature detector used supports masking.", kMemDepthAsMask().c_str()));
|
RTABMAP_PARAM(Mem, StereoFromMotion, bool, false, uFormat("Triangulate features without depth using stereo from motion (odometry). It would be ignored if %s is true and the feature detector used supports masking.", kMemDepthAsMask().c_str()));
|
||||||
RTABMAP_PARAM(Mem, ImagePreDecimation, unsigned int, 1, uFormat("Decimation of the RGB image before visual feature detection. If depth size is larger than decimated RGB size, depth is decimated to be always at most equal to RGB size. If %s is true and if depth is smaller than decimated RGB, depth may be interpolated to match RGB size for feature detection.",kMemDepthAsMask().c_str()));
|
RTABMAP_PARAM(Mem, ImagePreDecimation, unsigned int, 1, uFormat("Decimation of the RGB image before visual feature detection. If depth size is larger than decimated RGB size, depth is decimated to be always at most equal to RGB size. If %s is true and if depth is smaller than decimated RGB, depth may be interpolated to match RGB size for feature detection.",kMemDepthAsMask().c_str()));
|
||||||
RTABMAP_PARAM(Mem, ImagePostDecimation, unsigned int, 1, uFormat("Decimation of the RGB image before saving it to database. If depth size is larger than decimated RGB size, depth is decimated to be always at most equal to RGB size. Decimation is done from the original image. If set to same value than %s, data already decimated is saved (no need to re-decimate the image).", kMemImagePreDecimation().c_str()));
|
RTABMAP_PARAM(Mem, ImagePostDecimation, unsigned int, 1, uFormat("Decimation of the RGB image before saving it to database. If depth size is larger than decimated RGB size, depth is decimated to be always at most equal to RGB size. Decimation is done from the original image. If set to same value than %s, data already decimated is saved (no need to re-decimate the image).", kMemImagePreDecimation().c_str()));
|
||||||
@@ -247,19 +249,21 @@ class RTABMAP_CORE_EXPORT Parameters
|
|||||||
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).");
|
||||||
RTABMAP_PARAM(Kp, SSC, bool, false, "If true, SSC (Suppression via Square Covering) is applied to limit keypoints.");
|
RTABMAP_PARAM(Kp, SSC, bool, false, "If true, SSC (Suppression via Square Covering) is applied to limit keypoints.");
|
||||||
RTABMAP_PARAM(Kp, BadSignRatio, float, 0.5, "Bad signature ratio (less than Ratio x AverageWordsPerImage = bad).");
|
RTABMAP_PARAM(Kp, BadSignRatio, float, 0.5, uFormat("Bad signature ratio. If %s=0, the ratio is computed from the average number of words per signature (less than Ratio x AverageWordsPerImage = bad).", kKpMaxFeatures().c_str()));
|
||||||
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 12=SURF/FREAK 13=GFTT/DAISY 14=SURF/DAISY 15=PyDetector");
|
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 16=SuperPoint-Rpautrat");
|
||||||
#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 12=SURF/FREAK 13=GFTT/DAISY 14=SURF/DAISY 15=PyDetector");
|
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 16=SuperPoint-Rpautrat");
|
||||||
#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.");
|
||||||
RTABMAP_PARAM_STR(Kp, RoiRatios, "0.0 0.0 0.0 0.0", "Region of interest ratios [left, right, top, bottom].");
|
RTABMAP_PARAM_STR(Kp, RoiRatios, "0.0 0.0 0.0 0.0", "Region of interest ratios [left, right, top, bottom].");
|
||||||
RTABMAP_PARAM_STR(Kp, DictionaryPath, "", "Path of the pre-computed dictionary");
|
RTABMAP_PARAM_STR(Kp, DictionaryPath, "", "Path of the pre-computed dictionary");
|
||||||
RTABMAP_PARAM(Kp, NewWordsComparedTogether, bool, true, "When adding new words to dictionary, they are compared also with each other (to detect same words in the same signature).");
|
RTABMAP_PARAM(Kp, NewWordsComparedTogether, bool, true, "When adding new words to dictionary, they are compared also with each other (to detect same words in the same signature).");
|
||||||
|
RTABMAP_PARAM(Kp, FlannIndexSaved, bool, false, uFormat("Save FLANN index during localization session (when %s=false). The FLANN index will be saved to database after the first time localization mode is used, then on next sessions, the index is reloaded from the database instead of being rebuilt again. This can save significant loading time when the visual word dictionary is big (>1M words). Note that if the dictionary is modified (parameters or data), the index will be rebuilt and saved again on the next session. Ignored on initialization if %s is enabled.", kMemIncrementalMemory().c_str(), kMemInitWMWithAllNodes().c_str()).c_str());
|
||||||
|
RTABMAP_PARAM(Kp, SerializeWithChecksum, bool, true, "On serialization of the FLANN index, compute checksum of the data used by the FLANN index. This adds a slight overhead on serialization/deserialization to make sure that the dictionary data correspond to same data used when the index was built.");
|
||||||
RTABMAP_PARAM(Kp, SubPixWinSize, int, 3, "See cv::cornerSubPix().");
|
RTABMAP_PARAM(Kp, SubPixWinSize, int, 3, "See cv::cornerSubPix().");
|
||||||
RTABMAP_PARAM(Kp, SubPixIterations, int, 0, "See cv::cornerSubPix(). 0 disables sub pixel refining.");
|
RTABMAP_PARAM(Kp, SubPixIterations, int, 0, "See cv::cornerSubPix(). 0 disables sub pixel refining.");
|
||||||
RTABMAP_PARAM(Kp, SubPixEps, double, 0.02, "See cv::cornerSubPix().");
|
RTABMAP_PARAM(Kp, SubPixEps, double, 0.02, "See cv::cornerSubPix().");
|
||||||
@@ -290,7 +294,8 @@ class RTABMAP_CORE_EXPORT Parameters
|
|||||||
RTABMAP_PARAM(SIFT, PreciseUpscale, bool, false, "Whether to enable precise upscaling in the scale pyramid (OpenCV >= 4.8).");
|
RTABMAP_PARAM(SIFT, PreciseUpscale, bool, false, "Whether to enable precise upscaling in the scale pyramid (OpenCV >= 4.8).");
|
||||||
RTABMAP_PARAM(SIFT, RootSIFT, bool, false, "Apply RootSIFT normalization of the descriptors.");
|
RTABMAP_PARAM(SIFT, RootSIFT, bool, false, "Apply RootSIFT normalization of the descriptors.");
|
||||||
RTABMAP_PARAM(SIFT, Gpu, bool, false, "CudaSift: Use GPU version of SIFT. This option is enabled only if RTAB-Map is built with CudaSift dependency and GPUs are detected.");
|
RTABMAP_PARAM(SIFT, Gpu, bool, false, "CudaSift: Use GPU version of SIFT. This option is enabled only if RTAB-Map is built with CudaSift dependency and GPUs are detected.");
|
||||||
RTABMAP_PARAM(SIFT, GaussianThreshold, float, 2.0, "CudaSift: Threshold on difference of Gaussians for feature pruning. The higher the threshold, the less features are produced by the detector.");
|
RTABMAP_PARAM(SIFT, GaussianThreshold, float, 2.0, "CudaSift: Threshold on difference of Gaussians for feature pruning. The higher the threshold, the less features with low response/hessian are produced by the detector.");
|
||||||
|
RTABMAP_PARAM(SIFT, MaxGaussianThreshold, float, 0.0, uFormat("CudaSift: Maximum threshold on difference of Gaussians for feature pruning (ignored if smaller or equal than %s). The lower the threshold, the less features with high response/hessian are produced by the detector.", kSIFTGaussianThreshold().c_str()));
|
||||||
RTABMAP_PARAM(SIFT, Upscale, bool, false, "CudaSift: Whether to enable upscaling.");
|
RTABMAP_PARAM(SIFT, Upscale, bool, false, "CudaSift: Whether to enable upscaling.");
|
||||||
|
|
||||||
RTABMAP_PARAM(BRIEF, Bytes, int, 32, "Bytes is a length of descriptor in bytes. It can be equal 16, 32 or 64 bytes.");
|
RTABMAP_PARAM(BRIEF, Bytes, int, 32, "Bytes is a length of descriptor in bytes. It can be equal 16, 32 or 64 bytes.");
|
||||||
@@ -343,6 +348,13 @@ class RTABMAP_CORE_EXPORT 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(SuperPointRpautrat, WeightsPath, "", "[Required] SuperPoint weights file (*.pth).");
|
||||||
|
RTABMAP_PARAM_STR(SuperPointRpautrat, ModelPath, "", "[Required] SuperPoint python model file (superpoint_pytorch.py).");
|
||||||
|
RTABMAP_PARAM(SuperPointRpautrat, Threshold, float, 0.005, "Detector response threshold to accept keypoint.");
|
||||||
|
RTABMAP_PARAM(SuperPointRpautrat, NMS, bool, true, "If true, non-maximum suppression is applied to detected keypoints.");
|
||||||
|
RTABMAP_PARAM(SuperPointRpautrat, NMSRadius, int, 4, uFormat("[%s=true] Minimum distance (pixels) between keypoints.", kSuperPointRpautratNMS().c_str()));
|
||||||
|
RTABMAP_PARAM(SuperPointRpautrat, 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_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.");
|
RTABMAP_PARAM(PyDetector, Cuda, bool, true, "Use cuda.");
|
||||||
|
|
||||||
@@ -359,14 +371,15 @@ class RTABMAP_CORE_EXPORT Parameters
|
|||||||
|
|
||||||
// RGB-D SLAM
|
// RGB-D SLAM
|
||||||
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, 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, uFormat("Minimum linear displacement (m) to update the map. Rehearsal is done prior to this, so weights are still updated. To update the map when not moving, both %s and %s should be set to 0.", Parameters::kRGBDLinearUpdate().c_str(), Parameters::kRGBDAngularUpdate().c_str()));
|
||||||
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, uFormat("Minimum angular displacement (rad) to update the map. Rehearsal is done prior to this, so weights are still updated. To update the map when not moving, both %s and %s should be set to 0.", Parameters::kRGBDLinearUpdate().c_str(), Parameters::kRGBDAngularUpdate().c_str()));
|
||||||
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).");
|
||||||
RTABMAP_PARAM(RGBD, AngularSpeedUpdate, float, 0.0, "Maximum angular speed (rad/s) to update the map (0 means not limit).");
|
RTABMAP_PARAM(RGBD, AngularSpeedUpdate, float, 0.0, "Maximum angular speed (rad/s) to update the map (0 means not limit).");
|
||||||
RTABMAP_PARAM(RGBD, AggressiveLoopThr, float, 0.05, uFormat("Loop closure threshold used (overriding %s) when a new mapping session is not yet linked to a map of the highest loop closure hypothesis. In localization mode, this threshold is used when there are no loop closure constraints with any map in the cache (%s). In all cases, the goal is to aggressively loop on a previous map in the database. Only used when %s is enabled. Set 1 to disable.", kRtabmapLoopThr().c_str(), kRGBDMaxOdomCacheSize().c_str(), kRGBDEnabled().c_str()));
|
RTABMAP_PARAM(RGBD, AggressiveLoopThr, float, 0.05, uFormat("Loop closure threshold used (overriding %s) when a new mapping session is not yet linked to a map of the highest loop closure hypothesis. In localization mode, this threshold is used when there are no loop closure constraints with any map in the cache (%s). In all cases, the goal is to aggressively loop on a previous map in the database. Only used when %s is enabled. Set 1 to disable.", kRtabmapLoopThr().c_str(), kRGBDMaxOdomCacheSize().c_str(), kRGBDEnabled().c_str()));
|
||||||
RTABMAP_PARAM(RGBD, NewMapOdomChangeDistance, float, 0, "A new map is created if a change of odometry translation greater than X m is detected (0 m = disabled).");
|
RTABMAP_PARAM(RGBD, NewMapOdomChangeDistance, float, 0, "A new map is created if a change of odometry translation greater than X m is detected (0 m = disabled).");
|
||||||
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. If used with \"%s\", the disabled loop closure links will be removed.", kOptimizerRobust().c_str()));
|
||||||
|
RTABMAP_PARAM(RGBD, OptimizeMaxErrorRepairRadius, float, 0.0, uFormat("If two consecutive loop closures are rejected by %s on the same old loop closure link, we will remove that old link, and other old links under that radius if necessary, until optimization is accepted. When optimization is accepted, the old loop closure links are removed from the graph. This feature is useful to reject bad loop closures that were accepted previously. Set to 0 to disable this feature.", kRGBDOptimizeMaxError().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, ForceOdom3DoF, bool, true, uFormat("Force odometry pose to be 3DoF if %s=true.", kRegForce3DoF().c_str()));
|
RTABMAP_PARAM(RGBD, ForceOdom3DoF, bool, true, uFormat("Force odometry pose to be 3DoF if %s=true.", kRegForce3DoF().c_str()));
|
||||||
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, 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()));
|
||||||
@@ -390,6 +403,7 @@ class RTABMAP_CORE_EXPORT Parameters
|
|||||||
RTABMAP_PARAM(RGBD, MaxOdomCacheSize, int, 10, uFormat("Maximum odometry cache size. Used only in localization mode (when %s=false). This is used to get smoother localizations and to verify localization transforms (when %s!=0) to make sure we don't teleport to a location very similar to one we previously localized on. Set 0 to disable caching.", kMemIncrementalMemory().c_str(), kRGBDOptimizeMaxError().c_str()));
|
RTABMAP_PARAM(RGBD, MaxOdomCacheSize, int, 10, uFormat("Maximum odometry cache size. Used only in localization mode (when %s=false). This is used to get smoother localizations and to verify localization transforms (when %s!=0) to make sure we don't teleport to a location very similar to one we previously localized on. Set 0 to disable caching.", kMemIncrementalMemory().c_str(), kRGBDOptimizeMaxError().c_str()));
|
||||||
RTABMAP_PARAM(RGBD, LocalizationSmoothing, bool, true, uFormat("Adjust localization constraints based on optimized odometry cache poses (when %s>0).", kRGBDMaxOdomCacheSize().c_str()));
|
RTABMAP_PARAM(RGBD, LocalizationSmoothing, bool, true, uFormat("Adjust localization constraints based on optimized odometry cache poses (when %s>0).", kRGBDMaxOdomCacheSize().c_str()));
|
||||||
RTABMAP_PARAM(RGBD, LocalizationPriorError, double, 0.001, uFormat("The corresponding variance (error x error) set to priors of the map's poses during localization (when %s>0).", kRGBDMaxOdomCacheSize().c_str()));
|
RTABMAP_PARAM(RGBD, LocalizationPriorError, double, 0.001, uFormat("The corresponding variance (error x error) set to priors of the map's poses during localization (when %s>0).", kRGBDMaxOdomCacheSize().c_str()));
|
||||||
|
RTABMAP_PARAM(RGBD, LocalizationSecondTryWithoutProximityLinks, bool, true, uFormat("When localization is rejected by graph optimization validation, try a second time without proximity links if landmark or loop closure links are also present in odometry cache (see %s). If it succeeds, the proximity links are removed. This assumes that global loop closure and landmark links are more accurate than proximity links.", kRGBDMaxOdomCacheSize().c_str()));
|
||||||
|
|
||||||
// Local/Proximity loop closure detection
|
// Local/Proximity loop closure detection
|
||||||
RTABMAP_PARAM(RGBD, ProximityByTime, bool, false, "Detection over all locations in STM.");
|
RTABMAP_PARAM(RGBD, ProximityByTime, bool, false, "Detection over all locations in STM.");
|
||||||
@@ -427,7 +441,7 @@ class RTABMAP_CORE_EXPORT Parameters
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
RTABMAP_PARAM(Optimizer, VarianceIgnored, bool, false, "Ignore constraints' variance. If checked, identity information matrix is used for each constraint. Otherwise, an information matrix is generated from the variance saved in the links.");
|
RTABMAP_PARAM(Optimizer, VarianceIgnored, bool, false, "Ignore constraints' variance. If checked, identity information matrix is used for each constraint. Otherwise, an information matrix is generated from the variance saved in the links.");
|
||||||
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, "Robust graph optimization using Vertigo (only work for g2o and GTSAM optimization strategies).");
|
||||||
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)
|
#if defined(RTABMAP_G2O) || defined(RTABMAP_GTSAM)
|
||||||
@@ -452,8 +466,8 @@ class RTABMAP_CORE_EXPORT Parameters
|
|||||||
RTABMAP_PARAM(GTSAM, IncRelinearizeSkip, int, 1, "Only relinearize any variables every X calls to ISAM2::update(). See GTSAM::ISAM2 doc for more info.");
|
RTABMAP_PARAM(GTSAM, IncRelinearizeSkip, int, 1, "Only relinearize any variables every X calls to ISAM2::update(). See GTSAM::ISAM2 doc for more info.");
|
||||||
|
|
||||||
// Odometry
|
// Odometry
|
||||||
RTABMAP_PARAM(Odom, Strategy, int, 0, "0=Frame-to-Map (F2M) 1=Frame-to-Frame (F2F) 2=Fovis 3=viso2 4=DVO-SLAM 5=ORB_SLAM2 6=OKVIS 7=LOAM 8=MSCKF_VIO 9=VINS-Fusion 10=OpenVINS 11=FLOAM 12=Open3D");
|
RTABMAP_PARAM(Odom, Strategy, int, 0, "0=Frame-to-Map (F2M) 1=Frame-to-Frame (F2F) 2=Fovis 3=viso2 4=DVO-SLAM 5=ORB_SLAM 6=OKVIS 7=LOAM 8=MSCKF_VIO 9=VINS-Fusion 10=OpenVINS 11=FLOAM 12=Open3D 13=cuVSLAM 14=LIO-SAM");
|
||||||
RTABMAP_PARAM(Odom, ResetCountdown, int, 0, "Automatically reset odometry after X consecutive images on which odometry cannot be computed (value=0 disables auto-reset).");
|
RTABMAP_PARAM(Odom, ResetCountdown, int, 0, "Automatically reset odometry after X consecutive images where odometry cannot be computed (a value of 0 disables auto-reset). When a reset occurs, odometry resumes from the last successfully computed pose with large covariance to trigger a new map. If external odometry is used, it will also be reset based on the motion estimated relative to the last computed pose but no large covariance will be received, so that a new map won't be triggered.");
|
||||||
RTABMAP_PARAM(Odom, Holonomic, bool, true, "If the robot is holonomic (strafing commands can be issued). If not, y value will be estimated from x and yaw values (y=x*tan(yaw)).");
|
RTABMAP_PARAM(Odom, Holonomic, bool, true, "If the robot is holonomic (strafing commands can be issued). If not, y value will be estimated from x and yaw values (y=x*tan(yaw)).");
|
||||||
RTABMAP_PARAM(Odom, FillInfoData, bool, true, "Fill info with data (inliers/outliers features).");
|
RTABMAP_PARAM(Odom, FillInfoData, bool, true, "Fill info with data (inliers/outliers features).");
|
||||||
RTABMAP_PARAM(Odom, ImageBufferSize, unsigned int, 1, "Data buffer size (0 min inf).");
|
RTABMAP_PARAM(Odom, ImageBufferSize, unsigned int, 1, "Data buffer size (0 min inf).");
|
||||||
@@ -547,7 +561,7 @@ class RTABMAP_CORE_EXPORT Parameters
|
|||||||
RTABMAP_PARAM(OdomViso2, BucketWidth, double, 50, "Width of bucket.");
|
RTABMAP_PARAM(OdomViso2, BucketWidth, double, 50, "Width of bucket.");
|
||||||
RTABMAP_PARAM(OdomViso2, BucketHeight, double, 50, "Height of bucket.");
|
RTABMAP_PARAM(OdomViso2, BucketHeight, double, 50, "Height of bucket.");
|
||||||
|
|
||||||
// Odometry ORB_SLAM2
|
// Odometry ORB_SLAM
|
||||||
RTABMAP_PARAM_STR(OdomORBSLAM, VocPath, "", "Path to ORB vocabulary (*.txt).");
|
RTABMAP_PARAM_STR(OdomORBSLAM, VocPath, "", "Path to ORB vocabulary (*.txt).");
|
||||||
RTABMAP_PARAM(OdomORBSLAM, 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(OdomORBSLAM, ThDepth, double, 40.0, "Close/Far threshold. Baseline times.");
|
RTABMAP_PARAM(OdomORBSLAM, ThDepth, double, 40.0, "Close/Far threshold. Baseline times.");
|
||||||
@@ -602,75 +616,94 @@ class RTABMAP_CORE_EXPORT Parameters
|
|||||||
RTABMAP_PARAM(OdomMSCKF, InitCovExTrans, double, 0.000025, "");
|
RTABMAP_PARAM(OdomMSCKF, InitCovExTrans, double, 0.000025, "");
|
||||||
RTABMAP_PARAM(OdomMSCKF, MaxCamStateSize, int, 20, "");
|
RTABMAP_PARAM(OdomMSCKF, MaxCamStateSize, int, 20, "");
|
||||||
|
|
||||||
// Odometry VINS
|
// Odometry VINS-Fusion
|
||||||
RTABMAP_PARAM_STR(OdomVINS, ConfigPath, "", "Path of VINS config file.");
|
RTABMAP_PARAM_STR(OdomVINSFusion, ConfigPath, "", "Path of VINS-Fusion config file.");
|
||||||
|
|
||||||
// Odometry OpenVINS
|
// Odometry OpenVINS
|
||||||
RTABMAP_PARAM(OdomOpenVINS, UseStereo, bool, true, "If we have more than 1 camera, if we should try to track stereo constraints between pairs");
|
RTABMAP_PARAM_STR(OdomOpenVINS, ConfigPath, "", "Path of OpenVINS config file (*.yaml). Same format used than OpenVINS library. Note that any parameter from that config file will overwrite the same parameter in OdomOpenVINS group.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, UseKLT, bool, true, "If true we will use KLT, otherwise use a ORB descriptor + robust matching");
|
RTABMAP_PARAM(OdomOpenVINS, UseStereo, bool, true, "If we have more than 1 camera, if we should try to track stereo constraints between pairs.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, NumPts, int, 200, "Number of points (per camera) we will extract and try to track");
|
RTABMAP_PARAM(OdomOpenVINS, UseKLT, bool, true, "If true we will use KLT, otherwise use a ORB descriptor + robust matching.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, MinPxDist, int, 15, "Eistance between features (features near each other provide less information)");
|
RTABMAP_PARAM(OdomOpenVINS, NumPts, int, 200, "Number of points (per camera) we will extract and try to track.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, FiTriangulate1d, bool, false, "If we should perform 1d triangulation instead of 3d");
|
RTABMAP_PARAM(OdomOpenVINS, MinPxDist, int, 15, "Eistance between features (features near each other provide less information).");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, FiRefineFeatures, bool, true, "If we should perform Levenberg-Marquardt refinement");
|
RTABMAP_PARAM(OdomOpenVINS, FiTriangulate1d, bool, false, "If we should perform 1d triangulation instead of 3d.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, FiMaxRuns, int, 5, "Max runs for Levenberg-Marquardt");
|
RTABMAP_PARAM(OdomOpenVINS, FiRefineFeatures, bool, true, "If we should perform Levenberg-Marquardt refinement.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, FiMaxBaseline, double, 40, "Max baseline ratio to accept triangulated features");
|
RTABMAP_PARAM(OdomOpenVINS, FiMaxRuns, int, 5, "Max runs for Levenberg-Marquardt.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, FiMaxCondNumber, double, 10000, "Max condition number of linear triangulation matrix accept triangulated features");
|
RTABMAP_PARAM(OdomOpenVINS, FiMaxBaseline, double, 40, "Max baseline ratio to accept triangulated features.");
|
||||||
|
RTABMAP_PARAM(OdomOpenVINS, FiMaxCondNumber, double, 10000, "Max condition number of linear triangulation matrix accept triangulated features.");
|
||||||
|
|
||||||
RTABMAP_PARAM(OdomOpenVINS, UseFEJ, bool, true, "If first-estimate Jacobians should be used (enable for good consistency)");
|
RTABMAP_PARAM(OdomOpenVINS, UseFEJ, bool, true, "If first-estimate Jacobians should be used (enable for good consistency).");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, Integration, int, 1, "0=discrete, 1=rk4, 2=analytical (if rk4 or analytical used then analytical covariance propagation is used)");
|
RTABMAP_PARAM(OdomOpenVINS, Integration, int, 1, "0=discrete, 1=rk4, 2=analytical (if rk4 or analytical used then analytical covariance propagation is used).");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, CalibCamExtrinsics, bool, false, "Bool to determine whether or not to calibrate imu-to-camera pose");
|
RTABMAP_PARAM(OdomOpenVINS, CalibCamExtrinsics, bool, false, "Bool to determine whether or not to calibrate imu-to-camera pose.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, CalibCamIntrinsics, bool, false, "Bool to determine whether or not to calibrate camera intrinsics");
|
RTABMAP_PARAM(OdomOpenVINS, CalibCamIntrinsics, bool, false, "Bool to determine whether or not to calibrate camera intrinsics.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, CalibCamTimeoffset, bool, false, "Bool to determine whether or not to calibrate camera to IMU time offset");
|
RTABMAP_PARAM(OdomOpenVINS, CalibCamTimeoffset, bool, false, "Bool to determine whether or not to calibrate camera to IMU time offset.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, CalibIMUIntrinsics, bool, false, "Bool to determine whether or not to calibrate the IMU intrinsics");
|
RTABMAP_PARAM(OdomOpenVINS, CalibIMUIntrinsics, bool, false, "Bool to determine whether or not to calibrate the IMU intrinsics.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, CalibIMUGSensitivity, bool, false, "Bool to determine whether or not to calibrate the Gravity sensitivity");
|
RTABMAP_PARAM(OdomOpenVINS, CalibIMUGSensitivity, bool, false, "Bool to determine whether or not to calibrate the Gravity sensitivity.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, MaxClones, int, 11, "Max clone size of sliding window");
|
RTABMAP_PARAM(OdomOpenVINS, MaxClones, int, 11, "Max clone size of sliding window.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, MaxSLAM, int, 50, "Max number of estimated SLAM features");
|
RTABMAP_PARAM(OdomOpenVINS, MaxSLAM, int, 50, "Max number of estimated SLAM features.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, MaxSLAMInUpdate, int, 25, "Max number of SLAM features we allow to be included in a single EKF update.");
|
RTABMAP_PARAM(OdomOpenVINS, MaxSLAMInUpdate, int, 25, "Max number of SLAM features we allow to be included in a single EKF update..");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, MaxMSCKFInUpdate, int, 50, "Max number of MSCKF features we will use at a given image timestep.");
|
RTABMAP_PARAM(OdomOpenVINS, MaxMSCKFInUpdate, int, 50, "Max number of MSCKF features we will use at a given image timestep..");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, FeatRepMSCKF, int, 0, "What representation our features are in (msckf features)");
|
RTABMAP_PARAM(OdomOpenVINS, FeatRepMSCKF, int, 0, "What representation our features are in (msckf features).");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, FeatRepSLAM, int, 4, "What representation our features are in (slam features)");
|
RTABMAP_PARAM(OdomOpenVINS, FeatRepSLAM, int, 4, "What representation our features are in (slam features).");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, DtSLAMDelay, double, 0.0, "Delay, in seconds, that we should wait from init before we start estimating SLAM features");
|
RTABMAP_PARAM(OdomOpenVINS, DtSLAMDelay, double, 0.0, "Delay, in seconds, that we should wait from init before we start estimating SLAM features.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, GravityMag, double, 9.81, "Gravity magnitude in the global frame (i.e. should be 9.81 typically)");
|
RTABMAP_PARAM(OdomOpenVINS, GravityMag, double, 9.81, "Gravity magnitude in the global frame (i.e. should be 9.81 typically).");
|
||||||
RTABMAP_PARAM_STR(OdomOpenVINS, LeftMaskPath, "", "Mask for left image");
|
RTABMAP_PARAM_STR(OdomOpenVINS, LeftMaskPath, "", "Mask for left image.");
|
||||||
RTABMAP_PARAM_STR(OdomOpenVINS, RightMaskPath, "", "Mask for right image");
|
RTABMAP_PARAM_STR(OdomOpenVINS, RightMaskPath, "", "Mask for right image.");
|
||||||
|
|
||||||
RTABMAP_PARAM(OdomOpenVINS, InitWindowTime, double, 2.0, "Amount of time we will initialize over (seconds)");
|
RTABMAP_PARAM(OdomOpenVINS, InitWindowTime, double, 2.0, "Amount of time we will initialize over (seconds).");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, InitIMUThresh, double, 1.0, "Variance threshold on our acceleration to be classified as moving");
|
RTABMAP_PARAM(OdomOpenVINS, InitIMUThresh, double, 1.0, "Variance threshold on our acceleration to be classified as moving.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, InitMaxDisparity, double, 10.0, "Max disparity to consider the platform stationary (dependent on resolution)");
|
RTABMAP_PARAM(OdomOpenVINS, InitMaxDisparity, double, 10.0, "Max disparity to consider the platform stationary (dependent on resolution).");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, InitMaxFeatures, int, 50, "How many features to track during initialization (saves on computation)");
|
RTABMAP_PARAM(OdomOpenVINS, InitMaxFeatures, int, 50, "How many features to track during initialization (saves on computation).");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, InitDynUse, bool, false, "If dynamic initialization should be used");
|
RTABMAP_PARAM(OdomOpenVINS, InitDynUse, bool, false, "If dynamic initialization should be used.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, InitDynMLEOptCalib, bool, false, "If we should optimize calibration during intialization (not recommended)");
|
RTABMAP_PARAM(OdomOpenVINS, InitDynMLEOptCalib, bool, false, "If we should optimize calibration during intialization (not recommended).");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, InitDynMLEMaxIter, int, 50, "How many iterations the MLE refinement should use (zero to skip the MLE)");
|
RTABMAP_PARAM(OdomOpenVINS, InitDynMLEMaxIter, int, 50, "How many iterations the MLE refinement should use (zero to skip the MLE).");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, InitDynMLEMaxTime, double, 0.05, "How many seconds the MLE should be completed in");
|
RTABMAP_PARAM(OdomOpenVINS, InitDynMLEMaxTime, double, 0.05, "How many seconds the MLE should be completed in.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, InitDynMLEMaxThreads, int, 6, "How many threads the MLE should use");
|
RTABMAP_PARAM(OdomOpenVINS, InitDynMLEMaxThreads, int, 6, "How many threads the MLE should use.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, InitDynNumPose, int, 6, "Number of poses to use within our window time (evenly spaced)");
|
RTABMAP_PARAM(OdomOpenVINS, InitDynNumPose, int, 6, "Number of poses to use within our window time (evenly spaced).");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, InitDynMinDeg, double, 10.0, "Orientation change needed to try to init");
|
RTABMAP_PARAM(OdomOpenVINS, InitDynMinDeg, double, 10.0, "Orientation change needed to try to init.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, InitDynInflationOri, double, 10.0, "What to inflate the recovered q_GtoI covariance by");
|
RTABMAP_PARAM(OdomOpenVINS, InitDynInflationOri, double, 10.0, "What to inflate the recovered q_GtoI covariance by.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, InitDynInflationVel, double, 100.0, "What to inflate the recovered v_IinG covariance by");
|
RTABMAP_PARAM(OdomOpenVINS, InitDynInflationVel, double, 100.0, "What to inflate the recovered v_IinG covariance by.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, InitDynInflationBg, double, 10.0, "What to inflate the recovered bias_g covariance by");
|
RTABMAP_PARAM(OdomOpenVINS, InitDynInflationBg, double, 10.0, "What to inflate the recovered bias_g covariance by.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, InitDynInflationBa, double, 100.0, "What to inflate the recovered bias_a covariance by");
|
RTABMAP_PARAM(OdomOpenVINS, InitDynInflationBa, double, 100.0, "What to inflate the recovered bias_a covariance by.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, InitDynMinRecCond, double, 1e-15, "Reciprocal condition number thresh for info inversion");
|
RTABMAP_PARAM(OdomOpenVINS, InitDynMinRecCond, double, 1e-15, "Reciprocal condition number thresh for info inversion.");
|
||||||
|
|
||||||
RTABMAP_PARAM(OdomOpenVINS, TryZUPT, bool, true, "If we should try to use zero velocity update");
|
RTABMAP_PARAM(OdomOpenVINS, TryZUPT, bool, true, "If we should try to use zero velocity update.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, ZUPTChi2Multiplier, double, 0.0, "Chi2 multiplier for zero velocity");
|
RTABMAP_PARAM(OdomOpenVINS, ZUPTChi2Multiplier, double, 0.0, "Chi2 multiplier for zero velocity.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, ZUPTMaxVelodicy, double, 0.1, "Max velocity we will consider to try to do a zupt (i.e. if above this, don't do zupt)");
|
RTABMAP_PARAM(OdomOpenVINS, ZUPTMaxVelodicy, double, 0.1, "Max velocity we will consider to try to do a zupt (i.e. if above this, don't do zupt).");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, ZUPTNoiseMultiplier, double, 10.0, "Multiplier of our zupt measurement IMU noise matrix (default should be 1.0)");
|
RTABMAP_PARAM(OdomOpenVINS, ZUPTNoiseMultiplier, double, 10.0, "Multiplier of our zupt measurement IMU noise matrix (default should be 1.0).");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, ZUPTMaxDisparity, double, 0.5, "Max disparity we will consider to try to do a zupt (i.e. if above this, don't do zupt)");
|
RTABMAP_PARAM(OdomOpenVINS, ZUPTMaxDisparity, double, 0.5, "Max disparity we will consider to try to do a zupt (i.e. if above this, don't do zupt).");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, ZUPTOnlyAtBeginning, bool, false, "If we should only use the zupt at the very beginning static initialization phase");
|
RTABMAP_PARAM(OdomOpenVINS, ZUPTOnlyAtBeginning, bool, false, "If we should only use the zupt at the very beginning static initialization phase.");
|
||||||
|
|
||||||
RTABMAP_PARAM(OdomOpenVINS, AccelerometerNoiseDensity, double, 0.01, "[m/s^2/sqrt(Hz)] (accel \"white noise\")");
|
RTABMAP_PARAM(OdomOpenVINS, AccelerometerNoiseDensity, double, 0.01, "[m/s^2/sqrt(Hz)] (accel \"white noise\").");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, AccelerometerRandomWalk, double, 0.001, "[m/s^3/sqrt(Hz)] (accel bias diffusion)");
|
RTABMAP_PARAM(OdomOpenVINS, AccelerometerRandomWalk, double, 0.001, "[m/s^3/sqrt(Hz)] (accel bias diffusion).");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, GyroscopeNoiseDensity, double, 0.001, "[rad/s/sqrt(Hz)] (gyro \"white noise\")");
|
RTABMAP_PARAM(OdomOpenVINS, GyroscopeNoiseDensity, double, 0.001, "[rad/s/sqrt(Hz)] (gyro \"white noise\").");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, GyroscopeRandomWalk, double, 0.0001, "[rad/s^2/sqrt(Hz)] (gyro bias diffusion)");
|
RTABMAP_PARAM(OdomOpenVINS, GyroscopeRandomWalk, double, 0.0001, "[rad/s^2/sqrt(Hz)] (gyro bias diffusion).");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, UpMSCKFSigmaPx, double, 1.0, "Pixel noise for MSCKF features");
|
RTABMAP_PARAM(OdomOpenVINS, UpMSCKFSigmaPx, double, 1.0, "Pixel noise for MSCKF features.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, UpMSCKFChi2Multiplier, double, 1.0, "Chi2 multiplier for MSCKF features");
|
RTABMAP_PARAM(OdomOpenVINS, UpMSCKFChi2Multiplier, double, 1.0, "Chi2 multiplier for MSCKF features.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, UpSLAMSigmaPx, double, 1.0, "Pixel noise for SLAM features");
|
RTABMAP_PARAM(OdomOpenVINS, UpSLAMSigmaPx, double, 1.0, "Pixel noise for SLAM features.");
|
||||||
RTABMAP_PARAM(OdomOpenVINS, UpSLAMChi2Multiplier, double, 1.0, "Chi2 multiplier for SLAM features");
|
RTABMAP_PARAM(OdomOpenVINS, UpSLAMChi2Multiplier, double, 1.0, "Chi2 multiplier for SLAM features.");
|
||||||
|
|
||||||
// Odometry Open3D
|
// Odometry Open3D
|
||||||
RTABMAP_PARAM(OdomOpen3D, MaxDepth, float, 3.0, "Maximum depth.");
|
RTABMAP_PARAM(OdomOpen3D, MaxDepth, float, 3.0, "Maximum depth.");
|
||||||
RTABMAP_PARAM(OdomOpen3D, Method, int, 0, "Registration method: 0=PointToPlane, 1=Intensity, 2=Hybrid.");
|
RTABMAP_PARAM(OdomOpen3D, Method, int, 0, "Registration method: 0=PointToPlane, 1=Intensity, 2=Hybrid.");
|
||||||
|
|
||||||
|
// Odometry cuVSLAM
|
||||||
|
RTABMAP_PARAM(OdomCuVSLAM, MulticamMode, int, 0, "cuVSLAM multicam_mode setting: 0=moderate, 1=performance, 2=precision.");
|
||||||
|
|
||||||
|
// Odometry LIO-SAM
|
||||||
|
RTABMAP_PARAM_STR(OdomLIOSAM, ConfigPath, "", "Path to LIO-SAM params.yaml config file. When set, sensor/IMU/feature parameters are loaded from the file and the individual parameters below are ignored.");
|
||||||
|
RTABMAP_PARAM(OdomLIOSAM, Sensor, int, 0, "LiDAR sensor: 0=Velodyne, 1=Ouster, 2=Livox");
|
||||||
|
RTABMAP_PARAM(OdomLIOSAM, NScan, int, 16, "Number of LiDAR channels (16, 32, 64, 128).");
|
||||||
|
RTABMAP_PARAM(OdomLIOSAM, HorizonScan, int, 1800, "Horizontal resolution (Velodyne:1800, Ouster:512/1024/2048).");
|
||||||
|
RTABMAP_PARAM(OdomLIOSAM, ImuAccNoise, float, 0.01, "IMU accelerometer white noise.");
|
||||||
|
RTABMAP_PARAM(OdomLIOSAM, ImuGyrNoise, float, 0.001, "IMU gyroscope white noise.");
|
||||||
|
RTABMAP_PARAM(OdomLIOSAM, ImuAccBiasN, float, 0.0002,"IMU accelerometer bias noise.");
|
||||||
|
RTABMAP_PARAM(OdomLIOSAM, ImuGyrBiasN, float, 0.00003,"IMU gyroscope bias noise.");
|
||||||
|
RTABMAP_PARAM(OdomLIOSAM, ImuGravity, float, 9.80511,"Gravity magnitude.");
|
||||||
|
RTABMAP_PARAM(OdomLIOSAM, EdgeThreshold,float, 1.0, "Edge feature curvature threshold.");
|
||||||
|
RTABMAP_PARAM(OdomLIOSAM, SurfThreshold,float, 0.1, "Surface feature curvature threshold.");
|
||||||
|
RTABMAP_PARAM(OdomLIOSAM, LinVar, float, 0.01, "Linear output variance.");
|
||||||
|
RTABMAP_PARAM(OdomLIOSAM, AngVar, float, 0.01, "Angular output variance.");
|
||||||
|
|
||||||
// Common registration parameters
|
// Common registration parameters
|
||||||
RTABMAP_PARAM(Reg, RepeatOnce, bool, true, "Do a second registration with the output of the first registration as guess. Only done if no guess was provided for the first registration (like on loop closure). It can be useful if the registration approach used can use a guess to get better matches.");
|
RTABMAP_PARAM(Reg, RepeatOnce, bool, true, "Do a second registration with the output of the first registration as guess. Only done if no guess was provided for the first registration (like on loop closure). It can be useful if the registration approach used can use a guess to get better matches.");
|
||||||
RTABMAP_PARAM(Reg, Strategy, int, 0, "0=Vis, 1=Icp, 2=VisIcp");
|
RTABMAP_PARAM(Reg, Strategy, int, 0, "0=Vis, 1=Icp, 2=VisIcp");
|
||||||
@@ -700,16 +733,16 @@ class RTABMAP_CORE_EXPORT 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 12=SURF/FREAK 13=GFTT/DAISY 14=SURF/DAISY 15=PyDetector");
|
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 16=SuperPoint-Rpautrat");
|
||||||
#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 12=SURF/FREAK 13=GFTT/DAISY 14=SURF/DAISY 15=PyDetector");
|
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 16=SuperPoint-Rpautrat");
|
||||||
#endif
|
#endif
|
||||||
RTABMAP_PARAM(Vis, MaxFeatures, int, 1000, "0 no limits.");
|
RTABMAP_PARAM(Vis, MaxFeatures, int, 1000, "0 no limits.");
|
||||||
RTABMAP_PARAM(Vis, SSC, bool, false, "If true, SSC (Suppression via Square Covering) is applied to limit keypoints.");
|
RTABMAP_PARAM(Vis, SSC, bool, false, "If true, SSC (Suppression via Square Covering) is applied to limit keypoints.");
|
||||||
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).");
|
||||||
RTABMAP_PARAM(Vis, MinDepth, float, 0, "Min depth of the features (0 means no limit).");
|
RTABMAP_PARAM(Vis, MinDepth, float, 0, "Min depth of the features (0 means no limit).");
|
||||||
RTABMAP_PARAM(Vis, DepthAsMask, bool, true, "Use depth image as mask when extracting features.");
|
RTABMAP_PARAM(Vis, DepthAsMask, bool, true, "Use depth image as mask when extracting features.");
|
||||||
RTABMAP_PARAM(Vis, DepthMaskFloorThr, float, 0.0, uFormat("Filter floor from depth mask below specified threshold (m) before extracting features. 0 means disabled, negative means remove all objects above the floor threshold instead. Ignored if %s is false.", kVisDepthAsMask().c_str()));
|
RTABMAP_PARAM(Vis, DepthMaskFloorThr, float, 0.0, uFormat("Filter floor from depth mask below specified threshold (m) before extracting features. 0 means disabled. Ignored if %s is false.", kVisDepthAsMask().c_str()));
|
||||||
RTABMAP_PARAM_STR(Vis, RoiRatios, "0.0 0.0 0.0 0.0", "Region of interest ratios [left, right, top, bottom].");
|
RTABMAP_PARAM_STR(Vis, RoiRatios, "0.0 0.0 0.0 0.0", "Region of interest ratios [left, right, top, bottom].");
|
||||||
RTABMAP_PARAM(Vis, SubPixWinSize, int, 3, "See cv::cornerSubPix().");
|
RTABMAP_PARAM(Vis, SubPixWinSize, int, 3, "See cv::cornerSubPix().");
|
||||||
RTABMAP_PARAM(Vis, SubPixIterations, int, 0, "See cv::cornerSubPix(). 0 disables sub pixel refining.");
|
RTABMAP_PARAM(Vis, SubPixIterations, int, 0, "See cv::cornerSubPix(). 0 disables sub pixel refining.");
|
||||||
@@ -725,8 +758,11 @@ class RTABMAP_CORE_EXPORT Parameters
|
|||||||
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()));
|
||||||
RTABMAP_PARAM(Vis, CorFlowGpu, bool, false, uFormat("[%s=1] Enable GPU version of the optical flow approach (only available if OpenCV is built with CUDA).", kVisCorType().c_str()));
|
RTABMAP_PARAM(Vis, CorFlowUseMinEigenVals, bool, true, uFormat("[%s=1] See cv::calcOpticalFlowPyrLK(). Used for optical flow approach. Use minimum eigen values as an error measure, otherwise L1 distance between patches is used as an error measure.", kVisCorType().c_str()));
|
||||||
#if defined(RTABMAP_G2O) || defined(RTABMAP_ORB_SLAM)
|
RTABMAP_PARAM(Vis, CorFlowMinEigThreshold, float, 1e-4, uFormat("[%s=true] If the minimum eigenvalue of a feature's spatial gradient matrix is less than this threshold, then the feature is filtered out.", kVisCorFlowUseMinEigenVals().c_str()));
|
||||||
|
RTABMAP_PARAM(Vis, CorFlowErrorThreshold, float, 20, uFormat("[%s=false] Filter out features with error greater than this threshold.", kVisCorFlowUseMinEigenVals().c_str()));
|
||||||
|
RTABMAP_PARAM(Vis, CorFlowGpu, bool, false, uFormat("[%s=1] Enable GPU version of the optical flow approach (only available if OpenCV is built with CUDA). Note that %s is not used in the GPU implementation.", kVisCorType().c_str(), kVisCorFlowUseMinEigenVals().c_str()));
|
||||||
|
#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.");
|
||||||
@@ -803,7 +839,10 @@ class RTABMAP_CORE_EXPORT Parameters
|
|||||||
RTABMAP_PARAM(Stereo, OpticalFlow, bool, true, "Use optical flow to find stereo correspondences, otherwise a simple block matching approach is used.");
|
RTABMAP_PARAM(Stereo, OpticalFlow, bool, true, "Use optical flow to find stereo correspondences, otherwise a simple block matching approach is used.");
|
||||||
RTABMAP_PARAM(Stereo, SSD, bool, true, uFormat("[%s=false] Use Sum of Squared Differences (SSD) window, otherwise Sum of Absolute Differences (SAD) window is used.", kStereoOpticalFlow().c_str()));
|
RTABMAP_PARAM(Stereo, SSD, bool, true, uFormat("[%s=false] Use Sum of Squared Differences (SSD) window, otherwise Sum of Absolute Differences (SAD) window is used.", kStereoOpticalFlow().c_str()));
|
||||||
RTABMAP_PARAM(Stereo, Eps, double, 0.01, uFormat("[%s=true] Epsilon stop criterion.", kStereoOpticalFlow().c_str()));
|
RTABMAP_PARAM(Stereo, Eps, double, 0.01, uFormat("[%s=true] Epsilon stop criterion.", kStereoOpticalFlow().c_str()));
|
||||||
RTABMAP_PARAM(Stereo, Gpu, bool, false, uFormat("[%s=true] Enable GPU version of the optical flow approach (only available if OpenCV is built with CUDA).", kStereoOpticalFlow().c_str()));
|
RTABMAP_PARAM(Stereo, UseMinEigenVals, bool, true, uFormat("[%s=true] Use minimum eigen values as an error measure, otherwise L1 distance between patches is used as an error measure.", kStereoOpticalFlow().c_str()));
|
||||||
|
RTABMAP_PARAM(Stereo, MinEigThreshold, double, 1e-4, uFormat("[%s=true] If the minimum eigenvalue of a feature's spatial gradient matrix is less than this threshold, then the feature is filtered out.", kStereoUseMinEigenVals().c_str()));
|
||||||
|
RTABMAP_PARAM(Stereo, ErrorThreshold, double, 50, uFormat("[%s=false] Filter out features with error greater than this threshold.", kStereoUseMinEigenVals().c_str()));
|
||||||
|
RTABMAP_PARAM(Stereo, Gpu, bool, false, uFormat("[%s=true] Enable GPU version of the optical flow approach (only available if OpenCV is built with CUDA). Note that %s is not used in the GPU implementation.", kStereoOpticalFlow().c_str(), kStereoUseMinEigenVals().c_str()));
|
||||||
|
|
||||||
RTABMAP_PARAM(Stereo, DenseStrategy, int, 0, "0=cv::StereoBM, 1=cv::StereoSGBM");
|
RTABMAP_PARAM(Stereo, DenseStrategy, int, 0, "0=cv::StereoBM, 1=cv::StereoSGBM");
|
||||||
|
|
||||||
@@ -879,19 +918,29 @@ class RTABMAP_CORE_EXPORT Parameters
|
|||||||
RTABMAP_PARAM(GridGlobal, ProbClampingMax, float, 0.971, "Probability clamping maximum (value between 0 and 1).");
|
RTABMAP_PARAM(GridGlobal, ProbClampingMax, float, 0.971, "Probability clamping maximum (value between 0 and 1).");
|
||||||
RTABMAP_PARAM(GridGlobal, FloodFillDepth, unsigned int, 0, "Flood fill filter (0=disabled), used to remove empty cells outside the map. The flood fill is done at the specified depth (between 1 and 16) of the OctoMap.");
|
RTABMAP_PARAM(GridGlobal, FloodFillDepth, unsigned int, 0, "Flood fill filter (0=disabled), used to remove empty cells outside the map. The flood fill is done at the specified depth (between 1 and 16) of the OctoMap.");
|
||||||
|
|
||||||
RTABMAP_PARAM(Marker, Dictionary, int, 0, "Dictionary to use: DICT_ARUCO_4X4_50=0, DICT_ARUCO_4X4_100=1, DICT_ARUCO_4X4_250=2, DICT_ARUCO_4X4_1000=3, DICT_ARUCO_5X5_50=4, DICT_ARUCO_5X5_100=5, DICT_ARUCO_5X5_250=6, DICT_ARUCO_5X5_1000=7, DICT_ARUCO_6X6_50=8, DICT_ARUCO_6X6_100=9, DICT_ARUCO_6X6_250=10, DICT_ARUCO_6X6_1000=11, DICT_ARUCO_7X7_50=12, DICT_ARUCO_7X7_100=13, DICT_ARUCO_7X7_250=14, DICT_ARUCO_7X7_1000=15, DICT_ARUCO_ORIGINAL = 16, DICT_APRILTAG_16h5=17, DICT_APRILTAG_25h9=18, DICT_APRILTAG_36h10=19, DICT_APRILTAG_36h11=20");
|
RTABMAP_PARAM(Marker, Strategy, int, 0, "Marker detection implementation: 0=OpenCV, 1=AprilTag");
|
||||||
RTABMAP_PARAM(Marker, Length, float, 0, "The length (m) of the markers' side. 0 means automatic marker length estimation using the depth image (the camera should look at the marker perpendicularly for initialization).");
|
RTABMAP_PARAM(Marker, Dictionary, int, 0, "Dictionary to use: DICT_ARUCO_4X4_50=0, DICT_ARUCO_4X4_100=1, DICT_ARUCO_4X4_250=2, DICT_ARUCO_4X4_1000=3, DICT_ARUCO_5X5_50=4, DICT_ARUCO_5X5_100=5, DICT_ARUCO_5X5_250=6, DICT_ARUCO_5X5_1000=7, DICT_ARUCO_6X6_50=8, DICT_ARUCO_6X6_100=9, DICT_ARUCO_6X6_250=10, DICT_ARUCO_6X6_1000=11, DICT_ARUCO_7X7_50=12, DICT_ARUCO_7X7_100=13, DICT_ARUCO_7X7_250=14, DICT_ARUCO_7X7_1000=15, DICT_ARUCO_ORIGINAL = 16, DICT_APRILTAG_16h5=17, DICT_APRILTAG_25h9=18, DICT_APRILTAG_36h10=19, DICT_APRILTAG_36h11=20, DICT_ARUCO_MIP_36H12=21");
|
||||||
|
RTABMAP_PARAM(Marker, Length, float, 0, "The length (m) of the markers' side. Value <=0 means automatic marker length estimation using the depth image (the camera should look at the marker perpendicularly for initialization). If 0, the length is estimated only on the first marker detected, then re-used for all next detections (i.e., this assumes that markers have all the same length). With <0, the length is estimated once for each unique marker, then re-used for next detections with the same marker ID.");
|
||||||
|
RTABMAP_PARAM_STR(Marker, Lengths, "", uFormat("List of markers to detect. Format is the marker's ID followed by its length (in meters), multiple markers are separated by a vertical line (\"id1 length|id2 length\"). We can also define a range of markers with \"id1:id2 length\" (id2 included). If empty, all markers of the chosen dictionary can be detected and their length is set/estimated based on %s. For example, to detect markers 12 and 14 with lengths of 8 and 15 cm respectively, and all markers between 30 and 40 with a length of 10 cm, set \"12 0.08|14 0.15|30:40 0.1\".", kMarkerLength().c_str()).c_str());
|
||||||
RTABMAP_PARAM(Marker, MaxDepthError, float, 0.01, uFormat("Maximum depth error between all corners of a marker when estimating the marker length (when %s is 0). The smaller it is, the more perpendicular the camera should be toward the marker to initialize the length.", kMarkerLength().c_str()));
|
RTABMAP_PARAM(Marker, MaxDepthError, float, 0.01, uFormat("Maximum depth error between all corners of a marker when estimating the marker length (when %s is 0). The smaller it is, the more perpendicular the camera should be toward the marker to initialize the length.", kMarkerLength().c_str()));
|
||||||
RTABMAP_PARAM(Marker, VarianceLinear, float, 0.001, uFormat("Linear variance to set on marker detections. If %s is enabled and %s=2 (GTSAM): it is the variance of the range factor, with 9999 to disable range factor and to do only bearing.", kMarkerVarianceOrientationIgnored().c_str(), kOptimizerStrategy().c_str()));
|
RTABMAP_PARAM(Marker, VarianceLinear, float, 0.001, uFormat("Linear variance to set on marker detections. If %s is enabled and %s=2 (GTSAM): it is the variance of the range factor, with 9999 to disable range factor and to do only bearing.", kMarkerVarianceOrientationIgnored().c_str(), kOptimizerStrategy().c_str()));
|
||||||
RTABMAP_PARAM(Marker, VarianceAngular, float, 0.01, uFormat("Angular variance to set on marker detections. If %s is enabled, it is ignored with %s=1 (g2o) and it corresponds to bearing variance with %s=2 (GTSAM).", kMarkerVarianceOrientationIgnored().c_str(), kOptimizerStrategy().c_str(), kOptimizerStrategy().c_str()));
|
RTABMAP_PARAM(Marker, VarianceAngular, float, 0.01, uFormat("Angular variance to set on marker detections. If %s is enabled, it is ignored with %s=1 (g2o) and it corresponds to bearing variance with %s=2 (GTSAM).", kMarkerVarianceOrientationIgnored().c_str(), kOptimizerStrategy().c_str(), kOptimizerStrategy().c_str()));
|
||||||
RTABMAP_PARAM(Marker, VarianceOrientationIgnored, bool, false, uFormat("When this setting is false, the landmark's orientation is optimized during graph optimization. When this setting is true, only the position of the landmark is optimized. This can be useful when the landmark's orientation estimation is not reliable. Note that for %s=1 (g2o), only %s needs be set if we ignore orientation. For %s=2 (GTSAM), instead of optimizing the landmark's position directly, a bearing/range factor is used, with %s as the variance of the range factor (with 9999 to optimize the position with only a bearing factor) and %s as the variance of the bearing factor (pitch/yaw).", kOptimizerStrategy().c_str(), kMarkerVarianceLinear().c_str(), kOptimizerStrategy().c_str(), kMarkerVarianceLinear().c_str(), kMarkerVarianceAngular().c_str()));
|
RTABMAP_PARAM(Marker, VarianceOrientationIgnored, bool, false, uFormat("When this setting is false, the landmark's orientation is optimized during graph optimization. When this setting is true, only the position of the landmark is optimized. This can be useful when the landmark's orientation estimation is not reliable. Note that for %s=1 (g2o), only %s needs be set if we ignore orientation. For %s=2 (GTSAM), instead of optimizing the landmark's position directly, a bearing/range factor is used, with %s as the variance of the range factor (with 9999 to optimize the position with only a bearing factor) and %s as the variance of the bearing factor (pitch/yaw).", kOptimizerStrategy().c_str(), kMarkerVarianceLinear().c_str(), kOptimizerStrategy().c_str(), kMarkerVarianceLinear().c_str(), kMarkerVarianceAngular().c_str()));
|
||||||
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, 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(Marker, MinRange, float, 0.0, "Miniminum range in which markers will be detected. <=0 for unlimited range.");
|
||||||
RTABMAP_PARAM_STR(Marker, Priors, "", "World prior locations of the markers. The map will be transformed in marker's world frame when a tag is detected. Format is the marker's ID followed by its position (angles in rad), markers are separated by vertical line (\"id1 x y z roll pitch yaw|id2 x y z roll pitch yaw\"). Example: \"1 0 0 1 0 0 0|2 1 0 1 0 0 1.57\" (marker 2 is 1 meter forward than marker 1 with 90 deg yaw rotation).");
|
RTABMAP_PARAM_STR(Marker, Priors, "", "World prior locations of the markers. The map will be transformed in marker's world frame when a tag is detected. Format is the marker's ID followed by its position (angles in rad), multiple markers are separated by vertical line (\"id1 x y z roll pitch yaw|id2 x y z roll pitch yaw\"). Example: \"1 0 0 1 0 0 0|2 1 0 1 0 0 1.57\" (marker 2 is 1 meter forward than marker 1 with 90 deg yaw rotation).");
|
||||||
RTABMAP_PARAM(Marker, PriorsVarianceLinear, float, 0.001, "Linear variance to set on marker priors.");
|
RTABMAP_PARAM(Marker, PriorsVarianceLinear, float, 0.001, "Linear variance to set on marker priors.");
|
||||||
RTABMAP_PARAM(Marker, PriorsVarianceAngular, float, 0.001, "Angular variance to set on marker priors.");
|
RTABMAP_PARAM(Marker, PriorsVarianceAngular, float, 0.001, "Angular variance to set on marker priors.");
|
||||||
|
|
||||||
|
RTABMAP_PARAM(MarkerAprilTag, NThreads, int, 1, "How many threads should be used?");
|
||||||
|
RTABMAP_PARAM(MarkerAprilTag, QuadDecimate, float, 1.0, "Detection of quads can be done on a lower-resolution image, improving speed at a cost of pose accuracy and a slight decrease in detection rate. Decoding the binary payload is still done at full resolution.");
|
||||||
|
RTABMAP_PARAM(MarkerAprilTag, QuadSigma, float, 0.0, "What Gaussian blur should be applied to the segmented image (used for quad detection?) Parameter is the standard deviation in pixels. Very noisy images benefit from non-zero values (e.g. 0.8).");
|
||||||
|
RTABMAP_PARAM(MarkerAprilTag, RefineEdges, bool, true, uFormat("When true, the edges of the each quad are adjusted to \"snap to\" strong gradients nearby. This is useful when decimation is employed, as it can increase the quality of the initial quad estimate substantially. Generally recommended to be on (true). Very computationally inexpensive. Option is ignored if %s = 1.", kMarkerAprilTagQuadDecimate().c_str()));
|
||||||
|
RTABMAP_PARAM(MarkerAprilTag, DecodeSharpening, double, 0.25, "How much sharpening should be done to decoded images? This can help decode small tags but may or may not help in odd lighting conditions or low light conditions.");
|
||||||
|
RTABMAP_PARAM(MarkerAprilTag, Debug, bool, false, uFormat("When true, write a variety of debugging images to the working directory where the app started (not %s) at various stages through the detection process. (Somewhat slow).", kRtabmapWorkingDirectory().c_str()));
|
||||||
|
|
||||||
|
RTABMAP_PARAM(MarkerOpenCV, CornerRefinementMethod, int, 0, "Corner refinement method for OpenCV strategy (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(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].");
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#ifndef CORELIB_SRC_PYTHON_PYTHONINTERFACE_H_
|
#ifndef CORELIB_SRC_PYTHON_PYTHONINTERFACE_H_
|
||||||
#define CORELIB_SRC_PYTHON_PYTHONINTERFACE_H_
|
#define CORELIB_SRC_PYTHON_PYTHONINTERFACE_H_
|
||||||
|
|
||||||
|
#include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <rtabmap/utilite/UMutex.h>
|
#include <rtabmap/utilite/UMutex.h>
|
||||||
@@ -23,7 +24,7 @@ namespace rtabmap {
|
|||||||
* Create a single PythonInterface on main thread at
|
* Create a single PythonInterface on main thread at
|
||||||
* global scope before any Python classes.
|
* global scope before any Python classes.
|
||||||
*/
|
*/
|
||||||
class PythonInterface
|
class RTABMAP_CORE_EXPORT PythonInterface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PythonInterface();
|
PythonInterface();
|
||||||
@@ -34,7 +35,7 @@ private:
|
|||||||
pybind11::gil_scoped_release* release_;
|
pybind11::gil_scoped_release* release_;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::string getPythonTraceback();
|
std::string RTABMAP_CORE_EXPORT getPythonTraceback();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ public:
|
|||||||
inliersMeanDistance(0.0f),
|
inliersMeanDistance(0.0f),
|
||||||
inliersDistribution(0.0f),
|
inliersDistribution(0.0f),
|
||||||
matches(0),
|
matches(0),
|
||||||
|
variance(0.0f),
|
||||||
icpInliersRatio(0),
|
icpInliersRatio(0),
|
||||||
icpTranslation(0.0f),
|
icpTranslation(0.0f),
|
||||||
icpRotation(0.0f),
|
icpRotation(0.0f),
|
||||||
@@ -64,6 +65,7 @@ public:
|
|||||||
output.inliersDistribution = inliersDistribution;
|
output.inliersDistribution = inliersDistribution;
|
||||||
output.matches = matches;
|
output.matches = matches;
|
||||||
output.matchesPerCam = matchesPerCam;
|
output.matchesPerCam = matchesPerCam;
|
||||||
|
output.variance = variance;
|
||||||
output.icpInliersRatio = icpInliersRatio;
|
output.icpInliersRatio = icpInliersRatio;
|
||||||
output.icpTranslation = icpTranslation;
|
output.icpTranslation = icpTranslation;
|
||||||
output.icpRotation = icpRotation;
|
output.icpRotation = icpRotation;
|
||||||
@@ -85,6 +87,7 @@ public:
|
|||||||
float inliersDistribution;
|
float inliersDistribution;
|
||||||
std::vector<int> inliersIDs;
|
std::vector<int> inliersIDs;
|
||||||
int matches;
|
int matches;
|
||||||
|
float variance;
|
||||||
std::vector<int> matchesIDs;
|
std::vector<int> matchesIDs;
|
||||||
std::vector<int> projectedIDs; // "From" IDs
|
std::vector<int> projectedIDs; // "From" IDs
|
||||||
std::vector<int> inliersPerCam;
|
std::vector<int> inliersPerCam;
|
||||||
|
|||||||
@@ -91,6 +91,9 @@ private:
|
|||||||
float _flowEps;
|
float _flowEps;
|
||||||
int _flowMaxLevel;
|
int _flowMaxLevel;
|
||||||
bool _flowGpu;
|
bool _flowGpu;
|
||||||
|
bool _flowUseMinEigenVals;
|
||||||
|
float _flowMinEigThreshold;
|
||||||
|
float _flowErrorThreshold;
|
||||||
float _nndr;
|
float _nndr;
|
||||||
int _nnType;
|
int _nnType;
|
||||||
bool _gmsWithRotation;
|
bool _gmsWithRotation;
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "rtabmap/core/Statistics.h"
|
#include "rtabmap/core/Statistics.h"
|
||||||
#include "rtabmap/core/Link.h"
|
#include "rtabmap/core/Link.h"
|
||||||
#include "rtabmap/core/ProgressState.h"
|
#include "rtabmap/core/ProgressState.h"
|
||||||
|
#include "rtabmap/core/Graph.h"
|
||||||
|
|
||||||
#include <opencv2/core/core.hpp>
|
#include <opencv2/core/core.hpp>
|
||||||
#include <list>
|
#include <list>
|
||||||
@@ -209,7 +210,8 @@ public:
|
|||||||
bool intraSession = true,
|
bool intraSession = true,
|
||||||
bool interSession = true,
|
bool interSession = true,
|
||||||
const ProgressState * state = 0,
|
const ProgressState * state = 0,
|
||||||
float clusterRadiusMin = 0.0f);
|
float clusterRadiusMin = 0.0f,
|
||||||
|
int toFromMapId = -1);
|
||||||
bool globalBundleAdjustment(
|
bool globalBundleAdjustment(
|
||||||
int optimizerType = 1 /*g2o*/,
|
int optimizerType = 1 /*g2o*/,
|
||||||
bool rematchFeatures = true,
|
bool rematchFeatures = true,
|
||||||
@@ -263,6 +265,13 @@ private:
|
|||||||
std::multimap<int, Link> * constraints = 0,
|
std::multimap<int, Link> * constraints = 0,
|
||||||
double * error = 0,
|
double * error = 0,
|
||||||
int * iterationsDone = 0) const;
|
int * iterationsDone = 0) const;
|
||||||
|
std::list<std::pair<int, int> > repairGraph(
|
||||||
|
graph::MaxGraphErrors & maxGraphErrors,
|
||||||
|
std::map<int, Transform> & poses,
|
||||||
|
std::multimap<int, Link> & constraints,
|
||||||
|
double & optimizationError,
|
||||||
|
int & optimizationIterations,
|
||||||
|
cv::Mat & optimizationCovariance);
|
||||||
void updateGoalIndex();
|
void updateGoalIndex();
|
||||||
bool computePath(int targetNode, std::map<int, Transform> nodes, const std::multimap<int, rtabmap::Link> & constraints);
|
bool computePath(int targetNode, std::map<int, Transform> nodes, const std::multimap<int, rtabmap::Link> & constraints);
|
||||||
|
|
||||||
@@ -319,6 +328,7 @@ private:
|
|||||||
std::string _databasePath;
|
std::string _databasePath;
|
||||||
bool _optimizeFromGraphEnd;
|
bool _optimizeFromGraphEnd;
|
||||||
float _optimizationMaxError;
|
float _optimizationMaxError;
|
||||||
|
float _optimizationMaxErrorRepairRadius;
|
||||||
bool _startNewMapOnLoopClosure;
|
bool _startNewMapOnLoopClosure;
|
||||||
bool _startNewMapOnGoodSignature;
|
bool _startNewMapOnGoodSignature;
|
||||||
float _goalReachedRadius; // meters
|
float _goalReachedRadius; // meters
|
||||||
@@ -333,6 +343,7 @@ private:
|
|||||||
int _maxOdomCacheSize;
|
int _maxOdomCacheSize;
|
||||||
bool _localizationSmoothing;
|
bool _localizationSmoothing;
|
||||||
double _localizationPriorInf;
|
double _localizationPriorInf;
|
||||||
|
bool _localizationSecondTryWithoutProximityLinks;
|
||||||
bool _createGlobalScanMap;
|
bool _createGlobalScanMap;
|
||||||
float _markerPriorsLinearVariance;
|
float _markerPriorsLinearVariance;
|
||||||
float _markerPriorsAngularVariance;
|
float _markerPriorsAngularVariance;
|
||||||
@@ -377,6 +388,7 @@ private:
|
|||||||
std::map<int, Transform> _odomCachePoses; // used in localization mode to reject loop closures
|
std::map<int, Transform> _odomCachePoses; // used in localization mode to reject loop closures
|
||||||
std::multimap<int, Link> _odomCacheConstraints; // used in localization mode to reject loop closures
|
std::multimap<int, Link> _odomCacheConstraints; // used in localization mode to reject loop closures
|
||||||
std::map<int, Transform> _markerPriors;
|
std::map<int, Transform> _markerPriors;
|
||||||
|
std::pair<int, int> _lastRejectedLoopClosureIds;
|
||||||
|
|
||||||
std::set<int> _nodesToRepublish;
|
std::set<int> _nodesToRepublish;
|
||||||
|
|
||||||
|
|||||||
@@ -106,7 +106,6 @@ private:
|
|||||||
unsigned int _dataBufferMaxSize;
|
unsigned int _dataBufferMaxSize;
|
||||||
float _rate;
|
float _rate;
|
||||||
bool _createIntermediateNodes;
|
bool _createIntermediateNodes;
|
||||||
UTimer * _frameRateTimer;
|
|
||||||
double _previousStamp;
|
double _previousStamp;
|
||||||
|
|
||||||
Rtabmap * _rtabmap;
|
Rtabmap * _rtabmap;
|
||||||
|
|||||||
@@ -78,6 +78,16 @@ public:
|
|||||||
double stamp = 0.0,
|
double stamp = 0.0,
|
||||||
const cv::Mat & userData = cv::Mat());
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
|
// RGB-D constructor + depth confidence
|
||||||
|
SensorData(
|
||||||
|
const cv::Mat & rgb,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
const cv::Mat & depth_confidence,
|
||||||
|
const CameraModel & cameraModel,
|
||||||
|
int id = 0,
|
||||||
|
double stamp = 0.0,
|
||||||
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
// RGB-D constructor + laser scan
|
// RGB-D constructor + laser scan
|
||||||
SensorData(
|
SensorData(
|
||||||
const LaserScan & laserScan,
|
const LaserScan & laserScan,
|
||||||
@@ -88,6 +98,17 @@ public:
|
|||||||
double stamp = 0.0,
|
double stamp = 0.0,
|
||||||
const cv::Mat & userData = cv::Mat());
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
|
// RGB-D constructor + confidence + laser scan
|
||||||
|
SensorData(
|
||||||
|
const LaserScan & laserScan,
|
||||||
|
const cv::Mat & rgb,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
const cv::Mat & depthConfidence,
|
||||||
|
const CameraModel & cameraModel,
|
||||||
|
int id = 0,
|
||||||
|
double stamp = 0.0,
|
||||||
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
// Multi-cameras RGB-D constructor
|
// Multi-cameras RGB-D constructor
|
||||||
SensorData(
|
SensorData(
|
||||||
const cv::Mat & rgb,
|
const cv::Mat & rgb,
|
||||||
@@ -97,6 +118,16 @@ public:
|
|||||||
double stamp = 0.0,
|
double stamp = 0.0,
|
||||||
const cv::Mat & userData = cv::Mat());
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
|
// Multi-cameras RGB-D constructor + depth confidence
|
||||||
|
SensorData(
|
||||||
|
const cv::Mat & rgb,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
const cv::Mat & depthConfidence,
|
||||||
|
const std::vector<CameraModel> & cameraModels,
|
||||||
|
int id = 0,
|
||||||
|
double stamp = 0.0,
|
||||||
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
// Multi-cameras RGB-D constructor + laser scan
|
// Multi-cameras RGB-D constructor + laser scan
|
||||||
SensorData(
|
SensorData(
|
||||||
const LaserScan & laserScan,
|
const LaserScan & laserScan,
|
||||||
@@ -107,6 +138,17 @@ public:
|
|||||||
double stamp = 0.0,
|
double stamp = 0.0,
|
||||||
const cv::Mat & userData = cv::Mat());
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
|
// Multi-cameras RGB-D constructor + depth confidence + laser scan
|
||||||
|
SensorData(
|
||||||
|
const LaserScan & laserScan,
|
||||||
|
const cv::Mat & rgb,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
const cv::Mat & depthConfidence,
|
||||||
|
const std::vector<CameraModel> & cameraModels,
|
||||||
|
int id = 0,
|
||||||
|
double stamp = 0.0,
|
||||||
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
// Stereo constructor
|
// Stereo constructor
|
||||||
SensorData(
|
SensorData(
|
||||||
const cv::Mat & left,
|
const cv::Mat & left,
|
||||||
@@ -160,6 +202,8 @@ public:
|
|||||||
_imageCompressed.empty() &&
|
_imageCompressed.empty() &&
|
||||||
_depthOrRightRaw.empty() &&
|
_depthOrRightRaw.empty() &&
|
||||||
_depthOrRightCompressed.empty() &&
|
_depthOrRightCompressed.empty() &&
|
||||||
|
_depthConfidenceRaw.empty() &&
|
||||||
|
_depthConfidenceCompressed.empty() &&
|
||||||
_laserScanRaw.isEmpty() &&
|
_laserScanRaw.isEmpty() &&
|
||||||
_laserScanCompressed.isEmpty() &&
|
_laserScanCompressed.isEmpty() &&
|
||||||
_cameraModels.empty() &&
|
_cameraModels.empty() &&
|
||||||
@@ -168,6 +212,12 @@ public:
|
|||||||
_userDataCompressed.empty() &&
|
_userDataCompressed.empty() &&
|
||||||
_keypoints.size() == 0 &&
|
_keypoints.size() == 0 &&
|
||||||
_descriptors.empty() &&
|
_descriptors.empty() &&
|
||||||
|
_groundCellsRaw.empty() &&
|
||||||
|
_groundCellsCompressed.empty() &&
|
||||||
|
_obstacleCellsRaw.empty() &&
|
||||||
|
_obstacleCellsCompressed.empty() &&
|
||||||
|
_emptyCellsRaw.empty() &&
|
||||||
|
_emptyCellsCompressed.empty() &&
|
||||||
imu_.empty());
|
imu_.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -178,10 +228,12 @@ public:
|
|||||||
|
|
||||||
const cv::Mat & imageCompressed() const {return _imageCompressed;}
|
const cv::Mat & imageCompressed() const {return _imageCompressed;}
|
||||||
const cv::Mat & depthOrRightCompressed() const {return _depthOrRightCompressed;}
|
const cv::Mat & depthOrRightCompressed() const {return _depthOrRightCompressed;}
|
||||||
|
const cv::Mat & depthConfidenceCompressed() const {return _depthConfidenceCompressed;}
|
||||||
const LaserScan & laserScanCompressed() const {return _laserScanCompressed;}
|
const LaserScan & laserScanCompressed() const {return _laserScanCompressed;}
|
||||||
|
|
||||||
const cv::Mat & imageRaw() const {return _imageRaw;}
|
const cv::Mat & imageRaw() const {return _imageRaw;}
|
||||||
const cv::Mat & depthOrRightRaw() const {return _depthOrRightRaw;}
|
const cv::Mat & depthOrRightRaw() const {return _depthOrRightRaw;}
|
||||||
|
const cv::Mat & depthConfidenceRaw() const {return _depthConfidenceRaw;}
|
||||||
const LaserScan & laserScanRaw() const {return _laserScanRaw;}
|
const LaserScan & laserScanRaw() const {return _laserScanRaw;}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -190,7 +242,9 @@ public:
|
|||||||
* @param clearPreviousData, clear previous raw and compressed images before setting the new ones.
|
* @param clearPreviousData, clear previous raw and compressed images before setting the new ones.
|
||||||
*/
|
*/
|
||||||
void setRGBDImage(const cv::Mat & rgb, const cv::Mat & depth, const CameraModel & model, bool clearPreviousData = true);
|
void setRGBDImage(const cv::Mat & rgb, const cv::Mat & depth, const CameraModel & model, bool clearPreviousData = true);
|
||||||
|
void setRGBDImage(const cv::Mat & rgb, const cv::Mat & depth, const cv::Mat & depth_confidence, const CameraModel & model, bool clearPreviousData = true);
|
||||||
void setRGBDImage(const cv::Mat & rgb, const cv::Mat & depth, const std::vector<CameraModel> & models, bool clearPreviousData = true);
|
void setRGBDImage(const cv::Mat & rgb, const cv::Mat & depth, const std::vector<CameraModel> & models, bool clearPreviousData = true);
|
||||||
|
void setRGBDImage(const cv::Mat & rgb, const cv::Mat & depth, const cv::Mat & depth_confidence, const std::vector<CameraModel> & models, bool clearPreviousData = true);
|
||||||
void setStereoImage(const cv::Mat & left, const cv::Mat & right, const StereoCameraModel & stereoCameraModel, bool clearPreviousData = true);
|
void setStereoImage(const cv::Mat & left, const cv::Mat & right, const StereoCameraModel & stereoCameraModel, bool clearPreviousData = true);
|
||||||
void setStereoImage(const cv::Mat & left, const cv::Mat & right, const std::vector<StereoCameraModel> & stereoCameraModels, bool clearPreviousData = true);
|
void setStereoImage(const cv::Mat & left, const cv::Mat & right, const std::vector<StereoCameraModel> & stereoCameraModels, bool clearPreviousData = true);
|
||||||
|
|
||||||
@@ -227,7 +281,8 @@ public:
|
|||||||
cv::Mat * userDataRaw = 0,
|
cv::Mat * userDataRaw = 0,
|
||||||
cv::Mat * groundCellsRaw = 0,
|
cv::Mat * groundCellsRaw = 0,
|
||||||
cv::Mat * obstacleCellsRaw = 0,
|
cv::Mat * obstacleCellsRaw = 0,
|
||||||
cv::Mat * emptyCellsRaw = 0);
|
cv::Mat * emptyCellsRaw = 0,
|
||||||
|
cv::Mat * depthConfidenceRaw = 0);
|
||||||
void uncompressDataConst(
|
void uncompressDataConst(
|
||||||
cv::Mat * imageRaw,
|
cv::Mat * imageRaw,
|
||||||
cv::Mat * depthOrRightRaw,
|
cv::Mat * depthOrRightRaw,
|
||||||
@@ -235,7 +290,8 @@ public:
|
|||||||
cv::Mat * userDataRaw = 0,
|
cv::Mat * userDataRaw = 0,
|
||||||
cv::Mat * groundCellsRaw = 0,
|
cv::Mat * groundCellsRaw = 0,
|
||||||
cv::Mat * obstacleCellsRaw = 0,
|
cv::Mat * obstacleCellsRaw = 0,
|
||||||
cv::Mat * emptyCellsRaw = 0) const;
|
cv::Mat * emptyCellsRaw = 0,
|
||||||
|
cv::Mat * depthConfidenceRaw = 0) const;
|
||||||
|
|
||||||
const std::vector<CameraModel> & cameraModels() const {return _cameraModels;}
|
const std::vector<CameraModel> & cameraModels() const {return _cameraModels;}
|
||||||
const std::vector<StereoCameraModel> & stereoCameraModels() const {return _stereoCameraModels;}
|
const std::vector<StereoCameraModel> & stereoCameraModels() const {return _stereoCameraModels;}
|
||||||
@@ -259,8 +315,6 @@ public:
|
|||||||
const cv::Mat & empty,
|
const cv::Mat & empty,
|
||||||
float cellSize,
|
float cellSize,
|
||||||
const cv::Point3f & viewPoint);
|
const cv::Point3f & viewPoint);
|
||||||
// remove raw occupancy grids
|
|
||||||
void clearOccupancyGridRaw() {_groundCellsRaw = cv::Mat(); _obstacleCellsRaw = cv::Mat();}
|
|
||||||
const cv::Mat & gridGroundCellsRaw() const {return _groundCellsRaw;}
|
const cv::Mat & gridGroundCellsRaw() const {return _groundCellsRaw;}
|
||||||
const cv::Mat & gridGroundCellsCompressed() const {return _groundCellsCompressed;}
|
const cv::Mat & gridGroundCellsCompressed() const {return _groundCellsCompressed;}
|
||||||
const cv::Mat & gridObstacleCellsRaw() const {return _obstacleCellsRaw;}
|
const cv::Mat & gridObstacleCellsRaw() const {return _obstacleCellsRaw;}
|
||||||
@@ -305,12 +359,12 @@ public:
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
void clearCompressedData(bool images = true, bool scan = true, bool userData = true);
|
void clearCompressedData(bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true);
|
||||||
/**
|
/**
|
||||||
* Clear raw rgb/depth (left/right) images, raw laser scan and raw user data.
|
* Clear raw rgb/depth (left/right) images, raw laser scan and raw user data.
|
||||||
* Compressed data are kept is set.
|
* Compressed data are kept is set.
|
||||||
*/
|
*/
|
||||||
void clearRawData(bool images = true, bool scan = true, bool userData = true);
|
void clearRawData(bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true);
|
||||||
|
|
||||||
bool isPointVisibleFromCameras(const cv::Point3f & pt) const; // assuming point is in robot frame
|
bool isPointVisibleFromCameras(const cv::Point3f & pt) const; // assuming point is in robot frame
|
||||||
|
|
||||||
@@ -327,10 +381,12 @@ private:
|
|||||||
|
|
||||||
cv::Mat _imageCompressed; // compressed image
|
cv::Mat _imageCompressed; // compressed image
|
||||||
cv::Mat _depthOrRightCompressed; // compressed image
|
cv::Mat _depthOrRightCompressed; // compressed image
|
||||||
|
cv::Mat _depthConfidenceCompressed; // compressed data
|
||||||
LaserScan _laserScanCompressed; // compressed data
|
LaserScan _laserScanCompressed; // compressed data
|
||||||
|
|
||||||
cv::Mat _imageRaw; // CV_8UC1 or CV_8UC3
|
cv::Mat _imageRaw; // CV_8UC1 or CV_8UC3
|
||||||
cv::Mat _depthOrRightRaw; // depth CV_16UC1 or CV_32FC1, right image CV_8UC1 or CV_8UC3
|
cv::Mat _depthOrRightRaw; // depth CV_16UC1 or CV_32FC1, right image CV_8UC1 or CV_8UC3
|
||||||
|
cv::Mat _depthConfidenceRaw; // CV_8UC1
|
||||||
LaserScan _laserScanRaw;
|
LaserScan _laserScanRaw;
|
||||||
|
|
||||||
std::vector<CameraModel> _cameraModels;
|
std::vector<CameraModel> _cameraModels;
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ class RTABMAP_CORE_EXPORT Statistics
|
|||||||
RTABMAP_STATS(Loop, Visual_inliers,);
|
RTABMAP_STATS(Loop, Visual_inliers,);
|
||||||
RTABMAP_STATS(Loop, Visual_inliers_ratio,);
|
RTABMAP_STATS(Loop, Visual_inliers_ratio,);
|
||||||
RTABMAP_STATS(Loop, Visual_matches,);
|
RTABMAP_STATS(Loop, Visual_matches,);
|
||||||
|
RTABMAP_STATS(Loop, Visual_variance,);
|
||||||
RTABMAP_STATS(Loop, Distance_since_last_loc, m);
|
RTABMAP_STATS(Loop, Distance_since_last_loc, m);
|
||||||
RTABMAP_STATS(Loop, Last_id,);
|
RTABMAP_STATS(Loop, Last_id,);
|
||||||
RTABMAP_STATS(Loop, Optimization_max_error, m);
|
RTABMAP_STATS(Loop, Optimization_max_error, m);
|
||||||
@@ -75,12 +76,20 @@ class RTABMAP_CORE_EXPORT Statistics
|
|||||||
RTABMAP_STATS(Loop, Optimization_max_ang_error_ratio, );
|
RTABMAP_STATS(Loop, Optimization_max_ang_error_ratio, );
|
||||||
RTABMAP_STATS(Loop, Optimization_error, );
|
RTABMAP_STATS(Loop, Optimization_error, );
|
||||||
RTABMAP_STATS(Loop, Optimization_iterations, );
|
RTABMAP_STATS(Loop, Optimization_iterations, );
|
||||||
|
RTABMAP_STATS(Loop, Optimization_max_error_from_id, );
|
||||||
|
RTABMAP_STATS(Loop, Optimization_max_error_to_id, );
|
||||||
|
RTABMAP_STATS(Loop, Optimization_max_ang_error_from_id, );
|
||||||
|
RTABMAP_STATS(Loop, Optimization_max_ang_error_to_id, );
|
||||||
|
RTABMAP_STATS(Loop, Optimization_max_error_removed_from_id, );
|
||||||
|
RTABMAP_STATS(Loop, Optimization_max_error_removed_to_id, );
|
||||||
|
RTABMAP_STATS(Loop, Optimization_max_error_removed_count, );
|
||||||
RTABMAP_STATS(Loop, Linear_variance,);
|
RTABMAP_STATS(Loop, Linear_variance,);
|
||||||
RTABMAP_STATS(Loop, Angular_variance,);
|
RTABMAP_STATS(Loop, Angular_variance,);
|
||||||
RTABMAP_STATS(Loop, Landmark_detected,);
|
RTABMAP_STATS(Loop, Landmark_detected,);
|
||||||
RTABMAP_STATS(Loop, Landmark_detected_node_ref,);
|
RTABMAP_STATS(Loop, Landmark_detected_node_ref,);
|
||||||
RTABMAP_STATS(Loop, Visual_inliers_mean_dist,m);
|
RTABMAP_STATS(Loop, Visual_inliers_mean_dist,m);
|
||||||
RTABMAP_STATS(Loop, Visual_inliers_distribution,);
|
RTABMAP_STATS(Loop, Visual_inliers_distribution,);
|
||||||
|
RTABMAP_STATS(Loop, Proximity_links_cleared,);
|
||||||
//Odom correction
|
//Odom correction
|
||||||
RTABMAP_STATS(Loop, Odom_correction_norm, m);
|
RTABMAP_STATS(Loop, Odom_correction_norm, m);
|
||||||
RTABMAP_STATS(Loop, Odom_correction_angle, deg);
|
RTABMAP_STATS(Loop, Odom_correction_angle, deg);
|
||||||
|
|||||||
@@ -96,16 +96,23 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
float epsilon() const {return epsilon_;}
|
float epsilon() const {return epsilon_;}
|
||||||
|
bool usingMinEigenVals() const {return useMinEigenVals_;}
|
||||||
|
float minEigThreshold() const {return minEigThreshold_;}
|
||||||
|
float errorThreshold() const {return errorThreshold_;}
|
||||||
virtual bool isGpuEnabled() const;
|
virtual bool isGpuEnabled() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void updateStatus(
|
void updateStatus(
|
||||||
const std::vector<cv::Point2f> & leftCorners,
|
const std::vector<cv::Point2f> & leftCorners,
|
||||||
const std::vector<cv::Point2f> & rightCorners,
|
const std::vector<cv::Point2f> & rightCorners,
|
||||||
std::vector<unsigned char> & status) const;
|
std::vector<unsigned char> & status,
|
||||||
|
std::vector<float> err = {}) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float epsilon_;
|
float epsilon_;
|
||||||
|
bool useMinEigenVals_;
|
||||||
|
float minEigThreshold_;
|
||||||
|
float errorThreshold_;
|
||||||
bool gpu_;
|
bool gpu_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ public:
|
|||||||
void getTranslationAndEulerAngles(float & x, float & y, float & z, float & roll, float & pitch, float & yaw) const;
|
void getTranslationAndEulerAngles(float & x, float & y, float & z, float & roll, float & pitch, float & yaw) const;
|
||||||
void getEulerAngles(float & roll, float & pitch, float & yaw) const;
|
void getEulerAngles(float & roll, float & pitch, float & yaw) const;
|
||||||
void getTranslation(float & x, float & y, float & z) const;
|
void getTranslation(float & x, float & y, float & z) const;
|
||||||
float getAngle(float x=1.0f, float y=0.0f, float z=0.0f) const;
|
float getAngle(const Transform & t) const;
|
||||||
float getNorm() const;
|
float getNorm() const;
|
||||||
float getNormSquared() const;
|
float getNormSquared() const;
|
||||||
float getDistance(const Transform & t) const;
|
float getDistance(const Transform & t) const;
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ public:
|
|||||||
std::vector<int> findNN(const std::list<VisualWord *> & vws) const;
|
std::vector<int> findNN(const std::list<VisualWord *> & vws) const;
|
||||||
std::vector<int> findNN(const cv::Mat & descriptors) const;
|
std::vector<int> findNN(const cv::Mat & descriptors) const;
|
||||||
|
|
||||||
void addWordRef(int wordId, int signatureId);
|
bool addWordRef(int wordId, int signatureId);
|
||||||
void removeAllWordRef(int wordId, int signatureId);
|
void removeAllWordRef(int wordId, int signatureId);
|
||||||
const VisualWord * getWord(int id) const;
|
const VisualWord * getWord(int id) const;
|
||||||
VisualWord * getUnusedWord(int id) const;
|
VisualWord * getUnusedWord(int id) const;
|
||||||
@@ -107,7 +107,11 @@ public:
|
|||||||
bool isIncrementalFlann() const {return _incrementalFlann;}
|
bool isIncrementalFlann() const {return _incrementalFlann;}
|
||||||
void setIncrementalDictionary();
|
void setIncrementalDictionary();
|
||||||
void setFixedDictionary(const std::string & dictionaryPath);
|
void setFixedDictionary(const std::string & dictionaryPath);
|
||||||
|
bool isModified() const;
|
||||||
|
|
||||||
|
std::vector<unsigned char> serializeIndex() const;
|
||||||
|
void deserializeIndex(const std::vector<unsigned char> & data);
|
||||||
|
void deserializeIndex(const unsigned char * data, size_t size);
|
||||||
void exportDictionary(const char * fileNameReferences, const char * fileNameDescriptors) const;
|
void exportDictionary(const char * fileNameReferences, const char * fileNameDescriptors) const;
|
||||||
|
|
||||||
void clear(bool printWarningsIfNotEmpty = true);
|
void clear(bool printWarningsIfNotEmpty = true);
|
||||||
@@ -137,10 +141,12 @@ private:
|
|||||||
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)
|
||||||
bool _newWordsComparedTogether;
|
bool _newWordsComparedTogether;
|
||||||
|
bool _serializeWithChecksum;
|
||||||
int _lastWordId;
|
int _lastWordId;
|
||||||
bool useDistanceL1_;
|
bool useDistanceL1_;
|
||||||
FlannIndex * _flannIndex;
|
FlannIndex * _flannIndex;
|
||||||
cv::Mat _dataTree;
|
cv::Mat _dataTree;
|
||||||
|
bool _modified;
|
||||||
NNStrategy _strategy;
|
NNStrategy _strategy;
|
||||||
std::map<int ,int> _mapIndexId;
|
std::map<int ,int> _mapIndexId;
|
||||||
std::map<int ,int> _mapIdIndex;
|
std::map<int ,int> _mapIdIndex;
|
||||||
|
|||||||
@@ -94,18 +94,19 @@ public:
|
|||||||
_depthFromScanFillHolesFromBorder = fillHolesFromBorder;
|
_depthFromScanFillHolesFromBorder = fillHolesFromBorder;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Format: 0=Raw, 1=RGBD-SLAM, 2=KITTI, 3=TORO, 4=g2o, 5=NewCollege(t,x,y), 6=Malaga Urban GPS, 7=St Lucia INS, 8=Karlsruhe
|
// 0=Raw, 1=RGBD-SLAM motion capture (10=without change of coordinate frame, 11=10+ID), 2=KITTI, 3=TORO, 4=g2o, 5=NewCollege(t,x,y), 6=Malaga Urban GPS, 7=St Lucia INS, 8=Karlsruhe, 9=EuRoC MAV, 12=rgbd_bonn
|
||||||
void setOdometryPath(const std::string & filePath, int format = 0)
|
void setOdometryPath(const std::string & filePath, int format = 0)
|
||||||
{
|
{
|
||||||
_odometryPath = filePath;
|
_odometryPath = filePath;
|
||||||
_odometryFormat = format;
|
_odometryFormat = format;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Format: 0=Raw, 1=RGBD-SLAM, 2=KITTI, 3=TORO, 4=g2o, 5=NewCollege(t,x,y), 6=Malaga Urban GPS, 7=St Lucia INS, 8=Karlsruhe
|
// 0=Raw, 1=RGBD-SLAM motion capture (10=without change of coordinate frame, 11=10+ID), 2=KITTI, 3=TORO, 4=g2o, 5=NewCollege(t,x,y), 6=Malaga Urban GPS, 7=St Lucia INS, 8=Karlsruhe, 9=EuRoC MAV, 12=rgbd_bonn
|
||||||
void setGroundTruthPath(const std::string & filePath, int format = 0)
|
void setGroundTruthPath(const std::string & filePath, int format = 0, const Transform & localTransform = Transform::getIdentity())
|
||||||
{
|
{
|
||||||
_groundTruthPath = filePath;
|
_groundTruthPath = filePath;
|
||||||
_groundTruthFormat = format;
|
_groundTruthFormat = format;
|
||||||
|
_groundTruthLocalTransform = localTransform;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setMaxPoseTimeDiff(double diff) {_maxPoseTimeDiff = diff;}
|
void setMaxPoseTimeDiff(double diff) {_maxPoseTimeDiff = diff;}
|
||||||
@@ -164,6 +165,7 @@ private:
|
|||||||
int _odometryFormat;
|
int _odometryFormat;
|
||||||
std::string _groundTruthPath;
|
std::string _groundTruthPath;
|
||||||
int _groundTruthFormat;
|
int _groundTruthFormat;
|
||||||
|
Transform _groundTruthLocalTransform;
|
||||||
double _maxPoseTimeDiff;
|
double _maxPoseTimeDiff;
|
||||||
|
|
||||||
std::list<double> _stamps;
|
std::list<double> _stamps;
|
||||||
|
|||||||
@@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2025, 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/CameraModel.h"
|
||||||
|
#include "rtabmap/core/Camera.h"
|
||||||
|
#include "rtabmap/core/Version.h"
|
||||||
|
|
||||||
|
#ifdef RTABMAP_ORBBEC_SDK
|
||||||
|
namespace ob
|
||||||
|
{
|
||||||
|
class Pipeline;
|
||||||
|
class Align;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace rtabmap
|
||||||
|
{
|
||||||
|
|
||||||
|
class RTABMAP_CORE_EXPORT CameraOrbbecSDK :
|
||||||
|
public Camera
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static bool available();
|
||||||
|
|
||||||
|
public:
|
||||||
|
// deviceId can be either an index (e.g., "0"), an UID (e.g, "2-1-2" or "gmsl-1") or a serial ("AAA6454S")
|
||||||
|
CameraOrbbecSDK(
|
||||||
|
std::string deviceId = "",
|
||||||
|
unsigned int colorWidth = 800,
|
||||||
|
unsigned int colorHeight = 600,
|
||||||
|
unsigned int depthWidth = 800,
|
||||||
|
unsigned int depthHeight = 600,
|
||||||
|
float imageRate = 0.0f,
|
||||||
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
virtual ~CameraOrbbecSDK();
|
||||||
|
|
||||||
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
|
virtual bool isCalibrated() const;
|
||||||
|
virtual std::string getSerial() const;
|
||||||
|
|
||||||
|
void close();
|
||||||
|
|
||||||
|
// Should be set before initializing
|
||||||
|
void enableColorRectification(bool enabled);
|
||||||
|
void enableImu(bool enabled);
|
||||||
|
|
||||||
|
void enableDepthMM(bool enabled);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual SensorData captureImage(SensorCaptureInfo * info = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
#ifdef RTABMAP_ORBBEC_SDK
|
||||||
|
std::string deviceId_;
|
||||||
|
unsigned int colorWidth_;
|
||||||
|
unsigned int colorHeight_;
|
||||||
|
unsigned int depthWidth_;
|
||||||
|
unsigned int depthHeight_;
|
||||||
|
ob::Pipeline * pipeline_;
|
||||||
|
ob::Pipeline * imuPipeline_;
|
||||||
|
ob::Align * alignFilter_;
|
||||||
|
CameraModel model_;
|
||||||
|
Transform imuLocalTransform_;
|
||||||
|
bool imuLocalTransformInitialized_;
|
||||||
|
uint64_t lastAccStamp_;
|
||||||
|
uint64_t lastImageStamp_;
|
||||||
|
bool globalTimestampAvailable_;
|
||||||
|
bool rectifyColor_;
|
||||||
|
bool convertDepthToMM_;
|
||||||
|
bool imuPublished_;
|
||||||
|
std::map<double, cv::Vec6f> imuBuffer_;
|
||||||
|
UMutex imuMutex_;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace rtabmap
|
||||||
@@ -146,6 +146,7 @@ private:
|
|||||||
Transform dualExtrinsics_;
|
Transform dualExtrinsics_;
|
||||||
std::string jsonConfig_;
|
std::string jsonConfig_;
|
||||||
bool closing_;
|
bool closing_;
|
||||||
|
bool playback_;
|
||||||
|
|
||||||
static Transform realsense2PoseRotation_;
|
static Transform realsense2PoseRotation_;
|
||||||
static Transform realsense2PoseRotationInv_;
|
static Transform realsense2PoseRotationInv_;
|
||||||
|
|||||||
@@ -57,7 +57,6 @@ protected:
|
|||||||
private:
|
private:
|
||||||
cv::Mat map_;
|
cv::Mat map_;
|
||||||
cv::Mat mapInfo_;
|
cv::Mat mapInfo_;
|
||||||
std::map<int, std::pair<int, int> > cellCount_; //<node Id, cells>
|
|
||||||
|
|
||||||
float minMapSize_;
|
float minMapSize_;
|
||||||
bool erode_;
|
bool erode_;
|
||||||
|
|||||||
@@ -41,11 +41,11 @@ LaserScan laserScanFromPointCloud(const PointCloud2T & cloud, bool filterNaNs, b
|
|||||||
return LaserScan();
|
return LaserScan();
|
||||||
}
|
}
|
||||||
//determine the output type
|
//determine the output type
|
||||||
int fieldStates[8] = {0}; // x,y,z,normal_x,normal_y,normal_z,rgb,intensity
|
int fieldStates[10] = {0}; // x,y,z,normal_x,normal_y,normal_z,rgb,intensity,time,ring
|
||||||
#if PCL_VERSION_COMPARE(>=, 1, 10, 0)
|
#if PCL_VERSION_COMPARE(>=, 1, 10, 0)
|
||||||
std::uint32_t fieldOffsets[8] = {0};
|
std::uint32_t fieldOffsets[10] = {0};
|
||||||
#else
|
#else
|
||||||
pcl::uint32_t fieldOffsets[8] = {0};
|
pcl::uint32_t fieldOffsets[10] = {0};
|
||||||
#endif
|
#endif
|
||||||
for(unsigned int i=0; i<cloud.fields.size(); ++i)
|
for(unsigned int i=0; i<cloud.fields.size(); ++i)
|
||||||
{
|
{
|
||||||
@@ -102,6 +102,42 @@ LaserScan laserScanFromPointCloud(const PointCloud2T & cloud, bool filterNaNs, b
|
|||||||
fieldStates[7] = 1;
|
fieldStates[7] = 1;
|
||||||
fieldOffsets[7] = cloud.fields[i].offset;
|
fieldOffsets[7] = cloud.fields[i].offset;
|
||||||
}
|
}
|
||||||
|
else if(cloud.fields[i].name.compare("time") == 0)
|
||||||
|
{
|
||||||
|
if(cloud.fields[i].datatype != pcl::PCLPointField::FLOAT32)
|
||||||
|
{
|
||||||
|
static bool warningShown = false;
|
||||||
|
if(!warningShown)
|
||||||
|
{
|
||||||
|
UWARN("The input scan cloud has an \"time\" field "
|
||||||
|
"but the datatype (%d) is not supported. Time will be ignored. "
|
||||||
|
"This message is only shown once.", cloud.fields[i].datatype);
|
||||||
|
warningShown = true;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldStates[8] = 1;
|
||||||
|
fieldOffsets[8] = cloud.fields[i].offset;
|
||||||
|
}
|
||||||
|
else if(cloud.fields[i].name.compare("ring") == 0)
|
||||||
|
{
|
||||||
|
if(cloud.fields[i].datatype != pcl::PCLPointField::UINT16)
|
||||||
|
{
|
||||||
|
static bool warningShown = false;
|
||||||
|
if(!warningShown)
|
||||||
|
{
|
||||||
|
UWARN("The input scan cloud has an \"ring\" field "
|
||||||
|
"but the datatype (%d) is not supported. Ring will be ignored. "
|
||||||
|
"This message is only shown once.", cloud.fields[i].datatype);
|
||||||
|
warningShown = true;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldStates[9] = 1;
|
||||||
|
fieldOffsets[9] = cloud.fields[i].offset;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UDEBUG("Ignoring \"%s\" field", cloud.fields[i].name.c_str());
|
UDEBUG("Ignoring \"%s\" field", cloud.fields[i].name.c_str());
|
||||||
@@ -117,6 +153,8 @@ LaserScan laserScanFromPointCloud(const PointCloud2T & cloud, bool filterNaNs, b
|
|||||||
bool hasNormals = fieldStates[3] || fieldStates[4] || fieldStates[5];
|
bool hasNormals = fieldStates[3] || fieldStates[4] || fieldStates[5];
|
||||||
bool hasIntensity = fieldStates[7];
|
bool hasIntensity = fieldStates[7];
|
||||||
bool hasRGB = !hasIntensity&&fieldStates[6];
|
bool hasRGB = !hasIntensity&&fieldStates[6];
|
||||||
|
bool hasTime = hasIntensity&&fieldStates[8];
|
||||||
|
bool hasRing = hasIntensity&&fieldStates[9];
|
||||||
bool is3D = fieldStates[0] && fieldStates[1] && fieldStates[2];
|
bool is3D = fieldStates[0] && fieldStates[1] && fieldStates[2];
|
||||||
|
|
||||||
LaserScan::Format format;
|
LaserScan::Format format;
|
||||||
@@ -140,7 +178,18 @@ LaserScan laserScanFromPointCloud(const PointCloud2T & cloud, bool filterNaNs, b
|
|||||||
}
|
}
|
||||||
else if(!hasNormals && hasIntensity)
|
else if(!hasNormals && hasIntensity)
|
||||||
{
|
{
|
||||||
format = LaserScan::kXYZI;
|
if(hasTime && hasRing)
|
||||||
|
{
|
||||||
|
format = LaserScan::kXYZIRT;
|
||||||
|
}
|
||||||
|
else if(hasTime)
|
||||||
|
{
|
||||||
|
format = LaserScan::kXYZIT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
format = LaserScan::kXYZI;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(!hasNormals && hasRGB)
|
else if(!hasNormals && hasRGB)
|
||||||
{
|
{
|
||||||
@@ -183,6 +232,7 @@ LaserScan laserScanFromPointCloud(const PointCloud2T & cloud, bool filterNaNs, b
|
|||||||
transformRot = transform.rotation();
|
transformRot = transform.rotation();
|
||||||
}
|
}
|
||||||
int oi=0;
|
int oi=0;
|
||||||
|
UASSERT(cloud.height == 1 || cloud.row_step != 0);
|
||||||
for (uint32_t row = 0; row < (uint32_t)cloud.height; ++row)
|
for (uint32_t row = 0; row < (uint32_t)cloud.height; ++row)
|
||||||
{
|
{
|
||||||
const uint8_t* row_data = &cloud.data[row * cloud.row_step];
|
const uint8_t* row_data = &cloud.data[row * cloud.row_step];
|
||||||
@@ -242,26 +292,45 @@ LaserScan laserScanFromPointCloud(const PointCloud2T & cloud, bool filterNaNs, b
|
|||||||
{
|
{
|
||||||
ptr[0] = *(float*)(msg_data + fieldOffsets[0]);
|
ptr[0] = *(float*)(msg_data + fieldOffsets[0]);
|
||||||
ptr[1] = *(float*)(msg_data + fieldOffsets[1]);
|
ptr[1] = *(float*)(msg_data + fieldOffsets[1]);
|
||||||
ptr[2] = *(float*)(msg_data + fieldOffsets[3]);
|
if(format == LaserScan::kXYZIT)
|
||||||
ptr[3] = *(float*)(msg_data + fieldOffsets[4]);
|
{
|
||||||
ptr[4] = *(float*)(msg_data + fieldOffsets[5]);
|
ptr[2] = *(float*)(msg_data + fieldOffsets[2]);
|
||||||
|
ptr[3] = *(float*)(msg_data + fieldOffsets[7]);
|
||||||
|
ptr[4] = *(float*)(msg_data + fieldOffsets[8]);
|
||||||
|
}
|
||||||
|
else // kXYNormal
|
||||||
|
{
|
||||||
|
ptr[2] = *(float*)(msg_data + fieldOffsets[3]);
|
||||||
|
ptr[3] = *(float*)(msg_data + fieldOffsets[4]);
|
||||||
|
ptr[4] = *(float*)(msg_data + fieldOffsets[5]);
|
||||||
|
}
|
||||||
valid = uIsFinite(ptr[0]) && uIsFinite(ptr[1]) && uIsFinite(ptr[2]) && uIsFinite(ptr[3]) && uIsFinite(ptr[4]);
|
valid = uIsFinite(ptr[0]) && uIsFinite(ptr[1]) && uIsFinite(ptr[2]) && uIsFinite(ptr[3]) && uIsFinite(ptr[4]);
|
||||||
}
|
}
|
||||||
else if(laserScan.channels() == 6)
|
else if(laserScan.channels() == 6)
|
||||||
{
|
{
|
||||||
ptr[0] = *(float*)(msg_data + fieldOffsets[0]);
|
ptr[0] = *(float*)(msg_data + fieldOffsets[0]);
|
||||||
ptr[1] = *(float*)(msg_data + fieldOffsets[1]);
|
ptr[1] = *(float*)(msg_data + fieldOffsets[1]);
|
||||||
if(format == LaserScan::kXYINormal)
|
if(format == LaserScan::kXYZIRT)
|
||||||
{
|
|
||||||
ptr[2] = *(float*)(msg_data + fieldOffsets[7]);
|
|
||||||
}
|
|
||||||
else // XYZNormal
|
|
||||||
{
|
{
|
||||||
ptr[2] = *(float*)(msg_data + fieldOffsets[2]);
|
ptr[2] = *(float*)(msg_data + fieldOffsets[2]);
|
||||||
|
ptr[3] = *(float*)(msg_data + fieldOffsets[7]);
|
||||||
|
ptr[4] = float(*(unsigned short*)(msg_data + fieldOffsets[9])); // Convert 16U to float
|
||||||
|
ptr[5] = *(float*)(msg_data + fieldOffsets[8]);
|
||||||
|
}
|
||||||
|
else // with normal
|
||||||
|
{
|
||||||
|
if(format == LaserScan::kXYINormal)
|
||||||
|
{
|
||||||
|
ptr[2] = *(float*)(msg_data + fieldOffsets[7]);
|
||||||
|
}
|
||||||
|
else // XYZNormal
|
||||||
|
{
|
||||||
|
ptr[2] = *(float*)(msg_data + fieldOffsets[2]);
|
||||||
|
}
|
||||||
|
ptr[3] = *(float*)(msg_data + fieldOffsets[3]);
|
||||||
|
ptr[4] = *(float*)(msg_data + fieldOffsets[4]);
|
||||||
|
ptr[5] = *(float*)(msg_data + fieldOffsets[5]);
|
||||||
}
|
}
|
||||||
ptr[3] = *(float*)(msg_data + fieldOffsets[3]);
|
|
||||||
ptr[4] = *(float*)(msg_data + fieldOffsets[4]);
|
|
||||||
ptr[5] = *(float*)(msg_data + fieldOffsets[5]);
|
|
||||||
valid = uIsFinite(ptr[0]) && uIsFinite(ptr[1]) && uIsFinite(ptr[2]) && uIsFinite(ptr[3]) && uIsFinite(ptr[4]) && uIsFinite(ptr[5]);
|
valid = uIsFinite(ptr[0]) && uIsFinite(ptr[1]) && uIsFinite(ptr[2]) && uIsFinite(ptr[3]) && uIsFinite(ptr[4]) && uIsFinite(ptr[5]);
|
||||||
}
|
}
|
||||||
else if(laserScan.channels() == 7)
|
else if(laserScan.channels() == 7)
|
||||||
|
|||||||
@@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2025 Felix Toft
|
||||||
|
Copyright (c) 2010-2016, 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 ODOMETRYCUVSLAM_H_
|
||||||
|
#define ODOMETRYCUVSLAM_H_
|
||||||
|
|
||||||
|
#include <rtabmap/core/Odometry.h>
|
||||||
|
#include <memory>
|
||||||
|
#include <deque>
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
#ifdef RTABMAP_CUVSLAM
|
||||||
|
#include <cuvslam.h>
|
||||||
|
#include <ground_constraint.h>
|
||||||
|
#include <cuda_runtime.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class RTABMAP_CORE_EXPORT OdometryCuVSLAM : public Odometry
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
OdometryCuVSLAM(const rtabmap::ParametersMap & parameters = rtabmap::ParametersMap());
|
||||||
|
virtual ~OdometryCuVSLAM();
|
||||||
|
|
||||||
|
virtual void reset(const Transform & initialPose = Transform::getIdentity());
|
||||||
|
virtual Odometry::Type getType() {return Odometry::kTypeCuVSLAM;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual Transform computeTransform(SensorData & image, const Transform & guess = Transform(), OdometryInfo * info = 0);
|
||||||
|
virtual void cleanupCuVSLAMResources();
|
||||||
|
|
||||||
|
private:
|
||||||
|
#ifdef RTABMAP_CUVSLAM
|
||||||
|
CUVSLAM_TrackerHandle cuvslam_handle_;
|
||||||
|
CUVSLAM_GroundConstraintHandle ground_constraint_handle_;
|
||||||
|
|
||||||
|
std::vector<CUVSLAM_Camera> cuvslam_cameras_;
|
||||||
|
std::vector<std::array<float, 12>> intrinsics_;
|
||||||
|
|
||||||
|
// State tracking
|
||||||
|
bool initialized_;
|
||||||
|
bool lost_;
|
||||||
|
bool tracking_;
|
||||||
|
bool planar_constraints_;
|
||||||
|
int multicam_mode_;
|
||||||
|
Transform previous_pose_;
|
||||||
|
double last_timestamp_;
|
||||||
|
|
||||||
|
// Configuration Thresholds
|
||||||
|
double velocity_ratio_threshold_high_ = 1.5; // The maximum velocity ratio of guess / estimated velocity needed to detect lost state.
|
||||||
|
double velocity_ratio_threshold_low_ = 0.5; // The minimum velocity ratio of guess / estimated velocity needed to detect lost state.
|
||||||
|
double velocity_difference_threshold_ = 0.1; // The maximum velocity difference between the guess and the estimated velocity needed to detect lost state.
|
||||||
|
double zero_estimated_velocity_threshold_ = 0.00001; // The minimum cuVSLAM estimated velocity needed to detect lost state.
|
||||||
|
double min_landmarks_threshold_ = 30; // The minimum number of landmarks needed to start tracking after an initialization.
|
||||||
|
|
||||||
|
// Forward cuVLSAM covariance directly to RTAB-Map.
|
||||||
|
// When true this disables covariance based lost detection.
|
||||||
|
bool use_raw_covariance_ = false;
|
||||||
|
|
||||||
|
//visualization
|
||||||
|
std::vector<CUVSLAM_Observation> observations_;
|
||||||
|
std::vector<CUVSLAM_Landmark> landmarks_;
|
||||||
|
|
||||||
|
// GPU memory management
|
||||||
|
std::vector<uint8_t *> gpu_left_image_data_; // pointers to all gpu images
|
||||||
|
std::vector<uint8_t *> gpu_right_image_data_;
|
||||||
|
std::vector<size_t> gpu_left_image_sizes_; // size of one image
|
||||||
|
std::vector<size_t> gpu_right_image_sizes_;
|
||||||
|
cudaStream_t cuda_stream_;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ODOMETRYCUVSLAM_H_ */
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2016, 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 ODOMETRYLIOSAM_H_
|
||||||
|
#define ODOMETRYLIOSAM_H_
|
||||||
|
|
||||||
|
#include <rtabmap/core/Odometry.h>
|
||||||
|
|
||||||
|
#ifdef RTABMAP_LIOSAM
|
||||||
|
#include <Eigen/Core>
|
||||||
|
#include <Eigen/Geometry>
|
||||||
|
#include <vector>
|
||||||
|
namespace lio_sam { class LioSamCore; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class RTABMAP_CORE_EXPORT OdometryLIOSAM : public Odometry
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
OdometryLIOSAM(const rtabmap::ParametersMap & parameters = rtabmap::ParametersMap());
|
||||||
|
virtual ~OdometryLIOSAM();
|
||||||
|
|
||||||
|
virtual void reset(const Transform & initialPose = Transform::getIdentity());
|
||||||
|
virtual Odometry::Type getType() {return Odometry::kTypeLIOSAM;}
|
||||||
|
virtual bool canProcessAsyncIMU() const {return true;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual Transform computeTransform(SensorData & data, const Transform & guess = Transform(), OdometryInfo * info = 0);
|
||||||
|
|
||||||
|
#ifdef RTABMAP_LIOSAM
|
||||||
|
bool init(const Transform & imuLocalTransform, const Transform & lidarLocalTransform);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private:
|
||||||
|
#ifdef RTABMAP_LIOSAM
|
||||||
|
lio_sam::LioSamCore * lioSam_;
|
||||||
|
Transform lastPose_;
|
||||||
|
bool lost_;
|
||||||
|
float linVar_;
|
||||||
|
float angVar_;
|
||||||
|
ParametersMap parameters_;
|
||||||
|
Transform imuLocalTransform_; // base_link -> imu_link (cached for deferred init)
|
||||||
|
|
||||||
|
// Buffered IMU samples received before initialization
|
||||||
|
struct ImuSample {
|
||||||
|
double stamp;
|
||||||
|
Eigen::Vector3d acc;
|
||||||
|
Eigen::Vector3d gyro;
|
||||||
|
Eigen::Quaterniond orientation;
|
||||||
|
};
|
||||||
|
std::vector<ImuSample> imuBuffer_;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ODOMETRYLIOSAM_H_ */
|
||||||
@@ -25,39 +25,7 @@ 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 ODOMETRYVINS_H_
|
#pragma once
|
||||||
#define ODOMETRYVINS_H_
|
#pragma message("Warning: OdometryVINS.h is deprecated. Please use OdometryVINSFusion.h instead.")
|
||||||
|
|
||||||
#include <rtabmap/core/Odometry.h>
|
#include "rtabmap/core/odometry/OdometryVINSFusion.h"
|
||||||
|
|
||||||
namespace rtabmap {
|
|
||||||
|
|
||||||
class VinsEstimator;
|
|
||||||
|
|
||||||
class RTABMAP_CORE_EXPORT OdometryVINS : public Odometry
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
OdometryVINS(const rtabmap::ParametersMap & parameters = rtabmap::ParametersMap());
|
|
||||||
virtual ~OdometryVINS();
|
|
||||||
|
|
||||||
virtual void reset(const Transform & initialPose = Transform::getIdentity());
|
|
||||||
virtual Odometry::Type getType() {return Odometry::kTypeVINS;}
|
|
||||||
virtual bool canProcessRawImages() const {return true;}
|
|
||||||
virtual bool canProcessAsyncIMU() const {return true;}
|
|
||||||
|
|
||||||
private:
|
|
||||||
virtual Transform computeTransform(SensorData & image, const Transform & guess = Transform(), OdometryInfo * info = 0);
|
|
||||||
|
|
||||||
private:
|
|
||||||
#ifdef RTABMAP_VINS
|
|
||||||
VinsEstimator * vinsEstimator_;
|
|
||||||
bool initGravity_;
|
|
||||||
Transform previousPose_;
|
|
||||||
Transform previousLocalTransform_;
|
|
||||||
IMU lastImu_;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* ODOMETRYVINS_H_ */
|
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2016, 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 ODOMETRYVINSFUSION_H_
|
||||||
|
#define ODOMETRYVINSFUSION_H_
|
||||||
|
|
||||||
|
#include <rtabmap/core/Odometry.h>
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class VinsFusionEstimator;
|
||||||
|
|
||||||
|
class RTABMAP_CORE_EXPORT OdometryVINSFusion : public Odometry
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
OdometryVINSFusion(const rtabmap::ParametersMap & parameters = rtabmap::ParametersMap());
|
||||||
|
virtual ~OdometryVINSFusion();
|
||||||
|
|
||||||
|
virtual void reset(const Transform & initialPose = Transform::getIdentity());
|
||||||
|
virtual Odometry::Type getType() {return Odometry::kTypeVINSFusion;}
|
||||||
|
virtual bool canProcessRawImages() const {return true;}
|
||||||
|
virtual bool canProcessAsyncIMU() const {return true;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual Transform computeTransform(SensorData & image, const Transform & guess = Transform(), OdometryInfo * info = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
#ifdef RTABMAP_VINS_FUSION
|
||||||
|
VinsFusionEstimator * vinsEstimator_;
|
||||||
|
bool initGravity_;
|
||||||
|
Transform previousPose_;
|
||||||
|
Transform previousLocalTransform_;
|
||||||
|
IMU lastImu_;
|
||||||
|
double lastImuStamp_;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ODOMETRYVINSFUSION_H_ */
|
||||||
@@ -41,6 +41,12 @@ public:
|
|||||||
static bool isCSparseAvailable();
|
static bool isCSparseAvailable();
|
||||||
static bool isCholmodAvailable();
|
static bool isCholmodAvailable();
|
||||||
|
|
||||||
|
public:
|
||||||
|
static bool loadGraph(
|
||||||
|
const std::string & fileName,
|
||||||
|
std::map<int, Transform> & poses,
|
||||||
|
std::multimap<int, Link> & edgeConstraints);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OptimizerG2O(const ParametersMap & parameters = ParametersMap());
|
OptimizerG2O(const ParametersMap & parameters = ParametersMap());
|
||||||
virtual ~OptimizerG2O() {}
|
virtual ~OptimizerG2O() {}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user