mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-03 01:50:24 +08:00
Compare commits
298 Commits
0.21.8-ios
...
bayes_memt
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf2c3a1566 | ||
|
|
d4940634f9 | ||
|
|
2d4a3391bb | ||
|
|
94c93ac9b1 | ||
|
|
9c1e117384 | ||
|
|
f647014f54 | ||
|
|
df52523a0c | ||
|
|
338e142e58 | ||
|
|
2e193ee191 | ||
|
|
9cee4c17b2 | ||
|
|
47ce2b0c74 | ||
|
|
c5ecfef101 | ||
|
|
79d3a1af97 | ||
|
|
829c3c157a | ||
|
|
8355e531bc | ||
|
|
ee49beaf4f | ||
|
|
bcdb4b4546 | ||
|
|
bef4eaf679 | ||
|
|
d9f3337f97 | ||
|
|
89998284bc | ||
|
|
5fad2d29c3 | ||
|
|
f569393de1 | ||
|
|
0a41263fba | ||
|
|
6a605b3be1 | ||
|
|
0f56dd4b43 | ||
|
|
d96c30710e | ||
|
|
e321999b15 | ||
|
|
d069becc72 | ||
|
|
cb34c4bd37 | ||
|
|
9d30b174e6 | ||
|
|
c55c05a97e | ||
|
|
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 | ||
|
|
fa6deba7df | ||
|
|
d34962f908 | ||
|
|
e5655b0b96 | ||
|
|
14d270241c | ||
|
|
0579d4f39c | ||
|
|
2e71831324 | ||
|
|
2fdd2337c7 | ||
|
|
963ba42a1a | ||
|
|
c9292bea5b | ||
|
|
30962119cb | ||
|
|
ee98be9ef7 | ||
|
|
0536ddf0c9 | ||
|
|
6e439d2342 | ||
|
|
4a37855526 | ||
|
|
db59344007 | ||
|
|
105ac3bf9e | ||
|
|
471ed6ade2 | ||
|
|
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 | ||
|
|
af11afdc9a | ||
|
|
def99328ce | ||
|
|
8cbee58f07 | ||
|
|
1731f91908 | ||
|
|
d639fcb8e7 | ||
|
|
2c3f1458e7 | ||
|
|
3d968da30f | ||
|
|
ccb6ce67d5 | ||
|
|
b5dce57be8 | ||
|
|
43c398a0de | ||
|
|
3678372981 | ||
|
|
1d6c70c1db | ||
|
|
b750e94eaa | ||
|
|
08f031e11c | ||
|
|
c0dc4b43f3 | ||
|
|
2d79689675 | ||
|
|
a7a2d66556 | ||
|
|
36f7241f7d | ||
|
|
21fbf635b3 | ||
|
|
81ffbca1d6 | ||
|
|
83a2754714 | ||
|
|
6a547f4403 | ||
|
|
68e3125358 | ||
|
|
5f946cc26b | ||
|
|
135110c9b6 | ||
|
|
28dbf1c98a | ||
|
|
f329ebd42b | ||
|
|
1ae523884f | ||
|
|
6eebca83b2 | ||
|
|
72a20d849d | ||
|
|
a1b602dbe0 | ||
|
|
d88353dc1b | ||
|
|
4eea83d1af | ||
|
|
2c7aa5a78f | ||
|
|
a85e732f01 | ||
|
|
258095e0f3 | ||
|
|
35c3ca20ad | ||
|
|
ec4e076a08 | ||
|
|
7a4f8d9783 | ||
|
|
e65c1c2f85 | ||
|
|
7adaa249ff | ||
|
|
079600bf3a | ||
|
|
921381b3bd | ||
|
|
c0e83ce9e9 | ||
|
|
d77a3e3e7c | ||
|
|
1cf051d63b | ||
|
|
19a8292ad0 | ||
|
|
15be406509 | ||
|
|
618e839999 | ||
|
|
ddaf2f5271 | ||
|
|
fcfadfe489 | ||
|
|
6aa188d2af | ||
|
|
3ab9a69fbb | ||
|
|
7baf435600 | ||
|
|
853f603898 | ||
|
|
f8b1d50656 | ||
|
|
2f431ce385 | ||
|
|
89849ae245 | ||
|
|
02e30ffc69 | ||
|
|
97c56361f8 | ||
|
|
340248fed0 | ||
|
|
626bf64983 | ||
|
|
38cacb7978 | ||
|
|
a613998652 | ||
|
|
d33e98a540 | ||
|
|
5988f0bb3b | ||
|
|
8f46cc7370 | ||
|
|
10eea91044 | ||
|
|
b55759174d | ||
|
|
13ed9137a5 | ||
|
|
ca877041e3 | ||
|
|
3eda219f1d | ||
|
|
13bc3c5c2c | ||
|
|
8a26f42687 | ||
|
|
968b9f8609 | ||
|
|
afde4af3a7 | ||
|
|
cbd3995b60 | ||
|
|
5fff349623 | ||
|
|
b2e26e81c1 | ||
|
|
f10dee4175 | ||
|
|
a584245029 | ||
|
|
966feefb35 | ||
|
|
fd27380be7 | ||
|
|
75ac722996 | ||
|
|
374df24ac9 | ||
|
|
6b313257f2 | ||
|
|
8b21c27f5f | ||
|
|
2454b04f1f | ||
|
|
e3fde4ecdd |
152
.appveyor.yml
152
.appveyor.yml
@@ -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
|
|
||||||
24
.devcontainer/android/Dockerfile
Normal file
24
.devcontainer/android/Dockerfile
Normal file
@@ -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,8 +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"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
17
.devcontainer/android/init.sh
Executable file
17
.devcontainer/android/init.sh
Executable file
@@ -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'
|
||||||
19
.devcontainer/focal/Dockerfile
Normal file
19
.devcontainer/focal/Dockerfile
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
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
|
||||||
|
RUN echo 'source /opt/ros/$ROS_DISTRO/setup.bash' >> /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"]
|
||||||
}
|
}
|
||||||
|
|||||||
19
.devcontainer/jammy/Dockerfile
Normal file
19
.devcontainer/jammy/Dockerfile
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
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
|
||||||
|
RUN echo 'source /opt/ros/$ROS_DISTRO/setup.bash' >> /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"]
|
||||||
}
|
}
|
||||||
|
|||||||
105
.devcontainer/latest-deps-from-source/Dockerfile
Normal file
105
.devcontainer/latest-deps-from-source/Dockerfile
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
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
|
||||||
|
RUN echo 'source /opt/ros/${ROS_DISTRO}/setup.bash' >> /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}
|
||||||
21
.devcontainer/latest-deps-from-source/devcontainer.json
Normal file
21
.devcontainer/latest-deps-from-source/devcontainer.json
Normal file
@@ -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"]
|
||||||
|
}
|
||||||
20
.devcontainer/noble-kilted/Dockerfile
Normal file
20
.devcontainer/noble-kilted/Dockerfile
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
FROM introlab3it/rtabmap:noble-kilted-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 echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
RUN echo 'source /opt/ros/kilted/setup.bash' >> /home/${USERNAME}/.bashrc
|
||||||
17
.devcontainer/noble-kilted/devcontainer.json
Normal file
17
.devcontainer/noble-kilted/devcontainer.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"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",
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
"runArgs": ["--privileged"]
|
||||||
|
}
|
||||||
23
.devcontainer/noble/Dockerfile
Normal file
23
.devcontainer/noble/Dockerfile
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
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
|
||||||
|
RUN echo 'source /opt/ros/$ROS_DISTRO/setup.bash' >> /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"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
25
.devcontainer/resolute/Dockerfile
Normal file
25
.devcontainer/resolute/Dockerfile
Normal file
@@ -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
|
||||||
|
|
||||||
|
|
||||||
30
.devcontainer/resolute/devcontainer.json
Normal file
30
.devcontainer/resolute/devcontainer.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
80
.devcontainer/rolling/Dockerfile
Normal file
80
.devcontainer/rolling/Dockerfile
Normal file
@@ -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
|
||||||
|
RUN echo 'source /opt/ros/$ROS_DISTRO/setup.bash' >> /home/${USERNAME}/.bashrc
|
||||||
30
.devcontainer/rolling/devcontainer.json
Normal file
30
.devcontainer/rolling/devcontainer.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1 +1,2 @@
|
|||||||
build/*
|
build/*
|
||||||
|
build_*
|
||||||
|
|||||||
53
.gitattributes
vendored
Normal file
53
.gitattributes
vendored
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
# This repository has a historical mix of CRLF and LF files. Letting git convert
|
||||||
|
# line endings (core.autocrlf, or a "text=auto" policy) would rewrite whole files
|
||||||
|
# on checkout/commit and bury real changes under thousands of ending-only diff
|
||||||
|
# lines -- and it would do so at unpredictable times, on whichever file happens
|
||||||
|
# to be touched next. Keep every file's bytes exactly as committed.
|
||||||
|
#
|
||||||
|
# This also keeps LF-only files LF on Windows checkouts, which data/tests/manifest.txt
|
||||||
|
# relies on: scripts/fetch_test_data.sh tab-splits it and a trailing CR breaks SHA
|
||||||
|
# matching. No per-file exception is needed for that.
|
||||||
|
#
|
||||||
|
# Note this does not stop an editor or script from rewriting a file's endings; it
|
||||||
|
# only stops git from doing it.
|
||||||
|
* -text
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Migrating to the standard LF policy (a future MR, on its own)
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# LF is what git stores natively and what essentially every C++ project on GitHub
|
||||||
|
# uses (LLVM, OpenCV, PCL, Qt). The rule above only freezes the current mix; it is
|
||||||
|
# a holding position, not the destination. To finish the job:
|
||||||
|
#
|
||||||
|
# 1. Replace the `* -text` line above with:
|
||||||
|
#
|
||||||
|
# * text=auto
|
||||||
|
# # Files that must stay LF even in a Windows working tree:
|
||||||
|
# *.sh text eol=lf
|
||||||
|
# *.bash text eol=lf
|
||||||
|
#
|
||||||
|
# (`text=auto` = store LF in the repo, check out native line endings.)
|
||||||
|
#
|
||||||
|
# 2. Rewrite the working tree and stage it, in the same commit as step 1:
|
||||||
|
#
|
||||||
|
# git add --renormalize .
|
||||||
|
#
|
||||||
|
# 3. Verify nothing but line endings changed -- this must print nothing:
|
||||||
|
#
|
||||||
|
# git diff --cached --ignore-cr-at-eol
|
||||||
|
#
|
||||||
|
# 4. Commit alone, with no other change in the MR, then record the SHA so
|
||||||
|
# `git blame` (and GitHub's blame view) skips over it:
|
||||||
|
#
|
||||||
|
# echo "<sha of the normalization commit>" >> .git-blame-ignore-revs
|
||||||
|
#
|
||||||
|
# Add a follow-up commit for that file; also set it locally with
|
||||||
|
# `git config blame.ignoreRevsFile .git-blame-ignore-revs`.
|
||||||
|
#
|
||||||
|
# Cost, measured on the tree at the time of writing: 227 CRLF files + 7 with mixed
|
||||||
|
# endings, ~138k of ~634k lines rewritten (22%), across 234 files. The commit
|
||||||
|
# itself is mechanical and safe -- the real cost is every open branch that touches
|
||||||
|
# one of those files, which will conflict over the whole file on rebase. Merge or
|
||||||
|
# rebase those with `-X renormalize` (merge) / `--strategy-option renormalize`.
|
||||||
|
#
|
||||||
|
# Best moment: right after a release, when the branch backlog is smallest.
|
||||||
267
.github/actions/install-macos-source-deps/action.yml
vendored
Normal file
267
.github/actions/install-macos-source-deps/action.yml
vendored
Normal file
@@ -0,0 +1,267 @@
|
|||||||
|
name: 'Install macOS Source Dependencies'
|
||||||
|
description: 'Builds (and per-dependency caches) the source-only deps not available from Homebrew (GTSAM, libnabo+libpointmatcher, OrbbecSDK, depthai) and installs them into /usr/local.'
|
||||||
|
inputs:
|
||||||
|
os:
|
||||||
|
description: 'Runner os label (e.g. matrix.os), used to namespace the per-dependency caches. Required because intel/arm produce different binaries with identical Homebrew version strings.'
|
||||||
|
required: true
|
||||||
|
build_type:
|
||||||
|
description: 'CMake build type.'
|
||||||
|
required: false
|
||||||
|
default: 'Release'
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Resolve dependency versions
|
||||||
|
id: depver
|
||||||
|
shell: bash
|
||||||
|
# The source deps link against these Homebrew libraries and are compiled
|
||||||
|
# with Xcode's toolchain, so both are folded into the cache keys: a
|
||||||
|
# Homebrew bump (e.g. a new Eigen) or an Xcode update forces a rebuild.
|
||||||
|
run: |
|
||||||
|
BREW=$(brew list --versions eigen boost yaml-cpp | sort)
|
||||||
|
XCODE=$(xcodebuild -version 2>/dev/null || clang --version | head -1)
|
||||||
|
HASH=$(printf '%s\n%s\n' "$BREW" "$XCODE" | shasum | cut -d' ' -f1)
|
||||||
|
echo "hash=$HASH" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
# ----------------------------- GTSAM -----------------------------
|
||||||
|
- name: Cache GTSAM
|
||||||
|
id: cache-gtsam
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.temp }}/deps-stage/gtsam
|
||||||
|
key: gtsam-4.2.1-${{ inputs.os }}-${{ hashFiles('.github/actions/install-macos-source-deps/patches/gtsam-4.2.1-eigen5.patch') }}-${{ steps.depver.outputs.hash }}
|
||||||
|
|
||||||
|
- name: Build GTSAM
|
||||||
|
if: steps.cache-gtsam.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
NPROC=$(sysctl -n hw.logicalcpu)
|
||||||
|
PATCHES="${{ github.action_path }}/patches"
|
||||||
|
SRC="${{ runner.temp }}/src-deps/gtsam"
|
||||||
|
STAGE="${{ runner.temp }}/deps-stage/gtsam"
|
||||||
|
rm -rf "$SRC"; mkdir -p "$SRC" "$STAGE"
|
||||||
|
git clone --depth 1 --branch 4.2.1 https://github.com/borglab/gtsam.git "$SRC/gtsam"
|
||||||
|
cd "$SRC/gtsam"
|
||||||
|
git apply "$PATCHES/gtsam-4.2.1-eigen5.patch"
|
||||||
|
cmake -B build \
|
||||||
|
-DCMAKE_BUILD_TYPE=${{ inputs.build_type }} \
|
||||||
|
-DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF \
|
||||||
|
-DGTSAM_WITH_TBB=OFF \
|
||||||
|
-DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF \
|
||||||
|
-DGTSAM_BUILD_TESTS=OFF \
|
||||||
|
-DGTSAM_BUILD_UNSTABLE=OFF \
|
||||||
|
-DGTSAM_USE_SYSTEM_EIGEN=ON \
|
||||||
|
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||||
|
cmake --build build -j$NPROC
|
||||||
|
DESTDIR="$STAGE" cmake --install build
|
||||||
|
|
||||||
|
# ----------------- libnabo + libpointmatcher --------------------
|
||||||
|
# Built together: libpointmatcher depends on libnabo, so keeping them in one
|
||||||
|
# unit keeps the build order internal (lpm finds libnabo in the unit's stage).
|
||||||
|
- name: Cache pointmatcher
|
||||||
|
id: cache-pointmatcher
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.temp }}/deps-stage/pointmatcher
|
||||||
|
key: pointmatcher-nabo1.1.2-lpm1.4.4-${{ inputs.os }}-${{ hashFiles('.github/actions/install-macos-source-deps/patches/libnabo-1.1.2.patch', '.github/actions/install-macos-source-deps/patches/libpointmatcher-1.4.4-boost.patch') }}-${{ steps.depver.outputs.hash }}
|
||||||
|
|
||||||
|
- name: Build pointmatcher
|
||||||
|
if: steps.cache-pointmatcher.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
NPROC=$(sysctl -n hw.logicalcpu)
|
||||||
|
PATCHES="${{ github.action_path }}/patches"
|
||||||
|
SRC="${{ runner.temp }}/src-deps/pointmatcher"
|
||||||
|
STAGE="${{ runner.temp }}/deps-stage/pointmatcher"
|
||||||
|
rm -rf "$SRC"; mkdir -p "$SRC" "$STAGE"
|
||||||
|
# libnabo (required by libpointmatcher)
|
||||||
|
git clone --depth 1 --branch 1.1.2 https://github.com/ethz-asl/libnabo.git "$SRC/libnabo"
|
||||||
|
cd "$SRC/libnabo"
|
||||||
|
git apply "$PATCHES/libnabo-1.1.2.patch"
|
||||||
|
cmake -B build -DCMAKE_BUILD_TYPE=${{ inputs.build_type }}
|
||||||
|
cmake --build build -j$NPROC
|
||||||
|
DESTDIR="$STAGE" cmake --install build
|
||||||
|
# libpointmatcher (finds libnabo from the unit's staged prefix)
|
||||||
|
git clone --depth 1 --branch 1.4.4 https://github.com/ethz-asl/libpointmatcher.git "$SRC/libpointmatcher"
|
||||||
|
cd "$SRC/libpointmatcher"
|
||||||
|
git apply "$PATCHES/libpointmatcher-1.4.4-boost.patch"
|
||||||
|
cmake -B build -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DCMAKE_PREFIX_PATH="$STAGE/usr/local" -DBUILD_EVALUATIONS=OFF -DBUILD_EXAMPLES=OFF
|
||||||
|
cmake --build build -j$NPROC
|
||||||
|
DESTDIR="$STAGE" cmake --install build
|
||||||
|
|
||||||
|
# ----------------------------- OrbbecSDK ------------------------
|
||||||
|
- name: Cache OrbbecSDK
|
||||||
|
id: cache-orbbec
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.temp }}/deps-stage/orbbec
|
||||||
|
key: orbbec-2.8.7-usrlocal-${{ inputs.os }}-${{ hashFiles('.github/actions/install-macos-source-deps/patches/orbbecsdk-2.8.7-cmake-config-install.patch') }}-${{ steps.depver.outputs.hash }}
|
||||||
|
|
||||||
|
- name: Build OrbbecSDK
|
||||||
|
if: steps.cache-orbbec.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
NPROC=$(sysctl -n hw.logicalcpu)
|
||||||
|
PATCHES="${{ github.action_path }}/patches"
|
||||||
|
SRC="${{ runner.temp }}/src-deps/orbbec"
|
||||||
|
STAGE="${{ runner.temp }}/deps-stage/orbbec"
|
||||||
|
rm -rf "$SRC"; mkdir -p "$SRC" "$STAGE"
|
||||||
|
git clone --depth 1 --branch v2.8.7 https://github.com/orbbec/OrbbecSDK_v2.git "$SRC/OrbbecSDK_v2"
|
||||||
|
cd "$SRC/OrbbecSDK_v2"
|
||||||
|
git apply "$PATCHES/orbbecsdk-2.8.7-cmake-config-install.patch"
|
||||||
|
# OrbbecSDK defaults its install prefix to /opt/OrbbecSDK; force /usr/local
|
||||||
|
# so it stages under usr/local like the other deps and is installed/found.
|
||||||
|
cmake -B build -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DCMAKE_INSTALL_PREFIX=/usr/local -DOB_BUILD_DOCS=OFF -DOB_BUILD_EXAMPLES=OFF -DOB_BUILD_TOOLS=OFF -DOB_INSTALL_EXAMPLES_SOURCE=OFF
|
||||||
|
cmake --build build -j$NPROC
|
||||||
|
DESTDIR="$STAGE" cmake --install build
|
||||||
|
|
||||||
|
# ----------------------------- depthai --------------------------
|
||||||
|
- name: Cache depthai
|
||||||
|
id: cache-depthai
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.temp }}/deps-stage/depthai
|
||||||
|
key: depthai-2.32.0-usrlocal-nocv-${{ inputs.os }}-${{ hashFiles('.github/actions/install-macos-source-deps/patches/depthai-2.32.0-hunter-macos.patch') }}-${{ steps.depver.outputs.hash }}
|
||||||
|
|
||||||
|
- name: Build depthai
|
||||||
|
if: steps.cache-depthai.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
NPROC=$(sysctl -n hw.logicalcpu)
|
||||||
|
PATCHES="${{ github.action_path }}/patches"
|
||||||
|
SRC="${{ runner.temp }}/src-deps/depthai"
|
||||||
|
STAGE="${{ runner.temp }}/deps-stage/depthai"
|
||||||
|
rm -rf "$SRC"; mkdir -p "$SRC" "$STAGE"
|
||||||
|
# depthai 2.32.0 (Hunter-based; v2 does NOT use vcpkg/CMake presets)
|
||||||
|
git clone --depth 1 --branch v2.32.0 https://github.com/luxonis/depthai-core.git "$SRC/depthai-core"
|
||||||
|
cd "$SRC/depthai-core"
|
||||||
|
git submodule update --init --recursive
|
||||||
|
# Route zlib to Homebrew: Hunter's pinned zlib fork has a classic
|
||||||
|
# TARGET_OS_MAC fdopen block that won't compile against the modern macOS SDK.
|
||||||
|
git apply "$PATCHES/depthai-2.32.0-hunter-macos.patch"
|
||||||
|
# v2 and its old Hunter deps declare cmake_minimum_required < 3.5, which the
|
||||||
|
# runner's CMake 4.x rejects, and CMAKE_POLICY_VERSION_MINIMUM does not
|
||||||
|
# propagate into Hunter's sub-builds. Use a pinned CMake 3.x just for depthai
|
||||||
|
# (Hunter reuses the same cmake binary for its dependency sub-builds).
|
||||||
|
python3 -m venv "$SRC/cmake3-venv"
|
||||||
|
"$SRC/cmake3-venv/bin/pip" install -q "cmake==3.31.6"
|
||||||
|
CMAKE3="$SRC/cmake3-venv/bin/cmake"
|
||||||
|
# DEPTHAI_ENABLE_CURL=OFF: Hunter's CURL drags in the broken zlib and also
|
||||||
|
# fails to configure on this toolchain; rtabmap doesn't need depthai's CURL.
|
||||||
|
# depthai-core defaults its install prefix to <build>/install; force
|
||||||
|
# /usr/local so it stages under usr/local like the other deps.
|
||||||
|
"$CMAKE3" -B build \
|
||||||
|
-DCMAKE_BUILD_TYPE=${{ inputs.build_type }} \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=/usr/local \
|
||||||
|
-DBUILD_SHARED_LIBS=ON \
|
||||||
|
-DDEPTHAI_ENABLE_CURL=OFF \
|
||||||
|
-DDEPTHAI_BUILD_TESTS=OFF \
|
||||||
|
-DDEPTHAI_BUILD_EXAMPLES=OFF \
|
||||||
|
-DDEPTHAI_OPENCV_SUPPORT=OFF \
|
||||||
|
-DCMAKE_PREFIX_PATH="$(brew --prefix zlib)"
|
||||||
|
"$CMAKE3" --build build -j$NPROC
|
||||||
|
DESTDIR="$STAGE" "$CMAKE3" --install build
|
||||||
|
|
||||||
|
# ----------------------------- opengv ---------------------------
|
||||||
|
- name: Cache opengv
|
||||||
|
id: cache-opengv
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.temp }}/deps-stage/opengv
|
||||||
|
key: opengv-91f4b19c-usrlocal-${{ inputs.os }}-${{ hashFiles('.github/actions/install-macos-source-deps/patches/opengv-91f4b19c-macos.patch') }}-${{ steps.depver.outputs.hash }}
|
||||||
|
|
||||||
|
- name: Build opengv
|
||||||
|
if: steps.cache-opengv.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
NPROC=$(sysctl -n hw.logicalcpu)
|
||||||
|
PATCHES="${{ github.action_path }}/patches"
|
||||||
|
SRC="${{ runner.temp }}/src-deps/opengv"
|
||||||
|
STAGE="${{ runner.temp }}/deps-stage/opengv"
|
||||||
|
rm -rf "$SRC"; mkdir -p "$SRC" "$STAGE"
|
||||||
|
# opengv pins a commit (not a tag), so clone then checkout.
|
||||||
|
git clone https://github.com/laurentkneip/opengv.git "$SRC/opengv"
|
||||||
|
cd "$SRC/opengv"
|
||||||
|
git checkout 91f4b19c73450833a40e463ad3648aae80b3a7f3
|
||||||
|
# Disable the -march=native/armv7-a/armv8-a flags so it builds portably on
|
||||||
|
# both Intel and Apple Silicon runners.
|
||||||
|
git apply "$PATCHES/opengv-91f4b19c-macos.patch"
|
||||||
|
# CMAKE_POLICY_VERSION_MINIMUM=3.5: opengv declares an ancient
|
||||||
|
# cmake_minimum_required that modern CMake rejects. EIGEN_INCLUDE_DIR points
|
||||||
|
# opengv's bundled FindEigen at Homebrew's eigen (covers /opt/homebrew on arm64).
|
||||||
|
cmake -B build \
|
||||||
|
-DCMAKE_BUILD_TYPE=${{ inputs.build_type }} \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=/usr/local \
|
||||||
|
-DBUILD_TESTS=OFF \
|
||||||
|
-DBUILD_SHARED_LIBS=ON \
|
||||||
|
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
|
||||||
|
-DEIGEN_INCLUDE_DIR="$(brew --prefix eigen)/include/eigen3"
|
||||||
|
cmake --build build -j$NPROC
|
||||||
|
DESTDIR="$STAGE" cmake --install build
|
||||||
|
|
||||||
|
# ----------------------------- g2o ------------------------------
|
||||||
|
- name: Cache g2o
|
||||||
|
id: cache-g2o
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.temp }}/deps-stage/g2o
|
||||||
|
key: g2o-67cbe15c-${{ inputs.os }}-${{ steps.depver.outputs.hash }}
|
||||||
|
|
||||||
|
- name: Build g2o
|
||||||
|
if: steps.cache-g2o.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
NPROC=$(sysctl -n hw.logicalcpu)
|
||||||
|
SRC="${{ runner.temp }}/src-deps/g2o"
|
||||||
|
STAGE="${{ runner.temp }}/deps-stage/g2o"
|
||||||
|
rm -rf "$SRC"; mkdir -p "$SRC" "$STAGE"
|
||||||
|
# g2o pins a commit (not a tag), so clone then checkout.
|
||||||
|
git clone https://github.com/RainerKuemmerle/g2o.git "$SRC/g2o"
|
||||||
|
cd "$SRC/g2o"
|
||||||
|
git checkout 67cbe15c998737ac6705d3cd18201a72be0d073d
|
||||||
|
# CMAKE_INSTALL_PREFIX=/usr/local so it stages under usr/local like the
|
||||||
|
# other deps. Homebrew's libomp is keg-only and g2o does not propagate
|
||||||
|
# OpenMP's include/lib dirs, so with Apple clang <omp.h> isn't found and
|
||||||
|
# libomp isn't linked; add its include (-I) and lib (-L -lomp) explicitly.
|
||||||
|
LIBOMP=$(brew --prefix libomp)
|
||||||
|
cmake -B build \
|
||||||
|
-DCMAKE_BUILD_TYPE=${{ inputs.build_type }} \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=/usr/local \
|
||||||
|
-DCMAKE_PREFIX_PATH="$LIBOMP" \
|
||||||
|
-DCMAKE_C_FLAGS="-I$LIBOMP/include" \
|
||||||
|
-DCMAKE_CXX_FLAGS="-I$LIBOMP/include" \
|
||||||
|
-DCMAKE_EXE_LINKER_FLAGS="-L$LIBOMP/lib -lomp" \
|
||||||
|
-DCMAKE_SHARED_LINKER_FLAGS="-L$LIBOMP/lib -lomp" \
|
||||||
|
-DG2O_BUILD_APPS=OFF \
|
||||||
|
-DG2O_BUILD_EXAMPLES=OFF \
|
||||||
|
-DG2O_USE_OPENMP=ON \
|
||||||
|
-DG2O_USE_OPENGL=OFF
|
||||||
|
cmake --build build -j$NPROC
|
||||||
|
DESTDIR="$STAGE" cmake --install build
|
||||||
|
|
||||||
|
# ------------------- install all units into /usr/local ----------
|
||||||
|
- name: Install source dependencies into /usr/local
|
||||||
|
shell: bash
|
||||||
|
# Copy each (cached or freshly built) staged tree into /usr/local so
|
||||||
|
# rtabmap's find_package() and the bundle fixup (which search /usr/local)
|
||||||
|
# pick them up. Runs on both cache hit and miss.
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
STAGE="${{ runner.temp }}/deps-stage"
|
||||||
|
found=0
|
||||||
|
for unit in gtsam pointmatcher orbbec depthai opengv g2o; do
|
||||||
|
if [ -d "$STAGE/$unit/usr/local" ]; then
|
||||||
|
sudo cp -a "$STAGE/$unit/usr/local/." /usr/local/
|
||||||
|
found=1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ "$found" != "1" ]; then
|
||||||
|
echo "No staged source dependencies found under $STAGE" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
41
.github/actions/install-macos-source-deps/patches/depthai-2.32.0-hunter-macos.patch
vendored
Normal file
41
.github/actions/install-macos-source-deps/patches/depthai-2.32.0-hunter-macos.patch
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
diff --git a/cmake/depthaiDependencies.cmake b/cmake/depthaiDependencies.cmake
|
||||||
|
index 6b0b44f98..672c26402 100644
|
||||||
|
--- a/cmake/depthaiDependencies.cmake
|
||||||
|
+++ b/cmake/depthaiDependencies.cmake
|
||||||
|
@@ -17,7 +17,9 @@ else()
|
||||||
|
hunter_add_package(FP16)
|
||||||
|
hunter_add_package(libarchive-luxonis)
|
||||||
|
hunter_add_package(spdlog)
|
||||||
|
- hunter_add_package(ZLIB)
|
||||||
|
+ # ZLIB: use the system/Homebrew copy instead of Hunter's (the old pinned
|
||||||
|
+ # zlib fork fails to build against the modern macOS SDK). Found below via
|
||||||
|
+ # the standard FindZLIB module, which provides the same ZLIB::ZLIB target.
|
||||||
|
if(DEPTHAI_ENABLE_BACKWARD)
|
||||||
|
hunter_add_package(Backward)
|
||||||
|
endif()
|
||||||
|
@@ -45,8 +47,23 @@ if(NOT CONFIG_MODE OR (CONFIG_MODE AND NOT DEPTHAI_SHARED_LIBS))
|
||||||
|
# libarchive for firmware packages
|
||||||
|
find_package(archive_static ${_QUIET} CONFIG REQUIRED)
|
||||||
|
find_package(lzma ${_QUIET} CONFIG REQUIRED)
|
||||||
|
- # ZLIB for compressing Apps
|
||||||
|
- find_package(ZLIB CONFIG REQUIRED)
|
||||||
|
+ # ZLIB for compressing Apps.
|
||||||
|
+ # Use the system/Homebrew zlib directly instead of Hunter's: Hunter's pinned
|
||||||
|
+ # zlib fork fails to build against the modern macOS SDK, and Hunter also
|
||||||
|
+ # intercepts find_package(ZLIB) via its own FindZLIB on the module path, so
|
||||||
|
+ # we locate it manually and expose the ZLIB::zlib target depthai expects.
|
||||||
|
+ find_path(SYSTEM_ZLIB_INCLUDE_DIR NAMES zlib.h)
|
||||||
|
+ find_library(SYSTEM_ZLIB_LIBRARY NAMES z)
|
||||||
|
+ if(NOT SYSTEM_ZLIB_INCLUDE_DIR OR NOT SYSTEM_ZLIB_LIBRARY)
|
||||||
|
+ message(FATAL_ERROR "System zlib not found (looked for zlib.h and libz). Install via: brew install zlib")
|
||||||
|
+ endif()
|
||||||
|
+ if(NOT TARGET ZLIB::zlib)
|
||||||
|
+ add_library(ZLIB::zlib UNKNOWN IMPORTED)
|
||||||
|
+ set_target_properties(ZLIB::zlib PROPERTIES
|
||||||
|
+ IMPORTED_LOCATION "${SYSTEM_ZLIB_LIBRARY}"
|
||||||
|
+ INTERFACE_INCLUDE_DIRECTORIES "${SYSTEM_ZLIB_INCLUDE_DIR}"
|
||||||
|
+ )
|
||||||
|
+ endif()
|
||||||
|
|
||||||
|
# spdlog for library and device logging
|
||||||
|
find_package(spdlog ${_QUIET} CONFIG REQUIRED)
|
||||||
83
.github/actions/install-macos-source-deps/patches/gtsam-4.2.1-eigen5.patch
vendored
Normal file
83
.github/actions/install-macos-source-deps/patches/gtsam-4.2.1-eigen5.patch
vendored
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
diff --git a/cmake/HandleEigen.cmake b/cmake/HandleEigen.cmake
|
||||||
|
index b3b4f66b6..651cd1009 100644
|
||||||
|
--- a/cmake/HandleEigen.cmake
|
||||||
|
+++ b/cmake/HandleEigen.cmake
|
||||||
|
@@ -59,7 +59,12 @@ else()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Detect Eigen version:
|
||||||
|
-set(EIGEN_VER_H "${GTSAM_EIGEN_INCLUDE_FOR_BUILD}/Eigen/src/Core/util/Macros.h")
|
||||||
|
+# Since Eigen 5.0.0 the version macros moved from Eigen/src/Core/util/Macros.h
|
||||||
|
+# to a dedicated Eigen/Version header, so check the new location first.
|
||||||
|
+set(EIGEN_VER_H "${GTSAM_EIGEN_INCLUDE_FOR_BUILD}/Eigen/Version")
|
||||||
|
+if (NOT EXISTS ${EIGEN_VER_H})
|
||||||
|
+ set(EIGEN_VER_H "${GTSAM_EIGEN_INCLUDE_FOR_BUILD}/Eigen/src/Core/util/Macros.h")
|
||||||
|
+endif()
|
||||||
|
if (EXISTS ${EIGEN_VER_H})
|
||||||
|
file(READ "${EIGEN_VER_H}" STR_EIGEN_VERSION)
|
||||||
|
|
||||||
|
diff --git a/gtsam/base/Matrix.h b/gtsam/base/Matrix.h
|
||||||
|
index cfedf6d8c..9c9771407 100644
|
||||||
|
--- a/gtsam/base/Matrix.h
|
||||||
|
+++ b/gtsam/base/Matrix.h
|
||||||
|
@@ -54,7 +54,7 @@ using Matrix7##N = Eigen::Matrix<double, 7, N>; \
|
||||||
|
using Matrix8##N = Eigen::Matrix<double, 8, N>; \
|
||||||
|
using Matrix9##N = Eigen::Matrix<double, 9, N>; \
|
||||||
|
static const Eigen::MatrixBase<Matrix##N>::IdentityReturnType I_##N##x##N = Matrix##N::Identity(); \
|
||||||
|
-static const Eigen::MatrixBase<Matrix##N>::ConstantReturnType Z_##N##x##N = Matrix##N::Zero();
|
||||||
|
+static const decltype(Matrix##N::Zero()) Z_##N##x##N = Matrix##N::Zero();
|
||||||
|
|
||||||
|
GTSAM_MAKE_MATRIX_DEFS(1)
|
||||||
|
GTSAM_MAKE_MATRIX_DEFS(2)
|
||||||
|
diff --git a/gtsam/base/Vector.h b/gtsam/base/Vector.h
|
||||||
|
index f7923ff88..5410393f6 100644
|
||||||
|
--- a/gtsam/base/Vector.h
|
||||||
|
+++ b/gtsam/base/Vector.h
|
||||||
|
@@ -27,6 +27,7 @@
|
||||||
|
|
||||||
|
#include <gtsam/global_includes.h>
|
||||||
|
#include <Eigen/Core>
|
||||||
|
+#include <cassert>
|
||||||
|
#include <iosfwd>
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
@@ -42,14 +43,14 @@ typedef Eigen::Matrix<double, 1, 1> Vector1;
|
||||||
|
typedef Eigen::Vector2d Vector2;
|
||||||
|
typedef Eigen::Vector3d Vector3;
|
||||||
|
|
||||||
|
-static const Eigen::MatrixBase<Vector2>::ConstantReturnType Z_2x1 = Vector2::Zero();
|
||||||
|
-static const Eigen::MatrixBase<Vector3>::ConstantReturnType Z_3x1 = Vector3::Zero();
|
||||||
|
+static const decltype(Vector2::Zero()) Z_2x1 = Vector2::Zero();
|
||||||
|
+static const decltype(Vector3::Zero()) Z_3x1 = Vector3::Zero();
|
||||||
|
|
||||||
|
// Create handy typedefs and constants for vectors with N>3
|
||||||
|
// VectorN and Z_Nx1, for N=1..9
|
||||||
|
#define GTSAM_MAKE_VECTOR_DEFS(N) \
|
||||||
|
using Vector##N = Eigen::Matrix<double, N, 1>; \
|
||||||
|
- static const Eigen::MatrixBase<Vector##N>::ConstantReturnType Z_##N##x1 = Vector##N::Zero();
|
||||||
|
+ static const decltype(Vector##N::Zero()) Z_##N##x1 = Vector##N::Zero();
|
||||||
|
|
||||||
|
GTSAM_MAKE_VECTOR_DEFS(4)
|
||||||
|
GTSAM_MAKE_VECTOR_DEFS(5)
|
||||||
|
diff --git a/gtsam/linear/iterative.h b/gtsam/linear/iterative.h
|
||||||
|
index 22f65b8de..20a0c936e 100644
|
||||||
|
--- a/gtsam/linear/iterative.h
|
||||||
|
+++ b/gtsam/linear/iterative.h
|
||||||
|
@@ -61,7 +61,7 @@ namespace gtsam {
|
||||||
|
|
||||||
|
/** Apply operator A'*e */
|
||||||
|
Vector operator^(const Vector& e) const {
|
||||||
|
- return A_ ^ e;
|
||||||
|
+ return gtsam::operator^(A_, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -71,7 +71,7 @@ namespace gtsam {
|
||||||
|
|
||||||
|
/** gradient of objective function 0.5*|Ax-b_|^2 at x = A_'*(Ax-b_) */
|
||||||
|
Vector gradient(const Vector& x) const {
|
||||||
|
- return A() ^ (A() * x - b());
|
||||||
|
+ return gtsam::operator^(A(), Vector(A() * x - b()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Apply operator A */
|
||||||
87
.github/actions/install-macos-source-deps/patches/libnabo-1.1.2.patch
vendored
Normal file
87
.github/actions/install-macos-source-deps/patches/libnabo-1.1.2.patch
vendored
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||||
|
index a5f0c44..69340e4 100644
|
||||||
|
--- a/CMakeLists.txt
|
||||||
|
+++ b/CMakeLists.txt
|
||||||
|
@@ -78,18 +78,18 @@ elseif ()
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
-# enable C++11 support.
|
||||||
|
+# enable C++14 support (required by recent Eigen versions).
|
||||||
|
if (CMAKE_VERSION VERSION_LESS "3.1")
|
||||||
|
if (MSVC)
|
||||||
|
message(FATAL_ERROR "CMake version 3.1 or later is required to compile ${PROJECT_NAME} with Microsoft Visual C++")
|
||||||
|
endif ()
|
||||||
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
|
- set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
|
||||||
|
+ set (CMAKE_CXX_FLAGS "-std=c++14 ${CMAKE_CXX_FLAGS}")
|
||||||
|
else ()
|
||||||
|
- set (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
|
||||||
|
+ set (CMAKE_CXX_FLAGS "-std=c++14 ${CMAKE_CXX_FLAGS}")
|
||||||
|
endif ()
|
||||||
|
else ()
|
||||||
|
- set (CMAKE_CXX_STANDARD 11)
|
||||||
|
+ set (CMAKE_CXX_STANDARD 14)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
#======================== External Dependencies ===============================
|
||||||
|
diff --git a/experimental/kdtree_cpu.cpp b/experimental/kdtree_cpu.cpp
|
||||||
|
index 302b672..d63fcd3 100644
|
||||||
|
--- a/experimental/kdtree_cpu.cpp
|
||||||
|
+++ b/experimental/kdtree_cpu.cpp
|
||||||
|
@@ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#include "nabo_experimental.h"
|
||||||
|
#include "../nabo/index_heap.h"
|
||||||
|
+#include <cassert>
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <limits>
|
||||||
|
diff --git a/nabo/kdtree_cpu.cpp b/nabo/kdtree_cpu.cpp
|
||||||
|
index cb1f8d1..52a444f 100644
|
||||||
|
--- a/nabo/kdtree_cpu.cpp
|
||||||
|
+++ b/nabo/kdtree_cpu.cpp
|
||||||
|
@@ -37,6 +37,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#include <queue>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <utility>
|
||||||
|
+#include <cassert>
|
||||||
|
#ifdef HAVE_OPENMP
|
||||||
|
#include <omp.h>
|
||||||
|
#endif
|
||||||
|
diff --git a/nabo/kdtree_opencl.cpp b/nabo/kdtree_opencl.cpp
|
||||||
|
index 5a9fee2..fb1345f 100644
|
||||||
|
--- a/nabo/kdtree_opencl.cpp
|
||||||
|
+++ b/nabo/kdtree_opencl.cpp
|
||||||
|
@@ -33,6 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#include "nabo_private.h"
|
||||||
|
#include "index_heap.h"
|
||||||
|
+#include <cassert>
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <fstream>
|
||||||
|
diff --git a/tests/knnshow.cpp b/tests/knnshow.cpp
|
||||||
|
index 6f4d3fc..c612378 100644
|
||||||
|
--- a/tests/knnshow.cpp
|
||||||
|
+++ b/tests/knnshow.cpp
|
||||||
|
@@ -30,6 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "nabo/nabo.h"
|
||||||
|
+#include <cassert>
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <stdexcept>
|
||||||
|
diff --git a/tests/knnvalidate.cpp b/tests/knnvalidate.cpp
|
||||||
|
index 2430249..2a7dcc4 100644
|
||||||
|
--- a/tests/knnvalidate.cpp
|
||||||
|
+++ b/tests/knnvalidate.cpp
|
||||||
|
@@ -32,6 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#include "nabo/nabo.h"
|
||||||
|
#include "helpers.h"
|
||||||
|
//#include "experimental/nabo_experimental.h"
|
||||||
|
+#include <cassert>
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <stdexcept>
|
||||||
32
.github/actions/install-macos-source-deps/patches/libpointmatcher-1.4.4-boost.patch
vendored
Normal file
32
.github/actions/install-macos-source-deps/patches/libpointmatcher-1.4.4-boost.patch
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||||
|
index 9dabfd0..7b73418 100644
|
||||||
|
--- a/CMakeLists.txt
|
||||||
|
+++ b/CMakeLists.txt
|
||||||
|
@@ -128,9 +128,9 @@ endif()
|
||||||
|
#--------------------
|
||||||
|
# DEPENDENCY: boost
|
||||||
|
#--------------------
|
||||||
|
-find_package(Boost REQUIRED COMPONENTS thread system program_options date_time)
|
||||||
|
+find_package(Boost REQUIRED COMPONENTS thread program_options date_time)
|
||||||
|
if (Boost_MINOR_VERSION GREATER 47)
|
||||||
|
- find_package(Boost REQUIRED COMPONENTS thread system program_options date_time chrono)
|
||||||
|
+ find_package(Boost REQUIRED COMPONENTS thread program_options date_time chrono)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
#--------------------
|
||||||
|
diff --git a/libpointmatcherConfig.cmake.in b/libpointmatcherConfig.cmake.in
|
||||||
|
index 6de2c85..7c887fd 100644
|
||||||
|
--- a/libpointmatcherConfig.cmake.in
|
||||||
|
+++ b/libpointmatcherConfig.cmake.in
|
||||||
|
@@ -7,9 +7,9 @@
|
||||||
|
include(CMakeFindDependencyMacro)
|
||||||
|
find_dependency(libnabo REQUIRED)
|
||||||
|
find_dependency(yaml-cpp REQUIRED)
|
||||||
|
-find_package(Boost COMPONENTS thread system program_options date_time REQUIRED)
|
||||||
|
+find_package(Boost COMPONENTS thread program_options date_time REQUIRED)
|
||||||
|
if (Boost_MINOR_VERSION GREATER 47)
|
||||||
|
- find_package(Boost COMPONENTS thread system program_options date_time chrono REQUIRED)
|
||||||
|
+ find_package(Boost COMPONENTS thread program_options date_time chrono REQUIRED)
|
||||||
|
endif ()
|
||||||
|
include(${CMAKE_CURRENT_LIST_DIR}/libpointmatcher-config.cmake)
|
||||||
|
|
||||||
309
.github/actions/install-macos-source-deps/patches/opengv-91f4b19c-macos.patch
vendored
Normal file
309
.github/actions/install-macos-source-deps/patches/opengv-91f4b19c-macos.patch
vendored
Normal file
@@ -0,0 +1,309 @@
|
|||||||
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||||
|
index 9660f55..0186da4 100644
|
||||||
|
--- a/CMakeLists.txt
|
||||||
|
+++ b/CMakeLists.txt
|
||||||
|
@@ -31,12 +31,12 @@ IF(MSVC)
|
||||||
|
add_definitions(-D_USE_MATH_DEFINES)
|
||||||
|
ELSE()
|
||||||
|
IF (CMAKE_SYSTEM_PROCESSOR MATCHES "(arm64)|(ARM64)|(aarch64)|(AARCH64)")
|
||||||
|
- add_definitions (-march=armv8-a)
|
||||||
|
+ #add_definitions (-march=armv8-a)
|
||||||
|
ELSEIF (CMAKE_SYSTEM_PROCESSOR MATCHES
|
||||||
|
"(arm)|(ARM)|(armhf)|(ARMHF)|(armel)|(ARMEL)")
|
||||||
|
- add_definitions (-march=armv7-a)
|
||||||
|
+ #add_definitions (-march=armv7-a)
|
||||||
|
ELSE ()
|
||||||
|
- add_definitions (-march=native) #TODO use correct c++11 def once everybody has moved to gcc 4.7 # for now I even removed std=gnu++0x
|
||||||
|
+ #add_definitions (-march=native) #TODO use correct c++11 def once everybody has moved to gcc 4.7 # for now I even removed std=gnu++0x
|
||||||
|
ENDIF()
|
||||||
|
add_definitions (
|
||||||
|
-O3
|
||||||
|
@@ -181,7 +181,7 @@ add_library( random_generators test/random_generators.cpp test/random_generators
|
||||||
|
set_target_properties( opengv random_generators PROPERTIES
|
||||||
|
SOVERSION ${PROJECT_VERSION}
|
||||||
|
VERSION ${PROJECT_VERSION}
|
||||||
|
- CXX_STANDARD 11
|
||||||
|
+ CXX_STANDARD 14
|
||||||
|
CXX_STANDARD_REQUIRED ON
|
||||||
|
DEBUG_POSTFIX d )
|
||||||
|
|
||||||
|
@@ -329,7 +329,7 @@ IF (BUILD_TESTS)
|
||||||
|
test_Sturm
|
||||||
|
|
||||||
|
PROPERTIES
|
||||||
|
- CXX_STANDARD 11
|
||||||
|
+ CXX_STANDARD 14
|
||||||
|
CXX_STANDARD_REQUIRED ON
|
||||||
|
DEBUG_POSTFIX d )
|
||||||
|
|
||||||
|
diff --git a/modules/FindEigen.cmake b/modules/FindEigen.cmake
|
||||||
|
index 126f4a0..39b5524 100644
|
||||||
|
--- a/modules/FindEigen.cmake
|
||||||
|
+++ b/modules/FindEigen.cmake
|
||||||
|
@@ -30,7 +30,13 @@ if(NOT Eigen_FIND_VERSION)
|
||||||
|
endif(NOT Eigen_FIND_VERSION)
|
||||||
|
|
||||||
|
macro(_eigen3_check_version)
|
||||||
|
- file(READ "${EIGEN_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header)
|
||||||
|
+ # Since Eigen 5.0.0 the version macros moved from Eigen/src/Core/util/Macros.h
|
||||||
|
+ # to a dedicated Eigen/Version header, so check the new location first.
|
||||||
|
+ if(EXISTS "${EIGEN_INCLUDE_DIR}/Eigen/Version")
|
||||||
|
+ file(READ "${EIGEN_INCLUDE_DIR}/Eigen/Version" _eigen3_version_header)
|
||||||
|
+ else()
|
||||||
|
+ file(READ "${EIGEN_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header)
|
||||||
|
+ endif()
|
||||||
|
|
||||||
|
string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}")
|
||||||
|
set(EIGEN_WORLD_VERSION "${CMAKE_MATCH_1}")
|
||||||
|
diff --git a/src/absolute_pose/CentralAbsoluteAdapter.cpp b/src/absolute_pose/CentralAbsoluteAdapter.cpp
|
||||||
|
index 684fa7e..a4ff2bd 100644
|
||||||
|
--- a/src/absolute_pose/CentralAbsoluteAdapter.cpp
|
||||||
|
+++ b/src/absolute_pose/CentralAbsoluteAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/absolute_pose/CentralAbsoluteAdapter.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/src/absolute_pose/MACentralAbsolute.cpp b/src/absolute_pose/MACentralAbsolute.cpp
|
||||||
|
index 6edbabc..1687d45 100644
|
||||||
|
--- a/src/absolute_pose/MACentralAbsolute.cpp
|
||||||
|
+++ b/src/absolute_pose/MACentralAbsolute.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/absolute_pose/MACentralAbsolute.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/src/absolute_pose/MANoncentralAbsolute.cpp b/src/absolute_pose/MANoncentralAbsolute.cpp
|
||||||
|
index d9b5b09..a7ae689 100644
|
||||||
|
--- a/src/absolute_pose/MANoncentralAbsolute.cpp
|
||||||
|
+++ b/src/absolute_pose/MANoncentralAbsolute.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/absolute_pose/MANoncentralAbsolute.hpp>
|
||||||
|
|
||||||
|
opengv::absolute_pose::MANoncentralAbsolute::MANoncentralAbsolute(
|
||||||
|
diff --git a/src/absolute_pose/NoncentralAbsoluteAdapter.cpp b/src/absolute_pose/NoncentralAbsoluteAdapter.cpp
|
||||||
|
index 30176aa..6a0e405 100644
|
||||||
|
--- a/src/absolute_pose/NoncentralAbsoluteAdapter.cpp
|
||||||
|
+++ b/src/absolute_pose/NoncentralAbsoluteAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/absolute_pose/NoncentralAbsoluteAdapter.hpp>
|
||||||
|
|
||||||
|
opengv::absolute_pose::NoncentralAbsoluteAdapter::NoncentralAbsoluteAdapter(
|
||||||
|
diff --git a/src/absolute_pose/NoncentralAbsoluteMultiAdapter.cpp b/src/absolute_pose/NoncentralAbsoluteMultiAdapter.cpp
|
||||||
|
index 88c237a..58a82f4 100644
|
||||||
|
--- a/src/absolute_pose/NoncentralAbsoluteMultiAdapter.cpp
|
||||||
|
+++ b/src/absolute_pose/NoncentralAbsoluteMultiAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/absolute_pose/NoncentralAbsoluteMultiAdapter.hpp>
|
||||||
|
|
||||||
|
opengv::absolute_pose::NoncentralAbsoluteMultiAdapter::NoncentralAbsoluteMultiAdapter(
|
||||||
|
diff --git a/src/absolute_pose/methods.cpp b/src/absolute_pose/methods.cpp
|
||||||
|
index b1f0889..19c4eaf 100644
|
||||||
|
--- a/src/absolute_pose/methods.cpp
|
||||||
|
+++ b/src/absolute_pose/methods.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/absolute_pose/methods.hpp>
|
||||||
|
#include <opengv/Indices.hpp>
|
||||||
|
|
||||||
|
diff --git a/src/absolute_pose/modules/main.cpp b/src/absolute_pose/modules/main.cpp
|
||||||
|
index ed0c271..99f7f35 100644
|
||||||
|
--- a/src/absolute_pose/modules/main.cpp
|
||||||
|
+++ b/src/absolute_pose/modules/main.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <Eigen/NonLinearOptimization>
|
||||||
|
#include <Eigen/NumericalDiff>
|
||||||
|
|
||||||
|
diff --git a/src/math/arun.cpp b/src/math/arun.cpp
|
||||||
|
index a0d6296..f5c0ac3 100644
|
||||||
|
--- a/src/math/arun.cpp
|
||||||
|
+++ b/src/math/arun.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/math/arun.hpp>
|
||||||
|
|
||||||
|
opengv::rotation_t
|
||||||
|
diff --git a/src/point_cloud/MAPointCloud.cpp b/src/point_cloud/MAPointCloud.cpp
|
||||||
|
index 81fd5dd..cdccae3 100644
|
||||||
|
--- a/src/point_cloud/MAPointCloud.cpp
|
||||||
|
+++ b/src/point_cloud/MAPointCloud.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/point_cloud/MAPointCloud.hpp>
|
||||||
|
|
||||||
|
opengv::point_cloud::MAPointCloud::MAPointCloud(
|
||||||
|
diff --git a/src/point_cloud/PointCloudAdapter.cpp b/src/point_cloud/PointCloudAdapter.cpp
|
||||||
|
index f9faaeb..28fbb7e 100644
|
||||||
|
--- a/src/point_cloud/PointCloudAdapter.cpp
|
||||||
|
+++ b/src/point_cloud/PointCloudAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/point_cloud/PointCloudAdapter.hpp>
|
||||||
|
|
||||||
|
opengv::point_cloud::PointCloudAdapter::PointCloudAdapter(
|
||||||
|
diff --git a/src/point_cloud/methods.cpp b/src/point_cloud/methods.cpp
|
||||||
|
index 5409eeb..7a26e6a 100644
|
||||||
|
--- a/src/point_cloud/methods.cpp
|
||||||
|
+++ b/src/point_cloud/methods.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/point_cloud/methods.hpp>
|
||||||
|
#include <opengv/Indices.hpp>
|
||||||
|
|
||||||
|
diff --git a/src/relative_pose/CentralRelativeAdapter.cpp b/src/relative_pose/CentralRelativeAdapter.cpp
|
||||||
|
index 38e9a62..5018bd8 100644
|
||||||
|
--- a/src/relative_pose/CentralRelativeAdapter.cpp
|
||||||
|
+++ b/src/relative_pose/CentralRelativeAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/CentralRelativeAdapter.hpp>
|
||||||
|
|
||||||
|
opengv::relative_pose::CentralRelativeAdapter::CentralRelativeAdapter(
|
||||||
|
diff --git a/src/relative_pose/CentralRelativeMultiAdapter.cpp b/src/relative_pose/CentralRelativeMultiAdapter.cpp
|
||||||
|
index 2ab7476..49a3a07 100644
|
||||||
|
--- a/src/relative_pose/CentralRelativeMultiAdapter.cpp
|
||||||
|
+++ b/src/relative_pose/CentralRelativeMultiAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/CentralRelativeMultiAdapter.hpp>
|
||||||
|
|
||||||
|
opengv::relative_pose::CentralRelativeMultiAdapter::CentralRelativeMultiAdapter(
|
||||||
|
diff --git a/src/relative_pose/CentralRelativeWeightingAdapter.cpp b/src/relative_pose/CentralRelativeWeightingAdapter.cpp
|
||||||
|
index a6ab478..7684526 100644
|
||||||
|
--- a/src/relative_pose/CentralRelativeWeightingAdapter.cpp
|
||||||
|
+++ b/src/relative_pose/CentralRelativeWeightingAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/CentralRelativeWeightingAdapter.hpp>
|
||||||
|
|
||||||
|
opengv::relative_pose::CentralRelativeWeightingAdapter::CentralRelativeWeightingAdapter(
|
||||||
|
diff --git a/src/relative_pose/MACentralRelative.cpp b/src/relative_pose/MACentralRelative.cpp
|
||||||
|
index ec2959f..75e76d5 100644
|
||||||
|
--- a/src/relative_pose/MACentralRelative.cpp
|
||||||
|
+++ b/src/relative_pose/MACentralRelative.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/MACentralRelative.hpp>
|
||||||
|
|
||||||
|
opengv::relative_pose::MACentralRelative::MACentralRelative(
|
||||||
|
diff --git a/src/relative_pose/MANoncentralRelative.cpp b/src/relative_pose/MANoncentralRelative.cpp
|
||||||
|
index cea9c14..8566aeb 100644
|
||||||
|
--- a/src/relative_pose/MANoncentralRelative.cpp
|
||||||
|
+++ b/src/relative_pose/MANoncentralRelative.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/MANoncentralRelative.hpp>
|
||||||
|
|
||||||
|
opengv::relative_pose::MANoncentralRelative::MANoncentralRelative(
|
||||||
|
diff --git a/src/relative_pose/MANoncentralRelativeMulti.cpp b/src/relative_pose/MANoncentralRelativeMulti.cpp
|
||||||
|
index 49f8ecf..8b62e07 100644
|
||||||
|
--- a/src/relative_pose/MANoncentralRelativeMulti.cpp
|
||||||
|
+++ b/src/relative_pose/MANoncentralRelativeMulti.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/MANoncentralRelativeMulti.hpp>
|
||||||
|
|
||||||
|
opengv::relative_pose::MANoncentralRelativeMulti::MANoncentralRelativeMulti(
|
||||||
|
diff --git a/src/relative_pose/NoncentralRelativeAdapter.cpp b/src/relative_pose/NoncentralRelativeAdapter.cpp
|
||||||
|
index 552f180..775d520 100644
|
||||||
|
--- a/src/relative_pose/NoncentralRelativeAdapter.cpp
|
||||||
|
+++ b/src/relative_pose/NoncentralRelativeAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/NoncentralRelativeAdapter.hpp>
|
||||||
|
|
||||||
|
opengv::relative_pose::NoncentralRelativeAdapter::NoncentralRelativeAdapter(
|
||||||
|
diff --git a/src/relative_pose/NoncentralRelativeMultiAdapter.cpp b/src/relative_pose/NoncentralRelativeMultiAdapter.cpp
|
||||||
|
index f41edbe..733023c 100644
|
||||||
|
--- a/src/relative_pose/NoncentralRelativeMultiAdapter.cpp
|
||||||
|
+++ b/src/relative_pose/NoncentralRelativeMultiAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/NoncentralRelativeMultiAdapter.hpp>
|
||||||
|
|
||||||
|
opengv::relative_pose::NoncentralRelativeMultiAdapter::NoncentralRelativeMultiAdapter(
|
||||||
|
diff --git a/src/relative_pose/methods.cpp b/src/relative_pose/methods.cpp
|
||||||
|
index 0027dae..7678567 100644
|
||||||
|
--- a/src/relative_pose/methods.cpp
|
||||||
|
+++ b/src/relative_pose/methods.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/methods.hpp>
|
||||||
|
#include <opengv/Indices.hpp>
|
||||||
|
|
||||||
|
diff --git a/src/relative_pose/modules/fivept_nister/modules.cpp b/src/relative_pose/modules/fivept_nister/modules.cpp
|
||||||
|
index 4b134c5..258d416 100644
|
||||||
|
--- a/src/relative_pose/modules/fivept_nister/modules.cpp
|
||||||
|
+++ b/src/relative_pose/modules/fivept_nister/modules.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/modules/fivept_nister/modules.hpp>
|
||||||
|
#include <Eigen/NonLinearOptimization>
|
||||||
|
#include <Eigen/NumericalDiff>
|
||||||
29
.github/actions/install-macos-source-deps/patches/orbbecsdk-2.8.7-cmake-config-install.patch
vendored
Normal file
29
.github/actions/install-macos-source-deps/patches/orbbecsdk-2.8.7-cmake-config-install.patch
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
|
||||||
|
index 261f2cda..644e068f 100644
|
||||||
|
--- a/src/CMakeLists.txt
|
||||||
|
+++ b/src/CMakeLists.txt
|
||||||
|
@@ -92,17 +92,20 @@ if(OB_IS_MAIN_PROJECT)
|
||||||
|
)
|
||||||
|
|
||||||
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/generated/Export.h" DESTINATION include/libobsensor/h)
|
||||||
|
- install(EXPORT ${OB_SDK_LIB_NAME}Config NAMESPACE ob:: DESTINATION lib)
|
||||||
|
+ install(EXPORT ${OB_SDK_LIB_NAME}Config NAMESPACE ob:: DESTINATION lib/cmake/${OB_SDK_LIB_NAME})
|
||||||
|
|
||||||
|
include(CMakePackageConfigHelpers)
|
||||||
|
+ # Name the version file <pkg>ConfigVersion.cmake (not <pkg>Version.cmake) and
|
||||||
|
+ # install it next to the config in lib/cmake/<pkg>, so find_package(OrbbecSDK)
|
||||||
|
+ # discovers it in config mode and reads its version.
|
||||||
|
write_basic_package_version_file(
|
||||||
|
- "${CMAKE_CURRENT_BINARY_DIR}/${OB_SDK_LIB_NAME}Version.cmake"
|
||||||
|
+ "${CMAKE_CURRENT_BINARY_DIR}/${OB_SDK_LIB_NAME}ConfigVersion.cmake"
|
||||||
|
VERSION "${PROJECT_VERSION}"
|
||||||
|
COMPATIBILITY SameMajorVersion
|
||||||
|
)
|
||||||
|
install(
|
||||||
|
- FILES "${CMAKE_CURRENT_BINARY_DIR}/${OB_SDK_LIB_NAME}Version.cmake"
|
||||||
|
- DESTINATION lib
|
||||||
|
+ FILES "${CMAKE_CURRENT_BINARY_DIR}/${OB_SDK_LIB_NAME}ConfigVersion.cmake"
|
||||||
|
+ DESTINATION lib/cmake/${OB_SDK_LIB_NAME}
|
||||||
|
)
|
||||||
|
if(MSVC)
|
||||||
|
install(FILES $<TARGET_PDB_FILE:${OB_SDK_LIB_NAME}> DESTINATION bin OPTIONAL)
|
||||||
70
.github/actions/install-windows-cuda-deps/action.yml
vendored
Normal file
70
.github/actions/install-windows-cuda-deps/action.yml
vendored
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
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_v5
|
||||||
|
|
||||||
|
- 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 7z is built locally with bundle_windows_deps_cuda.bat and uploaded to a
|
||||||
|
# GitHub release. Resolve it by filename via the API (authenticated with the
|
||||||
|
# built-in token) so it works even from a *draft* release and regardless of
|
||||||
|
# the (changing) asset id. Requires the workflow to run in-repo (github.token
|
||||||
|
# can't read introlab drafts from a fork PR).
|
||||||
|
$repo = "introlab/rtabmap"
|
||||||
|
$releaseTag = "0.23.8"
|
||||||
|
$assetName = "vcpkg-export-66c0373d-x64-vs2022-cuda130.7z"
|
||||||
|
$apiHeaders = @{ Authorization = "Bearer ${{ github.token }}"; "User-Agent" = "rtabmap-ci"; Accept = "application/vnd.github+json" }
|
||||||
|
# Select the release by tag_name (populated on drafts too, and unique), then
|
||||||
|
# take the asset from THAT release so concurrent releases can't be confused.
|
||||||
|
$rel = (Invoke-RestMethod -Uri "https://api.github.com/repos/$repo/releases?per_page=100" -Headers $apiHeaders) |
|
||||||
|
Where-Object { $_.tag_name -eq $releaseTag } | Select-Object -First 1
|
||||||
|
if (-not $rel) { throw "Release tagged $releaseTag not found (including drafts)" }
|
||||||
|
$asset = $rel.assets | Where-Object { $_.name -eq $assetName } | Select-Object -First 1
|
||||||
|
if (-not $asset) { throw "Asset $assetName not found in release $releaseTag" }
|
||||||
|
Write-Host "Downloading $assetName (asset id $($asset.id)) ..."
|
||||||
|
$dlHeaders = @{ Authorization = "Bearer ${{ github.token }}"; "User-Agent" = "rtabmap-ci"; Accept = "application/octet-stream" }
|
||||||
|
Invoke-WebRequest -Uri $asset.url -Headers $dlHeaders -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
|
||||||
|
# K4A runtime DLLs (k4a.dll, k4arecord.dll) live in the SDK bin; needed on PATH so fixup_bundle resolves them at package time.
|
||||||
|
echo "$vcpkg_path\installed\x64-windows-release\sdk\windows-desktop\amd64\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
|
||||||
54
.github/actions/install-windows-deps/action.yml
vendored
Normal file
54
.github/actions/install-windows-deps/action.yml
vendored
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
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-v7
|
||||||
|
|
||||||
|
- 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 7z is built locally with bundle_windows_deps.bat and uploaded to a
|
||||||
|
# GitHub release. Resolve it by filename via the API (authenticated with the
|
||||||
|
# built-in token) so it works even from a *draft* release and regardless of
|
||||||
|
# the (changing) asset id. Requires the workflow to run in-repo (github.token
|
||||||
|
# can't read introlab drafts from a fork PR).
|
||||||
|
$repo = "introlab/rtabmap"
|
||||||
|
$releaseTag = "0.23.8"
|
||||||
|
$assetName = "vcpkg-export-66c0373d-x64-vs2022.7z"
|
||||||
|
$apiHeaders = @{ Authorization = "Bearer ${{ github.token }}"; "User-Agent" = "rtabmap-ci"; Accept = "application/vnd.github+json" }
|
||||||
|
# Select the release by tag_name (populated on drafts too, and unique), then
|
||||||
|
# take the asset from THAT release so concurrent releases can't be confused.
|
||||||
|
$rel = (Invoke-RestMethod -Uri "https://api.github.com/repos/$repo/releases?per_page=100" -Headers $apiHeaders) |
|
||||||
|
Where-Object { $_.tag_name -eq $releaseTag } | Select-Object -First 1
|
||||||
|
if (-not $rel) { throw "Release tagged $releaseTag not found (including drafts)" }
|
||||||
|
$asset = $rel.assets | Where-Object { $_.name -eq $assetName } | Select-Object -First 1
|
||||||
|
if (-not $asset) { throw "Asset $assetName not found in release $releaseTag" }
|
||||||
|
Write-Host "Downloading $assetName (asset id $($asset.id)) ..."
|
||||||
|
$dlHeaders = @{ Authorization = "Bearer ${{ github.token }}"; "User-Agent" = "rtabmap-ci"; Accept = "application/octet-stream" }
|
||||||
|
Invoke-WebRequest -Uri $asset.url -Headers $dlHeaders -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
|
||||||
|
# K4A runtime DLLs (k4a.dll, k4arecord.dll) live in the SDK bin; needed on PATH so fixup_bundle resolves them at package time.
|
||||||
|
echo "$vcpkg_path\installed\x64-windows-release\sdk\windows-desktop\amd64\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
|
||||||
19
.github/scripts/ros-deps-env.sh
vendored
Normal file
19
.github/scripts/ros-deps-env.sh
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Puts the graph optimizers taken from the ROS 2 repo (see cmake-linux.yml) on
|
||||||
|
# the loader path, for a shell that is about to run something built against
|
||||||
|
# them. Sourced, not executed: it exports into the caller.
|
||||||
|
#
|
||||||
|
# source .github/scripts/ros-deps-env.sh /opt/ros/humble
|
||||||
|
#
|
||||||
|
# A missing or empty prefix is a build that took every dependency from the
|
||||||
|
# Ubuntu archive: nothing to add.
|
||||||
|
#
|
||||||
|
# Both directories are needed. GTSAM and g2o install their libraries in the
|
||||||
|
# multiarch subdirectory, while the prefix's own lib/ holds the rest, and
|
||||||
|
# libgtsam.so carries no RUNPATH -- so the loader finds neither it nor the
|
||||||
|
# libmetis-gtsam.so it pulls in without being told where to look.
|
||||||
|
ros_prefix="${1:-}"
|
||||||
|
if [ -n "$ros_prefix" ] && [ -d "$ros_prefix" ]; then
|
||||||
|
ros_lib="$ros_prefix/lib"
|
||||||
|
export LD_LIBRARY_PATH="${ros_lib}:${ros_lib}/$(gcc -dumpmachine)${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
||||||
|
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
|
||||||
|
fi
|
||||||
15
.github/workflows/cleanup-pr-artifacts.yml
vendored
Normal file
15
.github/workflows/cleanup-pr-artifacts.yml
vendored
Normal file
@@ -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-*
|
||||||
214
.github/workflows/cmake-linux.yml
vendored
Normal file
214
.github/workflows/cmake-linux.yml
vendored
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
name: CMake-Linux
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
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 }}
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}-${{ matrix.build_name }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
matrix:
|
||||||
|
build_name: [ubuntu-22.04, ubuntu-24.04, ubuntu-24.04-with-opengv, ubuntu-26.04]
|
||||||
|
include:
|
||||||
|
# GTSAM is in no Ubuntu release, and libg2o-dev only appears in the
|
||||||
|
# archive from noble on (jammy has no g2o at all).
|
||||||
|
#
|
||||||
|
# 26.04 builds GTSAM itself (gtsam_ref) rather than taking it from the
|
||||||
|
# ROS repo: that runner is on Ubuntu's amd64v3 variant, so rtabmap and
|
||||||
|
# the archive libraries are AVX builds where Eigen aligns to 32, while
|
||||||
|
# the ROS binary is plain x86-64 where it aligns to 16 and uses plain
|
||||||
|
# malloc/free. Allocating on one side and freeing on the other gives
|
||||||
|
# "double free or corruption (out)". Forcing EIGEN_MAX_ALIGN_BYTES=16
|
||||||
|
# on rtabmap would only move the mismatch onto PCL, g2o and Ceres.
|
||||||
|
- build_name: ubuntu-22.04
|
||||||
|
os: ubuntu-22.04
|
||||||
|
extra_deps: "libunwind-dev libceres-dev"
|
||||||
|
ros_deps: "ros-humble-libg2o ros-humble-gtsam"
|
||||||
|
ros_prefix: "/opt/ros/humble"
|
||||||
|
extra_cmake_def: "-DWITH_CERES=ON -DWITH_PYTHON=ON -DWITH_G2O=ON -DWITH_GTSAM=ON"
|
||||||
|
- build_name: ubuntu-24.04
|
||||||
|
os: ubuntu-24.04
|
||||||
|
extra_deps: "libg2o-dev libceres-dev"
|
||||||
|
ros_deps: "ros-jazzy-gtsam"
|
||||||
|
ros_prefix: "/opt/ros/jazzy"
|
||||||
|
extra_cmake_def: "-DWITH_CERES=ON -DWITH_PYTHON=ON -DWITH_G2O=ON -DWITH_GTSAM=ON"
|
||||||
|
- build_name: ubuntu-24.04-with-opengv
|
||||||
|
os: ubuntu-24.04
|
||||||
|
extra_deps: "libg2o-dev libceres-dev"
|
||||||
|
ros_deps: "ros-jazzy-gtsam"
|
||||||
|
ros_prefix: "/opt/ros/jazzy"
|
||||||
|
extra_cmake_def: "-DWITH_CERES=ON -DWITH_PYTHON=ON -DWITH_G2O=ON -DWITH_GTSAM=ON -DBUILD_OPENGV=ON"
|
||||||
|
- build_name: ubuntu-26.04
|
||||||
|
os: ubuntu-26.04
|
||||||
|
# libboost-all-dev for the GTSAM build
|
||||||
|
extra_deps: "libg2o-dev libceres-dev libboost-all-dev"
|
||||||
|
ros_deps: ""
|
||||||
|
ros_prefix: ""
|
||||||
|
# The tag ros-lyrical-gtsam 4.3.0 is built from
|
||||||
|
gtsam_ref: "4.3a0-ros"
|
||||||
|
extra_cmake_def: "-DWITH_CERES=ON -DWITH_PYTHON=ON -DWITH_G2O=ON -DWITH_GTSAM=ON -DBUILD_OPENGV=ON"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Restore test data
|
||||||
|
id: cache-testdata
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
# SQLite DBs are binary-portable -> share the cache across
|
||||||
|
# linux / macos / windows. Key omits runner.os on purpose so all
|
||||||
|
# three OSes hit the same entry.
|
||||||
|
path: data/tests/*.db
|
||||||
|
key: testdata-${{ hashFiles('data/tests/manifest.txt') }}
|
||||||
|
|
||||||
|
- name: Fetch test data
|
||||||
|
if: steps.cache-testdata.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: bash scripts/fetch_test_data.sh
|
||||||
|
|
||||||
|
- 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 curl gnupg lsb-release ${{ matrix.extra_deps }}
|
||||||
|
|
||||||
|
- name: Install Graph Optimizers From The ROS Repo
|
||||||
|
if: matrix.ros_deps != ''
|
||||||
|
env:
|
||||||
|
DEBIAN_FRONTEND: noninteractive
|
||||||
|
run: |
|
||||||
|
sudo curl -fsSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \
|
||||||
|
-o /usr/share/keyrings/ros-archive-keyring.gpg
|
||||||
|
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" \
|
||||||
|
| sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get -y install ${{ matrix.ros_deps }}
|
||||||
|
|
||||||
|
# The compiler's x86-64 baseline, for the cache key: it decides Eigen's
|
||||||
|
# alignment, so a GTSAM built under one must not be restored under the
|
||||||
|
# other. v3 packages still declare Architecture: amd64, so dpkg cannot tell.
|
||||||
|
- name: Toolchain baseline
|
||||||
|
if: matrix.gtsam_ref != ''
|
||||||
|
id: toolchain
|
||||||
|
run: |
|
||||||
|
avx=$(echo | gcc -dM -E -x c++ - | grep -c __AVX__ || true)
|
||||||
|
echo "gcc $(gcc -dumpversion), __AVX__=$avx"
|
||||||
|
echo "id=gcc$(gcc -dumpversion)-avx${avx}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Restore GTSAM
|
||||||
|
if: matrix.gtsam_ref != ''
|
||||||
|
id: cache-gtsam
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{github.workspace}}/gtsam-install
|
||||||
|
key: gtsam-${{ matrix.gtsam_ref }}-${{ matrix.os }}-${{ steps.toolchain.outputs.id }}
|
||||||
|
|
||||||
|
- name: Build GTSAM
|
||||||
|
if: matrix.gtsam_ref != '' && steps.cache-gtsam.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
git clone --depth 1 --branch ${{ matrix.gtsam_ref }} https://github.com/borglab/gtsam.git ${{runner.temp}}/gtsam-src
|
||||||
|
# Tag-specific fixes, named after the tag.
|
||||||
|
patch_file="${{github.workspace}}/patches/gtsam_$(echo '${{ matrix.gtsam_ref }}' | tr '.' '_').patch"
|
||||||
|
if [ -f "$patch_file" ]; then
|
||||||
|
echo "Applying $patch_file"
|
||||||
|
git -C ${{runner.temp}}/gtsam-src apply "$patch_file"
|
||||||
|
fi
|
||||||
|
cmake -S ${{runner.temp}}/gtsam-src -B ${{runner.temp}}/gtsam-build \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=${{github.workspace}}/gtsam-install \
|
||||||
|
-DGTSAM_USE_SYSTEM_EIGEN=ON \
|
||||||
|
-DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF \
|
||||||
|
-DGTSAM_BUILD_WITH_WERROR=OFF \
|
||||||
|
-DGTSAM_BUILD_TESTS=OFF \
|
||||||
|
-DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF \
|
||||||
|
-DGTSAM_BUILD_UNSTABLE=OFF \
|
||||||
|
-DGTSAM_BUILD_PYTHON=OFF \
|
||||||
|
-DBUILD_SHARED_LIBS=ON
|
||||||
|
cmake --build ${{runner.temp}}/gtsam-build --target install -j $(nproc)
|
||||||
|
|
||||||
|
- 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: |
|
||||||
|
# Both prefixes when a job has both.
|
||||||
|
prefix_path="${{ matrix.ros_prefix }}"
|
||||||
|
if [ -d "${{github.workspace}}/gtsam-install" ]; then
|
||||||
|
prefix_path="${prefix_path:+$prefix_path;}${{github.workspace}}/gtsam-install"
|
||||||
|
fi
|
||||||
|
cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_PREFIX_PATH="$prefix_path" -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: |
|
||||||
|
source ${{github.workspace}}/.github/scripts/ros-deps-env.sh "${{ matrix.ros_prefix }}"
|
||||||
|
source ${{github.workspace}}/.github/scripts/ros-deps-env.sh "${{github.workspace}}/gtsam-install"
|
||||||
|
./rtabmap-console --version
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
working-directory: ${{github.workspace}}/build
|
||||||
|
# PYTHONNOUSERSITE=1: prevent the embedded Python interpreter from
|
||||||
|
# loading numpy / other site-packages from ~/.local that were compiled
|
||||||
|
# against a different ABI than the build-time Python (causes numpy
|
||||||
|
# 1.x/2.x mismatch crashes in test_pydetector / test_pydescriptor /
|
||||||
|
# test_pymatcher).
|
||||||
|
env:
|
||||||
|
PYTHONNOUSERSITE: 1
|
||||||
|
run: |
|
||||||
|
source ${{github.workspace}}/.github/scripts/ros-deps-env.sh "${{ matrix.ros_prefix }}"
|
||||||
|
source ${{github.workspace}}/.github/scripts/ros-deps-env.sh "${{github.workspace}}/gtsam-install"
|
||||||
|
# Keep a core file per crashing test, for the backtrace step below: an
|
||||||
|
# abort otherwise leaves only its message, and may not reproduce
|
||||||
|
# elsewhere.
|
||||||
|
ulimit -c unlimited
|
||||||
|
sudo sysctl -w kernel.core_pattern="${{github.workspace}}/build/core.%e.%p" > /dev/null
|
||||||
|
ctest -C ${{env.BUILD_TYPE}} -V -LE performance
|
||||||
|
|
||||||
|
- name: Backtrace of crashed tests
|
||||||
|
if: failure()
|
||||||
|
working-directory: ${{github.workspace}}/build
|
||||||
|
run: |
|
||||||
|
shopt -s nullglob
|
||||||
|
cores=(core.*)
|
||||||
|
if [ ${#cores[@]} -eq 0 ]; then
|
||||||
|
echo "No core file: the failure was an assertion or a wrong value, not a crash."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
sudo apt-get -y install gdb
|
||||||
|
source ${{github.workspace}}/.github/scripts/ros-deps-env.sh "${{ matrix.ros_prefix }}"
|
||||||
|
source ${{github.workspace}}/.github/scripts/ros-deps-env.sh "${{github.workspace}}/gtsam-install"
|
||||||
|
for core in "${cores[@]}"; do
|
||||||
|
exe="${core#core.}"
|
||||||
|
exe="bin/${exe%.*}"
|
||||||
|
echo "::group::$core ($exe)"
|
||||||
|
gdb -batch -ex "thread apply all bt" "$exe" "$core" || true
|
||||||
|
echo "::endgroup::"
|
||||||
|
done
|
||||||
160
.github/workflows/cmake-macos.yml
vendored
Normal file
160
.github/workflows/cmake-macos.yml
vendored
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
name: CMake-MacOS
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
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-apple-silicon, macos-tahoe-apple-silicon, macos-tahoe-apple-silicon-cv5]
|
||||||
|
include:
|
||||||
|
# macos-sequoia-intel temporarily disabled. Had some g2o optimizer issues.
|
||||||
|
#- build_name: macos-sequoia-intel
|
||||||
|
# os: macos-15-intel
|
||||||
|
# cv: opencv@4
|
||||||
|
- build_name: macos-sequoia-apple-silicon
|
||||||
|
os: macos-15
|
||||||
|
cv: opencv@4
|
||||||
|
# - build_name: macos-tahoe-intel
|
||||||
|
# os: macos-26-intel
|
||||||
|
# cv: opencv@4
|
||||||
|
- build_name: macos-tahoe-apple-silicon
|
||||||
|
os: macos-26
|
||||||
|
cv: opencv@4
|
||||||
|
# - build_name: macos-tahoe-intel-cv5
|
||||||
|
# os: macos-26-intel
|
||||||
|
# cv: opencv
|
||||||
|
- build_name: macos-tahoe-apple-silicon-cv5
|
||||||
|
os: macos-26
|
||||||
|
cv: opencv
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Restore test data
|
||||||
|
id: cache-testdata
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
# SQLite DBs are binary-portable -> share the cache across
|
||||||
|
# linux / macos / windows. Key omits runner.os on purpose so all
|
||||||
|
# three OSes hit the same entry.
|
||||||
|
path: data/tests/*.db
|
||||||
|
key: testdata-${{ hashFiles('data/tests/manifest.txt') }}
|
||||||
|
|
||||||
|
- name: Fetch test data
|
||||||
|
if: steps.cache-testdata.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: bash scripts/fetch_test_data.sh
|
||||||
|
|
||||||
|
- name: Install Brew Dependencies
|
||||||
|
run: |
|
||||||
|
# Update brew and install from Brewfile if present, or specific packages
|
||||||
|
brew install pcl octomap pdal yaml-cpp librealsense libfreenect libusb zlib libomp suite-sparse ceres-solver ${{ matrix.cv }}
|
||||||
|
|
||||||
|
- name: Install Source Dependencies
|
||||||
|
# Build (and per-dependency cache) the source-only deps not available from
|
||||||
|
# Homebrew, then install them into /usr/local. See the composite action.
|
||||||
|
uses: ./.github/actions/install-macos-source-deps
|
||||||
|
with:
|
||||||
|
os: ${{ matrix.os }}
|
||||||
|
build_type: ${{ env.BUILD_TYPE }}
|
||||||
|
|
||||||
|
- name: Configure CMake
|
||||||
|
run: |
|
||||||
|
# Apple clang has no built-in OpenMP; point find_package(OpenMP) at
|
||||||
|
# Homebrew's keg-only libomp so PCL/g2o/rtabmap enable OpenMP instead of
|
||||||
|
# repeatedly logging "Could NOT find OpenMP".
|
||||||
|
LIBOMP=$(brew --prefix libomp)
|
||||||
|
cmake -B ${{github.workspace}}/build \
|
||||||
|
-DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} \
|
||||||
|
-DBUILD_TESTING=ON \
|
||||||
|
-DBUILD_AS_BUNDLE=ON \
|
||||||
|
-DWITH_ORBBEC_SDK=ON \
|
||||||
|
-DWITH_DEPTHAI=ON \
|
||||||
|
-DWITH_CERES=ON \
|
||||||
|
-DOpenMP_C_FLAGS="-Xclang -fopenmp -I$LIBOMP/include" \
|
||||||
|
-DOpenMP_C_LIB_NAMES=omp \
|
||||||
|
-DOpenMP_CXX_FLAGS="-Xclang -fopenmp -I$LIBOMP/include" \
|
||||||
|
-DOpenMP_CXX_LIB_NAMES=omp \
|
||||||
|
-DOpenMP_omp_LIBRARY="$LIBOMP/lib/libomp.dylib"
|
||||||
|
|
||||||
|
- 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 }}-nonsigned-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
|
||||||
|
# PYTHONNOUSERSITE=1: prevent the embedded Python interpreter from
|
||||||
|
# loading numpy / other site-packages from the user's site that were
|
||||||
|
# compiled against a different ABI than the build-time Python.
|
||||||
|
env:
|
||||||
|
PYTHONNOUSERSITE: 1
|
||||||
|
run: |
|
||||||
|
ctest -C ${{env.BUILD_TYPE}} -V -LE performance
|
||||||
|
|
||||||
|
# A ctest SEGFAULT is reported as just "SEGFAULT" with no backtrace, which
|
||||||
|
# makes a crash inside a long integration test invisible -- the log simply
|
||||||
|
# stops mid-test. macOS's ReportCrash writes a symbolized .ips report for
|
||||||
|
# every crashed process, so surface any that appeared during this job.
|
||||||
|
- name: Dump macOS crash reports on failure
|
||||||
|
if: failure()
|
||||||
|
run: |
|
||||||
|
# ReportCrash can lag the process death by a few seconds.
|
||||||
|
sleep 20
|
||||||
|
found=0
|
||||||
|
for d in "$HOME/Library/Logs/DiagnosticReports" /Library/Logs/DiagnosticReports; do
|
||||||
|
[ -d "$d" ] || continue
|
||||||
|
while IFS= read -r f; do
|
||||||
|
found=1
|
||||||
|
echo "::group::$f"
|
||||||
|
cat "$f"
|
||||||
|
echo "::endgroup::"
|
||||||
|
done < <(find "$d" -type f \( -name '*.ips' -o -name '*.crash' \) -mtime -1 2>/dev/null | sort)
|
||||||
|
done
|
||||||
|
if [ "$found" = 0 ]; then
|
||||||
|
echo "No crash reports found -- the job may have failed without a crash."
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Upload ctest log on failure
|
||||||
|
if: failure()
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: ctest-log-${{ matrix.build_name }}
|
||||||
|
path: build/Testing/Temporary/LastTest.log
|
||||||
|
if-no-files-found: warn
|
||||||
|
retention-days: 7
|
||||||
|
|
||||||
110
.github/workflows/cmake-ros.yml
vendored
110
.github/workflows/cmake-ros.yml
vendored
@@ -7,58 +7,94 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- '**'
|
- '**'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# 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
|
name: ${{ matrix.ros_distribution }}
|
||||||
# well on Windows or Mac. You can convert this to a matrix build if you need
|
runs-on: ubuntu-latest
|
||||||
# cross-platform coverage.
|
concurrency:
|
||||||
# See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
|
group: ${{ github.workflow }}-${{ github.ref }}-${{ matrix.ros_distribution }}
|
||||||
name: Build on ros ${{ matrix.ros_distribution }} and ${{ matrix.os }}
|
cancel-in-progress: true
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
ros_distribution: [ noetic, humble, iron]
|
ros_distribution: [ humble, jazzy, kilted, lyrical, rolling]
|
||||||
include:
|
include:
|
||||||
- ros_distribution: 'noetic'
|
|
||||||
os: ubuntu-20.04
|
|
||||||
- ros_distribution: 'humble'
|
- ros_distribution: 'humble'
|
||||||
os: ubuntu-22.04
|
skip_keys: ""
|
||||||
- ros_distribution: 'iron'
|
- ros_distribution: 'jazzy'
|
||||||
os: ubuntu-22.04
|
skip_keys: ""
|
||||||
# Currently CI has some errors on setup-ros with this OS, disabling for now
|
- ros_distribution: 'kilted'
|
||||||
#- ros_distribution: 'jazzy'
|
skip_keys: ""
|
||||||
# os: ubuntu-24.04
|
- ros_distribution: 'lyrical'
|
||||||
|
skip_keys: "libpointmatcher"
|
||||||
|
- ros_distribution: 'rolling'
|
||||||
|
skip_keys: "libpointmatcher gtsam"
|
||||||
|
use_ros2_testing: true # Rolling is using ros2-testing (nightly)
|
||||||
|
container:
|
||||||
|
image: osrf/ros:${{ matrix.ros_distribution }}-desktop-full
|
||||||
steps:
|
steps:
|
||||||
- uses: ros-tooling/setup-ros@v0.6
|
|
||||||
with:
|
|
||||||
required-ros-distributions: ${{ matrix.ros_distribution }}
|
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Restore test data
|
||||||
|
id: cache-testdata
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: data/tests/*.db
|
||||||
|
key: testdata-${{ hashFiles('data/tests/manifest.txt') }}
|
||||||
|
|
||||||
|
- name: Fetch test data
|
||||||
|
if: steps.cache-testdata.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
source /opt/ros/${{ matrix.ros_distribution }}/setup.bash
|
# The ROS images are slim; fetch_test_data.sh needs curl, and 7-Zip for
|
||||||
rosdep update
|
# the assets that come as an archive. The package holding it is
|
||||||
rosdep install --from-paths ${{github.workspace}} -y
|
# p7zip-full up to Ubuntu 24.04 and 7zip on the newer ones.
|
||||||
|
command -v curl >/dev/null || (apt-get update && apt-get install -y --no-install-recommends curl)
|
||||||
|
command -v 7z >/dev/null || command -v 7zz >/dev/null || (apt-get update && \
|
||||||
|
(apt-get install -y --no-install-recommends p7zip-full || \
|
||||||
|
apt-get install -y --no-install-recommends 7zip))
|
||||||
|
bash scripts/fetch_test_data.sh
|
||||||
|
|
||||||
- name: Configure CMake
|
# `${{ github.workspace }}` is expanded by the runner on the *host*
|
||||||
|
# (/home/runner/work/...), but this job runs in a container where the runner
|
||||||
|
# bind-mounts that directory somewhere else (/__w/...). Baking the host path
|
||||||
|
# into RTABMAP_TEST_DATA_ROOT points every data-driven test at a directory
|
||||||
|
# that does not exist in the container: the integration tests silently skip
|
||||||
|
# and the ones that imread() committed fixtures abort outright.
|
||||||
|
#
|
||||||
|
# Resolve the path inside the container instead. A `run` step's cwd is the
|
||||||
|
# checkout root -- the same assumption the relative `scripts/...` and
|
||||||
|
# `data/tests/*.db` paths in the steps above already rely on -- so derive it
|
||||||
|
# from $PWD rather than trusting a path computed outside the container. The
|
||||||
|
# existence checks then turn that into a verified precondition: a wrong
|
||||||
|
# mount point or a failed fetch fails here, with the path printed, instead
|
||||||
|
# of degrading into skipped tests.
|
||||||
|
- name: Resolve test data root in the container
|
||||||
|
id: testdata
|
||||||
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
source /opt/ros/${{ matrix.ros_distribution }}/setup.bash
|
root="$PWD/data"
|
||||||
cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
|
test -f "$root/samples/17.jpg" || { echo "::error::test data root $root is missing committed fixtures"; exit 1; }
|
||||||
|
ls "$root"/tests/*.db >/dev/null || { echo "::error::no test databases in $root/tests"; exit 1; }
|
||||||
- name: Build
|
echo "root=$root" >> "$GITHUB_OUTPUT"
|
||||||
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
|
|
||||||
|
|
||||||
|
- uses: ros-tooling/setup-ros@v0.7
|
||||||
|
with:
|
||||||
|
required-ros-distributions: ${{ matrix.ros_distribution }}
|
||||||
|
use-ros2-testing: ${{ matrix.use_ros2_testing || false }}
|
||||||
|
- uses: ros-tooling/action-ros-ci@v0.4
|
||||||
|
with:
|
||||||
|
package-name: rtabmap
|
||||||
|
target-ros2-distro: ${{ matrix.ros_distribution }}
|
||||||
|
rosdep-skip-keys: "${{ matrix.skip_keys }}"
|
||||||
|
coverage-result: false
|
||||||
|
extra-cmake-args: -DTEST_DATA_ROOT=${{ steps.testdata.outputs.root }}
|
||||||
|
|||||||
171
.github/workflows/cmake-windows.yml
vendored
Normal file
171
.github/workflows/cmake-windows.yml
vendored
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
name: CMake-Windows
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
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: '-DWITH_TORCH=OFF -DWITH_ZED=OFF'
|
||||||
|
- build_name: windows-2022-cuda
|
||||||
|
os: windows-2022
|
||||||
|
extra_deps: ""
|
||||||
|
extra_cmake_def: '-DWITH_TORCH=ON -DWITH_ZED=ON -DWITH_CUDASIFT=ON'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Restore test data
|
||||||
|
id: cache-testdata
|
||||||
|
if: matrix.build_name != 'windows-2022-cuda'
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
# SQLite DBs are binary-portable -> share the cache across
|
||||||
|
# linux / macos / windows. Key omits runner.os on purpose so all
|
||||||
|
# three OSes hit the same entry.
|
||||||
|
path: data/tests/*.db
|
||||||
|
key: testdata-${{ hashFiles('data/tests/manifest.txt') }}
|
||||||
|
|
||||||
|
- name: Fetch test data
|
||||||
|
if: matrix.build_name != 'windows-2022-cuda' && steps.cache-testdata.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: bash scripts/fetch_test_data.sh
|
||||||
|
|
||||||
|
- 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: |
|
||||||
|
# K4A, K4W2 and ZED are located via these env vars (FindK4A.cmake / FindKinectSDK2.cmake
|
||||||
|
# and the install rules), pointing at the export where the bundle staged their SDK files.
|
||||||
|
$env:K4A_ROOT_DIR = "${{env.VCPKG_EXPORT_PATH}}/installed/x64-windows-release"
|
||||||
|
$env:KINECTSDK20_DIR = "${{env.VCPKG_EXPORT_PATH}}/installed/x64-windows-release"
|
||||||
|
$env:ZED_SDK_ROOT_DIR = "${{env.VCPKG_EXPORT_PATH}}/installed/x64-windows-release"
|
||||||
|
cmake `
|
||||||
|
-B ${{github.workspace}}/build `
|
||||||
|
-DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} `
|
||||||
|
-DBUILD_AS_BUNDLE=ON `
|
||||||
|
-DWITH_PYTHON=ON `
|
||||||
|
-DWITH_CERES=ON `
|
||||||
|
-DWITH_ORBBEC_SDK=ON `
|
||||||
|
-DWITH_FREENECT2=ON `
|
||||||
|
-DWITH_K4W2=ON `
|
||||||
|
-DWITH_K4A=ON `
|
||||||
|
-DWITH_DEPTHAI=ON `
|
||||||
|
-DWITH_REALSENSE2=ON `
|
||||||
|
-DWITH_CCCORELIB=ON `
|
||||||
|
${{ matrix.extra_cmake_def }} `
|
||||||
|
-DBUILD_TESTING=ON `
|
||||||
|
-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}} --target ALL_BUILD
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
# Not run on the CUDA build, which is a build+package job only.
|
||||||
|
#
|
||||||
|
# The runner has no NVIDIA GPU or driver (see the driver-DLL note in
|
||||||
|
# app/src/CMakeLists.txt), so no cv::cuda / CUDASIFT path can actually
|
||||||
|
# execute there -- everything falls back to CPU and the run just repeats
|
||||||
|
# the coverage the non-CUDA job already gives, on the same sources. It
|
||||||
|
# used to cost more than it returned: the two cv::cuda-touching tests
|
||||||
|
# (test_util3d_features, test_localgrid) had to be excluded because lazy
|
||||||
|
# CUDA-init stalled them past the 300 s timeout, and once WITH_ZED=ON was
|
||||||
|
# added to this job every remaining corelib test died in the loader with
|
||||||
|
# 0xc0000135 (STATUS_DLL_NOT_FOUND) before reaching main(): rtabmap_core
|
||||||
|
# links sl_zed64.dll, which imports the driver-only nvcuvid.dll /
|
||||||
|
# nvEncodeAPI64.dll that a driver-less runner does not have.
|
||||||
|
#
|
||||||
|
# So this job compiles, links and packages the CUDA artifact; the
|
||||||
|
# non-CUDA job is what verifies behaviour. Same reason the Info step
|
||||||
|
# below is skipped here.
|
||||||
|
if: matrix.build_name != 'windows-2022-cuda'
|
||||||
|
working-directory: ${{github.workspace}}/build
|
||||||
|
# PYTHONHOME points the embedded interpreter at vcpkg's bundled
|
||||||
|
# Python install (where Lib/, DLLs/ live). Without it Python emits
|
||||||
|
# "Could not find platform independent libraries <prefix>" at init
|
||||||
|
# and runs without a stdlib, breaking every numpy import.
|
||||||
|
# PYTHONNOUSERSITE=1: prevent the embedded Python interpreter from
|
||||||
|
# loading numpy / other site-packages from %APPDATA%\Python that
|
||||||
|
# were compiled against a different ABI than the build-time Python
|
||||||
|
# (numpy 1.x/2.x mismatch crashes in test_pydetector /
|
||||||
|
# test_pydescriptor / test_pymatcher).
|
||||||
|
env:
|
||||||
|
PYTHONHOME: ${{env.VCPKG_EXPORT_PATH}}/installed/x64-windows-release/tools/python3
|
||||||
|
PYTHONNOUSERSITE: 1
|
||||||
|
run: |
|
||||||
|
ctest -C ${{env.BUILD_TYPE}} -V --timeout 300 -LE performance
|
||||||
|
|
||||||
|
- name: Info
|
||||||
|
# Skipped for CUDA: the binary links ZED (sl_zed64.dll -> nvcuvid/nvEncodeAPI64),
|
||||||
|
# which need the NVIDIA driver; the GPU-less runner can't load the exe.
|
||||||
|
if: matrix.build_name != 'windows-2022-cuda'
|
||||||
|
working-directory: ${{github.workspace}}/build/bin
|
||||||
|
run: |
|
||||||
|
./rtabmap-console --version
|
||||||
|
|
||||||
|
- 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: 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 }}
|
||||||
49
.github/workflows/cmake.yml
vendored
49
.github/workflows/cmake.yml
vendored
@@ -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, ubuntu-20.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}}
|
|
||||||
|
|
||||||
198
.github/workflows/coverage.yml
vendored
Normal file
198
.github/workflows/coverage.yml
vendored
Normal file
@@ -0,0 +1,198 @@
|
|||||||
|
name: Coverage
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
env:
|
||||||
|
BUILD_TYPE: Debug
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
coverage:
|
||||||
|
name: Coverage (ubuntu-24.04)
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
env:
|
||||||
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Restore test data
|
||||||
|
id: cache-testdata
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
# Same key as the other workflows so all of them share one entry.
|
||||||
|
path: data/tests/*.db
|
||||||
|
key: testdata-${{ hashFiles('data/tests/manifest.txt') }}
|
||||||
|
|
||||||
|
- name: Fetch test data
|
||||||
|
if: steps.cache-testdata.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: bash scripts/fetch_test_data.sh
|
||||||
|
|
||||||
|
- name: Install Linux dependencies
|
||||||
|
run: |
|
||||||
|
DEBIAN_FRONTEND=noninteractive
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y \
|
||||||
|
lcov \
|
||||||
|
libopencv-dev \
|
||||||
|
libpcl-dev \
|
||||||
|
git \
|
||||||
|
cmake \
|
||||||
|
software-properties-common \
|
||||||
|
libyaml-cpp-dev \
|
||||||
|
libg2o-dev \
|
||||||
|
libceres-dev \
|
||||||
|
curl \
|
||||||
|
gnupg \
|
||||||
|
lsb-release
|
||||||
|
|
||||||
|
# GTSAM and libpointmatcher are not in the Ubuntu archive, and
|
||||||
|
# borglab's gtsam PPAs have no noble packages (gtsam-release-4.2 has
|
||||||
|
# no noble suite; gtsam-develop's noble Packages index is empty). The
|
||||||
|
# ROS 2 repo ships both for noble, which is also what the ROS CI jobs
|
||||||
|
# test against, so take them from there.
|
||||||
|
sudo curl -fsSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \
|
||||||
|
-o /usr/share/keyrings/ros-archive-keyring.gpg
|
||||||
|
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" \
|
||||||
|
| sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y \
|
||||||
|
ros-jazzy-gtsam \
|
||||||
|
ros-jazzy-libpointmatcher
|
||||||
|
|
||||||
|
- name: Configure CMake
|
||||||
|
run: |
|
||||||
|
cmake -B ${{ github.workspace }}/build \
|
||||||
|
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
|
||||||
|
-DENABLE_COVERAGE=ON \
|
||||||
|
-DCMAKE_PREFIX_PATH=/opt/ros/jazzy \
|
||||||
|
-DBUILD_TESTING=ON \
|
||||||
|
-DBUILD_APP=OFF \
|
||||||
|
-DBUILD_TOOLS=OFF \
|
||||||
|
-DBUILD_EXAMPLES=OFF \
|
||||||
|
-DWITH_QT=OFF \
|
||||||
|
-DWITH_PYTHON=OFF \
|
||||||
|
-DWITH_CERES=ON \
|
||||||
|
-DWITH_G2O=ON \
|
||||||
|
-DWITH_GTSAM=ON \
|
||||||
|
-DWITH_MRPT=OFF \
|
||||||
|
-DWITH_CVSBA=OFF \
|
||||||
|
-DWITH_POINTMATCHER=ON \
|
||||||
|
-DWITH_CCCORELIB=OFF \
|
||||||
|
-DWITH_OPEN3D=OFF \
|
||||||
|
-DWITH_LOAM=OFF \
|
||||||
|
-DWITH_FLOAM=OFF \
|
||||||
|
-DWITH_LIOSAM=OFF \
|
||||||
|
-DWITH_FLYCAPTURE2=OFF \
|
||||||
|
-DWITH_ZED=OFF \
|
||||||
|
-DWITH_ZEDOC=OFF \
|
||||||
|
-DWITH_REALSENSE=OFF
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: cmake --build ${{ github.workspace }}/build -j$(nproc)
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
working-directory: ${{ github.workspace }}/build
|
||||||
|
run: |
|
||||||
|
# The ROS packages are not on the default loader path. Both
|
||||||
|
# directories are needed: GTSAM and libpointmatcher land in
|
||||||
|
# /opt/ros/jazzy/lib, but gtsam's own libmetis-gtsam.so goes to the
|
||||||
|
# multiarch subdirectory, and libgtsam.so carries no RUNPATH, so the
|
||||||
|
# loader can only find it through LD_LIBRARY_PATH.
|
||||||
|
ROS_LIB=/opt/ros/jazzy/lib
|
||||||
|
export LD_LIBRARY_PATH="${{ github.workspace }}/build/bin:${ROS_LIB}:${ROS_LIB}/$(gcc -dumpmachine)${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
||||||
|
find ${{ github.workspace }}/build -name '*.gcda' -delete
|
||||||
|
# Unit tests only ("long" is the end-to-end replay suite).
|
||||||
|
#
|
||||||
|
# Two reasons. It costs ~90 min in this instrumented -O0 build, 94% of
|
||||||
|
# the job's test time, for ~3 points of coverage. And running it on
|
||||||
|
# some events but not others makes the numbers incomparable: Codecov
|
||||||
|
# measures a pull request against master, so a unit-only PR report
|
||||||
|
# against a full master report reads as a coverage regression on every
|
||||||
|
# PR. Same scope everywhere keeps the comparison meaningful.
|
||||||
|
#
|
||||||
|
# The replays still run (and gate) in the cmake-linux / macos /
|
||||||
|
# windows jobs; they are just not measured here.
|
||||||
|
ctest -V -LE "long|performance"
|
||||||
|
|
||||||
|
- name: Generate LCOV report
|
||||||
|
run: |
|
||||||
|
GCOV_VER="$(gcc -dumpversion | cut -d. -f1)"
|
||||||
|
if command -v "gcov-${GCOV_VER}" >/dev/null 2>&1; then
|
||||||
|
GCOV_TOOL="gcov-${GCOV_VER}"
|
||||||
|
else
|
||||||
|
GCOV_TOOL="gcov"
|
||||||
|
fi
|
||||||
|
LCOV_IGNORE=(--ignore-errors gcov,source,graph,mismatch,unused)
|
||||||
|
|
||||||
|
# The whole of corelib/utilite, test objects included, not just their src/.
|
||||||
|
# An inline function defined in a header is emitted in whichever
|
||||||
|
# translation unit wins comdat folding, which is often a test one, and
|
||||||
|
# its counters then live in that unit's .gcda: capturing only src/
|
||||||
|
# reports such a function as uncovered however often it is called. The
|
||||||
|
# test sources themselves are dropped below, after the counters are read.
|
||||||
|
lcov --gcov-tool "$GCOV_TOOL" "${LCOV_IGNORE[@]}" \
|
||||||
|
--capture \
|
||||||
|
--directory ${{ github.workspace }}/build/corelib \
|
||||||
|
--directory ${{ github.workspace }}/build/utilite \
|
||||||
|
--output-file lcov.info
|
||||||
|
|
||||||
|
lcov "${LCOV_IGNORE[@]}" --extract lcov.info \
|
||||||
|
'${{ github.workspace }}/*' \
|
||||||
|
--output-file lcov.info
|
||||||
|
# The test sources are the instrument, not the subject: a line in a
|
||||||
|
# test counts as uncovered only when the test skipped it (a defensive
|
||||||
|
# cleanup branch, a platform guard), which says nothing about the
|
||||||
|
# library. They are also near-fully covered by construction, so
|
||||||
|
# leaving them in inflates the overall number. Excluded here, before
|
||||||
|
# the upload, so the HTML artifact, the summary below and Codecov all
|
||||||
|
# report the same figure. Kept in sync with coverage-report.sh.
|
||||||
|
lcov "${LCOV_IGNORE[@]}" --remove lcov.info \
|
||||||
|
'*/sqlite3/*' \
|
||||||
|
'*/rtflann/*' \
|
||||||
|
'*/corelib/test/*' \
|
||||||
|
'*/utilite/test/*' \
|
||||||
|
'*/_deps/*' \
|
||||||
|
--output-file lcov.info
|
||||||
|
|
||||||
|
lcov --summary lcov.info
|
||||||
|
|
||||||
|
- name: HTML coverage report
|
||||||
|
run: genhtml --ignore-errors source,mismatch lcov.info --output-directory coverage-html --legend --demangle-cpp
|
||||||
|
|
||||||
|
- name: Upload HTML coverage artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: coverage-html
|
||||||
|
path: coverage-html
|
||||||
|
retention-days: 14
|
||||||
|
|
||||||
|
- name: Upload to Codecov
|
||||||
|
if: ${{ env.CODECOV_TOKEN != '' }}
|
||||||
|
uses: codecov/codecov-action@v5
|
||||||
|
with:
|
||||||
|
files: lcov.info
|
||||||
|
# Upload ONLY lcov.info. By default the CLI also searches the tree and
|
||||||
|
# runs gcov over every .gcno it finds, uploading those .gcov files
|
||||||
|
# alongside -- which re-introduced corelib/test and utilite/test on
|
||||||
|
# Codecov even though the lcov --remove step had dropped them (the
|
||||||
|
# HTML artifact, built from the same lcov.info, was correctly clean).
|
||||||
|
disable_search: true
|
||||||
|
plugins: noop
|
||||||
|
token: ${{ env.CODECOV_TOKEN }}
|
||||||
|
fail_ci_if_error: false
|
||||||
107
.github/workflows/docker.yml
vendored
107
.github/workflows/docker.yml
vendored
@@ -4,15 +4,35 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- 'master'
|
- 'master'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
# Disabling ###-deps step from CI because it is too flaky (seg faults, arm64 build timeout...)
|
||||||
|
# Only way I was able to build all images is to do it from a ubuntu 20.04 computer with:
|
||||||
|
# $ sudo add-apt-repository ppa:canonical-server/server-backports
|
||||||
|
# $ sudo apt-get update
|
||||||
|
# $ sudo apt-get upgrade qemu-user-static
|
||||||
|
# $ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes -c yes
|
||||||
|
# More info: https://github.com/introlab/rtabmap/issues/1454
|
||||||
|
# Skipped on pull requests; built and pushed only from master (push or
|
||||||
|
# manual dispatch), since it pushes the :*-deps tags to Docker Hub.
|
||||||
|
if: github.ref == 'refs/heads/master'
|
||||||
|
|
||||||
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: |
|
||||||
@@ -20,7 +40,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: |
|
||||||
@@ -29,12 +48,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
|
||||||
@@ -42,6 +55,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:
|
||||||
-
|
-
|
||||||
@@ -49,21 +76,21 @@ jobs:
|
|||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
-
|
-
|
||||||
name: Set up QEMU
|
name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v1
|
uses: docker/setup-qemu-action@v3
|
||||||
with:
|
with:
|
||||||
platforms: all
|
platforms: all
|
||||||
-
|
-
|
||||||
name: Set up Docker Buildx
|
name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v1
|
uses: docker/setup-buildx-action@v3
|
||||||
-
|
-
|
||||||
name: Login to DockerHub
|
name: Login to DockerHub
|
||||||
uses: docker/login-action@v1
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
-
|
-
|
||||||
name: Build and push
|
name: Build and push
|
||||||
uses: docker/build-push-action@v2
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: true
|
push: true
|
||||||
@@ -75,12 +102,15 @@ jobs:
|
|||||||
|
|
||||||
docker:
|
docker:
|
||||||
needs: docker_deps
|
needs: docker_deps
|
||||||
|
# Run even when docker_deps is skipped (it is, on pull requests).
|
||||||
|
# A manual dispatch is honored only on master, the only ref we push from.
|
||||||
|
if: ${{ !cancelled() && !failure() && (github.event_name != 'workflow_dispatch' || github.ref == 'refs/heads/master') }}
|
||||||
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: |
|
||||||
@@ -102,7 +132,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: |
|
||||||
@@ -114,14 +143,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
|
||||||
@@ -132,6 +153,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
|
||||||
@@ -140,7 +180,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
|
||||||
@@ -148,7 +188,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
|
||||||
@@ -156,7 +196,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
|
||||||
@@ -164,7 +204,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:
|
||||||
-
|
-
|
||||||
@@ -172,25 +212,28 @@ jobs:
|
|||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
-
|
-
|
||||||
name: Set up QEMU
|
name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v1
|
uses: docker/setup-qemu-action@v3
|
||||||
with:
|
with:
|
||||||
platforms: all
|
platforms: all
|
||||||
-
|
-
|
||||||
name: Set up Docker Buildx
|
name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v1
|
uses: docker/setup-buildx-action@v3
|
||||||
-
|
-
|
||||||
name: Login to DockerHub
|
name: Login to DockerHub
|
||||||
uses: docker/login-action@v1
|
# 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
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
-
|
-
|
||||||
name: Build and push
|
name: Build and push
|
||||||
uses: docker/build-push-action@v2
|
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 }}
|
||||||
|
|||||||
54
.github/workflows/docs-preview-cleanup.yml
vendored
Normal file
54
.github/workflows/docs-preview-cleanup.yml
vendored
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
name: Documentation preview cleanup
|
||||||
|
|
||||||
|
# Removes the per-PR documentation preview published by docs.yml under
|
||||||
|
# gh-pages:preview/pr-<number>/ once the pull request is closed (merged or not).
|
||||||
|
#
|
||||||
|
# Deliberately has no `paths` filter: docs.yml only publishes a preview when
|
||||||
|
# documentation-related files changed, but this must fire for every close so a
|
||||||
|
# preview can never be orphaned on the branch.
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [closed]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cleanup:
|
||||||
|
name: Remove PR preview
|
||||||
|
# Forks never get a preview (their token is read-only), so nothing to clean.
|
||||||
|
if: github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
|
# Same group as docs.yml's publish job: both push to gh-pages, and two
|
||||||
|
# concurrent pushes would collide.
|
||||||
|
concurrency:
|
||||||
|
group: gh-pages-publish
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout gh-pages
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: gh-pages
|
||||||
|
fetch-depth: 1
|
||||||
|
|
||||||
|
- name: Remove preview directory
|
||||||
|
env:
|
||||||
|
PREVIEW_DIR: preview/pr-${{ github.event.number }}
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
if [[ ! -d "${PREVIEW_DIR}" ]]; then
|
||||||
|
echo "No preview at ${PREVIEW_DIR}, nothing to do."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
git config user.name 'github-actions[bot]'
|
||||||
|
git config user.email 'github-actions[bot]@users.noreply.github.com'
|
||||||
|
git rm -r --quiet "${PREVIEW_DIR}"
|
||||||
|
# Drop the parent too once the last preview is gone.
|
||||||
|
rmdir preview 2>/dev/null || true
|
||||||
|
git commit -m "Remove preview for PR #${{ github.event.number }}"
|
||||||
|
git push
|
||||||
218
.github/workflows/docs.yml
vendored
Normal file
218
.github/workflows/docs.yml
vendored
Normal file
@@ -0,0 +1,218 @@
|
|||||||
|
name: Documentation
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
# Publishing commits to the gh-pages branch, so only run when something that
|
||||||
|
# affects the documentation actually changed. Use the manual "Run workflow"
|
||||||
|
# button if a deploy is needed outside of these paths.
|
||||||
|
paths: &docs_paths
|
||||||
|
- '.github/workflows/docs.yml'
|
||||||
|
- 'CMakeLists.txt'
|
||||||
|
- 'Doxyfile.in'
|
||||||
|
- 'docs-report.sh'
|
||||||
|
- 'website/**'
|
||||||
|
- 'doxygen/**'
|
||||||
|
- 'package.xml'
|
||||||
|
- 'corelib/include/**'
|
||||||
|
- 'utilite/include/**'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
paths: *docs_paths
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build site (ubuntu-24.04)
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
version: ${{ steps.site.outputs.version }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
DEBIAN_FRONTEND=noninteractive
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y \
|
||||||
|
doxygen \
|
||||||
|
graphviz \
|
||||||
|
cmake \
|
||||||
|
libopencv-dev \
|
||||||
|
libpcl-dev \
|
||||||
|
libyaml-cpp-dev \
|
||||||
|
git
|
||||||
|
|
||||||
|
# Configures build-docs (CMake generates the export headers that are part
|
||||||
|
# of Doxygen's INPUT), runs Doxygen into build-docs/api/latest/. Same
|
||||||
|
# script used locally, so a local preview matches what gets published.
|
||||||
|
- name: Generate C++ API documentation (Doxygen)
|
||||||
|
run: ./docs-report.sh
|
||||||
|
|
||||||
|
# The theme emits absolute asset links built from site.baseurl, which
|
||||||
|
# GitHub's own Jekyll infers from the repository (/rtabmap). A PR preview
|
||||||
|
# is served from a deeper path, so those links would 404 there. Pin
|
||||||
|
# baseurl to the path this particular build gets published to.
|
||||||
|
- name: Set Jekyll baseurl
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
if [ "${{ github.event_name }}" = "pull_request" ]; then
|
||||||
|
baseurl="/${{ github.event.repository.name }}/preview/pr-${{ github.event.number }}"
|
||||||
|
else
|
||||||
|
baseurl="/${{ github.event.repository.name }}"
|
||||||
|
fi
|
||||||
|
echo "baseurl: ${baseurl}" >> website/_config.yml
|
||||||
|
|
||||||
|
# Landing page: built here rather than by GitHub's own Jekyll, so that
|
||||||
|
# .nojekyll can be set below and the Doxygen output is served untouched.
|
||||||
|
- name: Build landing page (Jekyll)
|
||||||
|
uses: actions/jekyll-build-pages@v1
|
||||||
|
with:
|
||||||
|
source: ./website
|
||||||
|
destination: ./_site
|
||||||
|
|
||||||
|
- name: Assemble site
|
||||||
|
id: site
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
# jekyll-build-pages is a container action running as root, so _site
|
||||||
|
# comes back owned by root and the steps below (running as the runner
|
||||||
|
# user) cannot write into it.
|
||||||
|
sudo chown -R "$(id -u):$(id -g)" _site
|
||||||
|
|
||||||
|
# Serve everything verbatim: the site is already built, and Jekyll
|
||||||
|
# would otherwise skip Doxygen files/folders starting with '_'.
|
||||||
|
touch _site/.nojekyll
|
||||||
|
|
||||||
|
mkdir -p _site/api
|
||||||
|
cp -r build-docs/api/latest _site/api/latest
|
||||||
|
|
||||||
|
# On a release tag (plain X.Y.Z, not the ROS-distro variants such as
|
||||||
|
# 0.23.7-jazzy), also publish under the version number. Older versions
|
||||||
|
# already on the branch are preserved by keep_files when publishing.
|
||||||
|
version=""
|
||||||
|
if [[ "${GITHUB_REF_TYPE}" == "tag" && "${GITHUB_REF_NAME}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||||
|
version="${GITHUB_REF_NAME}"
|
||||||
|
cp -r build-docs/api/latest "_site/api/${version}"
|
||||||
|
fi
|
||||||
|
echo "version=${version}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
# The dropdown list is maintained by hand in the repository (one entry
|
||||||
|
# per release) and shared by every published version -- see the header
|
||||||
|
# comment in doxygen/versions.js.
|
||||||
|
cp doxygen/versions.js _site/api/versions.js
|
||||||
|
|
||||||
|
# /api/ has no content of its own: send it to the current docs so a
|
||||||
|
# bare .../api/ link lands somewhere useful instead of a 404. The
|
||||||
|
# target is relative, so it works at the site root and under a
|
||||||
|
# preview prefix alike.
|
||||||
|
printf '%s\n' \
|
||||||
|
'<!doctype html>' \
|
||||||
|
'<meta charset="utf-8">' \
|
||||||
|
'<title>RTAB-Map API documentation</title>' \
|
||||||
|
'<meta http-equiv="refresh" content="0; url=latest/">' \
|
||||||
|
'<link rel="canonical" href="latest/">' \
|
||||||
|
'<p>Redirecting to the <a href="latest/">latest API documentation</a>.</p>' \
|
||||||
|
> _site/api/index.html
|
||||||
|
|
||||||
|
test -f _site/index.html
|
||||||
|
test -f _site/api/index.html
|
||||||
|
test -f _site/api/latest/index.html
|
||||||
|
|
||||||
|
- name: Upload site artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: documentation-site
|
||||||
|
path: _site
|
||||||
|
# include-hidden-files keeps .nojekyll, which the publish job needs.
|
||||||
|
include-hidden-files: true
|
||||||
|
retention-days: 14
|
||||||
|
|
||||||
|
publish:
|
||||||
|
name: Publish to gh-pages
|
||||||
|
needs: build
|
||||||
|
# Forks are skipped for pull requests: their GITHUB_TOKEN is read-only, and
|
||||||
|
# granting write access to a workflow that builds untrusted code would be a
|
||||||
|
# security hole.
|
||||||
|
if: >-
|
||||||
|
github.event_name != 'pull_request' ||
|
||||||
|
github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
|
# Serialize every push to gh-pages, including the preview cleanup workflow,
|
||||||
|
# and never cancel one in flight: two concurrent pushes would collide.
|
||||||
|
concurrency:
|
||||||
|
group: gh-pages-publish
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Download site
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: documentation-site
|
||||||
|
path: _site
|
||||||
|
|
||||||
|
# Pull requests go to preview/pr-<number>/, everything else to the site
|
||||||
|
# root. keep_files preserves what this run does not carry: the published
|
||||||
|
# version folders (api/0.23.x/) and the other PRs' previews.
|
||||||
|
- name: Publish
|
||||||
|
uses: peaceiris/actions-gh-pages@v4
|
||||||
|
with:
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
publish_branch: gh-pages
|
||||||
|
publish_dir: ./_site
|
||||||
|
destination_dir: ${{ github.event_name == 'pull_request' && format('preview/pr-{0}', github.event.number) || '' }}
|
||||||
|
keep_files: true
|
||||||
|
# Do not let the action drop a .nojekyll at the *branch root*: that
|
||||||
|
# disables Jekyll for everything on the branch, including content
|
||||||
|
# published outside this deployment. The site we publish carries its
|
||||||
|
# own .nojekyll inside destination_dir, which is the only place it
|
||||||
|
# should apply.
|
||||||
|
enable_jekyll: true
|
||||||
|
user_name: 'github-actions[bot]'
|
||||||
|
user_email: 'github-actions[bot]@users.noreply.github.com'
|
||||||
|
commit_message: >-
|
||||||
|
${{ github.event_name == 'pull_request'
|
||||||
|
&& format('Preview for PR #{0}', github.event.number)
|
||||||
|
|| format('Update documentation ({0})', needs.build.outputs.version || 'latest') }}
|
||||||
|
|
||||||
|
- name: Link the site
|
||||||
|
run: |
|
||||||
|
base="https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}"
|
||||||
|
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
|
||||||
|
url="${base}/preview/pr-${{ github.event.number }}"
|
||||||
|
note="Removed automatically when this pull request is closed."
|
||||||
|
else
|
||||||
|
url="${base}"
|
||||||
|
note=""
|
||||||
|
fi
|
||||||
|
{
|
||||||
|
echo "### Documentation"
|
||||||
|
echo ""
|
||||||
|
echo "- Landing page: ${url}/"
|
||||||
|
echo "- C++ API: ${url}/api/latest/"
|
||||||
|
# An `if` rather than `[[ ... ]] && { ... }`: as the last command in
|
||||||
|
# the group, a false test would make the group (and so the whole
|
||||||
|
# step) exit 1. `note` is empty on push, which failed every master
|
||||||
|
# run while pull requests passed.
|
||||||
|
if [[ -n "${note}" ]]; then
|
||||||
|
echo ""
|
||||||
|
echo "${note}"
|
||||||
|
fi
|
||||||
|
} >> "$GITHUB_STEP_SUMMARY"
|
||||||
115
.github/workflows/ios.yml
vendored
Normal file
115
.github/workflows/ios.yml
vendored
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
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
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
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 }}
|
||||||
20
.gitignore
vendored
20
.gitignore
vendored
@@ -12,3 +12,23 @@ compile_flags.txt
|
|||||||
tags
|
tags
|
||||||
build_*
|
build_*
|
||||||
*.bak
|
*.bak
|
||||||
|
build-*
|
||||||
|
|
||||||
|
# Coverage (coverage-report.sh / .github/workflows/coverage.yml)
|
||||||
|
coverage-html/
|
||||||
|
lcov.info
|
||||||
|
*.gcda
|
||||||
|
*.gcno
|
||||||
|
|
||||||
|
# Doxygen (docs-report.sh / .github/workflows/docs.yml)
|
||||||
|
doc/
|
||||||
|
# Byte-code of doxygen/generate_parameters_page.py
|
||||||
|
__pycache__/
|
||||||
|
# Generated from Doxyfile.in by CMake.
|
||||||
|
Doxyfile
|
||||||
|
|
||||||
|
# Windows bundle: vcpkg tree, build output, and deps built from source (bundle_windows_deps.bat)
|
||||||
|
vcpkg/
|
||||||
|
vcpkg_installed/
|
||||||
|
vcpkg_binaries/
|
||||||
|
vcpkg_deps_from_source/
|
||||||
|
|||||||
502
CMakeLists.txt
502
CMakeLists.txt
@@ -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 8)
|
SET(RTABMAP_PATCH_VERSION 11)
|
||||||
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})
|
||||||
@@ -53,15 +63,11 @@ ELSE()
|
|||||||
option(FLANN_KDTREE_MEM_OPT "Disable multi-threaded FLANN kd-tree to minimize memory allocations" ON)
|
option(FLANN_KDTREE_MEM_OPT "Disable multi-threaded FLANN kd-tree to minimize memory allocations" ON)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(FLANN_KDTREE_MEM_OPT)
|
|
||||||
ADD_DEFINITIONS("-DFLANN_KDTREE_MEM_OPT")
|
|
||||||
ENDIF(FLANN_KDTREE_MEM_OPT)
|
|
||||||
|
|
||||||
IF(WIN32 AND NOT MINGW)
|
IF(WIN32 AND NOT MINGW)
|
||||||
ADD_DEFINITIONS("-DNOMINMAX")
|
ADD_DEFINITIONS("-DNOMINMAX")
|
||||||
ADD_DEFINITIONS("-wd4100 -wd4127 -wd4150 -wd4191 -wd4242 -wd4244 -wd4251 -wd4305 -wd4365 -wd4512 -wd4514 -wd4548 -wd4571 -wd4619 -wd4625 -wd4626 -wd4628 -wd4668 -wd4710 -wd4711 -wd4738 -wd4820 -wd4946 -wd4986")
|
ADD_DEFINITIONS("-wd4100 -wd4127 -wd4150 -wd4191 -wd4242 -wd4244 -wd4251 -wd4305 -wd4365 -wd4512 -wd4514 -wd4548 -wd4571 -wd4619 -wd4625 -wd4626 -wd4628 -wd4668 -wd4710 -wd4711 -wd4738 -wd4820 -wd4946 -wd4986")
|
||||||
ELSE ()
|
ELSE ()
|
||||||
ADD_DEFINITIONS( "-Wall" )
|
ADD_DEFINITIONS( "-Wall -Wtype-limits" )
|
||||||
ADD_DEFINITIONS("-Wno-unknown-pragmas")
|
ADD_DEFINITIONS("-Wno-unknown-pragmas")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
@@ -75,6 +81,11 @@ endif()
|
|||||||
if(POLICY CMP0072)
|
if(POLICY CMP0072)
|
||||||
cmake_policy(SET CMP0072 NEW)
|
cmake_policy(SET CMP0072 NEW)
|
||||||
endif()
|
endif()
|
||||||
|
# Timestamp the files extracted from a FetchContent URL download at extraction
|
||||||
|
# time, so a changed URL actually triggers a rebuild of what depends on them.
|
||||||
|
if(POLICY CMP0135)
|
||||||
|
cmake_policy(SET CMP0135 NEW)
|
||||||
|
endif()
|
||||||
|
|
||||||
IF(MINGW)
|
IF(MINGW)
|
||||||
# Hide the --enable-auto-import warning
|
# Hide the --enable-auto-import warning
|
||||||
@@ -83,14 +94,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
|
||||||
@@ -165,6 +168,68 @@ ENDIF(APPLE OR WIN32)
|
|||||||
OPTION(BUILD_APP "Build main application" ON)
|
OPTION(BUILD_APP "Build main application" ON)
|
||||||
OPTION(BUILD_TOOLS "Build tools" ON)
|
OPTION(BUILD_TOOLS "Build tools" ON)
|
||||||
OPTION(BUILD_EXAMPLES "Build examples" ON)
|
OPTION(BUILD_EXAMPLES "Build examples" ON)
|
||||||
|
# Off by default: it downloads the Doxygen theme at configure time, which an
|
||||||
|
# ordinary build has no reason to need. Set by docs-report.sh.
|
||||||
|
OPTION(BUILD_DOCUMENTATION "Prepare the API documentation build (downloads the Doxygen theme)" OFF)
|
||||||
|
|
||||||
|
# The unit tests are host executables run by ctest, which can't be done from a
|
||||||
|
# cross-compiled Android/iOS build.
|
||||||
|
if(ANDROID OR IOS OR CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
||||||
|
set(BUILD_TESTING OFF CACHE BOOL "Build the testing tree." FORCE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Performance tests are benchmarks: they report times, memory and recall
|
||||||
|
# instead of asserting on them, as those depend on the machine. They are built
|
||||||
|
# by default so they cannot rot, but are labelled "performance" so that a run
|
||||||
|
# opts in with `ctest -L performance` and CI opts out with `ctest -LE
|
||||||
|
# performance`. They can also be run directly, e.g. bin/test_flann_index_perf.
|
||||||
|
OPTION(BUILD_PERF_TESTS "Build the performance tests (see ctest -L performance)" ON)
|
||||||
|
|
||||||
|
include(CTest)
|
||||||
|
if(BUILD_TESTING)
|
||||||
|
# Add GTest using FetchContent
|
||||||
|
include(FetchContent)
|
||||||
|
FetchContent_Declare(
|
||||||
|
googletest
|
||||||
|
URL https://github.com/google/googletest/archive/refs/tags/v1.16.0.zip
|
||||||
|
)
|
||||||
|
FetchContent_GetProperties(googletest)
|
||||||
|
if(NOT googletest_POPULATED)
|
||||||
|
FetchContent_Populate(googletest)
|
||||||
|
add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR})
|
||||||
|
endif()
|
||||||
|
include(GoogleTest)
|
||||||
|
set(TEST_DATA_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/data"
|
||||||
|
CACHE PATH "Root directory holding the test fixtures (data/tests/*.db)")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
OPTION(ENABLE_COVERAGE "Build with gcov/lcov coverage (GCC/Clang, Debug only; see coverage-report.sh)" OFF)
|
||||||
|
IF(ENABLE_COVERAGE)
|
||||||
|
IF(NOT CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||||
|
MESSAGE(FATAL_ERROR "ENABLE_COVERAGE requires GCC or Clang with gcov/lcov (current: ${CMAKE_CXX_COMPILER_ID}).")
|
||||||
|
ENDIF()
|
||||||
|
IF(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
|
MESSAGE(FATAL_ERROR "ENABLE_COVERAGE requires CMAKE_BUILD_TYPE=Debug (current: \"${CMAKE_BUILD_TYPE}\").")
|
||||||
|
ENDIF()
|
||||||
|
MESSAGE(STATUS "Coverage instrumentation enabled")
|
||||||
|
ADD_COMPILE_OPTIONS(--coverage -O0 -g)
|
||||||
|
ADD_LINK_OPTIONS(--coverage)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
# Check UDEBUG/UINFO/UWARN/UERROR/uFormat format strings against their
|
||||||
|
# arguments.
|
||||||
|
# -Wno-format-zero-length: UDEBUG("") is used deliberately as a trace point
|
||||||
|
# -Wformat-security: non-literal format strings, e.g. UERROR(uFormat(...).c_str())
|
||||||
|
OPTION(ENABLE_FORMAT_ERRORS "Treat log/uFormat format-string mismatches as errors (GCC/Clang)" OFF)
|
||||||
|
IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||||
|
ADD_COMPILE_OPTIONS(-Wformat -Wformat-security -Wno-format-zero-length)
|
||||||
|
IF(ENABLE_FORMAT_ERRORS)
|
||||||
|
MESSAGE(STATUS "Format-string mismatches are errors")
|
||||||
|
ADD_COMPILE_OPTIONS(-Werror=format -Werror=format-security)
|
||||||
|
ENDIF()
|
||||||
|
ELSEIF(ENABLE_FORMAT_ERRORS)
|
||||||
|
MESSAGE(WARNING "ENABLE_FORMAT_ERRORS has no effect on ${CMAKE_CXX_COMPILER_ID} (needs GCC/Clang)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
####### DEPENDENCIES #######
|
####### DEPENDENCIES #######
|
||||||
IF(MOBILE_BUILD)
|
IF(MOBILE_BUILD)
|
||||||
@@ -198,17 +263,19 @@ 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 v2 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" ON)
|
option(WITH_GRIDMAP "Include GridMap support" OFF)
|
||||||
option(WITH_CPUTSDF "Include CPUTSDF support" OFF)
|
option(WITH_CPUTSDF "Include CPUTSDF support" OFF)
|
||||||
option(WITH_OPENCHISEL "Include open_chisel support" OFF)
|
option(WITH_OPENCHISEL "Include open_chisel support" OFF)
|
||||||
option(WITH_ALICE_VISION "Include AliceVision support" OFF)
|
option(WITH_ALICE_VISION "Include AliceVision support" OFF)
|
||||||
@@ -218,12 +285,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()
|
||||||
@@ -234,7 +304,25 @@ option(BUILD_WITH_RPATH_NOT_RUNPATH "Explicitly disable usage of RUNPATH for the
|
|||||||
set(RTABMAP_QT_VERSION AUTO CACHE STRING "Force a specific Qt version.")
|
set(RTABMAP_QT_VERSION AUTO CACHE STRING "Force a specific Qt version.")
|
||||||
set_property(CACHE RTABMAP_QT_VERSION PROPERTY STRINGS AUTO 4 5 6)
|
set_property(CACHE RTABMAP_QT_VERSION PROPERTY STRINGS AUTO 4 5 6)
|
||||||
|
|
||||||
FIND_PACKAGE(OpenCV REQUIRED QUIET COMPONENTS core calib3d imgproc highgui stitching photo video videoio OPTIONAL_COMPONENTS aruco objdetect xfeatures2d nonfree gpu cudafeatures2d cudaoptflow cudaimgproc)
|
# OpenCV components. calib3d was split into "calib" + "geometry" in OpenCV 5.
|
||||||
|
# These lists are reused below to generate RTABMapConfig.cmake so downstream
|
||||||
|
# find_package(RTABMap) requests the same components this build used.
|
||||||
|
SET(RTABMAP_OpenCV_COMPONENTS_5 core imgproc highgui stitching photo video videoio calib geometry)
|
||||||
|
SET(RTABMAP_OpenCV_COMPONENTS_4 core imgproc highgui stitching photo video videoio calib3d)
|
||||||
|
SET(RTABMAP_OpenCV_OPTIONAL_COMPONENTS_5 objdetect xfeatures2d nonfree gpu cudafeatures2d cudaoptflow cudaimgproc)
|
||||||
|
SET(RTABMAP_OpenCV_OPTIONAL_COMPONENTS_4 aruco objdetect xfeatures2d nonfree gpu cudafeatures2d cudaoptflow cudaimgproc)
|
||||||
|
|
||||||
|
# Probe OpenCV without a version constraint first, then request the components
|
||||||
|
# matching the detected major version. A version-constrained find that fails to
|
||||||
|
# match (e.g. asking for 5 when only 4 is present) resets OpenCV_DIR to NOTFOUND,
|
||||||
|
# which breaks toolchain builds that rely on a -DOpenCV_DIR hint (e.g. Android,
|
||||||
|
# where CMAKE_FIND_ROOT_PATH restricts the search).
|
||||||
|
FIND_PACKAGE(OpenCV REQUIRED QUIET COMPONENTS core)
|
||||||
|
IF(OpenCV_VERSION_MAJOR GREATER 4)
|
||||||
|
FIND_PACKAGE(OpenCV REQUIRED QUIET COMPONENTS ${RTABMAP_OpenCV_COMPONENTS_5} OPTIONAL_COMPONENTS ${RTABMAP_OpenCV_OPTIONAL_COMPONENTS_5})
|
||||||
|
ELSE()
|
||||||
|
FIND_PACKAGE(OpenCV REQUIRED QUIET COMPONENTS ${RTABMAP_OpenCV_COMPONENTS_4} OPTIONAL_COMPONENTS ${RTABMAP_OpenCV_OPTIONAL_COMPONENTS_4})
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(WITH_QT)
|
IF(WITH_QT)
|
||||||
FIND_PACKAGE(PCL 1.7 REQUIRED QUIET COMPONENTS common io kdtree search surface filters registration sample_consensus segmentation visualization)
|
FIND_PACKAGE(PCL 1.7 REQUIRED QUIET COMPONENTS common io kdtree search surface filters registration sample_consensus segmentation visualization)
|
||||||
@@ -396,7 +484,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 +506,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 +584,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 +619,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 +647,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 +673,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 +688,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 +700,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 +708,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 +739,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 +792,28 @@ IF(WITH_MYNTEYE)
|
|||||||
ENDIF(WITH_MYNTEYE)
|
ENDIF(WITH_MYNTEYE)
|
||||||
|
|
||||||
IF(WITH_DEPTHAI)
|
IF(WITH_DEPTHAI)
|
||||||
FIND_PACKAGE(depthai 2.24 QUIET)
|
# Force DepthAI major version 2 (>=2.24, <3.0): the v3 API is not yet
|
||||||
|
# supported (see CameraDepthAI).
|
||||||
|
FIND_PACKAGE(depthai 2.24...<3.0)
|
||||||
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 +825,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 +861,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 +895,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,27 +903,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)
|
||||||
IF(ov_msckf_FOUND)
|
|
||||||
MESSAGE(STATUS "Found ov_msckf: ${ov_msckf_INCLUDE_DIRS}")
|
|
||||||
ENDIF(ov_msckf_FOUND)
|
|
||||||
ENDIF(WITH_OPENVINS)
|
ENDIF(WITH_OPENVINS)
|
||||||
|
|
||||||
IF(WITH_FASTCV)
|
IF(WITH_FASTCV)
|
||||||
@@ -809,27 +935,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)
|
||||||
@@ -917,10 +1113,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 "//")
|
||||||
@@ -952,6 +1152,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)
|
||||||
@@ -970,6 +1176,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()
|
||||||
@@ -1046,6 +1255,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)
|
||||||
@@ -1080,11 +1292,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()
|
||||||
@@ -1111,6 +1326,15 @@ ENDIF()
|
|||||||
|
|
||||||
CONFIGURE_FILE(Version.h.in ${CMAKE_CURRENT_BINARY_DIR}/corelib/src/include/${PROJECT_PREFIX}/core/Version.h)
|
CONFIGURE_FILE(Version.h.in ${CMAKE_CURRENT_BINARY_DIR}/corelib/src/include/${PROJECT_PREFIX}/core/Version.h)
|
||||||
|
|
||||||
|
# API documentation (Doxygen). Off by default: preparing it downloads the theme,
|
||||||
|
# spawns Doxygen to regenerate the HTML header and runs the parameter-page
|
||||||
|
# generator, none of which an ordinary build needs. docs-report.sh turns it on;
|
||||||
|
# see also .github/workflows/docs.yml.
|
||||||
|
IF(BUILD_DOCUMENTATION)
|
||||||
|
INCLUDE(RTABMapDocumentation)
|
||||||
|
RTABMAP_SETUP_DOCUMENTATION()
|
||||||
|
ENDIF(BUILD_DOCUMENTATION)
|
||||||
|
|
||||||
ADD_SUBDIRECTORY( utilite )
|
ADD_SUBDIRECTORY( utilite )
|
||||||
ADD_SUBDIRECTORY( corelib )
|
ADD_SUBDIRECTORY( corelib )
|
||||||
|
|
||||||
@@ -1186,6 +1410,18 @@ install(EXPORT rtabmapTargets
|
|||||||
####
|
####
|
||||||
# Setup RTABMapConfig.cmake
|
# Setup RTABMapConfig.cmake
|
||||||
####
|
####
|
||||||
|
IF(OpenCV_VERSION_MAJOR GREATER 4)
|
||||||
|
SET(CONF_OPENCV_COMPONENTS ${RTABMAP_OpenCV_COMPONENTS_5})
|
||||||
|
SET(CONF_OPENCV_OPTIONAL_COMPONENTS ${RTABMAP_OpenCV_OPTIONAL_COMPONENTS_5})
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_OPENCV_COMPONENTS ${RTABMAP_OpenCV_COMPONENTS_4})
|
||||||
|
SET(CONF_OPENCV_OPTIONAL_COMPONENTS ${RTABMAP_OpenCV_OPTIONAL_COMPONENTS_4})
|
||||||
|
ENDIF()
|
||||||
|
STRING(REPLACE ";" " " CONF_OPENCV_COMPONENTS "${CONF_OPENCV_COMPONENTS}")
|
||||||
|
STRING(REPLACE ";" " " CONF_OPENCV_OPTIONAL_COMPONENTS "${CONF_OPENCV_OPTIONAL_COMPONENTS}")
|
||||||
|
# Pin the OpenCV major version so downstream projects find the same major RTAB-Map was
|
||||||
|
# built against
|
||||||
|
SET(CONF_OPENCV_VERSION_MAJOR ${OpenCV_VERSION_MAJOR})
|
||||||
include(CMakePackageConfigHelpers)
|
include(CMakePackageConfigHelpers)
|
||||||
write_basic_package_version_file(
|
write_basic_package_version_file(
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
|
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
|
||||||
@@ -1228,7 +1464,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}")
|
||||||
@@ -1321,6 +1567,10 @@ MESSAGE(STATUS " CMAKE_INSTALL_LIBDIR = ${CMAKE_INSTALL_LIBDIR}")
|
|||||||
MESSAGE(STATUS " BUILD_APP = ${BUILD_APP}")
|
MESSAGE(STATUS " BUILD_APP = ${BUILD_APP}")
|
||||||
MESSAGE(STATUS " BUILD_TOOLS = ${BUILD_TOOLS}")
|
MESSAGE(STATUS " BUILD_TOOLS = ${BUILD_TOOLS}")
|
||||||
MESSAGE(STATUS " BUILD_EXAMPLES = ${BUILD_EXAMPLES}")
|
MESSAGE(STATUS " BUILD_EXAMPLES = ${BUILD_EXAMPLES}")
|
||||||
|
MESSAGE(STATUS " BUILD_TESTING = ${BUILD_TESTING}")
|
||||||
|
MESSAGE(STATUS " BUILD_PERF_TESTS = ${BUILD_PERF_TESTS}")
|
||||||
|
MESSAGE(STATUS " ENABLE_COVERAGE = ${ENABLE_COVERAGE}")
|
||||||
|
MESSAGE(STATUS " ENABLE_FORMAT_ERRORS = ${ENABLE_FORMAT_ERRORS}")
|
||||||
IF(NOT WIN32)
|
IF(NOT WIN32)
|
||||||
# see comment above for the BUILD_SHARED_LIBS option on Windows
|
# see comment above for the BUILD_SHARED_LIBS option on Windows
|
||||||
MESSAGE(STATUS " BUILD_SHARED_LIBS = ${BUILD_SHARED_LIBS}")
|
MESSAGE(STATUS " BUILD_SHARED_LIBS = ${BUILD_SHARED_LIBS}")
|
||||||
@@ -1342,28 +1592,34 @@ 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_VERSION_MAJOR LESS 4 AND OPENCV_ARUCO_FOUND) OR
|
||||||
|
(OpenCV_VERSION_MAJOR GREATER 4 AND OPENCV_OBJDETECT_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()
|
||||||
@@ -1398,15 +1654,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()
|
||||||
@@ -1427,6 +1694,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)
|
||||||
@@ -1536,7 +1811,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()
|
||||||
@@ -1555,7 +1834,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)")
|
||||||
@@ -1651,7 +1930,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)")
|
||||||
@@ -1707,7 +1986,7 @@ MESSAGE(STATUS " With DepthAI ${depthai_VERSION} = YES (License: MIT)")
|
|||||||
ELSEIF(NOT WITH_DEPTHAI)
|
ELSEIF(NOT WITH_DEPTHAI)
|
||||||
MESSAGE(STATUS " With DepthAI = NO (WITH_DEPTHAI=OFF)")
|
MESSAGE(STATUS " With DepthAI = NO (WITH_DEPTHAI=OFF)")
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS " With DepthAI = NO (depthai-core not found)")
|
MESSAGE(STATUS " With DepthAI = NO (depthai-core v2 not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(xvsdk_FOUND)
|
IF(xvsdk_FOUND)
|
||||||
@@ -1718,6 +1997,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)
|
||||||
@@ -1735,6 +2022,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)")
|
||||||
@@ -1779,12 +2073,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)")
|
||||||
@@ -1802,6 +2096,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 "--------------------------------------------")
|
||||||
|
|
||||||
|
|||||||
2824
Doxyfile.in
Normal file
2824
Doxyfile.in
Normal file
File diff suppressed because it is too large
Load Diff
2
LICENSE
2
LICENSE
@@ -1,5 +1,5 @@
|
|||||||
RTAB-Map - https://github.com/introlab/rtabmap
|
RTAB-Map - https://github.com/introlab/rtabmap
|
||||||
Copyright (c) 2010-2021, Mathieu Labbe - IntRoLab - Universite de Sherbrooke, all rights reserved.
|
Copyright (c) 2010-2025, Mathieu Labbe - IntRoLab - Universite de Sherbrooke, all rights reserved.
|
||||||
Copyright (c) XXX, contributors, all rights reserved.
|
Copyright (c) XXX, contributors, all rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
|||||||
33
README.md
33
README.md
@@ -5,9 +5,10 @@ rtabmap
|
|||||||
|
|
||||||
[![Release][release-image]][releases]
|
[![Release][release-image]][releases]
|
||||||
[![Downloads][downloads-image]][downloads]
|
[![Downloads][downloads-image]][downloads]
|
||||||
|
[](https://codecov.io/gh/introlab/rtabmap)
|
||||||
[![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
|
||||||
@@ -20,6 +21,7 @@ RTAB-Map library and standalone application.
|
|||||||
|
|
||||||
* For more information (e.g., papers, major updates), visit [RTAB-Map's home page](http://introlab.github.io/rtabmap).
|
* For more information (e.g., papers, major updates), visit [RTAB-Map's home page](http://introlab.github.io/rtabmap).
|
||||||
* For installation instructions and examples, visit [RTAB-Map's wiki](https://github.com/introlab/rtabmap/wiki).
|
* For installation instructions and examples, visit [RTAB-Map's wiki](https://github.com/introlab/rtabmap/wiki).
|
||||||
|
* For the C++ API of the library, see the [API documentation](https://introlab.github.io/rtabmap/api/latest/), which also lists all [parameters](https://introlab.github.io/rtabmap/api/latest/parameters.html) and [command-line tools](https://introlab.github.io/rtabmap/api/latest/tools.html).
|
||||||
|
|
||||||
To use RTAB-Map under ROS, visit the [rtabmap](http://wiki.ros.org/rtabmap) page on the ROS wiki.
|
To use RTAB-Map under ROS, visit the [rtabmap](http://wiki.ros.org/rtabmap) page on the ROS wiki.
|
||||||
|
|
||||||
@@ -35,13 +37,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,13 +60,21 @@ 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="5">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>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Iron</td>
|
<td>Jazzy</td>
|
||||||
<td><a href="http://build.ros2.org/job/Ibin_uJ64__rtabmap__ubuntu_jammy_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Ibin_uJ64__rtabmap__ubuntu_jammy_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>
|
||||||
|
<td>Kilted</td>
|
||||||
|
<td><a href="http://build.ros2.org/job/Lbin_uR64__rtabmap__ubuntu_resolute_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Lbin_uR64__rtabmap__ubuntu_resolute_amd64__binary" alt="Build Status"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Lyrical</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>
|
<tr>
|
||||||
<td>Rolling</td>
|
<td>Rolling</td>
|
||||||
@@ -76,7 +85,7 @@ This project is supported by [IntRoLab - Intelligent / Interactive / Integrated
|
|||||||
<td>
|
<td>
|
||||||
<a href="https://hub.docker.com/r/introlab3it/rtabmap">rtabmap</a>
|
<a href="https://hub.docker.com/r/introlab3it/rtabmap">rtabmap</a>
|
||||||
</td>
|
</td>
|
||||||
<td><img src="https://img.shields.io/docker/pulls/introlab3it/rtabmap.svg?label=pulls" alt="Docker Pulls"/></td>
|
<td><img src="https://img.shields.io/docker/pulls/introlab3it/rtabmap" alt="Docker Pulls"/></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
include(CMakeFindDependencyMacro)
|
include(CMakeFindDependencyMacro)
|
||||||
|
|
||||||
# Mandatory dependencies
|
# Mandatory dependencies
|
||||||
find_dependency(OpenCV COMPONENTS core calib3d imgproc highgui stitching photo video OPTIONAL_COMPONENTS aruco objdetect xfeatures2d nonfree gpu cudafeatures2d)
|
find_dependency(OpenCV @CONF_OPENCV_VERSION_MAJOR@ COMPONENTS @CONF_OPENCV_COMPONENTS@ OPTIONAL_COMPONENTS @CONF_OPENCV_OPTIONAL_COMPONENTS@)
|
||||||
|
|
||||||
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/RTABMap_guiTargets.cmake")
|
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/RTABMap_guiTargets.cmake")
|
||||||
find_dependency(PCL 1.7 COMPONENTS common io kdtree search surface filters registration sample_consensus segmentation visualization)
|
find_dependency(PCL 1.7 COMPONENTS common io kdtree search surface filters registration sample_consensus segmentation visualization)
|
||||||
|
|||||||
10
Version.h.in
10
Version.h.in
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,10 @@ SET(INCLUDE_DIRS
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/tango-gl/include
|
${CMAKE_CURRENT_SOURCE_DIR}/tango-gl/include
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/third-party/include
|
${CMAKE_CURRENT_SOURCE_DIR}/third-party/include
|
||||||
${PROJECT_BINARY_DIR}/corelib/include
|
${PROJECT_BINARY_DIR}/corelib/include
|
||||||
${PROJECT_SOURCE_DIR}/corelib/include
|
${PROJECT_SOURCE_DIR}/corelib/include
|
||||||
${PROJECT_SOURCE_DIR}/utilite/include
|
${PROJECT_SOURCE_DIR}/utilite/include
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
${OpenCV_INCLUDE_DIRS}
|
${OpenCV_INCLUDE_DIRS}
|
||||||
${PCL_INCLUDE_DIRS}
|
${PCL_INCLUDE_DIRS}
|
||||||
"${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}/usr/include"
|
"${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}/usr/include"
|
||||||
@@ -24,14 +25,19 @@ set(sources
|
|||||||
point_cloud_drawable.cpp
|
point_cloud_drawable.cpp
|
||||||
graph_drawable.cpp
|
graph_drawable.cpp
|
||||||
background_renderer.cc
|
background_renderer.cc
|
||||||
|
text_drawable.cpp
|
||||||
|
quad_color.cpp
|
||||||
|
tango-gl/bounding_box.cpp
|
||||||
tango-gl/axis.cpp
|
tango-gl/axis.cpp
|
||||||
tango-gl/camera.cpp
|
tango-gl/camera.cpp
|
||||||
|
tango-gl/circle.cpp
|
||||||
tango-gl/conversions.cpp
|
tango-gl/conversions.cpp
|
||||||
tango-gl/drawable_object.cpp
|
tango-gl/drawable_object.cpp
|
||||||
tango-gl/frustum.cpp
|
tango-gl/frustum.cpp
|
||||||
tango-gl/gesture_camera.cpp
|
tango-gl/gesture_camera.cpp
|
||||||
tango-gl/grid.cpp
|
tango-gl/grid.cpp
|
||||||
tango-gl/line.cpp
|
tango-gl/line.cpp
|
||||||
|
tango-gl/mesh.cpp
|
||||||
tango-gl/shaders.cpp
|
tango-gl/shaders.cpp
|
||||||
tango-gl/trace.cpp
|
tango-gl/trace.cpp
|
||||||
tango-gl/transform.cpp
|
tango-gl/transform.cpp
|
||||||
@@ -114,7 +120,35 @@ add_definitions(${PCL_DEFINITIONS})
|
|||||||
|
|
||||||
INCLUDE_DIRECTORIES(${INCLUDE_DIRS})
|
INCLUDE_DIRECTORIES(${INCLUDE_DIRS})
|
||||||
|
|
||||||
add_library(NativeRTABMap SHARED ${sources})
|
####################################
|
||||||
|
# Generate resources files
|
||||||
|
####################################
|
||||||
|
SET(RESOURCES
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/resources/text_atlas.png
|
||||||
|
)
|
||||||
|
|
||||||
|
foreach(arg ${RESOURCES})
|
||||||
|
get_filename_component(filename ${arg} NAME)
|
||||||
|
string(REPLACE "." "_" output ${filename})
|
||||||
|
set(RESOURCES_HEADERS "${RESOURCES_HEADERS}" "${CMAKE_CURRENT_BINARY_DIR}/${output}.h")
|
||||||
|
endforeach(arg ${RESOURCES})
|
||||||
|
|
||||||
|
find_host_program(RTABMAP_RES_TOOL rtabmap-res_tool PATHS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
|
||||||
|
IF(NOT RTABMAP_RES_TOOL)
|
||||||
|
MESSAGE( FATAL_ERROR "RTABMAP_RES_TOOL is not defined (it is the path to \"rtabmap-res_tool\" application created by a non-Android build)." )
|
||||||
|
ENDIF(NOT RTABMAP_RES_TOOL)
|
||||||
|
|
||||||
|
ADD_CUSTOM_COMMAND(
|
||||||
|
OUTPUT ${RESOURCES_HEADERS}
|
||||||
|
COMMAND ${RTABMAP_RES_TOOL} -n rtabmap -p ${CMAKE_CURRENT_BINARY_DIR} ${RESOURCES}
|
||||||
|
COMMENT "[Creating resources]"
|
||||||
|
DEPENDS ${RESOURCES}
|
||||||
|
)
|
||||||
|
####################################
|
||||||
|
# Generate resources files END
|
||||||
|
####################################
|
||||||
|
|
||||||
|
add_library(NativeRTABMap SHARED ${sources} ${RESOURCES_HEADERS})
|
||||||
target_link_libraries(NativeRTABMap ${LIBRARIES}
|
target_link_libraries(NativeRTABMap ${LIBRARIES}
|
||||||
android
|
android
|
||||||
log
|
log
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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),
|
||||||
@@ -108,8 +104,9 @@ void CameraMobile::close()
|
|||||||
dataReady_.release();
|
dataReady_.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMobile::resetOrigin()
|
void CameraMobile::resetOrigin(const rtabmap::Transform & offset)
|
||||||
{
|
{
|
||||||
|
manualOriginOffset_ = offset;
|
||||||
originUpdate_ = true;
|
originUpdate_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,7 +190,7 @@ void CameraMobile::poseReceived(const Transform & pose, double deviceStamp)
|
|||||||
previousAnchorPose_.setNull();
|
previousAnchorPose_.setNull();
|
||||||
previousAnchorLinearVelocity_.clear();
|
previousAnchorLinearVelocity_.clear();
|
||||||
previousAnchorStamp_ = 0.0;
|
previousAnchorStamp_ = 0.0;
|
||||||
originOffset_ = pose.translation().inverse();
|
originOffset_ = manualOriginOffset_.isNull() ? pose.translation().inverse() : manualOriginOffset_;
|
||||||
originUpdate_ = false;
|
originUpdate_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -393,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
|
||||||
@@ -99,7 +96,7 @@ public:
|
|||||||
void update(const SensorData & data, const Transform & pose, const glm::mat4 & viewMatrix, const glm::mat4 & projectionMatrix, const float * texCoord);
|
void update(const SensorData & data, const Transform & pose, const glm::mat4 & viewMatrix, const glm::mat4 & projectionMatrix, const float * texCoord);
|
||||||
void updateOnRender();
|
void updateOnRender();
|
||||||
|
|
||||||
void resetOrigin();
|
void resetOrigin(const rtabmap::Transform & offset = rtabmap::Transform());
|
||||||
virtual bool isCalibrated() const;
|
virtual bool isCalibrated() const;
|
||||||
|
|
||||||
virtual bool odomProvided() const { return true; }
|
virtual bool odomProvided() const { return true; }
|
||||||
@@ -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,12 +140,12 @@ 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_;
|
||||||
Transform originOffset_;
|
Transform originOffset_;
|
||||||
bool originUpdate_;
|
bool originUpdate_;
|
||||||
|
rtabmap::Transform manualOriginOffset_;
|
||||||
float upstreamRelocalizationAccThr_;
|
float upstreamRelocalizationAccThr_;
|
||||||
rtabmap::Transform previousAnchorPose_;
|
rtabmap::Transform previousAnchorPose_;
|
||||||
std::vector<float> previousAnchorLinearVelocity_;
|
std::vector<float> previousAnchorLinearVelocity_;
|
||||||
|
|||||||
@@ -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),
|
||||||
@@ -866,7 +865,7 @@ SensorData CameraTango::updateDataOnRender(Transform & pose)
|
|||||||
}
|
}
|
||||||
|
|
||||||
SensorData data;
|
SensorData data;
|
||||||
if(tangoDataReady_.acquireTry(1))
|
if(tangoDataReady_.acquireTry(1) == 0)
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(tangoDataMutex_);
|
boost::mutex::scoped_lock lock(tangoDataMutex_);
|
||||||
data = tangoData_;
|
data = tangoData_;
|
||||||
|
|||||||
@@ -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 = "");
|
||||||
|
|||||||
65
app/android/jni/Measure.h
Normal file
65
app/android/jni/Measure.h
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MEASURE_H_
|
||||||
|
#define MEASURE_H_
|
||||||
|
|
||||||
|
#include <opencv2/opencv.hpp>
|
||||||
|
|
||||||
|
class Measure
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Measure(
|
||||||
|
const cv::Point3f & pt1,
|
||||||
|
const cv::Point3f & pt2,
|
||||||
|
const cv::Vec3f & n1,
|
||||||
|
const cv::Vec3f & n2) :
|
||||||
|
pt1_(pt1),
|
||||||
|
pt2_(pt2),
|
||||||
|
n1_(n1),
|
||||||
|
n2_(n2)
|
||||||
|
{
|
||||||
|
length_ = cv::norm(pt2_ - pt1_);
|
||||||
|
}
|
||||||
|
virtual ~Measure() {}
|
||||||
|
|
||||||
|
float length() const {return length_;}
|
||||||
|
const cv::Point3f & pt1() const {return pt1_;}
|
||||||
|
const cv::Point3f & pt2() const {return pt2_;}
|
||||||
|
const cv::Vec3f & n1() const {return n1_;}
|
||||||
|
const cv::Vec3f & n2() const {return n2_;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
cv::Point3f pt1_;
|
||||||
|
cv::Point3f pt2_;
|
||||||
|
cv::Vec3f n1_;
|
||||||
|
cv::Vec3f n2_;
|
||||||
|
float length_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* MEASURE_H_ */
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -48,6 +48,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <pcl/pcl_base.h>
|
#include <pcl/pcl_base.h>
|
||||||
#include <pcl/TextureMesh.h>
|
#include <pcl/TextureMesh.h>
|
||||||
|
|
||||||
|
#include "Measure.h"
|
||||||
|
|
||||||
// RTABMapApp handles the application lifecycle and resources.
|
// RTABMapApp handles the application lifecycle and resources.
|
||||||
class RTABMapApp : public UEventsHandler {
|
class RTABMapApp : public UEventsHandler {
|
||||||
@@ -84,7 +85,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
#ifdef __ANDROID__
|
#ifdef __ANDROID__
|
||||||
bool startCamera(JNIEnv* env, jobject iBinder, jobject context, jobject activity, int driver);
|
bool startCamera(JNIEnv* env, jobject iBinder, jobject context, jobject activity, int driver);
|
||||||
#else // __APPLE__
|
#else // __APPLE__
|
||||||
bool startCamera();
|
bool startCamera();
|
||||||
#endif
|
#endif
|
||||||
// Allocate OpenGL resources for rendering, mainly for initializing the Scene.
|
// Allocate OpenGL resources for rendering, mainly for initializing the Scene.
|
||||||
void InitializeGLContent();
|
void InitializeGLContent();
|
||||||
@@ -127,6 +128,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
void setLighting(bool enabled);
|
void setLighting(bool enabled);
|
||||||
void setBackfaceCulling(bool enabled);
|
void setBackfaceCulling(bool enabled);
|
||||||
void setWireframe(bool enabled);
|
void setWireframe(bool enabled);
|
||||||
|
void setTextureColorSeamsHidden(bool hidden);
|
||||||
void setLocalizationMode(bool enabled);
|
void setLocalizationMode(bool enabled);
|
||||||
void setTrajectoryMode(bool enabled);
|
void setTrajectoryMode(bool enabled);
|
||||||
void setGraphOptimization(bool enabled);
|
void setGraphOptimization(bool enabled);
|
||||||
@@ -137,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);
|
||||||
@@ -176,10 +179,19 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
int optimizedMinClusterSize,
|
int optimizedMinClusterSize,
|
||||||
float optimizedMaxTextureDistance,
|
float optimizedMaxTextureDistance,
|
||||||
int optimizedMinTextureClusterSize,
|
int optimizedMinTextureClusterSize,
|
||||||
|
int textureVertexColorPolicy,
|
||||||
bool blockRendering);
|
bool blockRendering);
|
||||||
bool postExportation(bool visualize);
|
bool postExportation(bool visualize);
|
||||||
bool writeExportedMesh(const std::string & directory, const std::string & name);
|
bool writeExportedMesh(const std::string & directory, const std::string & name);
|
||||||
int postProcessing(int approach);
|
int postProcessing(int approach);
|
||||||
|
void clearMeasures();
|
||||||
|
void showMeasures(bool x, bool y, bool z, bool custom);
|
||||||
|
void setMeasuringMode(int mode);
|
||||||
|
void addMeasureButtonClicked();
|
||||||
|
void teleportButtonClicked();
|
||||||
|
void removeMeasure();
|
||||||
|
void setMetricSystem(bool enabled);
|
||||||
|
void setMeasuringTextSize(float size);
|
||||||
|
|
||||||
void postOdometryEvent(
|
void postOdometryEvent(
|
||||||
rtabmap::Transform pose,
|
rtabmap::Transform pose,
|
||||||
@@ -203,6 +215,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
private:
|
private:
|
||||||
int updateMeshDecimation(int width, int height);
|
int updateMeshDecimation(int width, int height);
|
||||||
rtabmap::ParametersMap getRtabmapParameters();
|
rtabmap::ParametersMap getRtabmapParameters();
|
||||||
|
void updateMeasuringState();
|
||||||
bool smoothMesh(int id, rtabmap::Mesh & mesh);
|
bool smoothMesh(int id, rtabmap::Mesh & mesh);
|
||||||
void gainCompensation(bool full = false);
|
void gainCompensation(bool full = false);
|
||||||
std::vector<pcl::Vertices> filterOrganizedPolygons(const std::vector<pcl::Vertices> & polygons, int cloudSize) const;
|
std::vector<pcl::Vertices> filterOrganizedPolygons(const std::vector<pcl::Vertices> & polygons, int cloudSize) const;
|
||||||
@@ -223,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_;
|
||||||
@@ -238,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_;
|
||||||
|
|
||||||
@@ -264,11 +278,26 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
|
|
||||||
bool visualizingMesh_;
|
bool visualizingMesh_;
|
||||||
bool exportedMeshUpdated_;
|
bool exportedMeshUpdated_;
|
||||||
pcl::TextureMesh::Ptr optMesh_;
|
pcl::TextureMesh::Ptr optTextureMesh_;
|
||||||
cv::Mat optTexture_;
|
cv::Mat optTexture_;
|
||||||
|
rtabmap::Mesh optMesh_;
|
||||||
int optRefId_;
|
int optRefId_;
|
||||||
rtabmap::Transform * optRefPose_; // App crashes when loading native library if not dynamic
|
rtabmap::Transform * optRefPose_; // App crashes when loading native library if not dynamic
|
||||||
|
std::list<Measure> measures_; // In opengl frame
|
||||||
|
bool measuresUpdated_;
|
||||||
|
bool metricSystem_;
|
||||||
|
float measuringTextSize_;
|
||||||
|
float snapAxisThr_;
|
||||||
|
std::vector<cv::Vec3f> snapAxes_;
|
||||||
|
int measuringMode_;
|
||||||
|
bool addMeasureClicked_;
|
||||||
|
bool teleportClicked_;
|
||||||
|
bool removeMeasureClicked_;
|
||||||
|
std::vector<cv::Point3f> measuringTmpPts_; // In opengl frame
|
||||||
|
std::vector<cv::Point3f> measuringTmpNormals_; // In opengl frame
|
||||||
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr targetPoint_;
|
||||||
|
pcl::PointCloud<pcl::PointXYZ>::Ptr quadSample_;
|
||||||
|
std::vector<pcl::Vertices> quadSamplePolygons_;
|
||||||
// main_scene_ includes all drawable object for visualizing Tango device's
|
// main_scene_ includes all drawable object for visualizing Tango device's
|
||||||
// movement and point cloud.
|
// movement and point cloud.
|
||||||
Scene main_scene_;
|
Scene main_scene_;
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
@@ -821,6 +834,7 @@ Java_com_introlab_rtabmap_RTABMapLib_exportMesh(
|
|||||||
optimizedMinClusterSize,
|
optimizedMinClusterSize,
|
||||||
optimizedMaxTextureDistance,
|
optimizedMaxTextureDistance,
|
||||||
optimizedMinTextureClusterSize,
|
optimizedMinTextureClusterSize,
|
||||||
|
0,
|
||||||
blockRendering);
|
blockRendering);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -170,10 +170,12 @@ const std::string kTextureMeshVertexShader =
|
|||||||
"precision highp float;\n"
|
"precision highp float;\n"
|
||||||
"precision mediump int;\n"
|
"precision mediump int;\n"
|
||||||
"attribute vec3 aVertex;\n"
|
"attribute vec3 aVertex;\n"
|
||||||
|
"attribute vec3 aColor;\n"
|
||||||
"attribute vec2 aTexCoord;\n"
|
"attribute vec2 aTexCoord;\n"
|
||||||
|
|
||||||
"uniform mat4 uMVP;\n"
|
"uniform mat4 uMVP;\n"
|
||||||
|
|
||||||
|
"varying vec3 vColor;\n"
|
||||||
"varying vec2 vTexCoord;\n"
|
"varying vec2 vTexCoord;\n"
|
||||||
"varying float vLightWeighting;\n"
|
"varying float vLightWeighting;\n"
|
||||||
|
|
||||||
@@ -187,12 +189,14 @@ const std::string kTextureMeshVertexShader =
|
|||||||
" vTexCoord = aTexCoord;\n"
|
" vTexCoord = aTexCoord;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
|
|
||||||
|
" vColor = aColor;\n"
|
||||||
" vLightWeighting = 1.0;\n"
|
" vLightWeighting = 1.0;\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
const std::string kTextureMeshLightingVertexShader =
|
const std::string kTextureMeshLightingVertexShader =
|
||||||
"precision highp float;\n"
|
"precision highp float;\n"
|
||||||
"precision mediump int;\n"
|
"precision mediump int;\n"
|
||||||
"attribute vec3 aVertex;\n"
|
"attribute vec3 aVertex;\n"
|
||||||
|
"attribute vec3 aColor;\n"
|
||||||
"attribute vec3 aNormal;\n"
|
"attribute vec3 aNormal;\n"
|
||||||
"attribute vec2 aTexCoord;\n"
|
"attribute vec2 aTexCoord;\n"
|
||||||
|
|
||||||
@@ -200,6 +204,7 @@ const std::string kTextureMeshLightingVertexShader =
|
|||||||
"uniform mat3 uN;\n"
|
"uniform mat3 uN;\n"
|
||||||
"uniform vec3 uLightingDirection;\n"
|
"uniform vec3 uLightingDirection;\n"
|
||||||
|
|
||||||
|
"varying vec3 vColor;\n"
|
||||||
"varying vec2 vTexCoord;\n"
|
"varying vec2 vTexCoord;\n"
|
||||||
"varying float vLightWeighting;\n"
|
"varying float vLightWeighting;\n"
|
||||||
|
|
||||||
@@ -213,6 +218,7 @@ const std::string kTextureMeshLightingVertexShader =
|
|||||||
" vTexCoord = aTexCoord;\n"
|
" vTexCoord = aTexCoord;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
|
|
||||||
|
" vColor = aColor;\n"
|
||||||
" vec3 transformedNormal = uN * aNormal;\n"
|
" vec3 transformedNormal = uN * aNormal;\n"
|
||||||
" vLightWeighting = max(dot(transformedNormal, uLightingDirection)*0.5+0.5, 0.0);\n"
|
" vLightWeighting = max(dot(transformedNormal, uLightingDirection)*0.5+0.5, 0.0);\n"
|
||||||
" if(vLightWeighting<0.5) \n"
|
" if(vLightWeighting<0.5) \n"
|
||||||
@@ -225,11 +231,22 @@ const std::string kTextureMeshFragmentShader =
|
|||||||
"uniform float uGainR;\n"
|
"uniform float uGainR;\n"
|
||||||
"uniform float uGainG;\n"
|
"uniform float uGainG;\n"
|
||||||
"uniform float uGainB;\n"
|
"uniform float uGainB;\n"
|
||||||
|
"uniform int uHideSeams;\n"
|
||||||
|
"varying vec3 vColor;\n"
|
||||||
"varying vec2 vTexCoord;\n"
|
"varying vec2 vTexCoord;\n"
|
||||||
"varying float vLightWeighting;\n"
|
"varying float vLightWeighting;\n"
|
||||||
""
|
""
|
||||||
"void main() {\n"
|
"void main() {\n"
|
||||||
" vec4 textureColor = texture2D(uTexture, vTexCoord);\n"
|
" vec4 textureColor;\n"
|
||||||
|
" if(uHideSeams==1) {\n"
|
||||||
|
" if(vTexCoord.x>0.99 && vTexCoord.y>0.99) {\n"
|
||||||
|
" textureColor = vec4(vColor.z, vColor.y, vColor.x, 1.0);\n"
|
||||||
|
" } else {\n"
|
||||||
|
" textureColor = texture2D(uTexture, vTexCoord);\n"
|
||||||
|
" }\n"
|
||||||
|
" } else {\n"
|
||||||
|
" textureColor = texture2D(uTexture, vTexCoord) * vec4(vColor.z, vColor.y, vColor.x, 1.0);\n"
|
||||||
|
" }\n"
|
||||||
" gl_FragColor = vec4(textureColor.r * uGainR * vLightWeighting, textureColor.g * uGainG * vLightWeighting, textureColor.b * uGainB * vLightWeighting, textureColor.a);\n"
|
" gl_FragColor = vec4(textureColor.r * uGainR * vLightWeighting, textureColor.g * uGainG * vLightWeighting, textureColor.b * uGainB * vLightWeighting, textureColor.a);\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
const std::string kTextureMeshBlendingFragmentShader =
|
const std::string kTextureMeshBlendingFragmentShader =
|
||||||
@@ -243,11 +260,12 @@ const std::string kTextureMeshBlendingFragmentShader =
|
|||||||
"uniform vec2 uScreenScale;\n"
|
"uniform vec2 uScreenScale;\n"
|
||||||
"uniform float uNearZ;\n"
|
"uniform float uNearZ;\n"
|
||||||
"uniform float uFarZ;\n"
|
"uniform float uFarZ;\n"
|
||||||
|
"varying vec3 vColor;\n"
|
||||||
"varying vec2 vTexCoord;\n"
|
"varying vec2 vTexCoord;\n"
|
||||||
"varying float vLightWeighting;\n"
|
"varying float vLightWeighting;\n"
|
||||||
""
|
""
|
||||||
"void main() {\n"
|
"void main() {\n"
|
||||||
" vec4 textureColor = texture2D(uTexture, vTexCoord);\n"
|
" vec4 textureColor = texture2D(uTexture, vTexCoord);\n"
|
||||||
" float alpha = 1.0;\n"
|
" float alpha = 1.0;\n"
|
||||||
" vec2 coord = uScreenScale * gl_FragCoord.xy;\n;"
|
" vec2 coord = uScreenScale * gl_FragCoord.xy;\n;"
|
||||||
" vec4 depthPacked = texture2D(uDepthTexture, coord);\n"
|
" vec4 depthPacked = texture2D(uDepthTexture, coord);\n"
|
||||||
@@ -1008,7 +1026,8 @@ void PointCloudDrawable::Render(
|
|||||||
float nearClipPlane,
|
float nearClipPlane,
|
||||||
float farClipPlane,
|
float farClipPlane,
|
||||||
bool packDepthToColorChannel,
|
bool packDepthToColorChannel,
|
||||||
bool wireFrame) const
|
bool wireFrame,
|
||||||
|
bool hideSeams) const
|
||||||
{
|
{
|
||||||
if(vertex_buffer_ && nPoints_ && visible_ && !shaderPrograms_.empty())
|
if(vertex_buffer_ && nPoints_ && visible_ && !shaderPrograms_.empty())
|
||||||
{
|
{
|
||||||
@@ -1127,12 +1146,16 @@ void PointCloudDrawable::Render(
|
|||||||
|
|
||||||
attribute_texture = glGetAttribLocation(program, "aTexCoord");
|
attribute_texture = glGetAttribLocation(program, "aTexCoord");
|
||||||
glEnableVertexAttribArray(attribute_texture);
|
glEnableVertexAttribArray(attribute_texture);
|
||||||
|
|
||||||
|
if(depthTexture == 0)
|
||||||
|
{
|
||||||
|
GLuint hideSeams_handle = glGetUniformLocation(program, "uHideSeams");
|
||||||
|
glUniform1i(hideSeams_handle, hideSeams?1:0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
attribute_color = glGetAttribLocation(program, "aColor");
|
||||||
attribute_color = glGetAttribLocation(program, "aColor");
|
glEnableVertexAttribArray(attribute_color);
|
||||||
glEnableVertexAttribArray(attribute_color);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
tango_gl::util::CheckGlError("Pointcloud::Render() common");
|
tango_gl::util::CheckGlError("Pointcloud::Render() common");
|
||||||
|
|
||||||
@@ -1144,7 +1167,7 @@ void PointCloudDrawable::Render(
|
|||||||
{
|
{
|
||||||
glVertexAttribPointer(attribute_texture, 2, GL_FLOAT, GL_FALSE, (hasNormals_?9:6)*sizeof(GLfloat), (GLvoid*) (4 * sizeof(GLfloat)));
|
glVertexAttribPointer(attribute_texture, 2, GL_FLOAT, GL_FALSE, (hasNormals_?9:6)*sizeof(GLfloat), (GLvoid*) (4 * sizeof(GLfloat)));
|
||||||
}
|
}
|
||||||
else if(!packDepthToColorChannel)
|
if(!packDepthToColorChannel)
|
||||||
{
|
{
|
||||||
glVertexAttribPointer(attribute_color, 3, GL_UNSIGNED_BYTE, GL_TRUE, (hasNormals_?9:6)*sizeof(GLfloat), (GLvoid*) (3 * sizeof(GLfloat)));
|
glVertexAttribPointer(attribute_color, 3, GL_UNSIGNED_BYTE, GL_TRUE, (hasNormals_?9:6)*sizeof(GLfloat), (GLvoid*) (3 * sizeof(GLfloat)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,7 +98,8 @@ private:
|
|||||||
float nearClipPlane = 0, // nonnull if depthTexture>0
|
float nearClipPlane = 0, // nonnull if depthTexture>0
|
||||||
float farClipPlane = 0, // nonnull if depthTexture>0
|
float farClipPlane = 0, // nonnull if depthTexture>0
|
||||||
bool packDepthToColorChannel = false,
|
bool packDepthToColorChannel = false,
|
||||||
bool wireFrame = false) const;
|
bool wireFrame = false,
|
||||||
|
bool hideSeams = false) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template<class PointT>
|
template<class PointT>
|
||||||
|
|||||||
69
app/android/jni/quad_color.cpp
Normal file
69
app/android/jni/quad_color.cpp
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014 Google Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "quad_color.h"
|
||||||
|
#include "tango-gl/util.h"
|
||||||
|
|
||||||
|
static const float vertices[] = {-1.0f, -1.0f, 1.0f, -1.0f,
|
||||||
|
-1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
|
|
||||||
|
QuadColor::QuadColor(float size) {
|
||||||
|
SetShader();
|
||||||
|
|
||||||
|
vertices_.resize(8);
|
||||||
|
for(int i=0; i<8; ++i)
|
||||||
|
{
|
||||||
|
vertices_[i] = vertices[i]*size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QuadColor::QuadColor(
|
||||||
|
float widthLeft,
|
||||||
|
float widthRight,
|
||||||
|
float heightBottom,
|
||||||
|
float heightTop) {
|
||||||
|
SetShader();
|
||||||
|
|
||||||
|
vertices_.resize(8);
|
||||||
|
vertices_[0] = vertices[0]*widthLeft;
|
||||||
|
vertices_[1] = vertices[1]*heightBottom;
|
||||||
|
vertices_[2] = vertices[2]*widthRight;
|
||||||
|
vertices_[3] = vertices[3]*heightBottom;
|
||||||
|
vertices_[4] = vertices[4]*widthLeft;
|
||||||
|
vertices_[5] = vertices[5]*heightTop;
|
||||||
|
vertices_[6] = vertices[6]*widthRight;
|
||||||
|
vertices_[7] = vertices[7]*heightTop;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QuadColor::Render(const glm::mat4& projection_mat,
|
||||||
|
const glm::mat4& view_mat) const {
|
||||||
|
glUseProgram(shader_program_);
|
||||||
|
|
||||||
|
// Calculate MVP matrix and pass it to shader.
|
||||||
|
glm::mat4 model_mat = GetTransformationMatrix();
|
||||||
|
glm::mat4 mvp_mat = projection_mat * view_mat * model_mat;
|
||||||
|
glUniformMatrix4fv(uniform_mvp_mat_, 1, GL_FALSE, glm::value_ptr(mvp_mat));
|
||||||
|
|
||||||
|
glUniform4f(uniform_color_, red_, green_, blue_, alpha_);
|
||||||
|
|
||||||
|
// Vertice binding
|
||||||
|
glEnableVertexAttribArray(attrib_vertices_);
|
||||||
|
glVertexAttribPointer(attrib_vertices_, 2, GL_FLOAT, GL_FALSE, 0, &vertices_[0]);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||||
|
glUseProgram(0);
|
||||||
|
}
|
||||||
35
app/android/jni/quad_color.h
Normal file
35
app/android/jni/quad_color.h
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014 Google Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TANGO_GL_QUADCOLOR_H_
|
||||||
|
#define TANGO_GL_QUADCOLOR_H_
|
||||||
|
|
||||||
|
#include "tango-gl/drawable_object.h"
|
||||||
|
|
||||||
|
class QuadColor : public tango_gl::DrawableObject {
|
||||||
|
public:
|
||||||
|
QuadColor(float size);
|
||||||
|
QuadColor(float widthLeft,
|
||||||
|
float widthRight,
|
||||||
|
float heightBottom,
|
||||||
|
float heightTop);
|
||||||
|
QuadColor(const QuadColor& other) = delete;
|
||||||
|
QuadColor& operator=(const QuadColor&) = delete;
|
||||||
|
virtual ~QuadColor() {}
|
||||||
|
|
||||||
|
void Render(const glm::mat4& projection_mat, const glm::mat4& view_mat) const;
|
||||||
|
};
|
||||||
|
#endif // TANGO_GL_QUADCOLOR_H_
|
||||||
BIN
app/android/jni/resources/text_atlas.png
Normal file
BIN
app/android/jni/resources/text_atlas.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
@@ -36,7 +36,7 @@
|
|||||||
// add an offset in z to our origin. We'll set this offset to 1.3 meters based
|
// add an offset in z to our origin. We'll set this offset to 1.3 meters based
|
||||||
// on the average height of a human standing with a Tango device. This allows us
|
// on the average height of a human standing with a Tango device. This allows us
|
||||||
// to place a grid roughly on the ground for most users.
|
// to place a grid roughly on the ground for most users.
|
||||||
const glm::vec3 kHeightOffset = glm::vec3(0.0f, -1.3f, 0.0f);
|
const glm::vec3 Scene::kHeightOffset = glm::vec3(0.0f, -1.3f, 0.0f);
|
||||||
|
|
||||||
// Color of the motion tracking trajectory.
|
// Color of the motion tracking trajectory.
|
||||||
const tango_gl::Color kTraceColor(0.66f, 0.66f, 0.66f);
|
const tango_gl::Color kTraceColor(0.66f, 0.66f, 0.66f);
|
||||||
@@ -93,6 +93,7 @@ Scene::Scene() :
|
|||||||
lighting_(false),
|
lighting_(false),
|
||||||
backfaceCulling_(true),
|
backfaceCulling_(true),
|
||||||
wireFrame_(false),
|
wireFrame_(false),
|
||||||
|
textureColorSeamsHidden_(true),
|
||||||
r_(0.0f),
|
r_(0.0f),
|
||||||
g_(0.0f),
|
g_(0.0f),
|
||||||
b_(0.0f),
|
b_(0.0f),
|
||||||
@@ -124,6 +125,7 @@ void Scene::InitGLContent()
|
|||||||
|
|
||||||
UASSERT(axis_ == 0);
|
UASSERT(axis_ == 0);
|
||||||
|
|
||||||
|
TextDrawable::createShaderProgram();
|
||||||
|
|
||||||
axis_ = new tango_gl::Axis();
|
axis_ = new tango_gl::Axis();
|
||||||
frustum_ = new tango_gl::Frustum();
|
frustum_ = new tango_gl::Frustum();
|
||||||
@@ -166,6 +168,7 @@ void Scene::DeleteResources() {
|
|||||||
background_renderer_ = 0;
|
background_renderer_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TextDrawable::releaseShaderProgram();
|
||||||
PointCloudDrawable::releaseShaderPrograms();
|
PointCloudDrawable::releaseShaderPrograms();
|
||||||
|
|
||||||
if (graph_shader_program_) {
|
if (graph_shader_program_) {
|
||||||
@@ -198,6 +201,10 @@ void Scene::clear()
|
|||||||
{
|
{
|
||||||
delete iter->second;
|
delete iter->second;
|
||||||
}
|
}
|
||||||
|
clearLines();
|
||||||
|
clearQuads();
|
||||||
|
clearTexts();
|
||||||
|
clearCircles();
|
||||||
if(trace_)
|
if(trace_)
|
||||||
{
|
{
|
||||||
trace_->ClearVertexArray();
|
trace_->ClearVertexArray();
|
||||||
@@ -215,6 +222,39 @@ void Scene::clear()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scene::clearLines()
|
||||||
|
{
|
||||||
|
for(std::map<int, tango_gl::Line*>::iterator iter=lines_.begin(); iter!=lines_.end(); ++iter)
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
}
|
||||||
|
lines_.clear();
|
||||||
|
}
|
||||||
|
void Scene::clearTexts()
|
||||||
|
{
|
||||||
|
for(std::map<int, TextDrawable*>::iterator iter=texts_.begin(); iter!=texts_.end(); ++iter)
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
}
|
||||||
|
texts_.clear();
|
||||||
|
}
|
||||||
|
void Scene::clearQuads()
|
||||||
|
{
|
||||||
|
for(std::map<int, QuadColor*>::iterator iter=quads_.begin(); iter!=quads_.end(); ++iter)
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
}
|
||||||
|
quads_.clear();
|
||||||
|
}
|
||||||
|
void Scene::clearCircles()
|
||||||
|
{
|
||||||
|
for(std::map<int, tango_gl::Circle*>::iterator iter=circles_.begin(); iter!=circles_.end(); ++iter)
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
}
|
||||||
|
circles_.clear();
|
||||||
|
}
|
||||||
|
|
||||||
//Should only be called in OpenGL thread!
|
//Should only be called in OpenGL thread!
|
||||||
void Scene::SetupViewPort(int w, int h) {
|
void Scene::SetupViewPort(int w, int h) {
|
||||||
if (h == 0) {
|
if (h == 0) {
|
||||||
@@ -444,8 +484,14 @@ int Scene::Render(const float * uvsTransformed, glm::mat4 arViewMatrix, glm::mat
|
|||||||
std::vector<glm::vec4> planes = computeFrustumPlanes(projectionMatrix*viewMatrix, true);
|
std::vector<glm::vec4> planes = computeFrustumPlanes(projectionMatrix*viewMatrix, true);
|
||||||
std::vector<PointCloudDrawable*> cloudsToDraw(pointClouds_.size());
|
std::vector<PointCloudDrawable*> cloudsToDraw(pointClouds_.size());
|
||||||
int oi=0;
|
int oi=0;
|
||||||
|
int positiveCloudIds = 0;
|
||||||
for(std::map<int, PointCloudDrawable*>::const_iterator iter=pointClouds_.begin(); iter!=pointClouds_.end(); ++iter)
|
for(std::map<int, PointCloudDrawable*>::const_iterator iter=pointClouds_.begin(); iter!=pointClouds_.end(); ++iter)
|
||||||
{
|
{
|
||||||
|
if(iter->first > 0)
|
||||||
|
{
|
||||||
|
positiveCloudIds++;
|
||||||
|
}
|
||||||
|
|
||||||
if(!mapRendering_ && iter->first > 0)
|
if(!mapRendering_ && iter->first > 0)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@@ -487,7 +533,7 @@ int Scene::Render(const float * uvsTransformed, glm::mat4 arViewMatrix, glm::mat
|
|||||||
(blending_ &&
|
(blending_ &&
|
||||||
gesture_camera_->GetCameraType()!=tango_gl::GestureCamera::kTopOrtho &&
|
gesture_camera_->GetCameraType()!=tango_gl::GestureCamera::kTopOrtho &&
|
||||||
mapRendering_ && meshRendering_ &&
|
mapRendering_ && meshRendering_ &&
|
||||||
(cloudsToDraw.size() > 1 || (renderBackgroundCamera && wireFrame_)));
|
(positiveCloudIds > 1 || (renderBackgroundCamera && wireFrame_)));
|
||||||
|
|
||||||
if(onlineBlending && fboId_)
|
if(onlineBlending && fboId_)
|
||||||
{
|
{
|
||||||
@@ -629,9 +675,18 @@ int Scene::Render(const float * uvsTransformed, glm::mat4 arViewMatrix, glm::mat
|
|||||||
cloud->getPose().z() - openglCamera.z());
|
cloud->getPose().z() - openglCamera.z());
|
||||||
float distanceToCameraSqr = cloudToCamera[0]*cloudToCamera[0] + cloudToCamera[1]*cloudToCamera[1] + cloudToCamera[2]*cloudToCamera[2];
|
float distanceToCameraSqr = cloudToCamera[0]*cloudToCamera[0] + cloudToCamera[1]*cloudToCamera[1] + cloudToCamera[2]*cloudToCamera[2];
|
||||||
|
|
||||||
cloud->Render(projectionMatrix, viewMatrix, meshRendering_, pointSize_, meshRenderingTexture_, lighting_, distanceToCameraSqr, onlineBlending?depthTexture_:0, screenWidth_, screenHeight_, gesture_camera_->getNearClipPlane(), gesture_camera_->getFarClipPlane(), false, wireFrame_);
|
cloud->Render(projectionMatrix, viewMatrix, meshRendering_, pointSize_, meshRenderingTexture_, lighting_, distanceToCameraSqr, onlineBlending?depthTexture_:0, screenWidth_, screenHeight_, gesture_camera_->getNearClipPlane(), gesture_camera_->getFarClipPlane(), false, wireFrame_, textureColorSeamsHidden_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(quads_.find(55556)!=quads_.end())
|
||||||
|
{
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
const QuadColor * quad = quads_.at(55556);
|
||||||
|
quad->Render(projectionMatrix, viewMatrix);
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
}
|
||||||
|
|
||||||
if(onlineBlending)
|
if(onlineBlending)
|
||||||
{
|
{
|
||||||
if(renderBackgroundCamera && meshRendering_)
|
if(renderBackgroundCamera && meshRendering_)
|
||||||
@@ -643,6 +698,57 @@ int Scene::Render(const float * uvsTransformed, glm::mat4 arViewMatrix, glm::mat
|
|||||||
glDepthMask(GL_TRUE);
|
glDepthMask(GL_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////
|
||||||
|
glDisable (GL_DEPTH_TEST);
|
||||||
|
if(lines_.size())
|
||||||
|
{
|
||||||
|
for(std::map<int, tango_gl::Line*>::const_iterator iter=lines_.begin(); iter!=lines_.end(); ++iter)
|
||||||
|
{
|
||||||
|
const tango_gl::Line * line = iter->second;
|
||||||
|
line->Render(projectionMatrix, viewMatrix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(quads_.size())
|
||||||
|
{
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
for(std::map<int, QuadColor*>::const_iterator iter=quads_.begin(); iter!=quads_.end(); ++iter)
|
||||||
|
{
|
||||||
|
if(iter->first!=55556)
|
||||||
|
{
|
||||||
|
const QuadColor * quad = iter->second;
|
||||||
|
quad->Render(projectionMatrix, viewMatrix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(circles_.size())
|
||||||
|
{
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
for(std::map<int, tango_gl::Circle*>::const_iterator iter=circles_.begin(); iter!=circles_.end(); ++iter)
|
||||||
|
{
|
||||||
|
const tango_gl::Circle * circle = iter->second;
|
||||||
|
circle->Render(projectionMatrix, viewMatrix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(texts_.size())
|
||||||
|
{
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
|
glm::mat4 viewMatrixRotInv = viewMatrix;
|
||||||
|
viewMatrixRotInv[3][0] = 0;
|
||||||
|
viewMatrixRotInv[3][1] = 0;
|
||||||
|
viewMatrixRotInv[3][2] = 0;
|
||||||
|
viewMatrixRotInv = glm::inverse(viewMatrixRotInv);
|
||||||
|
for(std::map<int, TextDrawable*>::const_iterator iter=texts_.begin(); iter!=texts_.end(); ++iter)
|
||||||
|
{
|
||||||
|
const TextDrawable * text = iter->second;
|
||||||
|
text->Render(projectionMatrix, viewMatrix, viewMatrixRotInv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//draw markers on foreground
|
//draw markers on foreground
|
||||||
for(std::map<int, tango_gl::Axis*>::const_iterator iter=markers_.begin(); iter!=markers_.end(); ++iter)
|
for(std::map<int, tango_gl::Axis*>::const_iterator iter=markers_.begin(); iter!=markers_.end(); ++iter)
|
||||||
{
|
{
|
||||||
@@ -800,12 +906,7 @@ void Scene::addCloud(
|
|||||||
const rtabmap::Transform & pose)
|
const rtabmap::Transform & pose)
|
||||||
{
|
{
|
||||||
LOGI("add cloud %d (%d points %d indices)", id, (int)cloud->size(), indices.get()?(int)indices->size():0);
|
LOGI("add cloud %d (%d points %d indices)", id, (int)cloud->size(), indices.get()?(int)indices->size():0);
|
||||||
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
|
removeCloudOrMesh(id);
|
||||||
if(iter != pointClouds_.end())
|
|
||||||
{
|
|
||||||
delete iter->second;
|
|
||||||
pointClouds_.erase(iter);
|
|
||||||
}
|
|
||||||
|
|
||||||
//create
|
//create
|
||||||
PointCloudDrawable * drawable = new PointCloudDrawable(cloud, indices);
|
PointCloudDrawable * drawable = new PointCloudDrawable(cloud, indices);
|
||||||
@@ -813,6 +914,16 @@ void Scene::addCloud(
|
|||||||
pointClouds_.insert(std::make_pair(id, drawable));
|
pointClouds_.insert(std::make_pair(id, drawable));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scene::removeCloudOrMesh(int id)
|
||||||
|
{
|
||||||
|
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
|
||||||
|
if(iter != pointClouds_.end())
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
pointClouds_.erase(iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Scene::addMesh(
|
void Scene::addMesh(
|
||||||
int id,
|
int id,
|
||||||
const rtabmap::Mesh & mesh,
|
const rtabmap::Mesh & mesh,
|
||||||
@@ -820,12 +931,7 @@ void Scene::addMesh(
|
|||||||
bool createWireframe)
|
bool createWireframe)
|
||||||
{
|
{
|
||||||
LOGI("add mesh %d", id);
|
LOGI("add mesh %d", id);
|
||||||
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
|
removeCloudOrMesh(id);
|
||||||
if(iter != pointClouds_.end())
|
|
||||||
{
|
|
||||||
delete iter->second;
|
|
||||||
pointClouds_.erase(iter);
|
|
||||||
}
|
|
||||||
|
|
||||||
//create
|
//create
|
||||||
PointCloudDrawable * drawable = new PointCloudDrawable(mesh, createWireframe);
|
PointCloudDrawable * drawable = new PointCloudDrawable(mesh, createWireframe);
|
||||||
@@ -885,6 +991,160 @@ void Scene::addMesh(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scene::addLine(
|
||||||
|
int id,
|
||||||
|
const cv::Point3f & pt1,
|
||||||
|
const cv::Point3f & pt2,
|
||||||
|
const tango_gl::Color & color)
|
||||||
|
{
|
||||||
|
LOGI("add line %d", id);
|
||||||
|
removeLine(id);
|
||||||
|
|
||||||
|
//create
|
||||||
|
tango_gl::Line * line = new tango_gl::Line(2.0f, GL_LINES);
|
||||||
|
line->SetShader();
|
||||||
|
std::vector<glm::vec3> vertices(2);
|
||||||
|
vertices[0].x = pt1.x;
|
||||||
|
vertices[0].y = pt1.y;
|
||||||
|
vertices[0].z = pt1.z;
|
||||||
|
vertices[1].x = pt2.x;
|
||||||
|
vertices[1].y = pt2.y;
|
||||||
|
vertices[1].z = pt2.z;
|
||||||
|
line->UpdateLineVertices(vertices);
|
||||||
|
line->SetColor(color);
|
||||||
|
lines_.insert(std::make_pair(id, line));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::removeLine(int id)
|
||||||
|
{
|
||||||
|
std::map<int, tango_gl::Line*>::iterator iter=lines_.find(id);
|
||||||
|
if(iter != lines_.end())
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
lines_.erase(iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::addText(
|
||||||
|
int id,
|
||||||
|
const std::string & text,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
float size,
|
||||||
|
const tango_gl::Color & color)
|
||||||
|
{
|
||||||
|
LOGI("add text %d", id);
|
||||||
|
removeText(id);
|
||||||
|
|
||||||
|
//create
|
||||||
|
TextDrawable * textD = new TextDrawable(text, pose, size, color);
|
||||||
|
texts_.insert(std::make_pair(id, textD));
|
||||||
|
}
|
||||||
|
void Scene::removeText(int id)
|
||||||
|
{
|
||||||
|
std::map<int, TextDrawable*>::iterator iter=texts_.find(id);
|
||||||
|
if(iter != texts_.end())
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
texts_.erase(iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::addQuad(
|
||||||
|
int id,
|
||||||
|
float size,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
const tango_gl::Color & color,
|
||||||
|
float alpha)
|
||||||
|
{
|
||||||
|
//LOGI("add quad %d", id);
|
||||||
|
std::map<int, QuadColor*>::iterator iter=quads_.find(id);
|
||||||
|
if(iter != quads_.end())
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
quads_.erase(iter);
|
||||||
|
}
|
||||||
|
|
||||||
|
//create
|
||||||
|
QuadColor * quad = new QuadColor(size);
|
||||||
|
quad->SetTransformationMatrix(glmFromTransform(pose));
|
||||||
|
quad->SetColor(color);
|
||||||
|
quad->SetAlpha(alpha);
|
||||||
|
quads_.insert(std::make_pair(id, quad));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::addQuad(
|
||||||
|
int id,
|
||||||
|
float widthLeft,
|
||||||
|
float widthRight,
|
||||||
|
float heightBottom,
|
||||||
|
float heightTop,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
const tango_gl::Color & color,
|
||||||
|
float alpha)
|
||||||
|
{
|
||||||
|
//LOGI("add quad %d", id);
|
||||||
|
removeQuad(id);
|
||||||
|
|
||||||
|
//create
|
||||||
|
QuadColor * quad = new QuadColor(widthLeft, widthRight, heightBottom, heightTop);
|
||||||
|
quad->SetTransformationMatrix(glmFromTransform(pose));
|
||||||
|
quad->SetColor(color);
|
||||||
|
quad->SetAlpha(alpha);
|
||||||
|
quads_.insert(std::make_pair(id, quad));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::removeQuad(int id)
|
||||||
|
{
|
||||||
|
std::map<int, QuadColor*>::iterator iter=quads_.find(id);
|
||||||
|
if(iter != quads_.end())
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
quads_.erase(iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Scene::hasQuad(int id) const
|
||||||
|
{
|
||||||
|
return quads_.find(id) != quads_.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::addCircle(
|
||||||
|
int id,
|
||||||
|
float radius,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
const tango_gl::Color & color,
|
||||||
|
float alpha)
|
||||||
|
{
|
||||||
|
//LOGI("add quad %d", id);
|
||||||
|
std::map<int, tango_gl::Circle*>::iterator iter=circles_.find(id);
|
||||||
|
if(iter != circles_.end())
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
circles_.erase(iter);
|
||||||
|
}
|
||||||
|
|
||||||
|
//create
|
||||||
|
tango_gl::Circle * circle = new tango_gl::Circle(radius, 12);
|
||||||
|
circle->SetTransformationMatrix(glmFromTransform(pose));
|
||||||
|
circle->SetColor(color);
|
||||||
|
circle->SetAlpha(alpha);
|
||||||
|
circles_.insert(std::make_pair(id, circle));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::removeCircle(int id)
|
||||||
|
{
|
||||||
|
std::map<int, tango_gl::Circle*>::iterator iter=circles_.find(id);
|
||||||
|
if(iter != circles_.end())
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
circles_.erase(iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Scene::hasCircle(int id) const
|
||||||
|
{
|
||||||
|
return circles_.find(id) != circles_.end();
|
||||||
|
}
|
||||||
|
|
||||||
void Scene::setCloudPose(int id, const rtabmap::Transform & pose)
|
void Scene::setCloudPose(int id, const rtabmap::Transform & pose)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
#include <tango-gl/trace.h>
|
#include <tango-gl/trace.h>
|
||||||
#include <tango-gl/transform.h>
|
#include <tango-gl/transform.h>
|
||||||
#include <tango-gl/util.h>
|
#include <tango-gl/util.h>
|
||||||
|
#include <tango-gl/circle.h>
|
||||||
|
|
||||||
#include <rtabmap/core/Transform.h>
|
#include <rtabmap/core/Transform.h>
|
||||||
#include <rtabmap/core/Link.h>
|
#include <rtabmap/core/Link.h>
|
||||||
@@ -41,12 +42,16 @@
|
|||||||
#include "graph_drawable.h"
|
#include "graph_drawable.h"
|
||||||
#include "bounding_box_drawable.h"
|
#include "bounding_box_drawable.h"
|
||||||
#include "background_renderer.h"
|
#include "background_renderer.h"
|
||||||
|
#include "text_drawable.h"
|
||||||
|
#include "quad_color.h"
|
||||||
|
|
||||||
#include <pcl/point_cloud.h>
|
#include <pcl/point_cloud.h>
|
||||||
#include <pcl/point_types.h>
|
#include <pcl/point_types.h>
|
||||||
|
|
||||||
// Scene provides OpenGL drawable objects and renders them for visualization.
|
// Scene provides OpenGL drawable objects and renders them for visualization.
|
||||||
class Scene {
|
class Scene {
|
||||||
|
public:
|
||||||
|
static const glm::vec3 kHeightOffset;
|
||||||
public:
|
public:
|
||||||
// Constructor and destructor.
|
// Constructor and destructor.
|
||||||
Scene();
|
Scene();
|
||||||
@@ -67,6 +72,10 @@ class Scene {
|
|||||||
void setScreenRotation(rtabmap::ScreenRotation colorCameraToDisplayRotation) {color_camera_to_display_rotation_ = colorCameraToDisplayRotation;}
|
void setScreenRotation(rtabmap::ScreenRotation colorCameraToDisplayRotation) {color_camera_to_display_rotation_ = colorCameraToDisplayRotation;}
|
||||||
|
|
||||||
void clear(); // removed all point clouds
|
void clear(); // removed all point clouds
|
||||||
|
void clearLines();
|
||||||
|
void clearTexts();
|
||||||
|
void clearQuads();
|
||||||
|
void clearCircles();
|
||||||
|
|
||||||
// Render loop.
|
// Render loop.
|
||||||
// @param: cur_pose_transformation, latest pose's transformation.
|
// @param: cur_pose_transformation, latest pose's transformation.
|
||||||
@@ -119,11 +128,50 @@ class Scene {
|
|||||||
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
||||||
const pcl::IndicesPtr & indices,
|
const pcl::IndicesPtr & indices,
|
||||||
const rtabmap::Transform & pose);
|
const rtabmap::Transform & pose);
|
||||||
|
void removeCloudOrMesh(int id);
|
||||||
void addMesh(
|
void addMesh(
|
||||||
int id,
|
int id,
|
||||||
const rtabmap::Mesh & mesh,
|
const rtabmap::Mesh & mesh,
|
||||||
const rtabmap::Transform & pose,
|
const rtabmap::Transform & pose,
|
||||||
bool createWireframe = false);
|
bool createWireframe = false);
|
||||||
|
void addLine(
|
||||||
|
int id,
|
||||||
|
const cv::Point3f & pt1,
|
||||||
|
const cv::Point3f & pt2,
|
||||||
|
const tango_gl::Color & color = tango_gl::Color(1.0f, 1.0f, 1.0f));
|
||||||
|
void removeLine(int id);
|
||||||
|
void addText(
|
||||||
|
int id,
|
||||||
|
const std::string & text,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
float size,
|
||||||
|
const tango_gl::Color & color);
|
||||||
|
void removeText(int id);
|
||||||
|
void addQuad(
|
||||||
|
int id,
|
||||||
|
float size,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
const tango_gl::Color & color,
|
||||||
|
float alpha = 1.0f);
|
||||||
|
void addQuad(
|
||||||
|
int id,
|
||||||
|
float widthLeft,
|
||||||
|
float widthRight,
|
||||||
|
float heightBottom,
|
||||||
|
float heightTop,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
const tango_gl::Color & color,
|
||||||
|
float alpha =1.0f);
|
||||||
|
void removeQuad(int id);
|
||||||
|
bool hasQuad(int id) const;
|
||||||
|
void addCircle(
|
||||||
|
int id,
|
||||||
|
float radius,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
const tango_gl::Color & color,
|
||||||
|
float alpha = 1.0f);
|
||||||
|
void removeCircle(int id);
|
||||||
|
bool hasCircle(int id) const;
|
||||||
|
|
||||||
void setCloudPose(int id, const rtabmap::Transform & pose);
|
void setCloudPose(int id, const rtabmap::Transform & pose);
|
||||||
void setCloudVisible(int id, bool visible);
|
void setCloudVisible(int id, bool visible);
|
||||||
@@ -145,6 +193,7 @@ class Scene {
|
|||||||
void setLighting(bool enabled) {lighting_ = enabled;}
|
void setLighting(bool enabled) {lighting_ = enabled;}
|
||||||
void setBackfaceCulling(bool enabled) {backfaceCulling_ = enabled;}
|
void setBackfaceCulling(bool enabled) {backfaceCulling_ = enabled;}
|
||||||
void setWireframe(bool enabled) {wireFrame_ = enabled;}
|
void setWireframe(bool enabled) {wireFrame_ = enabled;}
|
||||||
|
void setTextureColorSeamsHidden(bool hidden) {textureColorSeamsHidden_ = hidden;}
|
||||||
void setBackgroundColor(float r, float g, float b) {r_=r; g_=g; b_=b;} // 0.0f <> 1.0f
|
void setBackgroundColor(float r, float g, float b) {r_=r; g_=g; b_=b;} // 0.0f <> 1.0f
|
||||||
void setGridColor(float r, float g, float b);
|
void setGridColor(float r, float g, float b);
|
||||||
|
|
||||||
@@ -188,6 +237,10 @@ class Scene {
|
|||||||
rtabmap::ScreenRotation color_camera_to_display_rotation_;
|
rtabmap::ScreenRotation color_camera_to_display_rotation_;
|
||||||
|
|
||||||
std::map<int, PointCloudDrawable*> pointClouds_;
|
std::map<int, PointCloudDrawable*> pointClouds_;
|
||||||
|
std::map<int, tango_gl::Line*> lines_;
|
||||||
|
std::map<int, TextDrawable*> texts_;
|
||||||
|
std::map<int, QuadColor*> quads_;
|
||||||
|
std::map<int, tango_gl::Circle*> circles_;
|
||||||
|
|
||||||
rtabmap::Transform * currentPose_;
|
rtabmap::Transform * currentPose_;
|
||||||
|
|
||||||
@@ -203,6 +256,7 @@ class Scene {
|
|||||||
bool lighting_;
|
bool lighting_;
|
||||||
bool backfaceCulling_;
|
bool backfaceCulling_;
|
||||||
bool wireFrame_;
|
bool wireFrame_;
|
||||||
|
bool textureColorSeamsHidden_;
|
||||||
float r_;
|
float r_;
|
||||||
float g_;
|
float g_;
|
||||||
float b_;
|
float b_;
|
||||||
|
|||||||
@@ -28,8 +28,8 @@ Circle::Circle(float radius, int resolution) : Mesh(GL_TRIANGLE_FAN){
|
|||||||
for (int i = resolution; i >= 0; i--) {
|
for (int i = resolution; i >= 0; i--) {
|
||||||
float theta = delta_theta * static_cast<float>(i);
|
float theta = delta_theta * static_cast<float>(i);
|
||||||
vertices.push_back(cos(theta) * radius);
|
vertices.push_back(cos(theta) * radius);
|
||||||
vertices.push_back(0);
|
|
||||||
vertices.push_back(sin(theta) * radius);
|
vertices.push_back(sin(theta) * radius);
|
||||||
|
vertices.push_back(0);
|
||||||
}
|
}
|
||||||
SetVertices(vertices);
|
SetVertices(vertices);
|
||||||
}
|
}
|
||||||
|
|||||||
366
app/android/jni/text_drawable.cpp
Normal file
366
app/android/jni/text_drawable.cpp
Normal file
@@ -0,0 +1,366 @@
|
|||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __ANDROID__
|
||||||
|
#include <jni.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <tango-gl/util.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <rtabmap/core/Transform.h>
|
||||||
|
#include "util.h"
|
||||||
|
#include "text_drawable.h"
|
||||||
|
#include "text_atlas_png.h"
|
||||||
|
#include <rtabmap/utilite/UConversion.h>
|
||||||
|
|
||||||
|
const std::string kTextVertexShader =
|
||||||
|
"uniform mat4 uMVPMatrix;"
|
||||||
|
"attribute vec4 vPosition;"
|
||||||
|
"attribute vec2 a_texCoord;"
|
||||||
|
"varying vec2 v_texCoord;"
|
||||||
|
"void main() {"
|
||||||
|
" gl_Position = uMVPMatrix * vPosition;"
|
||||||
|
" v_texCoord = a_texCoord;"
|
||||||
|
"}";
|
||||||
|
const std::string kTextFragmentShader =
|
||||||
|
"precision mediump float;"
|
||||||
|
"uniform vec3 uColor;"
|
||||||
|
"varying vec2 v_texCoord;"
|
||||||
|
"uniform sampler2D s_texture;"
|
||||||
|
"void main() {"
|
||||||
|
" gl_FragColor = texture2D( s_texture, v_texCoord );"
|
||||||
|
" gl_FragColor.rgb = uColor;"
|
||||||
|
"}";
|
||||||
|
|
||||||
|
const int RI_TEXT_TEXTURE_SIZE = 512; // 512
|
||||||
|
const float RI_TEXT_HEIGHT_BASE = 32.0f;
|
||||||
|
const char RI_TEXT_START = ' ';
|
||||||
|
const char RI_TEXT_STOP = '~'+1;
|
||||||
|
|
||||||
|
GLuint TextDrawable::textProgram_ = 0;
|
||||||
|
GLuint TextDrawable::textTextureId_ = 0;
|
||||||
|
float TextDrawable::textUVWidth_ = 0;
|
||||||
|
float TextDrawable::textUVHeight_ = 0;
|
||||||
|
float TextDrawable::textHeight_ = 0;
|
||||||
|
std::vector<float> TextDrawable::textCharacterWidths_;
|
||||||
|
|
||||||
|
void TextDrawable::createShaderProgram()
|
||||||
|
{
|
||||||
|
releaseShaderProgram();
|
||||||
|
|
||||||
|
// hard-coded with text_atlas.png resource
|
||||||
|
textCharacterWidths_.resize(95);
|
||||||
|
textCharacterWidths_[0]=8;
|
||||||
|
textCharacterWidths_[1]=9.000000;
|
||||||
|
textCharacterWidths_[2]=10.000000;
|
||||||
|
textCharacterWidths_[3]=19.000000;
|
||||||
|
textCharacterWidths_[4]=18.000000;
|
||||||
|
textCharacterWidths_[5]=24.000000;
|
||||||
|
textCharacterWidths_[6]=21.000000;
|
||||||
|
textCharacterWidths_[7]=5.000000;
|
||||||
|
textCharacterWidths_[8]=11.000000;
|
||||||
|
textCharacterWidths_[9]=11.000000;
|
||||||
|
textCharacterWidths_[10]=15.000000;
|
||||||
|
textCharacterWidths_[11]=17.000000;
|
||||||
|
textCharacterWidths_[12]=8.000000;
|
||||||
|
textCharacterWidths_[13]=12.000000;
|
||||||
|
textCharacterWidths_[14]=9.000000;
|
||||||
|
textCharacterWidths_[15]=12.000000;
|
||||||
|
textCharacterWidths_[16]=18.000000;
|
||||||
|
textCharacterWidths_[17]=18.000000;
|
||||||
|
textCharacterWidths_[18]=18.000000;
|
||||||
|
textCharacterWidths_[19]=18.000000;
|
||||||
|
textCharacterWidths_[20]=18.000000;
|
||||||
|
textCharacterWidths_[21]=18.000000;
|
||||||
|
textCharacterWidths_[22]=18.000000;
|
||||||
|
textCharacterWidths_[23]=18.000000;
|
||||||
|
textCharacterWidths_[24]=18.000000;
|
||||||
|
textCharacterWidths_[25]=18.000000;
|
||||||
|
textCharacterWidths_[26]=9.000000;
|
||||||
|
textCharacterWidths_[27]=8.000000;
|
||||||
|
textCharacterWidths_[28]=16.000000;
|
||||||
|
textCharacterWidths_[29]=18.000000;
|
||||||
|
textCharacterWidths_[30]=17.000000;
|
||||||
|
textCharacterWidths_[31]=16.000000;
|
||||||
|
textCharacterWidths_[32]=29.000000;
|
||||||
|
textCharacterWidths_[33]=22.000000;
|
||||||
|
textCharacterWidths_[34]=20.000000;
|
||||||
|
textCharacterWidths_[35]=21.000000;
|
||||||
|
textCharacterWidths_[36]=21.000000;
|
||||||
|
textCharacterWidths_[37]=18.000000;
|
||||||
|
textCharacterWidths_[38]=18.000000;
|
||||||
|
textCharacterWidths_[39]=22.000000;
|
||||||
|
textCharacterWidths_[40]=23.000000;
|
||||||
|
textCharacterWidths_[41]=9.000000;
|
||||||
|
textCharacterWidths_[42]=18.000000;
|
||||||
|
textCharacterWidths_[43]=20.000000;
|
||||||
|
textCharacterWidths_[44]=17.000000;
|
||||||
|
textCharacterWidths_[45]=28.000000;
|
||||||
|
textCharacterWidths_[46]=23.000000;
|
||||||
|
textCharacterWidths_[47]=22.000000;
|
||||||
|
textCharacterWidths_[48]=21.000000;
|
||||||
|
textCharacterWidths_[49]=22.000000;
|
||||||
|
textCharacterWidths_[50]=20.000000;
|
||||||
|
textCharacterWidths_[51]=20.000000;
|
||||||
|
textCharacterWidths_[52]=20.000000;
|
||||||
|
textCharacterWidths_[53]=21.000000;
|
||||||
|
textCharacterWidths_[54]=21.000000;
|
||||||
|
textCharacterWidths_[55]=28.000000;
|
||||||
|
textCharacterWidths_[56]=20.000000;
|
||||||
|
textCharacterWidths_[57]=20.000000;
|
||||||
|
textCharacterWidths_[58]=19.000000;
|
||||||
|
textCharacterWidths_[59]=9.000000;
|
||||||
|
textCharacterWidths_[60]=14.000000;
|
||||||
|
textCharacterWidths_[61]=9.000000;
|
||||||
|
textCharacterWidths_[62]=14.000000;
|
||||||
|
textCharacterWidths_[63]=14.000000;
|
||||||
|
textCharacterWidths_[64]=11.000000;
|
||||||
|
textCharacterWidths_[65]=17.000000;
|
||||||
|
textCharacterWidths_[66]=18.000000;
|
||||||
|
textCharacterWidths_[67]=17.000000;
|
||||||
|
textCharacterWidths_[68]=18.000000;
|
||||||
|
textCharacterWidths_[69]=17.000000;
|
||||||
|
textCharacterWidths_[70]=11.000000;
|
||||||
|
textCharacterWidths_[71]=18.000000;
|
||||||
|
textCharacterWidths_[72]=18.000000;
|
||||||
|
textCharacterWidths_[73]=8.000000;
|
||||||
|
textCharacterWidths_[74]=8.000000;
|
||||||
|
textCharacterWidths_[75]=17.000000;
|
||||||
|
textCharacterWidths_[76]=8.000000;
|
||||||
|
textCharacterWidths_[77]=28.000000;
|
||||||
|
textCharacterWidths_[78]=18.000000;
|
||||||
|
textCharacterWidths_[79]=18.000000;
|
||||||
|
textCharacterWidths_[80]=18.000000;
|
||||||
|
textCharacterWidths_[81]=18.000000;
|
||||||
|
textCharacterWidths_[82]=12.000000;
|
||||||
|
textCharacterWidths_[83]=16.000000;
|
||||||
|
textCharacterWidths_[84]=11.000000;
|
||||||
|
textCharacterWidths_[85]=18.000000;
|
||||||
|
textCharacterWidths_[86]=16.000000;
|
||||||
|
textCharacterWidths_[87]=24.000000;
|
||||||
|
textCharacterWidths_[88]=16.000000;
|
||||||
|
textCharacterWidths_[89]=16.000000;
|
||||||
|
textCharacterWidths_[90]=16.000000;
|
||||||
|
textCharacterWidths_[91]=11.000000;
|
||||||
|
textCharacterWidths_[92]=8.000000;
|
||||||
|
textCharacterWidths_[93]=11.000000;
|
||||||
|
textCharacterWidths_[94]=21.000000;
|
||||||
|
textUVWidth_=0.062500;
|
||||||
|
textUVHeight_=0.082031;
|
||||||
|
textHeight_=42.000000;
|
||||||
|
|
||||||
|
textProgram_ = tango_gl::util::CreateProgram(kTextVertexShader.c_str(), kTextFragmentShader.c_str());
|
||||||
|
UASSERT(textProgram_ != 0);
|
||||||
|
|
||||||
|
glGenTextures(1, &textTextureId_);
|
||||||
|
UASSERT(textTextureId_);
|
||||||
|
|
||||||
|
// gen texture from image
|
||||||
|
glBindTexture(GL_TEXTURE_2D, textTextureId_);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
|
||||||
|
std::vector<char> data = uHex2Bytes(rtabmap::TEXT_ATLAS_PNG);
|
||||||
|
|
||||||
|
cv::Mat rgbImage = cv::imdecode(data, cv::IMREAD_UNCHANGED);
|
||||||
|
|
||||||
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, rgbImage.cols, rgbImage.rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbImage.data);
|
||||||
|
|
||||||
|
GLint error = glGetError();
|
||||||
|
UASSERT(error == GL_NO_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextDrawable::releaseShaderProgram()
|
||||||
|
{
|
||||||
|
if(textProgram_)
|
||||||
|
{
|
||||||
|
glDeleteShader(textProgram_);
|
||||||
|
textProgram_ = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TextDrawable::TextDrawable(
|
||||||
|
const std::string & text,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
float textSize, // meters
|
||||||
|
const tango_gl::Color & color) :
|
||||||
|
poseGl_(glmFromTransform(pose)),
|
||||||
|
color_(color)
|
||||||
|
{
|
||||||
|
if(textProgram_ > 0)
|
||||||
|
{
|
||||||
|
vertexBuffer_ = std::vector<float>(text.size() * 12);
|
||||||
|
textureBuffer_ = std::vector<float>(text.size() * 8);
|
||||||
|
drawListBuffer_ = std::vector<unsigned short>(text.size() * 6);
|
||||||
|
|
||||||
|
int index_vecs = 0;
|
||||||
|
int index_indices = 0;
|
||||||
|
int index_uvs = 0;
|
||||||
|
float x=0.0f;
|
||||||
|
float y=0.0f;
|
||||||
|
float uniformscale = textSize/textHeight_;
|
||||||
|
for(unsigned int i=0; i<text.size(); ++i)
|
||||||
|
{
|
||||||
|
// get ascii value
|
||||||
|
char c = text[i];
|
||||||
|
int c_val = (int)c;
|
||||||
|
|
||||||
|
int indx = c_val-RI_TEXT_START;
|
||||||
|
|
||||||
|
if(indx<0 || indx>=textCharacterWidths_.size()) {
|
||||||
|
// unknown character, we will add a space for it to be save.
|
||||||
|
indx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int colCount = RI_TEXT_TEXTURE_SIZE/(int)RI_TEXT_HEIGHT_BASE;
|
||||||
|
|
||||||
|
// Calculate the uv parts
|
||||||
|
int row = indx / colCount;
|
||||||
|
int col = indx % colCount;
|
||||||
|
|
||||||
|
float v = row * textUVHeight_;
|
||||||
|
float v2 = v + textUVHeight_;
|
||||||
|
float u = col * textUVWidth_;
|
||||||
|
float u2 = u + textCharacterWidths_[indx]/(float)RI_TEXT_TEXTURE_SIZE;
|
||||||
|
|
||||||
|
// Creating the triangle information
|
||||||
|
std::vector<float> vec(12);
|
||||||
|
std::vector<float> uv(8);
|
||||||
|
|
||||||
|
vec[0] = x;
|
||||||
|
vec[1] = y + (textHeight_ * uniformscale);
|
||||||
|
vec[2] = 0;
|
||||||
|
vec[3] = x;
|
||||||
|
vec[4] = y;
|
||||||
|
vec[5] = 0;
|
||||||
|
vec[6] = x + (textCharacterWidths_[indx] * uniformscale);
|
||||||
|
vec[7] = y;
|
||||||
|
vec[8] = 0;
|
||||||
|
vec[9] = x + (textCharacterWidths_[indx] * uniformscale);
|
||||||
|
vec[10] = y + (textHeight_ * uniformscale);
|
||||||
|
vec[11] = 0;
|
||||||
|
|
||||||
|
// 0.001f = texture bleeding hack/fix
|
||||||
|
uv[0] = u+0.001f;
|
||||||
|
uv[1] = v+0.001f;
|
||||||
|
uv[2] = u+0.001f;
|
||||||
|
uv[3] = v2-0.001f;
|
||||||
|
uv[4] = u2-0.001f;
|
||||||
|
uv[5] = v2-0.001f;
|
||||||
|
uv[6] = u2-0.001f;
|
||||||
|
uv[7] = v+0.001f;
|
||||||
|
|
||||||
|
unsigned short inds[6] = {0, 1, 2, 0, 2, 3};
|
||||||
|
|
||||||
|
// We need a base value because the object has indices related to
|
||||||
|
// that object and not to this collection so basicly we need to
|
||||||
|
// translate the indices to align with the vertexlocation in ou
|
||||||
|
// vecs array of vectors.
|
||||||
|
short base = (short) (index_vecs / 3);
|
||||||
|
|
||||||
|
// We should add the vec, translating the indices to our saved vector
|
||||||
|
for(int i=0;i<vec.size();i++)
|
||||||
|
{
|
||||||
|
vertexBuffer_[index_vecs] = vec[i];
|
||||||
|
index_vecs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We should add the uvs
|
||||||
|
for(int i=0;i<uv.size();i++)
|
||||||
|
{
|
||||||
|
textureBuffer_[index_uvs] = uv[i];
|
||||||
|
index_uvs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We handle the indices
|
||||||
|
for(int j=0;j<6;j++)
|
||||||
|
{
|
||||||
|
drawListBuffer_[index_indices] = (unsigned short) (base + inds[j]);
|
||||||
|
index_indices++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate the new position
|
||||||
|
x += (textCharacterWidths_[indx] * uniformscale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextDrawable::Render(
|
||||||
|
const glm::mat4 & projectionMatrix,
|
||||||
|
const glm::mat4 & viewMatrix,
|
||||||
|
const glm::mat4 & viewMatrixRotInv) const
|
||||||
|
{
|
||||||
|
glUseProgram(textProgram_);
|
||||||
|
|
||||||
|
// get handle to vertex shader's vPosition member
|
||||||
|
int mPositionHandle = glGetAttribLocation(textProgram_, "vPosition");
|
||||||
|
|
||||||
|
// Enable a handle to the triangle vertices
|
||||||
|
glEnableVertexAttribArray(mPositionHandle);
|
||||||
|
|
||||||
|
// Prepare the background coordinate data
|
||||||
|
glVertexAttribPointer(mPositionHandle, 3, GL_FLOAT, false, 0, &vertexBuffer_[0]);
|
||||||
|
|
||||||
|
int mTexCoordLoc = glGetAttribLocation(textProgram_, "a_texCoord" );
|
||||||
|
|
||||||
|
// Prepare the texturecoordinates
|
||||||
|
glVertexAttribPointer ( mTexCoordLoc, 2, GL_FLOAT, false, 0, &textureBuffer_[0]);
|
||||||
|
|
||||||
|
glEnableVertexAttribArray ( mPositionHandle );
|
||||||
|
glEnableVertexAttribArray ( mTexCoordLoc );
|
||||||
|
|
||||||
|
// get handle to shape's transformation matrix
|
||||||
|
int mtrxhandle = glGetUniformLocation(textProgram_, "uMVPMatrix");
|
||||||
|
|
||||||
|
// Apply the projection and view transformation
|
||||||
|
//glUniformMatrix4fv(mtrxhandle, 1, false, m, 0);
|
||||||
|
glm::mat4 mvp_mat = projectionMatrix * viewMatrix * poseGl_ * viewMatrixRotInv;//glm::toMat4(gesture_camera_->GetParent()->GetRotation());
|
||||||
|
glUniformMatrix4fv(mtrxhandle, 1, GL_FALSE, glm::value_ptr(mvp_mat));
|
||||||
|
|
||||||
|
// get handle to color value
|
||||||
|
int colorhandle = glGetUniformLocation(textProgram_, "uColor");
|
||||||
|
glUniform3f(colorhandle, color_.r, color_.g, color_.b);
|
||||||
|
|
||||||
|
int mSamplerLoc = glGetUniformLocation (textProgram_, "s_texture" );
|
||||||
|
|
||||||
|
// Texture activate unit 0
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
// Bind the texture to this unit.
|
||||||
|
glBindTexture(GL_TEXTURE_2D, textTextureId_);
|
||||||
|
// Set the sampler texture unit to our selected id
|
||||||
|
glUniform1i ( mSamplerLoc, 0);
|
||||||
|
|
||||||
|
// Draw the triangle
|
||||||
|
glDrawElements(GL_TRIANGLES, drawListBuffer_.size(), GL_UNSIGNED_SHORT, &drawListBuffer_[0]);
|
||||||
|
|
||||||
|
// Disable vertex array
|
||||||
|
glDisableVertexAttribArray(mPositionHandle);
|
||||||
|
glDisableVertexAttribArray(mTexCoordLoc);
|
||||||
|
}
|
||||||
71
app/android/jni/text_drawable.h
Normal file
71
app/android/jni/text_drawable.h
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TANGO_TEXT_DRAWABLE_H_
|
||||||
|
#define TANGO_TEXT_DRAWABLE_H_
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <rtabmap/core/Transform.h>
|
||||||
|
#include <tango-gl/color.h>
|
||||||
|
|
||||||
|
// PointCloudDrawable is responsible for the point cloud rendering.
|
||||||
|
class TextDrawable {
|
||||||
|
private:
|
||||||
|
static GLuint textProgram_;
|
||||||
|
static GLuint textTextureId_;
|
||||||
|
static float textUVWidth_;
|
||||||
|
static float textUVHeight_;
|
||||||
|
static float textHeight_;
|
||||||
|
static std::vector<float> textCharacterWidths_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static void createShaderProgram();
|
||||||
|
static void releaseShaderProgram();
|
||||||
|
|
||||||
|
public:
|
||||||
|
TextDrawable(
|
||||||
|
const std::string & text,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
float textSize = 0.1f, // meters
|
||||||
|
const tango_gl::Color & color = tango_gl::Color(1,0,0));
|
||||||
|
|
||||||
|
virtual ~TextDrawable() {}
|
||||||
|
|
||||||
|
void Render(
|
||||||
|
const glm::mat4 & projectionMatrix,
|
||||||
|
const glm::mat4 & viewMatrix,
|
||||||
|
const glm::mat4 & viewMatrixRotInv) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<float> vertexBuffer_;
|
||||||
|
std::vector<float> textureBuffer_;
|
||||||
|
std::vector<unsigned short> drawListBuffer_;
|
||||||
|
glm::mat4 poseGl_;
|
||||||
|
tango_gl::Color color_;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // TANGO_POINT_CLOUD_POINT_CLOUD_DRAWABLE_H_
|
||||||
@@ -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))));
|
||||||
@@ -1775,19 +1776,19 @@ public class RTABMapActivity extends FragmentActivity implements OnClickListener
|
|||||||
long currentTime = System.currentTimeMillis()/1000;
|
long currentTime = System.currentTimeMillis()/1000;
|
||||||
if(loopClosureId > 0)
|
if(loopClosureId > 0)
|
||||||
{
|
{
|
||||||
if (mToast != null && mToast.getView().isShown()) mToast.cancel();
|
if (mToast != null) mToast.cancel();
|
||||||
mToast.setText(String.format("Loop closure detected! (%d/%d inliers)", inliers, matches));
|
mToast.setText(String.format("Loop closure detected! (%d/%d inliers)", inliers, matches));
|
||||||
mToast.show();
|
mToast.show();
|
||||||
}
|
}
|
||||||
else if(landmarkDetected != 0)
|
else if(landmarkDetected != 0)
|
||||||
{
|
{
|
||||||
if (mToast != null && mToast.getView().isShown()) mToast.cancel();
|
if (mToast != null) mToast.cancel();
|
||||||
mToast.setText(String.format("Marker %d detected!", landmarkDetected));
|
mToast.setText(String.format("Marker %d detected!", landmarkDetected));
|
||||||
mToast.show();
|
mToast.show();
|
||||||
}
|
}
|
||||||
else if(rejected > 0)
|
else if(rejected > 0)
|
||||||
{
|
{
|
||||||
if (mToast != null && mToast.getView().isShown()) mToast.cancel();
|
if (mToast != null) mToast.cancel();
|
||||||
if(inliers >= Integer.parseInt(mMinInliers))
|
if(inliers >= Integer.parseInt(mMinInliers))
|
||||||
{
|
{
|
||||||
if(optimizationMaxError > 0.0f)
|
if(optimizationMaxError > 0.0f)
|
||||||
@@ -1809,7 +1810,7 @@ public class RTABMapActivity extends FragmentActivity implements OnClickListener
|
|||||||
{
|
{
|
||||||
if(currentTime - mLastFastMovementNotificationStamp > 3)
|
if(currentTime - mLastFastMovementNotificationStamp > 3)
|
||||||
{
|
{
|
||||||
if (mToast != null && mToast.getView().isShown()) mToast.cancel();
|
if (mToast != null) mToast.cancel();
|
||||||
mToast.setText("Move slower... blurry images are not added to map (\"Settings->Mapping...->Maximum Motion Speed\" is enabled).");
|
mToast.setText("Move slower... blurry images are not added to map (\"Settings->Mapping...->Maximum Motion Speed\" is enabled).");
|
||||||
mToast.show();
|
mToast.show();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,10 +8,82 @@
|
|||||||
|
|
||||||
/* 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 */; };
|
||||||
|
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 */; };
|
||||||
4EE016B3259BE441008CCE65 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE016AF259BE441008CCE65 /* ViewController.swift */; };
|
4EE016B3259BE441008CCE65 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE016AF259BE441008CCE65 /* ViewController.swift */; };
|
||||||
@@ -20,34 +92,6 @@
|
|||||||
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 */; };
|
||||||
@@ -75,93 +119,74 @@
|
|||||||
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 */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
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>"; };
|
||||||
|
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>"; };
|
||||||
|
4E1E9CF52D618079000CB881 /* text_drawable.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = text_drawable.cpp; path = ../android/jni/text_drawable.cpp; sourceTree = "<group>"; };
|
||||||
|
4E1E9CF62D618079000CB881 /* quad_color.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = quad_color.cpp; path = ../android/jni/quad_color.cpp; sourceTree = "<group>"; };
|
||||||
|
4E1E9CF92D619025000CB881 /* text_atlas_png.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = text_atlas_png.h; path = RTABMapApp/text_atlas_png.h; sourceTree = "<group>"; };
|
||||||
4E20B24D266AB94300316EE6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RTABMapApp/Images.xcassets; sourceTree = SOURCE_ROOT; };
|
4E20B24D266AB94300316EE6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RTABMapApp/Images.xcassets; sourceTree = SOURCE_ROOT; };
|
||||||
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>"; };
|
||||||
4EE015C2259A2AF0008CCE65 /* RTABMapApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RTABMapApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
4EE015C2259A2AF0008CCE65 /* RTABMapApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RTABMapApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
4EE016AF259BE441008CCE65 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ViewController.swift; path = RTABMapApp/ViewController.swift; sourceTree = "<group>"; };
|
4EE016AF259BE441008CCE65 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ViewController.swift; path = RTABMapApp/ViewController.swift; sourceTree = "<group>"; };
|
||||||
4EE016B0259BE441008CCE65 /* SceneDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SceneDelegate.swift; path = RTABMapApp/SceneDelegate.swift; sourceTree = "<group>"; };
|
4EE016B0259BE441008CCE65 /* SceneDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SceneDelegate.swift; path = RTABMapApp/SceneDelegate.swift; sourceTree = "<group>"; };
|
||||||
@@ -345,109 +370,79 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
4EFAA9432CAE4E960055DA51 /* liblas.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;
|
||||||
};
|
};
|
||||||
@@ -475,6 +470,7 @@
|
|||||||
4EE01634259BDCC7008CCE65 /* RTABMapApp */ = {
|
4EE01634259BDCC7008CCE65 /* RTABMapApp */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
44D4681D2D538A4100B094BA /* RTABMapApp.entitlements */,
|
||||||
4E20B24F266AB95600316EE6 /* Images.xcassets */,
|
4E20B24F266AB95600316EE6 /* Images.xcassets */,
|
||||||
4EFD0BB0259D503200575D88 /* NativeWrapper */,
|
4EFD0BB0259D503200575D88 /* NativeWrapper */,
|
||||||
4EFD0B62259D501E00575D88 /* tango-gl */,
|
4EFD0B62259D501E00575D88 /* tango-gl */,
|
||||||
@@ -496,6 +492,52 @@
|
|||||||
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 */,
|
||||||
4EFAA9422CAE4E960055DA51 /* liblas.a */,
|
4EFAA9422CAE4E960055DA51 /* liblas.a */,
|
||||||
4EFD0F4D259D67D900575D88 /* liblibjpeg-turbo.a */,
|
4EFD0F4D259D67D900575D88 /* liblibjpeg-turbo.a */,
|
||||||
4EFD0F4C259D67D900575D88 /* liblibpng.a */,
|
4EFD0F4C259D67D900575D88 /* liblibpng.a */,
|
||||||
@@ -679,6 +721,12 @@
|
|||||||
4EFD0BB0259D503200575D88 /* NativeWrapper */ = {
|
4EFD0BB0259D503200575D88 /* NativeWrapper */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
4E1E9CF92D619025000CB881 /* text_atlas_png.h */,
|
||||||
|
4E1E9CF62D618079000CB881 /* quad_color.cpp */,
|
||||||
|
4E1E9CF32D618079000CB881 /* quad_color.h */,
|
||||||
|
4E1E9CF52D618079000CB881 /* text_drawable.cpp */,
|
||||||
|
4E1E9CF42D618079000CB881 /* text_drawable.h */,
|
||||||
|
4E1E9CF22D617D08000CB881 /* Measure.h */,
|
||||||
4EFD0F6E259F847300575D88 /* background_renderer.cc */,
|
4EFD0F6E259F847300575D88 /* background_renderer.cc */,
|
||||||
4EFD0F6F259F847300575D88 /* background_renderer.h */,
|
4EFD0F6F259F847300575D88 /* background_renderer.h */,
|
||||||
4EFD0F66259E38DE00575D88 /* NativeWrapper.cpp */,
|
4EFD0F66259E38DE00575D88 /* NativeWrapper.cpp */,
|
||||||
@@ -791,7 +839,7 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nversion=\"$MARKETING_VERSION\"\n/usr/libexec/PlistBuddy -c \"Set PreferenceSpecifiers:21:DefaultValue $version\" \"${SRCROOT}/Settings.bundle/Root.plist\"\n";
|
shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nversion=\"$MARKETING_VERSION\"\n/usr/libexec/PlistBuddy -c \"Set PreferenceSpecifiers:24:DefaultValue $version\" \"${SRCROOT}/Settings.bundle/Root.plist\"\n";
|
||||||
};
|
};
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
@@ -800,6 +848,8 @@
|
|||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
4E1E9CF72D618E69000CB881 /* quad_color.cpp in Sources */,
|
||||||
|
4E1E9CF82D618E69000CB881 /* text_drawable.cpp in Sources */,
|
||||||
4EFD0F70259F847300575D88 /* background_renderer.cc in Sources */,
|
4EFD0F70259F847300575D88 /* background_renderer.cc in Sources */,
|
||||||
4EFD0BC0259D50A800575D88 /* scene.cpp in Sources */,
|
4EFD0BC0259D50A800575D88 /* scene.cpp in Sources */,
|
||||||
4E2C516825A63119005CEDBD /* VerticalScrollerView.swift in Sources */,
|
4E2C516825A63119005CEDBD /* VerticalScrollerView.swift in Sources */,
|
||||||
@@ -867,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;
|
||||||
@@ -898,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;
|
||||||
@@ -928,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;
|
||||||
@@ -959,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;
|
||||||
@@ -986,6 +1036,7 @@
|
|||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_USE_OPTIMIZATION_PROFILE = NO;
|
CLANG_USE_OPTIMIZATION_PROFILE = NO;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = RTABMapApp/RTABMapApp.entitlements;
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
@@ -1012,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.8;
|
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)";
|
||||||
@@ -1025,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;
|
||||||
@@ -1043,6 +1096,7 @@
|
|||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_USE_OPTIMIZATION_PROFILE = NO;
|
CLANG_USE_OPTIMIZATION_PROFILE = NO;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = RTABMapApp/RTABMapApp.entitlements;
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
@@ -1069,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.8;
|
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;
|
||||||
@@ -1083,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;
|
||||||
|
|||||||
@@ -18,8 +18,8 @@
|
|||||||
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
|
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="kPv-DO-hpd">
|
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="30" translatesAutoresizingMaskIntoConstraints="NO" id="kPv-DO-hpd">
|
||||||
<rect key="frame" x="323" y="366" width="60" height="120"/>
|
<rect key="frame" x="323" y="261" width="60" height="330"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="mJN-Ru-yPg" userLabel="StopButton">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="mJN-Ru-yPg" userLabel="StopButton">
|
||||||
<rect key="frame" x="0.0" y="1" width="60" height="58.666666666666671"/>
|
<rect key="frame" x="0.0" y="1" width="60" height="58.666666666666671"/>
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="7Lv-u6-mGh" userLabel="RecordButton">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="7Lv-u6-mGh" userLabel="RecordButton">
|
||||||
<rect key="frame" x="0.0" y="61.000000000000007" width="60" height="58.666666666666664"/>
|
<rect key="frame" x="0.0" y="91" width="60" height="58.666666666666686"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="height" constant="60" id="DQI-eQ-v3X"/>
|
<constraint firstAttribute="height" constant="60" id="DQI-eQ-v3X"/>
|
||||||
<constraint firstAttribute="width" constant="60" id="Oeu-YT-wMz"/>
|
<constraint firstAttribute="width" constant="60" id="Oeu-YT-wMz"/>
|
||||||
@@ -47,6 +47,32 @@
|
|||||||
<action selector="recordAction:" destination="zah-iI-EPt" eventType="touchUpInside" id="dzY-yL-YBg"/>
|
<action selector="recordAction:" destination="zah-iI-EPt" eventType="touchUpInside" id="dzY-yL-YBg"/>
|
||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="lFB-Lm-zFS" userLabel="AddMeasureButton">
|
||||||
|
<rect key="frame" x="0.0" y="181.33333333333334" width="60" height="57.999999999999972"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" constant="60" id="Wtb-vg-lgB"/>
|
||||||
|
<constraint firstAttribute="height" constant="60" id="p0E-BN-poT"/>
|
||||||
|
</constraints>
|
||||||
|
<color key="tintColor" systemColor="systemYellowColor"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
<state key="normal" backgroundImage="plus.viewfinder" catalog="system"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="addMeasureAction:" destination="zah-iI-EPt" eventType="touchUpInside" id="lUX-tm-SgY"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="c1k-0i-64A" userLabel="RemoveMeasureButton">
|
||||||
|
<rect key="frame" x="0.0" y="271" width="60" height="58.666666666666686"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="height" constant="60" id="0gd-nd-i5y"/>
|
||||||
|
<constraint firstAttribute="width" constant="60" id="mSi-rI-NoN"/>
|
||||||
|
</constraints>
|
||||||
|
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
<state key="normal" backgroundImage="minus.circle" catalog="system"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="removeMeasureAction:" destination="zah-iI-EPt" eventType="touchUpInside" id="2RW-qr-kvb"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
</subviews>
|
</subviews>
|
||||||
</stackView>
|
</stackView>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="ozY-dg-YOd">
|
<stackView opaque="NO" contentMode="scaleToFill" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="ozY-dg-YOd">
|
||||||
@@ -79,22 +105,10 @@
|
|||||||
</stackView>
|
</stackView>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KlF-4H-k6I">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KlF-4H-k6I">
|
||||||
<rect key="frame" x="16" y="79" width="31" height="14.333333333333329"/>
|
<rect key="frame" x="16" y="79" width="31" height="14.333333333333329"/>
|
||||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.29820365646258501" colorSpace="custom" customColorSpace="sRGB"/>
|
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="12"/>
|
<fontDescription key="fontDescription" type="system" pointSize="12"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="773-n4-lob" userLabel="ViewButton">
|
|
||||||
<rect key="frame" x="321" y="756.33333333333337" width="52" height="40"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="width" constant="52" id="epT-x2-WRc"/>
|
|
||||||
<constraint firstAttribute="height" constant="44" id="wAe-I1-qhs"/>
|
|
||||||
</constraints>
|
|
||||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
||||||
<state key="normal" backgroundImage="eye" catalog="system">
|
|
||||||
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
||||||
</state>
|
|
||||||
</button>
|
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="012-W3-dOS" userLabel="CloseVisualization">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="012-W3-dOS" userLabel="CloseVisualization">
|
||||||
<rect key="frame" x="111.33333333333333" y="772" width="170.33333333333337" height="22"/>
|
<rect key="frame" x="111.33333333333333" y="772" width="170.33333333333337" height="22"/>
|
||||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
@@ -146,18 +160,8 @@
|
|||||||
<action selector="clipDistanceAction:" destination="zah-iI-EPt" eventType="valueChanged" id="iKj-nz-0KW"/>
|
<action selector="clipDistanceAction:" destination="zah-iI-EPt" eventType="valueChanged" id="iKj-nz-0KW"/>
|
||||||
</connections>
|
</connections>
|
||||||
</slider>
|
</slider>
|
||||||
<slider opaque="NO" contentMode="scaleToFill" placeholderIntrinsicWidth="114" placeholderIntrinsicHeight="30" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="90" minValue="0.0" maxValue="180" translatesAutoresizingMaskIntoConstraints="NO" id="Z1x-Af-hdf" userLabel="GridRotationSlider">
|
|
||||||
<rect key="frame" x="135.66666666666666" y="727" width="121.99999999999997" height="31"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="width" constant="118" id="KDl-lP-Jj7"/>
|
|
||||||
</constraints>
|
|
||||||
<connections>
|
|
||||||
<action selector="rotateGridAction:" destination="zah-iI-EPt" eventType="valueChanged" id="eiC-QR-TYH"/>
|
|
||||||
</connections>
|
|
||||||
</slider>
|
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Toast Label" textAlignment="center" lineBreakMode="wordWrap" numberOfLines="4" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JMv-UE-cvK" userLabel="ToastLabel">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Toast Label" textAlignment="center" lineBreakMode="wordWrap" numberOfLines="4" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JMv-UE-cvK" userLabel="ToastLabel">
|
||||||
<rect key="frame" x="51" y="668.33333333333337" width="291" height="20.333333333333371"/>
|
<rect key="frame" x="51" y="637.33333333333337" width="291" height="20.333333333333371"/>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.3002232142857143" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
||||||
<accessibility key="accessibilityConfiguration">
|
<accessibility key="accessibilityConfiguration">
|
||||||
<accessibilityTraits key="traits" staticText="YES" notEnabled="YES"/>
|
<accessibilityTraits key="traits" staticText="YES" notEnabled="YES"/>
|
||||||
</accessibility>
|
</accessibility>
|
||||||
@@ -165,31 +169,93 @@
|
|||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
|
<slider opaque="NO" contentMode="scaleToFill" placeholderIntrinsicWidth="114" placeholderIntrinsicHeight="30" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="90" minValue="0.0" maxValue="180" translatesAutoresizingMaskIntoConstraints="NO" id="Z1x-Af-hdf" userLabel="GridRotationSlider">
|
||||||
|
<rect key="frame" x="132" y="727" width="122" height="31"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" constant="118" id="KDl-lP-Jj7"/>
|
||||||
|
</constraints>
|
||||||
|
<connections>
|
||||||
|
<action selector="rotateGridAction:" destination="zah-iI-EPt" eventType="valueChanged" id="eiC-QR-TYH"/>
|
||||||
|
</connections>
|
||||||
|
</slider>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="aWA-YQ-w5B" userLabel="TeleportButton">
|
||||||
|
<rect key="frame" x="10" y="396.66666666666669" width="62.666666666666671" height="60"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="height" constant="60" id="fe3-pR-D97"/>
|
||||||
|
<constraint firstAttribute="width" constant="60" id="t1H-Yp-Ayy"/>
|
||||||
|
</constraints>
|
||||||
|
<color key="tintColor" systemColor="systemGreenColor"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
<state key="normal" backgroundImage="accessibility.badge.arrow.up.right" catalog="system"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="teleportButtonAction:" destination="zah-iI-EPt" eventType="touchUpInside" id="acD-kc-XA8"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="773-n4-lob" userLabel="ViewButton">
|
||||||
|
<rect key="frame" x="321" y="756.33333333333337" width="52" height="40"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" constant="52" id="epT-x2-WRc"/>
|
||||||
|
<constraint firstAttribute="height" constant="44" id="wAe-I1-qhs"/>
|
||||||
|
</constraints>
|
||||||
|
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<state key="normal" backgroundImage="eye" catalog="system">
|
||||||
|
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</state>
|
||||||
|
</button>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Z7f-kc-Rob" userLabel="MeasuringModeButton">
|
||||||
|
<rect key="frame" x="293" y="687.33333333333337" width="80" height="32.333333333333371"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" secondItem="Z7f-kc-Rob" secondAttribute="height" multiplier="52:27" id="78b-kS-OdV"/>
|
||||||
|
<constraint firstAttribute="width" constant="80" id="PFZ-dH-x12"/>
|
||||||
|
</constraints>
|
||||||
|
<color key="tintColor" systemColor="systemYellowColor"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
<state key="normal" backgroundImage="ruler" catalog="system"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="startMeasuring:" destination="zah-iI-EPt" eventType="touchUpInside" id="uAe-Qu-Wwb"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="wOV-tT-ZlN" userLabel="StopMeasuring">
|
||||||
|
<rect key="frame" x="123.33333333333333" y="771" width="146.33333333333343" height="22"/>
|
||||||
|
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<state key="normal" title="Stop Measuring" image="xmark.square" catalog="system">
|
||||||
|
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</state>
|
||||||
|
<connections>
|
||||||
|
<action selector="stopCameraAction:" destination="zah-iI-EPt" eventType="touchUpInside" id="UY3-Dh-T9g"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
</subviews>
|
</subviews>
|
||||||
<viewLayoutGuide key="safeArea" id="qAR-pI-uT2"/>
|
<viewLayoutGuide key="safeArea" id="qAR-pI-uT2"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="KlF-4H-k6I" firstAttribute="leading" secondItem="qAR-pI-uT2" secondAttribute="leading" constant="16" id="14l-HO-Yqo"/>
|
<constraint firstItem="KlF-4H-k6I" firstAttribute="leading" secondItem="qAR-pI-uT2" secondAttribute="leading" constant="16" id="14l-HO-Yqo"/>
|
||||||
<constraint firstItem="kPv-DO-hpd" firstAttribute="centerY" secondItem="sqF-4e-2HU" secondAttribute="centerY" id="4S8-5c-tBm"/>
|
<constraint firstItem="kPv-DO-hpd" firstAttribute="centerY" secondItem="sqF-4e-2HU" secondAttribute="centerY" id="4S8-5c-tBm"/>
|
||||||
|
<constraint firstItem="qAR-pI-uT2" firstAttribute="trailing" secondItem="773-n4-lob" secondAttribute="trailing" constant="20" id="6TZ-Iy-b1B"/>
|
||||||
|
<constraint firstItem="773-n4-lob" firstAttribute="top" secondItem="Z7f-kc-Rob" secondAttribute="bottom" constant="30" id="7cF-fT-hfI"/>
|
||||||
<constraint firstItem="JMv-UE-cvK" firstAttribute="leading" secondItem="sqF-4e-2HU" secondAttribute="leadingMargin" constant="35" id="Awg-pU-JkT"/>
|
<constraint firstItem="JMv-UE-cvK" firstAttribute="leading" secondItem="sqF-4e-2HU" secondAttribute="leadingMargin" constant="35" id="Awg-pU-JkT"/>
|
||||||
<constraint firstItem="KlF-4H-k6I" firstAttribute="top" secondItem="qAR-pI-uT2" secondAttribute="top" constant="20" id="CS3-Rk-Wxs"/>
|
<constraint firstItem="KlF-4H-k6I" firstAttribute="top" secondItem="qAR-pI-uT2" secondAttribute="top" constant="20" id="CS3-Rk-Wxs"/>
|
||||||
<constraint firstItem="012-W3-dOS" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="IsC-yB-kNs"/>
|
<constraint firstItem="012-W3-dOS" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="IsC-yB-kNs"/>
|
||||||
<constraint firstItem="qAR-pI-uT2" firstAttribute="trailing" secondItem="773-n4-lob" secondAttribute="trailing" constant="20" id="N8s-Yg-VsL"/>
|
<constraint firstItem="qAR-pI-uT2" firstAttribute="bottom" secondItem="wOV-tT-ZlN" secondAttribute="bottom" constant="25" id="Kab-84-pPU"/>
|
||||||
<constraint firstItem="JMv-UE-cvK" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="NIf-UH-gZ7"/>
|
<constraint firstItem="JMv-UE-cvK" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="NIf-UH-gZ7"/>
|
||||||
<constraint firstItem="qAR-pI-uT2" firstAttribute="bottom" secondItem="773-n4-lob" secondAttribute="bottom" constant="20" id="O9t-O0-69d"/>
|
|
||||||
<constraint firstItem="Jj4-ow-MwD" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="OLx-LR-8xj"/>
|
<constraint firstItem="Jj4-ow-MwD" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="OLx-LR-8xj"/>
|
||||||
|
<constraint firstItem="aWA-YQ-w5B" firstAttribute="leading" secondItem="sqF-4e-2HU" secondAttribute="leading" constant="10" id="Rlo-Ir-NqY"/>
|
||||||
<constraint firstItem="012-W3-dOS" firstAttribute="top" secondItem="Z1x-Af-hdf" secondAttribute="bottom" constant="15" id="RpS-k0-btM"/>
|
<constraint firstItem="012-W3-dOS" firstAttribute="top" secondItem="Z1x-Af-hdf" secondAttribute="bottom" constant="15" id="RpS-k0-btM"/>
|
||||||
<constraint firstItem="ozY-dg-YOd" firstAttribute="top" secondItem="qAR-pI-uT2" secondAttribute="top" constant="20" id="TFT-we-noh"/>
|
<constraint firstItem="ozY-dg-YOd" firstAttribute="top" secondItem="qAR-pI-uT2" secondAttribute="top" constant="20" id="TFT-we-noh"/>
|
||||||
|
<constraint firstItem="qAR-pI-uT2" firstAttribute="trailing" secondItem="Z7f-kc-Rob" secondAttribute="trailing" constant="20" id="Tbc-4P-ryD"/>
|
||||||
|
<constraint firstItem="aWA-YQ-w5B" firstAttribute="centerY" secondItem="sqF-4e-2HU" secondAttribute="centerY" id="YXX-yd-QGL"/>
|
||||||
<constraint firstAttribute="trailingMargin" secondItem="JMv-UE-cvK" secondAttribute="trailing" constant="35" id="Ya5-GD-1rM"/>
|
<constraint firstAttribute="trailingMargin" secondItem="JMv-UE-cvK" secondAttribute="trailing" constant="35" id="Ya5-GD-1rM"/>
|
||||||
<constraint firstItem="30J-Tx-NRW" firstAttribute="leading" secondItem="sqF-4e-2HU" secondAttribute="leading" id="ZBG-GX-P1X"/>
|
<constraint firstItem="30J-Tx-NRW" firstAttribute="leading" secondItem="sqF-4e-2HU" secondAttribute="leading" id="ZBG-GX-P1X"/>
|
||||||
|
<constraint firstItem="wOV-tT-ZlN" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="aPp-NO-q0A"/>
|
||||||
<constraint firstItem="3Sc-lx-YKH" firstAttribute="top" secondItem="ozY-dg-YOd" secondAttribute="bottom" constant="16" id="abR-Tj-Nua"/>
|
<constraint firstItem="3Sc-lx-YKH" firstAttribute="top" secondItem="ozY-dg-YOd" secondAttribute="bottom" constant="16" id="abR-Tj-Nua"/>
|
||||||
<constraint firstItem="qAR-pI-uT2" firstAttribute="bottom" secondItem="012-W3-dOS" secondAttribute="bottom" constant="24" id="dcl-mV-bH1"/>
|
<constraint firstItem="qAR-pI-uT2" firstAttribute="bottom" secondItem="012-W3-dOS" secondAttribute="bottom" constant="24" id="dcl-mV-bH1"/>
|
||||||
<constraint firstItem="9oq-op-NGV" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="g5b-gW-Amg"/>
|
<constraint firstItem="9oq-op-NGV" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="g5b-gW-Amg"/>
|
||||||
<constraint firstItem="Z1x-Af-hdf" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="i2j-zQ-m1V"/>
|
<constraint firstItem="qAR-pI-uT2" firstAttribute="bottom" secondItem="773-n4-lob" secondAttribute="bottom" constant="20" id="h09-nI-8yH"/>
|
||||||
<constraint firstItem="Z1x-Af-hdf" firstAttribute="top" secondItem="JMv-UE-cvK" secondAttribute="bottom" constant="38.5" id="icg-DR-ZpX"/>
|
<constraint firstItem="9oq-op-NGV" firstAttribute="top" secondItem="JMv-UE-cvK" secondAttribute="bottom" constant="113.33" id="icg-DR-ZpX"/>
|
||||||
<constraint firstItem="qAR-pI-uT2" firstAttribute="bottom" secondItem="9oq-op-NGV" secondAttribute="bottom" constant="25" id="lFI-66-D3N"/>
|
<constraint firstItem="qAR-pI-uT2" firstAttribute="bottom" secondItem="9oq-op-NGV" secondAttribute="bottom" constant="25" id="lFI-66-D3N"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="kPv-DO-hpd" secondAttribute="trailing" constant="10" id="lFv-p3-LIS"/>
|
<constraint firstAttribute="trailing" secondItem="kPv-DO-hpd" secondAttribute="trailing" constant="10" id="lFv-p3-LIS"/>
|
||||||
<constraint firstItem="qAR-pI-uT2" firstAttribute="trailing" secondItem="ozY-dg-YOd" secondAttribute="trailing" constant="20" id="ov4-d2-OMy"/>
|
<constraint firstItem="qAR-pI-uT2" firstAttribute="trailing" secondItem="ozY-dg-YOd" secondAttribute="trailing" constant="20" id="ov4-d2-OMy"/>
|
||||||
<constraint firstItem="012-W3-dOS" firstAttribute="top" secondItem="30J-Tx-NRW" secondAttribute="bottom" constant="60" id="tbj-nG-nfI"/>
|
<constraint firstItem="012-W3-dOS" firstAttribute="top" secondItem="30J-Tx-NRW" secondAttribute="bottom" constant="60" id="tbj-nG-nfI"/>
|
||||||
|
<constraint firstItem="Z1x-Af-hdf" firstAttribute="leading" secondItem="30J-Tx-NRW" secondAttribute="trailing" constant="16" id="uMj-kM-hlH"/>
|
||||||
<constraint firstItem="qAR-pI-uT2" firstAttribute="trailing" secondItem="3Sc-lx-YKH" secondAttribute="trailing" constant="10" id="v2K-Dp-Kyn"/>
|
<constraint firstItem="qAR-pI-uT2" firstAttribute="trailing" secondItem="3Sc-lx-YKH" secondAttribute="trailing" constant="10" id="v2K-Dp-Kyn"/>
|
||||||
<constraint firstItem="Jj4-ow-MwD" firstAttribute="centerY" secondItem="sqF-4e-2HU" secondAttribute="centerY" id="vmc-4u-BtF"/>
|
<constraint firstItem="Jj4-ow-MwD" firstAttribute="centerY" secondItem="sqF-4e-2HU" secondAttribute="centerY" id="vmc-4u-BtF"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
@@ -198,24 +264,29 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</glkView>
|
</glkView>
|
||||||
<connections>
|
<connections>
|
||||||
|
<outlet property="addMeasureButton" destination="lFB-Lm-zFS" id="iOG-iO-mMQ"/>
|
||||||
<outlet property="closeVisualizationButton" destination="012-W3-dOS" id="qSV-q9-eOP"/>
|
<outlet property="closeVisualizationButton" destination="012-W3-dOS" id="qSV-q9-eOP"/>
|
||||||
<outlet property="exportOBJPLYButton" destination="3Sc-lx-YKH" id="ZvS-VQ-nsg"/>
|
<outlet property="exportOBJPLYButton" destination="3Sc-lx-YKH" id="ZvS-VQ-nsg"/>
|
||||||
<outlet property="libraryButton" destination="9kh-4C-KyP" id="Mvv-uQ-kmi"/>
|
<outlet property="libraryButton" destination="9kh-4C-KyP" id="Mvv-uQ-kmi"/>
|
||||||
|
<outlet property="measuringModeButton" destination="Z7f-kc-Rob" id="C0D-Pc-wdr"/>
|
||||||
<outlet property="menuButton" destination="y53-OI-O76" id="v3g-JB-SsY"/>
|
<outlet property="menuButton" destination="y53-OI-O76" id="v3g-JB-SsY"/>
|
||||||
<outlet property="newScanButtonLarge" destination="Jj4-ow-MwD" id="0Hv-3K-Xjh"/>
|
<outlet property="newScanButtonLarge" destination="Jj4-ow-MwD" id="0Hv-3K-Xjh"/>
|
||||||
<outlet property="orthoDistanceSlider" destination="30J-Tx-NRW" id="4J1-8u-tDY"/>
|
<outlet property="orthoDistanceSlider" destination="30J-Tx-NRW" id="4J1-8u-tDY"/>
|
||||||
<outlet property="orthoGridSlider" destination="Z1x-Af-hdf" id="Zsn-xz-jn0"/>
|
<outlet property="orthoGridSlider" destination="Z1x-Af-hdf" id="Zsn-xz-jn0"/>
|
||||||
<outlet property="recordButton" destination="7Lv-u6-mGh" id="xTu-EK-FH2"/>
|
<outlet property="recordButton" destination="7Lv-u6-mGh" id="xTu-EK-FH2"/>
|
||||||
|
<outlet property="removeMeasureButton" destination="c1k-0i-64A" id="E9z-yH-Vye"/>
|
||||||
<outlet property="statusLabel" destination="KlF-4H-k6I" id="NmA-K5-UOw"/>
|
<outlet property="statusLabel" destination="KlF-4H-k6I" id="NmA-K5-UOw"/>
|
||||||
<outlet property="stopButton" destination="mJN-Ru-yPg" id="DND-gz-jLg"/>
|
<outlet property="stopButton" destination="mJN-Ru-yPg" id="DND-gz-jLg"/>
|
||||||
<outlet property="stopCameraButton" destination="9oq-op-NGV" id="sxO-jc-luC"/>
|
<outlet property="stopCameraButton" destination="9oq-op-NGV" id="sxO-jc-luC"/>
|
||||||
|
<outlet property="stopMeasuringButton" destination="wOV-tT-ZlN" id="iK5-hG-9q0"/>
|
||||||
|
<outlet property="teleportButton" destination="aWA-YQ-w5B" id="KTE-cK-RCI"/>
|
||||||
<outlet property="toastLabel" destination="JMv-UE-cvK" id="9a7-QF-h02"/>
|
<outlet property="toastLabel" destination="JMv-UE-cvK" id="9a7-QF-h02"/>
|
||||||
<outlet property="viewButton" destination="773-n4-lob" id="deU-Na-mBk"/>
|
<outlet property="viewButton" destination="773-n4-lob" id="deU-Na-mBk"/>
|
||||||
</connections>
|
</connections>
|
||||||
</glkViewController>
|
</glkViewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="plN-WG-seA" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="plN-WG-seA" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="-234.375" y="-586.25"/>
|
<point key="canvasLocation" x="-235.87786259541983" y="-586.61971830985919"/>
|
||||||
</scene>
|
</scene>
|
||||||
<!--Unsupported View Controller-->
|
<!--Unsupported View Controller-->
|
||||||
<scene sceneID="sJB-xy-u63">
|
<scene sceneID="sJB-xy-u63">
|
||||||
@@ -226,14 +297,14 @@
|
|||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Unsupported Device" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" enabled="NO" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kZt-ct-4KD">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Unsupported Device" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" enabled="NO" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kZt-ct-4KD">
|
||||||
<rect key="frame" x="28" y="341.33333333333331" width="337.33333333333331" height="33.666666666666686"/>
|
<rect key="frame" x="21" y="352.33333333333331" width="351.33333333333331" height="33.666666666666686"/>
|
||||||
<fontDescription key="fontDescription" style="UICTFontTextStyleTitle1"/>
|
<fontDescription key="fontDescription" style="UICTFontTextStyleTitle1"/>
|
||||||
<nil key="textColor"/>
|
<nil key="textColor"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" enabled="NO" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4Js-Hw-3QU">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" enabled="NO" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4Js-Hw-3QU">
|
||||||
<rect key="frame" x="28" y="383" width="337.33333333333331" height="86.333333333333314"/>
|
<rect key="frame" x="21" y="394" width="351.33333333333331" height="64.333333333333314"/>
|
||||||
<string key="text">This sample app requires a LiDAR-capable device, such as the second-generation iPad Pro 11-inch and fourth-generation iPad Pro 12.9-inch.</string>
|
<string key="text">This app requires a LiDAR-capable device, such as the second-generation iPad Pro 11-inch and fourth-generation iPad Pro 12.9-inch.</string>
|
||||||
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
|
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
|
||||||
<nil key="textColor"/>
|
<nil key="textColor"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
@@ -258,16 +329,26 @@
|
|||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
<resources>
|
<resources>
|
||||||
|
<image name="accessibility.badge.arrow.up.right" catalog="system" width="128" height="114"/>
|
||||||
<image name="ellipsis.circle" catalog="system" width="128" height="123"/>
|
<image name="ellipsis.circle" catalog="system" width="128" height="123"/>
|
||||||
<image name="eye" catalog="system" width="128" height="79"/>
|
<image name="eye" catalog="system" width="128" height="79"/>
|
||||||
<image name="folder" catalog="system" width="128" height="96"/>
|
<image name="folder" catalog="system" width="128" height="96"/>
|
||||||
|
<image name="minus.circle" catalog="system" width="128" height="123"/>
|
||||||
<image name="plus.app" catalog="system" width="128" height="114"/>
|
<image name="plus.app" catalog="system" width="128" height="114"/>
|
||||||
|
<image name="plus.viewfinder" catalog="system" width="128" height="115"/>
|
||||||
<image name="record.circle" catalog="system" width="128" height="123"/>
|
<image name="record.circle" catalog="system" width="128" height="123"/>
|
||||||
|
<image name="ruler" catalog="system" width="128" height="57"/>
|
||||||
<image name="square.and.arrow.up" catalog="system" width="108" height="128"/>
|
<image name="square.and.arrow.up" catalog="system" width="108" height="128"/>
|
||||||
<image name="stop.circle" catalog="system" width="128" height="123"/>
|
<image name="stop.circle" catalog="system" width="128" height="123"/>
|
||||||
<image name="xmark.square" catalog="system" width="128" height="114"/>
|
<image name="xmark.square" catalog="system" width="128" height="114"/>
|
||||||
|
<systemColor name="systemGreenColor">
|
||||||
|
<color red="0.20392156859999999" green="0.78039215689999997" blue="0.34901960780000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
</systemColor>
|
||||||
<systemColor name="systemRedColor">
|
<systemColor name="systemRedColor">
|
||||||
<color red="1" green="0.23137254900000001" blue="0.18823529410000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color red="1" green="0.23137254900000001" blue="0.18823529410000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
</systemColor>
|
</systemColor>
|
||||||
|
<systemColor name="systemYellowColor">
|
||||||
|
<color red="1" green="0.80000000000000004" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
</systemColor>
|
||||||
</resources>
|
</resources>
|
||||||
</document>
|
</document>
|
||||||
|
|||||||
@@ -55,11 +55,19 @@ class DatabaseView: UIView {
|
|||||||
super.init(frame: frame)
|
super.init(frame: frame)
|
||||||
self.databaseURL = databaseURL
|
self.databaseURL = databaseURL
|
||||||
commonInit(databasePath: databaseURL.path)
|
commonInit(databasePath: databaseURL.path)
|
||||||
DispatchQueue.global().async {
|
if let image = ViewController.previewImages[databaseURL.path]
|
||||||
let downloadedImage = getPreviewImage(databasePath: databaseURL.path)
|
{
|
||||||
DispatchQueue.main.async {
|
self.coverImageView.image = image
|
||||||
self.coverImageView.image = downloadedImage
|
}
|
||||||
}
|
else
|
||||||
|
{
|
||||||
|
DispatchQueue.global().async {
|
||||||
|
let downloadedImage = getPreviewImage(databasePath: databaseURL.path)
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.coverImageView.image = downloadedImage
|
||||||
|
ViewController.previewImages[databaseURL.path] = downloadedImage
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -150,11 +150,12 @@ bool exportMeshNative(
|
|||||||
int optimizedMinClusterSize,
|
int optimizedMinClusterSize,
|
||||||
float optimizedMaxTextureDistance,
|
float optimizedMaxTextureDistance,
|
||||||
int optimizedMinTextureClusterSize,
|
int optimizedMinTextureClusterSize,
|
||||||
|
int textureVertexColorPolicy,
|
||||||
bool blockRendering)
|
bool blockRendering)
|
||||||
{
|
{
|
||||||
if(object)
|
if(object)
|
||||||
{
|
{
|
||||||
return native(object)->exportMesh(cloudVoxelSize, regenerateCloud, meshing, textureSize, textureCount, normalK, optimized, optimizedVoxelSize, optimizedDepth, optimizedMaxPolygons, optimizedColorRadius, optimizedCleanWhitePolygons, optimizedMinClusterSize, optimizedMaxTextureDistance, optimizedMinTextureClusterSize, blockRendering);
|
return native(object)->exportMesh(cloudVoxelSize, regenerateCloud, meshing, textureSize, textureCount, normalK, optimized, optimizedVoxelSize, optimizedDepth, optimizedMaxPolygons, optimizedColorRadius, optimizedCleanWhitePolygons, optimizedMinClusterSize, optimizedMaxTextureDistance, optimizedMinTextureClusterSize, textureVertexColorPolicy, blockRendering);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -434,6 +435,13 @@ void setWireframeNative(const void *object, bool enabled)
|
|||||||
else
|
else
|
||||||
UERROR("object is null!");
|
UERROR("object is null!");
|
||||||
}
|
}
|
||||||
|
void setTextureColorSeamsHiddenNative(const void *object, bool hidden)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
native(object)->setTextureColorSeamsHidden(hidden);
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
void setLocalizationModeNative(const void *object, bool enabled)
|
void setLocalizationModeNative(const void *object, bool enabled)
|
||||||
{
|
{
|
||||||
if(object)
|
if(object)
|
||||||
@@ -497,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)
|
||||||
@@ -622,3 +637,53 @@ void addEnvSensorNative(const void *object, int type, float value)
|
|||||||
else
|
else
|
||||||
UERROR("object is null!");
|
UERROR("object is null!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void removeMeasureNative(const void *object)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
return native(object)->removeMeasure();
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
|
void addMeasureNative(const void *object)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
return native(object)->addMeasureButtonClicked();
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
|
void teleportNative(const void *object)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
return native(object)->teleportButtonClicked();
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
|
void setMeasuringModeNative(const void *object, int mode)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
return native(object)->setMeasuringMode(mode);
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
|
void setMetricSystemNative(const void *object, bool enabled)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
return native(object)->setMetricSystem(enabled);
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
|
void setMeasuringTextSizeNative(const void *object, float size)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
return native(object)->setMeasuringTextSize(size);
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
|
void clearMeasuresNative(const void *object)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
return native(object)->clearMeasures();
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ bool exportMeshNative(
|
|||||||
int optimizedMinClusterSize,
|
int optimizedMinClusterSize,
|
||||||
float optimizedMaxTextureDistance,
|
float optimizedMaxTextureDistance,
|
||||||
int optimizedMinTextureClusterSize,
|
int optimizedMinTextureClusterSize,
|
||||||
|
int textureVertexColorPolicy,
|
||||||
bool blockRendering);
|
bool blockRendering);
|
||||||
bool postExportationNative(const void *object, bool visualize);
|
bool postExportationNative(const void *object, bool visualize);
|
||||||
bool writeExportedMeshNative(const void *object, const char * directory, const char * name);
|
bool writeExportedMeshNative(const void *object, const char * directory, const char * name);
|
||||||
@@ -90,6 +91,7 @@ void setGridRotationNative(const void *object, float value);
|
|||||||
void setLightingNative(const void *object, bool enabled);
|
void setLightingNative(const void *object, bool enabled);
|
||||||
void setBackfaceCullingNative(const void *object, bool enabled);
|
void setBackfaceCullingNative(const void *object, bool enabled);
|
||||||
void setWireframeNative(const void *object, bool enabled);
|
void setWireframeNative(const void *object, bool enabled);
|
||||||
|
void setTextureColorSeamsHiddenNative(const void *object, bool hidden);
|
||||||
void setLocalizationModeNative(const void *object, bool enabled);
|
void setLocalizationModeNative(const void *object, bool enabled);
|
||||||
void setDataRecorderModeNative(const void *object, bool enabled);
|
void setDataRecorderModeNative(const void *object, bool enabled);
|
||||||
void setTrajectoryModeNative(const void *object, bool enabled);
|
void setTrajectoryModeNative(const void *object, bool enabled);
|
||||||
@@ -99,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);
|
||||||
@@ -115,6 +118,14 @@ void setDepthConfidenceNative(const void *object, int value);
|
|||||||
void setExportPointCloudFormatNative(const void *object, const char * format);
|
void setExportPointCloudFormatNative(const void *object, const char * format);
|
||||||
int setMappingParameterNative(const void *object, const char * key, const char * value);
|
int setMappingParameterNative(const void *object, const char * key, const char * value);
|
||||||
|
|
||||||
|
void removeMeasureNative(const void *object);
|
||||||
|
void addMeasureNative(const void *object);
|
||||||
|
void teleportNative(const void *object);
|
||||||
|
void setMeasuringModeNative(const void *object, int mode);
|
||||||
|
void setMetricSystemNative(const void *object, bool enabled);
|
||||||
|
void setMeasuringTextSizeNative(const void *object, float size);
|
||||||
|
void clearMeasuresNative(const void *object);
|
||||||
|
|
||||||
typedef struct ImageNative
|
typedef struct ImageNative
|
||||||
{
|
{
|
||||||
const void * objectPtr;
|
const void * objectPtr;
|
||||||
|
|||||||
@@ -152,6 +152,27 @@ class RTABMap {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func removeMeasure() {
|
||||||
|
removeMeasureNative(native_rtabmap)
|
||||||
|
}
|
||||||
|
func addMeasureButtonClicked() {
|
||||||
|
addMeasureNative(native_rtabmap)
|
||||||
|
}
|
||||||
|
func teleportButtonClicked() {
|
||||||
|
teleportNative(native_rtabmap)
|
||||||
|
}
|
||||||
|
func setMeasuringMode(_ mode: Int) {
|
||||||
|
setMeasuringModeNative(native_rtabmap, Int32(mode))
|
||||||
|
}
|
||||||
|
func setMetricSystem(_ enabled: Bool) {
|
||||||
|
setMetricSystemNative(native_rtabmap, enabled)
|
||||||
|
}
|
||||||
|
func setMeasuringTextSize(_ size: Float32) {
|
||||||
|
setMeasuringTextSizeNative(native_rtabmap, size)
|
||||||
|
}
|
||||||
|
func clearMeasures() {
|
||||||
|
clearMeasuresNative(native_rtabmap)
|
||||||
|
}
|
||||||
func cancelProcessing() {
|
func cancelProcessing() {
|
||||||
cancelProcessingNative(native_rtabmap);
|
cancelProcessingNative(native_rtabmap);
|
||||||
}
|
}
|
||||||
@@ -176,6 +197,7 @@ class RTABMap {
|
|||||||
optimizedMinClusterSize: Int,
|
optimizedMinClusterSize: Int,
|
||||||
optimizedMaxTextureDistance: Float,
|
optimizedMaxTextureDistance: Float,
|
||||||
optimizedMinTextureClusterSize: Int,
|
optimizedMinTextureClusterSize: Int,
|
||||||
|
textureVertexColorPolicy: Int,
|
||||||
blockRendering: Bool) -> Bool
|
blockRendering: Bool) -> Bool
|
||||||
{
|
{
|
||||||
return exportMeshNative(native_rtabmap,
|
return exportMeshNative(native_rtabmap,
|
||||||
@@ -194,6 +216,7 @@ class RTABMap {
|
|||||||
Int32(optimizedMinClusterSize),
|
Int32(optimizedMinClusterSize),
|
||||||
optimizedMaxTextureDistance,
|
optimizedMaxTextureDistance,
|
||||||
Int32(optimizedMinTextureClusterSize),
|
Int32(optimizedMinTextureClusterSize),
|
||||||
|
Int32(textureVertexColorPolicy),
|
||||||
blockRendering)
|
blockRendering)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -223,7 +246,7 @@ class RTABMap {
|
|||||||
return Int(renderNative(native_rtabmap))
|
return Int(renderNative(native_rtabmap))
|
||||||
}
|
}
|
||||||
|
|
||||||
func startCamera() -> Bool {
|
func startCamera(imageOverlayInFirstPerson: Bool = true) -> Bool {
|
||||||
return startCameraNative(native_rtabmap)
|
return startCameraNative(native_rtabmap)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -403,6 +426,9 @@ class RTABMap {
|
|||||||
func setWireframe(enabled: Bool) {
|
func setWireframe(enabled: Bool) {
|
||||||
setWireframeNative(native_rtabmap, enabled)
|
setWireframeNative(native_rtabmap, enabled)
|
||||||
}
|
}
|
||||||
|
func setTextureColorSeamsHidden(hidden: Bool) {
|
||||||
|
setTextureColorSeamsHiddenNative(native_rtabmap, hidden)
|
||||||
|
}
|
||||||
func setLocalizationMode(enabled: Bool) {
|
func setLocalizationMode(enabled: Bool) {
|
||||||
setLocalizationModeNative(native_rtabmap, enabled)
|
setLocalizationModeNative(native_rtabmap, enabled)
|
||||||
}
|
}
|
||||||
@@ -427,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)
|
||||||
}
|
}
|
||||||
|
|||||||
8
app/ios/RTABMapApp/RTABMapApp.entitlements
Normal file
8
app/ios/RTABMapApp/RTABMapApp.entitlements
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>com.apple.developer.kernel.increased-memory-limit</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -45,6 +45,8 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
|
|
||||||
private var mReviewRequested = false
|
private var mReviewRequested = false
|
||||||
|
|
||||||
|
private var mMaximumMemory: Int = 0
|
||||||
|
|
||||||
// UI states
|
// UI states
|
||||||
private enum State {
|
private enum State {
|
||||||
case STATE_WELCOME, // Camera/Motion off - showing only buttons open and start new scan
|
case STATE_WELCOME, // Camera/Motion off - showing only buttons open and start new scan
|
||||||
@@ -53,8 +55,9 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
STATE_IDLE, // Camera/Motion off
|
STATE_IDLE, // Camera/Motion off
|
||||||
STATE_PROCESSING, // Camera/Motion off - post processing
|
STATE_PROCESSING, // Camera/Motion off - post processing
|
||||||
STATE_VISUALIZING, // Camera/Motion off - Showing optimized mesh
|
STATE_VISUALIZING, // Camera/Motion off - Showing optimized mesh
|
||||||
STATE_VISUALIZING_CAMERA, // Camera/Motion on - Showing optimized mesh
|
STATE_VISUALIZING_CAMERA, // Camera/Motion on - Showing optimized mesh and localizing
|
||||||
STATE_VISUALIZING_WHILE_LOADING // Camera/Motion off - Loading data while showing optimized mesh
|
STATE_VISUALIZING_WHILE_LOADING, // Camera/Motion off - Loading data while showing optimized mesh
|
||||||
|
STATE_VISUALIZING_AND_MEASURING // Camera/Motion on - Showing optimized mesh without localizing and measuring tools enabled
|
||||||
}
|
}
|
||||||
private var mState: State = State.STATE_WELCOME;
|
private var mState: State = State.STATE_WELCOME;
|
||||||
private func getStateString(state: State) -> String {
|
private func getStateString(state: State) -> String {
|
||||||
@@ -73,6 +76,8 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
return "Visualizing with Camera"
|
return "Visualizing with Camera"
|
||||||
case .STATE_VISUALIZING_WHILE_LOADING:
|
case .STATE_VISUALIZING_WHILE_LOADING:
|
||||||
return "Visualizing while Loading"
|
return "Visualizing while Loading"
|
||||||
|
case .STATE_VISUALIZING_AND_MEASURING:
|
||||||
|
return "Measuring"
|
||||||
default: // IDLE
|
default: // IDLE
|
||||||
return "Idle"
|
return "Idle"
|
||||||
}
|
}
|
||||||
@@ -93,9 +98,14 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
private var wireframeShown: Bool = false
|
private var wireframeShown: Bool = false
|
||||||
private var backfaceShown: Bool = false
|
private var backfaceShown: Bool = false
|
||||||
private var lightingShown: Bool = false
|
private var lightingShown: Bool = false
|
||||||
|
private var textureColorSeamsShown: Bool = false
|
||||||
private var mHudVisible: Bool = true
|
private var mHudVisible: Bool = true
|
||||||
private var mLastTimeHudShown: DispatchTime = .now()
|
private var mLastTimeHudShown: DispatchTime = .now()
|
||||||
private var mMenuOpened: Bool = false
|
private var mMenuOpened: Bool = false
|
||||||
|
private var lowMemoryWarningShown: Bool = false
|
||||||
|
static var previewImages: [String: UIImage] = [:]
|
||||||
|
private var measuringMode: Int = 0
|
||||||
|
private var visualizationType: Int = 0 // 0=Cloud, 1=Mesh, 2=Texture Mesh
|
||||||
|
|
||||||
@IBOutlet weak var stopButton: UIButton!
|
@IBOutlet weak var stopButton: UIButton!
|
||||||
@IBOutlet weak var recordButton: UIButton!
|
@IBOutlet weak var recordButton: UIButton!
|
||||||
@@ -106,6 +116,11 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
@IBOutlet weak var statusLabel: UILabel!
|
@IBOutlet weak var statusLabel: UILabel!
|
||||||
@IBOutlet weak var closeVisualizationButton: UIButton!
|
@IBOutlet weak var closeVisualizationButton: UIButton!
|
||||||
@IBOutlet weak var stopCameraButton: UIButton!
|
@IBOutlet weak var stopCameraButton: UIButton!
|
||||||
|
@IBOutlet weak var stopMeasuringButton: UIButton!
|
||||||
|
@IBOutlet weak var teleportButton: UIButton!
|
||||||
|
@IBOutlet weak var addMeasureButton: UIButton!
|
||||||
|
@IBOutlet weak var removeMeasureButton: UIButton!
|
||||||
|
@IBOutlet weak var measuringModeButton: UIButton!
|
||||||
@IBOutlet weak var exportOBJPLYButton: UIButton!
|
@IBOutlet weak var exportOBJPLYButton: UIButton!
|
||||||
@IBOutlet weak var orthoDistanceSlider: UISlider!{
|
@IBOutlet weak var orthoDistanceSlider: UISlider!{
|
||||||
didSet{
|
didSet{
|
||||||
@@ -128,6 +143,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
}
|
}
|
||||||
|
|
||||||
@objc func defaultsChanged(){
|
@objc func defaultsChanged(){
|
||||||
|
print("defaultsChanged()")
|
||||||
updateDisplayFromDefaults()
|
updateDisplayFromDefaults()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,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()
|
||||||
@@ -168,20 +183,52 @@ 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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func addShadow(_ view: UIView, _ offset: Int = 4)
|
||||||
|
{
|
||||||
|
view.layer.shadowColor = UIColor.black.cgColor
|
||||||
|
view.layer.shadowRadius = 3.0
|
||||||
|
view.layer.shadowOpacity = 1.0
|
||||||
|
view.layer.shadowOffset = CGSize(width: offset, height: offset)
|
||||||
|
view.layer.masksToBounds = false
|
||||||
|
}
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
|
|
||||||
|
mMaximumMemory = getAvailableMemory()
|
||||||
|
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
// Do any additional setup after loading the view.
|
// Do any additional setup after loading the view.
|
||||||
|
|
||||||
self.toastLabel.isHidden = true
|
self.toastLabel.isHidden = true
|
||||||
session.delegate = self
|
session.delegate = self
|
||||||
|
|
||||||
|
addShadow(stopButton)
|
||||||
|
addShadow(recordButton)
|
||||||
|
addShadow(menuButton)
|
||||||
|
addShadow(viewButton)
|
||||||
|
addShadow(newScanButtonLarge)
|
||||||
|
addShadow(libraryButton)
|
||||||
|
addShadow(closeVisualizationButton)
|
||||||
|
addShadow(stopCameraButton)
|
||||||
|
addShadow(stopMeasuringButton)
|
||||||
|
addShadow(teleportButton)
|
||||||
|
addShadow(addMeasureButton)
|
||||||
|
addShadow(removeMeasureButton)
|
||||||
|
addShadow(measuringModeButton)
|
||||||
|
addShadow(exportOBJPLYButton)
|
||||||
|
|
||||||
|
addShadow(statusLabel, 0)
|
||||||
|
addShadow(toastLabel, 0)
|
||||||
|
|
||||||
|
addShadow(orthoDistanceSlider, 0)
|
||||||
|
addShadow(orthoGridSlider, 0)
|
||||||
|
|
||||||
depthSupported = ARWorldTrackingConfiguration.supportsFrameSemantics(.sceneDepth)
|
depthSupported = ARWorldTrackingConfiguration.supportsFrameSemantics(.sceneDepth)
|
||||||
|
|
||||||
rtabmap = RTABMap()
|
rtabmap = RTABMap()
|
||||||
@@ -237,6 +284,20 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func progressStatusUpdate() {
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
|
||||||
|
if self.mState == .STATE_PROCESSING && self.statusShown
|
||||||
|
{
|
||||||
|
let availableMem = self.getAvailableMemory()
|
||||||
|
let usedMem = self.mMaximumMemory - availableMem;
|
||||||
|
self.statusLabel.text =
|
||||||
|
"Status: \(self.getStateString(state: self.mState))\n" +
|
||||||
|
"RAM Usage (MB): \(usedMem) / \(self.mMaximumMemory)"
|
||||||
|
self.progressStatusUpdate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func progressUpdated(_ rtabmap: RTABMap, count: Int, max: Int) {
|
func progressUpdated(_ rtabmap: RTABMap, count: Int, max: Int) {
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
self.progressView?.setProgress(Float(count)/Float(max), animated: true)
|
self.progressView?.setProgress(Float(count)/Float(max), animated: true)
|
||||||
@@ -262,14 +323,17 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
{
|
{
|
||||||
if(optimizedMeshDetected==1)
|
if(optimizedMeshDetected==1)
|
||||||
{
|
{
|
||||||
|
self.visualizationType = 0;
|
||||||
self.setMeshRendering(viewMode: 0)
|
self.setMeshRendering(viewMode: 0)
|
||||||
}
|
}
|
||||||
else if(optimizedMeshDetected==2)
|
else if(optimizedMeshDetected==2)
|
||||||
{
|
{
|
||||||
|
self.visualizationType = 1;
|
||||||
self.setMeshRendering(viewMode: 1)
|
self.setMeshRendering(viewMode: 1)
|
||||||
}
|
}
|
||||||
else // isOBJ
|
else // isOBJ
|
||||||
{
|
{
|
||||||
|
self.visualizationType = 2;
|
||||||
self.setMeshRendering(viewMode: 2)
|
self.setMeshRendering(viewMode: 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,10 +344,11 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
self.showToast(message: "Optimized mesh detected in the database, it is shown while the database is loading...", seconds: 3)
|
self.showToast(message: "Optimized mesh detected in the database, it is shown while the database is loading...", seconds: 3)
|
||||||
}
|
}
|
||||||
|
|
||||||
let usedMem = self.getMemoryUsage()
|
let availableMem = self.getAvailableMemory()
|
||||||
|
let usedMem = self.mMaximumMemory - availableMem;
|
||||||
self.statusLabel.text =
|
self.statusLabel.text =
|
||||||
"Status: " + (status == 1 && msg.isEmpty ? self.mState == State.STATE_CAMERA ? "Camera Preview" : "Idle" : msg) + "\n" +
|
"Status: " + (status == 1 && msg.isEmpty ? self.mState == State.STATE_CAMERA ? "Camera Preview" : "Idle" : msg) + "\n" +
|
||||||
"Memory Usage: \(usedMem) MB"
|
"RAM Usage (MB): \(usedMem) / \(self.mMaximumMemory)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -316,7 +381,8 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
pitch: Float,
|
pitch: Float,
|
||||||
yaw: Float)
|
yaw: Float)
|
||||||
{
|
{
|
||||||
let usedMem = self.getMemoryUsage()
|
let availableMem = self.getAvailableMemory()
|
||||||
|
let usedMem = self.mMaximumMemory - availableMem;
|
||||||
|
|
||||||
if(loopClosureId > 0)
|
if(loopClosureId > 0)
|
||||||
{
|
{
|
||||||
@@ -339,7 +405,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
self.statusLabel.text =
|
self.statusLabel.text =
|
||||||
self.statusLabel.text! +
|
self.statusLabel.text! +
|
||||||
"Status: \(self.getStateString(state: self.mState))\n" +
|
"Status: \(self.getStateString(state: self.mState))\n" +
|
||||||
"Memory Usage : \(usedMem) MB"
|
"RAM Usage (MB): \(usedMem) / \(self.mMaximumMemory)"
|
||||||
}
|
}
|
||||||
if self.debugShown {
|
if self.debugShown {
|
||||||
self.statusLabel.text =
|
self.statusLabel.text =
|
||||||
@@ -426,6 +492,43 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
self.showToast(message: "Landmark \(landmarkDetected) detected!", seconds: 1);
|
self.showToast(message: "Landmark \(landmarkDetected) detected!", seconds: 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(self.mState == .STATE_MAPPING)
|
||||||
|
{
|
||||||
|
if(availableMem < 400)
|
||||||
|
{
|
||||||
|
let msg = "Scanning will be stopped because the free memory is too "
|
||||||
|
+ "low (\(availableMem) MB). You should be able to save the database but some post-processing and exporting options may fail. "
|
||||||
|
+ "\n\nNote that for large environments, you can save multiple databases and "
|
||||||
|
+ "merge them with RTAB-Map Desktop version."
|
||||||
|
let alert = UIAlertController(title: "Memory is full!", message: msg, preferredStyle: .alert)
|
||||||
|
let alertActionYes = UIAlertAction(title: "Ok", style: .default) {
|
||||||
|
(UIAlertAction) -> Void in
|
||||||
|
self.stopMapping(ignoreSaving: false, offerPostProcessing: false);
|
||||||
|
}
|
||||||
|
alert.addAction(alertActionYes)
|
||||||
|
self.present(alert, animated: true, completion: nil)
|
||||||
|
}
|
||||||
|
else if(!self.lowMemoryWarningShown && usedMem*3 > availableMem && !self.mDataRecording)
|
||||||
|
{
|
||||||
|
self.lowMemoryWarningShown = true
|
||||||
|
let msg = "Available memory (\(availableMem) MB) should be at least 3 times the "
|
||||||
|
+ "memory used (\(usedMem) MB) so that some post-processing and exporting options "
|
||||||
|
+ "have enough memory to work correctly. If you just want to save the database "
|
||||||
|
+ "after scanning, you can continue until the next warning.\n\n"
|
||||||
|
+ "Note that showing only point clouds and/or decrease density reduce memory needed for rendering."
|
||||||
|
let alert = UIAlertController(title: "Memory is full!", message: msg, preferredStyle: .alert)
|
||||||
|
let alertActionYes = UIAlertAction(title: "Stop Now", style: .default) {
|
||||||
|
(UIAlertAction) -> Void in
|
||||||
|
self.stopMapping(ignoreSaving: false);
|
||||||
|
}
|
||||||
|
alert.addAction(alertActionYes)
|
||||||
|
let alertActionNo = UIAlertAction(title: "Continue", style: .cancel) {
|
||||||
|
(UIAlertAction) -> Void in
|
||||||
|
}
|
||||||
|
alert.addAction(alertActionNo)
|
||||||
|
self.present(alert, animated: true, completion: nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -439,34 +542,22 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func getMemoryUsage() -> UInt64 {
|
func getAvailableMemory() -> Int {
|
||||||
var taskInfo = mach_task_basic_info()
|
return os_proc_available_memory()/(1024*1024)
|
||||||
var count = mach_msg_type_number_t(MemoryLayout<mach_task_basic_info>.size)/4
|
|
||||||
let kerr: kern_return_t = withUnsafeMutablePointer(to: &taskInfo) {
|
|
||||||
$0.withMemoryRebound(to: integer_t.self, capacity: 1) {
|
|
||||||
task_info(mach_task_self_, task_flavor_t(MACH_TASK_BASIC_INFO), $0, &count)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if kerr == KERN_SUCCESS {
|
|
||||||
return taskInfo.resident_size / (1024*1024)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
print("Error with task_info(): " +
|
|
||||||
(String(cString: mach_error_string(kerr), encoding: String.Encoding.ascii) ?? "unknown error"))
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func appMovedToBackground() {
|
@objc func appMovedToBackground() {
|
||||||
if(mState == .STATE_VISUALIZING_CAMERA || mState == .STATE_MAPPING || mState == .STATE_CAMERA)
|
print("appMovedToBackground()")
|
||||||
|
if(mState == .STATE_VISUALIZING_CAMERA || mState == .STATE_VISUALIZING_AND_MEASURING || mState == .STATE_MAPPING || mState == .STATE_CAMERA)
|
||||||
{
|
{
|
||||||
stopMapping(ignoreSaving: true)
|
stopMapping(ignoreSaving: true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func appMovedToForeground() {
|
@objc func appMovedToForeground() {
|
||||||
|
print("appMovedToForeground()")
|
||||||
updateDisplayFromDefaults()
|
updateDisplayFromDefaults()
|
||||||
|
updateState(state: mState)
|
||||||
|
|
||||||
if(mMapNodes > 0 && self.openedDatabasePath == nil)
|
if(mMapNodes > 0 && self.openedDatabasePath == nil)
|
||||||
{
|
{
|
||||||
@@ -510,29 +601,33 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
switch AVCaptureDevice.authorizationStatus(for: .video) {
|
switch AVCaptureDevice.authorizationStatus(for: .video) {
|
||||||
case .authorized: // The user has previously granted access to the camera.
|
case .authorized: // The user has previously granted access to the camera.
|
||||||
print("Start Camera")
|
print("Start Camera")
|
||||||
rtabmap!.startCamera()
|
rtabmap!.startCamera()
|
||||||
let configuration = ARWorldTrackingConfiguration()
|
let configuration = ARWorldTrackingConfiguration()
|
||||||
var message = ""
|
var message = ""
|
||||||
if(!UserDefaults.standard.bool(forKey: "LidarMode"))
|
if(mState != .STATE_VISUALIZING_AND_MEASURING)
|
||||||
{
|
{
|
||||||
message = "LiDAR is disabled (Settings->Mapping->LiDAR Mode = OFF), only tracked features will be mapped."
|
if(!UserDefaults.standard.bool(forKey: "LidarMode"))
|
||||||
self.setMeshRendering(viewMode: 0)
|
{
|
||||||
}
|
message = "LiDAR is disabled (Settings->Mapping->LiDAR Mode = OFF), only tracked features will be mapped."
|
||||||
else if !depthSupported
|
self.setMeshRendering(viewMode: 0)
|
||||||
{
|
}
|
||||||
message = "The device does not have a LiDAR, only tracked features will be mapped. A LiDAR is required for accurate 3D reconstruction."
|
else if !depthSupported
|
||||||
self.setMeshRendering(viewMode: 0)
|
{
|
||||||
}
|
message = "The device does not have a LiDAR, only tracked features will be mapped. A LiDAR is required for accurate 3D reconstruction."
|
||||||
else
|
self.setMeshRendering(viewMode: 0)
|
||||||
{
|
}
|
||||||
configuration.frameSemantics = .sceneDepth
|
else
|
||||||
}
|
{
|
||||||
|
configuration.frameSemantics = .sceneDepth
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
session.run(configuration, options: [.resetSceneReconstruction, .resetTracking, .removeExistingAnchors])
|
session.run(configuration, options: [.resetSceneReconstruction, .resetTracking, .removeExistingAnchors])
|
||||||
|
|
||||||
switch mState {
|
switch mState {
|
||||||
case .STATE_VISUALIZING:
|
case .STATE_VISUALIZING_AND_MEASURING,
|
||||||
updateState(state: .STATE_VISUALIZING_CAMERA)
|
.STATE_VISUALIZING_CAMERA:
|
||||||
|
break // State should be already set
|
||||||
default:
|
default:
|
||||||
locationManager?.startUpdatingLocation()
|
locationManager?.startUpdatingLocation()
|
||||||
updateState(state: .STATE_CAMERA)
|
updateState(state: .STATE_CAMERA)
|
||||||
@@ -599,6 +694,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
var actionExportEnabled: Bool
|
var actionExportEnabled: Bool
|
||||||
var actionOptimizeEnabled: Bool
|
var actionOptimizeEnabled: Bool
|
||||||
var actionSettingsEnabled: Bool
|
var actionSettingsEnabled: Bool
|
||||||
|
var actionMeasuringEnabled: Bool
|
||||||
|
|
||||||
switch mState {
|
switch mState {
|
||||||
case .STATE_CAMERA:
|
case .STATE_CAMERA:
|
||||||
@@ -611,9 +707,14 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
stopButton.isHidden = true
|
stopButton.isHidden = true
|
||||||
closeVisualizationButton.isHidden = true
|
closeVisualizationButton.isHidden = true
|
||||||
stopCameraButton.isHidden = false
|
stopCameraButton.isHidden = false
|
||||||
|
stopMeasuringButton.isHidden = true
|
||||||
exportOBJPLYButton.isHidden = true
|
exportOBJPLYButton.isHidden = true
|
||||||
orthoDistanceSlider.isHidden = cameraMode != 3
|
orthoDistanceSlider.isHidden = cameraMode != 3
|
||||||
orthoGridSlider.isHidden = cameraMode != 3
|
orthoGridSlider.isHidden = cameraMode != 3
|
||||||
|
teleportButton.isHidden = true
|
||||||
|
addMeasureButton.isHidden = true
|
||||||
|
removeMeasureButton.isHidden = true
|
||||||
|
measuringModeButton.isHidden = true
|
||||||
actionNewScanEnabled = !mDataRecording
|
actionNewScanEnabled = !mDataRecording
|
||||||
actionNewDataRecording = mDataRecording
|
actionNewDataRecording = mDataRecording
|
||||||
actionSaveEnabled = false
|
actionSaveEnabled = false
|
||||||
@@ -621,6 +722,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
actionExportEnabled = false
|
actionExportEnabled = false
|
||||||
actionOptimizeEnabled = false
|
actionOptimizeEnabled = false
|
||||||
actionSettingsEnabled = false
|
actionSettingsEnabled = false
|
||||||
|
actionMeasuringEnabled = false
|
||||||
case .STATE_MAPPING:
|
case .STATE_MAPPING:
|
||||||
libraryButton.isEnabled = false
|
libraryButton.isEnabled = false
|
||||||
libraryButton.isHidden = !mHudVisible
|
libraryButton.isHidden = !mHudVisible
|
||||||
@@ -631,9 +733,14 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
stopButton.isHidden = false
|
stopButton.isHidden = false
|
||||||
closeVisualizationButton.isHidden = true
|
closeVisualizationButton.isHidden = true
|
||||||
stopCameraButton.isHidden = true
|
stopCameraButton.isHidden = true
|
||||||
|
stopMeasuringButton.isHidden = true
|
||||||
exportOBJPLYButton.isHidden = true
|
exportOBJPLYButton.isHidden = true
|
||||||
orthoDistanceSlider.isHidden = cameraMode != 3 || !mHudVisible
|
orthoDistanceSlider.isHidden = cameraMode != 3 || !mHudVisible
|
||||||
orthoGridSlider.isHidden = cameraMode != 3 || !mHudVisible
|
orthoGridSlider.isHidden = cameraMode != 3 || !mHudVisible
|
||||||
|
teleportButton.isHidden = true
|
||||||
|
addMeasureButton.isHidden = true
|
||||||
|
removeMeasureButton.isHidden = true
|
||||||
|
measuringModeButton.isHidden = true
|
||||||
actionNewScanEnabled = !mDataRecording
|
actionNewScanEnabled = !mDataRecording
|
||||||
actionNewDataRecording = mDataRecording
|
actionNewDataRecording = mDataRecording
|
||||||
actionSaveEnabled = false
|
actionSaveEnabled = false
|
||||||
@@ -641,9 +748,11 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
actionExportEnabled = false
|
actionExportEnabled = false
|
||||||
actionOptimizeEnabled = false
|
actionOptimizeEnabled = false
|
||||||
actionSettingsEnabled = false
|
actionSettingsEnabled = false
|
||||||
|
actionMeasuringEnabled = false
|
||||||
case .STATE_PROCESSING,
|
case .STATE_PROCESSING,
|
||||||
.STATE_VISUALIZING_WHILE_LOADING,
|
.STATE_VISUALIZING_WHILE_LOADING,
|
||||||
.STATE_VISUALIZING_CAMERA:
|
.STATE_VISUALIZING_CAMERA,
|
||||||
|
.STATE_VISUALIZING_AND_MEASURING:
|
||||||
libraryButton.isEnabled = false
|
libraryButton.isEnabled = false
|
||||||
libraryButton.isHidden = !mHudVisible
|
libraryButton.isHidden = !mHudVisible
|
||||||
menuButton.isHidden = !mHudVisible
|
menuButton.isHidden = !mHudVisible
|
||||||
@@ -653,9 +762,14 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
stopButton.isHidden = true
|
stopButton.isHidden = true
|
||||||
closeVisualizationButton.isHidden = true
|
closeVisualizationButton.isHidden = true
|
||||||
stopCameraButton.isHidden = mState != .STATE_VISUALIZING_CAMERA
|
stopCameraButton.isHidden = mState != .STATE_VISUALIZING_CAMERA
|
||||||
|
stopMeasuringButton.isHidden = mState != .STATE_VISUALIZING_AND_MEASURING
|
||||||
exportOBJPLYButton.isHidden = true
|
exportOBJPLYButton.isHidden = true
|
||||||
orthoDistanceSlider.isHidden = cameraMode != 3 || mState != .STATE_VISUALIZING_WHILE_LOADING
|
orthoDistanceSlider.isHidden = cameraMode != 3 || mState == .STATE_PROCESSING
|
||||||
orthoGridSlider.isHidden = cameraMode != 3 || mState != .STATE_VISUALIZING_WHILE_LOADING
|
orthoGridSlider.isHidden = cameraMode != 3 || mState == .STATE_PROCESSING
|
||||||
|
teleportButton.isHidden = mState != .STATE_VISUALIZING_AND_MEASURING || cameraMode != 0
|
||||||
|
addMeasureButton.isHidden = mState != .STATE_VISUALIZING_AND_MEASURING || cameraMode == 3
|
||||||
|
removeMeasureButton.isHidden = mState != .STATE_VISUALIZING_AND_MEASURING || cameraMode == 3
|
||||||
|
measuringModeButton.isHidden = true
|
||||||
actionNewScanEnabled = false
|
actionNewScanEnabled = false
|
||||||
actionNewDataRecording = false
|
actionNewDataRecording = false
|
||||||
actionSaveEnabled = false
|
actionSaveEnabled = false
|
||||||
@@ -663,6 +777,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
actionExportEnabled = false
|
actionExportEnabled = false
|
||||||
actionOptimizeEnabled = false
|
actionOptimizeEnabled = false
|
||||||
actionSettingsEnabled = false
|
actionSettingsEnabled = false
|
||||||
|
actionMeasuringEnabled = mState == .STATE_VISUALIZING_AND_MEASURING
|
||||||
case .STATE_VISUALIZING:
|
case .STATE_VISUALIZING:
|
||||||
libraryButton.isEnabled = !databases.isEmpty
|
libraryButton.isEnabled = !databases.isEmpty
|
||||||
libraryButton.isHidden = !mHudVisible
|
libraryButton.isHidden = !mHudVisible
|
||||||
@@ -673,9 +788,14 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
stopButton.isHidden = true
|
stopButton.isHidden = true
|
||||||
closeVisualizationButton.isHidden = !mHudVisible
|
closeVisualizationButton.isHidden = !mHudVisible
|
||||||
stopCameraButton.isHidden = true
|
stopCameraButton.isHidden = true
|
||||||
|
stopMeasuringButton.isHidden = true
|
||||||
exportOBJPLYButton.isHidden = !mHudVisible
|
exportOBJPLYButton.isHidden = !mHudVisible
|
||||||
orthoDistanceSlider.isHidden = cameraMode != 3 || !mHudVisible
|
orthoDistanceSlider.isHidden = cameraMode != 3 || !mHudVisible
|
||||||
orthoGridSlider.isHidden = cameraMode != 3 || !mHudVisible
|
orthoGridSlider.isHidden = cameraMode != 3 || !mHudVisible
|
||||||
|
teleportButton.isHidden = true
|
||||||
|
addMeasureButton.isHidden = true
|
||||||
|
removeMeasureButton.isHidden = true
|
||||||
|
measuringModeButton.isHidden = !mHudVisible || self.visualizationType==0
|
||||||
actionNewScanEnabled = true
|
actionNewScanEnabled = true
|
||||||
actionNewDataRecording = true
|
actionNewDataRecording = true
|
||||||
actionSaveEnabled = mMapNodes>0
|
actionSaveEnabled = mMapNodes>0
|
||||||
@@ -683,6 +803,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
actionExportEnabled = mMapNodes>0
|
actionExportEnabled = mMapNodes>0
|
||||||
actionOptimizeEnabled = mMapNodes>0
|
actionOptimizeEnabled = mMapNodes>0
|
||||||
actionSettingsEnabled = true
|
actionSettingsEnabled = true
|
||||||
|
actionMeasuringEnabled = true
|
||||||
default: // IDLE // WELCOME
|
default: // IDLE // WELCOME
|
||||||
libraryButton.isEnabled = !databases.isEmpty
|
libraryButton.isEnabled = !databases.isEmpty
|
||||||
libraryButton.isHidden = mState != .STATE_WELCOME && !mHudVisible
|
libraryButton.isHidden = mState != .STATE_WELCOME && !mHudVisible
|
||||||
@@ -693,9 +814,14 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
stopButton.isHidden = true
|
stopButton.isHidden = true
|
||||||
closeVisualizationButton.isHidden = true
|
closeVisualizationButton.isHidden = true
|
||||||
stopCameraButton.isHidden = true
|
stopCameraButton.isHidden = true
|
||||||
|
stopMeasuringButton.isHidden = true
|
||||||
exportOBJPLYButton.isHidden = true
|
exportOBJPLYButton.isHidden = true
|
||||||
orthoDistanceSlider.isHidden = cameraMode != 3 || !mHudVisible
|
orthoDistanceSlider.isHidden = cameraMode != 3 || !mHudVisible
|
||||||
orthoGridSlider.isHidden = cameraMode != 3 || !mHudVisible
|
orthoGridSlider.isHidden = cameraMode != 3 || !mHudVisible
|
||||||
|
teleportButton.isHidden = true
|
||||||
|
addMeasureButton.isHidden = true
|
||||||
|
removeMeasureButton.isHidden = true
|
||||||
|
measuringModeButton.isHidden = true
|
||||||
actionNewScanEnabled = true
|
actionNewScanEnabled = true
|
||||||
actionNewDataRecording = true
|
actionNewDataRecording = true
|
||||||
actionSaveEnabled = mState != .STATE_WELCOME && mMapNodes>0
|
actionSaveEnabled = mState != .STATE_WELCOME && mMapNodes>0
|
||||||
@@ -703,21 +829,20 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
actionExportEnabled = mState != .STATE_WELCOME && mMapNodes>0
|
actionExportEnabled = mState != .STATE_WELCOME && mMapNodes>0
|
||||||
actionOptimizeEnabled = mState != .STATE_WELCOME && mMapNodes>0
|
actionOptimizeEnabled = mState != .STATE_WELCOME && mMapNodes>0
|
||||||
actionSettingsEnabled = true
|
actionSettingsEnabled = true
|
||||||
|
actionMeasuringEnabled = false
|
||||||
}
|
}
|
||||||
|
|
||||||
let view = self.view as? GLKView
|
let view = self.view as? GLKView
|
||||||
if(mState != .STATE_MAPPING && mState != .STATE_CAMERA && mState != .STATE_VISUALIZING_CAMERA)
|
if(mState != .STATE_MAPPING && mState != .STATE_CAMERA && mState != .STATE_VISUALIZING_CAMERA && mState != .STATE_VISUALIZING_AND_MEASURING)
|
||||||
{
|
{
|
||||||
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("diaableSetNeedsDisplay")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if !self.isPaused {
|
if !self.isPaused {
|
||||||
@@ -726,6 +851,23 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
|
|
||||||
// Update menus based on current state
|
// Update menus based on current state
|
||||||
|
|
||||||
|
if(!exportOBJPLYButton.isHidden) {
|
||||||
|
let format = UserDefaults.standard.string(forKey: "ExportPointCloudFormat")!;
|
||||||
|
var title = "Export "
|
||||||
|
if (self.visualizationType == 2) {
|
||||||
|
title += "OBJ";
|
||||||
|
}
|
||||||
|
else if (self.visualizationType == 1)
|
||||||
|
{
|
||||||
|
title += "PLY";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
title += format == "las" ? "LAS" : format == "laz" ? "LAZ" : "PLY";
|
||||||
|
}
|
||||||
|
self.exportOBJPLYButton.setTitle(title, for: .normal)
|
||||||
|
}
|
||||||
|
|
||||||
// PointCloud menu
|
// PointCloud menu
|
||||||
let pointCloudMenu = UIMenu(title: "Point cloud...", children: [
|
let pointCloudMenu = UIMenu(title: "Point cloud...", children: [
|
||||||
UIAction(title: "Current Density", handler: { _ in
|
UIAction(title: "Current Density", handler: { _ in
|
||||||
@@ -787,6 +929,24 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
})
|
})
|
||||||
])
|
])
|
||||||
|
|
||||||
|
// Measuring menu
|
||||||
|
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
|
||||||
|
self.measuringMode = 0
|
||||||
|
self.rtabmap!.setMeasuringMode(self.measuringMode)
|
||||||
|
self.resetNoTouchTimer(true)
|
||||||
|
}),
|
||||||
|
UIAction(title: "Point to Point Mode", image: measuringMode == 2 ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), handler: { _ in
|
||||||
|
self.measuringMode = 2
|
||||||
|
self.rtabmap!.setMeasuringMode(self.measuringMode)
|
||||||
|
self.resetNoTouchTimer(true)
|
||||||
|
}),
|
||||||
|
UIAction(title: "Clear All Measures", image: UIImage(systemName: "trash"), state: .off, handler: { _ in
|
||||||
|
self.clearMeasures();
|
||||||
|
self.resetNoTouchTimer(true)
|
||||||
|
})
|
||||||
|
])
|
||||||
|
|
||||||
var fileMenuChildren: [UIMenuElement] = []
|
var fileMenuChildren: [UIMenuElement] = []
|
||||||
fileMenuChildren.append(UIAction(title: "New Mapping Session", image: UIImage(systemName: "plus.app"), attributes: actionNewScanEnabled ? [] : .disabled, state: .off, handler: { _ in
|
fileMenuChildren.append(UIAction(title: "New Mapping Session", image: UIImage(systemName: "plus.app"), attributes: actionNewScanEnabled ? [] : .disabled, state: .off, handler: { _ in
|
||||||
self.newScan()
|
self.newScan()
|
||||||
@@ -811,6 +971,13 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
fileMenuChildren.append(UIAction(title: "Append Scan", image: UIImage(systemName: "play.fill"), attributes: actionResumeEnabled ? [] : .disabled, state: .off, handler: { _ in
|
fileMenuChildren.append(UIAction(title: "Append Scan", image: UIImage(systemName: "play.fill"), attributes: actionResumeEnabled ? [] : .disabled, state: .off, handler: { _ in
|
||||||
self.resumeScan()
|
self.resumeScan()
|
||||||
}))
|
}))
|
||||||
|
if(actionMeasuringEnabled) {
|
||||||
|
fileMenuChildren.append(measuringMenu)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fileMenuChildren.append(UIAction(title: "Measuring...", image: UIImage(systemName: "ruler"), attributes: .disabled, state: .off, handler: { _ in
|
||||||
|
}))
|
||||||
|
}
|
||||||
fileMenuChildren.append(advancedMenu)
|
fileMenuChildren.append(advancedMenu)
|
||||||
|
|
||||||
// File menu
|
// File menu
|
||||||
@@ -826,7 +993,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
self.debugShown = !self.debugShown
|
self.debugShown = !self.debugShown
|
||||||
self.resetNoTouchTimer(true)
|
self.resetNoTouchTimer(true)
|
||||||
}),
|
}),
|
||||||
UIAction(title: "Odom Visible", image: odomShown ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), attributes: (self.mState == .STATE_MAPPING || self.mState == .STATE_CAMERA || self.mState == .STATE_VISUALIZING_CAMERA) ? [] : .disabled, handler: { _ in
|
UIAction(title: "Odom Visible", image: odomShown ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), attributes: (self.mState == .STATE_MAPPING || self.mState == .STATE_CAMERA || self.mState == .STATE_VISUALIZING_CAMERA || self.mState == .STATE_VISUALIZING_AND_MEASURING) ? [] : .disabled, handler: { _ in
|
||||||
self.odomShown = !self.odomShown
|
self.odomShown = !self.odomShown
|
||||||
self.rtabmap!.setOdomCloudShown(shown: self.odomShown)
|
self.rtabmap!.setOdomCloudShown(shown: self.odomShown)
|
||||||
self.resetNoTouchTimer(true)
|
self.resetNoTouchTimer(true)
|
||||||
@@ -865,7 +1032,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
let ac = UIAlertController(title: "Reset All Default Settings", message: "Do you want to reset all settings to default?", preferredStyle: .alert)
|
let ac = UIAlertController(title: "Reset All Default Settings", message: "Do you want to reset all settings to default?", preferredStyle: .alert)
|
||||||
ac.addAction(UIAlertAction(title: "Yes", style: .default, handler: { _ in
|
ac.addAction(UIAlertAction(title: "Yes", style: .default, handler: { _ in
|
||||||
let notificationCenter = NotificationCenter.default
|
let notificationCenter = NotificationCenter.default
|
||||||
notificationCenter.removeObserver(self)
|
notificationCenter.removeObserver(self, name: UserDefaults.didChangeNotification, object: nil)
|
||||||
UserDefaults.standard.reset()
|
UserDefaults.standard.reset()
|
||||||
self.registerSettingsBundle()
|
self.registerSettingsBundle()
|
||||||
self.updateDisplayFromDefaults();
|
self.updateDisplayFromDefaults();
|
||||||
@@ -881,12 +1048,17 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
|
|
||||||
// Camera menu
|
// Camera menu
|
||||||
let renderingMenu = UIMenu(title: "Rendering", options: .displayInline, children: [
|
let renderingMenu = UIMenu(title: "Rendering", options: .displayInline, children: [
|
||||||
|
UIAction(title: "Texture/Color Blend", image: self.textureColorSeamsShown ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), attributes: self.mState == .STATE_VISUALIZING || self.mState == .STATE_VISUALIZING_CAMERA || self.mState == .STATE_VISUALIZING_AND_MEASURING || self.mState == .STATE_VISUALIZING_WHILE_LOADING ? [] : .disabled, handler: { _ in
|
||||||
|
self.textureColorSeamsShown = !self.textureColorSeamsShown
|
||||||
|
self.rtabmap!.setTextureColorSeamsHidden(hidden: !self.textureColorSeamsShown)
|
||||||
|
self.resetNoTouchTimer(true)
|
||||||
|
}),
|
||||||
UIAction(title: "Wireframe", image: self.wireframeShown ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), handler: { _ in
|
UIAction(title: "Wireframe", image: self.wireframeShown ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), handler: { _ in
|
||||||
self.wireframeShown = !self.wireframeShown
|
self.wireframeShown = !self.wireframeShown
|
||||||
self.rtabmap!.setWireframe(enabled: self.wireframeShown)
|
self.rtabmap!.setWireframe(enabled: self.wireframeShown)
|
||||||
self.resetNoTouchTimer(true)
|
self.resetNoTouchTimer(true)
|
||||||
}),
|
}),
|
||||||
UIAction(title: "Lighting", image: self.lightingShown ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), attributes: self.mState == .STATE_VISUALIZING || self.mState == .STATE_VISUALIZING_CAMERA || self.mState == .STATE_VISUALIZING_WHILE_LOADING ? [] : .disabled, handler: { _ in
|
UIAction(title: "Lighting", image: self.lightingShown ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), attributes: self.mState == .STATE_VISUALIZING || self.mState == .STATE_VISUALIZING_CAMERA || self.mState == .STATE_VISUALIZING_AND_MEASURING || self.mState == .STATE_VISUALIZING_WHILE_LOADING ? [] : .disabled, handler: { _ in
|
||||||
self.lightingShown = !self.lightingShown
|
self.lightingShown = !self.lightingShown
|
||||||
self.rtabmap!.setLighting(enabled: self.lightingShown)
|
self.rtabmap!.setLighting(enabled: self.lightingShown)
|
||||||
self.resetNoTouchTimer(true)
|
self.resetNoTouchTimer(true)
|
||||||
@@ -899,21 +1071,21 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
])
|
])
|
||||||
|
|
||||||
let cameraMenu = UIMenu(title: "View", options: .displayInline, children: [
|
let cameraMenu = UIMenu(title: "View", options: .displayInline, children: [
|
||||||
UIAction(title: "First-P. View", image: cameraMode == 0 ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), attributes: (self.mState == .STATE_CAMERA || self.mState == .STATE_VISUALIZING || self.mState == .STATE_MAPPING || self.mState == .STATE_VISUALIZING_CAMERA) ? [] : .disabled, handler: { _ in
|
UIAction(title: "First-P. View", image: cameraMode == 0 ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), attributes: (self.mState == .STATE_CAMERA || self.mState == .STATE_VISUALIZING || self.mState == .STATE_MAPPING || self.mState == .STATE_VISUALIZING_CAMERA || self.mState == .STATE_VISUALIZING_AND_MEASURING) ? [] : .disabled, handler: { _ in
|
||||||
self.setGLCamera(type: 0)
|
self.setGLCamera(type: 0)
|
||||||
if(self.mState == .STATE_VISUALIZING)
|
if(self.mState == .STATE_VISUALIZING)
|
||||||
{
|
{
|
||||||
self.rtabmap?.setLocalizationMode(enabled: true)
|
self.rtabmap?.setLocalizationMode(enabled: true)
|
||||||
self.rtabmap?.setPausedMapping(paused: false);
|
self.rtabmap?.setPausedMapping(paused: false);
|
||||||
self.startCamera()
|
|
||||||
self.updateState(state: .STATE_VISUALIZING_CAMERA)
|
self.updateState(state: .STATE_VISUALIZING_CAMERA)
|
||||||
|
self.startCamera()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
self.resetNoTouchTimer(true)
|
self.resetNoTouchTimer(true)
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
UIAction(title: "Third-P. View", image: cameraMode == 1 ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), handler: { _ in
|
UIAction(title: "Third-P. View", image: cameraMode == 1 ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), attributes: (self.mState != .STATE_VISUALIZING_AND_MEASURING) ? [] : .disabled, handler: { _ in
|
||||||
self.setGLCamera(type: 1)
|
self.setGLCamera(type: 1)
|
||||||
self.resetNoTouchTimer(true)
|
self.resetNoTouchTimer(true)
|
||||||
}),
|
}),
|
||||||
@@ -927,7 +1099,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
})
|
})
|
||||||
])
|
])
|
||||||
|
|
||||||
let showCloudMeshActions = mState != .STATE_VISUALIZING && mState != .STATE_VISUALIZING_CAMERA && mState != .STATE_PROCESSING && mState != .STATE_VISUALIZING_WHILE_LOADING
|
let showCloudMeshActions = mState != .STATE_VISUALIZING && mState != .STATE_VISUALIZING_CAMERA && mState != .STATE_VISUALIZING_AND_MEASURING && mState != .STATE_PROCESSING && mState != .STATE_VISUALIZING_WHILE_LOADING
|
||||||
let cloudMeshMenu = UIMenu(title: "CloudMesh", options: .displayInline, children: [
|
let cloudMeshMenu = UIMenu(title: "CloudMesh", options: .displayInline, children: [
|
||||||
UIAction(title: "Point Cloud", image: viewMode == 0 ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), attributes: showCloudMeshActions ? [] : .disabled, handler: { _ in
|
UIAction(title: "Point Cloud", image: viewMode == 0 ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), attributes: showCloudMeshActions ? [] : .disabled, handler: { _ in
|
||||||
self.setMeshRendering(viewMode: 0)
|
self.setMeshRendering(viewMode: 0)
|
||||||
@@ -1339,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")!);
|
||||||
@@ -1378,6 +1551,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
rtabmap!.setMappingParameter(key: "Marker/Dictionary", value: defaults.string(forKey: "ArUcoMarkerDetection")!);
|
rtabmap!.setMappingParameter(key: "Marker/Dictionary", value: defaults.string(forKey: "ArUcoMarkerDetection")!);
|
||||||
rtabmap!.setMappingParameter(key: "Marker/CornerRefinementMethod", value: (markerDetection > 16 ? "3":"0"));
|
rtabmap!.setMappingParameter(key: "Marker/CornerRefinementMethod", value: (markerDetection > 16 ? "3":"0"));
|
||||||
rtabmap!.setMappingParameter(key: "Marker/MaxDepthError", value: defaults.string(forKey: "MarkerDepthErrorEstimation")!);
|
rtabmap!.setMappingParameter(key: "Marker/MaxDepthError", value: defaults.string(forKey: "MarkerDepthErrorEstimation")!);
|
||||||
|
rtabmap!.setMappingParameter(key: "Marker/MaxRange", value: defaults.string(forKey: "MarkerMaxRange")!);
|
||||||
if let val = NumberFormatter().number(from: defaults.string(forKey: "MarkerSize")!)?.doubleValue
|
if let val = NumberFormatter().number(from: defaults.string(forKey: "MarkerSize")!)?.doubleValue
|
||||||
{
|
{
|
||||||
rtabmap!.setMappingParameter(key: "Marker/Length", value: String(format: "%f", val/100.0))
|
rtabmap!.setMappingParameter(key: "Marker/Length", value: String(format: "%f", val/100.0))
|
||||||
@@ -1399,16 +1573,17 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
let bgColor = defaults.float(forKey: "BackgroundColor");
|
let bgColor = defaults.float(forKey: "BackgroundColor");
|
||||||
rtabmap!.setBackgroundColor(gray: bgColor);
|
rtabmap!.setBackgroundColor(gray: bgColor);
|
||||||
|
|
||||||
let format = defaults.string(forKey: "ExportPointCloudFormat")!;
|
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
self.statusLabel.textColor = bgColor>=0.6 ? UIColor(white: 0.0, alpha: 1) : UIColor(white: 1.0, alpha: 1)
|
self.statusLabel.textColor = bgColor>=0.6 ? UIColor(white: 0.0, alpha: 1) : UIColor(white: 1.0, alpha: 1)
|
||||||
self.exportOBJPLYButton.setTitle("Export OBJ-\(format == "las" ? "LAS" : "PLY")", for: .normal)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rtabmap!.setClusterRatio(value: defaults.float(forKey: "NoiseFilteringRatio"));
|
rtabmap!.setClusterRatio(value: defaults.float(forKey: "NoiseFilteringRatio"));
|
||||||
rtabmap!.setMaxGainRadius(value: defaults.float(forKey: "ColorCorrectionRadius"));
|
rtabmap!.setMaxGainRadius(value: defaults.float(forKey: "ColorCorrectionRadius"));
|
||||||
rtabmap!.setRenderingTextureDecimation(value: defaults.integer(forKey: "TextureResolution"));
|
rtabmap!.setRenderingTextureDecimation(value: defaults.integer(forKey: "TextureResolution"));
|
||||||
|
|
||||||
|
rtabmap!.setMetricSystem(defaults.integer(forKey: "MeasuringUnits") == 0);
|
||||||
|
rtabmap!.setMeasuringTextSize(defaults.float(forKey: "MeasuringTextSize"));
|
||||||
|
|
||||||
if(locationManager != nil && !defaults.bool(forKey: "SaveGPS"))
|
if(locationManager != nil && !defaults.bool(forKey: "SaveGPS"))
|
||||||
{
|
{
|
||||||
locationManager?.stopUpdatingLocation()
|
locationManager?.stopUpdatingLocation()
|
||||||
@@ -1717,6 +1892,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
let optimizedColorRadius = defaults.float(forKey: "ColorRadius")
|
let optimizedColorRadius = defaults.float(forKey: "ColorRadius")
|
||||||
let optimizedCleanWhitePolygons = defaults.bool(forKey: "CleanMesh")
|
let optimizedCleanWhitePolygons = defaults.bool(forKey: "CleanMesh")
|
||||||
let optimizedMinClusterSize = defaults.integer(forKey: "PolygonFiltering")
|
let optimizedMinClusterSize = defaults.integer(forKey: "PolygonFiltering")
|
||||||
|
let textureVertexColorPolicy = defaults.integer(forKey: "TextureVertexColorPolicy")
|
||||||
let blockRendering = false
|
let blockRendering = false
|
||||||
|
|
||||||
var indicator: UIActivityIndicatorView?
|
var indicator: UIActivityIndicatorView?
|
||||||
@@ -1739,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: {
|
||||||
@@ -1750,6 +1928,8 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
self.progressView!.tintColor = self.view.tintColor
|
self.progressView!.tintColor = self.view.tintColor
|
||||||
alertView.view.addSubview(self.progressView!)
|
alertView.view.addSubview(self.progressView!)
|
||||||
|
|
||||||
|
self.progressStatusUpdate() // This will update memory usage during post processing
|
||||||
|
|
||||||
var success : Bool = false
|
var success : Bool = false
|
||||||
DispatchQueue.background(background: {
|
DispatchQueue.background(background: {
|
||||||
|
|
||||||
@@ -1769,6 +1949,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
optimizedMinClusterSize: optimizedMinClusterSize,
|
optimizedMinClusterSize: optimizedMinClusterSize,
|
||||||
optimizedMaxTextureDistance: maxTextureDistance,
|
optimizedMaxTextureDistance: maxTextureDistance,
|
||||||
optimizedMinTextureClusterSize: minTextureClusterSize,
|
optimizedMinTextureClusterSize: minTextureClusterSize,
|
||||||
|
textureVertexColorPolicy: textureVertexColorPolicy,
|
||||||
blockRendering: blockRendering)
|
blockRendering: blockRendering)
|
||||||
|
|
||||||
}, completion:{
|
}, completion:{
|
||||||
@@ -1789,14 +1970,17 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
|
|
||||||
if(!meshing)
|
if(!meshing)
|
||||||
{
|
{
|
||||||
|
self.visualizationType = 0;
|
||||||
self.setMeshRendering(viewMode: 0)
|
self.setMeshRendering(viewMode: 0)
|
||||||
}
|
}
|
||||||
else if(!isOBJ)
|
else if(!isOBJ)
|
||||||
{
|
{
|
||||||
|
self.visualizationType = 1;
|
||||||
self.setMeshRendering(viewMode: 1)
|
self.setMeshRendering(viewMode: 1)
|
||||||
}
|
}
|
||||||
else // isOBJ
|
else // isOBJ
|
||||||
{
|
{
|
||||||
|
self.visualizationType = 2;
|
||||||
self.setMeshRendering(viewMode: 2)
|
self.setMeshRendering(viewMode: 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1804,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
|
||||||
{
|
{
|
||||||
@@ -1856,6 +2043,8 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
self.progressView!.tintColor = self.view.tintColor
|
self.progressView!.tintColor = self.view.tintColor
|
||||||
alertView.view.addSubview(self.progressView!)
|
alertView.view.addSubview(self.progressView!)
|
||||||
|
|
||||||
|
self.progressStatusUpdate() // This will update memory usage during post processing
|
||||||
|
|
||||||
var loopDetected : Int = -1
|
var loopDetected : Int = -1
|
||||||
DispatchQueue.background(background: {
|
DispatchQueue.background(background: {
|
||||||
loopDetected = self.rtabmap!.postProcessing(approach: approach);
|
loopDetected = self.rtabmap!.postProcessing(approach: approach);
|
||||||
@@ -1898,7 +2087,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func stopMapping(ignoreSaving: Bool)
|
func stopMapping(ignoreSaving: Bool, offerPostProcessing: Bool = true)
|
||||||
{
|
{
|
||||||
session.pause()
|
session.pause()
|
||||||
locationManager?.stopUpdatingLocation()
|
locationManager?.stopUpdatingLocation()
|
||||||
@@ -1913,11 +2102,11 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
{
|
{
|
||||||
self.rtabmap?.setLocalizationMode(enabled: false)
|
self.rtabmap?.setLocalizationMode(enabled: false)
|
||||||
}
|
}
|
||||||
updateState(state: mState == .STATE_VISUALIZING_CAMERA ? .STATE_VISUALIZING : .STATE_IDLE);
|
updateState(state: mState == .STATE_VISUALIZING_CAMERA || mState == .STATE_VISUALIZING_AND_MEASURING ? .STATE_VISUALIZING : .STATE_IDLE);
|
||||||
|
|
||||||
if !ignoreSaving
|
if !ignoreSaving
|
||||||
{
|
{
|
||||||
if(mDataRecording)
|
if(mDataRecording || !offerPostProcessing)
|
||||||
{
|
{
|
||||||
// Go directly to save
|
// Go directly to save
|
||||||
self.save()
|
self.save()
|
||||||
@@ -2013,6 +2202,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(status >= 1 && status<=3) {
|
if(status >= 1 && status<=3) {
|
||||||
|
self.visualizationType = status-1;
|
||||||
self.updateState(state: .STATE_VISUALIZING);
|
self.updateState(state: .STATE_VISUALIZING);
|
||||||
self.resetNoTouchTimer(true);
|
self.resetNoTouchTimer(true);
|
||||||
}
|
}
|
||||||
@@ -2108,10 +2298,10 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
if textField.text != "" {
|
if textField.text != "" {
|
||||||
self.dismiss(animated: true)
|
self.dismiss(animated: true)
|
||||||
//Read TextFields text data
|
//Read TextFields text data
|
||||||
let fileName = textField.text!+".zip"
|
let fileName = textField.text! + (self.exportOBJPLYButton.title(for: .normal)!.contains("LAZ") ? ".laz" : ".zip")
|
||||||
let filePath = self.getDocumentDirectory().appendingPathComponent(fileName).path
|
let filePath = self.getDocumentDirectory().appendingPathComponent(fileName).path
|
||||||
if FileManager.default.fileExists(atPath: filePath) {
|
if FileManager.default.fileExists(atPath: filePath) {
|
||||||
let alert = UIAlertController(title: "File Already Exists", message: "Do you want to overwrite the existing file?", preferredStyle: .alert)
|
let alert = UIAlertController(title: "File Already Exists", message: "\(fileName) already exists, do you want to overwrite it?", preferredStyle: .alert)
|
||||||
let yes = UIAlertAction(title: "Yes", style: .default) {
|
let yes = UIAlertAction(title: "Yes", style: .default) {
|
||||||
(UIAlertAction) -> Void in
|
(UIAlertAction) -> Void in
|
||||||
self.writeExportedFiles(fileName: textField.text!);
|
self.writeExportedFiles(fileName: textField.text!);
|
||||||
@@ -2158,7 +2348,9 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
|
|
||||||
func writeExportedFiles(fileName: String)
|
func writeExportedFiles(fileName: String)
|
||||||
{
|
{
|
||||||
let alertView = UIAlertController(title: "Exporting", message: "Please wait while zipping data to \(fileName+".zip")...", preferredStyle: .alert)
|
let isLAZ = self.visualizationType==0 && self.exportOBJPLYButton.title(for: .normal)!.contains("LAZ")
|
||||||
|
|
||||||
|
let alertView = UIAlertController(title: "Exporting", message: "Please wait while exporting data to \(fileName+(isLAZ ? ".laz" : ".zip"))...", preferredStyle: .alert)
|
||||||
alertView.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { _ in
|
alertView.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { _ in
|
||||||
self.dismiss(animated: true)
|
self.dismiss(animated: true)
|
||||||
self.progressView = nil
|
self.progressView = nil
|
||||||
@@ -2205,13 +2397,34 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
let fileURLs = try FileManager.default.contentsOfDirectory(at: exportDir, includingPropertiesForKeys: nil)
|
let fileURLs = try FileManager.default.contentsOfDirectory(at: exportDir, includingPropertiesForKeys: nil)
|
||||||
if(!fileURLs.isEmpty)
|
if(!fileURLs.isEmpty)
|
||||||
{
|
{
|
||||||
do {
|
if(isLAZ)
|
||||||
zipFileUrl = try Zip.quickZipFiles(fileURLs, fileName: fileName) // Zip
|
{
|
||||||
print("Zip file \(zipFileUrl.path) created (size=\(zipFileUrl.fileSizeString)")
|
zipFileUrl = self.getDocumentDirectory().appendingPathComponent(fileName+".laz")
|
||||||
success = true
|
do {
|
||||||
|
if FileManager.default.fileExists(atPath: zipFileUrl.path)
|
||||||
|
{
|
||||||
|
try FileManager.default.removeItem(at: zipFileUrl)
|
||||||
|
}
|
||||||
|
try FileManager.default.moveItem(at: fileURLs.first!, to: zipFileUrl)
|
||||||
|
print("LAZ file \(zipFileUrl.path) created (size=\(zipFileUrl.fileSizeString)")
|
||||||
|
success = true
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
print("Failed moving \(fileURLs.first!) to \(zipFileUrl.path)")
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch {
|
else
|
||||||
print("Something went wrong while zipping")
|
{
|
||||||
|
do {
|
||||||
|
zipFileUrl = try Zip.quickZipFiles(fileURLs, fileName: fileName) // Zip
|
||||||
|
print("Zip file \(zipFileUrl.path) created (size=\(zipFileUrl.fileSizeString)")
|
||||||
|
success = true
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
print("Something went wrong while zipping")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
@@ -2227,7 +2440,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
}
|
}
|
||||||
if(success)
|
if(success)
|
||||||
{
|
{
|
||||||
let alertShare = UIAlertController(title: "Mesh/Cloud Saved!", message: "\(fileName+".zip") (\(zipFileUrl.fileSizeString) successfully exported in Documents of RTAB-Map! Share it?", preferredStyle: .alert)
|
let alertShare = UIAlertController(title: "Mesh/Cloud Saved!", message: "\(fileName+(isLAZ ? ".laz" : ".zip")) (\(zipFileUrl.fileSizeString) successfully exported in Documents of RTAB-Map! Share it?", preferredStyle: .alert)
|
||||||
let alertActionYes = UIAlertAction(title: "Yes", style: .default) {
|
let alertActionYes = UIAlertAction(title: "Yes", style: .default) {
|
||||||
(UIAlertAction) -> Void in
|
(UIAlertAction) -> Void in
|
||||||
self.shareFile(zipFileUrl)
|
self.shareFile(zipFileUrl)
|
||||||
@@ -2313,6 +2526,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
|
|
||||||
@IBAction func recordAction(_ sender: UIButton) {
|
@IBAction func recordAction(_ sender: UIButton) {
|
||||||
rtabmap?.setPausedMapping(paused: false);
|
rtabmap?.setPausedMapping(paused: false);
|
||||||
|
lowMemoryWarningShown = false
|
||||||
updateState(state: .STATE_MAPPING)
|
updateState(state: .STATE_MAPPING)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2344,6 +2558,26 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
rtabmap!.setOrthoCropFactor(Float(120-sender.value)/20.0 - 3.0)
|
rtabmap!.setOrthoCropFactor(Float(120-sender.value)/20.0 - 3.0)
|
||||||
self.view.setNeedsDisplay()
|
self.view.setNeedsDisplay()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@IBAction func removeMeasureAction(_ sender: UIButton) {
|
||||||
|
self.rtabmap!.removeMeasure()
|
||||||
|
}
|
||||||
|
@IBAction func addMeasureAction(_ sender: UIButton) {
|
||||||
|
self.rtabmap!.addMeasureButtonClicked()
|
||||||
|
}
|
||||||
|
@IBAction func teleportButtonAction(_ sender: UIButton) {
|
||||||
|
self.rtabmap!.teleportButtonClicked()
|
||||||
|
}
|
||||||
|
func clearMeasures()
|
||||||
|
{
|
||||||
|
self.rtabmap!.clearMeasures()
|
||||||
|
self.resetNoTouchTimer(true)
|
||||||
|
}
|
||||||
|
@IBAction func startMeasuring(_ sender: UIButton) {
|
||||||
|
self.setGLCamera(type: 0)
|
||||||
|
self.updateState(state: .STATE_VISUALIZING_AND_MEASURING)
|
||||||
|
self.startCamera()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func clearBackgroundColor(of view: UIView) {
|
func clearBackgroundColor(of view: UIView) {
|
||||||
|
|||||||
@@ -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,38 +236,46 @@ 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
|
||||||
#rm -rf opencv opencv_contrib
|
#rm -rf opencv opencv_contrib
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# LAZ (dependency for liblas)
|
||||||
|
# LAS
|
||||||
|
if [ ! -e $prefix/include/laszip ]
|
||||||
|
then
|
||||||
|
if [ ! -e LASzip ]
|
||||||
|
then
|
||||||
|
git clone https://github.com/LASzip/LASzip.git -b 2.0.1
|
||||||
|
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
|
||||||
|
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 -DBUILD_STATIC=ON ..
|
||||||
|
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
|
||||||
|
|
||||||
# LAS
|
# LAS
|
||||||
if [ ! -e $prefix/include/liblas ]
|
if [ ! -e $prefix/include/liblas ]
|
||||||
then
|
then
|
||||||
@@ -230,10 +284,11 @@ 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
|
||||||
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_UTILITIES=OFF -DWITH_TESTS=OFF -DWITH_GEOTIFF=OFF ..
|
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_UTILITIES=OFF -DWITH_TESTS=OFF -DWITH_GEOTIFF=OFF -DWITH_LASZIP=ON -DWITH_STATIC_LASZIP=ON ..
|
||||||
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
|
||||||
@@ -245,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
|
||||||
|
|||||||
40
app/ios/RTABMapApp/text_atlas_png.h
Normal file
40
app/ios/RTABMapApp/text_atlas_png.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/*This is a generated file...*/
|
||||||
|
|
||||||
|
#ifndef TEXT_ATLAS_PNG_H
|
||||||
|
#define TEXT_ATLAS_PNG_H
|
||||||
|
|
||||||
|
namespace rtabmap
|
||||||
|
{
|
||||||
|
|
||||||
|
static const char * TEXT_ATLAS_PNG =
|
||||||
|
"89504E470D0A1A0A0000000D4948445200000200000002000806000000F478D4FA0000000473424954080808087C0864880000200049444154789CEC9D79FC6D53FDFF5F6FB9487413924844FC88287C2543869006A24832954491211129241245C60A9967C99C0C190A99E729F335DE6BBAD77571EF7587E7EF8FB58FCF3AEBAC33EFE133ACE7E3711E9FCF597BEDFD7EEF7DCED97BADF7B4A4442291482412894422914824128944229148241289442291482412894422914824124312AB5A81C4E006D848D20A926698D92155EB934824128944A204805371BC5BB52E896A00962AF8F84B1779FC4422116796AA15180C0073D75E5EDB9C615B223192C8BEFFA74BBA0758B840511702B702CB1728239148241AA19E75B3B6F15EDB9655EB5815555800B2C1D7A2C0A8B264B6D06534B048C1327C762E5256A700F303B7797AFDB220396B7A32C6016B17212791483432682C00C0CDC07DDEEBAAAA75AA1AE0CFDEF558DB6BBFD06B5FA200B96B0317002F48DA366B1E05BC04FC1D58276F9999DC9D8087244D92F48CA4B7813B806F1521AF851ECB0267012F4A7A43D2B3C0E46C96BA5599BA54013087A48B24AD92354D9534B620719325BD94FDBF80A4F381150B92D511D9E0B3F6FBBAA54A5D122317608EEC9E53FB2EEE52B54E8501BC1ECC849E2A51B6CF2A599B6F01D8B82C5D02BD1ECBE4CFC433C10213B3F64905C83C16984E6BA60187E72CF780EC3C9BC9DB2E4F792DF4D824F8EC43660247E42CD3E787791EBB477D4E0CCEB7D01B0FB03AF0A627F3212A74BD01F37ABABC5C951E89910DB06DF03B5CA96A9D0A0337BBF479A444D93EF3666DFE43E0B365E9E2E934073025933FD66B5FC1D3EBFE9C651E1B3EEDDA70504E7297C6CDB06BFC0F67E578DE6B1B0BCC19EC370F701CB0784E7A2C41EB877F8D99C0F7F39099C9F5D934AFE3F6A8CB977103AE1AE79724779FE03A1C5786DC16FAD4AEC13355EA9118B900177BBF8707ABD6A7508031C10DE0BE1265D798E4B5D51E0433A960368233C3D7B8D96BDFC16BFF7B8EF25606DE8D3CECEECABE880F47B64D2687086E607FEF988F913DE88145A87F206F16ECF797DAE7067C23073DFC99AF7FFEFFA0716090DBE02B38EE1A791DB7475D7CBFFF048A0DFE0B65DFEBC99E42494181C00A91B637323D1A6EBCA4C0E044C1E0E2A0DEF07E0FB95A5C6B0C9A180049619059156967E3236D6F9A59EEA6F60EF0AD0E4F78FF7FDAFBFFB11CE56D2D290CBA3BCCCC5632B34DCCECD3924E09B6CF2169C71C64FB0F99DBCCEC1D4932B3E724F90FDAC56AFF006B4AFA5EF6F61549D7E5A0C7EAC1FB33B2F3FFAAA47525BDE56D5B96C02291132FB5EF520CC0261AF0FB4BD22966F642892AF837B9D925ED5BB4405CA0E9B5C0E3C0C1DE80E79DECEFDB59BF7971568AFB249D56825EBF04"
|
||||||
|
"9EF35EB7152D3331A8D852D2E8EC7F249D53A12EC5033C18CC846E2A51768D7BBCB6DA8CEFE9B2F408743AC9D36B6FAFFD4AAFFD3B39CABB3AB8FE9308A2F07126F77026FCDF1C649FE21DEFA460DB35DEB65F78ED77656D3381CDFBD5213B66786EEB07DB6F0BB62F9093DC1A33C26B5E26C1776B0AB068053A3CE9E9F036055B20802D82CFF41DE012E0E5ECFDFDC0D9D4CFC65E2FFA73028E08F47AAE487989C10570B9F7D9DF5B949C598B3A700F8433FEA915E8F07A876DB983F3FDCEE535F991D07301DB64FF2FE3B5CFEFB53F626677F5A1C21CC1FB37CD6C9ADF606613703ED179BCE68FF621B3866F61096FF80B79FFBF2149C07E1AB83E9798D90539E820357E07E7ABFD03CC23C98F3578D9CCF20E109B145EF3B2C0C5BEACE535DD6266632A50E532497B64FFCF29E9FB9272893569C28292C669E07BFC7E497ED0EF67B297CFFB25ADA97CAC4E89441DC068495FF49A0ACB881BCC0380325D00355FFAAD5EDBE5923E20E98192743842D2A24DB6FDAA49FBD1DEFF474AEA6700302178FF51E0F366169A1E0F50FD43F9ED3E64D6B849D2AED9FFEB02FB4BBA59D2373430E0992EE9065CDAE3CFB2B6F192F6CC417E8DC7E452D16A7C4FD239D9C3FF3C7903024997E628B776AC980BAA2C36937BB0D5B8BD223D6ED0C0004092365081030033FBA3A43FE2525BBF22690DB9D2D7B379DD90F494DCFDE13A49979959F87B4924F2E23B926A712633259D5DA12EE500DC1098BC2EAA5AA732019EA13FFA4A4D03F68B1CF351B2B4C8A2C1E5BBB6E2BCAC9F6F1ADB2B671D7E14917B2C8D01AA4F9093F97FB0009C169CE3D72AD2630E9C19BEC6DBB8BA0465C95F3B93E9737559F23D3D920B608442BD2BAE9F49DDD081461FF4B955EB5426B848F8A3B3979FFEF1A8D77E9DD77EBBD77E347DD62A0016045EA591A9B8E23FEBE675AE4DE42F4EA38FBDC695B8F883EF32502BA090A028E0EE263AD4789C48D4F85027FB3EF92CD47EAFC274792AD065FDF67BE5227711E0594FEE73DEFF0794A183A74B1A008C40B2FBDC5BDEE75EA4FB6BF0005C1A7CE14FAB5AA7AA007EED5D87E3BC763F586E9F02E47E9BFAD997CF4CDC2CBDD0AA7CC046C061B82A88BF65A034F33C0CCCC4A700AB16247FB516D7E04A2A7C301609F53517DEA858975B82EBBE6BFBBDFA96390AB829F8ACD7C40D80C9FEF69D6A1A91BB0CF515506BAF17836B30A549BFFDF2D629511DC04FBCCF7C3AB06491F206730C4015418083057FF535BF20D2A7BCFF732D02244966763EAEF2D9F1AA0F3694DCD2D19F97F4379C497457337BBC001D2E930B040BF9ADA44F64FF9F6466B746FAE4C11672296821CF4AFA8E994DAC3500CBAA3E66E07F66F662417A158D1FDFF066655A3842FF7A1983AEE3349006FA86A4DDCDEC71E054B954D7D9249D003C66668FE628774E49"
|
||||||
|
"9DD43B98BD49BF219F1E888BBFF8719B6E3798D9F165E853315FF7FEBFBB887BECA004577BDDE798AA75AA0A0652DCC0F3C17BB38269B8C0B4A2E48F027E41BD0934E4556083A27408F459C39B893D4D568805B760CDC6C056C05A7DCA9813B8AAC5F9025C19EC13BAADBEDB8F0E55917DDE3E95DE747055207DFE5C82CCBF31E05EDACB6B9F8701B7C02406B26EF292BB529BEF5C3BFE92A73E55006CDFC1799E5AB59E4583BB9FF9D6C7FD8B9639980A014D09DE4FAE448B0AC86E02EFBD247D32DB3445D28CAC7D75B99425C915BE59DCDB67DE3CF531B36966F65BB9B4B79D24FD572E12DA673E4967514EA5B823E5666048DA47D22CC0D9929E977489A433E532045EA2F7D5F4FE2E17715E0349610D880D831B6E1808385423C33F1CBCAFDAFA16DE0BDE1FED952366B699A41F4ABAD4CC7EEFB54F90F40B398BDB3A667646D1BA24462C5B69E0BB3E5D2544FF0F26174078D3A9FA2654267736699FA3C9B68F05EDDB4ACAFDC694E5A49F2067FAFC8AA46335303891DC20604FD5A76DE50AAEF84F6D118C4BCDEC02E03A49B115091794742C30C3CC3A9E19013F95F4E5A0F950497F924B4BF35D2F3FC4D542385BF5AE1A243DD4A9CC41C6CCE0FD609A18488DFA158299FD55D25F23ED67ABB89BF1F31A486BF55957D286DEFBD7E5BE9321A5954C4F148E6FFEBFC3CC0A5F106F300D00C251FF481A00540AAE9EFFFC5ED34C33BBD9EF636657E21625BA45F533B2D50AD46B09493573EC04493FC599D96B0FFF99922E90F4A4A48DE40AB698A45F4AEAC634FACDE0FD7366B65FA6C3E692AE96F4916C9B49FA8D5C3C849F9EF64256BA78281206FDCD16ED551E61DA5F786F183664C5A41A5278818FA97E00F08E99E5BA0AE520E242392B632B2A0D4C2D1A6041495FF09AAE6CD63731CCC0951EADBDFEE7F980EEF1DA7D7FFCCDC13E6BF729FFD4C0DF369326A54E813B82BE63FA91DD46AFCB3C397B676D7EACC8455EDF85A85F5276AD2EE484B10E3704DBBF4C636E78C8E9B99D7805509F7A54E94086FA3C6880D8CC7758434A031C51007B799FF5546091AA754A54007085F745D8CA6BBFC76BCFB5380F7078E481169AC46B7DEF0CFA15B25C2AB025034159B77BED7EA0DEAF837D1EF0B6751C90870B2CF4690882037E804BCB89319D3E8310AB86FA4254552C7EE5EB121685FA5195FA5401690030A200FEED7DD6FF294BEEA0F1F5E12291F7C02DF1DA2E256438B384F7BF9FE253F3BDBF6D667997698DA5D4ED43B0DA5DF6905B2EE897FBEA75B85AD8BF9533B74F95F4D34E77F5FEB72E443E1BBCFF1441EE79E61FFE5393FDFF66663776216F30E2AFFA3717152C04E4B160F07EA8C656248608B86C8FC37195468F02E66FBF576EB217917329D6B8A22CD9832906E05C79BE58606533FB5E8BFEC30E5CC9D345B3B7AF99D99359"
|
||||||
|
"FB721A581AB28819F73FE51E829FF0DABE28E9119C997DAC5C46402C47BE8805517EA7FA9CFF5BBC6D7EBDFCF72AF2E152033FEE6DEB666072B9EA17C2915C7DF8B525DD2DB748D367E402B3627CA80B5983954755BF1CF2E7248D295B89EC73F417987AD3CC4A5B1974A4825B7DF5BDDFBF998D3413F47992FC8A932BCAAD0B51065B6920EE66AA4642ED7F1F606E5C6EBB4FD5C5484A075779AC866FF6F6F3642F2E48F6B691CFA01D4F67B3F5BC75F911CE24FD5ECEBFB76D3B4FFE0CE04C606FEAD792184717CBB5E2AC4FF77679EE2127E67D1DCA04574BC1E7F7EDF72A448F6F057A8CC815F780DD70F136B557AC38569EF2FC65984BC9BA182C64BFFFA9C1F76E2639A757B790EF57BEBCA1FD1EC38CEC0398147C00E3AAD6AB6C80DDBDF33FCB6B3FD26BFF5D81F27F44FDBAE7AD788602170AC215E689D6DCA7BE646B8C4E5D06FE3197001EEEF0DCA7E16A0E84ECDBFF99574376BD277AE77273FBBD0AD1E3F8E09AC652E4123943FD006046D5FA940D6ED2E0534AD601B018F06E3FF7AE61016E35BADA85980CEC56B54E65039CE87D117EE9B5FFC36BDFAAD53172D06129E074E0B5E8A3CF55233C960A57C30316C0653F844179E37175037A3DEEDCB8E0ABB00E7B8D89C045C05AD9757A3ED8FE2EB0659EE75A26C005DEB94CC3A58796AD839F913181022B5E2606A03E10F69DAAF5291B604706B288DEA6A4E70FF02BFFBA57795FAD9CECA6BA29B078D5BA8C74705699B5191819DF4D494B03770A6EF4BC35F063E01B04EE823E8FBD32CEDDB02B2E03606DBA702B0C45B273AC655E009C50B2FC1D8201D59076AB0C2580D7BDEB5E4866CF6007188D5B0CAC14D37F26D35F01F59AB2E426121DC1407AD888F4C58E34806BBC1BD25BC052EDF7CA45EE28EA6B604CA4DA4C841103B07C30F02B24CE28514F36819984B3784F0676A95AA744A28E3400185964960F7F4192AB4A927B6830FB3FB00CB9090997F6E6B379D53A2512894100B0332E3E63C8FAB613DD01FCBACC8731B0116EBDFB1A29EDAF2470F134E3D3B54F24128984A4862579A703852CF804AC437DE6C913C9F45F1EC0260C647F8C0756AE5AA7442291485408CE27EF0F028A1A007C1657CF015C0C40E99907231D6051E02460C3F6BD138944223122000EC0A54516968E07FC17389712CBAF2612894422916803C19A1043EDF88944229148241289442291482412894422914824128944229148241289442291482412894422914824128944229148241289442291482412894422914824128944229148241289C41000987324D7E8CE96CB5CA822D9A3B2853AE6AD427E2201CC0B2C52A1FC05D2F73F3112C9BEFB731729C39A08DE48D28E925696345FD6EF6D490F4BBA4CD2116636A548C5223A7D47D2E6921E31B3FD0A94335AD25E92BE2C691949EFCF364D97"
|
||||||
|
"F494A49B251D6B66F717247F39493F91F445499F94346BB6E92D498F4BBA5AD2F166F66211F29BE83487DCE7FE11AFF92D335B3D6739074AFA4697BB1D6C6617E6A9870FB09EA4AF495A55D247257D48D258335B2AA7E32F20F799F6C3DA663621277D4649DA59D266929695F4C16C53EDFB7FBDA4A3CDECB13CE435D16147495B4AFA9CA4B9B2E68992EE9074B2999D5F94EC44A22AB265B07795B49EA44F499A3DDB3451D2A3922E96744C61CF5E600EE06C6026AD791458A11025EAF55907380518EBC93EB54079EB032FB4397780B7805D0B90BF3FF07607F25F01B6C95B7E0BBDFE10D1616201722EEFE0DC4376CC5B8F4C97B5801B9BC87C3247390BF770CE21B958E8806581FB3A90F706F0A33C6406F2E705AE6F237B266EE5C05179CB4F24AA02D80678AD83DFDEFDC092452971613BE91E2FE2462C79EBB01C70046E6DF018850C007037FC495D9CFF34E0BB39CA3FB40BD90053812DF292DF42AF95817722F28B1800DCD1E53580020600C02EC094163207D3006026392CD58B7BF83ED585DCBCBFFFA3805BBB909FAC00896101F0755ADF6F42EE27EF0130B05D44D014E0DFC03F809723DB2FCD51FE86B807C08C36279FFB000077F3793C22EB45E032DCACE48DC8F6277292BF0AEE811EF25C76EDAF07C647B63F9387FC36BADDD2E47328620030A6E5271F27D70100B02730BD89AC49C013E4FBBD5F1078B58BD7B440A75B73D2E3C8C8F9BE0BFC07B892F8EF3FCF81D0E191E3BF055C035C477C10FA83BCE4271255417CE23309B809B89BF8337197BC95086FF493800DBCEDF347147D17C8CB17BA7FE42463143100D83D22E71ABC000C9C65E2B948BF757290FFA7C8714FC3F9DE6B7D16031E8AF4FB7ABFF25BE8F5B3169F43110380F026BF51DE32DAC85F3DA203C03F816F50B1D919583CA2DF0E391DFBD1E0B8D3806F78DB17061E895C9B3CBEFFF3D238C01D0FACE2F5591D3700F279B85FD9894495004BD0F8807F0ECFCC0FEC10F9DDE53609A9CD42C259CF49917E6B4714D93F271DC201C034DCE827A48801C0D5818CC9C032917EFB45F4D93307F9D705C77C93C8C306D83A22FF97FDCA6FA2D362C0EB117935721D0064F24272195C76A1C33D81FC77819F94A9432B681C283E1BFB9EF478EC7060717DA4CFCE91CF68F71C64EF1439EE61917E7B47FA6D103B660F3ACC83B3425C0E1C45C9994F55CBEF065C66D8C255EB9117D9B55FA022D99B46BED30745FA8593CFBBF2905F8B30FFA2A4F705DBFE157636B31B807172D1D0353E938722199325DD2EE95A49E79BD95300391EBF198B07EF1F33B34722FDEE89B4E591A6B1A706A2AD2569B2994D8BF47B28D23657A42D0F8E92F461EFFD2BAACF02C89BF0613FB5C848F3106053499F0D9A0F35B363CBD2A115B854B830E6E3EC26DF935E0807122F44FA3C1E697B7F"
|
||||||
|
"A4AD5B568EB4FD25D276B2A4DFAAFE5EF545F59F452149E7495ADF7BBFA2A4357238EE5091DF1660690D64881C24E9F86A35CA8DFF27E91AE00A497F32B39B4A94FDB0A49D82B61B23FD2605EFC3E7754FD40600B1995633F3DA8BAA1F002C9A8722723F80E3CDECF59C8ED70D27ABFE41DECCB7F9A148DBABFD0A37B3FB3AECBA6CA4EDA97EE587005B4AF25D0B77481A2B69E3BC65797C2278FF4A81B26284A6F427CDEC0049C265BC2C26970AFBA0998D2D593749DA43921FECF796A43C07272F4BF2EB5D7C2CD2E79391B6A773903D5FF0FE0D336B886F31B3D78157242DE835F76D25CAAC286B05CDAB01F396713FAA5A7E3B808DE5D2C2D795345B41327EACDE2653A799D9CB39A83097DC00FBDBC01D92CE90744AD1E9EED924A7E5440758428DBFBD67735382780050B4F8062E28D0E77FB92912971752581A6007BA9C13E8328388ABA020D9F302F706F2C7E1EA16E429671E9C69B9C6146035E0924076DE2E80DF04C77F14670ABD1F98800BC27C26D3A3DB5A019DC80FDD1D47E25C3E6160E254E00660D5BC7568A1DB1CC0F3811E67E62CE3D4E0F8EF02EB7BDB47D3E822190BCC9983ECCB82E3BED9A26F98A9D060A9EC518771C171DFC8E3B843457E449FD1C03EC4E38E0076CE59DE8B4DE4B463A51C64AFDAE4D863816328D91519D1EF5F11DDB6CC53C0091101D1D1188DFEEAE77353242E2FA4920100B0128D7ED2C24C45B868F483804380D369AC4F301D376ACE5BEE89819C63B3F6A2070027473EEB66CC04CEC30B92EC53F69A11194FB4D1E12DE02B79C8EF40BF304875065E805C4E3296A2F121F40ECE277D36F074E433E8DBFF9FC93E2D727DA3036BE0C9A0DF7F73D261475CEC0DB85A1CBBE571DCA122DFD36305E0245AC7FFC0C81800D4988ACB84D9248F73ED42AF39804B23FA5C94B7A09322423A1D00145A912EA257E90300606E1A0BA44CC39B21152033967150E30D608F0264AE8B9BF9D578AAF63DA0F801C03F5A9C6F334ECF49F68E3DC80677D32ABC4C2DF07020F78682E4AC4BBDF5A7195389042AF521778F888C06FF32B0348DB53A72190064C71F8DB37655527AB84AF9C016C0B534A699863C0CFC8E9CCB4353ED00606EDC84EBDFC4D3B17D1EC15906CBF8DD87963170D97A7D5BDD6ACCDABE4B42D2E992960FDA8E36B36BAA5046D205924ECBF380383FE4911A080643D23E6616069F1445389B9F2EE906494F643AADA2C680D3AD8133CCECBA3E657FB849FB044957C8C53F2C295712D8FFCD7C4CD2CF25EDDDA7FCA6E08AED84B3E1138B906566D7016748DA4F4DCA8467DC21E9AF398AFEBBA443541F50F83DE03E333B49728313497F5263D0EB3B792961661325DD92D7F186827C5C60DFA572A5679BF1A2A42B259D596080DC21EA2D06A06F0B74768F3B42D211B8E2765BCBC5407D4E8DC1764B"
|
||||||
|
"4B3A58D25EC081667654BFF2630047AA3E0E4B7201F21B99596EDFF99AB06401682E3FE61E293C4A94D61600702E8158F474AFF2421FFC85C1F6422D00998CCF03BFCC646D1AD91EAB97705E0E726355181F02160BFA7D3FD22F9762502D74FB6F20AF90CC089CB9F19AE65FB706C691EFF7EFCC26725EC795BE6E569EFCEF79E9301221EEFE026765BC10D8BC6A1DAB02580667ED78A0C9F7AF21553E27B90BE35C8C3E775294D58146BF2F743E0088A50BE5A95B48690300E0F711F9FFA384D50171A6C075810D7079D2E7526F9E073748E83B081057E4C837ADBE4A50E6991206001DE839378DA6C2BE1FC0C06191CF399A5F8EABCEE53333BC5679815B9B22BCF114B210166ECD8D907FE28A906C0E1C4DE33A1563F2F8FE65F217A4D1BF1F23BC1E27E4217FA4427C00F032B02B05AF44375400BE45E3EF1E8A1B00FC389033099709903B3573E6E416DB426609DEC7F61DF200BF92CBCFF77949D2B7CA5889CFCC4253E05F704587FEE0B57D5CD26E7239B9FD70B4EA4DABAF483A8CFA120CA1F97D0E06EAB15F6F6685DF88CD6C1270AFEA53D4F2188C4D8FB48D6BD2F72649FE2A882667A21F93831E21BBABDE143F41CE0C9E2B38337018557C91997DD37B7F0170A75C7A544DA74F643AFEBA5F1DCC6C2CAEAAE529923E1FE93259D23199BCD9BDF6586D8E447F7C44EE9E70102ECBE24233EBDBD2D60AE0443577C5B5E2E76656442AF49A92B692F415E5738FE986D0E5F71F33CBADEC7603349A7F6936E2006E0BFA759AC3DEAB6E21855B007051D76179C6D780CA0B73D0580EB5AF3804DC0A70FD52C848B889BEA746E4F7151403EC15396634CD8F7835BCEFF423BF899C15690CC82AC4F70FFC3C724EEB35E91B6647E4EE0EC3955DFE332E02FA629C1976191AABA6CDA4A099D1480197F6FB3BDA077F8EC5FDF60A097CA6C220404F876570D6C058C96B9FB771EE91D5F2921DE8717620AFB06264B559FE98C8B6A5152F8813964C7C294F85AA06D85ED2E1AAB7744C94B465510130B807883FD37B366201A83156F585533EDAA45FA7F45DC8A85FB21FF1BA41F3F9663626D23DF4834DCD212826F63D5F42526CA19DD8F52EA258CB1EAAB7C24D939B0117412CA2BB59ACC12B72D7A6C6824DFAF58C995D22E992B01D1718E5735BA133A31180994D90B48FA47DB27BDFF7247D418D41A01F95B49DA4ED708B40FDC4CCAE2A53D7A200169774965C45CA5615F6C668A0605D61AE6F33FBAEA4DC56DA6C0BB064649413ABC5BD148D3EB8C30BD62DA4300B00F06DDC3A003E932878511A1AEB0BFCA749BF51345A00FA5E0D8EF6A92FEDE8CB02006C15396634CD91C6C23C7DAF88888B2D083F83688A212E55CAE75D72AE230E2C4AA3BFFDCA3C6504F28E8A5CFFE8779EC69962A185C03CB97BD178EFF96119B2471AB8BCF8B369BD3C"
|
||||||
|
"FA48A903301D57F86B9B3CCE73D04263AEF18B3406829D1BF49949C166F1C80752C80000F81A8D5FF877806F17212F901D9A9CA60161DDF76641897DE7C2E306804BB7795D19C87DD3DBD6D72C10B7CA5D68EE7E98C0B44FDCFC7E4E7F67FFDEB12F8F7CF6EB057D36A5F121745B1EF20339C746CEB3C8551F7789C8BB89A0D012715749A1A9B0B800D5336974C9E5B20CB22767C82CC65316C00238F770587D11F21F002C0D2CDFC3ABEF6260C40700E381BF02E1FA208583CBC8F915EE79BB3F39E6FDB7121A5BE9EE39DC43673FE2E508EF2C41AF902256035C93C6E548C1959EBDA683D7727DCA8FAD853E0D17797F20CE2F158B429D414EABA175A063D185806229684F017F047E817B084C899CFFEAED8FDE91FC7568CCB2780B57A5EE97B86A8CB1A582B7CE43BEA7C73CB878139FFBF3941191B900F1D9DE23B892C807E28A92C4D625CFA51AA0A7CB1AC005C055B88C9B7095528089C08A39CB0D57042D7341985A76C973B55799B23B01B712E90DDEE791EB00A04AA81F003C805B7532D712EB5DEA7371F05DBCAC0CA1A380BB223FB6664C01D62A41AF90220600477471DE31D6EC53FE68E0C11EE49E96D325E844C7A20700CBD3BEFC68C8C939EBD0EDF720DF929C4E87032372727DC836917B7097E70E907B043EB04D1B99E3812FE72C73148D6EB0999458918FFA14C89965C9ED165C49F4D3C8B3167DC5009FC5059C9652DABB1D344E34A690D3B2DFED042F815B7CA51D6F01DB15AE9046C60020D36161E08E0EE5CD20E7875F07FA955108680D1A6BCE37E39F14601A03FE42F3A233A1FCBC17621A45A38F7D5C11E7D944FE31C467DC31EEA180FA07B41E00DC44418B3051FD6240FE00604699B213830B5CC6854F792BA3E266A387110FCA7807E70BCEAD025807FA840CCB0180A7CBEEB855FF6235B9DFC19946BF9697BC2EF42AA5101003DFBF30D80FDC83F9095CDA5A6123625C30E89DC41F868F033F2B486ECC175F48A9D1163A7C39FB8EC5DC1D3319A8855EC8F5A77100F002CE255068453AAA5F0CC81FF8E65BEA3531A4C8BE8B3597DC5B14B0E85B8D56F5BE85F3AF2E2E57A77D9C5C4182094529931800B7D8C6E7E4D26FDE95F482DCF52F747DEAC1042E006739B92245E3253D64660F95287F71B9CF603EB954D087CDAC507FFC600167755853D2C2726B318C97748799F59D75D146EE629256944B777DDACCC616292F903D5AD2B292FE676645A476B692FDBA060AE18C31B3C55AF54F0C6F7041A89F96BBE7549EAA9D4824128902C0C5BFF86EA78BABD629313208CBFA26128944A25CBEA77A6BECB95529924824128944A2047029987E0A72A9E9878944229148242A00D80457D7806C20505A80752291482412890AC1957E3E09D8B06A5D12894422914824128944229148241289442291482412894422914824"
|
||||||
|
"128944229148241289442291482412894422914824128944229148241289442291482412894422914824128944229148241289442291482412FA07BC59000020004944415489610FB030306FD57A24AA01981F58A86A3D128944F9007303A3F33EAEF5A8CC3C926A37A3A7CDEC9DFC546A9075A8247F95AC9992BE6966CFE42CE74E49A35A747957D2DB925E92F4B0A40BCDECF13C7508F4F9BCA41D24AD29E9E39266CF364D96F4A4A4DB241D6F66F7E724AFD5F94F963441D2B392AE96F40F339B9687DC0EE5B7E35766767945F25F31B3F5FB91DD449FA524ED22F7F92F2EE903D9A6E992C6497A50D20566765A4EF2C2F37FD4CCBED3669FE5259D1E345F6D663FEF41FE5F25AD14347FA1C87B4BB7001749FAA4D7F4A699AD99D3B1BBBAFEC019923E13344F96B46D2FF7A55E3EFF3C69F1FBFB9D999DD7E131B690B44F64D334336BB9CC7244FE2449DF30B3D75BECB3A2A49383E67F9AD9BE9DE8DB469F8524FD44D23A929694F4C16CD35B72F7FF1BE5EEFF4FF52BAB13651606F603FE0DBC4C3D338137803B812381D573943B0A184B2387E425C393F56E444E2BA6019703CBE6ACC728E044606A073A4C058ECA496E37E73F06D82D0FB93DCA0FD9A642F92FE671FE812EBF03267528FF1E60B91C6486E77F7707FBAC1AD1E7FC1EE5DF1839D6DCBD1CAB28804702FDC6E778EC8EAF3F705093EF42D703AF5EE41741447E8D8E07F6C0154D8EF16E8FF24F6CB3CF9A917DCEE954DF16C7DD0B78BDC9B9F8BC01FCBA5F79AD1499073886CE6F460033808BC9E7A6B47513190FE7717E81AC5E1F00E3805573D2614EE0EA1E74B8A0A2F3BF829CCC523DCAAF316C0600C0F93DE8F002B0449F72D300A00D0C820100B031F1C9C1D965C82F8A88FC1A93E8C0F509CC0BBCD5E418BD0E00A6D262424B010300E0B826E7D08AB37A95374B0B45D6903333FF44D25C59F35449774A3A4BD231928E93748E9C39E24DEF98DF907413B071AF8A656CD1A47D19609D3E8F9D170B483A36A7631D2B29664E7E4BD2E3929E92FB0C423603F6CB49876EF8AAA4AB80392A903DEC000E93B47964D3643993FF5D9262038E85249D54A06A8941006E907782A4D9824D77CBB90B87237349DABA837EDB68C04D9617B349FA7DCEC76C4A760FDF39B269A69CDB6FACA41991EDDF05FE90A7221B0213BC11C65BC051C0622DF69903D81E78C2DBEF6DE0DB3DEAB020F04E8B514FE87BEC0B1A4780F7E25C1FB5D7F2C096C0354DF459A34FF95FC7594F7CA600BFC69B6503A37126E26941DFF1F41124D6E6FC9706BE059C064C8E9C7BE807CB5B7EBBD79C15CA5FB05FD999FC55689CD9CD044E20980101DF065E8D7C0EDFEA437EB200B4810A2D0038D7E0AD916B340E172F52A8FCA289C8F7B9B183FDFFDD62FF5E2D0035766FB24F6E16006025E2CFBBBFE359D3"
|
||||||
|
"81A5803371F786BA7304D6EB45764C11FFE1FF281006E7B4DA7F0EEACD98E380457AD063BF161F08B81B606E334FBAF3C1DD10D1A767FF5B76CCD8C02216D052EB7F7AA4FF2FFA90DFA909725DDC60C3673A7DBA41BAB9FE453008E49F1DF93CFFDAA2FFF691FE17F5213F0D00DA40B503801322D7670AF0F532E4174D44BECF5460D116FB2E4AEB98A97E07002F13995C91EF00E09C6E8E05FC39D2FFCA6EE5D6B900700FD4D3257D286B7A44D27A667657A70734B32966F66D49FFCC9A1690731774CBA6C1FB1BE522A06BCCA7CE4C43457075A4AD675F386E80B476D0FCA499FDAEC56EB140C82FF5AA43A798D975920E0A9ADF2769EFA2650F57805172EE149F49929A0E2ACDEC643997904FC703F5C4D001D8417113FFAFFBCD7E19C48CF3FE9F4DCEC4DF8C6D55EF1619D7AC638F7C4452AB7B715FE02CBC1B05CDE325EDD162B7BDD5E80E5C0F58BC1BD9610CC0019296C9FE7F43D21666F642B8136EE4FF4B5CD4FFFEC086611FB9D88137B2FFBF4A17D1F2C0CA923E1B349F25E7EBF289F94BCB2096AEF2521FC75B5FD2AC41DBBF5AED90A5FA3C27699AF7FA781F3A748C991DA5C61FD917CB903D4C59438D03C89B5BA520651C21E713AEBD86EBC360C492DD0B7FAFC694EDF3CCECD00A542A8B1B83F7E103B2D5B670DF3CD8823C4CEC71365063FCC2B566F672B31DCC6C92A47F04CDB32A1E43D694F70600C0FC9276F2B61D6E660FFA9D81E5801B24DD22E9377223945F4BBA127810F89AA7E05392CEF414FB51177A7D4FF55FF88992CE95149A38D6A0455C4211E0FCCDA17562B2A42BFA38ECE7226DF7B6DBC9CC3E6166B379AF4FF5A143B7DC16BC9F07D8A044F9C38955226D0FB4DBC9CCFE6C663B79AF580051628892DD6B4E56E3E0F01E49DB97AF51A93CA2FA49D567717527EA005650FD64F125498FE620FF31B9DA2735669574780EC78DF1F948DB1D1DEC774BA4AD65BD83107FD6B9B3064CFF6324D54515E20AD35C24A959D0D3B2922E055637B35BB3B633E48A99985C41834E09FD5AFF36B377329FC8AF3CBD6797FB21FCB28B6377CA07802DBDF71F94B4A8A44DE40A33F89C6C6663FA90154B7379B68FE395C11391B62515778FF4C242B86227AD78CACC8ACA839D1558BA4D9FC97D7EEE35E68BB43558DE4AA693EB3FA87CF4C390632485E9D42F4BDA723015482A8839E5267C3FC8DECF22E706D833E8B78DEA278BFFC8F6ED97B7E52C6C077B6D2B00FB9959DE75683E1A69EB6410F360A46D816E04FB0300DF8C72815FE90D57F9EF4C0D3CFC27CBCDC81F94AB52B64BD63E8BA4F7CC96667617F0ACDC83733160CE765F5C5CD6C0C241F3A5D9F19EC405A7F833A64D54CC00602949ED726BA7493ADDCC7ED2A7AC0F46DA720B302A888991B6D883AC571650FB188F3BE52C5045F019B959482BEE91B4620EB262"
|
||||||
|
"9F7FECFA964927D73F511C8BA9D10D2AB90AA48F95AD4C057C40EE99F303AFEDAB6A1C007C25787FA672720D9BD921C066927CCBC39EC0393957A2EDF5FEFF6A87C76ACA2C9294050ED4CA4A22E76FF7394452ADD0C85449DF36B3ED335FB06FFA9E2E29BC3063B2BFB34BEAA44A60587E72A224BF14E43F83EDCB0061005D59DCAF46B7442F8479BD92FB1C063353226D79E7E18E14668FB4CD0C1B8097706998AD5E69BD80E1C13C8A976ADF16880D0C861BEF37B3FFA87E10BE14B056ED4D76DFF753201F31B39B24BD3F473DF6567DF0F93CCABF36402C9B2D767F0D894D12BA3AF75A0CC0DA7291DC9234C6F7FD030B48FAAEB7CFD941E4A9EF1278235223DE8F546C59D1298B43583768BE31B01A9CADFA0F447251A055B092A4BF037FECF338B1E20E3DADD3502261D0A2E4D64B48744FA79FFF1C1DBC06FBF726D11F7329BFC26383999A193F0C6CDDB2C9FF927459B06FDF98D935AA9F804AD226F45FE4CE27B6AE4A27EB92C4060E5DADD152BB89FB8B4A840B496CAE7AB342581FD9F75F4C5023FEC3BADDE8E47B1AA83A58E312FF4DE606B847D2FF79CD5F01E630B34E464D9DF2801A2B11CE2F17EDBEAB06CCDD266937E03A33EB35107052A46DB0FB573F14696B17B5DE0D0F4BFA719B3E6FB6D9DE0F13D5DE0FF7BF9C64C5CEA3EACFFF09D5FB3F632CA802D3A312EF3143031334495A0DD877986701D49E15A7CA99FD6BCF2A3FE3CCFF7F7AD6D7DF372FF6918BD49F3F7B3F8BA44315AFDAD70BB1FB7F2769E5317F7FEC584DA95DD48F796DCF057D7CF3FA8B66767BB07D7EEFFF98DFC29FDDB41BD584D1F548FA421680E813CE72E697B495A4A685537A60BA99850F804725FD077840D2C59E1E269741D1EB002066CAC9A5C25C81C4F24DF30C5C9B9A9900ABE22933CB658D870E88FD6E62A6FC5355EF66595FCE575C0493CCAC65102039AD819168C985929E56639D8D9F03979BD94315E85406734A92993D06DCA601F7F1C2C02672F75CFF37729BB70A62AE0300337B11B72AED915EF3D2AA8F4FE887D8C4E95392AE6BB3DFFF8BB475153B561B007CB8C501FC45469E8E1CC30FFC8A9D88BF7D6C3345B2148F3085C1D4798DEBCD95EF00A0296676293056F503A74FF771C8D84C32F6E1D6011CAFFA51E07833FB611F7A7443587466AAA46B4A923DDC882DE9DC5037C3CCEA02A080EB54DC0020513DD7CA99B9DF27E96B1AA8D122B919E2B16A2C20365CF01FE297A83E7E6C73354E022FF6FECFCD0550C3CCFE9805A8FB01E83D95B98F705FA42D961A1E122BFCD5367DD8A71603E05FCCD0BFEE3FE4621596FC07FC6B91EDFEFEADA257B7578BC5893A604D5A948B2C80309BA19F55F16E88B4B50C98CCAA477D4FD237BD572995E080ADD4F8E0B9DBCC622EA0447BAE91CBACF1599341560A7738027C17B823786DD7A4"
|
||||||
|
"7BF879E4E9720C1923E99B66362D736DEEA1C67BF35A40AB6A7143197F00709ADC826835D697E417E5794BAE826D8DA21627FB99EAE39CDED7AC63975CADC6A0DFF5B30AA1AD8815E0BBBE1BC1B507AE7F526170971FA11C0BF2F203FBEA060059FA602D4AF3F936E92BFDD6B49E5DD2F7FB3C464764D68A707D839ED3B6CCEC4E35A69CAD1E717DF8ECA0465357DBE241FD92E5C6FF36B2E94F45CB1EAE6441AEE120701EB9625B8962995DCEF218BEEAC80A8E85F9DAB1094F5E8CCFAABD497A2F18EDB448BF5F01615D92E1C07B0FD7AC22A6FF60FBB0EAADD6D7075533F37A30D7616637AB7EA091D771C7480ADD9D9F508BF476E047AA8FDD93A4FBCC2C2CD0D692DA00C05F62367CA8F823AF8F044A2C162811BA0FB6D5C0A8F9BFCD9400BE21572BC0E76649BBB778FD4C8D23E24D9AC9C80BDCFAD067A83175AF5F5FDC99C1FB59259D41642126602349E1F2BFA87DDD829E01E6067691334B862587FF6B6685C91E211CABC6D4CF5D80E82000B742D8270AD76AF873871AAFFBC67E85D16C26F67B354E8E3A5E232527F656638CD63C1A19590117B4D8D6D302543DB2AFE24B72F7CBF16AFC1EEE0B34ACB19259A86255097B5B121C38C95B51E8B260DB2DDEB6376BA34DDCF2949753CFEFBCFD46038F65ED3380355BC8BF9046B6EB40EFDB23FB3595D3E658E16A506FE356FFAABD1E055EA17119C61A61C640B7F2470177478E3B05B809382FBB4EF737D1E1D23EE5B73AFFA769BE34F34BB875CAFBA283EBDFEA15D68EC8437EA9ABA1653A9CD1E41A3F977DF627E05681FC37F1659901C2225A9DCA1EB1AB01E27E532113704BB19E063C14D93E0D3719C84B874E57E3DC82F8EFBF5DC64CB7F23BFDFDE532236E77FEB8FBE3B8C8798F253095D3781FED6535C056ABC1EE10D1A3464FAB0166C78DAD080AF00C702970318D2B52D6E83DFE0AD8CD3BD023C1B67059DE17810B1878B8FBBC0CFC0CD811B8C76B6FFA7002E6012606C79940076BBC0307447438B5DD7E4D8ED56A39C876FCAD1799111D5622FE256FC763F478E3EFF3FC9F21A748F01EE5D7E83B1D2722BF8A01C0DCC07FFBB80E57D3DE6FD84CF6481E007C1BF740EF86E373D6A19B07D0DF23FABC4A1F315011F99D7263AF32DBC86F387FE0D488FC5322FD0A1D0064FD6F68723DFA19008C066EEDE6E2673C423FF16FC02ADEC166E0559A02E604FED744F04CE0309ACF0EC18DAE9B160002768FEC7371B3FEC1BE4BD0F8C37D19B7AC71B7D7A0971FC034E0447ABCE936D163459A5FEF18B7024BB53F725BB9DD9CFF34E06FB8658C73A14BF921C3620090E93127702ECD2D4D3126D1C455D085DC113B00C8E4FF94D6F7B11A3381DCB38DBAB9FEC0A2B8077EC865CDF6E9417EA7DCD8ABCC36F26303807522F21BB220286700B022F1EF4BCF0380ECB873E3AC7D9DFE"
|
||||||
|
"FE6F00FA4F19071EF70E7A5CB06D395C74ACCF4BC08ED9F6AD70E6F1BA8B0E5C449B9929CEBC1DB25D177AC7DC005DAF9445673F8029B81FDE1DC071401E75E063BACC81B36E3C4CFC8B3015B80BD8959C061F6DCE7F0ACE3271277034105BBDAE48F9ED183603004F9FF5812B81379A9CF34C9C05E62FE41004D6CBF9338C0600990E9FC7DDB326457499861B6CE795FA15CAEEF601F49326DF8B9E56098CC8EF941B7B3AE1F6F29BB940FCC951B41017250C00B27DFE18B91E7D0D00BC636F0C5C4F7C903115F75DDCAE5F39EFA5FF01076B20B0EC6D496B99595D900BCEDCBBA4DC8A54D7050B06CD29B758C347E52A02DE686655AF6836E4C1CDEE9791CBF77F57D22B926E49297723039C35EB0B72E9B4A3E502765F91F4404E2B1126027083EA35E5822C67978BF6FFAF991511FC954834059749B78ADCEFFF7D72B574EE36B3A635757A15B410F566A57BC9C3B49048241289446270036C47BDC9F96146C6CA5389442291488C6C70BE6D9F29B8D4A30D5AECB33A704CAB3E8944229148240639C0FEC4D3625EC545F5FF1B177D780FF09AB7FDE8AA754F2412894422D107C07AB8C8DC6ED2913A4ADF4B2412894422512DE18A4A0D00EBC8D5E9FF82A44F4AFAA006CAE04E935B02F60149FF34B3130AD233914824128944D56419037D559E4B241289442291482412894422914824128944229148241289442291482412894422914824128944229148241289442291482412894422D140DB424089442291280E6031493F6FB2F911333BA64C7DCA0438506E09F990E966B64BC9EA2412894422511EC0AA2DCAAB5F53B57E45023CD6E4BCDFAD5AB791C02C552B904824128944A27C86CC0000180D8CAE5A8F2AC8CE7D81AAF548241289C4F061D6DA3FC09D9246B5E88BA42992264A7A4CD275667659518A018B48DA45D2BA9296903477D63E49D29392AE9774BC998DC9495EBBF39F29E96D49E3253D2CE93233BB2D0FD9115D5691B4BDA455E4CE7DCEAC7D9AA4E725DD23E9AF6676750EB27E20779DF3604733BBBD071DD69414FA392F35B3035AECB3A7A4AD83E603CDEC922E659F27E9FF05CDA799D9511DECBBBFA44D83E6FBCC6CBB2EE4FF50D28F83E643CCEC6F91BE0B48FAA7EA07EEDF36B3C7227DBF22E9B741F34966767CD0EFEB927E13F49B29E9FB66765F0BBD2F94FB6EFAFCDBCC766BB64F17C739CACC4E6BB3DF619236089AAF32B37DBA919F1DEB2AC5FDD0DDB0B799E569AE3FD4CC7E91E3F1A2642E868F784D8F99D9B78B965BC3CC96CAF43847D277CA92DB0AE0EF9216CFDE3E67661B55A94F2900EF76B1EC6F8D0780AF15A0CB7EC0F80EE44F00F6CB4966B7E73F13B809F87C1EF2331DE6064E07A675A8C3A5C0427DCADCAFCBF36EC5BA3DEAF0F5C8B14E6DB3CF11917DB6EF41F69191E3DCD4E1BE0F45F63DA8"
|
||||||
|
"4BF91B468E717493BE5B47FAFEA449DF43237D3769D2F7EE48DF4B5BE8BC55A4FF5460D56ECE3D3BD64F23C7BAB7CD3E0B0213837DA6F5223F3BDE73111DBA65F35E6467F2633100E1E0AD1080D302B93380CF96213BD0E39C408F4A620080B570F7769FF5ABD0A50CFA75012C27E9EFC0AE79282349C049920E96344F07DD3F24E960E094BCE47781495A5DD2B540380BEC1A604E49D748DA469E65A60D1B49BA92E41EE88733E5AC5B3E2B01F3B6DA095846D23241F37449677429FF06499383B6A59BF48D3DE0FEAF49DF50B7A97256B318FB4A9A11B47D0D58AF49FFD8CCF42C33BBB549FF561C2BE989A06D059A0C56327E2AB72CB9CFE53DCACF8BF03B345408EF9DB348FA41158A0C1276546376DC0FAB50A40CF28801984DD2E13893635F00BF51FCCB3753D2384963B3FF43BE071CD2AFFC1E994BD209F4BF3CF2E19262D684D725DD27E92E492F47B67F465274C698688F99DD2BE981A0790E499BB5D9F59B6ABC51DC6E664F76297F8AA44782E6A59A74FF5CA4ADD96C2D3CC6E36636B1890ED748FA7BD03C8BA406170CCEF5120E505E91F4CB267AB4C4CCA6498AB95BA2938A6CA01CBA7EDE55A31BA34C9E941BBC0F39CCEC3F92EE0F9A37AE4297AA01E697F4D5C8A60DE9D3D23A58693500B84FD2C783D70A723FCC3141DFD9D5E70F10584DD25E914DE74B5ACECC1634B38FC9591DCE8FF4DB1358A31F1D02C2F35F42EE87F157B91B8ECF7C92F6E855507653DB326C967498A445CCECB366B6B2997D54D23E72334D9F6F01CD668DED38468D9F73ED15B3AC6CD5A2FF7F7AD4A16AFE11696B67F68BB93B2EEF517E78035E38B4EA00A3247D3AB2EF92A1B522FB3E2D16F47BB08D0EFB487A23685B0D78EF7B09CCADF8F7FC0F6636B6CDF19B62667F52E32068CD26BFE75D258516AF8BB2815CAFACA2E6DFE9F0FEF74AB0EF3449BB341B5C0D112E0CDE2F046C558926D5F22365B16672F16EEF64FFCF2969A74A342A0B1A7DE077B7E8BB143029E2B75AB90FF917468ED7D40F0C9C12E97F711FF2BB39FF0323B2EFEC43F6EA91E3DDD0A27FECDC730F1802FE1291D3CA34DBAB9CCA6200B2632D4563DC4578A3F7FBCF03BC13F49F0C2CD8A3FC9D22E7B259D0E7CB913E35BE13F4DD20D2A7ED0015F87564BF87BDEDBF8B6CEFE7C1EBCBFE7EE4D81745FA3D11F4998C73C7140E705944C7BEAD6F54180390C95F10783B907F6559F2331D2A8F01001EF5CF1F1763552374530D0B7A72016451C7A1C95092D6E9E578B8D94E687A7945CED7D78C3DD568122FCB5473881AFDB6FD4411C7E21D9E69D1FF1AB911AAFFEA378A79C4927D9FEF0A9AE7C745C8C7D84CD2FB83B69BFA9805FF4B8D3EE4D0B4BF668BFDBF10BC5F29D2A7E980D2E360B90C1F9F6570817A0BABD1173A53F17880AE31B353E4AC6E3E5FF11FEEB88C953063"
|
||||||
|
"E002330BAD07B903EC2C29FC3E3CA0E615FC860CD9F7F65F41F33AB84CAC1101B0B1EAB381CE967496F77E098241F970A09F188087236D1F89B475C206727E579FABCC6C42B31DB26D5705CDB34B6A16B8941B99DFF2D5A079B63E0E197BD8AF8F2B111A937F9E99BD3F78E516883942B922D2D62CC325E61E681A35DF8E2C6EE085A03934F7AF18BCF7070C616C40B8EF2BAD52FA3C3DA649DA5F8D83913D140FCCBDD8CCFED9EEB85D7058F07E76B9817E8DD00CFBB64AF0FD67839050CE64493FCE623886036705EF6797B443158A54846F3D7CD1CCCECE52719FF5DABF57B24E85D3CF00205694279C1577CA2A91B64EF2C96351BFB163E50A30871AFD904D072BED30B387D438F35A48D22DC05E389F6EA258CE948B94F7F96293BEA16F7A921A6FA0DD12FAE8C320BEE5BDFF5F527DE4FCB2B818811A615D83873A55C2CC2E50E3C07A6149DB066D6FCAC50DE486999DA7C6DFFDB73213F5466A1C049DDD6DD0658F9CA0C6C1CF1FCCEC9612649742F6B01B1334F79DDD3414C8265AFEA0FED226FFAF0B2C598E56E5D0CF00202CC221B968D85E88A5B17562D68B5921CA4889FB8DDC08D9278C24EF96C3D538F35A306B7F36F3918D881F641598D9736A1C502E09F80FDE5A819DD0D275430E4160F704EF17C305DD099797BD40D0D7EFFF41496B79EF433379DBD97FC0BE6A3F983FBEA087EFA1C1FB0FCAB902430BD74439575CA1E016AB593D68BED5CCF62F5A76058445B4966118E7C07BFC5803F7F3997281DE35FEAA8114D9D9E40205870D5D0F00808581D3D5E8677C4BBD9B41C39C5E497AAD83FD5E8FB4E5552E78B62C38A7F65A13D81E57252A8C4D9829E9E47E84653ED003D418E12FB92C83EFC8D55C781117003762FC73251256B634B9743F9F5855B0583C4CB784B3C9D924AD96FDFFA560DBED6A1CACAC29BD574572EE605B57152BCDEC7E4927B6E8F2A4A4AE0A1E7521FB52496121A6EF4B5A3B683B231BB41506AEB0D0DE41F344B95CF1E1C8496ABCFF6C57811E65E31771BAC3CF2831B30755FFFBD92CB0B60D695A159C591A0847F8B3CB059BC5F63BA595CFBE0D614095D4993B615287C7EA856525FDB7C3BE7FCCA32CAF99FD06B8596E16D4CC95F131B901C8F78023CCACAAFA07C391B3E47CDDBECB651D39BF788DD02DF09AA40B72907DA35CDA912F7B4539737C985D739DDCE0170DD422A899C7C3EFCD3435067875C221723EF7D0D225B952C945FABE7F2BE94A0D9CDB8783ED1354F0EC3F73F3FD458DF79383B287C2B0C3CC1E01FEABFA80D30D81D1433CCDB1299975ED010D5870CF8B743B5EF52EDE1524F59CF53528A1B752C0356EE8C74F0D5C1F3966DBBC7660F1C87E1D95718D1CAB97F39F82AB499E3BC00EC02DB8D29CADB8948246A48C9034C0E0B857463EE3F9B36DCBD35826F4DC7E657AB2EF8C"
|
||||||
|
"1D1B78DC6B7BD9EBFFB4D7FE62D67662708C989BAC135D0E8B5CDF1A8F50F02C08B8B685FCC38B949DC93F3622B7EF417E135995A60106BAFC28A2CBEE25C8AD3C0D7024D26F25C0E9723E928DCCEC9D769D5B109BC97FA883FDE68BB4F5A347374C93B4AE9915920664662799D96A7233BA13243533776E2437424DE443E8C69A5D035501375563F5BF3C66FF35C282404BE1D2EF16F7DA7C7FBE1F07F03160393556E9EB3A360537F80E1728F2595A39A5FFB5E010C5AB7EBEAAC66C815CC1AD6F12661CBCA6D6D764B870BA1ADDAFA52D0E942897560300E41E72B5D7BB727EFEB1723E9163257DCECC7630B3D803BC1B62BEFC4EA22D3F15691BD7A72E3526C8D54EAFBD4277C828B5AF16D73766769799ED64669F90F45D49B1C22BDB5252319411C039727E5E9FDAE71C56FF7BD1CC7A2E3E1521342B7E4A2ED8D6FF9DDEE1FD1F46CCAFA7C6DF4458DFA0130E932B71DD8ADD6992A69A076676A3E2E5754F36B3D8FD22177055158F51BD9B1349FB98D95345C91D2C6413B9B032E6FF51C1024189E2693500B8D7CC66F35EB39BD9DC66F631335BD5CC76CDD11716CE7CA478319390302D48EA2C7BA0139E31B3756B2FB9457AC200991FD166D1984E00D6C1557AABBDA2258DCDEC1C398B40E8E6984D52EEA6F91209D3EF24E97D6DF6896DEFDB2F9D0D66C3457356C315AB0ABF9361BA5CBF5CA7FA4C90B9D41884E817F4091F905F526316CCBFBB5100E7E209EB1FBCA646CBC88724FDAE9B63F7C0B391B6A2D3FE8E556319E5BF9B595F41BE438CB440D008218FC580F2E01A35A6C07DB983FDC23E28FF9BB224295B692C1C19CF2F298FE588CF925BE7BDF66AEA57CE8AB5C46E468BE6A04755BC14696B57542A96EE9997F5278CEA9F4FF1D4CFDCFCFFD27B05819E0F9A7DABC30433BBDEEB7FBFEA0B0885168AD7CCAC630B40E6D73F448D6E8EE3E42ADEBD1DB47F1388A5030F4980AD256D11343F2F69970AD4A98CB440D0C861500C00CCEC5135A6352D418BFAF6B8DAE661C193BBB29B62511C22E70EF1F93EFDA7E48555E03E06C4AC1B35C21BB434749723955C11A4D0ECBE32104DE9CC1E54AB05CD53D57F2D861A17A8B1D2E336C1FB27CDECBA9CE4F9845635BFC264ECBBEDBB84C26A941D1700CAD84F8D3104CF483A2C2B971C0666BE4F8D79FB4312605149BF57FD6F6B86A49F9A596C15CEE14E5A20680430280600197F8AB4ED4F641113E0876A4C03422E7DA830CCEC4E35E68A8F96F4AB3E0F7D63284A6E89E1864C08601EC56724ADD60E18D464568D7000F86149679215C3A9913DFC4F965B9DCDE75E330B1FDAFDE813A6CE85B3FF3C4BE0FA8405817CEE88B4B5AA98D97101A0CC9FBF5B64D3615ECADF416A1C187D1688ADE239D4F8B31AAD4AA79B59F8201C299CACC680EA70C5D2C470812E56C32B5087D88A80"
|
||||||
|
"004FE2D2DD2E01FED7A44FAF4BB1D6647774FEC00AC0D4A0EF3BB1877517B21706C645CE690A2E1DEA445CDADB39C0CB917E932920208B92D2003359EB134F791C87FB5EFC813F094000002000494441540538171813E903B0797B295DE9F38D2672C0A502F6BCF2651BB9B195FC6A6C18E9BF4A8BFE1D476F031744F66F701F00BF8AF47B851E57426CA353ECFBD777AA6744CE1E4DAEDFE3B894C74E5E3DBB0219446980815E97063A4DA6A00264A434C06A61700C00E6A53117BA13EE24CBD5EE437637CB019F1BD1A12F7F302EF86F7C0FE70EC5D522286D0090C93BAAC7F32F24400B78A189BCC2DC4CC028E0AD88CC3769927B4F7CF0388D0E0354810D81E9C1FE3389AC8608CC811B90879CD6E7A9C7F42A6B00F074444EB71CD787FCC13A00D82CA257218B2F9106009530985C00CAD27BBE246766EFD4A73D5DD29E79997F3BE4103546AE7F933E66856676955CA04D377EDBE9928E2EAA1641D998D9EE7291E5B1AC8018D3251D6B66B93F14329A059416B6567AE67E8865B23C906D8B1133F53FD145BADCA16ACCAAB8C6CC1AAC6A993B205688674B9A64AF0C015A55441DB18CE40582460A836A0020496636D1CC3696ABCFFC6FB52F093CABA44B80EF16AE5C46B67ADFDF82E651927ED9E7716F32B3E524ED2CE93F6A8CBAAE31516E90B441F6D01C3698D9BE7275DF2F9034BE49B789922E96B45EC1CB20C7AC3A33249D51A04C291EECD72A9A3F1607D0518A2EF073D5AF3428B99A1F0734DBC7CC4E8CE8334AF181416268335217081A11C4A2C907153833E6FFC9D5C09F45D21B72CB90866BA0CF9074A499858B770C597001702BCB9DFB07E52A263E99A5248E0880D5E4F2B26BE7FF6C96A694480C0B708B0E85EB8E1C6A6645575B6C0BAEC0D8FDAAB7929C6B66B9060402E7C82D7856639A9985592DC30E60867A9B886F6B66454F440627C09CC0794D7C713FAC5ABF442291E89426310027E3E2823A298856B47ED7E202006BAF97E863ED97E0D86B64E719AEC13122620068BFD64B33C2B4E49107B01F0311F9D381A666CB442291188C341900D48895431E36008F3539EF340028610030A4835FCCEC10E01149474BFAAD99FDA56A9D1289442291E89033D59B0BE0E9BC1519B250F0D2A48944225114C90230722D005533A42D00355AA447251289C460E769355F6FA0D932E0C3855F4B9A27D23EA36C45128944229148241289442291482412894422914824128944229148241289442291482412894422914824128944229148241289442291482412894422914824128944229148241289442291482472C6AA56209118AC006B4BFA94A4D924BD28E93F66F67AB55A25861BD962667304CD53D21A2789C201460377042B31BD03AC5CB56E65016C1F598D6AFBAAF51A6C8C94EB041C0C8C8B9CEBF155EB5604C07E91735D"
|
||||||
|
"B7641D96054E04FE06EC5CA6EC4CFE4AC029C0F9C07625CBDEA6CADF15307744FEA965C94F54C7AC663611D854D2759296CCDADF2FE91849AB56A659225101C0A592366AB2796699BA8C148005255D2BE9A359D3B780F9CCECD725C95F42D2351A58956E73602E333BAE0CF9894455CC224966F682A46F491AEB6DFB3CB077255A25121500ECA1E60F7F292D515A14EB68E0E15FE3CB25CAFFB21A97A4FD6A89F213894A98B5F68F993D086C29E91249A3B3E67D808BCCECC94AB44B24CAE53B91B63B255D2F69AAA4FBCA5567C4304612AA8F497AA964F9212F96283F91A88459FC376676A3A41F487A5AEE473151D26EA56B954854C3A783F78F485ACDCCF631B303CCECE22A941AEE98D92D920E95F4A69C95E52E49BF2A51FE15722ECFB7244D9774B3A483CA929F4854C5AC6183995D28E9C20A7449242A03985BD29C41F35D2912BB1CCC6C3F49FB01739AD93B15C8DF4DD26E55C94F24AAA06100305800464B5A5ED287254D92F488998D6DBD57217A8C92F47F92E695F4A299DD5DA2DC65252D24E95D494F98D93365C8CEE42F2F691149E325DD51C583105852D2627296AAE7CDECA102C585695892BBEE95002C266929B9C0C387CDAC329334B08CA4C5E566C8B717F980ACFAE15BB5FC4423DE6F6186A48762CF81EC7EF919B9FBE50449B7E575CF0216970B909F29E93E337B398FE376207769499F90738D157DFF1B1C003F01EE02DE0DD252A6030F007B15203396DEF603E030E0D5A07D2C701410CE16F3D26525E052607C207726F018F0ABECCB5E08C0FEC09840F6ABC0A14DAE53AEE94AC03CC011C0D311592FE252C516CA51DE89D9B50EAF37C0646FDBC379C96CA3CF36C0FDD9E75DE35DE0066055E02C4FA7F1C08939C88CA601669FF7FF82F6B771A9728BE471BE99FC3983731A0F1C9BD7F18780FCB66980C062C0A3113DFF9083FC4AD30081EF46CE6B34B025705FF05B98065C8B7B38D6743F1E7839D07F02F0273AB84F03BB06B29FCDDAB726FE5BBC1658A1A06BB1307012F07CE4331987FBFD2FD9FE48430C605EE0FAC849C7B809983747D9B107DB136D74B8999C0701C04EC0940ECEFF765CEA54AE0097B591FB78A42DB70100B022F1077FC80BC02A39C93CA703790085CFC0813F527FB3099910B93EE7E420373600B8B0CDF5788A9C066254FF00AA5A7ECB0140A6DF9D913ED792C36460109C7FECFEFB575AFF169E039600EE6DD107E0860EE4FF3CD867266E12D28A57816573BE0E5FA671C219E34D608B3C64CED2BE4B699C2B69ED0EFBAE2EE92F05EA22494BB4D9BE9AA423F212067C432E1069F60EBAFF9FA4BE6FFC81FCC3247DBD4DB74FE5293390BF88A4CBE44CFEED5848D205C0FC45E95336C08F25EDAED6D5393FA4CEAE4F1E7CB3CDF64F4AFA6D198A2474A6A49582B607246D318C6354B657EBDFC2"
|
||||||
|
"C725DD21A9DD4C7C2DBA2F2C65927EDAA6CF7C920EEEF2B84DC115DE3B3F3B6E3BE696741AB041BF7207450C00B089A4F582E6FB241D25579B6065497B69203D5192360196283845F12549FF928B41585E6EE0E1B32D7044BF3AE046F1BF97E48FE6914B3F7B44D2FC92BE22E983DEF6B580ADCDECCC7E6467F21791F4E3C8A67B24DD26692E49EBCA3D788BE258491F0BDAC648BA51CEF7B7AAA465BC6D8B48FA8DA49DFA947B91A427E57E0BFB06DBFE2B57204B7211EA8580B324ED1FD9F4BCDCF76FAADC8DEEF345E9D0848724DD2A3751F882A4A583ED5F2B599F11077094A48D83E617246D3602CA523F25A936835F432E0EC0A756BBE151B9CC8D5172F7A98F07FDBE21A9972A9E4FC8DD7F246915B918039F3CAB65FE59F5F777C99DD7BFE5EE7FABCB3D836ACC2EE9386099213F08048E8B98395608FAFC32D267979CE4C74C507787334CE0CF917EBFC941FE0F22C73D3CE8B30AF056D02797B4349CDF3FE4C2A0CFFCD93509E9DB05808B7B98161CF71EFFFA037300D7047D5E0362C17BBDE8307FE4DC4ECAE3D81DC8DE3922FB1E0237177060A45F512E803322FD6E8AF45B3107F9559BA0AB961F7501E07CD3A119FC0D608D9CE5577DFEB1FBEF0D782E566014CE1F1F72359E1B04F73B1E1BF479AE8DFCD005007039C1BD05E77209E9BB5A2EB059E4B8D710B87788BBE5FA2A9B3D585C007F92F425EFB5AE99854557FE13D96F8102753AC1CC5E0DDA0E91148EB6BE9083AC7026354D817BC1CC6E977479D02FAF6090F0868202F356762D4EC8495EC8966AB446EDE75F7F339B22972BEE33AF5C15B9A14EEC1C7E13CEF0CCEC4095578EF8F448DB9591B670B695C887A5251DA67A33F8BB927634B39BAA51A954CEF23332B2596EEC1970B03F03CEEE19F7047D3ED483FCE3B37B8ECFBF22FDF288C5FA56A4EDA0C8CCFE1772752A7C42EB50570C0A1780993D2267EA96F4DE686F75B9D4A30FCAADC61696EA54D65E140D655FCDEC05E021499FF59A17CF4156184CF26893549353E5CC5235DEC841B6D4E8DB7F3C3200938A2B85FBB9E0FD6B92C69045FA7ABC2CF703F0BFB79F55FCC13494F87FC1FBE70769D1A1F191B6B94BD76264B0AB1A5D82BF30B3F32BD267303029D23639D2F656F0BE93B8AA4E88DD6F3F90C371C3388627CDECE6B093993D0EDCA57A5760E896E88A413100A801AC25E96792BE28E7771E8C8C0BDEF732BA0C09033F5E897532B36BE4162DC99BF01CCAAEB7105A72E69337206C436ED92015F2E1E0FDF39568D11B6949F16208A3FB276B201E25D11D457E47F3387618CCDC2AE3E839D50F00FABAFF0D161780807DE55604FBAA06EFC35F6A0C06CBC3071D1EA3B080B30EE54F28597E3F9FF7FB73D3A23AC27318EEC15D89EE9953CE559A187E84E9E4314B5B8D89C1FB59819E5DE183C202007C5D2E"
|
||||||
|
"A2FB7D5EF33B7211DAFF9333BD7C5883A33E77F8B00CFD44BD3045F566AA5C02DBBAE0DD407E21458E5A10FAB5BA6138CC40A706EF47477B25463AAB02FB9BD960B80F26F223BCFFB79A1085AEF019FD54261C140300493BABFEE13F59D2D7CCECBD220EC04A1A1C038070B495C76C7D82EA6FFA9DE482E6C944D5FB723F52B2FC099216F5DE8F5563CA4F33F2188055CD04D55FF3DC8B3C25862457C8997BFDFBC1DEC095667657453A25F2E775D5DFFF5BCDE8C365B3FBB2D60E161740B80ADB9DFEC37FB090A5A584816979D4E70FFDDDCBE216A709E51F82AB80557BE5150D1CD6315816577F3BA4A8D9F603C1FB05256D606693622FB911F294ECFDD0CE81753C16BC5F0258B3124D128385CB246DAAC649CF07945C01C38D0783F79F06960B3B010BCBD5C4F1E96B7D80C13200084DDE31BFEE97CA50C463EB300F54D21E6A34CFDE9183ACAB83F773CA5945DE039713BE855CDA55ED95574A5818713A4AD2CF03F9734BDA2E277921B1D5278F6CF223585E2E56A4B43CE5120807BB26A961CD07604F0D9EDF6CA2582E33B3696676AC068AD1D458991CEA8F24060D5704EFDF2797F217B2AF1A331AAEEA47F0607101BCA07A33D7CAC0C9922E911BF16E2C69F3C87EEF8BB4E5C51725DD035C2967225F4ED226419FE992CECA41D65FE51EB87E25BC83B287DD4372F10F9BAADE4C2E49FFC841B6249D22694FD50FBC76CCAC00B7CBA5627E4505950236B32B80FF48F267BD1F97742B7099DC0CF97D72292F5F92FB4E7C1A78C5CCDA95EC1C0A9C2CF783F7A381BF24E92EE02AB9EFD9CA2A7F109C181CEC2A5795D2F70DEF095C91D507490C61CCECAFC0CF54EFF6DC02F8B85CE6C774B95A2D61B5DC97D4A73568B00C00FEA6C65CC8EF67AF56141D2CB5B41A4DFE3E179AD9FDFD0A31B377805FC8CD6A6B66F6517233FE66DC2FE98FFDCACEE43F83AB7AB76BB069FDEC55063BC995BDF41F821F90F49D16FB6C0C1C90B905862C663609F8AD1A3FCFCFA8CF3CDFC4D0C7CC1E048E907480D7FC7E49C703AB0E1337D84867374997AA7E86BF5AF68A3143D2CFFABDF70D1673E2EF25FDB34D9FD7D458E0A1DD823DBD325D8D66F19047D4F8C0EC19333B5DD281EACCACFF90A46FE6FCC3FFB91A4D8D2137AAA0624066F6A89C85A565D94E8F07246D3AD41FFE35CCEC28394B502B5E932B08931861645520EF0D9A57D4E0088C4EF489995D2DE98772D96FED9826694F333BB75FB9836200903DC8369674B81A73A067CA9580DC506E611A9F55FAC9816CC16B923692338D8795A6264B3A4FD29722A582FB224BEFD958CEDC177BB88F932B11BC8A993D95B3EC297235188E5363AEE93B924E92BB26AFE52937D0E116B955CF8E96730BC57852AE24F32A79585F061366B6835C21ACF0DC911B906E14D9AD9F14CAC4D0623735A68CEE06349B"
|
||||||
|
"252686106676869C1BF432354E7625F7ECB956AE54FED1B9C8CCE320799205DEAD2DE913720F9EDBCD2C8C922E539FF9337D3E2C57A1EFA6BC1FFC4DE42E24E7F75D40EE26FF785935C0B380BFB5E562122648BABE8C738EE8B1A2DC7A071F92F4AA5C89CC5889E26107B0B65C99E9E992EE32B3878075D4580DEE1833DBAD74058711D9F73D4CE73DD5CCDAB920138942C832CEBE28770F9E456EF277B399955DA42D91489401F07960BF16DBCF8EAC06B643993A0E4780E523D7B597E5631389442291E80EDC92AC0FE1967FBD2C9BEDD7B62DF6FFDBBBF3205BAAF200E0DF4150A04424687025A8892B46346E880B89B108042441895B0296808A91A891481435115C826B702B154A408C5882286A447141232A22228A821B82282285B288B2C8F2E58FEE81BEE7F6CC7B33D3F7DE796F7EBFAAA9F77A99FE4EDFB9F776F7E9EF7C9D994766E64DD541EAAAAC1E19CCE264F398E90FF79C00F40DC302806165E6513D07A1AB33F3F29EF9735E3FEB76AFAB32F37D997965665EDBF3BADE94CDED2758AFAD946180B0DA5D184DC26B373177A19AE01F2EA5B84A5DBA12F30F23FE5429E55BD36C0C00AB58663E3333CF5EE08A3FB32901FDE259B7755D979947CCF3FA7E3D2733B208569C15370A0056BB6C9E03B07334A300368F6648D0C511F1D5883851E197E5CBCC03A2296D7D87689E86F9B368AEFCD5D907000000000000000000000000000000000000000080F55F666E94990766E61999F9C259B7679232F38B99F991CCDC61D66D018099C9CC4764E6B99D07147D61D66D9A94CCFC8BCCBCB9DDCF1B32F3DD99B9D1ACDB0500539599F7CDCC4BAA2714FE780A719FDA3E89F2ECCC7CD9A4E375E2EEDB1EF8BBDE37ADF8404464E69699F980EA67D359B70B5693CC3CA13A187E2533B79842DCE775621E3EE97855EC5D32F3BA4EFC9B32F32FA7D90658D532F3E09E67A33F71D6ED82D52233EFDE73207CF09462CFEC04A08D7F74F5DDF3E169B76135DA60D60D00202222768988DB75A67F5C4A3967568D99B2CF54D38F9E492B56192700002BC39F56D317CFA415B3F1836AFAEE3369C52AB3E19A56C82623F39111F14711F18B52CAB727DEAA26EE432262EB88B82222CE2CA55C378DB83DEDD822221E11112522BE524AB9664A71EF1711F78A88DB46C46511F1ED59BD06C054D4393757CFA415B3714935BD61666E594AF9CD4C5AB39A64E6B332F3F2CECF6599B96966BEB9FD7FD7C5997958666E3C81766C94998764E64555CCCB33F31D99B959667EBD6AEBB306885BEFFFE5D924C51D96995775DAB1FF10FBB9403BB6CCCCB7F7EC7F66E63599796A66EE3970CCEFB6FBFBBB9E9857765F8F21E3566DF8D79ED7FFF13DEBEDDDB3DED39719FBA3D5F67E9399F7E9596FA3CCBCA05AF7ABCB89DD6EF775D536C732BE33F31ED97C0EE7"
|
||||||
|
"D6796BCF3A8756DBF9C95AC6DFB9DDE7EEEF7EAC67BD7FE879ED8F59DA5E8F6CB7FE3CFF3A33EFD5B3DEC6EDE7A2BBEEF7971BBFDDF6B13DFBB6A69F5F0E11BB6AC73BABCFDFC7878EB140EC59E700DCB9E7FBE7CED36EC76A33D703B07144D499A69F8B88C7F4FCCEDD22E26511F1C8CCDC79A8ABD26C7A1A3E19113BF52CDE22225E18110F8E886D23E2F69D65439C88F4EDFF9B23E2D9D5BC9B0688D52B33B78D888F47C4D8C1A7B54944EC18114FC8CC2795529E3B50E83BC6F8BECFD9BCF3FF49DE2EDAA4A70D7D6381FBFE4EB75D66ECD322628F6ADEEE11511F64778A886DAA79672C337644C49931BA4F5B64E6B6A594EF75E6ED111177EA4CFF75CF761E516D67AD7AEA4A292767E63763F473B77B66EE5A4AF95467DE7F54DBFF7D441CB63631D6E0F418BFDFBB6744BCB19AF7F71171CF6ADE2707881F11B159CCFF19988FDE38D6790B7DA9F71DFCBB768CE62039943745FFC1BFEB09317AF09FA4BD7BE64DE404A03DF9392EE63FF8779588D82F335F3389B6AC421F8C886BAB794FE859AF7E6F66447C6880F89F8DE660DA55F77EFC5535FDA09E5E8A0756D35F5F441B5E1EA3AF4189E6801F1111997950CFF6DF5B4A39771131E6F3C1685ECBAEBED1277FD3336F9699E2374C609BF549EF2462AC54D7C5F8FB60935934643559D355DD8511717444BC3B22CEEA59FE9CCCAC135716ADEDF2EBBBA23D3322DE19114746C45A75690EA8F4CCBB7142B1F689A667A3EBC888B85F343D2EFB47C455D5F27FCE616EC31C1E118746C4A77A96BDB75D76688C1FA4D60BA594CBA2E905E87A54CFAAF509F1B9A5946F0E10FF9A88F84E35FBA1D5747D85BC41443C656E2233B78E887B54EB7C7E116DF87644BCBF9AFDF0CCDCAFED867D49B5ECA288F8CFB5DDFE1A627F2BC6F7FFD1395E83A23E29BAB09472F2106D88E6BBE5AC057E6EEEF99DB1DB3003B84B357DE90462AC48A594AB63FC3BEEFEB368CBAA9399FBF4DC7FF972666E56AD777CCF7AAF1B20FE213DDB3DBE5A67D3CCFC7CCF7AFB0C10BF6FFF3333BF94992FCEA64AD6B3B349CC1B5C8E8F81BDA0679DB7F4B4AFBE325C4E1B665607606D63E7E87DCA397B0D10FF5F167A6D33F3AE99F9876AF960BD5F3D7FDBD33BCB9ED4D3B6CCCC4F77D6D9AB5A76D912DAB06536F93D5DE767E67B7A62EF37D4BEB7B15FDB13E3999DE58FEE59FEEE21DBB040DBDEBAD06B3F609CADB3C9B9E95A567ECB22E3CF3407A06DC317ABFD3F76066D383033CFCA262FE69799794A66EE36CFBA0FCFCCD7777E265EB06922B2FF00387660CDCC6D33F3C66ABD2F0E10FF0BD5366FC8CCFB2EB59D4B88DFB7DDA9752F66E607AAD8BFCDAA00483625429F59FD6C3D601B56F309C09699F9FB6ABB6FEA2C7F7EB5ECE6CCACAFD297137FD76AFB577696BDAD679F339B44B48DDA750EAF967D7689"
|
||||||
|
"ED38A027CECDD574DD5BB26CD9BCB7EB72B01FE82C3FACA75D8F1DBA1D3DED7A5A4FBB2EC8CCBB0E18E37ED924825E50C5F9DE9A7F7B38B9324E00F6CCD1E3CBCD997952663E6F4AF14FEC799F65360599C64E3833F335D57A9BF56D77255B5462579B9854BF31D7E6BEF59AFC5935FD8352CA8F06D8EE727C6E8AB1EA84ADCD22E2CB99794C363D0F5B95527E544AF950F573D114DBB8DE6A871AFD5F35BB7B80D9B15A76CEC0C3613F1B11BFED4C6F9E99DBB7FF7F5C677EB74B788B88D8B5FD7F5D2D6E31F7FF6F514A794744D4B735BAB7C26E88265F6050ED67BD8EDBDDEF1DAB65E79552063F11E9CAA6B7EF1D313A54FABA88786E29A51EB2B61C8F8A8857C46882E985D19F83B45E2BA51C1FCDADA5EBE76645C49323E2DF261D3B330F8E26D1B4CF0611B17F667E66EEE42F9B5B63CFE8AC73697B1B639DB294CCEEFACDBF79EF5A8B73876AFAE7036C735DF2DE88A887346D11117B45C45111F1F3CCFC5666BE293315C8988C3AA37CBBBCB54B6FFB6A595DB56C594A293744C4D9D5EC1DDABFF59F77E6BD27464F14766EFFADEF952EE7E4F5E0983FD9F5B852CA5796B1ED857CA29ADE2633E75E83EDAA658377C17765D3B3724C44D4C3D00E2DA54CFAC2E0C68878659B1BB11ABD39C6DF0BD350F7325C1EE3C7A19D22E2BBD9DC023A33462F5C87181134754B3901F85D353DD430BCAEA914DB5929DA44B05DA249C4EB4B38DA28221E16110746C4F773C0FBCFDCE27F62F4BDBD7134C3E11E1E4D41AA394365FFD74EAFA6B78BE68A642E333C23E223317A75FFD86C6E9575BBA42F2DA52CB93E417B803B7F9EC5C7CF337F08C7C6F8D0BADDA34976EC0EF5CC68460E4CD2DB633C11F413A594D74F2056FD79DF30228EC9CC174C20D68AD69E789D1CCD30D09145138EBB438C0E313D2D22B629A56C1D4D727A3739F14ED19C7877BF136E8C88774DB28D93B2941380FA8A7F88F1B0D757D3D31AEAB76294522E2AA5EC16CD9BEBA3317F06F0E611F1D2F4C8CC419552AE8AF1DB004F8C883A01E83BA5943A6B7D08F533DFB78DD1E17FE7B6C3EEBAD9FDF78FCE688056DF689DB596990744C458FE4DEBDF97B3ED8594522E8EF1D1183BC678CD83B34B29756FC960B2C929A94724FD2422F69D44BC52CA07A31962D9CD39BA4D44FC57666E3589982BD82B63F476CFE511B15F34956827E941D5F41BE6BAF34B29474473ABED670BFCFEE1A59425E5DDCCDA524E00EA37E595BD6B2D4E3DFC63B5BDF16F514A39A594F2D452CA5DA2E9727A638C0F938A88D8CBED80C19D544D6F1FA3F7A22306EEFE9F534A39259AB2D773EE1BA3430FBFD4FE7B42DC3A1CB5C4F8C1EA6B4B6D437BCB63A183FC0E9939910361AB7EFD1F1AA3B91811FDC35507914DF9F1FF8ED1EFC56B22629F76B8E8449452CE2BA53C2322BA5520378BD59707F0D4"
|
||||||
|
"6AFAADA594234B2957F4AE3D9C0BA3B9D5FA81687A02477268DA7C93EDDBE55755BFF7D252CA81136EDFC42CEA04209B31FF75419021C6E7D7DBD8367BCAB1AE8FB219627648F5F3C0885B4E060E2AA56C174D3D84AEDBC59A8B35AD2BEA1EA088E6D913D3765C8CDE63BF778C8EC1BF399A2F8849E95EBD6F12A327C29F8C8828A55C18A3F902DB54DB58CE95C821D1D49DE8AAEB3FBC7282D9CEC7C668FDFB0D63B442DF8DD17C090F2E9BBA0347C57845C0579752EA9EA149A97B6FE6EB89595FD525A0D7BA96C572B4DFB3CF29A5EC5D4AF9C7BE138E52CA25A594BDA3C90B797044DCBB9472AF52CA24EA414CCD4227004F69EFC9741D18E30F101A221BB7DEC68651657EB66DA9BB3BD7077F8826B3FA559D9FBEE71BFC6FCFBCBE72B94BD557E4A82E2E33297D5757235DBFD9143D9AE8DFBFEDF6FB5277568C56233BBB2AD13BB43A0F60CEAFAA2EC653E759EF974B2D4ED45EFDD6436ABF194D11A8AE3F8988572F25C69AB4B761E6DBB78888334A29932A08F6AE182FC0744229E52D138AD7E7D7D5F42C4E8267229B678DD495FF7E3A8BB62CA494724329E57BA594B15A2DEBA2859E06B873449C919927477315F098B835EB78CE35D1540A5CAEA3A239B9E8BE019E9B99F78CA64BF3F66DEC870C106B4529A5FC2633BF16A395CE5E94995744C411A594AB32F301D1BC3E5D374693893A94FACB2722E290CC7C5834278A474F3033F9ABD124FA74879C3D2733FF3822CE89E6AA6CA7181F2E3A09274533F4A8CF5095E7E6F3F968B2F06B75E6FD89D13F346A397F9F37C4E8E7EFE668AE7E3F9399FF14A3F7499F9F99EF2FA59CB78C78F3F968CCFFFA4F243BBC1D675E77B76744DC29334F59E0575F554AF9C624DAD45A4D8F6B5F4DFBBAB2E4FC95F0D664B08211395ECC646D4DAA10D0B2B7BB88F88FCFE6697FB59B32F3EA79F6FB8481DB709F1C2F7AD235DF18D9A1E29FBE88BF79D7B20B0155EDD83433AFE88973633627621395E34FDFCCEC2FCAF5D39EF59634463F9B4A9775C19F933ACBF7E8593E9127D565F3D4BFBED7E0DA1CB0004F15B3EFB55C1BBD15E296D10E4F031CE5698013B6D059D79AEA509F1611070DD8968362B4FBB54FDF55EA3AAFBDC7F88218BFDFBA41F48F88382D9AE7030CD986F3A3B9B29C9597C7F810D3DA7C5DE483698764F675439F35A12BDE5A7D157F4D34897FB52FF7CC5B740F4536B7D60E89D1DE976BA3C9C88E888852CA89315E5B60B7CCDC3506D63E5DB4EFDEEF690317E0E95AA827749AEAFA0BB799492B66E3763DF33C7171C2163A01F8CF68BAF7EB27A5FD369AC235BB0CF528E0885B3EF87F1B4DB25B3D2AE0FA6892AF2672EF712528A51C1D114F8AA6C849FD9ACFF9613445421E37A1ACE47DA349C4AA93F23226FC64B252CAA9D1FCFDBF11E3E37EAF8CE6E12B7596F0A47CAC"
|
||||||
|
"67DEA4BBFFE7D455FCCE68EF8DD7EA62383F5FE2F0B88322A2EED938A694724E35EF1531FABED820225EBB84786BE3233DF3EA1102EBA33AF9EC8E3369C56CD4F946D7AC8B95F5D649B9401778DB35F3F43E4241D8000003D7494441546CEAA1FF5D660E51F96F4DEDD92C339FDCC67C46DE5A7E71A65DF5D3924D37F42E99B96F66EEDFBEFECB7EEAE222E2DFBD7DDD5F90CD3307A616BB8DFFC0CCDCBBFDFBEF96C33CF590754466EE5E7DC6AFCE75F5412B8BD0B3DFBF9A62EC59DF027851B5EF93A8B541658D5D5FED95E6549FBBDD9EF9CDA21CE48AD076434FB4DCE91AE25F1CCD90B859C53F37228678D63CEBA6FAA4FED4298C055F093E1DCDADD7B9E19F5B65E6B34A29931C7ABA52EC514D4FF3592CAB96CC4B6045C82601F0E068CA62770D9AF0BA52B5CF8438A29AFD96CCAC4BE3AE3732738B6CAA9A7647415D114D412626CC0900305399F9B8CCBC2C9A5C8FD7C668F2DB85A5948914FF59A10E89D1B2D05B45F354C2F5D5DED194FB9D737D44BCA494F28B19B56755710200CCDA6DA379C84A9D099ED1D4275835DA5E809DA349869E7B285AFD9C88493825229ED6FE1C358578738E8B5B939ECF8B883D4B29C74C31FEAAB65286BF00746544BCAD94B2EA1E7AD59E041CD026E33D3BFA877C0E1DF38288987A75BB52CAA5997958449CDF3E1889299A3B01F861441C592DFBE194DBB236D69576026BEF92686A80DC2D9AB1DF1746C4FB4B29AB61E8DFBCDAB2C7AF5CE38AEBB852CA6B66DD0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D629FF0F4A0CD12A5E549F170000000049454E44AE426082";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //TEXT_ATLAS_PNG_H
|
||||||
|
|
||||||
@@ -320,6 +320,34 @@
|
|||||||
<key>DefaultValue</key>
|
<key>DefaultValue</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
<key>FooterText</key>
|
||||||
|
<string>Standard OBJ format has colorless polygons where there is no texture. This policy can add color to vertex when exporting the OBJ.</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSMultiValueSpecifier</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>Texture Vertex Color Policy</string>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>TextureVertexColorPolicy</string>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>Titles</key>
|
||||||
|
<array>
|
||||||
|
<string>Colorless (standard OBJ)</string>
|
||||||
|
<string>Keep color only on textureless polygons</string>
|
||||||
|
<string>Keep all color</string>
|
||||||
|
</array>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<integer>0</integer>
|
||||||
|
<integer>1</integer>
|
||||||
|
<integer>2</integer>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
@@ -365,11 +393,13 @@
|
|||||||
<array>
|
<array>
|
||||||
<string>PLY</string>
|
<string>PLY</string>
|
||||||
<string>LAS</string>
|
<string>LAS</string>
|
||||||
|
<string>LAZ</string>
|
||||||
</array>
|
</array>
|
||||||
<key>Values</key>
|
<key>Values</key>
|
||||||
<array>
|
<array>
|
||||||
<string>ply</string>
|
<string>ply</string>
|
||||||
<string>las</string>
|
<string>las</string>
|
||||||
|
<string>laz</string>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -482,6 +520,14 @@
|
|||||||
<key>Titles</key>
|
<key>Titles</key>
|
||||||
<array>
|
<array>
|
||||||
<string>No Limit</string>
|
<string>No Limit</string>
|
||||||
|
<string>5000</string>
|
||||||
|
<string>4500</string>
|
||||||
|
<string>4000</string>
|
||||||
|
<string>3500</string>
|
||||||
|
<string>3000</string>
|
||||||
|
<string>2500</string>
|
||||||
|
<string>2000</string>
|
||||||
|
<string>1500</string>
|
||||||
<string>1000</string>
|
<string>1000</string>
|
||||||
<string>900</string>
|
<string>900</string>
|
||||||
<string>800</string>
|
<string>800</string>
|
||||||
@@ -497,6 +543,14 @@
|
|||||||
<key>Values</key>
|
<key>Values</key>
|
||||||
<array>
|
<array>
|
||||||
<string>0</string>
|
<string>0</string>
|
||||||
|
<string>5000</string>
|
||||||
|
<string>4500</string>
|
||||||
|
<string>4000</string>
|
||||||
|
<string>3500</string>
|
||||||
|
<string>3000</string>
|
||||||
|
<string>2500</string>
|
||||||
|
<string>2000</string>
|
||||||
|
<string>1500</string>
|
||||||
<string>1000</string>
|
<string>1000</string>
|
||||||
<string>900</string>
|
<string>900</string>
|
||||||
<string>800</string>
|
<string>800</string>
|
||||||
@@ -528,6 +582,14 @@
|
|||||||
<key>Titles</key>
|
<key>Titles</key>
|
||||||
<array>
|
<array>
|
||||||
<string>No Limit</string>
|
<string>No Limit</string>
|
||||||
|
<string>5000</string>
|
||||||
|
<string>4500</string>
|
||||||
|
<string>4000</string>
|
||||||
|
<string>3500</string>
|
||||||
|
<string>3000</string>
|
||||||
|
<string>2500</string>
|
||||||
|
<string>2000</string>
|
||||||
|
<string>1500</string>
|
||||||
<string>1000</string>
|
<string>1000</string>
|
||||||
<string>900</string>
|
<string>900</string>
|
||||||
<string>800</string>
|
<string>800</string>
|
||||||
@@ -542,6 +604,14 @@
|
|||||||
<key>Values</key>
|
<key>Values</key>
|
||||||
<array>
|
<array>
|
||||||
<string>0</string>
|
<string>0</string>
|
||||||
|
<string>5000</string>
|
||||||
|
<string>4500</string>
|
||||||
|
<string>4000</string>
|
||||||
|
<string>3500</string>
|
||||||
|
<string>3000</string>
|
||||||
|
<string>2500</string>
|
||||||
|
<string>2000</string>
|
||||||
|
<string>1500</string>
|
||||||
<string>1000</string>
|
<string>1000</string>
|
||||||
<string>900</string>
|
<string>900</string>
|
||||||
<string>800</string>
|
<string>800</string>
|
||||||
@@ -558,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>
|
||||||
@@ -571,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>
|
||||||
@@ -804,6 +882,56 @@
|
|||||||
<key>KeyboardType</key>
|
<key>KeyboardType</key>
|
||||||
<string>NumberPad</string>
|
<string>NumberPad</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
<key>FooterText</key>
|
||||||
|
<string>Maximum range at which the markers are detected. Long range increases the estimated orientation error of the tag, which can then cause bad graph optimization. Using larger tags can improve orientation estimation at longer range.</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSMultiValueSpecifier</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>Marker Maximum Range</string>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>MarkerMaxRange</string>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<real>2</real>
|
||||||
|
<key>Titles</key>
|
||||||
|
<array>
|
||||||
|
<string>No Limit</string>
|
||||||
|
<string>0.5 m</string>
|
||||||
|
<string>1 m</string>
|
||||||
|
<string>2 m</string>
|
||||||
|
<string>3 m</string>
|
||||||
|
<string>4 m</string>
|
||||||
|
<string>5 m</string>
|
||||||
|
<string>6 m</string>
|
||||||
|
<string>7 m</string>
|
||||||
|
<string>8 m</string>
|
||||||
|
<string>9 m</string>
|
||||||
|
<string>10 m</string>
|
||||||
|
<string>15 m</string>
|
||||||
|
<string>20 m</string>
|
||||||
|
</array>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<string>0</string>
|
||||||
|
<real>0.5</real>
|
||||||
|
<real>1</real>
|
||||||
|
<real>2</real>
|
||||||
|
<real>3</real>
|
||||||
|
<real>4</real>
|
||||||
|
<real>5</real>
|
||||||
|
<real>6</real>
|
||||||
|
<real>7</real>
|
||||||
|
<real>8</real>
|
||||||
|
<real>9</real>
|
||||||
|
<integer>10</integer>
|
||||||
|
<real>15</real>
|
||||||
|
<real>20</real>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
|
|||||||
@@ -430,6 +430,60 @@
|
|||||||
<real>0.01</real>
|
<real>0.01</real>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>Measuring</string>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>MeasuringUnits</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>System of Units</string>
|
||||||
|
<key>Titles</key>
|
||||||
|
<array>
|
||||||
|
<string>Metric</string>
|
||||||
|
<string>Imperial</string>
|
||||||
|
</array>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSMultiValueSpecifier</string>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<integer>0</integer>
|
||||||
|
<integer>1</integer>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<real>0.050000000000000003</real>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>MeasuringTextSize</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>Text Size</string>
|
||||||
|
<key>Titles</key>
|
||||||
|
<array>
|
||||||
|
<string>30 cm</string>
|
||||||
|
<string>25 cm</string>
|
||||||
|
<string>20 cm</string>
|
||||||
|
<string>15 cm</string>
|
||||||
|
<string>10 cm</string>
|
||||||
|
<string>5 cm</string>
|
||||||
|
</array>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSMultiValueSpecifier</string>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<real>0.29999999999999999</real>
|
||||||
|
<real>0.25</real>
|
||||||
|
<real>0.20000000000000001</real>
|
||||||
|
<real>0.14999999999999999</real>
|
||||||
|
<real>0.10000000000000001</real>
|
||||||
|
<real>0.050000000000000003</real>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>Copyright (c) 2010-2024, Mathieu Labbe - IntRoLab - Université de Sherbrooke. All rights reserved.</string>
|
<string>Copyright (c) 2010-2024, Mathieu Labbe - IntRoLab - Université de Sherbrooke. All rights reserved.</string>
|
||||||
@@ -440,7 +494,7 @@
|
|||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>DefaultValue</key>
|
<key>DefaultValue</key>
|
||||||
<string>0.21.8</string>
|
<string>0.22.0</string>
|
||||||
<key>Key</key>
|
<key>Key</key>
|
||||||
<string>Version</string>
|
<string>Version</string>
|
||||||
<key>Title</key>
|
<key>Title</key>
|
||||||
|
|||||||
@@ -33,6 +33,14 @@ ENDIF()
|
|||||||
# Add binary
|
# Add binary
|
||||||
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})
|
||||||
|
# Custom Info.plist providing NSCameraUsageDescription, required by macOS to
|
||||||
|
# grant the app access to USB/UVC cameras (e.g. Orbbec, RealSense). A bundle
|
||||||
|
# identifier is also set: macOS ties the camera (TCC) permission to it, so it
|
||||||
|
# must be non-empty for the permission to be granted/persisted.
|
||||||
|
SET_TARGET_PROPERTIES(rtabmap_app PROPERTIES
|
||||||
|
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in
|
||||||
|
MACOSX_BUNDLE_GUI_IDENTIFIER "com.introlab.rtabmap"
|
||||||
|
MACOSX_BUNDLE_BUNDLE_NAME "${CMAKE_BUNDLE_NAME}")
|
||||||
ELSEIF(WIN32 AND BUILD_AS_BUNDLE)
|
ELSEIF(WIN32 AND BUILD_AS_BUNDLE)
|
||||||
ADD_EXECUTABLE(rtabmap_app WIN32 ${SRC_FILES})
|
ADD_EXECUTABLE(rtabmap_app WIN32 ${SRC_FILES})
|
||||||
ELSE()
|
ELSE()
|
||||||
@@ -95,40 +103,218 @@ 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)
|
||||||
# Install needed depthengine_2_0.dll
|
# Install needed depthengine_2_0.dll. Its location varies by K4A SDK version:
|
||||||
|
# v1.4.1 ships it under sdk/windows-desktop/amd64/release/bin, or fallback in tools/.
|
||||||
IF(WIN32)
|
IF(WIN32)
|
||||||
file(TO_CMAKE_PATH "$ENV{K4A_ROOT_DIR}" ENV_K4A_ROOT_DIR)
|
file(TO_CMAKE_PATH "$ENV{K4A_ROOT_DIR}" ENV_K4A_ROOT_DIR)
|
||||||
INSTALL(FILES "${ENV_K4A_ROOT_DIR}/tools/depthengine_2_0.dll"
|
set(DEPTHENGINE_DLL "")
|
||||||
DESTINATION ${thirdparty_dest_dir}
|
foreach(_depthengine_dir
|
||||||
COMPONENT runtime)
|
"${ENV_K4A_ROOT_DIR}/sdk/windows-desktop/amd64/release/bin"
|
||||||
|
"${ENV_K4A_ROOT_DIR}/tools")
|
||||||
|
if(EXISTS "${_depthengine_dir}/depthengine_2_0.dll")
|
||||||
|
set(DEPTHENGINE_DLL "${_depthengine_dir}/depthengine_2_0.dll")
|
||||||
|
break()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
IF(DEPTHENGINE_DLL)
|
||||||
|
INSTALL(FILES "${DEPTHENGINE_DLL}"
|
||||||
|
DESTINATION ${thirdparty_dest_dir}
|
||||||
|
COMPONENT runtime)
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(WARNING "depthengine_2_0.dll not found under $ENV{K4A_ROOT_DIR} (sdk/windows-desktop/amd64/release/bin or tools); Kinect for Azure depth may not work at runtime.")
|
||||||
|
ENDIF()
|
||||||
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(STATUS "OrbbecSDK_BIN_DIR=${OrbbecSDK_BIN_DIR}")
|
||||||
|
INSTALL(DIRECTORY "${OrbbecSDK_BIN_DIR}/extensions"
|
||||||
|
DESTINATION ${thirdparty_dest_dir}
|
||||||
|
COMPONENT runtime
|
||||||
|
FILES_MATCHING
|
||||||
|
PATTERN "*.lib" EXCLUDE
|
||||||
|
PATTERN "*")
|
||||||
|
ELSEIF(APPLE)
|
||||||
|
# OrbbecSDK loads its extensions (frame processor, filters like
|
||||||
|
# FrameUnpacker) via dlopen relative to libOrbbecSDK. fixup_bundle puts
|
||||||
|
# libOrbbecSDK in Contents/Frameworks, so the extensions must sit next to
|
||||||
|
# it in Frameworks/extensions (they reference @rpath/libOrbbecSDK, which
|
||||||
|
# resolves via the app executable's @executable_path/../Frameworks rpath).
|
||||||
|
# Without this the camera is detected but frame processing fails.
|
||||||
|
get_filename_component(OrbbecSDK_LIB_DIR "${OrbbecSDK_DIR}/../.." ABSOLUTE)
|
||||||
|
INSTALL(DIRECTORY "${OrbbecSDK_LIB_DIR}/extensions"
|
||||||
|
DESTINATION Frameworks
|
||||||
|
COMPONENT runtime)
|
||||||
|
IF(EXISTS "${OrbbecSDK_LIB_DIR}/OrbbecSDKConfig.xml")
|
||||||
|
INSTALL(FILES "${OrbbecSDK_LIB_DIR}/OrbbecSDKConfig.xml"
|
||||||
|
DESTINATION Frameworks
|
||||||
|
COMPONENT runtime)
|
||||||
|
ENDIF()
|
||||||
|
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)
|
||||||
|
|
||||||
IF(Qt6_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 AND APPLE)
|
||||||
|
# On macOS we do NOT use qt_deploy_runtime_dependencies (macdeployqt):
|
||||||
|
# macdeployqt cannot deploy VTK 9.6+, whose libraries reference each other
|
||||||
|
# via @rpath relative to "@loader_path/../lib". Instead we install the Qt plugins
|
||||||
|
# manually and let fixup_bundle() below deploy all libraries.
|
||||||
|
IF(TARGET Qt6::QCocoaIntegrationPlugin)
|
||||||
|
get_target_property(_qt_plugin_loc Qt6::QCocoaIntegrationPlugin LOCATION)
|
||||||
|
get_filename_component(_qt_plugins_dir "${_qt_plugin_loc}" DIRECTORY) # .../plugins/platforms
|
||||||
|
get_filename_component(_qt_plugins_dir "${_qt_plugins_dir}" DIRECTORY) # .../plugins
|
||||||
|
FOREACH(_qt_plugin_type platforms styles imageformats iconengines)
|
||||||
|
IF(EXISTS "${_qt_plugins_dir}/${_qt_plugin_type}")
|
||||||
|
# Homebrew Qt plugins are symlinks into the Cellar; resolve them to the
|
||||||
|
# real files so they aren't installed as dangling symlinks (which would
|
||||||
|
# break fixup_bundle and codesign).
|
||||||
|
FILE(GLOB _qt_plugin_files "${_qt_plugins_dir}/${_qt_plugin_type}/*${CMAKE_SHARED_LIBRARY_SUFFIX}")
|
||||||
|
SET(_qt_plugin_real "")
|
||||||
|
FOREACH(_qt_plugin_file ${_qt_plugin_files})
|
||||||
|
GET_FILENAME_COMPONENT(_qt_plugin_file "${_qt_plugin_file}" REALPATH)
|
||||||
|
LIST(APPEND _qt_plugin_real "${_qt_plugin_file}")
|
||||||
|
ENDFOREACH()
|
||||||
|
IF(_qt_plugin_real)
|
||||||
|
INSTALL(FILES ${_qt_plugin_real}
|
||||||
|
DESTINATION ${plugin_dest_dir}/${_qt_plugin_type}
|
||||||
|
COMPONENT runtime)
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
ENDFOREACH()
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(WARNING "Qt6::QCocoaIntegrationPlugin target not found: Qt plugins may be missing from the bundle")
|
||||||
|
ENDIF()
|
||||||
|
# qt.conf so Qt finds the bundled plugins (path is relative to Contents/)
|
||||||
|
SET(QT_CONF_FILE [Paths]\nPlugins=${plugin_dest_dir})
|
||||||
|
INSTALL(CODE "
|
||||||
|
file(WRITE \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${qtconf_dest_dir}/qt.conf\" \"${QT_CONF_FILE}\")
|
||||||
|
" COMPONENT runtime)
|
||||||
|
ELSEIF(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
|
||||||
set(deploy_script "${CMAKE_CURRENT_BINARY_DIR}/deploy_app$<CONFIG>.cmake")
|
set(deploy_script "${CMAKE_CURRENT_BINARY_DIR}/deploy_app$<CONFIG>.cmake")
|
||||||
@@ -218,7 +404,10 @@ IF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
# directories to look for dependencies
|
# directories to look for dependencies
|
||||||
SET(DIRS "${QT_LIBRARY_DIRS}" "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/lib")
|
# CMAKE_LIBRARY_OUTPUT_DIRECTORY is where rtabmap's own libraries (e.g.
|
||||||
|
# librtabmap_core) are built; fixup_bundle needs it to resolve the app's
|
||||||
|
# @rpath references to them (macdeployqt used to handle this via rpath).
|
||||||
|
SET(DIRS "${QT_LIBRARY_DIRS}" "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/lib")
|
||||||
IF(APPLE)
|
IF(APPLE)
|
||||||
SET(DIRS ${DIRS} /usr/local /usr/local/lib /opt/homebrew /opt/homebrew/lib /opt/homebrew/lib/gcc/current)
|
SET(DIRS ${DIRS} /usr/local /usr/local/lib /opt/homebrew /opt/homebrew/lib /opt/homebrew/lib/gcc/current)
|
||||||
ENDIF(APPLE)
|
ENDIF(APPLE)
|
||||||
@@ -230,11 +419,65 @@ 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}\")
|
||||||
|
|
||||||
|
# OrbbecSDK loads its filter/frame-processor extensions via dlopen, and they
|
||||||
|
# link @rpath/libOrbbecSDK. Feed them to fixup_bundle so their reference is
|
||||||
|
# rewritten to the embedded libOrbbecSDK
|
||||||
|
file(GLOB ORBBEC_EXT_LIBS
|
||||||
|
\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/Frameworks/extensions/filters/*${CMAKE_SHARED_LIBRARY_SUFFIX}\"
|
||||||
|
\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/Frameworks/extensions/frameprocessor/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
|
||||||
|
if(ORBBEC_EXT_LIBS)
|
||||||
|
list(APPEND ALL_LIBS \${ORBBEC_EXT_LIBS})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
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}\")
|
# nvcuvid.dll (NVDEC) and nvEncodeAPI64.dll (NVENC), and the CUDA driver API
|
||||||
|
# nvcuda.dll, ship with the NVIDIA GPU driver (System32), not the CUDA toolkit,
|
||||||
|
# so they are absent on driver-less CI runners and must never be bundled (they
|
||||||
|
# are resolved at runtime from the end user's driver). Mark them 'system' so
|
||||||
|
# fixup_bundle skips them instead of failing to resolve them.
|
||||||
|
function(gp_resolved_file_type_override resolved_file type_var)
|
||||||
|
if(resolved_file MATCHES \"(nvcuvid|nvEncodeAPI64|nvcuda)\")
|
||||||
|
set(\${type_var} \"system\" PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
fixup_bundle(\"${APPS}\" \"\${ALL_LIBS}\" \"${DIRS}\")
|
||||||
" COMPONENT runtime)
|
" COMPONENT runtime)
|
||||||
|
|
||||||
|
IF(APPLE)
|
||||||
|
# Re-sign ad-hoc AFTER fixup_bundle has finished all its install_name_tool
|
||||||
|
# edits.
|
||||||
|
install(CODE "
|
||||||
|
set(_contents \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}\")
|
||||||
|
get_filename_component(_app \"\${_contents}\" DIRECTORY)
|
||||||
|
file(GLOB_RECURSE _nested \"\${_contents}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
|
||||||
|
foreach(_f \${_nested})
|
||||||
|
execute_process(COMMAND codesign --force --sign - --timestamp=none \"\${_f}\")
|
||||||
|
endforeach()
|
||||||
|
file(GLOB _frameworks \"\${_contents}/Frameworks/*.framework\")
|
||||||
|
foreach(_f \${_frameworks})
|
||||||
|
execute_process(COMMAND codesign --force --sign - --timestamp=none \"\${_f}\")
|
||||||
|
endforeach()
|
||||||
|
message(STATUS \"Ad-hoc re-signing bundle: \${_app}\")
|
||||||
|
execute_process(COMMAND codesign --force --sign - --timestamp=none \"\${_app}\")
|
||||||
|
" COMPONENT runtime)
|
||||||
|
ENDIF(APPLE)
|
||||||
|
|
||||||
ENDIF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))
|
ENDIF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))
|
||||||
|
|
||||||
|
|||||||
40
app/src/Info.plist.in
Normal file
40
app/src/Info.plist.in
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>NSPrincipalClass</key>
|
||||||
|
<string>NSApplication</string>
|
||||||
|
<key>NSHighResolutionCapable</key>
|
||||||
|
<string>True</string>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>English</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
|
||||||
|
<key>CFBundleGetInfoString</key>
|
||||||
|
<string>${MACOSX_BUNDLE_INFO_STRING}</string>
|
||||||
|
<key>CFBundleIconFile</key>
|
||||||
|
<string>${MACOSX_BUNDLE_ICON_FILE}</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleLongVersionString</key>
|
||||||
|
<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>APPL</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
|
||||||
|
<key>CSResourcesFileMapped</key>
|
||||||
|
<true/>
|
||||||
|
<key>NSHumanReadableCopyright</key>
|
||||||
|
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
|
||||||
|
<key>NSCameraUsageDescription</key>
|
||||||
|
<string>RTAB-Map needs access to the camera to capture images from connected RGB-D/stereo cameras (e.g. Orbbec, RealSense).</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -52,6 +52,10 @@ int main(int argc, char* argv[])
|
|||||||
ULogger::setLevel(ULogger::kWarning);
|
ULogger::setLevel(ULogger::kWarning);
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
// STA (single-threaded apartment) is required for the native file dialogs / File Explorer
|
||||||
|
// (see commit d75cc04, "Fixed File Explorer hanging (Qt 5.12)"). Do NOT switch to MTA
|
||||||
|
// (CoInitializeEx COINIT_MULTITHREADED): it deadlocks the
|
||||||
|
// native file dialogs.
|
||||||
CoInitialize(nullptr);
|
CoInitialize(nullptr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -60,6 +64,12 @@ int main(int argc, char* argv[])
|
|||||||
QSurfaceFormat::setDefaultFormat(QVTKRenderWidget::defaultFormat());
|
QSurfaceFormat::setDefaultFormat(QVTKRenderWidget::defaultFormat());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Recommended by VTK when using QVTKOpenGLNativeWidget (a QOpenGLWidget): let all VTK
|
||||||
|
// render widgets share a single OpenGL context, which is needed for correct rendering
|
||||||
|
// when render widgets live in / move across multiple top-level windows. Must be set
|
||||||
|
// before QApplication is constructed.
|
||||||
|
QApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
|
||||||
|
|
||||||
/* Create tasks */
|
/* Create tasks */
|
||||||
QApplication * app = new QApplication(argc, argv);
|
QApplication * app = new QApplication(argc, argv);
|
||||||
app->setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }"); // selectable message box
|
app->setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }"); // selectable message box
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
418
bundle_windows_deps.bat
Normal file
418
bundle_windows_deps.bat
Normal file
@@ -0,0 +1,418 @@
|
|||||||
|
@echo off
|
||||||
|
setlocal enabledelayedexpansion
|
||||||
|
|
||||||
|
:: --- CONFIGURATION ---
|
||||||
|
set "VCPKG_ROOT=%~dp0vcpkg"
|
||||||
|
set "EXPORT_DIR=%~dp0vcpkg_binaries"
|
||||||
|
:: All deps downloaded/built from source (git clones + the pinned CMake) live here.
|
||||||
|
set "SRC_DIR=%~dp0vcpkg_deps_from_source"
|
||||||
|
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 ^
|
||||||
|
--x-feature=libfreenect2-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%" --output=%TARGET_NAME% --triplet=%TRIPLET% || 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
|
||||||
|
:: Everything cloned/downloaded below goes into %SRC_DIR% to keep the repo root clean.
|
||||||
|
if not exist "%SRC_DIR%" mkdir "%SRC_DIR%"
|
||||||
|
cd /d "%SRC_DIR%"
|
||||||
|
|
||||||
|
:: Kinect for Windows SDK v2 (k4w2): rtabmap's FindKinectSDK2.cmake expects the
|
||||||
|
:: Microsoft SDK layout (KINECTSDK20_DIR\inc and \Lib\x64), but vcpkg's kinectsdk2
|
||||||
|
:: port installs vcpkg-style (include\ and lib\). Mirror the bundled headers/lib into
|
||||||
|
:: the expected layout so it is found with KINECTSDK20_DIR pointing at the export.
|
||||||
|
if "%KINECTSDK20_DIR%"=="" (
|
||||||
|
echo Error: KINECTSDK20_DIR environment variable is not set! Install Kinect for Windows SDK v2: https://www.microsoft.com/en-us/download/details.aspx?id=44561
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
echo [+] Arranging Kinect SDK v2 layout for FindKinectSDK2...
|
||||||
|
set "K4W2_ROOT=%FINAL_EXPORT_PATH%\installed\%TRIPLET%"
|
||||||
|
robocopy "%K4W2_ROOT%\include" "%K4W2_ROOT%\inc" Kinect*.h Nui*.h /XO >nul
|
||||||
|
robocopy "%K4W2_ROOT%\lib" "%K4W2_ROOT%\Lib\x64" Kinect20*.lib /XO >nul
|
||||||
|
robocopy "%KINECTSDK20_DIR%\bin" "%K4W2_ROOT%\bin" Kinect20.dll /XO >nul
|
||||||
|
:: Robocopy exit codes under 8 mean successful copies/no changes; 8+ is a failure.
|
||||||
|
if !errorlevel! GEQ 8 (
|
||||||
|
echo Error: Robocopy failed with exit code !errorlevel!
|
||||||
|
pause
|
||||||
|
exit /b !errorlevel!
|
||||||
|
)
|
||||||
|
|
||||||
|
:: orbbec SDK2
|
||||||
|
echo [+] Building OrbbecSDK_v2...
|
||||||
|
if not exist OrbbecSDK_v2 (
|
||||||
|
echo [+] Downloading and applying patch...
|
||||||
|
git clone https://github.com/orbbec/OrbbecSDK_v2.git
|
||||||
|
cd OrbbecSDK_v2
|
||||||
|
git checkout v2.8.7
|
||||||
|
:: Install the CMake package config under lib/cmake/<pkg> so find_package(OrbbecSDK) works
|
||||||
|
git apply "%~dp0patches\orbbecsdk_2.8.7.patch"
|
||||||
|
cd ..
|
||||||
|
)
|
||||||
|
cd OrbbecSDK_v2
|
||||||
|
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 ^
|
||||||
|
-DOB_BUILD_DOCS=OFF ^
|
||||||
|
-DOB_BUILD_EXAMPLES=OFF ^
|
||||||
|
-DOB_BUILD_TOOLS=OFF ^
|
||||||
|
-DOB_INSTALL_EXAMPLES_SOURCE=OFF || exit /b !errorlevel!
|
||||||
|
cmake --build build --config Release --target install || exit /b !errorlevel!
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
if "%K4A_ROOT_DIR%"=="" (
|
||||||
|
echo Error: K4A_ROOT_DIR environment variable is not set! Install K4A: https://github.com/microsoft/Azure-Kinect-Sensor-SDK/blob/develop/docs/usage.md
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
echo Copying Kinect For Azure components...
|
||||||
|
robocopy "%K4A_ROOT_DIR%\sdk" "%FINAL_EXPORT_PATH%\installed\%TRIPLET%\sdk" /E /XO
|
||||||
|
:: Robocopy exit codes under 8 mean successful copies/no changes.
|
||||||
|
:: 8 or higher means there was a failure.
|
||||||
|
if !errorlevel! GEQ 8 (
|
||||||
|
echo Error: Robocopy failed with exit code !errorlevel!
|
||||||
|
pause
|
||||||
|
exit /b !errorlevel!
|
||||||
|
)
|
||||||
|
|
||||||
|
:: 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 "%~dp0patches\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 "%~dp0patches\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 "%~dp0patches\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 "%~dp0patches\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 ..
|
||||||
|
|
||||||
|
:: libfreenect2
|
||||||
|
echo [+] Building libfreenect2...
|
||||||
|
if not exist libfreenect2 (
|
||||||
|
echo [+] Downloading and applying patch...
|
||||||
|
git clone https://github.com/OpenKinect/libfreenect2.git
|
||||||
|
cd libfreenect2
|
||||||
|
:: Aug 6, 2021
|
||||||
|
git checkout v0.2.1
|
||||||
|
:: Patch makes freenect2Config.cmake relocatable so the prebuilt bundle works
|
||||||
|
:: after being moved/unzipped, drops cudaDeviceProp::clockRate/computeMode
|
||||||
|
:: removed in CUDA 13 from the CUDA build, and renames a CL_ICDL_VERSION local
|
||||||
|
:: that collides with the OpenCL 3.0 macro.
|
||||||
|
git apply "%~dp0patches\libfreenect2_v0.2.1.patch"
|
||||||
|
cd ..
|
||||||
|
)
|
||||||
|
cd libfreenect2
|
||||||
|
:: libfreenect2's FindLibUSB.cmake locates libusb via pkg-config. It declares an
|
||||||
|
:: ancient cmake_minimum_required (2.8.12), which makes FindPkgConfig default
|
||||||
|
:: PKG_CONFIG_USE_CMAKE_PREFIX_PATH=OFF, so it ignores the vcpkg CMAKE_PREFIX_PATH.
|
||||||
|
:: Force it ON so the bundle's lib/pkgconfig (libusb-1.0.pc, libturbojpeg.pc) is
|
||||||
|
:: searched, use the vcpkg-bundled pkgconf, and also set PKG_CONFIG_PATH as a belt.
|
||||||
|
set "PKG_CONFIG_PATH=%FINAL_EXPORT_PATH%\installed\%TRIPLET%\lib\pkgconfig"
|
||||||
|
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" ^
|
||||||
|
-DPKG_CONFIG_EXECUTABLE="%FINAL_EXPORT_PATH%\installed\%TRIPLET%\tools\pkgconf\pkgconf.exe" ^
|
||||||
|
-DPKG_CONFIG_USE_CMAKE_PREFIX_PATH=ON ^
|
||||||
|
-DCMAKE_BUILD_TYPE=Release ^
|
||||||
|
-DENABLE_CUDA=OFF ^
|
||||||
|
-DENABLE_OPENCL=OFF ^
|
||||||
|
-DBUILD_EXAMPLES=OFF ^
|
||||||
|
-DCMAKE_INSTALL_PREFIX="%FINAL_EXPORT_PATH%\installed\%TRIPLET%" ^
|
||||||
|
-DBUILD_SHARED_LIBS=ON || exit /b !errorlevel!
|
||||||
|
cmake --build build --config Release --target install || exit /b !errorlevel!
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
:: depthai
|
||||||
|
echo [+] Building depthai...
|
||||||
|
if not exist depthai-core (
|
||||||
|
echo [+] Downloading...
|
||||||
|
git clone https://github.com/luxonis/depthai-core.git
|
||||||
|
cd depthai-core
|
||||||
|
:: depthai 2.32.0 (Hunter-based; v2 does NOT use vcpkg/CMake presets)
|
||||||
|
git checkout v2.32.0
|
||||||
|
git submodule update --init --recursive
|
||||||
|
cd ..
|
||||||
|
)
|
||||||
|
cd depthai-core
|
||||||
|
:: v2 and its old Hunter sub-deps declare cmake_minimum_required < 3.5, which
|
||||||
|
:: CMake 4.x rejects, and CMAKE_POLICY_VERSION_MINIMUM does not propagate into
|
||||||
|
:: Hunter's sub-builds. Use a pinned CMake 3.x just for depthai (Hunter reuses the
|
||||||
|
:: same cmake binary for its dependency sub-builds).
|
||||||
|
set "CMAKE3_VER=3.31.12"
|
||||||
|
set "CMAKE3_NAME=cmake-%CMAKE3_VER%-windows-x86_64"
|
||||||
|
set "CMAKE3_DIR=%SRC_DIR%\%CMAKE3_NAME%"
|
||||||
|
set "CMAKE3=%CMAKE3_DIR%\bin\cmake.exe"
|
||||||
|
if not exist "%CMAKE3_DIR%" (
|
||||||
|
echo [+] Downloading CMake %CMAKE3_VER% ...
|
||||||
|
curl -L -o "%SRC_DIR%\%CMAKE3_NAME%.zip" "https://github.com/Kitware/CMake/releases/download/v%CMAKE3_VER%/%CMAKE3_NAME%.zip" || exit /b !errorlevel!
|
||||||
|
"%SEVENZIP_EXE%" x "%SRC_DIR%\%CMAKE3_NAME%.zip" -o"%SRC_DIR%" -y || exit /b !errorlevel!
|
||||||
|
)
|
||||||
|
:: v2 is fully Hunter-managed (no vcpkg toolchain). depthaiDependencies.cmake
|
||||||
|
:: unconditionally does find_package(OpenCV 4 QUIET CONFIG) (not gated by
|
||||||
|
:: DEPTHAI_OPENCV_SUPPORT); if it finds the bundle's OpenCV, OpenCVModules does
|
||||||
|
:: find_dependency(TIFF) which collides with Hunter's config-less FindTIFF. We don't
|
||||||
|
:: need depthai's OpenCV at all (CameraDepthAI converts ImgFrame->cv::Mat itself), so
|
||||||
|
:: hard-disable the lookup. DEPTHAI_ENABLE_CURL=OFF avoids Hunter's old zlib/curl.
|
||||||
|
"%CMAKE3%" -S . -B build -GNinja ^
|
||||||
|
-DCMAKE_INSTALL_PREFIX="%FINAL_EXPORT_PATH%\installed\%TRIPLET%" ^
|
||||||
|
-DCMAKE_BUILD_TYPE=Release ^
|
||||||
|
-DBUILD_SHARED_LIBS=ON ^
|
||||||
|
-DDEPTHAI_OPENCV_SUPPORT=OFF ^
|
||||||
|
-DCMAKE_DISABLE_FIND_PACKAGE_OpenCV=ON ^
|
||||||
|
-DDEPTHAI_ENABLE_CURL=OFF ^
|
||||||
|
-DDEPTHAI_BUILD_EXAMPLES=OFF ^
|
||||||
|
-DDEPTHAI_BUILD_TESTS=OFF || exit /b !errorlevel!
|
||||||
|
"%CMAKE3%" --build build --config Release --target install || exit /b !errorlevel!
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
:: CCCoreLib
|
||||||
|
echo [+] Building CCCoreLib...
|
||||||
|
if not exist CCCoreLib (
|
||||||
|
echo [+] Downloading...
|
||||||
|
git clone https://github.com/CloudCompare/CCCoreLib.git
|
||||||
|
cd CCCoreLib
|
||||||
|
:: June 20, 2026
|
||||||
|
git checkout 4095bea6552096cb528c3b8b5cb9505df2aa6002
|
||||||
|
git submodule update --init --recursive
|
||||||
|
:: nanoflann is an internal dep (only used in src/Kriging.cpp, no public header),
|
||||||
|
:: but CCCoreLib links it PUBLIC, leaking nanoflann::nanoflann into the exported
|
||||||
|
:: interface and breaking find_package(CCCoreLib). Link it PRIVATE instead.
|
||||||
|
git apply "%~dp0patches\cccorelib_4095bea.patch"
|
||||||
|
cd ..
|
||||||
|
)
|
||||||
|
cd CCCoreLib
|
||||||
|
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 ^
|
||||||
|
-DCCCORELIB_SHARED=ON ^
|
||||||
|
-DCCCORELIB_USE_CGAL=OFF ^
|
||||||
|
-DCCCORELIB_USE_TBB=ON ^
|
||||||
|
-DCCCORELIB_USE_QT_CONCURRENT=OFF || 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
|
||||||
|
|
||||||
|
:: The vcpkg export folder should not be in the rtabmap source directory
|
||||||
|
:: (otherwise we get some cmake errors about that)
|
||||||
|
set VCPKG_UNZIPPED_EXPORT_PATH=%USERPROFILE%\Downloads\vcpkg-export-########-x64-vs2022
|
||||||
|
|
||||||
|
set PATH=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\x64-windows-release\bin;%PATH%
|
||||||
|
set PATH=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\x64-windows-release\sdk\windows-desktop\amd64\release\bin;%PATH%
|
||||||
|
set PATH=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\x64-windows-release\tools\python3\Lib\site-packages\numpy.libs;%PATH%
|
||||||
|
set K4A_ROOT_DIR=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\x64-windows-release
|
||||||
|
set KINECTSDK20_DIR=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\x64-windows-release
|
||||||
|
|
||||||
|
cmake -B build -GNinja ^
|
||||||
|
-DCMAKE_BUILD_TYPE=Release ^
|
||||||
|
-DBUILD_AS_BUNDLE=ON ^
|
||||||
|
-DWITH_PYTHON=ON ^
|
||||||
|
-DWITH_ZED=OFF ^
|
||||||
|
-DWITH_CERES=ON ^
|
||||||
|
-DWITH_ORBBEC_SDK=ON ^
|
||||||
|
-DWITH_FREENECT2=ON ^
|
||||||
|
-DWITH_K4W2=ON ^
|
||||||
|
-DWITH_K4A=ON ^
|
||||||
|
-DWITH_DEPTHAI=ON ^
|
||||||
|
-DWITH_REALSENSE2=ON ^
|
||||||
|
-DWITH_CCCORELIB=ON ^
|
||||||
|
-DWITH_PDAL=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
|
||||||
338
bundle_windows_deps_cuda.bat
Normal file
338
bundle_windows_deps_cuda.bat
Normal file
@@ -0,0 +1,338 @@
|
|||||||
|
@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"
|
||||||
|
:: All deps downloaded/built from source (pytorch, torchvision, opencv, libfreenect2, ...) live here.
|
||||||
|
set "SRC_DIR=%~dp0vcpkg_deps_from_source"
|
||||||
|
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
|
||||||
|
)
|
||||||
|
|
||||||
|
:: ZED: copy the main library + the zed-config.cmake so find_package(ZED) resolves
|
||||||
|
:: it from the export (the config derives paths from ZED_SDK_ROOT_DIR/CMAKE_PREFIX_PATH).
|
||||||
|
if "%ZED_SDK_ROOT_DIR%"=="" (
|
||||||
|
echo Error: ZED_SDK_ROOT_DIR environment variable is not set!
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
echo Copying ZED main library only...
|
||||||
|
:: Only the core runtime goes into the bundle; the neural-depth/TensorRT DLLs are
|
||||||
|
:: shipped separately (see the zed-neural-extra archive below).
|
||||||
|
robocopy "%ZED_SDK_ROOT_DIR%\bin" "%FINAL_EXPORT_PATH%\installed\%TRIPLET%\bin" sl_zed64.dll zlibwapi.dll /XO
|
||||||
|
robocopy "%ZED_SDK_ROOT_DIR%\lib" "%FINAL_EXPORT_PATH%\installed\%TRIPLET%\lib" /E /XO
|
||||||
|
robocopy "%ZED_SDK_ROOT_DIR%\include" "%FINAL_EXPORT_PATH%\installed\%TRIPLET%\include" /E /XO
|
||||||
|
:: Install ZED's CMake config at the export prefix root so find_package(ZED 2) (config
|
||||||
|
:: mode, via the vcpkg toolchain CMAKE_PREFIX_PATH) finds it.
|
||||||
|
robocopy "%ZED_SDK_ROOT_DIR%" "%FINAL_EXPORT_PATH%\installed\%TRIPLET%" zed-config.cmake zed-config-version.cmake /XO
|
||||||
|
:: Robocopy exit codes under 8 mean successful copies/no changes.
|
||||||
|
:: 8 or higher means there was a failure.
|
||||||
|
if !errorlevel! GEQ 8 (
|
||||||
|
echo Error: Robocopy failed with exit code !errorlevel!
|
||||||
|
pause
|
||||||
|
exit /b !errorlevel!
|
||||||
|
)
|
||||||
|
:: Archive the remaining ZED runtime DLLs (neural-depth / TensorRT extras) as a
|
||||||
|
:: separate optional download, kept out of the main bundle to keep it small. Built
|
||||||
|
:: only once: skipped if the archive already exists. Staged with robocopy /XF
|
||||||
|
:: (excludes by name; avoids 7z's "!" exclude switch that delayed expansion mangles).
|
||||||
|
set "ZED_EXTRA_7Z=%EXPORT_DIR%\%TARGET_NAME%-zed-neural-extra.7z"
|
||||||
|
set "ZED_EXTRA_DIR=%SRC_DIR%\zed-neural-extra"
|
||||||
|
if not exist "%ZED_EXTRA_7Z%" (
|
||||||
|
echo [+] Creating ZED neural extra archive...
|
||||||
|
if exist "%ZED_EXTRA_DIR%" rd /s /q "%ZED_EXTRA_DIR%"
|
||||||
|
robocopy "%ZED_SDK_ROOT_DIR%\bin" "%ZED_EXTRA_DIR%" *.dll /XF sl_zed64.dll zlibwapi.dll >nul
|
||||||
|
"%SEVENZIP_EXE%" a -t7z -mx9 "%ZED_EXTRA_7Z%" "%ZED_EXTRA_DIR%\*" || exit /b !errorlevel!
|
||||||
|
)
|
||||||
|
|
||||||
|
:: 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
|
||||||
|
|
||||||
|
:: All deps cloned/built below go into %SRC_DIR% (incl. libfreenect2 built by
|
||||||
|
:: bundle_windows_deps.bat) to keep the repo root clean.
|
||||||
|
if not exist "%SRC_DIR%" mkdir "%SRC_DIR%"
|
||||||
|
cd /d "%SRC_DIR%"
|
||||||
|
|
||||||
|
:: 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_contrib
|
||||||
|
:: 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_cudacodec=OFF ^
|
||||||
|
-DBUILD_opencv_python3=OFF ^
|
||||||
|
-DBUILD_opencv_python_bindings_generator=OFF ^
|
||||||
|
-DBUILD_opencv_python_tests=OFF ^
|
||||||
|
-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!
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
|
||||||
|
:: freenect2 with cuda support
|
||||||
|
:: libfreenect2's CUDA processors include <helper_math.h>, which modern CUDA toolkits
|
||||||
|
:: no longer ship (it moved to the NVIDIA/cuda-samples repo). Fetch it and point
|
||||||
|
:: NVCUDASAMPLES_ROOT at it; libfreenect2 adds %NVCUDASAMPLES_ROOT%\common\inc to nvcc.
|
||||||
|
set "CUDA_SAMPLES_DIR=%SRC_DIR%\cuda-samples"
|
||||||
|
if not exist "%CUDA_SAMPLES_DIR%\common\inc\helper_math.h" (
|
||||||
|
mkdir "%CUDA_SAMPLES_DIR%\common\inc"
|
||||||
|
curl -L -o "%CUDA_SAMPLES_DIR%\common\inc\helper_math.h" "https://raw.githubusercontent.com/NVIDIA/cuda-samples/v12.5/Common/helper_math.h" || exit /b !errorlevel!
|
||||||
|
)
|
||||||
|
set "NVCUDASAMPLES_ROOT=%CUDA_SAMPLES_DIR%"
|
||||||
|
cd libfreenect2
|
||||||
|
cmake -S . -B build_cuda -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" ^
|
||||||
|
-DPKG_CONFIG_EXECUTABLE="%FINAL_EXPORT_PATH%\installed\%TRIPLET%\tools\pkgconf\pkgconf.exe" ^
|
||||||
|
-DPKG_CONFIG_USE_CMAKE_PREFIX_PATH=ON ^
|
||||||
|
-DCMAKE_INSTALL_PREFIX="%FINAL_EXPORT_PATH%\installed\%TRIPLET%" ^
|
||||||
|
-DCMAKE_BUILD_TYPE=Release ^
|
||||||
|
-DENABLE_CUDA=ON ^
|
||||||
|
-DENABLE_OPENCL=ON ^
|
||||||
|
-DENABLE_OPENGL=ON ^
|
||||||
|
-DBUILD_EXAMPLES=OFF ^
|
||||||
|
-DBUILD_SHARED_LIBS=ON || exit /b !errorlevel!
|
||||||
|
cmake --build build_cuda --config Release --target install || exit /b !errorlevel!
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
:: CudaSift (CUDA SIFT/SURF GPU features, matlabbe fork; needs CUDA)
|
||||||
|
echo [+] Building CudaSift...
|
||||||
|
if not exist CudaSift (
|
||||||
|
echo [+] Downloading...
|
||||||
|
git clone https://github.com/matlabbe/CudaSift.git
|
||||||
|
cd CudaSift
|
||||||
|
git checkout f764e14ae59ee78ff5b282d38790301d80faadc3
|
||||||
|
cd ..
|
||||||
|
)
|
||||||
|
cd CudaSift
|
||||||
|
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 ^
|
||||||
|
-DVERBOSE=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 || 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
|
||||||
|
|
||||||
|
:: The vcpkg export folder should not be in the rtabmap source directory
|
||||||
|
:: (otherwise we get some cmake errors about that)
|
||||||
|
set VCPKG_UNZIPPED_EXPORT_PATH=%USERPROFILE%\Downloads\vcpkg-export-########-x64-vs2022
|
||||||
|
|
||||||
|
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%
|
||||||
|
set PATH=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\x64-windows-release\sdk\windows-desktop\amd64\release\bin;%PATH%
|
||||||
|
set K4A_ROOT_DIR=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\%TRIPLET%
|
||||||
|
set KINECTSDK20_DIR=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\%TRIPLET%
|
||||||
|
set ZED_SDK_ROOT_DIR=%VCPKG_UNZIPPED_EXPORT_PATH%\installed\%TRIPLET%
|
||||||
|
|
||||||
|
cmake -B build_cuda -GNinja ^
|
||||||
|
-DCMAKE_BUILD_TYPE=Release ^
|
||||||
|
-DBUILD_AS_BUNDLE=ON ^
|
||||||
|
-DWITH_PYTHON=ON ^
|
||||||
|
-DWITH_TORCH=ON ^
|
||||||
|
-DWITH_ZED=ON ^
|
||||||
|
-DWITH_CUDASIFT=ON ^
|
||||||
|
-DWITH_CERES=ON ^
|
||||||
|
-DWITH_ORBBEC_SDK=ON ^
|
||||||
|
-DWITH_FREENECT2=ON ^
|
||||||
|
-DWITH_K4W2=ON ^
|
||||||
|
-DWITH_K4A=ON ^
|
||||||
|
-DWITH_DEPTHAI=ON ^
|
||||||
|
-DWITH_REALSENSE2=ON ^
|
||||||
|
-DWITH_CCCORELIB=ON ^
|
||||||
|
-DWITH_PDAL=OFF ^
|
||||||
|
-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
|
||||||
105
cmake_modules/FindCuVSLAM.cmake
Normal file
105
cmake_modules/FindCuVSLAM.cmake
Normal file
@@ -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)
|
||||||
@@ -40,7 +40,13 @@ if(NOT Eigen3_FIND_VERSION)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
macro(_eigen3_check_version)
|
macro(_eigen3_check_version)
|
||||||
file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header)
|
# Since Eigen 5.0.0 the version macros moved from Eigen/src/Core/util/Macros.h
|
||||||
|
# to a dedicated Eigen/Version header, so check the new location first.
|
||||||
|
if(EXISTS "${EIGEN3_INCLUDE_DIR}/Eigen/Version")
|
||||||
|
file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/Version" _eigen3_version_header)
|
||||||
|
else()
|
||||||
|
file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header)
|
||||||
|
endif()
|
||||||
|
|
||||||
string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}")
|
string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}")
|
||||||
set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}")
|
set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}")
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user