mirror of
https://github.com/introlab/rtabmap.git
synced 2026-10-04 00:57:46 +08:00
Merge branch 'master' of github.com:introlab/rtabmap into gtest
This commit is contained in:
@@ -0,0 +1,24 @@
|
|||||||
|
FROM introlab3it/rtabmap:android-noble-deps
|
||||||
|
|
||||||
|
# remove ubuntu user
|
||||||
|
RUN touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
ARG USERNAME=vscode
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=1000
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
groupadd --gid ${USER_GID} ${USERNAME} && \
|
||||||
|
useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
|
||||||
|
usermod -a -G sudo ${USERNAME} && \
|
||||||
|
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \
|
||||||
|
chmod 0440 /etc/sudoers.d/${USERNAME}
|
||||||
|
|
||||||
|
RUN chmod +x /opt/android-sdk/tools/android
|
||||||
|
|
||||||
|
RUN echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
|
||||||
|
|
||||||
@@ -1,9 +1,21 @@
|
|||||||
{
|
{
|
||||||
"image": "introlab3it/rtabmap:android-deps",
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
"customizations": {
|
"customizations": {
|
||||||
"vscode": {
|
"vscode": {
|
||||||
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools", "vscjava.vscode-java-pack"]
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools", "vscjava.vscode-java-pack"]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/rtabmap,type=bind",
|
||||||
|
"workspaceFolder": "/home/vscode/rtabmap",
|
||||||
|
"postStartCommand": "./.devcontainer/android/init.sh",
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
"runArgs": ["--privileged", "--network=host"]
|
"runArgs": ["--privileged", "--network=host"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Executable
+17
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "Running post-start initialization..."
|
||||||
|
|
||||||
|
# copy required jars
|
||||||
|
cp /opt/android/lib/*.jar app/android/libs/.
|
||||||
|
|
||||||
|
mkdir -p build_android/arm64-v8a
|
||||||
|
|
||||||
|
# resource tool
|
||||||
|
cd build_android
|
||||||
|
cmake -DANDROID_PREBUILD=ON ..
|
||||||
|
make
|
||||||
|
|
||||||
|
echo -e "\nTo build the APK, do (adjust API number):"
|
||||||
|
echo -e '\nexport ANDROID_API=30 && cd build_android/arm64-v8a && cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_NDK=$ANDROID_NDK -DANDROID_NATIVE_API_LEVEL=$ANDROID_API -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/android/arm64-v8a -DCMAKE_FIND_ROOT_PATH="/opt/android/arm64-v8a/bin;/opt/android/arm64-v8a;/opt/android/arm64-v8a/share" -DBUILD_EXAMPLES=OFF -DBUILD_TOOLS=OFF -DOpenCV_DIR=/opt/android/arm64-v8a/sdk/native/jni ../..\nmake -j6\n'
|
||||||
@@ -23,14 +23,29 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
ros_distribution: [ humble, jazzy ]
|
ros_distribution: [ humble, jazzy, kilted, rolling ]
|
||||||
include:
|
include:
|
||||||
- ros_distribution: 'humble'
|
- ros_distribution: 'humble'
|
||||||
os: ubuntu-22.04
|
os: ubuntu-22.04
|
||||||
- ros_distribution: 'jazzy'
|
- ros_distribution: 'jazzy'
|
||||||
os: ubuntu-24.04
|
os: ubuntu-24.04
|
||||||
|
- ros_distribution: 'kilted'
|
||||||
|
os: ubuntu-24.04
|
||||||
|
- ros_distribution: 'rolling'
|
||||||
|
os: ubuntu-24.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
- name: Setup ROS2
|
||||||
|
# https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debs.html
|
||||||
|
run: |
|
||||||
|
sudo apt install software-properties-common
|
||||||
|
sudo add-apt-repository universe
|
||||||
|
sudo apt update && sudo 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 $VERSION_CODENAME)_all.deb"
|
||||||
|
sudo apt install /tmp/ros2-apt-source.deb
|
||||||
|
sudo apt update
|
||||||
|
|
||||||
- uses: ros-tooling/[email protected]
|
- uses: ros-tooling/[email protected]
|
||||||
with:
|
with:
|
||||||
required-ros-distributions: ${{ matrix.ros_distribution }}
|
required-ros-distributions: ${{ matrix.ros_distribution }}
|
||||||
|
|||||||
@@ -15,14 +15,14 @@ jobs:
|
|||||||
# $ sudo apt-get upgrade qemu-user-static
|
# $ sudo apt-get upgrade qemu-user-static
|
||||||
# $ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes -c yes
|
# $ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes -c yes
|
||||||
# More info: https://github.com/introlab/rtabmap/issues/1454
|
# More info: https://github.com/introlab/rtabmap/issues/1454
|
||||||
if: false
|
# if: false
|
||||||
|
|
||||||
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]
|
||||||
include:
|
include:
|
||||||
- docker_tag: focal-deps
|
- docker_tag: focal-deps
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
@@ -30,7 +30,6 @@ jobs:
|
|||||||
docker_platforms: |
|
docker_platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
linux/arm64
|
linux/arm64
|
||||||
linux/arm/v7
|
|
||||||
docker_path: 'focal/deps'
|
docker_path: 'focal/deps'
|
||||||
- docker_tag: jammy-deps
|
- docker_tag: jammy-deps
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
@@ -39,12 +38,6 @@ jobs:
|
|||||||
linux/amd64
|
linux/amd64
|
||||||
linux/arm64
|
linux/arm64
|
||||||
docker_path: 'jammy/deps'
|
docker_path: 'jammy/deps'
|
||||||
- docker_tag: jammy-iron-deps
|
|
||||||
docker_tags: |
|
|
||||||
introlab3it/rtabmap:jammy-iron-deps
|
|
||||||
docker_platforms: |
|
|
||||||
linux/amd64
|
|
||||||
docker_path: 'jammy-iron/deps'
|
|
||||||
- docker_tag: noble-deps
|
- docker_tag: noble-deps
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:noble-deps
|
introlab3it/rtabmap:noble-deps
|
||||||
@@ -52,6 +45,13 @@ 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'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
@@ -84,13 +84,13 @@ jobs:
|
|||||||
cache-to: type=inline
|
cache-to: type=inline
|
||||||
|
|
||||||
docker:
|
docker:
|
||||||
#needs: docker_deps
|
needs: docker_deps
|
||||||
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, android23, android24, android26, android30]
|
||||||
include:
|
include:
|
||||||
- docker_tag: bionic
|
- docker_tag: bionic
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
@@ -112,7 +112,6 @@ jobs:
|
|||||||
docker_platforms: |
|
docker_platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
linux/arm64
|
linux/arm64
|
||||||
linux/arm/v7
|
|
||||||
docker_path: 'focal'
|
docker_path: 'focal'
|
||||||
- docker_tag: jammy
|
- docker_tag: jammy
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
@@ -124,14 +123,6 @@ jobs:
|
|||||||
linux/amd64
|
linux/amd64
|
||||||
linux/arm64
|
linux/arm64
|
||||||
docker_path: 'jammy'
|
docker_path: 'jammy'
|
||||||
- docker_tag: jammy-iron
|
|
||||||
docker_tags: |
|
|
||||||
introlab3it/rtabmap:jammy-iron
|
|
||||||
docker_args: |
|
|
||||||
NOT_USED=0
|
|
||||||
docker_platforms: |
|
|
||||||
linux/amd64
|
|
||||||
docker_path: 'jammy-iron'
|
|
||||||
- docker_tag: noble
|
- docker_tag: noble
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:noble
|
introlab3it/rtabmap:noble
|
||||||
@@ -142,6 +133,15 @@ 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: android23
|
- docker_tag: android23
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:android23
|
introlab3it/rtabmap:android23
|
||||||
@@ -150,7 +150,7 @@ jobs:
|
|||||||
API_VERSION=23
|
API_VERSION=23
|
||||||
docker_platforms: |
|
docker_platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
docker_path: 'bionic/android/rtabmap_apiXX'
|
docker_path: 'noble/android/rtabmap_apiXX'
|
||||||
- docker_tag: android24
|
- docker_tag: android24
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:android24
|
introlab3it/rtabmap:android24
|
||||||
@@ -158,7 +158,7 @@ jobs:
|
|||||||
API_VERSION=24
|
API_VERSION=24
|
||||||
docker_platforms: |
|
docker_platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
docker_path: 'bionic/android/rtabmap_apiXX'
|
docker_path: 'noble/android/rtabmap_apiXX'
|
||||||
- docker_tag: android26
|
- docker_tag: android26
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:android26
|
introlab3it/rtabmap:android26
|
||||||
@@ -166,7 +166,7 @@ jobs:
|
|||||||
API_VERSION=26
|
API_VERSION=26
|
||||||
docker_platforms: |
|
docker_platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
docker_path: 'bionic/android/rtabmap_apiXX'
|
docker_path: 'noble/android/rtabmap_apiXX'
|
||||||
- docker_tag: android30
|
- docker_tag: android30
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:android30
|
introlab3it/rtabmap:android30
|
||||||
@@ -174,7 +174,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:
|
||||||
-
|
-
|
||||||
|
|||||||
+5
-5
@@ -19,8 +19,8 @@ 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 22)
|
||||||
SET(RTABMAP_PATCH_VERSION 14)
|
SET(RTABMAP_PATCH_VERSION 0)
|
||||||
SET(RTABMAP_VERSION
|
SET(RTABMAP_VERSION
|
||||||
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
||||||
|
|
||||||
@@ -1428,11 +1428,11 @@ 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(WITH_PYTHON AND Python3_FOUND)
|
IF(WITH_PYTHON AND Python3_FOUND)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
+130
-123
@@ -41,9 +41,6 @@ namespace rtabmap {
|
|||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
// CameraMobile
|
// CameraMobile
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
const float CameraMobile::bilateralFilteringSigmaS = 2.0f;
|
|
||||||
const float CameraMobile::bilateralFilteringSigmaR = 0.075f;
|
|
||||||
|
|
||||||
const rtabmap::Transform CameraMobile::opticalRotation = Transform(
|
const rtabmap::Transform CameraMobile::opticalRotation = Transform(
|
||||||
0.0f, 0.0f, 1.0f, 0.0f,
|
0.0f, 0.0f, 1.0f, 0.0f,
|
||||||
-1.0f, 0.0f, 0.0f, 0.0f,
|
-1.0f, 0.0f, 0.0f, 0.0f,
|
||||||
@@ -53,13 +50,12 @@ const rtabmap::Transform CameraMobile::opticalRotationInv = Transform(
|
|||||||
0.0f, 0.0f, -1.0f, 0.0f,
|
0.0f, 0.0f, -1.0f, 0.0f,
|
||||||
1.0f, 0.0f, 0.0f, 0.0f);
|
1.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
CameraMobile::CameraMobile(bool smoothing, float upstreamRelocalizationAccThr) :
|
CameraMobile::CameraMobile(float upstreamRelocalizationAccThr) :
|
||||||
Camera(10),
|
Camera(10),
|
||||||
deviceTColorCamera_(Transform::getIdentity()),
|
deviceTColorCamera_(Transform::getIdentity()),
|
||||||
textureId_(0),
|
textureId_(0),
|
||||||
uvs_initialized_(false),
|
uvs_initialized_(false),
|
||||||
stampEpochOffset_(0.0),
|
stampEpochOffset_(0.0),
|
||||||
smoothing_(smoothing),
|
|
||||||
colorCameraToDisplayRotation_(ROTATION_0),
|
colorCameraToDisplayRotation_(ROTATION_0),
|
||||||
originUpdate_(true),
|
originUpdate_(true),
|
||||||
upstreamRelocalizationAccThr_(upstreamRelocalizationAccThr),
|
upstreamRelocalizationAccThr_(upstreamRelocalizationAccThr),
|
||||||
@@ -394,124 +390,135 @@ SensorData CameraMobile::updateDataOnRender(Transform & pose)
|
|||||||
void CameraMobile::postUpdate()
|
void CameraMobile::postUpdate()
|
||||||
{
|
{
|
||||||
if(data_.isValid())
|
if(data_.isValid())
|
||||||
{
|
{
|
||||||
// adjust origin
|
// adjust origin
|
||||||
if(!originOffset_.isNull())
|
if(!originOffset_.isNull())
|
||||||
{
|
{
|
||||||
dataPose_ = originOffset_ * dataPose_;
|
dataPose_ = originOffset_ * dataPose_;
|
||||||
viewMatrix_ = glm::inverse(rtabmap::glmFromTransform(rtabmap::opengl_world_T_rtabmap_world * originOffset_ *rtabmap::rtabmap_world_T_opengl_world)*glm::inverse(viewMatrix_));
|
viewMatrix_ = glm::inverse(rtabmap::glmFromTransform(rtabmap::opengl_world_T_rtabmap_world * originOffset_ *rtabmap::rtabmap_world_T_opengl_world)*glm::inverse(viewMatrix_));
|
||||||
occlusionModel_.setLocalTransform(originOffset_ * occlusionModel_.localTransform());
|
occlusionModel_.setLocalTransform(originOffset_ * occlusionModel_.localTransform());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(lastKnownGPS_.stamp() > 0.0 && data_.stamp()-lastKnownGPS_.stamp()<1.0)
|
if(lastKnownGPS_.stamp() > 0.0 && data_.stamp()-lastKnownGPS_.stamp()<1.0)
|
||||||
{
|
{
|
||||||
data_.setGPS(lastKnownGPS_);
|
data_.setGPS(lastKnownGPS_);
|
||||||
}
|
}
|
||||||
else if(lastKnownGPS_.stamp()>0.0)
|
else if(lastKnownGPS_.stamp()>0.0)
|
||||||
{
|
{
|
||||||
LOGD("GPS too old (current time=%f, gps time = %f)", data_.stamp(), lastKnownGPS_.stamp());
|
LOGD("GPS too old (current time=%f, gps time = %f)", data_.stamp(), lastKnownGPS_.stamp());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(lastEnvSensors_.size())
|
if(lastEnvSensors_.size())
|
||||||
{
|
{
|
||||||
data_.setEnvSensors(lastEnvSensors_);
|
data_.setEnvSensors(lastEnvSensors_);
|
||||||
lastEnvSensors_.clear();
|
lastEnvSensors_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(smoothing_ && !data_.depthRaw().empty())
|
|
||||||
{
|
// Rotate image depending on the camera orientation
|
||||||
//UTimer t;
|
if(colorCameraToDisplayRotation_ == ROTATION_90)
|
||||||
data_.setDepthOrRightRaw(rtabmap::util2d::fastBilateralFiltering(data_.depthRaw(), bilateralFilteringSigmaS, bilateralFilteringSigmaR));
|
{
|
||||||
//LOGD("Bilateral filtering, time=%fs", t.ticks());
|
UDEBUG("ROTATION_90");
|
||||||
}
|
cv::Mat rgb, depth, confidence;
|
||||||
|
cv::Mat rgbt;
|
||||||
// Rotate image depending on the camera orientation
|
cv::flip(data_.imageRaw(),rgb,1);
|
||||||
if(colorCameraToDisplayRotation_ == ROTATION_90)
|
cv::transpose(rgb,rgbt);
|
||||||
{
|
rgb = rgbt;
|
||||||
UDEBUG("ROTATION_90");
|
cv::Mat deptht;
|
||||||
cv::Mat rgb, depth;
|
cv::flip(data_.depthRaw(),depth,1);
|
||||||
cv::Mat rgbt(data_.imageRaw().cols, data_.imageRaw().rows, data_.imageRaw().type());
|
cv::transpose(depth,deptht);
|
||||||
cv::flip(data_.imageRaw(),rgb,1);
|
depth = deptht;
|
||||||
cv::transpose(rgb,rgbt);
|
if(!data_.depthConfidenceRaw().empty()) {
|
||||||
rgb = rgbt;
|
cv::Mat conft;
|
||||||
cv::Mat deptht(data_.depthRaw().cols, data_.depthRaw().rows, data_.depthRaw().type());
|
cv::flip(data_.depthConfidenceRaw(),confidence,1);
|
||||||
cv::flip(data_.depthRaw(),depth,1);
|
cv::transpose(confidence,conft);
|
||||||
cv::transpose(depth,deptht);
|
confidence = conft;
|
||||||
depth = deptht;
|
}
|
||||||
CameraModel model = data_.cameraModels()[0];
|
CameraModel model = data_.cameraModels()[0];
|
||||||
cv::Size sizet(model.imageHeight(), model.imageWidth());
|
cv::Size sizet(model.imageHeight(), model.imageWidth());
|
||||||
model = CameraModel(
|
model = CameraModel(
|
||||||
model.fy(),
|
model.fy(),
|
||||||
model.fx(),
|
model.fx(),
|
||||||
model.cy(),
|
model.cy(),
|
||||||
model.cx()>0?model.imageWidth()-model.cx():0,
|
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.localTransform()*rtabmap::Transform(0,-1,0,0, 1,0,0,0, 0,0,1,0));
|
||||||
model.setImageSize(sizet);
|
model.setImageSize(sizet);
|
||||||
data_.setRGBDImage(rgb, depth, model);
|
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,
|
||||||
std::vector<cv::KeyPoint> keypoints = data_.keypoints();
|
model.localTransform()*rtabmap::Transform(0,0,0,0,0,1,0));
|
||||||
for(size_t i=0; i<keypoints.size(); ++i)
|
model.setImageSize(sizet);
|
||||||
{
|
data_.setRGBDImage(rgb, depth, confidence, model);
|
||||||
keypoints[i].pt.x = rgb.cols - data_.keypoints()[i].pt.x;
|
|
||||||
keypoints[i].pt.y = rgb.rows - data_.keypoints()[i].pt.y;
|
std::vector<cv::KeyPoint> keypoints = data_.keypoints();
|
||||||
}
|
for(size_t i=0; i<keypoints.size(); ++i)
|
||||||
data_.setFeatures(keypoints, data_.keypoints3D(), cv::Mat());
|
{
|
||||||
}
|
keypoints[i].pt.x = rgb.cols - data_.keypoints()[i].pt.x;
|
||||||
else if(colorCameraToDisplayRotation_ == ROTATION_270)
|
keypoints[i].pt.y = rgb.rows - data_.keypoints()[i].pt.y;
|
||||||
{
|
}
|
||||||
UDEBUG("ROTATION_270");
|
data_.setFeatures(keypoints, data_.keypoints3D(), cv::Mat());
|
||||||
cv::Mat rgb(data_.imageRaw().cols, data_.imageRaw().rows, data_.imageRaw().type());
|
}
|
||||||
cv::transpose(data_.imageRaw(),rgb);
|
else if(colorCameraToDisplayRotation_ == ROTATION_270)
|
||||||
cv::flip(rgb,rgb,1);
|
{
|
||||||
cv::Mat depth(data_.depthOrRightRaw().cols, data_.depthOrRightRaw().rows, data_.depthOrRightRaw().type());
|
UDEBUG("ROTATION_270");
|
||||||
cv::transpose(data_.depthOrRightRaw(),depth);
|
cv::Mat rgb, depth, confidence;
|
||||||
cv::flip(depth,depth,1);
|
cv::transpose(data_.imageRaw(),rgb);
|
||||||
CameraModel model = data_.cameraModels()[0];
|
cv::flip(rgb,rgb,1);
|
||||||
cv::Size sizet(model.imageHeight(), model.imageWidth());
|
cv::transpose(data_.depthOrRightRaw(),depth);
|
||||||
model = CameraModel(
|
cv::flip(depth,depth,1);
|
||||||
model.fy(),
|
if(!data_.depthConfidenceRaw().empty()) {
|
||||||
model.fx(),
|
cv::transpose(data_.depthConfidenceRaw(),confidence);
|
||||||
model.cy()>0?model.imageHeight()-model.cy():0,
|
cv::flip(confidence,confidence,1);
|
||||||
model.cx(),
|
}
|
||||||
model.localTransform()*rtabmap::Transform(0,1,0,0, -1,0,0,0, 0,0,1,0));
|
CameraModel model = data_.cameraModels()[0];
|
||||||
model.setImageSize(sizet);
|
cv::Size sizet(model.imageHeight(), model.imageWidth());
|
||||||
data_.setRGBDImage(rgb, depth, model);
|
model = CameraModel(
|
||||||
|
model.fy(),
|
||||||
std::vector<cv::KeyPoint> keypoints = data_.keypoints();
|
model.fx(),
|
||||||
for(size_t i=0; i<keypoints.size(); ++i)
|
model.cy()>0?model.imageHeight()-model.cy():0,
|
||||||
{
|
model.cx(),
|
||||||
keypoints[i].pt.x = rgb.cols - data_.keypoints()[i].pt.y;
|
model.localTransform()*rtabmap::Transform(0,1,0,0, -1,0,0,0, 0,0,1,0));
|
||||||
keypoints[i].pt.y = data_.keypoints()[i].pt.x;
|
model.setImageSize(sizet);
|
||||||
}
|
data_.setRGBDImage(rgb, depth, confidence, model);
|
||||||
data_.setFeatures(keypoints, data_.keypoints3D(), cv::Mat());
|
|
||||||
}
|
std::vector<cv::KeyPoint> keypoints = data_.keypoints();
|
||||||
|
for(size_t i=0; i<keypoints.size(); ++i)
|
||||||
|
{
|
||||||
|
keypoints[i].pt.x = rgb.cols - data_.keypoints()[i].pt.y;
|
||||||
|
keypoints[i].pt.y = data_.keypoints()[i].pt.x;
|
||||||
|
}
|
||||||
|
data_.setFeatures(keypoints, data_.keypoints3D(), cv::Mat());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UDEBUG("ROTATION_0");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -70,9 +70,6 @@ private:
|
|||||||
|
|
||||||
class CameraMobile : public Camera, public UEventsSender {
|
class CameraMobile : public Camera, public UEventsSender {
|
||||||
public:
|
public:
|
||||||
static const float bilateralFilteringSigmaS;
|
|
||||||
static const float bilateralFilteringSigmaR;
|
|
||||||
|
|
||||||
static const rtabmap::Transform opticalRotation;
|
static const rtabmap::Transform opticalRotation;
|
||||||
static const rtabmap::Transform opticalRotationInv;
|
static const rtabmap::Transform opticalRotationInv;
|
||||||
|
|
||||||
@@ -87,7 +84,7 @@ public:
|
|||||||
int kptsSize = 3);
|
int kptsSize = 3);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CameraMobile(bool smoothing = false, float upstreamRelocalizationAccThr = 0.0f);
|
CameraMobile(float upstreamRelocalizationAccThr = 0.0f);
|
||||||
virtual ~CameraMobile();
|
virtual ~CameraMobile();
|
||||||
|
|
||||||
// abstract functions
|
// abstract functions
|
||||||
@@ -110,7 +107,6 @@ public:
|
|||||||
|
|
||||||
const CameraModel & getCameraModel() const {return model_;}
|
const CameraModel & getCameraModel() const {return model_;}
|
||||||
const Transform & getDeviceTColorCamera() const {return deviceTColorCamera_;}
|
const Transform & getDeviceTColorCamera() const {return deviceTColorCamera_;}
|
||||||
void setSmoothing(bool enabled) {smoothing_ = enabled;}
|
|
||||||
virtual void setScreenRotationAndSize(ScreenRotation colorCameraToDisplayRotation, int width, int height) {colorCameraToDisplayRotation_ = colorCameraToDisplayRotation;}
|
virtual void setScreenRotationAndSize(ScreenRotation colorCameraToDisplayRotation, int width, int height) {colorCameraToDisplayRotation_ = colorCameraToDisplayRotation;}
|
||||||
void setGPS(const GPS & gps);
|
void setGPS(const GPS & gps);
|
||||||
void addEnvSensor(int type, float value);
|
void addEnvSensor(int type, float value);
|
||||||
@@ -144,7 +140,6 @@ protected:
|
|||||||
private:
|
private:
|
||||||
bool firstFrame_;
|
bool firstFrame_;
|
||||||
double stampEpochOffset_;
|
double stampEpochOffset_;
|
||||||
bool smoothing_;
|
|
||||||
ScreenRotation colorCameraToDisplayRotation_;
|
ScreenRotation colorCameraToDisplayRotation_;
|
||||||
GPS lastKnownGPS_;
|
GPS lastKnownGPS_;
|
||||||
EnvSensors lastEnvSensors_;
|
EnvSensors lastEnvSensors_;
|
||||||
|
|||||||
@@ -114,8 +114,7 @@ void onTangoEventAvailableRouter(void* context, const TangoEvent* event)
|
|||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
// CameraTango
|
// CameraTango
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
CameraTango::CameraTango(bool colorCamera, int decimation, bool publishRawScan, bool smoothing) :
|
CameraTango::CameraTango(bool colorCamera, int decimation, bool publishRawScan) :
|
||||||
CameraMobile(smoothing),
|
|
||||||
tango_config_(0),
|
tango_config_(0),
|
||||||
colorCamera_(colorCamera),
|
colorCamera_(colorCamera),
|
||||||
decimation_(decimation),
|
decimation_(decimation),
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ namespace rtabmap {
|
|||||||
|
|
||||||
class CameraTango : public CameraMobile {
|
class CameraTango : public CameraMobile {
|
||||||
public:
|
public:
|
||||||
CameraTango(bool colorCamera, int decimation, bool publishRawScan, bool smoothing);
|
CameraTango(bool colorCamera, int decimation, bool publishRawScan);
|
||||||
virtual ~CameraTango();
|
virtual ~CameraTango();
|
||||||
|
|
||||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
|
|||||||
+169
-55
@@ -84,6 +84,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
const int g_optMeshId = -100;
|
const int g_optMeshId = -100;
|
||||||
|
|
||||||
|
const float g_bilateralFilteringSigmaS = 2.0f;
|
||||||
|
const float g_bilateralFilteringSigmaR = 0.075f;
|
||||||
|
|
||||||
#ifdef __ANDROID__
|
#ifdef __ANDROID__
|
||||||
static JavaVM *jvm;
|
static JavaVM *jvm;
|
||||||
static jobject RTABMapActivity = 0;
|
static jobject RTABMapActivity = 0;
|
||||||
@@ -230,6 +233,7 @@ RTABMapApp::RTABMapApp() :
|
|||||||
trajectoryMode_(false),
|
trajectoryMode_(false),
|
||||||
rawScanSaved_(false),
|
rawScanSaved_(false),
|
||||||
smoothing_(true),
|
smoothing_(true),
|
||||||
|
depthBleedingError_(0.0f),
|
||||||
depthFromMotion_(false),
|
depthFromMotion_(false),
|
||||||
cameraColor_(true),
|
cameraColor_(true),
|
||||||
fullResolution_(false),
|
fullResolution_(false),
|
||||||
@@ -245,7 +249,11 @@ RTABMapApp::RTABMapApp() :
|
|||||||
maxGainRadius_(0.02f),
|
maxGainRadius_(0.02f),
|
||||||
renderingTextureDecimation_(4),
|
renderingTextureDecimation_(4),
|
||||||
backgroundColor_(0.2f),
|
backgroundColor_(0.2f),
|
||||||
depthConfidence_(2),
|
#ifndef RTABMAP_ARCORE
|
||||||
|
depthConfidence_(100), // iOS
|
||||||
|
#else
|
||||||
|
depthConfidence_(0),
|
||||||
|
#endif
|
||||||
upstreamRelocalizationMaxAcc_(0.0f),
|
upstreamRelocalizationMaxAcc_(0.0f),
|
||||||
exportPointCloudFormat_("ply"),
|
exportPointCloudFormat_("ply"),
|
||||||
dataRecorderMode_(false),
|
dataRecorderMode_(false),
|
||||||
@@ -266,20 +274,20 @@ RTABMapApp::RTABMapApp() :
|
|||||||
lastPoseEventTime_(0.0),
|
lastPoseEventTime_(0.0),
|
||||||
visualizingMesh_(false),
|
visualizingMesh_(false),
|
||||||
exportedMeshUpdated_(false),
|
exportedMeshUpdated_(false),
|
||||||
|
optTextureMesh_(new pcl::TextureMesh),
|
||||||
|
optRefId_(0),
|
||||||
|
optRefPose_(0),
|
||||||
measuresUpdated_(false),
|
measuresUpdated_(false),
|
||||||
targetPoint_(new pcl::PointCloud<pcl::PointXYZRGB>),
|
metricSystem_(true),
|
||||||
quadSample_(new pcl::PointCloud<pcl::PointXYZ>),
|
|
||||||
quadSamplePolygons_(2),
|
|
||||||
metricSystem_(true),
|
|
||||||
measuringTextSize_(0.05f),
|
measuringTextSize_(0.05f),
|
||||||
snapAxisThr_(0.95),
|
snapAxisThr_(0.95),
|
||||||
measuringMode_(0),
|
measuringMode_(0),
|
||||||
addMeasureClicked_(false),
|
addMeasureClicked_(false),
|
||||||
teleportClicked_(false),
|
teleportClicked_(false),
|
||||||
removeMeasureClicked_(false),
|
removeMeasureClicked_(false),
|
||||||
optTextureMesh_(new pcl::TextureMesh),
|
targetPoint_(new pcl::PointCloud<pcl::PointXYZRGB>),
|
||||||
optRefId_(0),
|
quadSample_(new pcl::PointCloud<pcl::PointXYZ>),
|
||||||
optRefPose_(0),
|
quadSamplePolygons_(2),
|
||||||
mapToOdom_(rtabmap::Transform::getIdentity())
|
mapToOdom_(rtabmap::Transform::getIdentity())
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -461,7 +469,13 @@ int RTABMapApp::openDatabase(const std::string & databasePath, bool databaseInMe
|
|||||||
LOGI("Open: Found optimized mesh! Visualizing it.");
|
LOGI("Open: Found optimized mesh! Visualizing it.");
|
||||||
optTextureMesh_ = rtabmap::util3d::assembleTextureMesh(cloudMat, polygons, texCoords, textures, true);
|
optTextureMesh_ = rtabmap::util3d::assembleTextureMesh(cloudMat, polygons, texCoords, textures, true);
|
||||||
optMesh_ = rtabmap::Mesh();
|
optMesh_ = rtabmap::Mesh();
|
||||||
optTexture_ = textures;
|
if(textures.rows > 4096) // Limitation iOS, just for rendering on device
|
||||||
|
{
|
||||||
|
cv::resize(textures, optTexture_, cv::Size(4096, 4096), 0.0f, 0.0f, cv::INTER_AREA);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
optTexture_ = textures;
|
||||||
|
}
|
||||||
if(!optTexture_.empty())
|
if(!optTexture_.empty())
|
||||||
{
|
{
|
||||||
LOGI("Open: Texture mesh: %dx%d.", optTexture_.cols, optTexture_.rows);
|
LOGI("Open: Texture mesh: %dx%d.", optTexture_.cols, optTexture_.rows);
|
||||||
@@ -569,8 +583,8 @@ int RTABMapApp::openDatabase(const std::string & databasePath, bool databaseInMe
|
|||||||
rtabmap::SensorData data = signatures.at(id).sensorData();
|
rtabmap::SensorData data = signatures.at(id).sensorData();
|
||||||
rawPoses_.insert(std::make_pair(id, signatures.at(id).getPose()));
|
rawPoses_.insert(std::make_pair(id, signatures.at(id).getPose()));
|
||||||
|
|
||||||
cv::Mat tmpA, depth;
|
cv::Mat tmpA, tmpB, tmpC;
|
||||||
data.uncompressData(&tmpA, &depth);
|
data.uncompressData(&tmpA, &tmpB, 0, 0, 0, 0, 0, depthConfidence_>0?&tmpC:0);
|
||||||
|
|
||||||
if(!(!data.imageRaw().empty() && !data.depthRaw().empty()) && !data.laserScanCompressed().isEmpty())
|
if(!(!data.imageRaw().empty() && !data.depthRaw().empty()) && !data.laserScanCompressed().isEmpty())
|
||||||
{
|
{
|
||||||
@@ -586,8 +600,30 @@ int RTABMapApp::openDatabase(const std::string & databasePath, bool databaseInMe
|
|||||||
if(!data.imageRaw().empty() && !data.depthRaw().empty() && (!useExternalLidar_ || data.laserScanRaw().isEmpty()))
|
if(!data.imageRaw().empty() && !data.depthRaw().empty() && (!useExternalLidar_ || data.laserScanRaw().isEmpty()))
|
||||||
{
|
{
|
||||||
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
||||||
|
|
||||||
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get());
|
if(smoothing_ || depthBleedingError_>0.0f)
|
||||||
|
{
|
||||||
|
cv::Mat depth = data.depthRaw();
|
||||||
|
if(depthBleedingError_ > 0.0f)
|
||||||
|
{
|
||||||
|
rtabmap::util2d::depthBleedingFiltering(depth, depthBleedingError_);
|
||||||
|
}
|
||||||
|
if(smoothing_)
|
||||||
|
{
|
||||||
|
depth = rtabmap::util2d::fastBilateralFiltering(depth, g_bilateralFilteringSigmaS, g_bilateralFilteringSigmaR);
|
||||||
|
}
|
||||||
|
data.setRGBDImage(data.imageRaw(), depth, data.depthConfidenceRaw(), data.cameraModels());
|
||||||
|
}
|
||||||
|
|
||||||
|
cloud = rtabmap::util3d::cloudRGBFromSensorData(
|
||||||
|
data,
|
||||||
|
meshDecimation,
|
||||||
|
maxCloudDepth_,
|
||||||
|
minCloudDepth_,
|
||||||
|
indices.get(),
|
||||||
|
rtabmap::ParametersMap(),
|
||||||
|
std::vector<float>(),
|
||||||
|
depthConfidence_);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -875,11 +911,11 @@ int RTABMapApp::updateMeshDecimation(int width, int height)
|
|||||||
{
|
{
|
||||||
meshDecimation = 5;
|
meshDecimation = 5;
|
||||||
}
|
}
|
||||||
else if(width % 3 == 0 && width % 3 == 0)
|
else if(width % 3 == 0 && height % 3 == 0)
|
||||||
{
|
{
|
||||||
meshDecimation = 3;
|
meshDecimation = 3;
|
||||||
}
|
}
|
||||||
else if(width % 2 == 0 && width % 2 == 0)
|
else if(width % 2 == 0 && height % 2 == 0)
|
||||||
{
|
{
|
||||||
meshDecimation = 2;
|
meshDecimation = 2;
|
||||||
}
|
}
|
||||||
@@ -946,7 +982,7 @@ bool RTABMapApp::startCamera()
|
|||||||
if(cameraDriver_ == 0) // Tango
|
if(cameraDriver_ == 0) // Tango
|
||||||
{
|
{
|
||||||
#ifdef RTABMAP_TANGO
|
#ifdef RTABMAP_TANGO
|
||||||
camera_ = new rtabmap::CameraTango(cameraColor_, !cameraColor_ || fullResolution_?1:2, rawScanSaved_, smoothing_);
|
camera_ = new rtabmap::CameraTango(cameraColor_, !cameraColor_ || fullResolution_?1:2, rawScanSaved_);
|
||||||
|
|
||||||
if (TangoService_setBinder(env, iBinder) != TANGO_SUCCESS) {
|
if (TangoService_setBinder(env, iBinder) != TANGO_SUCCESS) {
|
||||||
UERROR("TangoHandler::ConnectTango, TangoService_setBinder error");
|
UERROR("TangoHandler::ConnectTango, TangoService_setBinder error");
|
||||||
@@ -961,7 +997,7 @@ bool RTABMapApp::startCamera()
|
|||||||
else if(cameraDriver_ == 1)
|
else if(cameraDriver_ == 1)
|
||||||
{
|
{
|
||||||
#ifdef RTABMAP_ARCORE
|
#ifdef RTABMAP_ARCORE
|
||||||
camera_ = new rtabmap::CameraARCore(env, context, activity, depthFromMotion_, smoothing_, upstreamRelocalizationMaxAcc_);
|
camera_ = new rtabmap::CameraARCore(env, context, activity, depthFromMotion_, upstreamRelocalizationMaxAcc_);
|
||||||
#else
|
#else
|
||||||
UERROR("RTAB-Map is not built with ARCore support!");
|
UERROR("RTAB-Map is not built with ARCore support!");
|
||||||
#endif
|
#endif
|
||||||
@@ -969,14 +1005,14 @@ bool RTABMapApp::startCamera()
|
|||||||
else if(cameraDriver_ == 2)
|
else if(cameraDriver_ == 2)
|
||||||
{
|
{
|
||||||
#ifdef RTABMAP_ARENGINE
|
#ifdef RTABMAP_ARENGINE
|
||||||
camera_ = new rtabmap::CameraAREngine(env, context, activity, smoothing_, upstreamRelocalizationMaxAcc_);
|
camera_ = new rtabmap::CameraAREngine(env, context, activity, upstreamRelocalizationMaxAcc_);
|
||||||
#else
|
#else
|
||||||
UERROR("RTAB-Map is not built with AREngine support!");
|
UERROR("RTAB-Map is not built with AREngine support!");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if(cameraDriver_ == 3)
|
else if(cameraDriver_ == 3)
|
||||||
{
|
{
|
||||||
camera_ = new rtabmap::CameraMobile(smoothing_, upstreamRelocalizationMaxAcc_);
|
camera_ = new rtabmap::CameraMobile(upstreamRelocalizationMaxAcc_);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(camera_ == 0)
|
if(camera_ == 0)
|
||||||
@@ -1003,7 +1039,11 @@ bool RTABMapApp::startCamera()
|
|||||||
cameraJustInitialized_ = true;
|
cameraJustInitialized_ = true;
|
||||||
if(useExternalLidar_)
|
if(useExternalLidar_)
|
||||||
{
|
{
|
||||||
|
#if BOOST_VERSION >= 108700
|
||||||
|
rtabmap::LidarVLP16 * lidar = new rtabmap::LidarVLP16(boost::asio::ip::make_address("192.168.1.201"), 2368, true);
|
||||||
|
#else
|
||||||
rtabmap::LidarVLP16 * lidar = new rtabmap::LidarVLP16(boost::asio::ip::address_v4::from_string("192.168.1.201"), 2368, true);
|
rtabmap::LidarVLP16 * lidar = new rtabmap::LidarVLP16(boost::asio::ip::address_v4::from_string("192.168.1.201"), 2368, true);
|
||||||
|
#endif
|
||||||
lidar->init();
|
lidar->init();
|
||||||
camera_->setImageRate(0); // if lidar, to get close camera synchronization
|
camera_->setImageRate(0); // if lidar, to get close camera synchronization
|
||||||
sensorCaptureThread_ = new rtabmap::SensorCaptureThread(lidar, camera_, camera_, rtabmap::Transform::getIdentity());
|
sensorCaptureThread_ = new rtabmap::SensorCaptureThread(lidar, camera_, camera_, rtabmap::Transform::getIdentity());
|
||||||
@@ -1354,8 +1394,8 @@ int RTABMapApp::Render()
|
|||||||
#ifdef DEBUG_RENDERING_PERFORMANCE
|
#ifdef DEBUG_RENDERING_PERFORMANCE
|
||||||
LOGD("Camera updateOnRender %fs", time.ticks());
|
LOGD("Camera updateOnRender %fs", time.ticks());
|
||||||
#endif
|
#endif
|
||||||
// We detect if we are in measuring mode if rtabmap is not running
|
// We check if we are in measuring mode: not visualizing mesh or rtabmap is not started (localization mode)
|
||||||
if(main_scene_.background_renderer_ == 0 && camera_->getTextureId() != 0 && !(rtabmapThread_ == 0 || !rtabmapThread_->isRunning()))
|
if(main_scene_.background_renderer_ == 0 && camera_->getTextureId() != 0 && (!visualizingMesh_ || !(rtabmapThread_ == 0 || !rtabmapThread_->isRunning())))
|
||||||
{
|
{
|
||||||
main_scene_.background_renderer_ = new BackgroundRenderer();
|
main_scene_.background_renderer_ = new BackgroundRenderer();
|
||||||
main_scene_.background_renderer_->InitializeGlContent(((rtabmap::CameraMobile*)camera_)->getTextureId(), cameraDriver_ <= 2);
|
main_scene_.background_renderer_->InitializeGlContent(((rtabmap::CameraMobile*)camera_)->getTextureId(), cameraDriver_ <= 2);
|
||||||
@@ -1536,7 +1576,6 @@ int RTABMapApp::Render()
|
|||||||
int textId = 0;
|
int textId = 0;
|
||||||
int quadId = 0;
|
int quadId = 0;
|
||||||
int circleId = 0;
|
int circleId = 0;
|
||||||
float sphereRadius = 0.02f;
|
|
||||||
float quadSize=0.05f;
|
float quadSize=0.05f;
|
||||||
float quadAlpha = 0.3f;
|
float quadAlpha = 0.3f;
|
||||||
|
|
||||||
@@ -2010,8 +2049,8 @@ int RTABMapApp::Render()
|
|||||||
{
|
{
|
||||||
rtabmap::SensorData data = bufferedSensorData.at(id);
|
rtabmap::SensorData data = bufferedSensorData.at(id);
|
||||||
|
|
||||||
cv::Mat tmpA, depth;
|
cv::Mat tmpA, tmpB, tmpC;
|
||||||
data.uncompressData(&tmpA, &depth);
|
data.uncompressData(&tmpA, &tmpB, 0, 0, 0, 0, 0, depthConfidence_>0?&tmpC:0);
|
||||||
if(!(!data.imageRaw().empty() && !data.depthRaw().empty()) && !data.laserScanCompressed().isEmpty())
|
if(!(!data.imageRaw().empty() && !data.depthRaw().empty()) && !data.laserScanCompressed().isEmpty())
|
||||||
{
|
{
|
||||||
rtabmap::LaserScan scan;
|
rtabmap::LaserScan scan;
|
||||||
@@ -2029,7 +2068,20 @@ int RTABMapApp::Render()
|
|||||||
if(!data.imageRaw().empty() && !data.depthRaw().empty() && (!useExternalLidar_ || data.laserScanRaw().isEmpty()))
|
if(!data.imageRaw().empty() && !data.depthRaw().empty() && (!useExternalLidar_ || data.laserScanRaw().isEmpty()))
|
||||||
{
|
{
|
||||||
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
||||||
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get());
|
if(smoothing_ || depthBleedingError_>0.0f)
|
||||||
|
{
|
||||||
|
cv::Mat depth = data.depthRaw();
|
||||||
|
if(depthBleedingError_ > 0.0f)
|
||||||
|
{
|
||||||
|
rtabmap::util2d::depthBleedingFiltering(depth, depthBleedingError_);
|
||||||
|
}
|
||||||
|
if(smoothing_)
|
||||||
|
{
|
||||||
|
depth = rtabmap::util2d::fastBilateralFiltering(depth, g_bilateralFilteringSigmaS, g_bilateralFilteringSigmaR);
|
||||||
|
}
|
||||||
|
data.setRGBDImage(data.imageRaw(), depth, data.depthConfidenceRaw(), data.cameraModels());
|
||||||
|
}
|
||||||
|
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get(), rtabmap::ParametersMap(), std::vector<float>(), depthConfidence_);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2245,7 +2297,7 @@ int RTABMapApp::Render()
|
|||||||
if(!sensorEvent.data().imageRaw().empty() && !sensorEvent.data().depthRaw().empty() && (!useExternalLidar_ || sensorEvent.data().laserScanRaw().isEmpty()))
|
if(!sensorEvent.data().imageRaw().empty() && !sensorEvent.data().depthRaw().empty() && (!useExternalLidar_ || sensorEvent.data().laserScanRaw().isEmpty()))
|
||||||
{
|
{
|
||||||
int meshDecimation = updateMeshDecimation(sensorEvent.data().depthRaw().cols, sensorEvent.data().depthRaw().rows);
|
int meshDecimation = updateMeshDecimation(sensorEvent.data().depthRaw().cols, sensorEvent.data().depthRaw().rows);
|
||||||
cloud = rtabmap::util3d::cloudRGBFromSensorData(sensorEvent.data(), meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get());
|
cloud = rtabmap::util3d::cloudRGBFromSensorData(sensorEvent.data(), meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get(), rtabmap::ParametersMap(), std::vector<float>(), depthConfidence_);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -3015,6 +3067,11 @@ void RTABMapApp::setSmoothing(bool enabled)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RTABMapApp::setDepthBleedingError(float value)
|
||||||
|
{
|
||||||
|
depthBleedingError_ = value;
|
||||||
|
}
|
||||||
|
|
||||||
void RTABMapApp::setDepthFromMotion(bool enabled)
|
void RTABMapApp::setDepthFromMotion(bool enabled)
|
||||||
{
|
{
|
||||||
if(depthFromMotion_ != enabled)
|
if(depthFromMotion_ != enabled)
|
||||||
@@ -3107,10 +3164,10 @@ void RTABMapApp::setBackgroundColor(float gray)
|
|||||||
|
|
||||||
void RTABMapApp::setDepthConfidence(int value)
|
void RTABMapApp::setDepthConfidence(int value)
|
||||||
{
|
{
|
||||||
depthConfidence_ = value;
|
depthConfidence_ = value*50; // [0,2] -> [0,100]
|
||||||
if(depthConfidence_>2)
|
if(depthConfidence_>100)
|
||||||
{
|
{
|
||||||
depthConfidence_ = 2;
|
depthConfidence_ = 100;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3410,6 +3467,19 @@ bool RTABMapApp::exportMesh(
|
|||||||
if(!data.imageRaw().empty() && !data.depthRaw().empty() && data.cameraModels().size() == 1)
|
if(!data.imageRaw().empty() && !data.depthRaw().empty() && data.cameraModels().size() == 1)
|
||||||
{
|
{
|
||||||
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
||||||
|
if(smoothing_ || depthBleedingError_>0.0f)
|
||||||
|
{
|
||||||
|
cv::Mat depth = data.depthRaw();
|
||||||
|
if(depthBleedingError_ > 0.0f)
|
||||||
|
{
|
||||||
|
rtabmap::util2d::depthBleedingFiltering(depth, depthBleedingError_);
|
||||||
|
}
|
||||||
|
if(smoothing_)
|
||||||
|
{
|
||||||
|
depth = rtabmap::util2d::fastBilateralFiltering(depth, g_bilateralFilteringSigmaS, g_bilateralFilteringSigmaR);
|
||||||
|
}
|
||||||
|
data.setRGBDImage(data.imageRaw(), depth, data.depthConfidenceRaw(), data.cameraModels());
|
||||||
|
}
|
||||||
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get());
|
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get());
|
||||||
model = data.cameraModels()[0];
|
model = data.cameraModels()[0];
|
||||||
depth = data.depthRaw();
|
depth = data.depthRaw();
|
||||||
@@ -3677,7 +3747,20 @@ bool RTABMapApp::exportMesh(
|
|||||||
if(!data.imageRaw().empty() && !data.depthRaw().empty() && data.cameraModels().size() == 1)
|
if(!data.imageRaw().empty() && !data.depthRaw().empty() && data.cameraModels().size() == 1)
|
||||||
{
|
{
|
||||||
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
||||||
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_);
|
if(smoothing_ || depthBleedingError_>0.0f)
|
||||||
|
{
|
||||||
|
cv::Mat depth = data.depthRaw();
|
||||||
|
if(depthBleedingError_ > 0.0f)
|
||||||
|
{
|
||||||
|
rtabmap::util2d::depthBleedingFiltering(depth, depthBleedingError_);
|
||||||
|
}
|
||||||
|
if(smoothing_)
|
||||||
|
{
|
||||||
|
depth = rtabmap::util2d::fastBilateralFiltering(depth, g_bilateralFilteringSigmaS, g_bilateralFilteringSigmaR);
|
||||||
|
}
|
||||||
|
data.setRGBDImage(data.imageRaw(), depth, data.depthConfidenceRaw(), data.cameraModels());
|
||||||
|
}
|
||||||
|
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_, 0, rtabmap::ParametersMap(), std::vector<float>(), depthConfidence_);
|
||||||
polygons = rtabmap::util3d::organizedFastMesh(cloud, meshAngleToleranceDeg_*M_PI/180.0, false, meshTrianglePix_);
|
polygons = rtabmap::util3d::organizedFastMesh(cloud, meshAngleToleranceDeg_*M_PI/180.0, false, meshTrianglePix_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3935,7 +4018,20 @@ bool RTABMapApp::exportMesh(
|
|||||||
if(!data.imageRaw().empty() && !data.depthRaw().empty())
|
if(!data.imageRaw().empty() && !data.depthRaw().empty())
|
||||||
{
|
{
|
||||||
// full resolution
|
// full resolution
|
||||||
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, 1, maxCloudDepth_, minCloudDepth_, indices.get());
|
if(smoothing_ || depthBleedingError_>0.0f)
|
||||||
|
{
|
||||||
|
cv::Mat depth = data.depthRaw();
|
||||||
|
if(depthBleedingError_ > 0.0f)
|
||||||
|
{
|
||||||
|
rtabmap::util2d::depthBleedingFiltering(depth, depthBleedingError_);
|
||||||
|
}
|
||||||
|
if(smoothing_)
|
||||||
|
{
|
||||||
|
depth = rtabmap::util2d::fastBilateralFiltering(depth, g_bilateralFilteringSigmaS, g_bilateralFilteringSigmaR);
|
||||||
|
}
|
||||||
|
data.setRGBDImage(data.imageRaw(), depth, data.depthConfidenceRaw(), data.cameraModels());
|
||||||
|
}
|
||||||
|
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, 1, maxCloudDepth_, minCloudDepth_, indices.get(), rtabmap::ParametersMap(), std::vector<float>(), depthConfidence_);
|
||||||
}
|
}
|
||||||
else if(!data.laserScanRaw().empty())
|
else if(!data.laserScanRaw().empty())
|
||||||
{
|
{
|
||||||
@@ -3965,7 +4061,20 @@ bool RTABMapApp::exportMesh(
|
|||||||
if(!data.imageRaw().empty() && !data.depthRaw().empty())
|
if(!data.imageRaw().empty() && !data.depthRaw().empty())
|
||||||
{
|
{
|
||||||
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
int meshDecimation = updateMeshDecimation(data.depthRaw().cols, data.depthRaw().rows);
|
||||||
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get());
|
if(smoothing_ || depthBleedingError_>0.0f)
|
||||||
|
{
|
||||||
|
cv::Mat depth = data.depthRaw();
|
||||||
|
if(depthBleedingError_ > 0.0f)
|
||||||
|
{
|
||||||
|
rtabmap::util2d::depthBleedingFiltering(depth, depthBleedingError_);
|
||||||
|
}
|
||||||
|
if(smoothing_)
|
||||||
|
{
|
||||||
|
depth = rtabmap::util2d::fastBilateralFiltering(depth, g_bilateralFilteringSigmaS, g_bilateralFilteringSigmaR);
|
||||||
|
}
|
||||||
|
data.setRGBDImage(data.imageRaw(), depth, data.depthConfidenceRaw(), data.cameraModels());
|
||||||
|
}
|
||||||
|
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, meshDecimation, maxCloudDepth_, minCloudDepth_, indices.get(), rtabmap::ParametersMap(), std::vector<float>(), depthConfidence_);
|
||||||
}
|
}
|
||||||
else if(!data.laserScanRaw().empty())
|
else if(!data.laserScanRaw().empty())
|
||||||
{
|
{
|
||||||
@@ -4117,7 +4226,13 @@ bool RTABMapApp::postExportation(bool visualize)
|
|||||||
LOGI("postExportation: Found optimized mesh! Visualizing it.");
|
LOGI("postExportation: Found optimized mesh! Visualizing it.");
|
||||||
optTextureMesh_ = rtabmap::util3d::assembleTextureMesh(cloudMat, polygons, texCoords, textures, true);
|
optTextureMesh_ = rtabmap::util3d::assembleTextureMesh(cloudMat, polygons, texCoords, textures, true);
|
||||||
optMesh_ = rtabmap::Mesh();
|
optMesh_ = rtabmap::Mesh();
|
||||||
optTexture_ = textures;
|
if(textures.rows > 4096) // Limitation iOS, just for rendering on device
|
||||||
|
{
|
||||||
|
cv::resize(textures, optTexture_, cv::Size(4096, 4096), 0.0f, 0.0f, cv::INTER_AREA);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
optTexture_ = textures;
|
||||||
|
}
|
||||||
|
|
||||||
boost::mutex::scoped_lock lock(renderingMutex_);
|
boost::mutex::scoped_lock lock(renderingMutex_);
|
||||||
visualizingMesh_ = true;
|
visualizingMesh_ = true;
|
||||||
@@ -4524,6 +4639,7 @@ void RTABMapApp::postOdometryEvent(
|
|||||||
|
|
||||||
|
|
||||||
cv::Mat outputDepth;
|
cv::Mat outputDepth;
|
||||||
|
cv::Mat outputDepthConfidence;
|
||||||
if(depth && depthHeight>0 && depthWidth>0)
|
if(depth && depthHeight>0 && depthWidth>0)
|
||||||
{
|
{
|
||||||
#ifndef DISABLE_LOG
|
#ifndef DISABLE_LOG
|
||||||
@@ -4533,32 +4649,21 @@ void RTABMapApp::postOdometryEvent(
|
|||||||
{
|
{
|
||||||
// IOS
|
// IOS
|
||||||
outputDepth = cv::Mat(depthHeight, depthWidth, CV_32FC1, (void*)depth).clone();
|
outputDepth = cv::Mat(depthHeight, depthWidth, CV_32FC1, (void*)depth).clone();
|
||||||
if(conf && confWidth == depthWidth && confHeight == depthHeight && confFormat == 1278226488 && depthConfidence_>0)
|
if(conf && confWidth == depthWidth && confHeight == depthHeight && confFormat == 1278226488)
|
||||||
{
|
{
|
||||||
const unsigned char * confPtr = (const unsigned char *)conf;
|
// https://developer.apple.com/documentation/arkit/arconfidencelevel
|
||||||
float * depthPtr = outputDepth.ptr<float>();
|
// 0 = low
|
||||||
int i=0;
|
// 1 = medium
|
||||||
for (int y = 0; y < outputDepth.rows; ++y)
|
// 2 = high
|
||||||
{
|
// Re-scale confidence from [0,2] to [0,100]
|
||||||
for (int x = 0; x < outputDepth.cols; ++x)
|
cv::Mat(depthHeight, depthWidth, CV_8UC1, (void*)conf).convertTo(outputDepthConfidence, CV_8UC1, 50, 0);
|
||||||
{
|
|
||||||
// https://developer.apple.com/documentation/arkit/arconfidencelevel
|
|
||||||
// 0 = low
|
|
||||||
// 1 = medium
|
|
||||||
// 2 = high
|
|
||||||
if(confPtr[y*outputDepth.cols + x] < depthConfidence_)
|
|
||||||
{
|
|
||||||
depthPtr[y*outputDepth.cols + x] = 0.0f;
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(depthLen == 2*depthWidth*depthHeight)
|
else if(depthLen == 2*depthWidth*depthHeight)
|
||||||
{
|
{
|
||||||
// ANDROID
|
// ANDROID
|
||||||
outputDepth = cv::Mat(depthHeight, depthWidth, CV_16UC1);
|
outputDepth = cv::Mat(depthHeight, depthWidth, CV_16UC1);
|
||||||
|
outputDepthConfidence = cv::Mat(depthHeight, depthWidth, CV_8UC1);
|
||||||
uint16_t *dataShort = (uint16_t *)depth;
|
uint16_t *dataShort = (uint16_t *)depth;
|
||||||
for (int y = 0; y < outputDepth.rows; ++y)
|
for (int y = 0; y < outputDepth.rows; ++y)
|
||||||
{
|
{
|
||||||
@@ -4567,6 +4672,13 @@ void RTABMapApp::postOdometryEvent(
|
|||||||
uint16_t depthSample = dataShort[y*outputDepth.cols + x];
|
uint16_t depthSample = dataShort[y*outputDepth.cols + x];
|
||||||
uint16_t depthRange = (depthSample & 0x1FFF); // first 3 bits are confidence
|
uint16_t depthRange = (depthSample & 0x1FFF); // first 3 bits are confidence
|
||||||
outputDepth.at<uint16_t>(y,x) = depthRange;
|
outputDepth.at<uint16_t>(y,x) = depthRange;
|
||||||
|
// https://developer.android.com/reference/android/graphics/ImageFormat#DEPTH16
|
||||||
|
// The confidence value is an estimate of correctness for this sample. It
|
||||||
|
// is encoded in the 3 most significant bits of the sample, with a value of
|
||||||
|
// 0 representing 100% confidence, a value of 1 representing 0% confidence, a
|
||||||
|
// value of 2 representing 1/7, a value of 3 representing 2/7, and so on.
|
||||||
|
uint8_t depthConfidence = uint8_t((depthSample >> 13) & 0x7);
|
||||||
|
outputDepthConfidence.at<uint8_t>(y,x) = depthConfidence == 0 ? 100 : (depthConfidence - 1)*100 / 7;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4626,7 +4738,9 @@ void RTABMapApp::postOdometryEvent(
|
|||||||
depth_fx, 0, depth_cx,
|
depth_fx, 0, depth_cx,
|
||||||
0, depth_fy, depth_cy,
|
0, depth_fy, depth_cy,
|
||||||
0, 0, 1);
|
0, 0, 1);
|
||||||
outputDepth = rtabmap::util2d::registerDepth(outputDepth, depthK, outputDepth.size(), colorK, rgbToDepth);
|
cv::Mat regConfidence;
|
||||||
|
outputDepth = rtabmap::util2d::registerDepth(outputDepth, outputDepthConfidence, depthK, outputDepth.size(), colorK, rgbToDepth, regConfidence);
|
||||||
|
outputDepthConfidence = regConfidence;
|
||||||
#ifndef DISABLE_LOG
|
#ifndef DISABLE_LOG
|
||||||
UDEBUG("Depth registration time: %fs", time.elapsed());
|
UDEBUG("Depth registration time: %fs", time.elapsed());
|
||||||
#endif
|
#endif
|
||||||
@@ -4666,8 +4780,8 @@ void RTABMapApp::postOdometryEvent(
|
|||||||
depthModel.setLocalTransform(pose*model.localTransform());
|
depthModel.setLocalTransform(pose*model.localTransform());
|
||||||
camera_->setOcclusionImage(outputDepth, depthModel);
|
camera_->setOcclusionImage(outputDepth, depthModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
rtabmap::SensorData data(scan, outputRGB, outputDepth, model, 0, stamp);
|
rtabmap::SensorData data(scan, outputRGB, outputDepth, outputDepthConfidence, model, 0, stamp);
|
||||||
data.setFeatures(kpts, kpts3, cv::Mat());
|
data.setFeatures(kpts, kpts3, cv::Mat());
|
||||||
glm::mat4 projectionMatrix(0);
|
glm::mat4 projectionMatrix(0);
|
||||||
projectionMatrix[0][0] = p00;
|
projectionMatrix[0][0] = p00;
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
void setCameraColor(bool enabled);
|
void setCameraColor(bool enabled);
|
||||||
void setFullResolution(bool enabled);
|
void setFullResolution(bool enabled);
|
||||||
void setSmoothing(bool enabled);
|
void setSmoothing(bool enabled);
|
||||||
|
void setDepthBleedingError(float value);
|
||||||
void setDepthFromMotion(bool enabled);
|
void setDepthFromMotion(bool enabled);
|
||||||
void setAppendMode(bool enabled);
|
void setAppendMode(bool enabled);
|
||||||
void setUpstreamRelocalizationAccThr(float value);
|
void setUpstreamRelocalizationAccThr(float value);
|
||||||
@@ -235,6 +236,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
bool trajectoryMode_;
|
bool trajectoryMode_;
|
||||||
bool rawScanSaved_;
|
bool rawScanSaved_;
|
||||||
bool smoothing_;
|
bool smoothing_;
|
||||||
|
float depthBleedingError_;
|
||||||
bool depthFromMotion_;
|
bool depthFromMotion_;
|
||||||
bool cameraColor_;
|
bool cameraColor_;
|
||||||
bool fullResolution_;
|
bool fullResolution_;
|
||||||
@@ -250,7 +252,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
float maxGainRadius_;
|
float maxGainRadius_;
|
||||||
int renderingTextureDecimation_;
|
int renderingTextureDecimation_;
|
||||||
float backgroundColor_;
|
float backgroundColor_;
|
||||||
int depthConfidence_;
|
unsigned char depthConfidence_;
|
||||||
float upstreamRelocalizationMaxAcc_;
|
float upstreamRelocalizationMaxAcc_;
|
||||||
std::string exportPointCloudFormat_;
|
std::string exportPointCloudFormat_;
|
||||||
|
|
||||||
|
|||||||
@@ -512,6 +512,19 @@ Java_com_introlab_rtabmap_RTABMapLib_setSmoothing(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setDepthBleedingError(
|
||||||
|
JNIEnv*, jclass, jlong native_application, float value)
|
||||||
|
{
|
||||||
|
if(native_application)
|
||||||
|
{
|
||||||
|
return native(native_application)->setDepthBleedingError(value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UERROR("native_application is null!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_setDepthFromMotion(
|
Java_com_introlab_rtabmap_RTABMapLib_setDepthFromMotion(
|
||||||
JNIEnv*, jclass, jlong native_application, bool enabled)
|
JNIEnv*, jclass, jlong native_application, bool enabled)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -114,6 +114,13 @@
|
|||||||
android:title="@string/pref_title_smoothing"
|
android:title="@string/pref_title_smoothing"
|
||||||
android:summary="@string/pref_summary_smoothing"
|
android:summary="@string/pref_summary_smoothing"
|
||||||
android:defaultValue="@string/pref_default_smoothing"/>
|
android:defaultValue="@string/pref_default_smoothing"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_depth_bleeding_error"
|
||||||
|
android:title="@string/pref_title_depth_bleeding_error"
|
||||||
|
android:summary="@string/pref_summary_depth_bleeding_error"
|
||||||
|
android:entries="@array/pref_depth_bleeding_error_keys"
|
||||||
|
android:entryValues="@array/pref_depth_bleeding_error_values"
|
||||||
|
android:defaultValue="@string/pref_default_depth_bleeding_error"/>
|
||||||
<com.introlab.rtabmap.CustomSwitchPreference
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_fisheye"
|
android:key="@string/pref_key_fisheye"
|
||||||
android:title="@string/pref_title_fisheye"
|
android:title="@string/pref_title_fisheye"
|
||||||
|
|||||||
@@ -76,6 +76,8 @@
|
|||||||
<string name="pref_default_resolution">false</string>
|
<string name="pref_default_resolution">false</string>
|
||||||
<string name="pref_key_smoothing">pref_key_smoothing</string>
|
<string name="pref_key_smoothing">pref_key_smoothing</string>
|
||||||
<string name="pref_default_smoothing">false</string>
|
<string name="pref_default_smoothing">false</string>
|
||||||
|
<string name="pref_key_depth_bleeding_error">pref_key_depth_bleeding_error</string>
|
||||||
|
<string name="pref_default_depth_bleeding_error">0.0</string>
|
||||||
<string name="pref_key_fisheye">pref_key_fisheye</string>
|
<string name="pref_key_fisheye">pref_key_fisheye</string>
|
||||||
<string name="pref_default_fisheye">false</string>
|
<string name="pref_default_fisheye">false</string>
|
||||||
|
|
||||||
@@ -337,6 +339,8 @@
|
|||||||
<string name="pref_summary_resolution">Save HD images of the color camera if you want very detailed textures. More memory will be required.</string>
|
<string name="pref_summary_resolution">Save HD images of the color camera if you want very detailed textures. More memory will be required.</string>
|
||||||
<string name="pref_title_smoothing">Smoothing</string>
|
<string name="pref_title_smoothing">Smoothing</string>
|
||||||
<string name="pref_summary_smoothing">Smooth the point clouds.</string>
|
<string name="pref_summary_smoothing">Smooth the point clouds.</string>
|
||||||
|
<string name="pref_title_depth_bleeding_error">Depth Bleeding Filtering Error</string>
|
||||||
|
<string name="pref_summary_depth_bleeding_error">Filter noisy depth points on the edges.</string>
|
||||||
<string name="pref_title_fisheye">Fish Eye Camera</string>
|
<string name="pref_title_fisheye">Fish Eye Camera</string>
|
||||||
<string name="pref_summary_fisheye">Use fish eye camera instead of the color camera. May not work on some devices.</string>
|
<string name="pref_summary_fisheye">Use fish eye camera instead of the color camera. May not work on some devices.</string>
|
||||||
<string name="pref_title_update_rate">Update Rate</string>
|
<string name="pref_title_update_rate">Update Rate</string>
|
||||||
@@ -436,6 +440,26 @@
|
|||||||
<item>"29.41995"</item>
|
<item>"29.41995"</item>
|
||||||
<item>"19.6133"</item>
|
<item>"19.6133"</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="pref_depth_bleeding_error_keys">
|
||||||
|
<item>"Disabled"</item>
|
||||||
|
<item>"2.5 cm"</item>
|
||||||
|
<item>"5 cm"</item>
|
||||||
|
<item>"10 cm"</item>
|
||||||
|
<item>"15 cm"</item>
|
||||||
|
<item>"20 cm"</item>
|
||||||
|
<item>"25 cm"</item>
|
||||||
|
<item>"30 cm"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_depth_bleeding_error_values">
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"0.025"</item>
|
||||||
|
<item>"0.05"</item>
|
||||||
|
<item>"0.10"</item>
|
||||||
|
<item>"0.15"</item>
|
||||||
|
<item>"0.20"</item>
|
||||||
|
<item>"0.25"</item>
|
||||||
|
<item>"0.30"</item>
|
||||||
|
</string-array>
|
||||||
<string-array name="pref_max_speed_keys">
|
<string-array name="pref_max_speed_keys">
|
||||||
<item>"No Limit"</item>
|
<item>"No Limit"</item>
|
||||||
<item>"High"</item>
|
<item>"High"</item>
|
||||||
|
|||||||
@@ -1140,6 +1140,7 @@ public class RTABMapActivity extends FragmentActivity implements OnClickListener
|
|||||||
RTABMapLib.setRawScanSaved(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_raw_scan_saved), Boolean.parseBoolean(getString(R.string.pref_default_raw_scan_saved))));
|
RTABMapLib.setRawScanSaved(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_raw_scan_saved), Boolean.parseBoolean(getString(R.string.pref_default_raw_scan_saved))));
|
||||||
RTABMapLib.setFullResolution(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_resolution), Boolean.parseBoolean(getString(R.string.pref_default_resolution))));
|
RTABMapLib.setFullResolution(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_resolution), Boolean.parseBoolean(getString(R.string.pref_default_resolution))));
|
||||||
RTABMapLib.setSmoothing(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_smoothing), Boolean.parseBoolean(getString(R.string.pref_default_smoothing))));
|
RTABMapLib.setSmoothing(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_smoothing), Boolean.parseBoolean(getString(R.string.pref_default_smoothing))));
|
||||||
|
RTABMapLib.setDepthBleedingError(nativeApplication, Float.parseFloat(sharedPref.getString(getString(R.string.pref_key_depth_bleeding_error), getString(R.string.pref_default_depth_bleeding_error))));
|
||||||
RTABMapLib.setDepthFromMotion(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_depth_from_motion), Boolean.parseBoolean(getString(R.string.pref_default_depth_from_motion))));
|
RTABMapLib.setDepthFromMotion(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_depth_from_motion), Boolean.parseBoolean(getString(R.string.pref_default_depth_from_motion))));
|
||||||
RTABMapLib.setCameraColor(nativeApplication, !sharedPref.getBoolean(getString(R.string.pref_key_fisheye), Boolean.parseBoolean(getString(R.string.pref_default_fisheye))));
|
RTABMapLib.setCameraColor(nativeApplication, !sharedPref.getBoolean(getString(R.string.pref_key_fisheye), Boolean.parseBoolean(getString(R.string.pref_default_fisheye))));
|
||||||
RTABMapLib.setAppendMode(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_append), Boolean.parseBoolean(getString(R.string.pref_default_append))));
|
RTABMapLib.setAppendMode(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_append), Boolean.parseBoolean(getString(R.string.pref_default_append))));
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ public class RTABMapLib
|
|||||||
public static native void setRawScanSaved(long nativeApplication, boolean enabled);
|
public static native void setRawScanSaved(long nativeApplication, boolean enabled);
|
||||||
public static native void setFullResolution(long nativeApplication, boolean enabled);
|
public static native void setFullResolution(long nativeApplication, boolean enabled);
|
||||||
public static native void setSmoothing(long nativeApplication, boolean enabled);
|
public static native void setSmoothing(long nativeApplication, boolean enabled);
|
||||||
|
public static native void setDepthBleedingError(long nativeApplication, float value);
|
||||||
public static native void setDepthFromMotion(long nativeApplication, boolean enabled);
|
public static native void setDepthFromMotion(long nativeApplication, boolean enabled);
|
||||||
public static native void setCameraColor(long nativeApplication, boolean enabled);
|
public static native void setCameraColor(long nativeApplication, boolean enabled);
|
||||||
public static native void setAppendMode(long nativeApplication, boolean enabled);
|
public static native void setAppendMode(long nativeApplication, boolean enabled);
|
||||||
|
|||||||
@@ -222,7 +222,8 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref
|
|||||||
((Preference)findPreference(getString(R.string.pref_key_background_color))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_background_color))).getEntry() + ") "+getString(R.string.pref_summary_background_color));
|
((Preference)findPreference(getString(R.string.pref_key_background_color))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_background_color))).getEntry() + ") "+getString(R.string.pref_summary_background_color));
|
||||||
((Preference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
|
((Preference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
|
||||||
|
|
||||||
((Preference)findPreference(getString(R.string.pref_key_arcore_relocalization_acc_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_arcore_relocalization_acc_thr))).getEntry() + ") "+getString(R.string.pref_summary_arcore_relocalization_acc_thr));
|
((Preference)findPreference(getString(R.string.pref_key_depth_bleeding_error))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_depth_bleeding_error))).getEntry() + ") "+getString(R.string.pref_summary_depth_bleeding_error));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_arcore_relocalization_acc_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_arcore_relocalization_acc_thr))).getEntry() + ") "+getString(R.string.pref_summary_arcore_relocalization_acc_thr));
|
||||||
((Preference)findPreference(getString(R.string.pref_key_update_rate))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_update_rate))).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
|
((Preference)findPreference(getString(R.string.pref_key_update_rate))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_update_rate))).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
|
||||||
((Preference)findPreference(getString(R.string.pref_key_max_speed))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_max_speed))).getEntry() + ") "+getString(R.string.pref_summary_max_speed));
|
((Preference)findPreference(getString(R.string.pref_key_max_speed))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_max_speed))).getEntry() + ") "+getString(R.string.pref_summary_max_speed));
|
||||||
((Preference)findPreference(getString(R.string.pref_key_time_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_time_thr))).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
((Preference)findPreference(getString(R.string.pref_key_time_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_time_thr))).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
||||||
@@ -285,7 +286,8 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref
|
|||||||
if(key.compareTo(getString(R.string.pref_key_background_color))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_background_color));
|
if(key.compareTo(getString(R.string.pref_key_background_color))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_background_color));
|
||||||
if(key.compareTo(getString(R.string.pref_key_rendering_texture_decimation))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
|
if(key.compareTo(getString(R.string.pref_key_rendering_texture_decimation))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
|
||||||
|
|
||||||
if(key.compareTo(getString(R.string.pref_key_arcore_relocalization_acc_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_arcore_relocalization_acc_thr));
|
if(key.compareTo(getString(R.string.pref_key_depth_bleeding_error))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_depth_bleeding_error));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_arcore_relocalization_acc_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_arcore_relocalization_acc_thr));
|
||||||
if(key.compareTo(getString(R.string.pref_key_update_rate))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
|
if(key.compareTo(getString(R.string.pref_key_update_rate))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
|
||||||
if(key.compareTo(getString(R.string.pref_key_max_speed))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_max_speed));
|
if(key.compareTo(getString(R.string.pref_key_max_speed))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_max_speed));
|
||||||
if(key.compareTo(getString(R.string.pref_key_time_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
if(key.compareTo(getString(R.string.pref_key_time_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
||||||
|
|||||||
@@ -8,49 +8,90 @@
|
|||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
4E0D83832621F52C00C879AC /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 4E0D83822621F52C00C879AC /* Settings.bundle */; };
|
4E0D83832621F52C00C879AC /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 4E0D83822621F52C00C879AC /* Settings.bundle */; };
|
||||||
|
4E10D89C2DE409870015926D /* librtabmap_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB0259D5BE500575D88 /* librtabmap_core.a */; };
|
||||||
|
4E10D89D2DE409870015926D /* librtabmap_utilite.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EAF259D5BE500575D88 /* librtabmap_utilite.a */; };
|
||||||
|
4E10D89E2DE409A60015926D /* libopencv_xfeatures2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED9259D5BFC00575D88 /* libopencv_xfeatures2d.a */; };
|
||||||
|
4E10D89F2DE409B20015926D /* libopencv_video.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB4259D5BFB00575D88 /* libopencv_video.a */; };
|
||||||
|
4E10D8A02DE409BB0015926D /* libopencv_tracking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECC259D5BFC00575D88 /* libopencv_tracking.a */; };
|
||||||
|
4E10D8A12DE409C00015926D /* libopencv_optflow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC3259D5BFC00575D88 /* libopencv_optflow.a */; };
|
||||||
|
4E10D8A22DE409C70015926D /* libopencv_imgproc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBE259D5BFC00575D88 /* libopencv_imgproc.a */; };
|
||||||
|
4E10D8A32DE409CA0015926D /* libopencv_features2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB8259D5BFB00575D88 /* libopencv_features2d.a */; };
|
||||||
|
4E10D8A42DE409CE0015926D /* libopencv_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED1259D5BFC00575D88 /* libopencv_core.a */; };
|
||||||
|
4E10D8A52DE409D10015926D /* libopencv_calib3d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED6259D5BFC00575D88 /* libopencv_calib3d.a */; };
|
||||||
|
4E10D8A62DE409D50015926D /* libopencv_aruco.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB5259D5BFB00575D88 /* libopencv_aruco.a */; };
|
||||||
|
4E10D8A72DE409F40015926D /* libopencv_flann.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBC259D5BFB00575D88 /* libopencv_flann.a */; };
|
||||||
|
4E10D8A82DE40A1B0015926D /* libopencv_ximgproc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EDC259D5BFC00575D88 /* libopencv_ximgproc.a */; };
|
||||||
|
4E10D8A92DE40A3A0015926D /* libopencv_photo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB6259D5BFB00575D88 /* libopencv_photo.a */; };
|
||||||
|
4E10D8AA2DE40A6C0015926D /* libopencv_objdetect.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBB259D5BFB00575D88 /* libopencv_objdetect.a */; };
|
||||||
|
4E10D8AB2DE40A8C0015926D /* libopencv_stitching.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBD259D5BFB00575D88 /* libopencv_stitching.a */; };
|
||||||
|
4E10D8AC2DE40AA20015926D /* libopencv_imgcodecs.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC4259D5BFC00575D88 /* libopencv_imgcodecs.a */; };
|
||||||
|
4E10D8AD2DE40E990015926D /* libg2o_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0D259D5C2200575D88 /* libg2o_core.a */; };
|
||||||
|
4E10D8AE2DE40E990015926D /* libg2o_solver_dense.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F07259D5C2100575D88 /* libg2o_solver_dense.a */; };
|
||||||
|
4E10D8AF2DE40E990015926D /* libg2o_solver_eigen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F12259D5C2200575D88 /* libg2o_solver_eigen.a */; };
|
||||||
|
4E10D8B02DE40E990015926D /* libg2o_solver_pcg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0B259D5C2200575D88 /* libg2o_solver_pcg.a */; };
|
||||||
|
4E10D8B12DE40E990015926D /* libg2o_solver_slam2d_linear.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F09259D5C2100575D88 /* libg2o_solver_slam2d_linear.a */; };
|
||||||
|
4E10D8B22DE40E990015926D /* libg2o_solver_structure_only.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F11259D5C2200575D88 /* libg2o_solver_structure_only.a */; };
|
||||||
|
4E10D8B32DE40E990015926D /* libg2o_stuff.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F14259D5C2200575D88 /* libg2o_stuff.a */; };
|
||||||
|
4E10D8B42DE40E990015926D /* libg2o_types_data.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0C259D5C2200575D88 /* libg2o_types_data.a */; };
|
||||||
|
4E10D8B52DE40E990015926D /* libg2o_types_icp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0F259D5C2200575D88 /* libg2o_types_icp.a */; };
|
||||||
|
4E10D8B62DE40E990015926D /* libg2o_types_sba.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F15259D5C2200575D88 /* libg2o_types_sba.a */; };
|
||||||
|
4E10D8B72DE40E990015926D /* libg2o_types_sclam2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1A259D5C2200575D88 /* libg2o_types_sclam2d.a */; };
|
||||||
|
4E10D8B82DE40E990015926D /* libg2o_types_sim3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1B259D5C2200575D88 /* libg2o_types_sim3.a */; };
|
||||||
|
4E10D8B92DE40E990015926D /* libg2o_types_slam2d_addons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F16259D5C2200575D88 /* libg2o_types_slam2d_addons.a */; };
|
||||||
|
4E10D8BA2DE40E990015926D /* libg2o_types_slam2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0A259D5C2100575D88 /* libg2o_types_slam2d.a */; };
|
||||||
|
4E10D8BB2DE40E990015926D /* libg2o_types_slam3d_addons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F17259D5C2200575D88 /* libg2o_types_slam3d_addons.a */; };
|
||||||
|
4E10D8BC2DE40E990015926D /* libg2o_types_slam3d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F18259D5C2200575D88 /* libg2o_types_slam3d.a */; };
|
||||||
|
4E10D8BD2DE40EC70015926D /* libpcl_common.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4D259D4DF100575D88 /* libpcl_common.a */; };
|
||||||
|
4E10D8BE2DE40EC70015926D /* libpcl_features.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B43259D4DF100575D88 /* libpcl_features.a */; };
|
||||||
|
4E10D8BF2DE40EC70015926D /* libpcl_filters.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B44259D4DF100575D88 /* libpcl_filters.a */; };
|
||||||
|
4E10D8C02DE40EC70015926D /* libpcl_io_ply.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4E259D4DF100575D88 /* libpcl_io_ply.a */; };
|
||||||
|
4E10D8C12DE40EC70015926D /* libpcl_io.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4C259D4DF100575D88 /* libpcl_io.a */; };
|
||||||
|
4E10D8C22DE40EC70015926D /* libpcl_kdtree.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B46259D4DF100575D88 /* libpcl_kdtree.a */; };
|
||||||
|
4E10D8C32DE40EC70015926D /* libpcl_keypoints.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B49259D4DF100575D88 /* libpcl_keypoints.a */; };
|
||||||
|
4E10D8C42DE40EC70015926D /* libpcl_ml.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4F259D4DF100575D88 /* libpcl_ml.a */; };
|
||||||
|
4E10D8C52DE40EC70015926D /* libpcl_octree.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4B259D4DF100575D88 /* libpcl_octree.a */; };
|
||||||
|
4E10D8C62DE40EC70015926D /* libpcl_registration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B42259D4DF100575D88 /* libpcl_registration.a */; };
|
||||||
|
4E10D8C72DE40EC70015926D /* libpcl_sample_consensus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B45259D4DF100575D88 /* libpcl_sample_consensus.a */; };
|
||||||
|
4E10D8C82DE40EC70015926D /* libpcl_search.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B47259D4DF100575D88 /* libpcl_search.a */; };
|
||||||
|
4E10D8C92DE40EC70015926D /* libpcl_segmentation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B50259D4DF100575D88 /* libpcl_segmentation.a */; };
|
||||||
|
4E10D8CA2DE40EC70015926D /* libpcl_stereo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B41259D4DF100575D88 /* libpcl_stereo.a */; };
|
||||||
|
4E10D8CB2DE40EC70015926D /* libpcl_surface.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B48259D4DF100575D88 /* libpcl_surface.a */; };
|
||||||
|
4E10D8CC2DE40EE30015926D /* libgtsam_unstable.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0E259D5C2200575D88 /* libgtsam_unstable.a */; };
|
||||||
|
4E10D8CD2DE40EE30015926D /* libgtsam.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1C259D5C2200575D88 /* libgtsam.a */; };
|
||||||
|
4E10D8CE2DE40EE30015926D /* libmetis-gtsam.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E10D8622DE408EE0015926D /* libmetis-gtsam.a */; };
|
||||||
|
4E10D8CF2DE40EF90015926D /* libboost_serialization.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B30259D4DE900575D88 /* libboost_serialization.a */; };
|
||||||
|
4E10D8D02DE40F060015926D /* libboost_timer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B34259D4DE900575D88 /* libboost_timer.a */; };
|
||||||
|
4E10D8D12DE40F190015926D /* liblas_c.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E10D8752DE408EF0015926D /* liblas_c.a */; };
|
||||||
|
4E10D8D22DE40F190015926D /* liblas.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFAA9422CAE4E960055DA51 /* liblas.a */; };
|
||||||
|
4E10D8D32DE40F190015926D /* liblaszip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4ED73AD02D7FECF3007899C2 /* liblaszip.a */; };
|
||||||
|
4E10D8D42DE40F2A0015926D /* libboost_thread.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B33259D4DE900575D88 /* libboost_thread.a */; };
|
||||||
|
4E10D8E12DE4101B0015926D /* liblibjpeg-turbo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E10D8D52DE40FBE0015926D /* liblibjpeg-turbo.a */; };
|
||||||
|
4E10D8E22DE4101B0015926D /* liblibpng.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E10D8D72DE40FCA0015926D /* liblibpng.a */; };
|
||||||
4E1E9CF72D618E69000CB881 /* quad_color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4E1E9CF62D618079000CB881 /* quad_color.cpp */; };
|
4E1E9CF72D618E69000CB881 /* quad_color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4E1E9CF62D618079000CB881 /* quad_color.cpp */; };
|
||||||
4E1E9CF82D618E69000CB881 /* text_drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4E1E9CF52D618079000CB881 /* text_drawable.cpp */; };
|
4E1E9CF82D618E69000CB881 /* text_drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4E1E9CF52D618079000CB881 /* text_drawable.cpp */; };
|
||||||
4E20B24E266AB94300316EE6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4E20B24D266AB94300316EE6 /* Images.xcassets */; };
|
4E20B24E266AB94300316EE6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4E20B24D266AB94300316EE6 /* Images.xcassets */; };
|
||||||
4E20B250266AB95600316EE6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4E20B24F266AB95600316EE6 /* Images.xcassets */; };
|
4E20B250266AB95600316EE6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4E20B24F266AB95600316EE6 /* Images.xcassets */; };
|
||||||
4E2C516725A63119005CEDBD /* DatabaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2C516525A63119005CEDBD /* DatabaseView.swift */; };
|
4E2C516725A63119005CEDBD /* DatabaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2C516525A63119005CEDBD /* DatabaseView.swift */; };
|
||||||
4E2C516825A63119005CEDBD /* VerticalScrollerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2C516625A63119005CEDBD /* VerticalScrollerView.swift */; };
|
4E2C516825A63119005CEDBD /* VerticalScrollerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2C516625A63119005CEDBD /* VerticalScrollerView.swift */; };
|
||||||
|
4E3525542DE4C6E500F39D8F /* libg2o_csparse_extension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F13259D5C2200575D88 /* libg2o_csparse_extension.a */; };
|
||||||
|
4E3525552DE4C6E500F39D8F /* libg2o_solver_csparse.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F10259D5C2200575D88 /* libg2o_solver_csparse.a */; };
|
||||||
|
4E3525572DE4C6E500F39D8F /* libg2o_solver_cholmod.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E3525562DE4C6E500F39D8F /* libg2o_solver_cholmod.a */; };
|
||||||
|
4E3525592DE4C6F600F39D8F /* libcholmod.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E3525582DE4C6F600F39D8F /* libcholmod.a */; };
|
||||||
|
4E35255E2DE4C71000F39D8F /* libcxsparse.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E35255A2DE4C71000F39D8F /* libcxsparse.a */; };
|
||||||
|
4E35255F2DE4C71000F39D8F /* libcolamd.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E35255B2DE4C71000F39D8F /* libcolamd.a */; };
|
||||||
|
4E3525602DE4C71000F39D8F /* libcamd.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E35255C2DE4C71000F39D8F /* libcamd.a */; };
|
||||||
|
4E3525612DE4C71000F39D8F /* libccolamd.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E35255D2DE4C71000F39D8F /* libccolamd.a */; };
|
||||||
|
4E3525642DE4C71C00F39D8F /* libsuitesparseconfig.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E3525622DE4C71C00F39D8F /* libsuitesparseconfig.a */; };
|
||||||
|
4E3525652DE4C71C00F39D8F /* libspqr.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E3525632DE4C71C00F39D8F /* libspqr.a */; };
|
||||||
|
4E3525672DE4C72D00F39D8F /* libamd.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E3525662DE4C72D00F39D8F /* libamd.a */; };
|
||||||
4E8B155426273A580037FC53 /* Zip in Frameworks */ = {isa = PBXBuildFile; productRef = 4E8B155326273A580037FC53 /* Zip */; };
|
4E8B155426273A580037FC53 /* Zip in Frameworks */ = {isa = PBXBuildFile; productRef = 4E8B155326273A580037FC53 /* Zip */; };
|
||||||
4EB1A66625A0D90B0043C7BF /* RTABMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB1A66525A0D90B0043C7BF /* RTABMap.swift */; };
|
4EB1A66625A0D90B0043C7BF /* RTABMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB1A66525A0D90B0043C7BF /* RTABMap.swift */; };
|
||||||
4ED73AD12D7FECF3007899C2 /* liblaszip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4ED73AD02D7FECF3007899C2 /* liblaszip.a */; };
|
|
||||||
4EE016B3259BE441008CCE65 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE016AF259BE441008CCE65 /* ViewController.swift */; };
|
4EE016B3259BE441008CCE65 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE016AF259BE441008CCE65 /* ViewController.swift */; };
|
||||||
4EE016B4259BE441008CCE65 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE016B0259BE441008CCE65 /* SceneDelegate.swift */; };
|
4EE016B4259BE441008CCE65 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE016B0259BE441008CCE65 /* SceneDelegate.swift */; };
|
||||||
4EE016B9259BE449008CCE65 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE016B8259BE449008CCE65 /* AppDelegate.swift */; };
|
4EE016B9259BE449008CCE65 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE016B8259BE449008CCE65 /* AppDelegate.swift */; };
|
||||||
4EE016C3259BE464008CCE65 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016BF259BE464008CCE65 /* Main.storyboard */; };
|
4EE016C3259BE464008CCE65 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016BF259BE464008CCE65 /* Main.storyboard */; };
|
||||||
4EE016C4259BE464008CCE65 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016C1259BE464008CCE65 /* LaunchScreen.storyboard */; };
|
4EE016C4259BE464008CCE65 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016C1259BE464008CCE65 /* LaunchScreen.storyboard */; };
|
||||||
4EE016C7259BE46F008CCE65 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016C6259BE46F008CCE65 /* Assets.xcassets */; };
|
4EE016C7259BE46F008CCE65 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016C6259BE46F008CCE65 /* Assets.xcassets */; };
|
||||||
4EFAA9432CAE4E960055DA51 /* liblas.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFAA9422CAE4E960055DA51 /* liblas.a */; };
|
|
||||||
4EFD0B36259D4DE900575D88 /* libboost_filesystem.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B2B259D4DE900575D88 /* libboost_filesystem.a */; };
|
|
||||||
4EFD0B37259D4DE900575D88 /* libboost_program_options.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B2C259D4DE900575D88 /* libboost_program_options.a */; };
|
|
||||||
4EFD0B38259D4DE900575D88 /* libboost_regex.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B2D259D4DE900575D88 /* libboost_regex.a */; };
|
|
||||||
4EFD0B39259D4DE900575D88 /* libboost_iostreams.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B2E259D4DE900575D88 /* libboost_iostreams.a */; };
|
|
||||||
4EFD0B3A259D4DE900575D88 /* libboost_date_time.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B2F259D4DE900575D88 /* libboost_date_time.a */; };
|
|
||||||
4EFD0B3B259D4DE900575D88 /* libboost_serialization.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B30259D4DE900575D88 /* libboost_serialization.a */; };
|
|
||||||
4EFD0B3C259D4DE900575D88 /* libboost_system.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B31259D4DE900575D88 /* libboost_system.a */; };
|
|
||||||
4EFD0B3D259D4DE900575D88 /* libboost_signals.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B32259D4DE900575D88 /* libboost_signals.a */; };
|
|
||||||
4EFD0B3E259D4DE900575D88 /* libboost_thread.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B33259D4DE900575D88 /* libboost_thread.a */; };
|
|
||||||
4EFD0B3F259D4DE900575D88 /* libboost_timer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B34259D4DE900575D88 /* libboost_timer.a */; };
|
|
||||||
4EFD0B40259D4DE900575D88 /* libboost_chrono.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B35259D4DE900575D88 /* libboost_chrono.a */; };
|
|
||||||
4EFD0B51259D4DF100575D88 /* libpcl_stereo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B41259D4DF100575D88 /* libpcl_stereo.a */; };
|
|
||||||
4EFD0B52259D4DF100575D88 /* libpcl_registration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B42259D4DF100575D88 /* libpcl_registration.a */; };
|
|
||||||
4EFD0B53259D4DF100575D88 /* libpcl_features.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B43259D4DF100575D88 /* libpcl_features.a */; };
|
|
||||||
4EFD0B54259D4DF100575D88 /* libpcl_filters.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B44259D4DF100575D88 /* libpcl_filters.a */; };
|
|
||||||
4EFD0B55259D4DF100575D88 /* libpcl_sample_consensus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B45259D4DF100575D88 /* libpcl_sample_consensus.a */; };
|
|
||||||
4EFD0B56259D4DF100575D88 /* libpcl_kdtree.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B46259D4DF100575D88 /* libpcl_kdtree.a */; };
|
|
||||||
4EFD0B57259D4DF100575D88 /* libpcl_search.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B47259D4DF100575D88 /* libpcl_search.a */; };
|
|
||||||
4EFD0B58259D4DF100575D88 /* libpcl_surface.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B48259D4DF100575D88 /* libpcl_surface.a */; };
|
|
||||||
4EFD0B59259D4DF100575D88 /* libpcl_keypoints.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B49259D4DF100575D88 /* libpcl_keypoints.a */; };
|
|
||||||
4EFD0B5A259D4DF100575D88 /* libpcl_recognition.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4A259D4DF100575D88 /* libpcl_recognition.a */; };
|
|
||||||
4EFD0B5B259D4DF100575D88 /* libpcl_octree.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4B259D4DF100575D88 /* libpcl_octree.a */; };
|
|
||||||
4EFD0B5C259D4DF100575D88 /* libpcl_io.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4C259D4DF100575D88 /* libpcl_io.a */; };
|
|
||||||
4EFD0B5D259D4DF100575D88 /* libpcl_common.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4D259D4DF100575D88 /* libpcl_common.a */; };
|
|
||||||
4EFD0B5E259D4DF100575D88 /* libpcl_io_ply.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4E259D4DF100575D88 /* libpcl_io_ply.a */; };
|
|
||||||
4EFD0B5F259D4DF100575D88 /* libpcl_ml.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4F259D4DF100575D88 /* libpcl_ml.a */; };
|
|
||||||
4EFD0B60259D4DF100575D88 /* libpcl_segmentation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B50259D4DF100575D88 /* libpcl_segmentation.a */; };
|
|
||||||
4EFD0B97259D501E00575D88 /* line.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B63259D501E00575D88 /* line.cpp */; };
|
4EFD0B97259D501E00575D88 /* line.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B63259D501E00575D88 /* line.cpp */; };
|
||||||
4EFD0B98259D501E00575D88 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B64259D501E00575D88 /* util.cpp */; };
|
4EFD0B98259D501E00575D88 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B64259D501E00575D88 /* util.cpp */; };
|
||||||
4EFD0B99259D501E00575D88 /* obj_loader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B65259D501E00575D88 /* obj_loader.cpp */; };
|
4EFD0B99259D501E00575D88 /* obj_loader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B65259D501E00575D88 /* obj_loader.cpp */; };
|
||||||
@@ -78,80 +119,8 @@
|
|||||||
4EFD0BBC259D509300575D88 /* point_cloud_drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0BBA259D509300575D88 /* point_cloud_drawable.cpp */; };
|
4EFD0BBC259D509300575D88 /* point_cloud_drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0BBA259D509300575D88 /* point_cloud_drawable.cpp */; };
|
||||||
4EFD0BC0259D50A800575D88 /* scene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0BBE259D50A800575D88 /* scene.cpp */; };
|
4EFD0BC0259D50A800575D88 /* scene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0BBE259D50A800575D88 /* scene.cpp */; };
|
||||||
4EFD0EAB259D581800575D88 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EAA259D581800575D88 /* OpenGLES.framework */; };
|
4EFD0EAB259D581800575D88 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EAA259D581800575D88 /* OpenGLES.framework */; };
|
||||||
4EFD0EB1259D5BE500575D88 /* librtabmap_utilite.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EAF259D5BE500575D88 /* librtabmap_utilite.a */; };
|
|
||||||
4EFD0EB2259D5BE500575D88 /* librtabmap_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB0259D5BE500575D88 /* librtabmap_core.a */; };
|
|
||||||
4EFD0EDD259D5BFC00575D88 /* libopencv_video.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB4259D5BFB00575D88 /* libopencv_video.a */; };
|
|
||||||
4EFD0EDE259D5BFC00575D88 /* libopencv_aruco.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB5259D5BFB00575D88 /* libopencv_aruco.a */; };
|
|
||||||
4EFD0EDF259D5BFC00575D88 /* libopencv_photo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB6259D5BFB00575D88 /* libopencv_photo.a */; };
|
|
||||||
4EFD0EE0259D5BFC00575D88 /* libopencv_line_descriptor.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB7259D5BFB00575D88 /* libopencv_line_descriptor.a */; };
|
|
||||||
4EFD0EE1259D5BFC00575D88 /* libopencv_features2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB8259D5BFB00575D88 /* libopencv_features2d.a */; };
|
|
||||||
4EFD0EE2259D5BFC00575D88 /* libopencv_bgsegm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB9259D5BFB00575D88 /* libopencv_bgsegm.a */; };
|
|
||||||
4EFD0EE3259D5BFC00575D88 /* libopencv_dnn_objdetect.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBA259D5BFB00575D88 /* libopencv_dnn_objdetect.a */; };
|
|
||||||
4EFD0EE4259D5BFC00575D88 /* libopencv_objdetect.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBB259D5BFB00575D88 /* libopencv_objdetect.a */; };
|
|
||||||
4EFD0EE5259D5BFC00575D88 /* libopencv_flann.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBC259D5BFB00575D88 /* libopencv_flann.a */; };
|
|
||||||
4EFD0EE6259D5BFC00575D88 /* libopencv_stitching.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBD259D5BFB00575D88 /* libopencv_stitching.a */; };
|
|
||||||
4EFD0EE7259D5BFC00575D88 /* libopencv_imgproc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBE259D5BFC00575D88 /* libopencv_imgproc.a */; };
|
|
||||||
4EFD0EE8259D5BFC00575D88 /* libopencv_ml.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBF259D5BFC00575D88 /* libopencv_ml.a */; };
|
|
||||||
4EFD0EE9259D5BFC00575D88 /* libopencv_rgbd.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC0259D5BFC00575D88 /* libopencv_rgbd.a */; };
|
|
||||||
4EFD0EEA259D5BFC00575D88 /* libopencv_xphoto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC1259D5BFC00575D88 /* libopencv_xphoto.a */; };
|
|
||||||
4EFD0EEB259D5BFC00575D88 /* libopencv_phase_unwrapping.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC2259D5BFC00575D88 /* libopencv_phase_unwrapping.a */; };
|
|
||||||
4EFD0EEC259D5BFC00575D88 /* libopencv_optflow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC3259D5BFC00575D88 /* libopencv_optflow.a */; };
|
|
||||||
4EFD0EED259D5BFC00575D88 /* libopencv_imgcodecs.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC4259D5BFC00575D88 /* libopencv_imgcodecs.a */; };
|
|
||||||
4EFD0EEE259D5BFC00575D88 /* libopencv_fuzzy.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC5259D5BFC00575D88 /* libopencv_fuzzy.a */; };
|
|
||||||
4EFD0EEF259D5BFC00575D88 /* libopencv_dpm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC6259D5BFC00575D88 /* libopencv_dpm.a */; };
|
|
||||||
4EFD0EF0259D5BFC00575D88 /* libopencv_plot.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC7259D5BFC00575D88 /* libopencv_plot.a */; };
|
|
||||||
4EFD0EF1259D5BFC00575D88 /* libopencv_dnn.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC8259D5BFC00575D88 /* libopencv_dnn.a */; };
|
|
||||||
4EFD0EF2259D5BFC00575D88 /* libopencv_saliency.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC9259D5BFC00575D88 /* libopencv_saliency.a */; };
|
|
||||||
4EFD0EF3259D5BFC00575D88 /* libopencv_videoio.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECA259D5BFC00575D88 /* libopencv_videoio.a */; };
|
|
||||||
4EFD0EF4259D5BFC00575D88 /* libopencv_hfs.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECB259D5BFC00575D88 /* libopencv_hfs.a */; };
|
|
||||||
4EFD0EF5259D5BFC00575D88 /* libopencv_tracking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECC259D5BFC00575D88 /* libopencv_tracking.a */; };
|
|
||||||
4EFD0EF6259D5BFC00575D88 /* libopencv_text.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECD259D5BFC00575D88 /* libopencv_text.a */; };
|
|
||||||
4EFD0EF7259D5BFC00575D88 /* libopencv_face.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECE259D5BFC00575D88 /* libopencv_face.a */; };
|
|
||||||
4EFD0EF8259D5BFC00575D88 /* libopencv_bioinspired.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECF259D5BFC00575D88 /* libopencv_bioinspired.a */; };
|
|
||||||
4EFD0EF9259D5BFC00575D88 /* libopencv_highgui.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED0259D5BFC00575D88 /* libopencv_highgui.a */; };
|
|
||||||
4EFD0EFA259D5BFC00575D88 /* libopencv_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED1259D5BFC00575D88 /* libopencv_core.a */; };
|
|
||||||
4EFD0EFB259D5BFC00575D88 /* libopencv_shape.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED2259D5BFC00575D88 /* libopencv_shape.a */; };
|
|
||||||
4EFD0EFC259D5BFC00575D88 /* libopencv_datasets.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED3259D5BFC00575D88 /* libopencv_datasets.a */; };
|
|
||||||
4EFD0EFD259D5BFC00575D88 /* libopencv_img_hash.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED4259D5BFC00575D88 /* libopencv_img_hash.a */; };
|
|
||||||
4EFD0EFE259D5BFC00575D88 /* libopencv_surface_matching.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED5259D5BFC00575D88 /* libopencv_surface_matching.a */; };
|
|
||||||
4EFD0EFF259D5BFC00575D88 /* libopencv_calib3d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED6259D5BFC00575D88 /* libopencv_calib3d.a */; };
|
|
||||||
4EFD0F00259D5BFC00575D88 /* libopencv_structured_light.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED7259D5BFC00575D88 /* libopencv_structured_light.a */; };
|
|
||||||
4EFD0F01259D5BFC00575D88 /* libopencv_reg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED8259D5BFC00575D88 /* libopencv_reg.a */; };
|
|
||||||
4EFD0F02259D5BFC00575D88 /* libopencv_xfeatures2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED9259D5BFC00575D88 /* libopencv_xfeatures2d.a */; };
|
|
||||||
4EFD0F03259D5BFC00575D88 /* libopencv_videostab.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EDA259D5BFC00575D88 /* libopencv_videostab.a */; };
|
|
||||||
4EFD0F04259D5BFC00575D88 /* libopencv_ccalib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EDB259D5BFC00575D88 /* libopencv_ccalib.a */; };
|
|
||||||
4EFD0F05259D5BFC00575D88 /* libopencv_ximgproc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EDC259D5BFC00575D88 /* libopencv_ximgproc.a */; };
|
|
||||||
4EFD0F1D259D5C2200575D88 /* libg2o_solver_dense.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F07259D5C2100575D88 /* libg2o_solver_dense.a */; };
|
|
||||||
4EFD0F1E259D5C2200575D88 /* libg2o_ext_csparse.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F08259D5C2100575D88 /* libg2o_ext_csparse.a */; };
|
|
||||||
4EFD0F1F259D5C2200575D88 /* libg2o_solver_slam2d_linear.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F09259D5C2100575D88 /* libg2o_solver_slam2d_linear.a */; };
|
|
||||||
4EFD0F20259D5C2200575D88 /* libg2o_types_slam2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0A259D5C2100575D88 /* libg2o_types_slam2d.a */; };
|
|
||||||
4EFD0F21259D5C2200575D88 /* libg2o_solver_pcg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0B259D5C2200575D88 /* libg2o_solver_pcg.a */; };
|
|
||||||
4EFD0F22259D5C2200575D88 /* libg2o_types_data.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0C259D5C2200575D88 /* libg2o_types_data.a */; };
|
|
||||||
4EFD0F23259D5C2200575D88 /* libg2o_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0D259D5C2200575D88 /* libg2o_core.a */; };
|
|
||||||
4EFD0F24259D5C2200575D88 /* libgtsam_unstable.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0E259D5C2200575D88 /* libgtsam_unstable.a */; };
|
|
||||||
4EFD0F25259D5C2200575D88 /* libg2o_types_icp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0F259D5C2200575D88 /* libg2o_types_icp.a */; };
|
|
||||||
4EFD0F26259D5C2200575D88 /* libg2o_solver_csparse.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F10259D5C2200575D88 /* libg2o_solver_csparse.a */; };
|
|
||||||
4EFD0F27259D5C2200575D88 /* libg2o_solver_structure_only.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F11259D5C2200575D88 /* libg2o_solver_structure_only.a */; };
|
|
||||||
4EFD0F28259D5C2200575D88 /* libg2o_solver_eigen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F12259D5C2200575D88 /* libg2o_solver_eigen.a */; };
|
|
||||||
4EFD0F29259D5C2200575D88 /* libg2o_csparse_extension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F13259D5C2200575D88 /* libg2o_csparse_extension.a */; };
|
|
||||||
4EFD0F2A259D5C2200575D88 /* libg2o_stuff.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F14259D5C2200575D88 /* libg2o_stuff.a */; };
|
|
||||||
4EFD0F2B259D5C2200575D88 /* libg2o_types_sba.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F15259D5C2200575D88 /* libg2o_types_sba.a */; };
|
|
||||||
4EFD0F2C259D5C2200575D88 /* libg2o_types_slam2d_addons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F16259D5C2200575D88 /* libg2o_types_slam2d_addons.a */; };
|
|
||||||
4EFD0F2D259D5C2200575D88 /* libg2o_types_slam3d_addons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F17259D5C2200575D88 /* libg2o_types_slam3d_addons.a */; };
|
|
||||||
4EFD0F2E259D5C2200575D88 /* libg2o_types_slam3d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F18259D5C2200575D88 /* libg2o_types_slam3d.a */; };
|
|
||||||
4EFD0F2F259D5C2200575D88 /* libmetis.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F19259D5C2200575D88 /* libmetis.a */; };
|
|
||||||
4EFD0F30259D5C2200575D88 /* libg2o_types_sclam2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1A259D5C2200575D88 /* libg2o_types_sclam2d.a */; };
|
|
||||||
4EFD0F31259D5C2200575D88 /* libg2o_types_sim3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1B259D5C2200575D88 /* libg2o_types_sim3.a */; };
|
|
||||||
4EFD0F32259D5C2200575D88 /* libgtsam.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1C259D5C2200575D88 /* libgtsam.a */; };
|
|
||||||
4EFD0F34259D5C2900575D88 /* libflann_cpp_s.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F33259D5C2900575D88 /* libflann_cpp_s.a */; };
|
|
||||||
4EFD0F36259D5C7300575D88 /* vtk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F35259D5C7300575D88 /* vtk.framework */; };
|
4EFD0F36259D5C7300575D88 /* vtk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F35259D5C7300575D88 /* vtk.framework */; };
|
||||||
4EFD0F3A259D5D1500575D88 /* CameraMobile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F38259D5D1500575D88 /* CameraMobile.cpp */; };
|
4EFD0F3A259D5D1500575D88 /* CameraMobile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F38259D5D1500575D88 /* CameraMobile.cpp */; };
|
||||||
4EFD0F3D259D5D5C00575D88 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F3C259D5D5C00575D88 /* libsqlite3.tbd */; };
|
|
||||||
4EFD0F50259D67D900575D88 /* liblibwebp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F4B259D67D900575D88 /* liblibwebp.a */; };
|
|
||||||
4EFD0F51259D67D900575D88 /* liblibpng.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F4C259D67D900575D88 /* liblibpng.a */; };
|
|
||||||
4EFD0F52259D67D900575D88 /* liblibjpeg-turbo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F4D259D67D900575D88 /* liblibjpeg-turbo.a */; };
|
|
||||||
4EFD0F53259D67D900575D88 /* libzlib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F4E259D67D900575D88 /* libzlib.a */; };
|
|
||||||
4EFD0F54259D67D900575D88 /* liblibprotobuf.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F4F259D67D900575D88 /* liblibprotobuf.a */; };
|
|
||||||
4EFD0F62259E341C00575D88 /* RTABMapApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F61259E341C00575D88 /* RTABMapApp.cpp */; };
|
4EFD0F62259E341C00575D88 /* RTABMapApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F61259E341C00575D88 /* RTABMapApp.cpp */; };
|
||||||
4EFD0F67259E38DE00575D88 /* NativeWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F66259E38DE00575D88 /* NativeWrapper.cpp */; };
|
4EFD0F67259E38DE00575D88 /* NativeWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F66259E38DE00575D88 /* NativeWrapper.cpp */; };
|
||||||
4EFD0F70259F847300575D88 /* background_renderer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F6E259F847300575D88 /* background_renderer.cc */; };
|
4EFD0F70259F847300575D88 /* background_renderer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F6E259F847300575D88 /* background_renderer.cc */; };
|
||||||
@@ -160,6 +129,42 @@
|
|||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
44D4681D2D538A4100B094BA /* RTABMapApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = RTABMapApp.entitlements; path = RTABMapApp/RTABMapApp.entitlements; sourceTree = "<group>"; };
|
44D4681D2D538A4100B094BA /* RTABMapApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = RTABMapApp.entitlements; path = RTABMapApp/RTABMapApp.entitlements; sourceTree = "<group>"; };
|
||||||
4E0D83822621F52C00C879AC /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
|
4E0D83822621F52C00C879AC /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
|
||||||
|
4E10D8602DE408EE0015926D /* libboost_stacktrace_noop.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_stacktrace_noop.a; path = RTABMapApp/Libraries/lib/libboost_stacktrace_noop.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8612DE408EE0015926D /* libboost_wserialization.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_wserialization.a; path = RTABMapApp/Libraries/lib/libboost_wserialization.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8622DE408EE0015926D /* libmetis-gtsam.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libmetis-gtsam.a"; path = "RTABMapApp/Libraries/lib/libmetis-gtsam.a"; sourceTree = "<group>"; };
|
||||||
|
4E10D8632DE408EE0015926D /* libopencv_wechat_qrcode.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_wechat_qrcode.a; path = RTABMapApp/Libraries/lib/libopencv_wechat_qrcode.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8642DE408EE0015926D /* libboost_container.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_container.a; path = RTABMapApp/Libraries/lib/libboost_container.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8652DE408EE0015926D /* libboost_graph.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_graph.a; path = RTABMapApp/Libraries/lib/libboost_graph.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8662DE408EE0015926D /* libboost_json.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_json.a; path = RTABMapApp/Libraries/lib/libboost_json.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8672DE408EE0015926D /* libboost_stacktrace_basic.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_stacktrace_basic.a; path = RTABMapApp/Libraries/lib/libboost_stacktrace_basic.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8682DE408EE0015926D /* libboost_atomic.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_atomic.a; path = RTABMapApp/Libraries/lib/libboost_atomic.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8692DE408EE0015926D /* libopencv_intensity_transform.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_intensity_transform.a; path = RTABMapApp/Libraries/lib/libopencv_intensity_transform.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86A2DE408EF0015926D /* libboost_locale.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_locale.a; path = RTABMapApp/Libraries/lib/libboost_locale.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86B2DE408EF0015926D /* liblz4.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblz4.a; path = RTABMapApp/Libraries/lib/liblz4.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86C2DE408EF0015926D /* libopencv_dnn_superres.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_dnn_superres.a; path = RTABMapApp/Libraries/lib/libopencv_dnn_superres.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86D2DE408EF0015926D /* libopencv_rapid.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_rapid.a; path = RTABMapApp/Libraries/lib/libopencv_rapid.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86E2DE408EF0015926D /* libopencv_quality.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_quality.a; path = RTABMapApp/Libraries/lib/libopencv_quality.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86F2DE408EF0015926D /* libboost_url.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_url.a; path = RTABMapApp/Libraries/lib/libboost_url.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8702DE408EF0015926D /* libboost_unit_test_framework.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_unit_test_framework.a; path = RTABMapApp/Libraries/lib/libboost_unit_test_framework.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8712DE408EF0015926D /* libboost_random.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_random.a; path = RTABMapApp/Libraries/lib/libboost_random.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8722DE408EF0015926D /* libboost_wave.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_wave.a; path = RTABMapApp/Libraries/lib/libboost_wave.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8732DE408EF0015926D /* libboost_charconv.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_charconv.a; path = RTABMapApp/Libraries/lib/libboost_charconv.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8742DE408EF0015926D /* libboost_type_erasure.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_type_erasure.a; path = RTABMapApp/Libraries/lib/libboost_type_erasure.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8752DE408EF0015926D /* liblas_c.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblas_c.a; path = RTABMapApp/Libraries/lib/liblas_c.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8762DE408EF0015926D /* libboost_contract.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_contract.a; path = RTABMapApp/Libraries/lib/libboost_contract.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8772DE408EF0015926D /* libopencv_gapi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_gapi.a; path = RTABMapApp/Libraries/lib/libopencv_gapi.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8782DE408EF0015926D /* libopencv_signal.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_signal.a; path = RTABMapApp/Libraries/lib/libopencv_signal.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8792DE408EF0015926D /* libboost_prg_exec_monitor.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_prg_exec_monitor.a; path = RTABMapApp/Libraries/lib/libboost_prg_exec_monitor.a; sourceTree = "<group>"; };
|
||||||
|
4E10D87A2DE408EF0015926D /* libboost_stacktrace_addr2line.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_stacktrace_addr2line.a; path = RTABMapApp/Libraries/lib/libboost_stacktrace_addr2line.a; sourceTree = "<group>"; };
|
||||||
|
4E10D87B2DE408EF0015926D /* libboost_nowide.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_nowide.a; path = RTABMapApp/Libraries/lib/libboost_nowide.a; sourceTree = "<group>"; };
|
||||||
|
4E10D87C2DE408EF0015926D /* libboost_test_exec_monitor.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_test_exec_monitor.a; path = RTABMapApp/Libraries/lib/libboost_test_exec_monitor.a; sourceTree = "<group>"; };
|
||||||
|
4E10D87D2DE408EF0015926D /* libopencv_mcc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_mcc.a; path = RTABMapApp/Libraries/lib/libopencv_mcc.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8D52DE40FBE0015926D /* liblibjpeg-turbo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "liblibjpeg-turbo.a"; path = "RTABMapApp/Libraries/lib/opencv4/3rdparty/liblibjpeg-turbo.a"; sourceTree = "<group>"; };
|
||||||
|
4E10D8D72DE40FCA0015926D /* liblibpng.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblibpng.a; path = RTABMapApp/Libraries/lib/opencv4/3rdparty/liblibpng.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8D92DE40FF60015926D /* libzlib.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libzlib.a; path = RTABMapApp/Libraries/lib/opencv4/3rdparty/libzlib.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8DA2DE40FF60015926D /* libIlmImf.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIlmImf.a; path = RTABMapApp/Libraries/lib/opencv4/3rdparty/libIlmImf.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8DB2DE40FF60015926D /* libade.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libade.a; path = RTABMapApp/Libraries/lib/opencv4/3rdparty/libade.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8DC2DE40FF60015926D /* liblibprotobuf.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblibprotobuf.a; path = RTABMapApp/Libraries/lib/opencv4/3rdparty/liblibprotobuf.a; sourceTree = "<group>"; };
|
||||||
4E1E9CF22D617D08000CB881 /* Measure.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Measure.h; path = ../android/jni/Measure.h; sourceTree = "<group>"; };
|
4E1E9CF22D617D08000CB881 /* Measure.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Measure.h; path = ../android/jni/Measure.h; sourceTree = "<group>"; };
|
||||||
4E1E9CF32D618079000CB881 /* quad_color.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = quad_color.h; path = ../android/jni/quad_color.h; sourceTree = "<group>"; };
|
4E1E9CF32D618079000CB881 /* quad_color.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = quad_color.h; path = ../android/jni/quad_color.h; sourceTree = "<group>"; };
|
||||||
4E1E9CF42D618079000CB881 /* text_drawable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = text_drawable.h; path = ../android/jni/text_drawable.h; sourceTree = "<group>"; };
|
4E1E9CF42D618079000CB881 /* text_drawable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = text_drawable.h; path = ../android/jni/text_drawable.h; sourceTree = "<group>"; };
|
||||||
@@ -170,6 +175,15 @@
|
|||||||
4E20B24F266AB95600316EE6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RTABMapApp/Images.xcassets; sourceTree = "<group>"; };
|
4E20B24F266AB95600316EE6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RTABMapApp/Images.xcassets; sourceTree = "<group>"; };
|
||||||
4E2C516525A63119005CEDBD /* DatabaseView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DatabaseView.swift; path = RTABMapApp/DatabaseView.swift; sourceTree = "<group>"; };
|
4E2C516525A63119005CEDBD /* DatabaseView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DatabaseView.swift; path = RTABMapApp/DatabaseView.swift; sourceTree = "<group>"; };
|
||||||
4E2C516625A63119005CEDBD /* VerticalScrollerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = VerticalScrollerView.swift; path = RTABMapApp/VerticalScrollerView.swift; sourceTree = "<group>"; };
|
4E2C516625A63119005CEDBD /* VerticalScrollerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = VerticalScrollerView.swift; path = RTABMapApp/VerticalScrollerView.swift; sourceTree = "<group>"; };
|
||||||
|
4E3525562DE4C6E500F39D8F /* libg2o_solver_cholmod.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libg2o_solver_cholmod.a; path = RTABMapApp/Libraries/lib/libg2o_solver_cholmod.a; sourceTree = "<group>"; };
|
||||||
|
4E3525582DE4C6F600F39D8F /* libcholmod.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcholmod.a; path = RTABMapApp/Libraries/lib/libcholmod.a; sourceTree = "<group>"; };
|
||||||
|
4E35255A2DE4C71000F39D8F /* libcxsparse.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcxsparse.a; path = RTABMapApp/Libraries/lib/libcxsparse.a; sourceTree = "<group>"; };
|
||||||
|
4E35255B2DE4C71000F39D8F /* libcolamd.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcolamd.a; path = RTABMapApp/Libraries/lib/libcolamd.a; sourceTree = "<group>"; };
|
||||||
|
4E35255C2DE4C71000F39D8F /* libcamd.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcamd.a; path = RTABMapApp/Libraries/lib/libcamd.a; sourceTree = "<group>"; };
|
||||||
|
4E35255D2DE4C71000F39D8F /* libccolamd.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libccolamd.a; path = RTABMapApp/Libraries/lib/libccolamd.a; sourceTree = "<group>"; };
|
||||||
|
4E3525622DE4C71C00F39D8F /* libsuitesparseconfig.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsuitesparseconfig.a; path = RTABMapApp/Libraries/lib/libsuitesparseconfig.a; sourceTree = "<group>"; };
|
||||||
|
4E3525632DE4C71C00F39D8F /* libspqr.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libspqr.a; path = RTABMapApp/Libraries/lib/libspqr.a; sourceTree = "<group>"; };
|
||||||
|
4E3525662DE4C72D00F39D8F /* libamd.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libamd.a; path = RTABMapApp/Libraries/lib/libamd.a; sourceTree = "<group>"; };
|
||||||
4E401BE825CC92C100240A56 /* ProgressionStatus.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ProgressionStatus.h; path = ../android/jni/ProgressionStatus.h; sourceTree = "<group>"; };
|
4E401BE825CC92C100240A56 /* ProgressionStatus.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ProgressionStatus.h; path = ../android/jni/ProgressionStatus.h; sourceTree = "<group>"; };
|
||||||
4EB1A66525A0D90B0043C7BF /* RTABMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RTABMap.swift; path = RTABMapApp/RTABMap.swift; sourceTree = "<group>"; };
|
4EB1A66525A0D90B0043C7BF /* RTABMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RTABMap.swift; path = RTABMapApp/RTABMap.swift; sourceTree = "<group>"; };
|
||||||
4ED73AD02D7FECF3007899C2 /* liblaszip.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblaszip.a; path = RTABMapApp/Libraries/lib/liblaszip.a; sourceTree = "<group>"; };
|
4ED73AD02D7FECF3007899C2 /* liblaszip.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblaszip.a; path = RTABMapApp/Libraries/lib/liblaszip.a; sourceTree = "<group>"; };
|
||||||
@@ -356,110 +370,79 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
4EFAA9432CAE4E960055DA51 /* liblas.a in Frameworks */,
|
|
||||||
4ED73AD12D7FECF3007899C2 /* liblaszip.a in Frameworks */,
|
|
||||||
4EFD0F50259D67D900575D88 /* liblibwebp.a in Frameworks */,
|
|
||||||
4EFD0F51259D67D900575D88 /* liblibpng.a in Frameworks */,
|
|
||||||
4EFD0F52259D67D900575D88 /* liblibjpeg-turbo.a in Frameworks */,
|
|
||||||
4EFD0F53259D67D900575D88 /* libzlib.a in Frameworks */,
|
|
||||||
4EFD0F54259D67D900575D88 /* liblibprotobuf.a in Frameworks */,
|
|
||||||
4EFD0F3D259D5D5C00575D88 /* libsqlite3.tbd in Frameworks */,
|
|
||||||
4EFD0F36259D5C7300575D88 /* vtk.framework in Frameworks */,
|
|
||||||
4EFD0F34259D5C2900575D88 /* libflann_cpp_s.a in Frameworks */,
|
|
||||||
4EFD0F1D259D5C2200575D88 /* libg2o_solver_dense.a in Frameworks */,
|
|
||||||
4EFD0F1E259D5C2200575D88 /* libg2o_ext_csparse.a in Frameworks */,
|
|
||||||
4EFD0F1F259D5C2200575D88 /* libg2o_solver_slam2d_linear.a in Frameworks */,
|
|
||||||
4EFD0F20259D5C2200575D88 /* libg2o_types_slam2d.a in Frameworks */,
|
|
||||||
4EFD0F21259D5C2200575D88 /* libg2o_solver_pcg.a in Frameworks */,
|
|
||||||
4EFD0F22259D5C2200575D88 /* libg2o_types_data.a in Frameworks */,
|
|
||||||
4EFD0F23259D5C2200575D88 /* libg2o_core.a in Frameworks */,
|
|
||||||
4EFD0F24259D5C2200575D88 /* libgtsam_unstable.a in Frameworks */,
|
|
||||||
4EFD0F25259D5C2200575D88 /* libg2o_types_icp.a in Frameworks */,
|
|
||||||
4EFD0F26259D5C2200575D88 /* libg2o_solver_csparse.a in Frameworks */,
|
|
||||||
4EFD0F27259D5C2200575D88 /* libg2o_solver_structure_only.a in Frameworks */,
|
|
||||||
4EFD0F28259D5C2200575D88 /* libg2o_solver_eigen.a in Frameworks */,
|
|
||||||
4EFD0F29259D5C2200575D88 /* libg2o_csparse_extension.a in Frameworks */,
|
|
||||||
4EFD0F2A259D5C2200575D88 /* libg2o_stuff.a in Frameworks */,
|
|
||||||
4EFD0F2B259D5C2200575D88 /* libg2o_types_sba.a in Frameworks */,
|
|
||||||
4EFD0F2C259D5C2200575D88 /* libg2o_types_slam2d_addons.a in Frameworks */,
|
|
||||||
4EFD0F2D259D5C2200575D88 /* libg2o_types_slam3d_addons.a in Frameworks */,
|
|
||||||
4EFD0F2E259D5C2200575D88 /* libg2o_types_slam3d.a in Frameworks */,
|
|
||||||
4EFD0F2F259D5C2200575D88 /* libmetis.a in Frameworks */,
|
|
||||||
4EFD0F30259D5C2200575D88 /* libg2o_types_sclam2d.a in Frameworks */,
|
|
||||||
4EFD0F31259D5C2200575D88 /* libg2o_types_sim3.a in Frameworks */,
|
|
||||||
4EFD0F32259D5C2200575D88 /* libgtsam.a in Frameworks */,
|
|
||||||
4E8B155426273A580037FC53 /* Zip in Frameworks */,
|
4E8B155426273A580037FC53 /* Zip in Frameworks */,
|
||||||
4EFD0EDD259D5BFC00575D88 /* libopencv_video.a in Frameworks */,
|
4EFD0F36259D5C7300575D88 /* vtk.framework in Frameworks */,
|
||||||
4EFD0EDE259D5BFC00575D88 /* libopencv_aruco.a in Frameworks */,
|
|
||||||
4EFD0EDF259D5BFC00575D88 /* libopencv_photo.a in Frameworks */,
|
|
||||||
4EFD0EE0259D5BFC00575D88 /* libopencv_line_descriptor.a in Frameworks */,
|
|
||||||
4EFD0EE1259D5BFC00575D88 /* libopencv_features2d.a in Frameworks */,
|
|
||||||
4EFD0EE2259D5BFC00575D88 /* libopencv_bgsegm.a in Frameworks */,
|
|
||||||
4EFD0EE3259D5BFC00575D88 /* libopencv_dnn_objdetect.a in Frameworks */,
|
|
||||||
4EFD0EE4259D5BFC00575D88 /* libopencv_objdetect.a in Frameworks */,
|
|
||||||
4EFD0EE5259D5BFC00575D88 /* libopencv_flann.a in Frameworks */,
|
|
||||||
4EFD0EE6259D5BFC00575D88 /* libopencv_stitching.a in Frameworks */,
|
|
||||||
4EFD0EE7259D5BFC00575D88 /* libopencv_imgproc.a in Frameworks */,
|
|
||||||
4EFD0EE8259D5BFC00575D88 /* libopencv_ml.a in Frameworks */,
|
|
||||||
4EFD0EE9259D5BFC00575D88 /* libopencv_rgbd.a in Frameworks */,
|
|
||||||
4EFD0EEA259D5BFC00575D88 /* libopencv_xphoto.a in Frameworks */,
|
|
||||||
4EFD0EEB259D5BFC00575D88 /* libopencv_phase_unwrapping.a in Frameworks */,
|
|
||||||
4EFD0EEC259D5BFC00575D88 /* libopencv_optflow.a in Frameworks */,
|
|
||||||
4EFD0EED259D5BFC00575D88 /* libopencv_imgcodecs.a in Frameworks */,
|
|
||||||
4EFD0EEE259D5BFC00575D88 /* libopencv_fuzzy.a in Frameworks */,
|
|
||||||
4EFD0EEF259D5BFC00575D88 /* libopencv_dpm.a in Frameworks */,
|
|
||||||
4EFD0EF0259D5BFC00575D88 /* libopencv_plot.a in Frameworks */,
|
|
||||||
4EFD0EF1259D5BFC00575D88 /* libopencv_dnn.a in Frameworks */,
|
|
||||||
4EFD0EF2259D5BFC00575D88 /* libopencv_saliency.a in Frameworks */,
|
|
||||||
4EFD0EF3259D5BFC00575D88 /* libopencv_videoio.a in Frameworks */,
|
|
||||||
4EFD0EF4259D5BFC00575D88 /* libopencv_hfs.a in Frameworks */,
|
|
||||||
4EFD0EF5259D5BFC00575D88 /* libopencv_tracking.a in Frameworks */,
|
|
||||||
4EFD0EF6259D5BFC00575D88 /* libopencv_text.a in Frameworks */,
|
|
||||||
4EFD0EF7259D5BFC00575D88 /* libopencv_face.a in Frameworks */,
|
|
||||||
4EFD0EF8259D5BFC00575D88 /* libopencv_bioinspired.a in Frameworks */,
|
|
||||||
4EFD0EF9259D5BFC00575D88 /* libopencv_highgui.a in Frameworks */,
|
|
||||||
4EFD0EFA259D5BFC00575D88 /* libopencv_core.a in Frameworks */,
|
|
||||||
4EFD0EFB259D5BFC00575D88 /* libopencv_shape.a in Frameworks */,
|
|
||||||
4EFD0EFC259D5BFC00575D88 /* libopencv_datasets.a in Frameworks */,
|
|
||||||
4EFD0EFD259D5BFC00575D88 /* libopencv_img_hash.a in Frameworks */,
|
|
||||||
4EFD0EFE259D5BFC00575D88 /* libopencv_surface_matching.a in Frameworks */,
|
|
||||||
4EFD0EFF259D5BFC00575D88 /* libopencv_calib3d.a in Frameworks */,
|
|
||||||
4EFD0F00259D5BFC00575D88 /* libopencv_structured_light.a in Frameworks */,
|
|
||||||
4EFD0F01259D5BFC00575D88 /* libopencv_reg.a in Frameworks */,
|
|
||||||
4EFD0F02259D5BFC00575D88 /* libopencv_xfeatures2d.a in Frameworks */,
|
|
||||||
4EFD0F03259D5BFC00575D88 /* libopencv_videostab.a in Frameworks */,
|
|
||||||
4EFD0F04259D5BFC00575D88 /* libopencv_ccalib.a in Frameworks */,
|
|
||||||
4EFD0F05259D5BFC00575D88 /* libopencv_ximgproc.a in Frameworks */,
|
|
||||||
4EFD0EB1259D5BE500575D88 /* librtabmap_utilite.a in Frameworks */,
|
|
||||||
4EFD0EB2259D5BE500575D88 /* librtabmap_core.a in Frameworks */,
|
|
||||||
4EFD0EAB259D581800575D88 /* OpenGLES.framework in Frameworks */,
|
4EFD0EAB259D581800575D88 /* OpenGLES.framework in Frameworks */,
|
||||||
4EFD0B36259D4DE900575D88 /* libboost_filesystem.a in Frameworks */,
|
4E10D89C2DE409870015926D /* librtabmap_core.a in Frameworks */,
|
||||||
4EFD0B37259D4DE900575D88 /* libboost_program_options.a in Frameworks */,
|
4E10D89D2DE409870015926D /* librtabmap_utilite.a in Frameworks */,
|
||||||
4EFD0B38259D4DE900575D88 /* libboost_regex.a in Frameworks */,
|
4E10D89E2DE409A60015926D /* libopencv_xfeatures2d.a in Frameworks */,
|
||||||
4EFD0B39259D4DE900575D88 /* libboost_iostreams.a in Frameworks */,
|
4E10D89F2DE409B20015926D /* libopencv_video.a in Frameworks */,
|
||||||
4EFD0B3A259D4DE900575D88 /* libboost_date_time.a in Frameworks */,
|
4E10D8A02DE409BB0015926D /* libopencv_tracking.a in Frameworks */,
|
||||||
4EFD0B3B259D4DE900575D88 /* libboost_serialization.a in Frameworks */,
|
4E10D8A12DE409C00015926D /* libopencv_optflow.a in Frameworks */,
|
||||||
4EFD0B3C259D4DE900575D88 /* libboost_system.a in Frameworks */,
|
4E10D8A22DE409C70015926D /* libopencv_imgproc.a in Frameworks */,
|
||||||
4EFD0B3D259D4DE900575D88 /* libboost_signals.a in Frameworks */,
|
4E10D8A32DE409CA0015926D /* libopencv_features2d.a in Frameworks */,
|
||||||
4EFD0B3E259D4DE900575D88 /* libboost_thread.a in Frameworks */,
|
4E10D8A42DE409CE0015926D /* libopencv_core.a in Frameworks */,
|
||||||
4EFD0B3F259D4DE900575D88 /* libboost_timer.a in Frameworks */,
|
4E10D8A52DE409D10015926D /* libopencv_calib3d.a in Frameworks */,
|
||||||
4EFD0B40259D4DE900575D88 /* libboost_chrono.a in Frameworks */,
|
4E10D8A62DE409D50015926D /* libopencv_aruco.a in Frameworks */,
|
||||||
4EFD0B51259D4DF100575D88 /* libpcl_stereo.a in Frameworks */,
|
4E10D8A72DE409F40015926D /* libopencv_flann.a in Frameworks */,
|
||||||
4EFD0B52259D4DF100575D88 /* libpcl_registration.a in Frameworks */,
|
4E10D8A82DE40A1B0015926D /* libopencv_ximgproc.a in Frameworks */,
|
||||||
4EFD0B53259D4DF100575D88 /* libpcl_features.a in Frameworks */,
|
4E10D8A92DE40A3A0015926D /* libopencv_photo.a in Frameworks */,
|
||||||
4EFD0B54259D4DF100575D88 /* libpcl_filters.a in Frameworks */,
|
4E10D8AA2DE40A6C0015926D /* libopencv_objdetect.a in Frameworks */,
|
||||||
4EFD0B55259D4DF100575D88 /* libpcl_sample_consensus.a in Frameworks */,
|
4E10D8AB2DE40A8C0015926D /* libopencv_stitching.a in Frameworks */,
|
||||||
4EFD0B56259D4DF100575D88 /* libpcl_kdtree.a in Frameworks */,
|
4E10D8AC2DE40AA20015926D /* libopencv_imgcodecs.a in Frameworks */,
|
||||||
4EFD0B57259D4DF100575D88 /* libpcl_search.a in Frameworks */,
|
4E3525672DE4C72D00F39D8F /* libamd.a in Frameworks */,
|
||||||
4EFD0B58259D4DF100575D88 /* libpcl_surface.a in Frameworks */,
|
4E3525642DE4C71C00F39D8F /* libsuitesparseconfig.a in Frameworks */,
|
||||||
4EFD0B59259D4DF100575D88 /* libpcl_keypoints.a in Frameworks */,
|
4E3525652DE4C71C00F39D8F /* libspqr.a in Frameworks */,
|
||||||
4EFD0B5A259D4DF100575D88 /* libpcl_recognition.a in Frameworks */,
|
4E35255E2DE4C71000F39D8F /* libcxsparse.a in Frameworks */,
|
||||||
4EFD0B5B259D4DF100575D88 /* libpcl_octree.a in Frameworks */,
|
4E35255F2DE4C71000F39D8F /* libcolamd.a in Frameworks */,
|
||||||
4EFD0B5C259D4DF100575D88 /* libpcl_io.a in Frameworks */,
|
4E3525602DE4C71000F39D8F /* libcamd.a in Frameworks */,
|
||||||
4EFD0B5D259D4DF100575D88 /* libpcl_common.a in Frameworks */,
|
4E3525612DE4C71000F39D8F /* libccolamd.a in Frameworks */,
|
||||||
4EFD0B5E259D4DF100575D88 /* libpcl_io_ply.a in Frameworks */,
|
4E3525592DE4C6F600F39D8F /* libcholmod.a in Frameworks */,
|
||||||
4EFD0B5F259D4DF100575D88 /* libpcl_ml.a in Frameworks */,
|
4E10D8AD2DE40E990015926D /* libg2o_core.a in Frameworks */,
|
||||||
4EFD0B60259D4DF100575D88 /* libpcl_segmentation.a in Frameworks */,
|
4E3525572DE4C6E500F39D8F /* libg2o_solver_cholmod.a in Frameworks */,
|
||||||
|
4E3525542DE4C6E500F39D8F /* libg2o_csparse_extension.a in Frameworks */,
|
||||||
|
4E3525552DE4C6E500F39D8F /* libg2o_solver_csparse.a in Frameworks */,
|
||||||
|
4E10D8AE2DE40E990015926D /* libg2o_solver_dense.a in Frameworks */,
|
||||||
|
4E10D8AF2DE40E990015926D /* libg2o_solver_eigen.a in Frameworks */,
|
||||||
|
4E10D8B02DE40E990015926D /* libg2o_solver_pcg.a in Frameworks */,
|
||||||
|
4E10D8B12DE40E990015926D /* libg2o_solver_slam2d_linear.a in Frameworks */,
|
||||||
|
4E10D8B22DE40E990015926D /* libg2o_solver_structure_only.a in Frameworks */,
|
||||||
|
4E10D8B32DE40E990015926D /* libg2o_stuff.a in Frameworks */,
|
||||||
|
4E10D8B42DE40E990015926D /* libg2o_types_data.a in Frameworks */,
|
||||||
|
4E10D8B52DE40E990015926D /* libg2o_types_icp.a in Frameworks */,
|
||||||
|
4E10D8B62DE40E990015926D /* libg2o_types_sba.a in Frameworks */,
|
||||||
|
4E10D8B72DE40E990015926D /* libg2o_types_sclam2d.a in Frameworks */,
|
||||||
|
4E10D8B82DE40E990015926D /* libg2o_types_sim3.a in Frameworks */,
|
||||||
|
4E10D8B92DE40E990015926D /* libg2o_types_slam2d_addons.a in Frameworks */,
|
||||||
|
4E10D8BA2DE40E990015926D /* libg2o_types_slam2d.a in Frameworks */,
|
||||||
|
4E10D8BB2DE40E990015926D /* libg2o_types_slam3d_addons.a in Frameworks */,
|
||||||
|
4E10D8BC2DE40E990015926D /* libg2o_types_slam3d.a in Frameworks */,
|
||||||
|
4E10D8BD2DE40EC70015926D /* libpcl_common.a in Frameworks */,
|
||||||
|
4E10D8BE2DE40EC70015926D /* libpcl_features.a in Frameworks */,
|
||||||
|
4E10D8BF2DE40EC70015926D /* libpcl_filters.a in Frameworks */,
|
||||||
|
4E10D8C02DE40EC70015926D /* libpcl_io_ply.a in Frameworks */,
|
||||||
|
4E10D8C12DE40EC70015926D /* libpcl_io.a in Frameworks */,
|
||||||
|
4E10D8C22DE40EC70015926D /* libpcl_kdtree.a in Frameworks */,
|
||||||
|
4E10D8C32DE40EC70015926D /* libpcl_keypoints.a in Frameworks */,
|
||||||
|
4E10D8C42DE40EC70015926D /* libpcl_ml.a in Frameworks */,
|
||||||
|
4E10D8C52DE40EC70015926D /* libpcl_octree.a in Frameworks */,
|
||||||
|
4E10D8C62DE40EC70015926D /* libpcl_registration.a in Frameworks */,
|
||||||
|
4E10D8C72DE40EC70015926D /* libpcl_sample_consensus.a in Frameworks */,
|
||||||
|
4E10D8C82DE40EC70015926D /* libpcl_search.a in Frameworks */,
|
||||||
|
4E10D8C92DE40EC70015926D /* libpcl_segmentation.a in Frameworks */,
|
||||||
|
4E10D8CA2DE40EC70015926D /* libpcl_stereo.a in Frameworks */,
|
||||||
|
4E10D8CB2DE40EC70015926D /* libpcl_surface.a in Frameworks */,
|
||||||
|
4E10D8CC2DE40EE30015926D /* libgtsam_unstable.a in Frameworks */,
|
||||||
|
4E10D8CD2DE40EE30015926D /* libgtsam.a in Frameworks */,
|
||||||
|
4E10D8CE2DE40EE30015926D /* libmetis-gtsam.a in Frameworks */,
|
||||||
|
4E10D8CF2DE40EF90015926D /* libboost_serialization.a in Frameworks */,
|
||||||
|
4E10D8D02DE40F060015926D /* libboost_timer.a in Frameworks */,
|
||||||
|
4E10D8D42DE40F2A0015926D /* libboost_thread.a in Frameworks */,
|
||||||
|
4E10D8D12DE40F190015926D /* liblas_c.a in Frameworks */,
|
||||||
|
4E10D8D22DE40F190015926D /* liblas.a in Frameworks */,
|
||||||
|
4E10D8D32DE40F190015926D /* liblaszip.a in Frameworks */,
|
||||||
|
4E10D8E12DE4101B0015926D /* liblibjpeg-turbo.a in Frameworks */,
|
||||||
|
4E10D8E22DE4101B0015926D /* liblibpng.a in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -509,6 +492,51 @@
|
|||||||
4EFD0B2A259D4DE900575D88 /* Frameworks */ = {
|
4EFD0B2A259D4DE900575D88 /* Frameworks */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
4E3525662DE4C72D00F39D8F /* libamd.a */,
|
||||||
|
4E3525632DE4C71C00F39D8F /* libspqr.a */,
|
||||||
|
4E3525622DE4C71C00F39D8F /* libsuitesparseconfig.a */,
|
||||||
|
4E35255C2DE4C71000F39D8F /* libcamd.a */,
|
||||||
|
4E35255D2DE4C71000F39D8F /* libccolamd.a */,
|
||||||
|
4E35255B2DE4C71000F39D8F /* libcolamd.a */,
|
||||||
|
4E35255A2DE4C71000F39D8F /* libcxsparse.a */,
|
||||||
|
4E3525582DE4C6F600F39D8F /* libcholmod.a */,
|
||||||
|
4E3525562DE4C6E500F39D8F /* libg2o_solver_cholmod.a */,
|
||||||
|
4E10D8DB2DE40FF60015926D /* libade.a */,
|
||||||
|
4E10D8DA2DE40FF60015926D /* libIlmImf.a */,
|
||||||
|
4E10D8DC2DE40FF60015926D /* liblibprotobuf.a */,
|
||||||
|
4E10D8D92DE40FF60015926D /* libzlib.a */,
|
||||||
|
4E10D8D72DE40FCA0015926D /* liblibpng.a */,
|
||||||
|
4E10D8D52DE40FBE0015926D /* liblibjpeg-turbo.a */,
|
||||||
|
4E10D8682DE408EE0015926D /* libboost_atomic.a */,
|
||||||
|
4E10D8732DE408EF0015926D /* libboost_charconv.a */,
|
||||||
|
4E10D8642DE408EE0015926D /* libboost_container.a */,
|
||||||
|
4E10D8762DE408EF0015926D /* libboost_contract.a */,
|
||||||
|
4E10D8652DE408EE0015926D /* libboost_graph.a */,
|
||||||
|
4E10D8662DE408EE0015926D /* libboost_json.a */,
|
||||||
|
4E10D86A2DE408EF0015926D /* libboost_locale.a */,
|
||||||
|
4E10D87B2DE408EF0015926D /* libboost_nowide.a */,
|
||||||
|
4E10D8792DE408EF0015926D /* libboost_prg_exec_monitor.a */,
|
||||||
|
4E10D8712DE408EF0015926D /* libboost_random.a */,
|
||||||
|
4E10D87A2DE408EF0015926D /* libboost_stacktrace_addr2line.a */,
|
||||||
|
4E10D8672DE408EE0015926D /* libboost_stacktrace_basic.a */,
|
||||||
|
4E10D8602DE408EE0015926D /* libboost_stacktrace_noop.a */,
|
||||||
|
4E10D87C2DE408EF0015926D /* libboost_test_exec_monitor.a */,
|
||||||
|
4E10D8742DE408EF0015926D /* libboost_type_erasure.a */,
|
||||||
|
4E10D8702DE408EF0015926D /* libboost_unit_test_framework.a */,
|
||||||
|
4E10D86F2DE408EF0015926D /* libboost_url.a */,
|
||||||
|
4E10D8722DE408EF0015926D /* libboost_wave.a */,
|
||||||
|
4E10D8612DE408EE0015926D /* libboost_wserialization.a */,
|
||||||
|
4E10D8752DE408EF0015926D /* liblas_c.a */,
|
||||||
|
4E10D86B2DE408EF0015926D /* liblz4.a */,
|
||||||
|
4E10D8622DE408EE0015926D /* libmetis-gtsam.a */,
|
||||||
|
4E10D86C2DE408EF0015926D /* libopencv_dnn_superres.a */,
|
||||||
|
4E10D8772DE408EF0015926D /* libopencv_gapi.a */,
|
||||||
|
4E10D8692DE408EE0015926D /* libopencv_intensity_transform.a */,
|
||||||
|
4E10D87D2DE408EF0015926D /* libopencv_mcc.a */,
|
||||||
|
4E10D86E2DE408EF0015926D /* libopencv_quality.a */,
|
||||||
|
4E10D86D2DE408EF0015926D /* libopencv_rapid.a */,
|
||||||
|
4E10D8782DE408EF0015926D /* libopencv_signal.a */,
|
||||||
|
4E10D8632DE408EE0015926D /* libopencv_wechat_qrcode.a */,
|
||||||
4ED73AD02D7FECF3007899C2 /* liblaszip.a */,
|
4ED73AD02D7FECF3007899C2 /* liblaszip.a */,
|
||||||
4EFAA9422CAE4E960055DA51 /* liblas.a */,
|
4EFAA9422CAE4E960055DA51 /* liblas.a */,
|
||||||
4EFD0F4D259D67D900575D88 /* liblibjpeg-turbo.a */,
|
4EFD0F4D259D67D900575D88 /* liblibjpeg-turbo.a */,
|
||||||
@@ -889,7 +917,7 @@
|
|||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
@@ -920,7 +948,7 @@
|
|||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
ENABLE_TESTABILITY = YES;
|
ENABLE_TESTABILITY = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
@@ -950,7 +978,7 @@
|
|||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
@@ -981,7 +1009,7 @@
|
|||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = "";
|
GCC_PREPROCESSOR_DEFINITIONS = "";
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
@@ -1035,8 +1063,9 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib",
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib",
|
||||||
"$(PROJECT_DIR)/RTABMapApp/Libraries/share/OpenCV/3rdparty/lib",
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/share/OpenCV/3rdparty/lib",
|
||||||
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib/opencv4/3rdparty",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 0.21.11;
|
MARKETING_VERSION = 0.22.0;
|
||||||
OTHER_CFLAGS = "";
|
OTHER_CFLAGS = "";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.introlab.rtabmap;
|
PRODUCT_BUNDLE_IDENTIFIER = com.introlab.rtabmap;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
@@ -1048,11 +1077,12 @@
|
|||||||
SYSTEM_HEADER_SEARCH_PATHS = (
|
SYSTEM_HEADER_SEARCH_PATHS = (
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/eigen3\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/eigen3\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/pcl-1.11\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/pcl-1.15\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/rtabmap-0.21\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/rtabmap-0.22\"",
|
||||||
"\"$(SRCROOT)/../android/jni/tango-gl/include\"",
|
"\"$(SRCROOT)/../android/jni/tango-gl/include\"",
|
||||||
"\"$(SRCROOT)/../android/jni/third-party/include\"",
|
"\"$(SRCROOT)/../android/jni/third-party/include\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/lib/vtk.framework/Headers\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/lib/vtk.framework/Headers\"",
|
||||||
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/opencv4\"",
|
||||||
);
|
);
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
VALIDATE_WORKSPACE = NO;
|
VALIDATE_WORKSPACE = NO;
|
||||||
@@ -1093,8 +1123,9 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib",
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib",
|
||||||
"$(PROJECT_DIR)/RTABMapApp/Libraries/share/OpenCV/3rdparty/lib",
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/share/OpenCV/3rdparty/lib",
|
||||||
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib/opencv4/3rdparty",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 0.21.11;
|
MARKETING_VERSION = 0.22.0;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
OTHER_CFLAGS = "";
|
OTHER_CFLAGS = "";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.introlab.rtabmap;
|
PRODUCT_BUNDLE_IDENTIFIER = com.introlab.rtabmap;
|
||||||
@@ -1107,11 +1138,12 @@
|
|||||||
SYSTEM_HEADER_SEARCH_PATHS = (
|
SYSTEM_HEADER_SEARCH_PATHS = (
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/eigen3\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/eigen3\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/pcl-1.11\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/pcl-1.15\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/rtabmap-0.21\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/rtabmap-0.22\"",
|
||||||
"\"$(SRCROOT)/../android/jni/tango-gl/include\"",
|
"\"$(SRCROOT)/../android/jni/tango-gl/include\"",
|
||||||
"\"$(SRCROOT)/../android/jni/third-party/include\"",
|
"\"$(SRCROOT)/../android/jni/third-party/include\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/lib/vtk.framework/Headers\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/lib/vtk.framework/Headers\"",
|
||||||
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/opencv4\"",
|
||||||
);
|
);
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
VALIDATE_WORKSPACE = NO;
|
VALIDATE_WORKSPACE = NO;
|
||||||
|
|||||||
@@ -505,6 +505,13 @@ void setSmoothingNative(const void *object, bool enabled)
|
|||||||
else
|
else
|
||||||
UERROR("object is null!");
|
UERROR("object is null!");
|
||||||
}
|
}
|
||||||
|
void setDepthBleedingErrorNative(const void *object, float value)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
native(object)->setDepthBleedingError(value);
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
void setAppendModeNative(const void *object, bool enabled)
|
void setAppendModeNative(const void *object, bool enabled)
|
||||||
{
|
{
|
||||||
if(object)
|
if(object)
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ void setGraphVisibleNative(const void *object, bool visible);
|
|||||||
void setGridVisibleNative(const void *object, bool visible);
|
void setGridVisibleNative(const void *object, bool visible);
|
||||||
void setFullResolutionNative(const void *object, bool enabled);
|
void setFullResolutionNative(const void *object, bool enabled);
|
||||||
void setSmoothingNative(const void *object, bool enabled);
|
void setSmoothingNative(const void *object, bool enabled);
|
||||||
|
void setDepthBleedingErrorNative(const void *object, float value);
|
||||||
void setAppendModeNative(const void *object, bool enabled);
|
void setAppendModeNative(const void *object, bool enabled);
|
||||||
void setUpstreamRelocalizationAccThrNative(const void *object, float value);
|
void setUpstreamRelocalizationAccThrNative(const void *object, float value);
|
||||||
void setMaxCloudDepthNative(const void *object, float value);
|
void setMaxCloudDepthNative(const void *object, float value);
|
||||||
|
|||||||
@@ -453,6 +453,9 @@ class RTABMap {
|
|||||||
func setSmoothing(enabled: Bool) {
|
func setSmoothing(enabled: Bool) {
|
||||||
setSmoothingNative(native_rtabmap, enabled)
|
setSmoothingNative(native_rtabmap, enabled)
|
||||||
}
|
}
|
||||||
|
func setDepthBleedingError(value: Float) {
|
||||||
|
setDepthBleedingErrorNative(native_rtabmap, value)
|
||||||
|
}
|
||||||
func setAppendMode(enabled: Bool) {
|
func setAppendMode(enabled: Bool) {
|
||||||
setAppendModeNative(native_rtabmap, enabled)
|
setAppendModeNative(native_rtabmap, enabled)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,7 +162,6 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
func resetNoTouchTimer(_ showHud: Bool = false) {
|
func resetNoTouchTimer(_ showHud: Bool = false) {
|
||||||
if(showHud)
|
if(showHud)
|
||||||
{
|
{
|
||||||
print("Show HUD")
|
|
||||||
mMenuOpened = false
|
mMenuOpened = false
|
||||||
mHudVisible = true
|
mHudVisible = true
|
||||||
setNeedsStatusBarAppearanceUpdate()
|
setNeedsStatusBarAppearanceUpdate()
|
||||||
@@ -184,7 +183,6 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
}
|
}
|
||||||
else if(mState != .STATE_WELCOME && mState != .STATE_CAMERA && presentedViewController as? UIAlertController == nil && !mMenuOpened)
|
else if(mState != .STATE_WELCOME && mState != .STATE_CAMERA && presentedViewController as? UIAlertController == nil && !mMenuOpened)
|
||||||
{
|
{
|
||||||
print("Hide HUD")
|
|
||||||
self.mHudVisible = false
|
self.mHudVisible = false
|
||||||
self.setNeedsStatusBarAppearanceUpdate()
|
self.setNeedsStatusBarAppearanceUpdate()
|
||||||
self.updateState(state: self.mState)
|
self.updateState(state: self.mState)
|
||||||
@@ -840,13 +838,11 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
self.isPaused = true
|
self.isPaused = true
|
||||||
view?.enableSetNeedsDisplay = true
|
view?.enableSetNeedsDisplay = true
|
||||||
self.view.setNeedsDisplay()
|
self.view.setNeedsDisplay()
|
||||||
print("enableSetNeedsDisplay")
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
view?.enableSetNeedsDisplay = false
|
view?.enableSetNeedsDisplay = false
|
||||||
self.isPaused = false
|
self.isPaused = false
|
||||||
print("disableSetNeedsDisplay")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if !self.isPaused {
|
if !self.isPaused {
|
||||||
@@ -934,7 +930,6 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
])
|
])
|
||||||
|
|
||||||
// Measuring menu
|
// Measuring menu
|
||||||
print("measuringMode = \(measuringMode)")
|
|
||||||
let measuringMenu = UIMenu(title: "Measuring...", image: UIImage(systemName: "ruler"), children: [
|
let measuringMenu = UIMenu(title: "Measuring...", image: UIImage(systemName: "ruler"), children: [
|
||||||
UIAction(title: "Plane to Plane Mode", image: measuringMode == 0 ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), handler: { _ in
|
UIAction(title: "Plane to Plane Mode", image: measuringMode == 0 ? UIImage(systemName: "checkmark.circle") : UIImage(systemName: "circle"), handler: { _ in
|
||||||
self.measuringMode = 0
|
self.measuringMode = 0
|
||||||
@@ -1516,6 +1511,7 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
rtabmap!.setNodesFiltering(enabled: defaults.bool(forKey: "NodesFiltering"));
|
rtabmap!.setNodesFiltering(enabled: defaults.bool(forKey: "NodesFiltering"));
|
||||||
rtabmap!.setFullResolution(enabled: defaults.bool(forKey: "HDMode"));
|
rtabmap!.setFullResolution(enabled: defaults.bool(forKey: "HDMode"));
|
||||||
rtabmap!.setSmoothing(enabled: defaults.bool(forKey: "Smoothing"));
|
rtabmap!.setSmoothing(enabled: defaults.bool(forKey: "Smoothing"));
|
||||||
|
rtabmap!.setDepthBleedingError(value: defaults.float(forKey: "DepthBleedingError"));
|
||||||
rtabmap!.setAppendMode(enabled: defaults.bool(forKey: "AppendMode"));
|
rtabmap!.setAppendMode(enabled: defaults.bool(forKey: "AppendMode"));
|
||||||
rtabmap!.setUpstreamRelocalizationAccThr(value: defaults.float(forKey: "UpstreamRelocalizationFilteringAccThr"));
|
rtabmap!.setUpstreamRelocalizationAccThr(value: defaults.float(forKey: "UpstreamRelocalizationFilteringAccThr"));
|
||||||
rtabmap!.setExportPointCloudFormat(format: defaults.string(forKey: "ExportPointCloudFormat")!);
|
rtabmap!.setExportPointCloudFormat(format: defaults.string(forKey: "ExportPointCloudFormat")!);
|
||||||
@@ -1918,7 +1914,9 @@ 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: {
|
||||||
@@ -1989,8 +1987,11 @@ class ViewController: GLKViewController, ARSessionDelegate, RTABMapObserver, UIP
|
|||||||
self.updateState(state: .STATE_VISUALIZING)
|
self.updateState(state: .STATE_VISUALIZING)
|
||||||
|
|
||||||
self.rtabmap!.postExportation(visualize: true)
|
self.rtabmap!.postExportation(visualize: true)
|
||||||
|
|
||||||
self.setGLCamera(type: 2)
|
if previousState != .STATE_VISUALIZING
|
||||||
|
{
|
||||||
|
self.setGLCamera(type: 2)
|
||||||
|
}
|
||||||
|
|
||||||
if self.openedDatabasePath == nil
|
if self.openedDatabasePath == nil
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
set -euxo pipefail
|
set -euxo pipefail
|
||||||
|
|
||||||
# Tested on Apple Silicon Mac, with cmake 3.19.2.
|
# Tested on Apple Silicon Mac, with cmake 4.0.2, XCode 16.3.
|
||||||
|
|
||||||
mkdir -p Libraries
|
mkdir -p Libraries
|
||||||
cd Libraries
|
cd Libraries
|
||||||
@@ -28,41 +28,65 @@ sysroot=iphoneos
|
|||||||
# Boost
|
# Boost
|
||||||
if [ ! -e $prefix/include/boost ]
|
if [ ! -e $prefix/include/boost ]
|
||||||
then
|
then
|
||||||
if [ ! -e boost_1_59_0 ]
|
if [ ! -e boost-1.88.0 ]
|
||||||
then
|
then
|
||||||
echo "wget boost..."
|
echo "wget boost..."
|
||||||
curl -L https://downloads.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz -o boost_1_59_0.tar.gz
|
curl -L https://github.com/boostorg/boost/releases/download/boost-1.88.0/boost-1.88.0-cmake.tar.gz -o boost-1.88.0-cmake.tar.gz
|
||||||
tar -xzf boost_1_59_0.tar.gz
|
tar -xzf boost-1.88.0-cmake.tar.gz
|
||||||
fi
|
fi
|
||||||
cd boost_1_59_0
|
cd boost-1.88.0
|
||||||
curl -L https://gist.github.com/matlabbe/0bce8feeb73a499a76afbbcc5c687221/raw/489ff2869eccd6f8d03ffb9090ef839108762741/BoostConfig.cmake.in -o BoostConfig.cmake.in
|
|
||||||
curl -L https://gist.github.com/matlabbe/0bce8feeb73a499a76afbbcc5c687221/raw/b07fe7d4e5dfe5f1d110c733e5cf660d79a26378/CMakeLists.txt -o CMakeLists.txt
|
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix ..
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DBOOST_INCOMPATIBLE_LIBRARIES="process;context;coroutine;fiber;fiber_numa;log_setup;log;cobalt" -DBOOST_IOSTREAMS_ENABLE_ZLIB=OFF -DBOOST_IOSTREAMS_ENABLE_BZIP2=OFF ..
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --build . --config Release --target install
|
cmake --build . --config Release --target install
|
||||||
cd $pwd
|
cd $pwd
|
||||||
#rm -r boost_1_59_0.tar.gz boost_1_59_0
|
#rm -r boost-1.88.0-cmake.tar.gz boost-1.88.0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# eigen
|
# eigen
|
||||||
if [ ! -e $prefix/include/eigen3 ]
|
if [ ! -e $prefix/include/eigen3 ]
|
||||||
then
|
then
|
||||||
if [ ! -e eigen-3.3.9 ]
|
if [ ! -e eigen-3.4.0 ]
|
||||||
then
|
then
|
||||||
echo "wget eigen..."
|
echo "wget eigen..."
|
||||||
curl -L https://gitlab.com/libeigen/eigen/-/archive/3.3.9/eigen-3.3.9.tar.gz -o 3.3.9.tar.gz
|
curl -L https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz -o 3.4.0.tar.gz
|
||||||
tar -xzf 3.3.9.tar.gz
|
tar -xzf 3.4.0.tar.gz
|
||||||
fi
|
fi
|
||||||
cd eigen-3.3.9
|
cd eigen-3.4.0
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix ..
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix ..
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --build . --config Release --target install
|
cmake --build . --config Release --target install
|
||||||
cd $pwd
|
cd $pwd
|
||||||
#rm -r 3.3.9.tar.gz eigen-3.3.9
|
#rm -r 3.4.0.tar.gz eigen-3.4.0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# lz4 (required by flann)
|
||||||
|
if [ ! -e $prefix/include/lz4.h ]
|
||||||
|
then
|
||||||
|
if [ ! -e lz4 ]
|
||||||
|
then
|
||||||
|
echo "wget lz4..."
|
||||||
|
git clone https://github.com/lz4/lz4.git -b v1.10.0
|
||||||
|
fi
|
||||||
|
cd lz4
|
||||||
|
if [ ! -e LZ4Config.cmake.in ]
|
||||||
|
then
|
||||||
|
curl -L https://gist.githubusercontent.com/matlabbe/abd0242305c29495bbba26065269daf2/raw/ad0b1865c02e61449f58358fdc4ddbed3cb5fb87/LZ4Config.cmake.in -o LZ4Config.cmake.in
|
||||||
|
fi
|
||||||
|
if [ ! -e CMakeLists.txt ]
|
||||||
|
then
|
||||||
|
curl -L https://gist.githubusercontent.com/matlabbe/abd0242305c29495bbba26065269daf2/raw/ad0b1865c02e61449f58358fdc4ddbed3cb5fb87/CMakeLists.txt -o CMakeLists.txt
|
||||||
|
fi
|
||||||
|
mkdir -p build
|
||||||
|
cd build
|
||||||
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix ..
|
||||||
|
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
cd $pwd
|
||||||
|
#rm -r lz4
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# FLANN
|
# FLANN
|
||||||
@@ -71,19 +95,17 @@ then
|
|||||||
if [ ! -e flann ]
|
if [ ! -e flann ]
|
||||||
then
|
then
|
||||||
echo "wget flann..."
|
echo "wget flann..."
|
||||||
git clone https://github.com/flann-lib/flann.git -b 1.8.4
|
git clone https://github.com/flann-lib/flann.git -b 1.9.2
|
||||||
fi
|
fi
|
||||||
cd flann
|
cd flann
|
||||||
if [ ! -e flann_ios.patch ]
|
if [ ! -e flann_ios_lz4.patch ]
|
||||||
then
|
then
|
||||||
curl -L https://gist.githubusercontent.com/matlabbe/c858ba36fb85d5e44d8667dfb3543e12/raw/8fc40aa9bc3267604869444020476a49f14ab424/flann_ios.patch -o flann_ios.patch
|
curl -L https://gist.githubusercontent.com/matlabbe/c858ba36fb85d5e44d8667dfb3543e12/raw/2586a356dec2b11440ec3c1bb113e709e1266d97/flann_ios_lz4.patch -o flann_ios_lz4.patch
|
||||||
git apply flann_ios.patch
|
git apply flann_ios_lz4.patch
|
||||||
fi
|
fi
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
# comment "add_subdirectory( test )" in top CMakeLists.txt
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DBUILD_PYTHON_BINDINGS=OFF -DBUILD_MATLAB_BINDINGS=OFF -DBUILD_C_BINDINGS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF -DBUILD_DOC=OFF -DUSE_OPENMP=OFF -DLZ4_DIR=$prefix/lib/lz4 ..
|
||||||
# comment "add_subdirectory( doc )" in top CMakeLists.txt
|
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DBUILD_PYTHON_BINDINGS=OFF -DBUILD_MATLAB_BINDINGS=OFF -DBUILD_C_BINDINGS=OFF ..
|
|
||||||
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
cd $pwd
|
cd $pwd
|
||||||
@@ -95,17 +117,14 @@ if [ ! -e $prefix/include/gtsam ]
|
|||||||
then
|
then
|
||||||
if [ ! -e gtsam ]
|
if [ ! -e gtsam ]
|
||||||
then
|
then
|
||||||
git clone https://bitbucket.org/gtborg/gtsam.git
|
git clone https://github.com/borglab/gtsam.git -b 4.2
|
||||||
cd gtsam
|
|
||||||
git checkout fbb9d3bdda8b88df51896bc401bfd170573e66f5
|
|
||||||
else
|
|
||||||
cd gtsam
|
|
||||||
fi
|
fi
|
||||||
|
cd gtsam
|
||||||
# patch
|
# patch
|
||||||
if [ ! -e gtsam_GKlib_ios_fix.patch ]
|
if [ ! -e gtsam_4_2_ios.patch ]
|
||||||
then
|
then
|
||||||
curl -L https://gist.github.com/matlabbe/76d658dddb841b3355ae3a6e32850cd8/raw/7033cba1c89097b0c830651d7277c04dc92cbdd9/gtsam_GKlib_ios_fix.patch -o gtsam_GKlib_ios_fix.patch
|
curl -L https://gist.githubusercontent.com/matlabbe/76d658dddb841b3355ae3a6e32850cd8/raw/e7355348c2d536ec50f41effa775ed251ae4e045/gtsam_4_2_ios.patch -o gtsam_4_2_ios.patch
|
||||||
git apply gtsam_GKlib_ios_fix.patch
|
git apply gtsam_4_2_ios.patch
|
||||||
fi
|
fi
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
@@ -116,22 +135,36 @@ cd $pwd
|
|||||||
#rm -rf gtsam
|
#rm -rf gtsam
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# suitesparse (dependency of g2o)
|
||||||
|
if [ ! -e $prefix/include/suitesparse/SuiteSparse_config.h ]
|
||||||
|
then
|
||||||
|
if [ ! -e SuiteSparse ]
|
||||||
|
then
|
||||||
|
git clone https://github.com/DrTimothyAldenDavis/SuiteSparse.git -b v7.6.1
|
||||||
|
fi
|
||||||
|
cd SuiteSparse
|
||||||
|
mkdir -p build
|
||||||
|
cd build
|
||||||
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DCMAKE_FIND_ROOT_PATH=$prefix -DSUITESPARSE_USE_OPENMP=OFF -DSUITESPARSE_ENABLE_PROJECTS="cholmod;cxsparse;spqr" ..
|
||||||
|
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
cd $pwd
|
||||||
|
fi
|
||||||
|
|
||||||
# g2o
|
# g2o
|
||||||
if [ ! -e $prefix/include/g2o ]
|
if [ ! -e $prefix/include/g2o ]
|
||||||
then
|
then
|
||||||
if [ ! -e g2o ]
|
if [ ! -e g2o ]
|
||||||
then
|
then
|
||||||
git clone https://github.com/RainerKuemmerle/g2o.git
|
git clone https://github.com/RainerKuemmerle/g2o.git -b 20241228_git
|
||||||
cd g2o
|
|
||||||
git checkout a3f7706bdbb849b2808dc3e1b7aee189f63b498e
|
|
||||||
else
|
|
||||||
cd g2o
|
|
||||||
fi
|
fi
|
||||||
|
cd g2o
|
||||||
# patch
|
# patch
|
||||||
if [ ! -e g2o_ios_fix.patch ]
|
if [ ! -e g2o_20241228_ios.patch ]
|
||||||
then
|
then
|
||||||
curl -L https://gist.github.com/matlabbe/b9ccfeae8f0744b275cab23510872680/raw/a58e06accba3976420d4b61341685c123193810e/g2o_ios_fix.patch -o g2o_ios_fix.patch
|
ls
|
||||||
git apply g2o_ios_fix.patch
|
curl -L https://gist.githubusercontent.com/matlabbe/b9ccfeae8f0744b275cab23510872680/raw/6fe2ffe5ba8fba59171adbd2f38f9c3999c61f75/g2o_20241228_ios.patch -o g2o_20241228_ios.patch
|
||||||
|
git apply g2o_20241228_ios.patch
|
||||||
fi
|
fi
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
@@ -149,11 +182,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 +195,28 @@ cd $pwd
|
|||||||
#rm -rf VTK
|
#rm -rf VTK
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# PCL
|
# PCL
|
||||||
if [ ! -e $prefix/include/pcl-1.11 ]
|
if [ ! -e $prefix/include/pcl-1.15 ]
|
||||||
then
|
then
|
||||||
if [ ! -e pcl ]
|
if [ ! -e pcl ]
|
||||||
then
|
then
|
||||||
git clone https://github.com/PointCloudLibrary/pcl.git
|
git clone https://github.com/PointCloudLibrary/pcl.git
|
||||||
cd pcl
|
cd pcl
|
||||||
git checkout tags/pcl-1.11.1
|
git checkout tags/pcl-1.15.0
|
||||||
else
|
else
|
||||||
cd pcl
|
cd pcl
|
||||||
fi
|
fi
|
||||||
# patch
|
# patch
|
||||||
if [ ! -e pcl_1_11_1_vtk_ios_support.patch ]
|
if [ ! -e pcl_1_15_0_ios.patch ]
|
||||||
then
|
then
|
||||||
curl -L https://gist.github.com/matlabbe/f3ba9366eb91e1b855dadd2ddce5746d/raw/6869cf26211ab15492599e557b0e729b23b2c119/pcl_1_11_1_vtk_ios_support.patch -o pcl_1_11_1_vtk_ios_support.patch
|
curl -L https://gist.githubusercontent.com/matlabbe/f3ba9366eb91e1b855dadd2ddce5746d/raw/7231688d7fb9e86df72ca7c5f355d6b9727205d5/pcl_1_15_0_ios.patch -o pcl_1_15_0_ios.patch
|
||||||
git apply pcl_1_11_1_vtk_ios_support.patch
|
git apply pcl_1_15_0_ios.patch
|
||||||
fi
|
fi
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DBUILD_apps=OFF -DBUILD_examples=OFF -DBUILD_tools=OFF -DBUILD_visualization=OFF -DBUILD_tracking=OFF -DBUILD_people=OFF -DBUILD_global_tests=OFF -DWITH_QT=OFF -DWITH_OPENGL=OFF -DWITH_VTK=ON -DPCL_SHARED_LIBS=OFF -DPCL_ENABLE_SSE=OFF -DCMAKE_FIND_ROOT_PATH=$prefix ..
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DBUILD_apps=OFF -DBUILD_examples=OFF -DBUILD_tools=OFF -DBUILD_visualization=OFF -DBUILD_tracking=OFF -DBUILD_people=OFF -DBUILD_recognition=OFF -DBUILD_global_tests=OFF -DWITH_QT=OFF -DWITH_OPENGL=OFF -DWITH_OPENMP=OFF -DWITH_VTK=ON -DPCL_FLANN_REQUIRED_TYPE=STATIC -DPCL_SHARED_LIBS=OFF -DPCL_ENABLE_SSE=OFF -DCMAKE_FIND_ROOT_PATH=$prefix ..
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --build . --config Release --target install
|
cmake --build . --config Release --target install
|
||||||
cd $pwd
|
cd $pwd
|
||||||
@@ -190,32 +224,21 @@ cd $pwd
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# OpenCV
|
# OpenCV
|
||||||
if [ ! -e $prefix/include/opencv2 ]
|
if [ ! -e $prefix/include/opencv4 ]
|
||||||
then
|
then
|
||||||
if [ ! -e opencv_contrib ]
|
if [ ! -e opencv_contrib ]
|
||||||
then
|
then
|
||||||
git clone https://github.com/opencv/opencv_contrib.git
|
git clone https://github.com/opencv/opencv_contrib.git -b 4.11.0
|
||||||
cd opencv_contrib
|
|
||||||
git checkout tags/3.4.2
|
|
||||||
fi
|
fi
|
||||||
cd $pwd
|
cd $pwd
|
||||||
if [ ! -e opencv ]
|
if [ ! -e opencv ]
|
||||||
then
|
then
|
||||||
git clone https://github.com/opencv/opencv.git
|
git clone https://github.com/opencv/opencv.git -b 4.11.0
|
||||||
cd opencv
|
|
||||||
git checkout tags/3.4.2
|
|
||||||
else
|
|
||||||
cd opencv
|
|
||||||
fi
|
|
||||||
if [ ! -e opencv_ios.patch ]
|
|
||||||
then
|
|
||||||
curl -L https://gist.githubusercontent.com/matlabbe/fdc3ab4854f3a68fbde7277f543b4e5b/raw/f340839c09165056d3845645df24b76507542fd2/opencv_ios.patch -o opencv_ios.patch
|
|
||||||
git apply opencv_ios.patch
|
|
||||||
fi
|
fi
|
||||||
|
cd opencv
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
# add "add_definitions(-DPNG_ARM_NEON_OPT=0)" in 3rdparty/libpng/CMakeLists.txt
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DOPENCV_EXTRA_MODULES_PATH=$prefix/opencv_contrib/modules -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DWITH_CUDA=OFF -DWITH_WEBP=OFF -DWITH_OPENEXR=OFF -DBUILD_opencv_apps=OFF -DBUILD_opencv_xobjdetect=OFF -DBUILD_opencv_stereo=OFF -DOPENCV_ENABLE_NONFREE=ON ..
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DOPENCV_EXTRA_MODULES_PATH=$prefix/opencv_contrib/modules -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DWITH_CUDA=OFF -DBUILD_opencv_apps=OFF -DBUILD_opencv_xobjdetect=OFF -DBUILD_opencv_stereo=OFF ..
|
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --build . --config Release --target install
|
cmake --build . --config Release --target install
|
||||||
cd $pwd
|
cd $pwd
|
||||||
@@ -228,12 +251,10 @@ if [ ! -e $prefix/include/laszip ]
|
|||||||
then
|
then
|
||||||
if [ ! -e LASzip ]
|
if [ ! -e LASzip ]
|
||||||
then
|
then
|
||||||
git clone https://github.com/LASzip/LASzip.git
|
git clone https://github.com/LASzip/LASzip.git -b 2.0.1
|
||||||
cd LASzip
|
|
||||||
git checkout 2.0.1
|
|
||||||
else
|
|
||||||
cd LASzip
|
|
||||||
fi
|
fi
|
||||||
|
cd LASzip
|
||||||
|
sed -i '' 's/cmake_minimum_required(VERSION 2.6.0)/cmake_minimum_required(VERSION 3.5)/g' CMakeLists.txt
|
||||||
sed -i '' 's/add_subdirectory(tools)/#add_subdirectory(tools)/g' CMakeLists.txt
|
sed -i '' 's/add_subdirectory(tools)/#add_subdirectory(tools)/g' CMakeLists.txt
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
@@ -251,6 +272,7 @@ then
|
|||||||
git clone https://github.com/libLAS/libLAS.git
|
git clone https://github.com/libLAS/libLAS.git
|
||||||
fi
|
fi
|
||||||
cd libLAS
|
cd libLAS
|
||||||
|
sed -i '' 's/cmake_minimum_required(VERSION 2.8.11)/cmake_minimum_required(VERSION 3.5)/g' CMakeLists.txt
|
||||||
sed -i '' 's/SHARED/STATIC/g' src/CMakeLists.txt
|
sed -i '' 's/SHARED/STATIC/g' src/CMakeLists.txt
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
@@ -266,6 +288,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 ../../../../../..
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --build . --config Release --target install
|
cmake --build . --config Release --target install
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>Choosing between high and low depth confidence depends on the application. If precise geometry is critical, prioritize high depth confidence even if it means fewer points. If you need a dense point cloud for analysis, even in areas with weak LiDAR signal, a lower depth confidence might be suitable at the cost of highly interpolated points (that could give a wavy look of some surfaces). Important: the points with too low confidence are not saved in the db file, so we cannot recover or filter these points in post-processing.</string>
|
<string>Choosing between high and low depth confidence depends on the application. If precise geometry is critical, prioritize high depth confidence even if it means fewer points. If you need a dense point cloud for analysis, even in areas with weak LiDAR signal, a lower depth confidence might be suitable at the cost of highly interpolated points (that could give a wavy look of some surfaces). Note: it is possible to change confidence level in post-processing.</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>DefaultValue</key>
|
<key>DefaultValue</key>
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>Smooth the point clouds.</string>
|
<string>Smooth the point clouds. Note that this can be changed in post-processing.</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
@@ -98,6 +98,44 @@
|
|||||||
<key>DefaultValue</key>
|
<key>DefaultValue</key>
|
||||||
<false/>
|
<false/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
<key>FooterText</key>
|
||||||
|
<string>Filter interpolated depth pixels between foreground and background objects. Note that values can be changed in post-processing.</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSMultiValueSpecifier</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>Depth Bleeding Filter Error</string>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>DepthBleedingError</string>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>Titles</key>
|
||||||
|
<array>
|
||||||
|
<string>Disabled</string>
|
||||||
|
<string>2.5 cm</string>
|
||||||
|
<string>5 cm</string>
|
||||||
|
<string>10 cm</string>
|
||||||
|
<string>15 cm</string>
|
||||||
|
<string>20 cm</string>
|
||||||
|
<string>25 cm</string>
|
||||||
|
<string>30 cm</string>
|
||||||
|
</array>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<string>0</string>
|
||||||
|
<string>0.025</string>
|
||||||
|
<string>0.05</string>
|
||||||
|
<string>0.10</string>
|
||||||
|
<string>0.15</string>
|
||||||
|
<string>0.20</string>
|
||||||
|
<string>0.25</string>
|
||||||
|
<string>0.30</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
@@ -590,7 +628,7 @@
|
|||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>BRIEF features are fast to compute but are not rotation invariant like FREAK. Warning: Changing feature type will automatically reset the map!</string>
|
<string>BRIEF, FREAK and ORB are binary features, which are fast to compute and use less memory. SURF and SIFT are high dimensional float descriptors (rotation/scale/shear-invariant), so they use more memory and CPU but they are significantly better to detect loop closures in large environments. Warning: Changing feature type will automatically reset the map!</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
@@ -603,13 +641,21 @@
|
|||||||
<string>6</string>
|
<string>6</string>
|
||||||
<key>Titles</key>
|
<key>Titles</key>
|
||||||
<array>
|
<array>
|
||||||
<string>BRIEF</string>
|
<string>SURF</string>
|
||||||
<string>FREAK</string>
|
<string>SIFT</string>
|
||||||
|
<string>GFTT-FREAK</string>
|
||||||
|
<string>GFTT-BRIEF</string>
|
||||||
|
<string>GFTT-ORB</string>
|
||||||
|
<string>ORB-OCTREE</string>
|
||||||
</array>
|
</array>
|
||||||
<key>Values</key>
|
<key>Values</key>
|
||||||
<array>
|
<array>
|
||||||
<string>6</string>
|
<string>0</string>
|
||||||
|
<string>1</string>
|
||||||
<string>5</string>
|
<string>5</string>
|
||||||
|
<string>6</string>
|
||||||
|
<string>8</string>
|
||||||
|
<string>10</string>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
|
|||||||
@@ -494,7 +494,7 @@
|
|||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>DefaultValue</key>
|
<key>DefaultValue</key>
|
||||||
<string>0.21.11</string>
|
<string>0.22.0</string>
|
||||||
<key>Key</key>
|
<key>Key</key>
|
||||||
<string>Version</string>
|
<string>Version</string>
|
||||||
<key>Title</key>
|
<key>Title</key>
|
||||||
|
|||||||
@@ -78,6 +78,16 @@ public:
|
|||||||
double stamp = 0.0,
|
double stamp = 0.0,
|
||||||
const cv::Mat & userData = cv::Mat());
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
|
// RGB-D constructor + depth confidence
|
||||||
|
SensorData(
|
||||||
|
const cv::Mat & rgb,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
const cv::Mat & depth_confidence,
|
||||||
|
const CameraModel & cameraModel,
|
||||||
|
int id = 0,
|
||||||
|
double stamp = 0.0,
|
||||||
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
// RGB-D constructor + laser scan
|
// RGB-D constructor + laser scan
|
||||||
SensorData(
|
SensorData(
|
||||||
const LaserScan & laserScan,
|
const LaserScan & laserScan,
|
||||||
@@ -87,6 +97,17 @@ public:
|
|||||||
int id = 0,
|
int id = 0,
|
||||||
double stamp = 0.0,
|
double stamp = 0.0,
|
||||||
const cv::Mat & userData = cv::Mat());
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
|
// RGB-D constructor + confidence + laser scan
|
||||||
|
SensorData(
|
||||||
|
const LaserScan & laserScan,
|
||||||
|
const cv::Mat & rgb,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
const cv::Mat & depthConfidence,
|
||||||
|
const CameraModel & cameraModel,
|
||||||
|
int id = 0,
|
||||||
|
double stamp = 0.0,
|
||||||
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
// Multi-cameras RGB-D constructor
|
// Multi-cameras RGB-D constructor
|
||||||
SensorData(
|
SensorData(
|
||||||
@@ -96,6 +117,16 @@ public:
|
|||||||
int id = 0,
|
int id = 0,
|
||||||
double stamp = 0.0,
|
double stamp = 0.0,
|
||||||
const cv::Mat & userData = cv::Mat());
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
|
// Multi-cameras RGB-D constructor + depth confidence
|
||||||
|
SensorData(
|
||||||
|
const cv::Mat & rgb,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
const cv::Mat & depthConfidence,
|
||||||
|
const std::vector<CameraModel> & cameraModels,
|
||||||
|
int id = 0,
|
||||||
|
double stamp = 0.0,
|
||||||
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
// Multi-cameras RGB-D constructor + laser scan
|
// Multi-cameras RGB-D constructor + laser scan
|
||||||
SensorData(
|
SensorData(
|
||||||
@@ -107,6 +138,17 @@ public:
|
|||||||
double stamp = 0.0,
|
double stamp = 0.0,
|
||||||
const cv::Mat & userData = cv::Mat());
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
|
// Multi-cameras RGB-D constructor + depth confidence + laser scan
|
||||||
|
SensorData(
|
||||||
|
const LaserScan & laserScan,
|
||||||
|
const cv::Mat & rgb,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
const cv::Mat & depthConfidence,
|
||||||
|
const std::vector<CameraModel> & cameraModels,
|
||||||
|
int id = 0,
|
||||||
|
double stamp = 0.0,
|
||||||
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
// Stereo constructor
|
// Stereo constructor
|
||||||
SensorData(
|
SensorData(
|
||||||
const cv::Mat & left,
|
const cv::Mat & left,
|
||||||
@@ -160,6 +202,8 @@ public:
|
|||||||
_imageCompressed.empty() &&
|
_imageCompressed.empty() &&
|
||||||
_depthOrRightRaw.empty() &&
|
_depthOrRightRaw.empty() &&
|
||||||
_depthOrRightCompressed.empty() &&
|
_depthOrRightCompressed.empty() &&
|
||||||
|
_depthConfidenceRaw.empty() &&
|
||||||
|
_depthConfidenceCompressed.empty() &&
|
||||||
_laserScanRaw.isEmpty() &&
|
_laserScanRaw.isEmpty() &&
|
||||||
_laserScanCompressed.isEmpty() &&
|
_laserScanCompressed.isEmpty() &&
|
||||||
_cameraModels.empty() &&
|
_cameraModels.empty() &&
|
||||||
@@ -178,10 +222,12 @@ public:
|
|||||||
|
|
||||||
const cv::Mat & imageCompressed() const {return _imageCompressed;}
|
const cv::Mat & imageCompressed() const {return _imageCompressed;}
|
||||||
const cv::Mat & depthOrRightCompressed() const {return _depthOrRightCompressed;}
|
const cv::Mat & depthOrRightCompressed() const {return _depthOrRightCompressed;}
|
||||||
|
const cv::Mat & depthConfidenceCompressed() const {return _depthConfidenceCompressed;}
|
||||||
const LaserScan & laserScanCompressed() const {return _laserScanCompressed;}
|
const LaserScan & laserScanCompressed() const {return _laserScanCompressed;}
|
||||||
|
|
||||||
const cv::Mat & imageRaw() const {return _imageRaw;}
|
const cv::Mat & imageRaw() const {return _imageRaw;}
|
||||||
const cv::Mat & depthOrRightRaw() const {return _depthOrRightRaw;}
|
const cv::Mat & depthOrRightRaw() const {return _depthOrRightRaw;}
|
||||||
|
const cv::Mat & depthConfidenceRaw() const {return _depthConfidenceRaw;}
|
||||||
const LaserScan & laserScanRaw() const {return _laserScanRaw;}
|
const LaserScan & laserScanRaw() const {return _laserScanRaw;}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -190,7 +236,9 @@ public:
|
|||||||
* @param clearPreviousData, clear previous raw and compressed images before setting the new ones.
|
* @param clearPreviousData, clear previous raw and compressed images before setting the new ones.
|
||||||
*/
|
*/
|
||||||
void setRGBDImage(const cv::Mat & rgb, const cv::Mat & depth, const CameraModel & model, bool clearPreviousData = true);
|
void setRGBDImage(const cv::Mat & rgb, const cv::Mat & depth, const CameraModel & model, bool clearPreviousData = true);
|
||||||
|
void setRGBDImage(const cv::Mat & rgb, const cv::Mat & depth, const cv::Mat & depth_confidence, const CameraModel & model, bool clearPreviousData = true);
|
||||||
void setRGBDImage(const cv::Mat & rgb, const cv::Mat & depth, const std::vector<CameraModel> & models, bool clearPreviousData = true);
|
void setRGBDImage(const cv::Mat & rgb, const cv::Mat & depth, const std::vector<CameraModel> & models, bool clearPreviousData = true);
|
||||||
|
void setRGBDImage(const cv::Mat & rgb, const cv::Mat & depth, const cv::Mat & depth_confidence, const std::vector<CameraModel> & models, bool clearPreviousData = true);
|
||||||
void setStereoImage(const cv::Mat & left, const cv::Mat & right, const StereoCameraModel & stereoCameraModel, bool clearPreviousData = true);
|
void setStereoImage(const cv::Mat & left, const cv::Mat & right, const StereoCameraModel & stereoCameraModel, bool clearPreviousData = true);
|
||||||
void setStereoImage(const cv::Mat & left, const cv::Mat & right, const std::vector<StereoCameraModel> & stereoCameraModels, bool clearPreviousData = true);
|
void setStereoImage(const cv::Mat & left, const cv::Mat & right, const std::vector<StereoCameraModel> & stereoCameraModels, bool clearPreviousData = true);
|
||||||
|
|
||||||
@@ -227,7 +275,8 @@ public:
|
|||||||
cv::Mat * userDataRaw = 0,
|
cv::Mat * userDataRaw = 0,
|
||||||
cv::Mat * groundCellsRaw = 0,
|
cv::Mat * groundCellsRaw = 0,
|
||||||
cv::Mat * obstacleCellsRaw = 0,
|
cv::Mat * obstacleCellsRaw = 0,
|
||||||
cv::Mat * emptyCellsRaw = 0);
|
cv::Mat * emptyCellsRaw = 0,
|
||||||
|
cv::Mat * depthConfidenceRaw = 0);
|
||||||
void uncompressDataConst(
|
void uncompressDataConst(
|
||||||
cv::Mat * imageRaw,
|
cv::Mat * imageRaw,
|
||||||
cv::Mat * depthOrRightRaw,
|
cv::Mat * depthOrRightRaw,
|
||||||
@@ -235,7 +284,8 @@ public:
|
|||||||
cv::Mat * userDataRaw = 0,
|
cv::Mat * userDataRaw = 0,
|
||||||
cv::Mat * groundCellsRaw = 0,
|
cv::Mat * groundCellsRaw = 0,
|
||||||
cv::Mat * obstacleCellsRaw = 0,
|
cv::Mat * obstacleCellsRaw = 0,
|
||||||
cv::Mat * emptyCellsRaw = 0) const;
|
cv::Mat * emptyCellsRaw = 0,
|
||||||
|
cv::Mat * depthConfidenceRaw = 0) const;
|
||||||
|
|
||||||
const std::vector<CameraModel> & cameraModels() const {return _cameraModels;}
|
const std::vector<CameraModel> & cameraModels() const {return _cameraModels;}
|
||||||
const std::vector<StereoCameraModel> & stereoCameraModels() const {return _stereoCameraModels;}
|
const std::vector<StereoCameraModel> & stereoCameraModels() const {return _stereoCameraModels;}
|
||||||
@@ -327,10 +377,12 @@ private:
|
|||||||
|
|
||||||
cv::Mat _imageCompressed; // compressed image
|
cv::Mat _imageCompressed; // compressed image
|
||||||
cv::Mat _depthOrRightCompressed; // compressed image
|
cv::Mat _depthOrRightCompressed; // compressed image
|
||||||
|
cv::Mat _depthConfidenceCompressed; // compressed data
|
||||||
LaserScan _laserScanCompressed; // compressed data
|
LaserScan _laserScanCompressed; // compressed data
|
||||||
|
|
||||||
cv::Mat _imageRaw; // CV_8UC1 or CV_8UC3
|
cv::Mat _imageRaw; // CV_8UC1 or CV_8UC3
|
||||||
cv::Mat _depthOrRightRaw; // depth CV_16UC1 or CV_32FC1, right image CV_8UC1 or CV_8UC3
|
cv::Mat _depthOrRightRaw; // depth CV_16UC1 or CV_32FC1, right image CV_8UC1 or CV_8UC3
|
||||||
|
cv::Mat _depthConfidenceRaw; // CV_8UC1
|
||||||
LaserScan _laserScanRaw;
|
LaserScan _laserScanRaw;
|
||||||
|
|
||||||
std::vector<CameraModel> _cameraModels;
|
std::vector<CameraModel> _cameraModels;
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ public:
|
|||||||
void getTranslationAndEulerAngles(float & x, float & y, float & z, float & roll, float & pitch, float & yaw) const;
|
void getTranslationAndEulerAngles(float & x, float & y, float & z, float & roll, float & pitch, float & yaw) const;
|
||||||
void getEulerAngles(float & roll, float & pitch, float & yaw) const;
|
void getEulerAngles(float & roll, float & pitch, float & yaw) const;
|
||||||
void getTranslation(float & x, float & y, float & z) const;
|
void getTranslation(float & x, float & y, float & z) const;
|
||||||
float getAngle(float x=1.0f, float y=0.0f, float z=0.0f) const;
|
float getAngle(const Transform & t) const;
|
||||||
float getNorm() const;
|
float getNorm() const;
|
||||||
float getNormSquared() const;
|
float getNormSquared() const;
|
||||||
float getDistance(const Transform & t) const;
|
float getDistance(const Transform & t) const;
|
||||||
|
|||||||
@@ -513,6 +513,14 @@ cv::Mat RTABMAP_CORE_EXPORT registerDepth(
|
|||||||
const cv::Size & colorSize,
|
const cv::Size & colorSize,
|
||||||
const cv::Mat & colorK,
|
const cv::Mat & colorK,
|
||||||
const rtabmap::Transform & transform);
|
const rtabmap::Transform & transform);
|
||||||
|
cv::Mat RTABMAP_CORE_EXPORT registerDepth(
|
||||||
|
const cv::Mat & depth,
|
||||||
|
const cv::Mat & confidence,
|
||||||
|
const cv::Mat & depthK,
|
||||||
|
const cv::Size & colorSize,
|
||||||
|
const cv::Mat & colorK,
|
||||||
|
const rtabmap::Transform & transform,
|
||||||
|
cv::Mat & registeredConfidence);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Fills holes in the depth image using linear interpolation.
|
* @brief Fills holes in the depth image using linear interpolation.
|
||||||
@@ -598,6 +606,10 @@ cv::Mat RTABMAP_CORE_EXPORT fastBilateralFiltering(
|
|||||||
float sigmaR = 0.05f,
|
float sigmaR = 0.05f,
|
||||||
bool earlyDivision = false);
|
bool earlyDivision = false);
|
||||||
|
|
||||||
|
void RTABMAP_CORE_EXPORT depthBleedingFiltering(
|
||||||
|
cv::Mat & depth,
|
||||||
|
float maxDepthError);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Automatic brightness and contrast optimization with optional histogram clipping.
|
* @brief Automatic brightness and contrast optimization with optional histogram clipping.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -211,6 +211,15 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_CORE_EXPORT cloudFromDepth(
|
|||||||
float maxDepth = 0.0f,
|
float maxDepth = 0.0f,
|
||||||
float minDepth = 0.0f,
|
float minDepth = 0.0f,
|
||||||
std::vector<int> * validIndices = 0);
|
std::vector<int> * validIndices = 0);
|
||||||
|
pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_CORE_EXPORT cloudFromDepth(
|
||||||
|
const cv::Mat & imageDepth,
|
||||||
|
const cv::Mat & imageDepthConfidence,
|
||||||
|
const CameraModel & model,
|
||||||
|
int decimation = 1,
|
||||||
|
float maxDepth = 0.0f,
|
||||||
|
float minDepth = 0.0f,
|
||||||
|
unsigned char confidenceThr = 0,
|
||||||
|
std::vector<int> * validIndices = 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Creates a point cloud from an RGB image and a depth image.
|
* @brief Creates a point cloud from an RGB image and a depth image.
|
||||||
@@ -276,6 +285,16 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_CORE_EXPORT cloudFromDepthRGB(
|
|||||||
float maxDepth = 0.0f,
|
float maxDepth = 0.0f,
|
||||||
float minDepth = 0.0f,
|
float minDepth = 0.0f,
|
||||||
std::vector<int> * validIndices = 0);
|
std::vector<int> * validIndices = 0);
|
||||||
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_CORE_EXPORT cloudFromDepthRGB(
|
||||||
|
const cv::Mat & imageRgb,
|
||||||
|
const cv::Mat & imageDepth,
|
||||||
|
const cv::Mat & imageDepthConfidence,
|
||||||
|
const CameraModel & model,
|
||||||
|
int decimation = 1,
|
||||||
|
float maxDepth = 0.0f,
|
||||||
|
float minDepth = 0.0f,
|
||||||
|
unsigned char confidenceThr = 0, // 0=low, 100=high
|
||||||
|
std::vector<int> * validIndices = 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Converts a disparity image to a 3D point cloud.
|
* @brief Converts a disparity image to a 3D point cloud.
|
||||||
@@ -447,7 +466,8 @@ std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> RTABMAP_CORE_EXPORT cloudsFromS
|
|||||||
float minDepth = 0.0f,
|
float minDepth = 0.0f,
|
||||||
std::vector<pcl::IndicesPtr> * validIndices = 0,
|
std::vector<pcl::IndicesPtr> * validIndices = 0,
|
||||||
const ParametersMap & stereoParameters = ParametersMap(),
|
const ParametersMap & stereoParameters = ParametersMap(),
|
||||||
const std::vector<float> & roiRatios = std::vector<float>()); // ignored for stereo
|
const std::vector<float> & roiRatios = std::vector<float>(), // ignored for stereo
|
||||||
|
unsigned char confidenceThr = 0); // ignored for stereo
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Generates a point cloud from sensor data.
|
* @brief Generates a point cloud from sensor data.
|
||||||
@@ -484,7 +504,8 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_CORE_EXPORT cloudFromSensorData(
|
|||||||
float minDepth = 0.0f,
|
float minDepth = 0.0f,
|
||||||
std::vector<int> * validIndices = 0,
|
std::vector<int> * validIndices = 0,
|
||||||
const ParametersMap & stereoParameters = ParametersMap(),
|
const ParametersMap & stereoParameters = ParametersMap(),
|
||||||
const std::vector<float> & roiRatios = std::vector<float>()); // ignored for stereo
|
const std::vector<float> & roiRatios = std::vector<float>(), // ignored for stereo
|
||||||
|
unsigned char confidenceThr = 0); // ignored for stereo
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Generates a point cloud with RGB color data from sensor data.
|
* @brief Generates a point cloud with RGB color data from sensor data.
|
||||||
@@ -525,7 +546,8 @@ std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> RTABMAP_CORE_EXPORT cloudsRG
|
|||||||
float minDepth = 0.0f,
|
float minDepth = 0.0f,
|
||||||
std::vector<pcl::IndicesPtr > * validIndices = 0,
|
std::vector<pcl::IndicesPtr > * validIndices = 0,
|
||||||
const ParametersMap & stereoParameters = ParametersMap(),
|
const ParametersMap & stereoParameters = ParametersMap(),
|
||||||
const std::vector<float> & roiRatios = std::vector<float>()); // ignored for stereo
|
const std::vector<float> & roiRatios = std::vector<float>(), // ignored for stereo
|
||||||
|
unsigned char confidenceThr = 0); // ignored for stereo
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Generates a point cloud of type pcl::PointXYZRGB from sensor data.
|
* @brief Generates a point cloud of type pcl::PointXYZRGB from sensor data.
|
||||||
@@ -560,7 +582,8 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_CORE_EXPORT cloudRGBFromSensorDat
|
|||||||
float minDepth = 0.0f,
|
float minDepth = 0.0f,
|
||||||
std::vector<int> * validIndices = 0,
|
std::vector<int> * validIndices = 0,
|
||||||
const ParametersMap & stereoParameters = ParametersMap(),
|
const ParametersMap & stereoParameters = ParametersMap(),
|
||||||
const std::vector<float> & roiRatios = std::vector<float>()); // ignored for stereo
|
const std::vector<float> & roiRatios = std::vector<float>(), // ignored for stereo
|
||||||
|
unsigned char confidenceThr = 0); // ignored for stereo
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Converts the middle row of a depth image into a laser scan (point cloud) using camera intrinsics and a local transformation.
|
* @brief Converts the middle row of a depth image into a laser scan (point cloud) using camera intrinsics and a local transformation.
|
||||||
|
|||||||
@@ -816,6 +816,7 @@ CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/resources/DatabaseSchema.sql.in ${CMA
|
|||||||
|
|
||||||
SET(RESOURCES
|
SET(RESOURCES
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/resources/DatabaseSchema.sql
|
${CMAKE_CURRENT_SOURCE_DIR}/resources/DatabaseSchema.sql
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/resources/backward_compatibility/DatabaseSchema_0_20_0.sql
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/resources/backward_compatibility/DatabaseSchema_0_18_3.sql
|
${CMAKE_CURRENT_SOURCE_DIR}/resources/backward_compatibility/DatabaseSchema_0_18_3.sql
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/resources/backward_compatibility/DatabaseSchema_0_18_0.sql
|
${CMAKE_CURRENT_SOURCE_DIR}/resources/backward_compatibility/DatabaseSchema_0_18_0.sql
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/resources/backward_compatibility/DatabaseSchema_0_17_0.sql
|
${CMAKE_CURRENT_SOURCE_DIR}/resources/backward_compatibility/DatabaseSchema_0_17_0.sql
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "rtabmap/core/util3d.h"
|
#include "rtabmap/core/util3d.h"
|
||||||
#include "rtabmap/core/Compression.h"
|
#include "rtabmap/core/Compression.h"
|
||||||
#include "DatabaseSchema_sql.h"
|
#include "DatabaseSchema_sql.h"
|
||||||
|
#include "DatabaseSchema_0_20_0_sql.h"
|
||||||
#include "DatabaseSchema_0_18_3_sql.h"
|
#include "DatabaseSchema_0_18_3_sql.h"
|
||||||
#include "DatabaseSchema_0_18_0_sql.h"
|
#include "DatabaseSchema_0_18_0_sql.h"
|
||||||
#include "DatabaseSchema_0_17_0_sql.h"
|
#include "DatabaseSchema_0_17_0_sql.h"
|
||||||
@@ -402,6 +403,7 @@ bool DBDriverSqlite3::connectDatabaseQuery(const std::string & url, bool overwri
|
|||||||
schemas.push_back(std::make_pair("0.17.0", DATABASESCHEMA_0_17_0_SQL));
|
schemas.push_back(std::make_pair("0.17.0", DATABASESCHEMA_0_17_0_SQL));
|
||||||
schemas.push_back(std::make_pair("0.18.0", DATABASESCHEMA_0_18_0_SQL));
|
schemas.push_back(std::make_pair("0.18.0", DATABASESCHEMA_0_18_0_SQL));
|
||||||
schemas.push_back(std::make_pair("0.18.3", DATABASESCHEMA_0_18_3_SQL));
|
schemas.push_back(std::make_pair("0.18.3", DATABASESCHEMA_0_18_3_SQL));
|
||||||
|
schemas.push_back(std::make_pair("0.20.0", DATABASESCHEMA_0_20_0_SQL));
|
||||||
schemas.push_back(std::make_pair(uNumber2Str(RTABMAP_VERSION_MAJOR)+"."+uNumber2Str(RTABMAP_VERSION_MINOR), DATABASESCHEMA_SQL));
|
schemas.push_back(std::make_pair(uNumber2Str(RTABMAP_VERSION_MAJOR)+"."+uNumber2Str(RTABMAP_VERSION_MINOR), DATABASESCHEMA_SQL));
|
||||||
for(size_t i=0; i<schemas.size(); ++i)
|
for(size_t i=0; i<schemas.size(); ++i)
|
||||||
{
|
{
|
||||||
@@ -1317,7 +1319,15 @@ void DBDriverSqlite3::loadNodeDataQuery(std::list<Signature *> & signatures, boo
|
|||||||
|
|
||||||
if(images)
|
if(images)
|
||||||
{
|
{
|
||||||
fields << "image, depth, calibration";
|
if(uStrNumCmp(_version, "0.22.0") >= 0)
|
||||||
|
{
|
||||||
|
fields << "image, depth, depth_confidence, calibration";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fields << "image, depth, calibration";
|
||||||
|
}
|
||||||
|
|
||||||
if(scan || userData || occupancyGrid)
|
if(scan || userData || occupancyGrid)
|
||||||
{
|
{
|
||||||
fields << ", ";
|
fields << ", ";
|
||||||
@@ -1448,6 +1458,7 @@ void DBDriverSqlite3::loadNodeDataQuery(std::list<Signature *> & signatures, boo
|
|||||||
|
|
||||||
cv::Mat imageCompressed;
|
cv::Mat imageCompressed;
|
||||||
cv::Mat depthOrRightCompressed;
|
cv::Mat depthOrRightCompressed;
|
||||||
|
cv::Mat depthConfidenceCompressed;
|
||||||
std::vector<CameraModel> models;
|
std::vector<CameraModel> models;
|
||||||
std::vector<StereoCameraModel> stereoModels;
|
std::vector<StereoCameraModel> stereoModels;
|
||||||
Transform localTransform = Transform::getIdentity();
|
Transform localTransform = Transform::getIdentity();
|
||||||
@@ -1472,6 +1483,17 @@ void DBDriverSqlite3::loadNodeDataQuery(std::list<Signature *> & signatures, boo
|
|||||||
depthOrRightCompressed = cv::Mat(1, dataSize, CV_8UC1, (void *)data).clone();
|
depthOrRightCompressed = cv::Mat(1, dataSize, CV_8UC1, (void *)data).clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(uStrNumCmp(_version, "0.22.0") >= 0)
|
||||||
|
{
|
||||||
|
//Create the depth image
|
||||||
|
data = sqlite3_column_blob(ppStmt, index);
|
||||||
|
dataSize = sqlite3_column_bytes(ppStmt, index++);
|
||||||
|
if(dataSize>4 && data)
|
||||||
|
{
|
||||||
|
depthConfidenceCompressed = cv::Mat(1, dataSize, CV_8UC1, (void *)data).clone();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(uStrNumCmp(_version, "0.10.0") < 0)
|
if(uStrNumCmp(_version, "0.10.0") < 0)
|
||||||
{
|
{
|
||||||
data = sqlite3_column_blob(ppStmt, index); // local transform
|
data = sqlite3_column_blob(ppStmt, index); // local transform
|
||||||
@@ -1823,7 +1845,7 @@ void DBDriverSqlite3::loadNodeDataQuery(std::list<Signature *> & signatures, boo
|
|||||||
{
|
{
|
||||||
if(models.size())
|
if(models.size())
|
||||||
{
|
{
|
||||||
(*iter)->sensorData().setRGBDImage(imageCompressed, depthOrRightCompressed, models);
|
(*iter)->sensorData().setRGBDImage(imageCompressed, depthOrRightCompressed, depthConfidenceCompressed, models);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -4478,6 +4500,7 @@ void DBDriverSqlite3::saveQuery(const std::list<Signature *> & signatures)
|
|||||||
{
|
{
|
||||||
if(!(*i)->sensorData().imageCompressed().empty() ||
|
if(!(*i)->sensorData().imageCompressed().empty() ||
|
||||||
!(*i)->sensorData().depthOrRightCompressed().empty() ||
|
!(*i)->sensorData().depthOrRightCompressed().empty() ||
|
||||||
|
!(*i)->sensorData().depthConfidenceCompressed().empty() ||
|
||||||
!(*i)->sensorData().laserScanCompressed().isEmpty() ||
|
!(*i)->sensorData().laserScanCompressed().isEmpty() ||
|
||||||
!(*i)->sensorData().userDataCompressed().empty() ||
|
!(*i)->sensorData().userDataCompressed().empty() ||
|
||||||
!(*i)->sensorData().cameraModels().empty() ||
|
!(*i)->sensorData().cameraModels().empty() ||
|
||||||
@@ -5503,7 +5526,7 @@ cv::Mat DBDriverSqlite3::loadOptimizedMeshQuery(
|
|||||||
materialPolygons[p][i] = serializedPolygons.at<int>(t + p*polygonSize + i);
|
materialPolygons[p][i] = serializedPolygons.at<int>(t + p*polygonSize + i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
t+=materialPolygons.size()*polygonSize;
|
t+=materialPolygons.size()*polygonSize-1;
|
||||||
polygons->push_back(materialPolygons);
|
polygons->push_back(materialPolygons);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5520,7 +5543,7 @@ cv::Mat DBDriverSqlite3::loadOptimizedMeshQuery(
|
|||||||
UASSERT(serializedTexCoords.total());
|
UASSERT(serializedTexCoords.total());
|
||||||
for(int t=0; t<serializedTexCoords.cols; ++t)
|
for(int t=0; t<serializedTexCoords.cols; ++t)
|
||||||
{
|
{
|
||||||
UASSERT(int(serializedTexCoords.at<float>(t)) > 0);
|
UASSERT_MSG(int(serializedTexCoords.at<float>(t)) > 0, uFormat("serializedTexCoords.at<float>(%d)=%f", t, serializedTexCoords.at<float>(t)).c_str());
|
||||||
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > materialtexCoords(int(serializedTexCoords.at<float>(t)));
|
std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > materialtexCoords(int(serializedTexCoords.at<float>(t)));
|
||||||
#else
|
#else
|
||||||
@@ -5533,8 +5556,10 @@ cv::Mat DBDriverSqlite3::loadOptimizedMeshQuery(
|
|||||||
{
|
{
|
||||||
materialtexCoords[p][0] = serializedTexCoords.at<float>(t + p*2);
|
materialtexCoords[p][0] = serializedTexCoords.at<float>(t + p*2);
|
||||||
materialtexCoords[p][1] = serializedTexCoords.at<float>(t + p*2 + 1);
|
materialtexCoords[p][1] = serializedTexCoords.at<float>(t + p*2 + 1);
|
||||||
|
UASSERT(materialtexCoords[p][0]>=0.0f && materialtexCoords[p][0] <= 1.0f);
|
||||||
|
UASSERT(materialtexCoords[p][1]>=0.0f && materialtexCoords[p][1] <= 1.0f);
|
||||||
}
|
}
|
||||||
t+=materialtexCoords.size()*2;
|
t+=materialtexCoords.size()*2-1;
|
||||||
texCoords->push_back(materialtexCoords);
|
texCoords->push_back(materialtexCoords);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6186,7 +6211,11 @@ void DBDriverSqlite3::stepScanUpdate(sqlite3_stmt * ppStmt, int nodeId, const La
|
|||||||
std::string DBDriverSqlite3::queryStepSensorData() const
|
std::string DBDriverSqlite3::queryStepSensorData() const
|
||||||
{
|
{
|
||||||
UASSERT(uStrNumCmp(_version, "0.10.0") >= 0);
|
UASSERT(uStrNumCmp(_version, "0.10.0") >= 0);
|
||||||
if(uStrNumCmp(_version, "0.16.0") >= 0)
|
if(uStrNumCmp(_version, "0.22.0") >= 0)
|
||||||
|
{
|
||||||
|
return "INSERT INTO Data(id, image, depth, depth_confidence, calibration, scan_info, scan, user_data, ground_cells, obstacle_cells, empty_cells, cell_size, view_point_x, view_point_y, view_point_z) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
|
||||||
|
}
|
||||||
|
else if(uStrNumCmp(_version, "0.16.0") >= 0)
|
||||||
{
|
{
|
||||||
return "INSERT INTO Data(id, image, depth, calibration, scan_info, scan, user_data, ground_cells, obstacle_cells, empty_cells, cell_size, view_point_x, view_point_y, view_point_z) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
|
return "INSERT INTO Data(id, image, depth, calibration, scan_info, scan, user_data, ground_cells, obstacle_cells, empty_cells, cell_size, view_point_x, view_point_y, view_point_z) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
|
||||||
}
|
}
|
||||||
@@ -6250,6 +6279,20 @@ void DBDriverSqlite3::stepSensorData(sqlite3_stmt * ppStmt,
|
|||||||
}
|
}
|
||||||
UASSERT_MSG(rc == SQLITE_OK, uFormat("DB error (%s): %s", _version.c_str(), sqlite3_errmsg(_ppDb)).c_str());
|
UASSERT_MSG(rc == SQLITE_OK, uFormat("DB error (%s): %s", _version.c_str(), sqlite3_errmsg(_ppDb)).c_str());
|
||||||
|
|
||||||
|
//depth confidence
|
||||||
|
if(uStrNumCmp(_version, "0.22.0") >= 0)
|
||||||
|
{
|
||||||
|
if(!sensorData.depthConfidenceCompressed().empty())
|
||||||
|
{
|
||||||
|
rc = sqlite3_bind_blob(ppStmt, index++, sensorData.depthConfidenceCompressed().data, (int)sensorData.depthConfidenceCompressed().cols, SQLITE_STATIC);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rc = sqlite3_bind_null(ppStmt, index++);
|
||||||
|
}
|
||||||
|
UASSERT_MSG(rc == SQLITE_OK, uFormat("DB error (%s): %s", _version.c_str(), sqlite3_errmsg(_ppDb)).c_str());
|
||||||
|
}
|
||||||
|
|
||||||
// calibration
|
// calibration
|
||||||
std::vector<unsigned char> calibrationData;
|
std::vector<unsigned char> calibrationData;
|
||||||
std::vector<float> calibration;
|
std::vector<float> calibration;
|
||||||
|
|||||||
@@ -607,6 +607,7 @@ SensorData DBReader::getNextData(SensorCaptureInfo * info)
|
|||||||
// update images and local transforms
|
// update images and local transforms
|
||||||
cv::Mat combinedImages;
|
cv::Mat combinedImages;
|
||||||
cv::Mat combinedDepthImages;
|
cv::Mat combinedDepthImages;
|
||||||
|
cv::Mat combinedDepthConfidenceImages;
|
||||||
std::vector<CameraModel> combinedModels;
|
std::vector<CameraModel> combinedModels;
|
||||||
std::vector<StereoCameraModel> combinedStereoModels;
|
std::vector<StereoCameraModel> combinedStereoModels;
|
||||||
for(size_t i=0; i<_cameraIndices.size(); ++i)
|
for(size_t i=0; i<_cameraIndices.size(); ++i)
|
||||||
@@ -645,6 +646,18 @@ SensorData DBReader::getNextData(SensorCaptureInfo * info)
|
|||||||
fromROI = cv::Mat(data.depthOrRightRaw(), cv::Rect(_cameraIndices[i]*subImageWidth, 0, subImageWidth, data.depthOrRightRaw().rows));
|
fromROI = cv::Mat(data.depthOrRightRaw(), cv::Rect(_cameraIndices[i]*subImageWidth, 0, subImageWidth, data.depthOrRightRaw().rows));
|
||||||
toROI = cv::Mat(combinedDepthImages, cv::Rect(addedCameras*subImageWidth, 0, subImageWidth, combinedDepthImages.rows));
|
toROI = cv::Mat(combinedDepthImages, cv::Rect(addedCameras*subImageWidth, 0, subImageWidth, combinedDepthImages.rows));
|
||||||
fromROI.copyTo(toROI);
|
fromROI.copyTo(toROI);
|
||||||
|
|
||||||
|
if(!data.depthConfidenceRaw().empty())
|
||||||
|
{
|
||||||
|
UASSERT(data.depthConfidenceRaw().size() == data.depthOrRightRaw().size());
|
||||||
|
if(combinedDepthConfidenceImages.empty())
|
||||||
|
{
|
||||||
|
combinedDepthConfidenceImages = cv::Mat(data.depthConfidenceRaw().rows, subImageWidth*(_cameraIndices.size()-i), data.depthConfidenceRaw().type());
|
||||||
|
}
|
||||||
|
fromROI = cv::Mat(data.depthConfidenceRaw(), cv::Rect(_cameraIndices[i]*subImageWidth, 0, subImageWidth, data.depthConfidenceRaw().rows));
|
||||||
|
toROI = cv::Mat(combinedDepthConfidenceImages, cv::Rect(addedCameras*subImageWidth, 0, subImageWidth, combinedDepthConfidenceImages.rows));
|
||||||
|
fromROI.copyTo(toROI);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!data.cameraModels().empty())
|
if(!data.cameraModels().empty())
|
||||||
@@ -671,7 +684,7 @@ SensorData DBReader::getNextData(SensorCaptureInfo * info)
|
|||||||
}
|
}
|
||||||
if(!combinedModels.empty())
|
if(!combinedModels.empty())
|
||||||
{
|
{
|
||||||
data.setRGBDImage(combinedImages, combinedDepthImages, combinedModels);
|
data.setRGBDImage(combinedImages, combinedDepthImages, combinedDepthConfidenceImages, combinedModels);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -728,10 +741,11 @@ SensorData DBReader::getNextData(SensorCaptureInfo * info)
|
|||||||
}
|
}
|
||||||
data.setLandmarks(landmarks);
|
data.setLandmarks(landmarks);
|
||||||
|
|
||||||
UDEBUG("Laser=%d RGB/Left=%d Depth/Right=%d, Grid=%d, UserData=%d, GlobalPose=%d, GPS=%d, IMU=%d",
|
UDEBUG("Laser=%d RGB/Left=%d Depth/Right=%d, Conf=%d, Grid=%d, UserData=%d, GlobalPose=%d, GPS=%d, IMU=%d",
|
||||||
data.laserScanRaw().isEmpty()?0:1,
|
data.laserScanRaw().isEmpty()?0:1,
|
||||||
data.imageRaw().empty()?0:1,
|
data.imageRaw().empty()?0:1,
|
||||||
data.depthOrRightRaw().empty()?0:1,
|
data.depthOrRightRaw().empty()?0:1,
|
||||||
|
data.depthConfidenceRaw().empty()?0:1,
|
||||||
data.gridCellSize()==0.0f?0:1,
|
data.gridCellSize()==0.0f?0:1,
|
||||||
data.userDataRaw().empty()?0:1,
|
data.userDataRaw().empty()?0:1,
|
||||||
globalPose.isNull()?0:1,
|
globalPose.isNull()?0:1,
|
||||||
|
|||||||
@@ -688,7 +688,7 @@ Feature2D * Feature2D::create(Feature2D::Type type, const ParametersMap & parame
|
|||||||
#ifndef RTABMAP_TORCH
|
#ifndef RTABMAP_TORCH
|
||||||
if(type == Feature2D::kFeatureSuperPointTorch)
|
if(type == Feature2D::kFeatureSuperPointTorch)
|
||||||
{
|
{
|
||||||
UWARN("SupertPoint Torch feature cannot be used as RTAB-Map is not built with the option enabled. GFTT/ORB is used instead.");
|
UWARN("SuperPoint Torch feature cannot be used as RTAB-Map is not built with the option enabled. GFTT/ORB is used instead.");
|
||||||
type = Feature2D::kFeatureGfttOrb;
|
type = Feature2D::kFeatureGfttOrb;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+17
-12
@@ -744,9 +744,8 @@ void calcRelativeErrors (
|
|||||||
// compute rotational and translational errors
|
// compute rotational and translational errors
|
||||||
Transform pose_delta_gt = poses_gt[i].inverse()*poses_gt[i+1];
|
Transform pose_delta_gt = poses_gt[i].inverse()*poses_gt[i+1];
|
||||||
Transform pose_delta_result = poses_result[i].inverse()*poses_result[i+1];
|
Transform pose_delta_result = poses_result[i].inverse()*poses_result[i+1];
|
||||||
Transform pose_error = pose_delta_result.inverse()*pose_delta_gt;
|
float r_err = pose_delta_result.getAngle(pose_delta_gt);
|
||||||
float r_err = pose_error.getAngle();
|
float t_err = pose_delta_result.getDistance(pose_delta_gt);
|
||||||
float t_err = pose_error.getNorm();
|
|
||||||
|
|
||||||
// write to file
|
// write to file
|
||||||
err.push_back(errors(i,r_err,t_err,0,0));
|
err.push_back(errors(i,r_err,t_err,0,0));
|
||||||
@@ -993,15 +992,21 @@ void computeMaxGraphErrors(
|
|||||||
if(iter->second.type() != Link::kLandmark ||
|
if(iter->second.type() != Link::kLandmark ||
|
||||||
1.0 / static_cast<double>(iter->second.infMatrix().at<double>(5,5)) < 9999.0)
|
1.0 / static_cast<double>(iter->second.infMatrix().at<double>(5,5)) < 9999.0)
|
||||||
{
|
{
|
||||||
float opt_roll,opt_pitch,opt_yaw;
|
float angularError = 0.0f;
|
||||||
float link_roll,link_pitch,link_yaw;
|
if(force3DoF)
|
||||||
t.getEulerAngles(opt_roll, opt_pitch, opt_yaw);
|
{
|
||||||
linkT.getEulerAngles(link_roll, link_pitch, link_yaw);
|
float opt_roll,opt_pitch,opt_yaw;
|
||||||
float angularError = uMax3(
|
float link_roll,link_pitch,link_yaw;
|
||||||
force3DoF?0:fabs(opt_roll - link_roll),
|
t.getEulerAngles(opt_roll, opt_pitch, opt_yaw);
|
||||||
force3DoF?0:fabs(opt_pitch - link_pitch),
|
linkT.getEulerAngles(link_roll, link_pitch, link_yaw);
|
||||||
fabs(opt_yaw - link_yaw));
|
angularError = fabs(opt_yaw - link_yaw);
|
||||||
angularError = angularError>M_PI?2*M_PI-angularError:angularError;
|
angularError = angularError>M_PI?2*M_PI-angularError:angularError;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
angularError = t.getAngle(linkT);
|
||||||
|
}
|
||||||
|
|
||||||
UASSERT(iter->second.rotVariance(false)>0.0);
|
UASSERT(iter->second.rotVariance(false)>0.0);
|
||||||
float stddevAngular = sqrt(iter->second.rotVariance(false));
|
float stddevAngular = sqrt(iter->second.rotVariance(false));
|
||||||
float angularErrorRatio = angularError/stddevAngular;
|
float angularErrorRatio = angularError/stddevAngular;
|
||||||
|
|||||||
+19
-3
@@ -4893,9 +4893,10 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
decimationDepth = (int)ceil(float(data.depthRaw().rows) / float(targetSize));
|
decimationDepth = (int)ceil(float(data.depthRaw().rows) / float(targetSize));
|
||||||
|
UASSERT(data.depthConfidenceRaw().empty() || data.depthConfidenceRaw().size() == data.depthRaw().size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UDEBUG("decimation rgbOrLeft(rows=%d)=%d, depthOrRight(rows=%d)=%d", data.imageRaw().rows, _imagePreDecimation, data.depthOrRightRaw().rows, decimationDepth);
|
UDEBUG("decimation rgbOrLeft(rows=%d)=%d, depthOrRight(rows=%d)=%d (conf? %d)", data.imageRaw().rows, _imagePreDecimation, data.depthOrRightRaw().rows, decimationDepth, data.depthConfidenceRaw().empty()?0:1);
|
||||||
|
|
||||||
std::vector<CameraModel> cameraModels = decimatedData.cameraModels();
|
std::vector<CameraModel> cameraModels = decimatedData.cameraModels();
|
||||||
for(unsigned int i=0; i<cameraModels.size(); ++i)
|
for(unsigned int i=0; i<cameraModels.size(); ++i)
|
||||||
@@ -4907,6 +4908,7 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
decimatedData.setRGBDImage(
|
decimatedData.setRGBDImage(
|
||||||
util2d::decimate(decimatedData.imageRaw(), _imagePreDecimation),
|
util2d::decimate(decimatedData.imageRaw(), _imagePreDecimation),
|
||||||
util2d::decimate(decimatedData.depthOrRightRaw(), decimationDepth),
|
util2d::decimate(decimatedData.depthOrRightRaw(), decimationDepth),
|
||||||
|
util2d::decimate(decimatedData.depthConfidenceRaw(), decimationDepth),
|
||||||
cameraModels);
|
cameraModels);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5656,6 +5658,8 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
|
|
||||||
cv::Mat image = data.imageRaw();
|
cv::Mat image = data.imageRaw();
|
||||||
cv::Mat depthOrRightImage = data.depthOrRightRaw();
|
cv::Mat depthOrRightImage = data.depthOrRightRaw();
|
||||||
|
cv::Mat depthConfidence = data.depthConfidenceRaw();
|
||||||
|
|
||||||
std::vector<CameraModel> cameraModels = data.cameraModels();
|
std::vector<CameraModel> cameraModels = data.cameraModels();
|
||||||
std::vector<StereoCameraModel> stereoCameraModels = data.stereoCameraModels();
|
std::vector<StereoCameraModel> stereoCameraModels = data.stereoCameraModels();
|
||||||
|
|
||||||
@@ -5666,6 +5670,7 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
{
|
{
|
||||||
image = decimatedData.imageRaw();
|
image = decimatedData.imageRaw();
|
||||||
depthOrRightImage = decimatedData.depthOrRightRaw();
|
depthOrRightImage = decimatedData.depthOrRightRaw();
|
||||||
|
depthConfidence = decimatedData.depthConfidenceRaw();
|
||||||
cameraModels = decimatedData.cameraModels();
|
cameraModels = decimatedData.cameraModels();
|
||||||
stereoCameraModels = decimatedData.stereoCameraModels();
|
stereoCameraModels = decimatedData.stereoCameraModels();
|
||||||
}
|
}
|
||||||
@@ -5879,9 +5884,10 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
Signature * s;
|
Signature * s;
|
||||||
if(this->isBinDataKept() && (!isIntermediateNode || _saveIntermediateNodeData))
|
if(this->isBinDataKept() && (!isIntermediateNode || _saveIntermediateNodeData))
|
||||||
{
|
{
|
||||||
UDEBUG("Bin data kept: rgb=%d, depth=%d, scan=%d, userData=%d",
|
UDEBUG("Bin data kept: rgb=%d, depth=%d, conf=%d, scan=%d, userData=%d",
|
||||||
image.empty()?0:1,
|
image.empty()?0:1,
|
||||||
depthOrRightImage.empty()?0:1,
|
depthOrRightImage.empty()?0:1,
|
||||||
|
depthConfidence.empty()?0:1,
|
||||||
laserScan.isEmpty()?0:1,
|
laserScan.isEmpty()?0:1,
|
||||||
data.userDataRaw().empty()?0:1);
|
data.userDataRaw().empty()?0:1);
|
||||||
|
|
||||||
@@ -5928,12 +5934,14 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
|
|
||||||
cv::Mat compressedImage;
|
cv::Mat compressedImage;
|
||||||
cv::Mat compressedDepth;
|
cv::Mat compressedDepth;
|
||||||
|
cv::Mat compressedDepthConfidence;
|
||||||
cv::Mat compressedScan;
|
cv::Mat compressedScan;
|
||||||
cv::Mat compressedUserData;
|
cv::Mat compressedUserData;
|
||||||
if(_compressionParallelized)
|
if(_compressionParallelized)
|
||||||
{
|
{
|
||||||
rtabmap::CompressionThread ctImage(image, _rgbCompressionFormat);
|
rtabmap::CompressionThread ctImage(image, _rgbCompressionFormat);
|
||||||
rtabmap::CompressionThread ctDepth(depthOrRightImage, depthOrRightImage.type() == CV_32FC1 || depthOrRightImage.type() == CV_16UC1?_depthCompressionFormat:_rgbCompressionFormat);
|
rtabmap::CompressionThread ctDepth(depthOrRightImage, depthOrRightImage.type() == CV_32FC1 || depthOrRightImage.type() == CV_16UC1?_depthCompressionFormat:_rgbCompressionFormat);
|
||||||
|
rtabmap::CompressionThread ctDepthConfidence(depthConfidence);
|
||||||
rtabmap::CompressionThread ctLaserScan(laserScan.data());
|
rtabmap::CompressionThread ctLaserScan(laserScan.data());
|
||||||
rtabmap::CompressionThread ctUserData(data.userDataRaw());
|
rtabmap::CompressionThread ctUserData(data.userDataRaw());
|
||||||
if(!image.empty())
|
if(!image.empty())
|
||||||
@@ -5944,6 +5952,10 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
{
|
{
|
||||||
ctDepth.start();
|
ctDepth.start();
|
||||||
}
|
}
|
||||||
|
if(!depthConfidence.empty())
|
||||||
|
{
|
||||||
|
ctDepthConfidence.start();
|
||||||
|
}
|
||||||
if(!laserScan.isEmpty())
|
if(!laserScan.isEmpty())
|
||||||
{
|
{
|
||||||
ctLaserScan.start();
|
ctLaserScan.start();
|
||||||
@@ -5954,11 +5966,13 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
}
|
}
|
||||||
ctImage.join();
|
ctImage.join();
|
||||||
ctDepth.join();
|
ctDepth.join();
|
||||||
|
ctDepthConfidence.join();
|
||||||
ctLaserScan.join();
|
ctLaserScan.join();
|
||||||
ctUserData.join();
|
ctUserData.join();
|
||||||
|
|
||||||
compressedImage = ctImage.getCompressedData();
|
compressedImage = ctImage.getCompressedData();
|
||||||
compressedDepth = ctDepth.getCompressedData();
|
compressedDepth = ctDepth.getCompressedData();
|
||||||
|
compressedDepthConfidence = ctDepthConfidence.getCompressedData();
|
||||||
compressedScan = ctLaserScan.getCompressedData();
|
compressedScan = ctLaserScan.getCompressedData();
|
||||||
compressedUserData = ctUserData.getCompressedData();
|
compressedUserData = ctUserData.getCompressedData();
|
||||||
}
|
}
|
||||||
@@ -5966,6 +5980,7 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
{
|
{
|
||||||
compressedImage = compressImage2(image, _rgbCompressionFormat);
|
compressedImage = compressImage2(image, _rgbCompressionFormat);
|
||||||
compressedDepth = compressImage2(depthOrRightImage, depthOrRightImage.type() == CV_32FC1 || depthOrRightImage.type() == CV_16UC1?_depthCompressionFormat:_rgbCompressionFormat);
|
compressedDepth = compressImage2(depthOrRightImage, depthOrRightImage.type() == CV_32FC1 || depthOrRightImage.type() == CV_16UC1?_depthCompressionFormat:_rgbCompressionFormat);
|
||||||
|
compressedDepthConfidence = compressData2(depthConfidence);
|
||||||
compressedScan = compressData2(laserScan.data());
|
compressedScan = compressData2(laserScan.data());
|
||||||
compressedUserData = compressData2(data.userDataRaw());
|
compressedUserData = compressData2(data.userDataRaw());
|
||||||
}
|
}
|
||||||
@@ -6016,6 +6031,7 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
laserScan.localTransform()),
|
laserScan.localTransform()),
|
||||||
compressedImage.empty()?data.imageCompressed():compressedImage,
|
compressedImage.empty()?data.imageCompressed():compressedImage,
|
||||||
compressedDepth.empty()?data.depthOrRightCompressed():compressedDepth,
|
compressedDepth.empty()?data.depthOrRightCompressed():compressedDepth,
|
||||||
|
compressedDepthConfidence.empty()?data.depthConfidenceCompressed():compressedDepthConfidence,
|
||||||
cameraModels,
|
cameraModels,
|
||||||
id,
|
id,
|
||||||
0,
|
0,
|
||||||
@@ -6113,7 +6129,7 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
|||||||
// set raw data
|
// set raw data
|
||||||
if(!cameraModels.empty())
|
if(!cameraModels.empty())
|
||||||
{
|
{
|
||||||
s->sensorData().setRGBDImage(image, depthOrRightImage, cameraModels, false);
|
s->sensorData().setRGBDImage(image, depthOrRightImage, depthConfidence, cameraModels, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -191,9 +191,8 @@ std::map<std::string, float> OdometryInfo::statistics(const Transform & pose)
|
|||||||
{
|
{
|
||||||
if(!transform.isNull())
|
if(!transform.isNull())
|
||||||
{
|
{
|
||||||
rtabmap::Transform diff = transformGroundTruth.inverse()*transform;
|
stats.insert(std::make_pair("Odometry/TG_error_lin/m", transformGroundTruth.getDistance(transform)));
|
||||||
stats.insert(std::make_pair("Odometry/TG_error_lin/m", diff.getNorm()));
|
stats.insert(std::make_pair("Odometry/TG_error_ang/deg", transformGroundTruth.getAngle(transform)*180.0/CV_PI));
|
||||||
stats.insert(std::make_pair("Odometry/TG_error_ang/deg", diff.getAngle()*180.0/CV_PI));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
transformGroundTruth.getTranslationAndEulerAngles(x,y,z,roll,pitch,yaw);
|
transformGroundTruth.getTranslationAndEulerAngles(x,y,z,roll,pitch,yaw);
|
||||||
|
|||||||
@@ -1701,7 +1701,7 @@ bool Rtabmap::process(
|
|||||||
{
|
{
|
||||||
distanceToClosestNodeInTheGraph = sqrt(sqrdDistance);
|
distanceToClosestNodeInTheGraph = sqrt(sqrdDistance);
|
||||||
UDEBUG("Last localization pose = %s, closest node=%d (%f m)", newPose.prettyPrint().c_str(), closestNode, distanceToClosestNodeInTheGraph);
|
UDEBUG("Last localization pose = %s, closest node=%d (%f m)", newPose.prettyPrint().c_str(), closestNode, distanceToClosestNodeInTheGraph);
|
||||||
angleToClosestNodeInTheGraph = (newPose.inverse() * _optimizedPoses.at(closestNode)).getAngle();
|
angleToClosestNodeInTheGraph = newPose.getAngle(_optimizedPoses.at(closestNode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3954,7 +3954,7 @@ bool Rtabmap::process(
|
|||||||
{
|
{
|
||||||
distanceToClosestNodeInTheGraph = _lastLocalizationPose.getDistance(_optimizedPoses.at(closestNode));
|
distanceToClosestNodeInTheGraph = _lastLocalizationPose.getDistance(_optimizedPoses.at(closestNode));
|
||||||
UDEBUG("Last localization pose = %s, updated closest node=%d (%f m)", _lastLocalizationPose.prettyPrint().c_str(), closestNode, distanceToClosestNodeInTheGraph);
|
UDEBUG("Last localization pose = %s, updated closest node=%d (%f m)", _lastLocalizationPose.prettyPrint().c_str(), closestNode, distanceToClosestNodeInTheGraph);
|
||||||
angleToClosestNodeInTheGraph = (_lastLocalizationPose.inverse() * _optimizedPoses.at(closestNode)).getAngle();
|
angleToClosestNodeInTheGraph = _lastLocalizationPose.getAngle(_optimizedPoses.at(closestNode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_lastLocalizationPose = _optimizedPoses.at(signature->id()); // update
|
_lastLocalizationPose = _optimizedPoses.at(signature->id()); // update
|
||||||
@@ -4103,16 +4103,15 @@ bool Rtabmap::process(
|
|||||||
if(!sLoop->getGroundTruthPose().isNull() && !signature->getGroundTruthPose().isNull())
|
if(!sLoop->getGroundTruthPose().isNull() && !signature->getGroundTruthPose().isNull())
|
||||||
{
|
{
|
||||||
Transform transformGT = sLoop->getGroundTruthPose().inverse() * signature->getGroundTruthPose();
|
Transform transformGT = sLoop->getGroundTruthPose().inverse() * signature->getGroundTruthPose();
|
||||||
Transform error = loopIter->second.transform().inverse() * transformGT;
|
statistics_.addStatistic(Statistics::kGtLocalization_linear_error(), loopIter->second.transform().getDistance(transformGT));
|
||||||
statistics_.addStatistic(Statistics::kGtLocalization_linear_error(), error.getNorm());
|
statistics_.addStatistic(Statistics::kGtLocalization_angular_error(), loopIter->second.transform().getAngle(transformGT)*180/M_PI);
|
||||||
statistics_.addStatistic(Statistics::kGtLocalization_angular_error(), error.getAngle(1,0,0)*180/M_PI);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_distanceTravelledSinceLastLocalization = 0.0f;
|
_distanceTravelledSinceLastLocalization = 0.0f;
|
||||||
|
|
||||||
statistics_.addStatistic(Statistics::kLoopMapToOdom_norm(), _mapCorrection.getNorm());
|
statistics_.addStatistic(Statistics::kLoopMapToOdom_norm(), _mapCorrection.getNorm());
|
||||||
statistics_.addStatistic(Statistics::kLoopMapToOdom_angle(), _mapCorrection.getAngle()*180.0f/M_PI);
|
statistics_.addStatistic(Statistics::kLoopMapToOdom_angle(), _mapCorrection.getAngle(Transform::getIdentity())*180.0f/M_PI);
|
||||||
_mapCorrection.getTranslationAndEulerAngles(x, y, z, roll, pitch, yaw);
|
_mapCorrection.getTranslationAndEulerAngles(x, y, z, roll, pitch, yaw);
|
||||||
statistics_.addStatistic(Statistics::kLoopMapToOdom_x(), x);
|
statistics_.addStatistic(Statistics::kLoopMapToOdom_x(), x);
|
||||||
statistics_.addStatistic(Statistics::kLoopMapToOdom_y(), y);
|
statistics_.addStatistic(Statistics::kLoopMapToOdom_y(), y);
|
||||||
@@ -4126,7 +4125,7 @@ bool Rtabmap::process(
|
|||||||
{
|
{
|
||||||
Transform odomCorrection = (previousMapCorrection*odomPose).inverse()*_mapCorrection*odomPose;
|
Transform odomCorrection = (previousMapCorrection*odomPose).inverse()*_mapCorrection*odomPose;
|
||||||
statistics_.addStatistic(Statistics::kLoopOdom_correction_norm(), odomCorrection.getNorm());
|
statistics_.addStatistic(Statistics::kLoopOdom_correction_norm(), odomCorrection.getNorm());
|
||||||
statistics_.addStatistic(Statistics::kLoopOdom_correction_angle(), odomCorrection.getAngle()*180.0f/M_PI);
|
statistics_.addStatistic(Statistics::kLoopOdom_correction_angle(), odomCorrection.getAngle(Transform::getIdentity())*180.0f/M_PI);
|
||||||
odomCorrection.getTranslationAndEulerAngles(x, y, z, roll, pitch, yaw);
|
odomCorrection.getTranslationAndEulerAngles(x, y, z, roll, pitch, yaw);
|
||||||
statistics_.addStatistic(Statistics::kLoopOdom_correction_x(), x);
|
statistics_.addStatistic(Statistics::kLoopOdom_correction_x(), x);
|
||||||
statistics_.addStatistic(Statistics::kLoopOdom_correction_y(), y);
|
statistics_.addStatistic(Statistics::kLoopOdom_correction_y(), y);
|
||||||
|
|||||||
+155
-7
@@ -107,6 +107,25 @@ SensorData::SensorData(
|
|||||||
setUserData(userData);
|
setUserData(userData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RGB-D constructor + confidence + laser scan
|
||||||
|
SensorData::SensorData(
|
||||||
|
const LaserScan & laserScan,
|
||||||
|
const cv::Mat & rgb,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
const cv::Mat & depthConfidence,
|
||||||
|
const CameraModel & cameraModel,
|
||||||
|
int id,
|
||||||
|
double stamp,
|
||||||
|
const cv::Mat & userData) :
|
||||||
|
_id(id),
|
||||||
|
_stamp(stamp),
|
||||||
|
_cellSize(0.0f)
|
||||||
|
{
|
||||||
|
setRGBDImage(rgb, depth, depthConfidence, cameraModel);
|
||||||
|
setLaserScan(laserScan);
|
||||||
|
setUserData(userData);
|
||||||
|
}
|
||||||
|
|
||||||
// Multi-cameras RGB-D constructor
|
// Multi-cameras RGB-D constructor
|
||||||
SensorData::SensorData(
|
SensorData::SensorData(
|
||||||
const cv::Mat & rgb,
|
const cv::Mat & rgb,
|
||||||
@@ -123,6 +142,23 @@ SensorData::SensorData(
|
|||||||
setUserData(userData);
|
setUserData(userData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Multi-cameras RGB-D constructor + confidence
|
||||||
|
SensorData::SensorData(
|
||||||
|
const cv::Mat & rgb,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
const cv::Mat & depthConfidence,
|
||||||
|
const std::vector<CameraModel> & cameraModels,
|
||||||
|
int id,
|
||||||
|
double stamp,
|
||||||
|
const cv::Mat & userData) :
|
||||||
|
_id(id),
|
||||||
|
_stamp(stamp),
|
||||||
|
_cellSize(0.0f)
|
||||||
|
{
|
||||||
|
setRGBDImage(rgb, depth, depthConfidence, cameraModels);
|
||||||
|
setUserData(userData);
|
||||||
|
}
|
||||||
|
|
||||||
// Multi-cameras RGB-D constructor + laser scan
|
// Multi-cameras RGB-D constructor + laser scan
|
||||||
SensorData::SensorData(
|
SensorData::SensorData(
|
||||||
const LaserScan & laserScan,
|
const LaserScan & laserScan,
|
||||||
@@ -141,6 +177,25 @@ SensorData::SensorData(
|
|||||||
setUserData(userData);
|
setUserData(userData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Multi-cameras RGB-D constructor + confidence + laser scan
|
||||||
|
SensorData::SensorData(
|
||||||
|
const LaserScan & laserScan,
|
||||||
|
const cv::Mat & rgb,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
const cv::Mat & depthConfidence,
|
||||||
|
const std::vector<CameraModel> & cameraModels,
|
||||||
|
int id,
|
||||||
|
double stamp,
|
||||||
|
const cv::Mat & userData) :
|
||||||
|
_id(id),
|
||||||
|
_stamp(stamp),
|
||||||
|
_cellSize(0.0f)
|
||||||
|
{
|
||||||
|
setRGBDImage(rgb, depth, depthConfidence, cameraModels);
|
||||||
|
setLaserScan(laserScan);
|
||||||
|
setUserData(userData);
|
||||||
|
}
|
||||||
|
|
||||||
// Stereo constructor
|
// Stereo constructor
|
||||||
SensorData::SensorData(
|
SensorData::SensorData(
|
||||||
const cv::Mat & left,
|
const cv::Mat & left,
|
||||||
@@ -234,9 +289,29 @@ void SensorData::setRGBDImage(
|
|||||||
models.push_back(model);
|
models.push_back(model);
|
||||||
setRGBDImage(rgb, depth, models, clearPreviousData);
|
setRGBDImage(rgb, depth, models, clearPreviousData);
|
||||||
}
|
}
|
||||||
|
void SensorData::setRGBDImage(
|
||||||
|
const cv::Mat & rgb,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
const cv::Mat & depthConfidence,
|
||||||
|
const CameraModel & model,
|
||||||
|
bool clearPreviousData)
|
||||||
|
{
|
||||||
|
std::vector<CameraModel> models;
|
||||||
|
models.push_back(model);
|
||||||
|
setRGBDImage(rgb, depth, depthConfidence, models, clearPreviousData);
|
||||||
|
}
|
||||||
|
void SensorData::setRGBDImage(
|
||||||
|
const cv::Mat & rgb,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
const std::vector<CameraModel> & models,
|
||||||
|
bool clearPreviousData)
|
||||||
|
{
|
||||||
|
setRGBDImage(rgb, depth, cv::Mat(), models, clearPreviousData);
|
||||||
|
}
|
||||||
void SensorData::setRGBDImage(
|
void SensorData::setRGBDImage(
|
||||||
const cv::Mat & rgb,
|
const cv::Mat & rgb,
|
||||||
const cv::Mat & depth,
|
const cv::Mat & depth,
|
||||||
|
const cv::Mat & depthConfidence,
|
||||||
const std::vector<CameraModel> & models,
|
const std::vector<CameraModel> & models,
|
||||||
bool clearPreviousData)
|
bool clearPreviousData)
|
||||||
{
|
{
|
||||||
@@ -300,6 +375,30 @@ void SensorData::setRGBDImage(
|
|||||||
_depthOrRightRaw = cv::Mat();
|
_depthOrRightRaw = cv::Mat();
|
||||||
_depthOrRightCompressed = cv::Mat();
|
_depthOrRightCompressed = cv::Mat();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(depthConfidence.rows == 1)
|
||||||
|
{
|
||||||
|
UASSERT(depthConfidence.type() == CV_8UC1); // Bytes
|
||||||
|
_depthConfidenceCompressed = depthConfidence;
|
||||||
|
if(clearData)
|
||||||
|
{
|
||||||
|
_depthConfidenceRaw = cv::Mat();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(!depthConfidence.empty())
|
||||||
|
{
|
||||||
|
UASSERT(depthConfidence.type() == CV_8UC1);
|
||||||
|
_depthConfidenceRaw = depthConfidence;
|
||||||
|
if(clearData)
|
||||||
|
{
|
||||||
|
_depthConfidenceCompressed = cv::Mat();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(clearData)
|
||||||
|
{
|
||||||
|
_depthConfidenceRaw = cv::Mat();
|
||||||
|
_depthConfidenceCompressed = cv::Mat();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void SensorData::setStereoImage(
|
void SensorData::setStereoImage(
|
||||||
const cv::Mat & left,
|
const cv::Mat & left,
|
||||||
@@ -528,7 +627,7 @@ void SensorData::setOccupancyGrid(
|
|||||||
|
|
||||||
void SensorData::uncompressData()
|
void SensorData::uncompressData()
|
||||||
{
|
{
|
||||||
cv::Mat tmpA, tmpB, tmpD, tmpE, tmpF, tmpG;
|
cv::Mat tmpA, tmpB, tmpD, tmpE, tmpF, tmpG, tmpH;
|
||||||
LaserScan tmpC;
|
LaserScan tmpC;
|
||||||
uncompressData(_imageCompressed.empty()?0:&tmpA,
|
uncompressData(_imageCompressed.empty()?0:&tmpA,
|
||||||
_depthOrRightCompressed.empty()?0:&tmpB,
|
_depthOrRightCompressed.empty()?0:&tmpB,
|
||||||
@@ -536,7 +635,8 @@ void SensorData::uncompressData()
|
|||||||
_userDataCompressed.empty()?0:&tmpD,
|
_userDataCompressed.empty()?0:&tmpD,
|
||||||
_groundCellsCompressed.empty()?0:&tmpE,
|
_groundCellsCompressed.empty()?0:&tmpE,
|
||||||
_obstacleCellsCompressed.empty()?0:&tmpF,
|
_obstacleCellsCompressed.empty()?0:&tmpF,
|
||||||
_emptyCellsCompressed.empty()?0:&tmpG);
|
_emptyCellsCompressed.empty()?0:&tmpG,
|
||||||
|
_depthConfidenceCompressed.empty()?0:&tmpH);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SensorData::uncompressData(
|
void SensorData::uncompressData(
|
||||||
@@ -546,16 +646,27 @@ void SensorData::uncompressData(
|
|||||||
cv::Mat * userDataRaw,
|
cv::Mat * userDataRaw,
|
||||||
cv::Mat * groundCellsRaw,
|
cv::Mat * groundCellsRaw,
|
||||||
cv::Mat * obstacleCellsRaw,
|
cv::Mat * obstacleCellsRaw,
|
||||||
cv::Mat * emptyCellsRaw)
|
cv::Mat * emptyCellsRaw,
|
||||||
|
cv::Mat * depthConfidenceRaw)
|
||||||
{
|
{
|
||||||
UDEBUG("%d data(%d,%d,%d,%d,%d,%d,%d)", this->id(), imageRaw?1:0, depthRaw?1:0, laserScanRaw?1:0, userDataRaw?1:0, groundCellsRaw?1:0, obstacleCellsRaw?1:0, emptyCellsRaw?1:0);
|
UDEBUG("%d data(%d,%d,%d,%d,%d,%d,%d,%d)",
|
||||||
|
this->id(),
|
||||||
|
imageRaw?1:0,
|
||||||
|
depthRaw?1:0,
|
||||||
|
laserScanRaw?1:0,
|
||||||
|
userDataRaw?1:0,
|
||||||
|
groundCellsRaw?1:0,
|
||||||
|
obstacleCellsRaw?1:0,
|
||||||
|
emptyCellsRaw?1:0,
|
||||||
|
depthConfidenceRaw?1:0);
|
||||||
if(imageRaw == 0 &&
|
if(imageRaw == 0 &&
|
||||||
depthRaw == 0 &&
|
depthRaw == 0 &&
|
||||||
laserScanRaw == 0 &&
|
laserScanRaw == 0 &&
|
||||||
userDataRaw == 0 &&
|
userDataRaw == 0 &&
|
||||||
groundCellsRaw == 0 &&
|
groundCellsRaw == 0 &&
|
||||||
obstacleCellsRaw == 0 &&
|
obstacleCellsRaw == 0 &&
|
||||||
emptyCellsRaw == 0)
|
emptyCellsRaw == 0 &&
|
||||||
|
depthConfidenceRaw == 0)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -566,7 +677,8 @@ void SensorData::uncompressData(
|
|||||||
userDataRaw,
|
userDataRaw,
|
||||||
groundCellsRaw,
|
groundCellsRaw,
|
||||||
obstacleCellsRaw,
|
obstacleCellsRaw,
|
||||||
emptyCellsRaw);
|
emptyCellsRaw,
|
||||||
|
depthConfidenceRaw);
|
||||||
|
|
||||||
if(imageRaw && !imageRaw->empty() && _imageRaw.empty())
|
if(imageRaw && !imageRaw->empty() && _imageRaw.empty())
|
||||||
{
|
{
|
||||||
@@ -588,6 +700,10 @@ void SensorData::uncompressData(
|
|||||||
{
|
{
|
||||||
_depthOrRightRaw = *depthRaw;
|
_depthOrRightRaw = *depthRaw;
|
||||||
}
|
}
|
||||||
|
if(depthConfidenceRaw && !depthConfidenceRaw->empty() && _depthConfidenceRaw.empty())
|
||||||
|
{
|
||||||
|
_depthConfidenceRaw = *depthConfidenceRaw;
|
||||||
|
}
|
||||||
if(laserScanRaw && !laserScanRaw->isEmpty() && _laserScanRaw.isEmpty())
|
if(laserScanRaw && !laserScanRaw->isEmpty() && _laserScanRaw.isEmpty())
|
||||||
{
|
{
|
||||||
_laserScanRaw = *laserScanRaw;
|
_laserScanRaw = *laserScanRaw;
|
||||||
@@ -628,7 +744,8 @@ void SensorData::uncompressDataConst(
|
|||||||
cv::Mat * userDataRaw,
|
cv::Mat * userDataRaw,
|
||||||
cv::Mat * groundCellsRaw,
|
cv::Mat * groundCellsRaw,
|
||||||
cv::Mat * obstacleCellsRaw,
|
cv::Mat * obstacleCellsRaw,
|
||||||
cv::Mat * emptyCellsRaw) const
|
cv::Mat * emptyCellsRaw,
|
||||||
|
cv::Mat * depthConfidenceRaw) const
|
||||||
{
|
{
|
||||||
if(imageRaw)
|
if(imageRaw)
|
||||||
{
|
{
|
||||||
@@ -638,6 +755,10 @@ void SensorData::uncompressDataConst(
|
|||||||
{
|
{
|
||||||
*depthRaw = _depthOrRightRaw;
|
*depthRaw = _depthOrRightRaw;
|
||||||
}
|
}
|
||||||
|
if(depthConfidenceRaw)
|
||||||
|
{
|
||||||
|
*depthConfidenceRaw = _depthConfidenceRaw;
|
||||||
|
}
|
||||||
if(laserScanRaw)
|
if(laserScanRaw)
|
||||||
{
|
{
|
||||||
*laserScanRaw = _laserScanRaw;
|
*laserScanRaw = _laserScanRaw;
|
||||||
@@ -660,6 +781,7 @@ void SensorData::uncompressDataConst(
|
|||||||
}
|
}
|
||||||
if( (imageRaw && imageRaw->empty()) ||
|
if( (imageRaw && imageRaw->empty()) ||
|
||||||
(depthRaw && depthRaw->empty()) ||
|
(depthRaw && depthRaw->empty()) ||
|
||||||
|
(depthConfidenceRaw && depthConfidenceRaw->empty()) ||
|
||||||
(laserScanRaw && laserScanRaw->isEmpty()) ||
|
(laserScanRaw && laserScanRaw->isEmpty()) ||
|
||||||
(userDataRaw && userDataRaw->empty()) ||
|
(userDataRaw && userDataRaw->empty()) ||
|
||||||
(groundCellsRaw && groundCellsRaw->empty()) ||
|
(groundCellsRaw && groundCellsRaw->empty()) ||
|
||||||
@@ -668,6 +790,7 @@ void SensorData::uncompressDataConst(
|
|||||||
{
|
{
|
||||||
rtabmap::CompressionThread ctImage(_imageCompressed, true);
|
rtabmap::CompressionThread ctImage(_imageCompressed, true);
|
||||||
rtabmap::CompressionThread ctDepth(_depthOrRightCompressed, true);
|
rtabmap::CompressionThread ctDepth(_depthOrRightCompressed, true);
|
||||||
|
rtabmap::CompressionThread ctDepthConfidence(_depthConfidenceCompressed, false);
|
||||||
rtabmap::CompressionThread ctLaserScan(_laserScanCompressed.data(), false);
|
rtabmap::CompressionThread ctLaserScan(_laserScanCompressed.data(), false);
|
||||||
rtabmap::CompressionThread ctUserData(_userDataCompressed, false);
|
rtabmap::CompressionThread ctUserData(_userDataCompressed, false);
|
||||||
rtabmap::CompressionThread ctGroundCells(_groundCellsCompressed, false);
|
rtabmap::CompressionThread ctGroundCells(_groundCellsCompressed, false);
|
||||||
@@ -683,6 +806,11 @@ void SensorData::uncompressDataConst(
|
|||||||
UASSERT(_depthOrRightCompressed.type() == CV_8UC1);
|
UASSERT(_depthOrRightCompressed.type() == CV_8UC1);
|
||||||
ctDepth.start();
|
ctDepth.start();
|
||||||
}
|
}
|
||||||
|
if(depthConfidenceRaw && depthConfidenceRaw->empty() && !_depthConfidenceCompressed.empty())
|
||||||
|
{
|
||||||
|
UASSERT(_depthConfidenceCompressed.type() == CV_8UC1);
|
||||||
|
ctDepthConfidence.start();
|
||||||
|
}
|
||||||
if(laserScanRaw && laserScanRaw->isEmpty() && !_laserScanCompressed.isEmpty())
|
if(laserScanRaw && laserScanRaw->isEmpty() && !_laserScanCompressed.isEmpty())
|
||||||
{
|
{
|
||||||
UASSERT(_laserScanCompressed.isCompressed());
|
UASSERT(_laserScanCompressed.isCompressed());
|
||||||
@@ -710,6 +838,7 @@ void SensorData::uncompressDataConst(
|
|||||||
}
|
}
|
||||||
ctImage.join();
|
ctImage.join();
|
||||||
ctDepth.join();
|
ctDepth.join();
|
||||||
|
ctDepthConfidence.join();
|
||||||
ctLaserScan.join();
|
ctLaserScan.join();
|
||||||
ctUserData.join();
|
ctUserData.join();
|
||||||
ctGroundCells.join();
|
ctGroundCells.join();
|
||||||
@@ -746,6 +875,21 @@ void SensorData::uncompressDataConst(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(depthConfidenceRaw && depthConfidenceRaw->empty())
|
||||||
|
{
|
||||||
|
*depthConfidenceRaw = ctDepthConfidence.getUncompressedData();
|
||||||
|
if(depthConfidenceRaw->empty())
|
||||||
|
{
|
||||||
|
if(_depthConfidenceCompressed.empty())
|
||||||
|
{
|
||||||
|
UWARN("Requested depth confidence data, but the sensor data (%d) doesn't have depth confidence.", this->id());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UERROR("Requested depth confidence data, but failed to uncompress (%d).", this->id());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if(laserScanRaw && laserScanRaw->isEmpty())
|
if(laserScanRaw && laserScanRaw->isEmpty())
|
||||||
{
|
{
|
||||||
if(_laserScanCompressed.angleIncrement() > 0.0f)
|
if(_laserScanCompressed.angleIncrement() > 0.0f)
|
||||||
@@ -815,6 +959,8 @@ unsigned long SensorData::getMemoryUsed() const // Return memory usage in Bytes
|
|||||||
(_imageRaw.empty()?0:_imageRaw.total()*_imageRaw.elemSize()) +
|
(_imageRaw.empty()?0:_imageRaw.total()*_imageRaw.elemSize()) +
|
||||||
(_depthOrRightCompressed.empty()?0:_depthOrRightCompressed.total()*_depthOrRightCompressed.elemSize()) +
|
(_depthOrRightCompressed.empty()?0:_depthOrRightCompressed.total()*_depthOrRightCompressed.elemSize()) +
|
||||||
(_depthOrRightRaw.empty()?0:_depthOrRightRaw.total()*_depthOrRightRaw.elemSize()) +
|
(_depthOrRightRaw.empty()?0:_depthOrRightRaw.total()*_depthOrRightRaw.elemSize()) +
|
||||||
|
(_depthConfidenceCompressed.empty()?0:_depthConfidenceCompressed.total()*_depthConfidenceCompressed.elemSize()) +
|
||||||
|
(_depthConfidenceRaw.empty()?0:_depthConfidenceRaw.total()*_depthConfidenceRaw.elemSize()) +
|
||||||
(_userDataCompressed.empty()?0:_userDataCompressed.total()*_userDataCompressed.elemSize()) +
|
(_userDataCompressed.empty()?0:_userDataCompressed.total()*_userDataCompressed.elemSize()) +
|
||||||
(_userDataRaw.empty()?0:_userDataRaw.total()*_userDataRaw.elemSize()) +
|
(_userDataRaw.empty()?0:_userDataRaw.total()*_userDataRaw.elemSize()) +
|
||||||
(_laserScanCompressed.empty()?0:_laserScanCompressed.data().total()*_laserScanCompressed.data().elemSize()) +
|
(_laserScanCompressed.empty()?0:_laserScanCompressed.data().total()*_laserScanCompressed.data().elemSize()) +
|
||||||
@@ -836,6 +982,7 @@ void SensorData::clearCompressedData(bool images, bool scan, bool userData)
|
|||||||
{
|
{
|
||||||
_imageCompressed=cv::Mat();
|
_imageCompressed=cv::Mat();
|
||||||
_depthOrRightCompressed=cv::Mat();
|
_depthOrRightCompressed=cv::Mat();
|
||||||
|
_depthConfidenceCompressed=cv::Mat();
|
||||||
}
|
}
|
||||||
if(scan)
|
if(scan)
|
||||||
{
|
{
|
||||||
@@ -852,6 +999,7 @@ void SensorData::clearRawData(bool images, bool scan, bool userData)
|
|||||||
{
|
{
|
||||||
_imageRaw=cv::Mat();
|
_imageRaw=cv::Mat();
|
||||||
_depthOrRightRaw=cv::Mat();
|
_depthOrRightRaw=cv::Mat();
|
||||||
|
_depthConfidenceRaw=cv::Mat();
|
||||||
}
|
}
|
||||||
if(scan)
|
if(scan)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -273,11 +273,9 @@ void Transform::getTranslation(float & x, float & y, float & z) const
|
|||||||
z = this->z();
|
z = this->z();
|
||||||
}
|
}
|
||||||
|
|
||||||
float Transform::getAngle(float x, float y, float z) const
|
float Transform::getAngle(const Transform & t) const
|
||||||
{
|
{
|
||||||
Eigen::Vector3f vA(x,y,z);
|
return getQuaternionf().angularDistance(t.getQuaternionf());
|
||||||
Eigen::Vector3f vB = this->toEigen3f().linear()*Eigen::Vector3f(1,0,0);
|
|
||||||
return pcl::getAngle3D(Eigen::Vector4f(vA[0], vA[1], vA[2], 0), Eigen::Vector4f(vB[0], vB[1], vB[2], 0));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float Transform::getNorm() const
|
float Transform::getNorm() const
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ Transform OdometryDVO::computeTransform(
|
|||||||
t = motionFromKeyFrame_.inverse() * t;
|
t = motionFromKeyFrame_.inverse() * t;
|
||||||
|
|
||||||
// TODO make parameters?
|
// TODO make parameters?
|
||||||
if(currentMotion.getNorm() > 0.01 || currentMotion.getAngle() > 0.01)
|
if(currentMotion.getNorm() > 0.01 || currentMotion.getAngle(Transform::getIdentity()) > 0.01)
|
||||||
{
|
{
|
||||||
if(info)
|
if(info)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ CREATE TABLE Data (
|
|||||||
id INTEGER NOT NULL,
|
id INTEGER NOT NULL,
|
||||||
image BLOB, -- compressed image (Grayscale or RGB)
|
image BLOB, -- compressed image (Grayscale or RGB)
|
||||||
depth BLOB, -- compressed image (Depth or Right image)
|
depth BLOB, -- compressed image (Depth or Right image)
|
||||||
|
depth_confidence BLOB, -- compressed data (low=0 high=100)
|
||||||
calibration BLOB, -- fx, fy, cx, cy, [baseline,] width, height, local_transform
|
calibration BLOB, -- fx, fy, cx, cy, [baseline,] width, height, local_transform
|
||||||
|
|
||||||
scan BLOB, -- compressed data (Laser scan)
|
scan BLOB, -- compressed data (Laser scan)
|
||||||
|
|||||||
@@ -0,0 +1,182 @@
|
|||||||
|
-- *******************************************************************
|
||||||
|
-- DatabaseSchema: Script for creating the database
|
||||||
|
-- Usage:
|
||||||
|
-- $ sqlite3 LTM.db < DatabaseSchema.sql
|
||||||
|
--
|
||||||
|
-- *******************************************************************
|
||||||
|
|
||||||
|
-- *******************************************************************
|
||||||
|
-- CLEAN
|
||||||
|
-- *******************************************************************
|
||||||
|
/*DROP TABLE Node;*/
|
||||||
|
|
||||||
|
-- *******************************************************************
|
||||||
|
-- CREATE
|
||||||
|
-- *******************************************************************
|
||||||
|
CREATE TABLE Node (
|
||||||
|
id INTEGER NOT NULL,
|
||||||
|
map_id INTEGER NOT NULL,
|
||||||
|
weight INTEGER,
|
||||||
|
stamp FLOAT,
|
||||||
|
pose BLOB, -- 3x4 float
|
||||||
|
ground_truth_pose BLOB, -- 3x4 float
|
||||||
|
velocity BLOB, -- 6 float (vx,vy,vz,vroll,vpitch,vyaw) m/s and rad/s
|
||||||
|
label TEXT,
|
||||||
|
gps BLOB, -- 1x6 double: stamp, longitude (DD), latitude (DD), altitude (m), accuracy (m), bearing (North 0->360 deg clockwise)
|
||||||
|
env_sensors BLOB, -- Variable 3xdouble: (sensorId1, value, stamp, sensorId2, value, stamp, ...)
|
||||||
|
time_enter DATE,
|
||||||
|
PRIMARY KEY (id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE Data (
|
||||||
|
id INTEGER NOT NULL,
|
||||||
|
image BLOB, -- compressed image (Grayscale or RGB)
|
||||||
|
depth BLOB, -- compressed image (Depth or Right image)
|
||||||
|
calibration BLOB, -- fx, fy, cx, cy, [baseline,] width, height, local_transform
|
||||||
|
|
||||||
|
scan BLOB, -- compressed data (Laser scan)
|
||||||
|
scan_info BLOB, -- scan_max_pts, scan_max_range, scan_format, local_transform
|
||||||
|
|
||||||
|
ground_cells BLOB, -- compressed data (occupancy grid)
|
||||||
|
obstacle_cells BLOB, -- compressed data (occupancy grid)
|
||||||
|
empty_cells BLOB, -- compressed data (occupancy grid)
|
||||||
|
cell_size FLOAT,
|
||||||
|
view_point_x FLOAT,
|
||||||
|
view_point_y FLOAT,
|
||||||
|
view_point_z FLOAT,
|
||||||
|
|
||||||
|
user_data BLOB, -- compressed data (User data)
|
||||||
|
time_enter DATE,
|
||||||
|
PRIMARY KEY (id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE Link (
|
||||||
|
from_id INTEGER NOT NULL,
|
||||||
|
to_id INTEGER NOT NULL,
|
||||||
|
type INTEGER NOT NULL, -- kNeighbor=0, kGlobalClosure=1, kLocalSpaceClosure=2, kLocalTimeClosure=3, kUserClosure=4, kVirtualClosure=5, kNeighborMerged=6, kPosePrior=7, kLandmark=8
|
||||||
|
information_matrix BLOB NOT NULL, -- 6x6 double (inverse covariance)
|
||||||
|
transform BLOB, -- 3x4 float
|
||||||
|
user_data BLOB, -- compressed data (User data)
|
||||||
|
FOREIGN KEY (from_id) REFERENCES Node(id),
|
||||||
|
FOREIGN KEY (to_id) REFERENCES Node(id)
|
||||||
|
);
|
||||||
|
|
||||||
|
--
|
||||||
|
CREATE TABLE Word (
|
||||||
|
id INTEGER NOT NULL,
|
||||||
|
descriptor_size INTEGER NOT NULL,
|
||||||
|
descriptor BLOB NOT NULL,
|
||||||
|
time_enter DATE,
|
||||||
|
PRIMARY KEY (id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE Feature (
|
||||||
|
node_id INTEGER NOT NULL,
|
||||||
|
word_id INTEGER NOT NULL,
|
||||||
|
pos_x FLOAT NOT NULL,
|
||||||
|
pos_y FLOAT NOT NULL,
|
||||||
|
size INTEGER NOT NULL,
|
||||||
|
dir FLOAT NOT NULL,
|
||||||
|
response FLOAT NOT NULL,
|
||||||
|
octave INTEGER NOT NULL,
|
||||||
|
depth_x FLOAT,
|
||||||
|
depth_y FLOAT,
|
||||||
|
depth_z FLOAT,
|
||||||
|
descriptor_size INTEGER,
|
||||||
|
descriptor BLOB,
|
||||||
|
FOREIGN KEY (node_id) REFERENCES Node(id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE GlobalDescriptor (
|
||||||
|
node_id INTEGER NOT NULL,
|
||||||
|
type INTEGER NOT NULL,
|
||||||
|
info BLOB,
|
||||||
|
data BLOB NOT NULL,
|
||||||
|
FOREIGN KEY (node_id) REFERENCES Node(id)
|
||||||
|
);
|
||||||
|
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE Info (
|
||||||
|
STM_size INTEGER,
|
||||||
|
last_sign_added INTEGER,
|
||||||
|
process_mem_used INTEGER,
|
||||||
|
database_mem_used INTEGER,
|
||||||
|
dictionary_size INTEGER,
|
||||||
|
parameters TEXT,
|
||||||
|
time_enter DATE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE Statistics (
|
||||||
|
id INTEGER NOT NULL,
|
||||||
|
stamp FLOAT,
|
||||||
|
data BLOB, -- compressed string
|
||||||
|
wm_state BLOB, -- compressed data
|
||||||
|
FOREIGN KEY (id) REFERENCES Node(id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE Admin (
|
||||||
|
version TEXT,
|
||||||
|
preview_image BLOB, -- compressed image
|
||||||
|
|
||||||
|
opt_cloud BLOB, -- compressed data
|
||||||
|
opt_ids BLOB, -- Node ids used to generate the optimized cloud/mesh
|
||||||
|
opt_poses BLOB, -- compressed N*3x4 float
|
||||||
|
opt_last_localization BLOB, -- 3x4 float
|
||||||
|
opt_polygons_size INTEGER, -- e.g., 3
|
||||||
|
opt_polygons BLOB, -- compressed data [length_v0, i0,i1,i3, length_v1, i0,i1,i3]
|
||||||
|
opt_tex_coords BLOB, -- compressed data [length_v0, u0,v0,u1,v1,u2,v2, length_v1, u0,v0,u1,v1,u2,v2]
|
||||||
|
opt_tex_materials BLOB, -- compressed image
|
||||||
|
opt_map BLOB, -- compressed CV_8SC1 occupancy grid
|
||||||
|
opt_map_x_min FLOAT,
|
||||||
|
opt_map_y_min FLOAT,
|
||||||
|
opt_map_resolution FLOAT,
|
||||||
|
|
||||||
|
time_enter DATE
|
||||||
|
);
|
||||||
|
|
||||||
|
-- *******************************************************************
|
||||||
|
-- TRIGGERS
|
||||||
|
-- *******************************************************************
|
||||||
|
CREATE TRIGGER insert_Feature BEFORE INSERT ON Feature
|
||||||
|
WHEN NOT EXISTS (SELECT Node.id FROM Node WHERE Node.id = NEW.node_id)
|
||||||
|
BEGIN
|
||||||
|
SELECT RAISE(ABORT, 'Foreign key constraint failed in Feature table');
|
||||||
|
END;
|
||||||
|
|
||||||
|
-- Creating a trigger for time_enter
|
||||||
|
CREATE TRIGGER insert_Node_timeEnter AFTER INSERT ON Node
|
||||||
|
BEGIN
|
||||||
|
UPDATE Node SET time_enter = DATETIME('NOW') WHERE rowid = new.rowid;
|
||||||
|
END;
|
||||||
|
|
||||||
|
CREATE TRIGGER insert_Data_timeEnter AFTER INSERT ON Data
|
||||||
|
BEGIN
|
||||||
|
UPDATE Node SET time_enter = DATETIME('NOW') WHERE rowid = new.rowid;
|
||||||
|
END;
|
||||||
|
|
||||||
|
CREATE TRIGGER insert_Word_timeEnter AFTER INSERT ON Word
|
||||||
|
BEGIN
|
||||||
|
UPDATE Word SET time_enter = DATETIME('NOW') WHERE rowid = new.rowid;
|
||||||
|
END;
|
||||||
|
|
||||||
|
CREATE TRIGGER insert_Info_timeEnter AFTER INSERT ON Info
|
||||||
|
BEGIN
|
||||||
|
UPDATE Info SET time_enter = DATETIME('NOW') WHERE rowid = new.rowid;
|
||||||
|
END;
|
||||||
|
|
||||||
|
-- *******************************************************************
|
||||||
|
-- INDEXES
|
||||||
|
-- *******************************************************************
|
||||||
|
CREATE UNIQUE INDEX IDX_Node_id on Node (id);
|
||||||
|
CREATE INDEX IDX_Feature_node_id on Feature (node_id);
|
||||||
|
CREATE INDEX IDX_GlobalDescriptor_node_id on GlobalDescriptor (node_id);
|
||||||
|
CREATE INDEX IDX_Link_from_id on Link (from_id);
|
||||||
|
CREATE UNIQUE INDEX IDX_node_label on Node (label);
|
||||||
|
CREATE UNIQUE INDEX IDX_Statistics_id on Statistics (id);
|
||||||
|
|
||||||
|
-- *******************************************************************
|
||||||
|
-- VERSION
|
||||||
|
-- *******************************************************************
|
||||||
|
INSERT INTO Admin(version) VALUES('0.20.0');
|
||||||
|
|
||||||
@@ -242,8 +242,7 @@ cv::Mat SPDetector::compute(const std::vector<cv::KeyPoint> &keypoints)
|
|||||||
auto desc = torch::grid_sampler(desc_, grid, 0, 0, true); // [1, 256, 1, n_keypoints]
|
auto desc = torch::grid_sampler(desc_, grid, 0, 0, true); // [1, 256, 1, n_keypoints]
|
||||||
|
|
||||||
// normalize to 1
|
// normalize to 1
|
||||||
desc = torch::nn::functional::normalize(desc.reshape({1, desc_.size(1), -1})); //[1, 256, n_keypoints]
|
desc = torch::nn::functional::normalize(desc.reshape({desc_.size(1), -1}), torch::nn::functional::NormalizeFuncOptions().dim(0)); //[256, n_keypoints]
|
||||||
desc = desc.squeeze(); //[256, n_keypoints]
|
|
||||||
desc = desc.transpose(0, 1).contiguous(); //[n_keypoints, 256]
|
desc = desc.transpose(0, 1).contiguous(); //[n_keypoints, 256]
|
||||||
|
|
||||||
if(cuda_)
|
if(cuda_)
|
||||||
|
|||||||
+91
-1
@@ -1351,18 +1351,38 @@ cv::Mat interpolate(const cv::Mat & image, int factor, float depthErrorRatio)
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cv::Mat registerDepth(
|
||||||
|
const cv::Mat & depth,
|
||||||
|
const cv::Mat & depthK,
|
||||||
|
const cv::Size & colorSize,
|
||||||
|
const cv::Mat & colorK,
|
||||||
|
const rtabmap::Transform & transform)
|
||||||
|
{
|
||||||
|
cv::Mat tmp;
|
||||||
|
return registerDepth(
|
||||||
|
depth,
|
||||||
|
cv::Mat(),
|
||||||
|
depthK,
|
||||||
|
colorSize,
|
||||||
|
colorK,
|
||||||
|
transform,
|
||||||
|
tmp);
|
||||||
|
}
|
||||||
cv::Mat registerDepth(
|
cv::Mat registerDepth(
|
||||||
const cv::Mat & depth,
|
const cv::Mat & depth,
|
||||||
|
const cv::Mat & confidence,
|
||||||
const cv::Mat & depthK,
|
const cv::Mat & depthK,
|
||||||
const cv::Size & colorSize,
|
const cv::Size & colorSize,
|
||||||
const cv::Mat & colorK,
|
const cv::Mat & colorK,
|
||||||
const rtabmap::Transform & transform)
|
const rtabmap::Transform & transform,
|
||||||
|
cv::Mat & registeredConfidence)
|
||||||
{
|
{
|
||||||
UASSERT(!transform.isNull());
|
UASSERT(!transform.isNull());
|
||||||
UASSERT(!depth.empty());
|
UASSERT(!depth.empty());
|
||||||
UASSERT(depth.type() == CV_16UC1 || depth.type() == CV_32FC1); // mm or m
|
UASSERT(depth.type() == CV_16UC1 || depth.type() == CV_32FC1); // mm or m
|
||||||
UASSERT(depthK.type() == CV_64FC1 && depthK.cols == 3 && depthK.cols == 3);
|
UASSERT(depthK.type() == CV_64FC1 && depthK.cols == 3 && depthK.cols == 3);
|
||||||
UASSERT(colorK.type() == CV_64FC1 && colorK.cols == 3 && colorK.cols == 3);
|
UASSERT(colorK.type() == CV_64FC1 && colorK.cols == 3 && colorK.cols == 3);
|
||||||
|
UASSERT(confidence.empty() || (confidence.size() == depth.size() && confidence.type()==CV_8UC1));
|
||||||
|
|
||||||
float fx = depthK.at<double>(0,0);
|
float fx = depthK.at<double>(0,0);
|
||||||
float fy = depthK.at<double>(1,1);
|
float fy = depthK.at<double>(1,1);
|
||||||
@@ -1381,10 +1401,19 @@ cv::Mat registerDepth(
|
|||||||
Eigen::Vector4f P4,P3;
|
Eigen::Vector4f P4,P3;
|
||||||
P4[3] = 1;
|
P4[3] = 1;
|
||||||
cv::Mat registered = cv::Mat::zeros(colorSize, depth.type());
|
cv::Mat registered = cv::Mat::zeros(colorSize, depth.type());
|
||||||
|
registeredConfidence = cv::Mat();
|
||||||
|
if(!confidence.empty())
|
||||||
|
{
|
||||||
|
registeredConfidence = cv::Mat::zeros(colorSize, confidence.type());
|
||||||
|
}
|
||||||
|
|
||||||
bool depthInMM = depth.type() == CV_16UC1;
|
bool depthInMM = depth.type() == CV_16UC1;
|
||||||
for(int y=0; y<depth.rows; ++y)
|
for(int y=0; y<depth.rows; ++y)
|
||||||
{
|
{
|
||||||
|
const unsigned char * confPtr = 0;
|
||||||
|
if(!confidence.empty()) {
|
||||||
|
confPtr = confidence.ptr<unsigned char>(y);
|
||||||
|
}
|
||||||
for(int x=0; x<depth.cols; ++x)
|
for(int x=0; x<depth.cols; ++x)
|
||||||
{
|
{
|
||||||
//filtering
|
//filtering
|
||||||
@@ -1411,6 +1440,9 @@ cv::Mat registerDepth(
|
|||||||
if(zReg == 0 || z16 < zReg)
|
if(zReg == 0 || z16 < zReg)
|
||||||
{
|
{
|
||||||
zReg = z16;
|
zReg = z16;
|
||||||
|
if(confPtr) {
|
||||||
|
registeredConfidence.at<unsigned char>(dy, dx) = confPtr[x];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1419,6 +1451,9 @@ cv::Mat registerDepth(
|
|||||||
if(zReg == 0 || z < zReg)
|
if(zReg == 0 || z < zReg)
|
||||||
{
|
{
|
||||||
zReg = z;
|
zReg = z;
|
||||||
|
if(confPtr) {
|
||||||
|
registeredConfidence.at<unsigned char>(dy, dx) = confPtr[x];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1923,6 +1958,61 @@ cv::Mat fastBilateralFiltering(const cv::Mat & depth, float sigmaS, float sigmaR
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void depthBleedingFiltering(cv::Mat & depth, float maxDepthError)
|
||||||
|
{
|
||||||
|
if(depth.empty())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
UASSERT(depth.type() == CV_32FC1 || depth.type() == CV_16UC1);
|
||||||
|
|
||||||
|
// ignore border
|
||||||
|
depth.row(0).setTo(cv::Scalar(0));
|
||||||
|
depth.row(depth.rows-1).setTo(cv::Scalar(0));
|
||||||
|
depth.col(0).setTo(cv::Scalar(0));
|
||||||
|
depth.col(depth.cols-1).setTo(cv::Scalar(0));
|
||||||
|
|
||||||
|
if(depth.type() == CV_32FC1)
|
||||||
|
{
|
||||||
|
float * depthPtr = depth.ptr<float>();
|
||||||
|
for(int v=1; v<depth.rows-1; ++v)
|
||||||
|
{
|
||||||
|
for(int u=1; u<depth.cols-1; ++u)
|
||||||
|
{
|
||||||
|
int row = depth.cols*v;
|
||||||
|
float & ref = depthPtr[row + u];
|
||||||
|
if((fabs(ref - depthPtr[row + u - 1]) > maxDepthError &&
|
||||||
|
fabs(ref - depthPtr[row + u + 1]) > maxDepthError) ||
|
||||||
|
(fabs(ref - depthPtr[depth.cols*(v-1) + u]) > maxDepthError &&
|
||||||
|
fabs(ref - depthPtr[depth.cols*(v+1) + u]) > maxDepthError))
|
||||||
|
{
|
||||||
|
ref = 0.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(depth.type() == CV_16UC1)
|
||||||
|
{
|
||||||
|
unsigned short * depthPtr = depth.ptr<unsigned short>();
|
||||||
|
unsigned short maxDepthErrorMM = (unsigned short)(maxDepthError*1000.0f);
|
||||||
|
for(int v=1; v<depth.rows-1; ++v)
|
||||||
|
{
|
||||||
|
for(int u=1; u<depth.cols-1; ++u)
|
||||||
|
{
|
||||||
|
int row = depth.cols*v;
|
||||||
|
unsigned short & ref = depthPtr[row + u];
|
||||||
|
if((abs((int)ref - (int)depthPtr[row + u - 1]) > maxDepthErrorMM &&
|
||||||
|
abs((int)ref - (int)depthPtr[row + u + 1]) > maxDepthErrorMM) ||
|
||||||
|
(abs((int)ref - (int)depthPtr[depth.cols*(v-1) + u]) > maxDepthErrorMM &&
|
||||||
|
abs((int)ref - (int)depthPtr[depth.cols*(v+1) + u]) > maxDepthErrorMM))
|
||||||
|
{
|
||||||
|
ref = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Automatic brightness and contrast optimization with optional histogram clipping
|
* \brief Automatic brightness and contrast optimization with optional histogram clipping
|
||||||
* \param [in]src Input image GRAY or BGR or BGRA
|
* \param [in]src Input image GRAY or BGR or BGRA
|
||||||
|
|||||||
+115
-31
@@ -216,12 +216,33 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFromDepth(
|
|||||||
return cloudFromDepth(imageDepth, model, decimation, maxDepth, minDepth, validIndices);
|
return cloudFromDepth(imageDepth, model, decimation, maxDepth, minDepth, validIndices);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFromDepth(
|
||||||
|
const cv::Mat & imageDepthIn,
|
||||||
|
const CameraModel & model,
|
||||||
|
int decimation,
|
||||||
|
float maxDepth,
|
||||||
|
float minDepth,
|
||||||
|
std::vector<int> * validIndices)
|
||||||
|
{
|
||||||
|
return cloudFromDepth(
|
||||||
|
imageDepthIn,
|
||||||
|
cv::Mat(),
|
||||||
|
model,
|
||||||
|
decimation,
|
||||||
|
maxDepth,
|
||||||
|
minDepth,
|
||||||
|
0,
|
||||||
|
validIndices);
|
||||||
|
}
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFromDepth(
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFromDepth(
|
||||||
const cv::Mat & imageDepthIn,
|
const cv::Mat & imageDepthIn,
|
||||||
|
const cv::Mat & imageDepthConfidenceIn,
|
||||||
const CameraModel & model,
|
const CameraModel & model,
|
||||||
int decimation,
|
int decimation,
|
||||||
float maxDepth,
|
float maxDepth,
|
||||||
float minDepth,
|
float minDepth,
|
||||||
|
unsigned char confidenceThr,
|
||||||
std::vector<int> * validIndices)
|
std::vector<int> * validIndices)
|
||||||
{
|
{
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
|
||||||
@@ -234,8 +255,10 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFromDepth(
|
|||||||
|
|
||||||
UASSERT(model.isValidForProjection());
|
UASSERT(model.isValidForProjection());
|
||||||
UASSERT(!imageDepthIn.empty() && (imageDepthIn.type() == CV_16UC1 || imageDepthIn.type() == CV_32FC1));
|
UASSERT(!imageDepthIn.empty() && (imageDepthIn.type() == CV_16UC1 || imageDepthIn.type() == CV_32FC1));
|
||||||
|
UASSERT(imageDepthConfidenceIn.empty() || confidenceThr == 0 || (imageDepthConfidenceIn.type() == CV_8UC1 && imageDepthConfidenceIn.size() == imageDepthIn.size()));
|
||||||
|
|
||||||
cv::Mat imageDepth = imageDepthIn;
|
cv::Mat imageDepth = imageDepthIn;
|
||||||
|
cv::Mat imageDepthConfidence = confidenceThr==0?cv::Mat():imageDepthConfidenceIn;
|
||||||
if(model.imageHeight()>0 && model.imageWidth()>0)
|
if(model.imageHeight()>0 && model.imageWidth()>0)
|
||||||
{
|
{
|
||||||
UASSERT(model.imageHeight() % imageDepthIn.rows == 0 && model.imageWidth() % imageDepthIn.cols == 0);
|
UASSERT(model.imageHeight() % imageDepthIn.rows == 0 && model.imageWidth() % imageDepthIn.cols == 0);
|
||||||
@@ -262,6 +285,9 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFromDepth(
|
|||||||
{
|
{
|
||||||
UDEBUG("Depth interpolation factor=%d", targetSize/imageDepthIn.rows);
|
UDEBUG("Depth interpolation factor=%d", targetSize/imageDepthIn.rows);
|
||||||
imageDepth = util2d::interpolate(imageDepthIn, targetSize/imageDepthIn.rows);
|
imageDepth = util2d::interpolate(imageDepthIn, targetSize/imageDepthIn.rows);
|
||||||
|
if(!imageDepthConfidence.empty()) {
|
||||||
|
imageDepthConfidence = util2d::interpolate(imageDepthConfidenceIn, targetSize/imageDepthConfidenceIn.rows);
|
||||||
|
}
|
||||||
decimation = 1;
|
decimation = 1;
|
||||||
}
|
}
|
||||||
else if(targetSize == imageDepthIn.rows)
|
else if(targetSize == imageDepthIn.rows)
|
||||||
@@ -313,11 +339,13 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFromDepth(
|
|||||||
float depthCx = model.cx() * rgbToDepthFactorX;
|
float depthCx = model.cx() * rgbToDepthFactorX;
|
||||||
float depthCy = model.cy() * rgbToDepthFactorY;
|
float depthCy = model.cy() * rgbToDepthFactorY;
|
||||||
|
|
||||||
UDEBUG("depth=%dx%d fx=%f fy=%f cx=%f cy=%f (depth factors=%f %f) decimation=%d",
|
UDEBUG("depth=%dx%d fx=%f fy=%f cx=%f cy=%f (depth factors=%f %f) has confidence=%d (thr=%d) decimation=%d",
|
||||||
imageDepth.cols, imageDepth.rows,
|
imageDepth.cols, imageDepth.rows,
|
||||||
model.fx(), model.fy(), model.cx(), model.cy(),
|
model.fx(), model.fy(), model.cx(), model.cy(),
|
||||||
rgbToDepthFactorX,
|
rgbToDepthFactorX,
|
||||||
rgbToDepthFactorY,
|
rgbToDepthFactorY,
|
||||||
|
imageDepthConfidenceIn.empty()?0:1,
|
||||||
|
(int)confidenceThr,
|
||||||
decimation);
|
decimation);
|
||||||
|
|
||||||
int oi = 0;
|
int oi = 0;
|
||||||
@@ -327,21 +355,21 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFromDepth(
|
|||||||
{
|
{
|
||||||
pcl::PointXYZ & pt = cloud->at((h/decimation)*cloud->width + (w/decimation));
|
pcl::PointXYZ & pt = cloud->at((h/decimation)*cloud->width + (w/decimation));
|
||||||
|
|
||||||
pcl::PointXYZ ptXYZ = projectDepthTo3D(imageDepth, w, h, depthCx, depthCy, depthFx, depthFy, false);
|
pt.x = pt.y = pt.z = std::numeric_limits<float>::quiet_NaN();
|
||||||
if(pcl::isFinite(ptXYZ) && ptXYZ.z>=minDepth && (maxDepth<=0.0f || ptXYZ.z <= maxDepth))
|
if(imageDepthConfidence.empty() || imageDepthConfidence.at<unsigned char>(h,w) >= confidenceThr)
|
||||||
{
|
{
|
||||||
pt.x = ptXYZ.x;
|
pcl::PointXYZ ptXYZ = projectDepthTo3D(imageDepth, w, h, depthCx, depthCy, depthFx, depthFy, false);
|
||||||
pt.y = ptXYZ.y;
|
if(pcl::isFinite(ptXYZ) && ptXYZ.z>=minDepth && (maxDepth<=0.0f || ptXYZ.z <= maxDepth))
|
||||||
pt.z = ptXYZ.z;
|
|
||||||
if(validIndices)
|
|
||||||
{
|
{
|
||||||
validIndices->at(oi++) = (h/decimation)*cloud->width + (w/decimation);
|
pt.x = ptXYZ.x;
|
||||||
|
pt.y = ptXYZ.y;
|
||||||
|
pt.z = ptXYZ.z;
|
||||||
|
if(validIndices)
|
||||||
|
{
|
||||||
|
validIndices->at(oi++) = (h/decimation)*cloud->width + (w/decimation);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
pt.x = pt.y = pt.z = std::numeric_limits<float>::quiet_NaN();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -367,13 +395,36 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromDepthRGB(
|
|||||||
return cloudFromDepthRGB(imageRgb, imageDepth, model, decimation, maxDepth, minDepth, validIndices);
|
return cloudFromDepthRGB(imageRgb, imageDepth, model, decimation, maxDepth, minDepth, validIndices);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromDepthRGB(
|
||||||
|
const cv::Mat & imageRgb,
|
||||||
|
const cv::Mat & imageDepthIn,
|
||||||
|
const CameraModel & model,
|
||||||
|
int decimation,
|
||||||
|
float maxDepth,
|
||||||
|
float minDepth,
|
||||||
|
std::vector<int> * validIndices)
|
||||||
|
{
|
||||||
|
return cloudFromDepthRGB(
|
||||||
|
imageRgb,
|
||||||
|
imageDepthIn,
|
||||||
|
cv::Mat(),
|
||||||
|
model,
|
||||||
|
decimation,
|
||||||
|
maxDepth,
|
||||||
|
minDepth,
|
||||||
|
0,
|
||||||
|
validIndices);
|
||||||
|
}
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromDepthRGB(
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromDepthRGB(
|
||||||
const cv::Mat & imageRgb,
|
const cv::Mat & imageRgb,
|
||||||
const cv::Mat & imageDepthIn,
|
const cv::Mat & imageDepthIn,
|
||||||
|
const cv::Mat & imageDepthConfidenceIn,
|
||||||
const CameraModel & model,
|
const CameraModel & model,
|
||||||
int decimation,
|
int decimation,
|
||||||
float maxDepth,
|
float maxDepth,
|
||||||
float minDepth,
|
float minDepth,
|
||||||
|
unsigned char confidenceThr,
|
||||||
std::vector<int> * validIndices)
|
std::vector<int> * validIndices)
|
||||||
{
|
{
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
|
||||||
@@ -389,6 +440,7 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromDepthRGB(
|
|||||||
//UASSERT_MSG(imageRgb.rows % imageDepthIn.rows == 0 && imageRgb.cols % imageDepthIn.cols == 0,
|
//UASSERT_MSG(imageRgb.rows % imageDepthIn.rows == 0 && imageRgb.cols % imageDepthIn.cols == 0,
|
||||||
// uFormat("rgb=%dx%d depth=%dx%d", imageRgb.cols, imageRgb.rows, imageDepthIn.cols, imageDepthIn.rows).c_str());
|
// uFormat("rgb=%dx%d depth=%dx%d", imageRgb.cols, imageRgb.rows, imageDepthIn.cols, imageDepthIn.rows).c_str());
|
||||||
UASSERT(!imageDepthIn.empty() && (imageDepthIn.type() == CV_16UC1 || imageDepthIn.type() == CV_32FC1));
|
UASSERT(!imageDepthIn.empty() && (imageDepthIn.type() == CV_16UC1 || imageDepthIn.type() == CV_32FC1));
|
||||||
|
UASSERT(imageDepthConfidenceIn.empty() || confidenceThr==0 || (imageDepthConfidenceIn.type() == CV_8UC1 && imageDepthConfidenceIn.size() == imageDepthIn.size()));
|
||||||
if(decimation < 0)
|
if(decimation < 0)
|
||||||
{
|
{
|
||||||
if(imageRgb.rows % decimation != 0 || imageRgb.cols % decimation != 0)
|
if(imageRgb.rows % decimation != 0 || imageRgb.cols % decimation != 0)
|
||||||
@@ -431,6 +483,7 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromDepthRGB(
|
|||||||
}
|
}
|
||||||
|
|
||||||
cv::Mat imageDepth = imageDepthIn;
|
cv::Mat imageDepth = imageDepthIn;
|
||||||
|
cv::Mat imageDepthConfidence = confidenceThr==0?cv::Mat():imageDepthConfidenceIn;
|
||||||
if(decimation < 0)
|
if(decimation < 0)
|
||||||
{
|
{
|
||||||
UDEBUG("Decimation from RGB image (%d)", decimation);
|
UDEBUG("Decimation from RGB image (%d)", decimation);
|
||||||
@@ -442,6 +495,9 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromDepthRGB(
|
|||||||
{
|
{
|
||||||
UDEBUG("Depth interpolation factor=%d", targetSize/imageDepthIn.rows);
|
UDEBUG("Depth interpolation factor=%d", targetSize/imageDepthIn.rows);
|
||||||
imageDepth = util2d::interpolate(imageDepthIn, targetSize/imageDepthIn.rows);
|
imageDepth = util2d::interpolate(imageDepthIn, targetSize/imageDepthIn.rows);
|
||||||
|
if(!imageDepthConfidence.empty()) {
|
||||||
|
imageDepthConfidence = util2d::interpolate(imageDepthConfidenceIn, targetSize/imageDepthConfidenceIn.rows);
|
||||||
|
}
|
||||||
decimation = 1;
|
decimation = 1;
|
||||||
}
|
}
|
||||||
else if(targetSize == imageDepthIn.rows)
|
else if(targetSize == imageDepthIn.rows)
|
||||||
@@ -486,12 +542,14 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromDepthRGB(
|
|||||||
float depthCx = model.cx() / rgbToDepthFactorX;
|
float depthCx = model.cx() / rgbToDepthFactorX;
|
||||||
float depthCy = model.cy() / rgbToDepthFactorY;
|
float depthCy = model.cy() / rgbToDepthFactorY;
|
||||||
|
|
||||||
UDEBUG("rgb=%dx%d depth=%dx%d fx=%f fy=%f cx=%f cy=%f (depth factors=%f %f) decimation=%d",
|
UDEBUG("rgb=%dx%d depth=%dx%d fx=%f fy=%f cx=%f cy=%f (depth factors=%f %f) has confidence=%d (thr=%d) decimation=%d",
|
||||||
imageRgb.cols, imageRgb.rows,
|
imageRgb.cols, imageRgb.rows,
|
||||||
imageDepth.cols, imageDepth.rows,
|
imageDepth.cols, imageDepth.rows,
|
||||||
model.fx(), model.fy(), model.cx(), model.cy(),
|
model.fx(), model.fy(), model.cx(), model.cy(),
|
||||||
rgbToDepthFactorX,
|
rgbToDepthFactorX,
|
||||||
rgbToDepthFactorY,
|
rgbToDepthFactorY,
|
||||||
|
imageDepthConfidenceIn.empty()?0:1,
|
||||||
|
(int)confidenceThr,
|
||||||
decimation);
|
decimation);
|
||||||
|
|
||||||
int oi = 0;
|
int oi = 0;
|
||||||
@@ -519,21 +577,21 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromDepthRGB(
|
|||||||
pt.r = v;
|
pt.r = v;
|
||||||
}
|
}
|
||||||
|
|
||||||
pcl::PointXYZ ptXYZ = projectDepthTo3D(imageDepth, w, h, depthCx, depthCy, depthFx, depthFy, false);
|
pt.x = pt.y = pt.z = std::numeric_limits<float>::quiet_NaN();
|
||||||
if (pcl::isFinite(ptXYZ) && ptXYZ.z >= minDepth && (maxDepth <= 0.0f || ptXYZ.z <= maxDepth))
|
if(imageDepthConfidence.empty() || imageDepthConfidence.at<unsigned char>(h,w) >= confidenceThr)
|
||||||
{
|
{
|
||||||
pt.x = ptXYZ.x;
|
pcl::PointXYZ ptXYZ = projectDepthTo3D(imageDepth, w, h, depthCx, depthCy, depthFx, depthFy, false);
|
||||||
pt.y = ptXYZ.y;
|
if (pcl::isFinite(ptXYZ) && ptXYZ.z >= minDepth && (maxDepth <= 0.0f || ptXYZ.z <= maxDepth))
|
||||||
pt.z = ptXYZ.z;
|
|
||||||
if (validIndices)
|
|
||||||
{
|
{
|
||||||
validIndices->at(oi) = (h / decimation)*cloud->width + (w / decimation);
|
pt.x = ptXYZ.x;
|
||||||
|
pt.y = ptXYZ.y;
|
||||||
|
pt.z = ptXYZ.z;
|
||||||
|
if (validIndices)
|
||||||
|
{
|
||||||
|
validIndices->at(oi) = (h / decimation)*cloud->width + (w / decimation);
|
||||||
|
}
|
||||||
|
++oi;
|
||||||
}
|
}
|
||||||
++oi;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pt.x = pt.y = pt.z = std::numeric_limits<float>::quiet_NaN();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -808,7 +866,8 @@ std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> cloudsFromSensorData(
|
|||||||
float minDepth,
|
float minDepth,
|
||||||
std::vector<pcl::IndicesPtr> * validIndices,
|
std::vector<pcl::IndicesPtr> * validIndices,
|
||||||
const ParametersMap & stereoParameters,
|
const ParametersMap & stereoParameters,
|
||||||
const std::vector<float> & roiRatios)
|
const std::vector<float> & roiRatios,
|
||||||
|
unsigned char confidenceThr)
|
||||||
{
|
{
|
||||||
if(decimation == 0)
|
if(decimation == 0)
|
||||||
{
|
{
|
||||||
@@ -821,6 +880,7 @@ std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> cloudsFromSensorData(
|
|||||||
{
|
{
|
||||||
//depth
|
//depth
|
||||||
UASSERT(int((sensorData.depthRaw().cols/sensorData.cameraModels().size())*sensorData.cameraModels().size()) == sensorData.depthRaw().cols);
|
UASSERT(int((sensorData.depthRaw().cols/sensorData.cameraModels().size())*sensorData.cameraModels().size()) == sensorData.depthRaw().cols);
|
||||||
|
UASSERT(sensorData.depthConfidenceRaw().empty() || confidenceThr==0 || (sensorData.depthConfidenceRaw().type() == CV_8UC1 && sensorData.depthConfidenceRaw().cols == sensorData.depthRaw().cols && sensorData.depthConfidenceRaw().rows == sensorData.depthRaw().rows));
|
||||||
int subImageWidth = sensorData.depthRaw().cols/sensorData.cameraModels().size();
|
int subImageWidth = sensorData.depthRaw().cols/sensorData.cameraModels().size();
|
||||||
for(unsigned int i=0; i<sensorData.cameraModels().size(); ++i)
|
for(unsigned int i=0; i<sensorData.cameraModels().size(); ++i)
|
||||||
{
|
{
|
||||||
@@ -832,6 +892,10 @@ std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> cloudsFromSensorData(
|
|||||||
if(sensorData.cameraModels()[i].isValidForProjection())
|
if(sensorData.cameraModels()[i].isValidForProjection())
|
||||||
{
|
{
|
||||||
cv::Mat depth = cv::Mat(sensorData.depthRaw(), cv::Rect(subImageWidth*i, 0, subImageWidth, sensorData.depthRaw().rows));
|
cv::Mat depth = cv::Mat(sensorData.depthRaw(), cv::Rect(subImageWidth*i, 0, subImageWidth, sensorData.depthRaw().rows));
|
||||||
|
cv::Mat depthConfidence;
|
||||||
|
if(!sensorData.depthConfidenceRaw().empty() && confidenceThr > 0) {
|
||||||
|
depthConfidence = cv::Mat(sensorData.depthConfidenceRaw(), cv::Rect(subImageWidth*i, 0, subImageWidth, sensorData.depthConfidenceRaw().rows));
|
||||||
|
}
|
||||||
CameraModel model = sensorData.cameraModels()[i];
|
CameraModel model = sensorData.cameraModels()[i];
|
||||||
if( roiRatios.size() == 4 &&
|
if( roiRatios.size() == 4 &&
|
||||||
(roiRatios[0] > 0.0f ||
|
(roiRatios[0] > 0.0f ||
|
||||||
@@ -852,6 +916,9 @@ std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> cloudsFromSensorData(
|
|||||||
roiRgb.height%decimation==0)))
|
roiRgb.height%decimation==0)))
|
||||||
{
|
{
|
||||||
depth = cv::Mat(depth, roiDepth);
|
depth = cv::Mat(depth, roiDepth);
|
||||||
|
if(!depthConfidence.empty()) {
|
||||||
|
depthConfidence = cv::Mat(depthConfidence, roiDepth);
|
||||||
|
}
|
||||||
if(model.imageWidth() != 0 && model.imageHeight() != 0)
|
if(model.imageWidth() != 0 && model.imageHeight() != 0)
|
||||||
{
|
{
|
||||||
model = model.roi(util2d::computeRoi(model.imageSize(), roiRatios));
|
model = model.roi(util2d::computeRoi(model.imageSize(), roiRatios));
|
||||||
@@ -880,10 +947,12 @@ std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> cloudsFromSensorData(
|
|||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr tmp = util3d::cloudFromDepth(
|
pcl::PointCloud<pcl::PointXYZ>::Ptr tmp = util3d::cloudFromDepth(
|
||||||
depth,
|
depth,
|
||||||
|
depthConfidence,
|
||||||
model,
|
model,
|
||||||
decimation,
|
decimation,
|
||||||
maxDepth,
|
maxDepth,
|
||||||
minDepth,
|
minDepth,
|
||||||
|
confidenceThr,
|
||||||
validIndices?validIndices->back().get():0);
|
validIndices?validIndices->back().get():0);
|
||||||
|
|
||||||
if(tmp->size())
|
if(tmp->size())
|
||||||
@@ -1004,7 +1073,8 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFromSensorData(
|
|||||||
float minDepth,
|
float minDepth,
|
||||||
std::vector<int> * validIndices,
|
std::vector<int> * validIndices,
|
||||||
const ParametersMap & stereoParameters,
|
const ParametersMap & stereoParameters,
|
||||||
const std::vector<float> & roiRatios)
|
const std::vector<float> & roiRatios,
|
||||||
|
unsigned char confidenceThr)
|
||||||
{
|
{
|
||||||
std::vector<pcl::IndicesPtr> validIndicesV;
|
std::vector<pcl::IndicesPtr> validIndicesV;
|
||||||
std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> clouds = cloudsFromSensorData(
|
std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> clouds = cloudsFromSensorData(
|
||||||
@@ -1014,7 +1084,8 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFromSensorData(
|
|||||||
minDepth,
|
minDepth,
|
||||||
validIndices?&validIndicesV:0,
|
validIndices?&validIndicesV:0,
|
||||||
stereoParameters,
|
stereoParameters,
|
||||||
roiRatios);
|
roiRatios,
|
||||||
|
confidenceThr);
|
||||||
|
|
||||||
if(validIndices)
|
if(validIndices)
|
||||||
{
|
{
|
||||||
@@ -1057,7 +1128,8 @@ std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> cloudsRGBFromSensorData(
|
|||||||
float minDepth,
|
float minDepth,
|
||||||
std::vector<pcl::IndicesPtr> * validIndices,
|
std::vector<pcl::IndicesPtr> * validIndices,
|
||||||
const ParametersMap & stereoParameters,
|
const ParametersMap & stereoParameters,
|
||||||
const std::vector<float> & roiRatios)
|
const std::vector<float> & roiRatios,
|
||||||
|
unsigned char confidenceThr)
|
||||||
{
|
{
|
||||||
if(decimation == 0)
|
if(decimation == 0)
|
||||||
{
|
{
|
||||||
@@ -1076,6 +1148,7 @@ std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> cloudsRGBFromSensorData(
|
|||||||
//UASSERT_MSG(sensorData.imageRaw().rows % sensorData.depthRaw().rows == 0, uFormat("rgb=%d depth=%d", sensorData.imageRaw().rows, sensorData.depthRaw().rows).c_str());
|
//UASSERT_MSG(sensorData.imageRaw().rows % sensorData.depthRaw().rows == 0, uFormat("rgb=%d depth=%d", sensorData.imageRaw().rows, sensorData.depthRaw().rows).c_str());
|
||||||
int subRGBWidth = sensorData.imageRaw().cols/sensorData.cameraModels().size();
|
int subRGBWidth = sensorData.imageRaw().cols/sensorData.cameraModels().size();
|
||||||
int subDepthWidth = sensorData.depthRaw().cols/sensorData.cameraModels().size();
|
int subDepthWidth = sensorData.depthRaw().cols/sensorData.cameraModels().size();
|
||||||
|
UASSERT(sensorData.depthConfidenceRaw().empty() || confidenceThr==0 || (sensorData.depthConfidenceRaw().type() == CV_8UC1 && sensorData.depthConfidenceRaw().cols == sensorData.depthRaw().cols && sensorData.depthConfidenceRaw().rows == sensorData.depthRaw().rows));
|
||||||
|
|
||||||
for(unsigned int i=0; i<sensorData.cameraModels().size(); ++i)
|
for(unsigned int i=0; i<sensorData.cameraModels().size(); ++i)
|
||||||
{
|
{
|
||||||
@@ -1088,6 +1161,10 @@ std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> cloudsRGBFromSensorData(
|
|||||||
{
|
{
|
||||||
cv::Mat rgb(sensorData.imageRaw(), cv::Rect(subRGBWidth*i, 0, subRGBWidth, sensorData.imageRaw().rows));
|
cv::Mat rgb(sensorData.imageRaw(), cv::Rect(subRGBWidth*i, 0, subRGBWidth, sensorData.imageRaw().rows));
|
||||||
cv::Mat depth(sensorData.depthRaw(), cv::Rect(subDepthWidth*i, 0, subDepthWidth, sensorData.depthRaw().rows));
|
cv::Mat depth(sensorData.depthRaw(), cv::Rect(subDepthWidth*i, 0, subDepthWidth, sensorData.depthRaw().rows));
|
||||||
|
cv::Mat depthConfidence;
|
||||||
|
if(!sensorData.depthConfidenceRaw().empty() && confidenceThr>0) {
|
||||||
|
depthConfidence = cv::Mat(sensorData.depthConfidenceRaw(), cv::Rect(subDepthWidth*i, 0, subDepthWidth, sensorData.depthConfidenceRaw().rows));
|
||||||
|
}
|
||||||
CameraModel model = sensorData.cameraModels()[i];
|
CameraModel model = sensorData.cameraModels()[i];
|
||||||
if( roiRatios.size() == 4 &&
|
if( roiRatios.size() == 4 &&
|
||||||
((roiRatios[0] > 0.0f && roiRatios[0] <= 1.0f) ||
|
((roiRatios[0] > 0.0f && roiRatios[0] <= 1.0f) ||
|
||||||
@@ -1103,6 +1180,9 @@ std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> cloudsRGBFromSensorData(
|
|||||||
roiRgb.height%decimation==0)
|
roiRgb.height%decimation==0)
|
||||||
{
|
{
|
||||||
depth = cv::Mat(depth, roiDepth);
|
depth = cv::Mat(depth, roiDepth);
|
||||||
|
if(!depthConfidence.empty()) {
|
||||||
|
depthConfidence = cv::Mat(depthConfidence, roiDepth);
|
||||||
|
}
|
||||||
rgb = cv::Mat(rgb, roiRgb);
|
rgb = cv::Mat(rgb, roiRgb);
|
||||||
model = model.roi(roiRgb);
|
model = model.roi(roiRgb);
|
||||||
}
|
}
|
||||||
@@ -1126,10 +1206,12 @@ std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> cloudsRGBFromSensorData(
|
|||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr tmp = util3d::cloudFromDepthRGB(
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr tmp = util3d::cloudFromDepthRGB(
|
||||||
rgb,
|
rgb,
|
||||||
depth,
|
depth,
|
||||||
|
depthConfidence,
|
||||||
model,
|
model,
|
||||||
decimation,
|
decimation,
|
||||||
maxDepth,
|
maxDepth,
|
||||||
minDepth,
|
minDepth,
|
||||||
|
confidenceThr,
|
||||||
validIndices?validIndices->back().get():0);
|
validIndices?validIndices->back().get():0);
|
||||||
|
|
||||||
if(tmp->size())
|
if(tmp->size())
|
||||||
@@ -1232,7 +1314,8 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudRGBFromSensorData(
|
|||||||
float minDepth,
|
float minDepth,
|
||||||
std::vector<int> * validIndices,
|
std::vector<int> * validIndices,
|
||||||
const ParametersMap & stereoParameters,
|
const ParametersMap & stereoParameters,
|
||||||
const std::vector<float> & roiRatios)
|
const std::vector<float> & roiRatios,
|
||||||
|
unsigned char confidenceThr)
|
||||||
{
|
{
|
||||||
std::vector<pcl::IndicesPtr> validIndicesV;
|
std::vector<pcl::IndicesPtr> validIndicesV;
|
||||||
std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> clouds = cloudsRGBFromSensorData(
|
std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> clouds = cloudsRGBFromSensorData(
|
||||||
@@ -1242,7 +1325,8 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudRGBFromSensorData(
|
|||||||
minDepth,
|
minDepth,
|
||||||
validIndices?&validIndicesV:0,
|
validIndices?&validIndicesV:0,
|
||||||
stereoParameters,
|
stereoParameters,
|
||||||
roiRatios);
|
roiRatios,
|
||||||
|
confidenceThr);
|
||||||
|
|
||||||
if(validIndices)
|
if(validIndices)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ RUN git clone https://github.com/laurentkneip/opengv.git && \
|
|||||||
mkdir build && \
|
mkdir build && \
|
||||||
cd build && \
|
cd build && \
|
||||||
~/cmake -DCMAKE_BUILD_TYPE=Release .. && \
|
~/cmake -DCMAKE_BUILD_TYPE=Release .. && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd && \
|
cd && \
|
||||||
rm -r opengv
|
rm -r opengv
|
||||||
@@ -63,7 +63,7 @@ COPY . /root/rtabmap
|
|||||||
RUN source /ros_entrypoint.sh && \
|
RUN source /ros_entrypoint.sh && \
|
||||||
cd rtabmap/build && \
|
cd rtabmap/build && \
|
||||||
~/cmake -DWITH_OPENGV=ON .. && \
|
~/cmake -DWITH_OPENGV=ON .. && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd ../.. && \
|
cd ../.. && \
|
||||||
rm -rf rtabmap && \
|
rm -rf rtabmap && \
|
||||||
|
|||||||
+1
-17
@@ -2,22 +2,6 @@
|
|||||||
|
|
||||||
FROM introlab3it/rtabmap:focal-deps
|
FROM introlab3it/rtabmap:focal-deps
|
||||||
|
|
||||||
# June 19 2023: moved opengv here so that focal-deps can be built on my computer. Not sure why but on my machine opengv arm64 fails, but not on CI.
|
|
||||||
#commit Aug 6 2020
|
|
||||||
RUN apt-get update && apt install wget && apt-get clean && rm -rf /var/lib/apt/lists/
|
|
||||||
RUN git clone https://github.com/laurentkneip/opengv.git && \
|
|
||||||
cd opengv && \
|
|
||||||
git checkout 91f4b19c73450833a40e463ad3648aae80b3a7f3 && \
|
|
||||||
wget https://gist.githubusercontent.com/matlabbe/a412cf7c4627253874f81a00745a7fbb/raw/accc3acf465d1ffd0304a46b17741f62d4d354ef/opengv_disable_march_native.patch && \
|
|
||||||
git apply opengv_disable_march_native.patch && \
|
|
||||||
mkdir build && \
|
|
||||||
cd build && \
|
|
||||||
cmake -DCMAKE_BUILD_TYPE=Release .. && \
|
|
||||||
make -j$(nproc) && \
|
|
||||||
make install && \
|
|
||||||
cd && \
|
|
||||||
rm -r opengv
|
|
||||||
|
|
||||||
# Will be used to read/store databases on host
|
# Will be used to read/store databases on host
|
||||||
RUN mkdir -p /root/Documents/RTAB-Map && chmod 777 /root/Documents/RTAB-Map
|
RUN mkdir -p /root/Documents/RTAB-Map && chmod 777 /root/Documents/RTAB-Map
|
||||||
|
|
||||||
@@ -28,7 +12,7 @@ COPY . /root/rtabmap
|
|||||||
RUN source /ros_entrypoint.sh && \
|
RUN source /ros_entrypoint.sh && \
|
||||||
cd rtabmap/build && \
|
cd rtabmap/build && \
|
||||||
cmake -DWITH_ALICE_VISION=ON -DWITH_OPENGV=ON .. && \
|
cmake -DWITH_ALICE_VISION=ON -DWITH_OPENGV=ON .. && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd ../.. && \
|
cd ../.. && \
|
||||||
rm -rf rtabmap && \
|
rm -rf rtabmap && \
|
||||||
|
|||||||
@@ -10,6 +10,13 @@ ENV DEBIAN_FRONTEND=noninteractive
|
|||||||
|
|
||||||
WORKDIR /root/
|
WORKDIR /root/
|
||||||
|
|
||||||
|
# issue: https://github.com/introlab/rtabmap/issues/1523
|
||||||
|
RUN rm /etc/apt/sources.list.d/ros1-latest.list || true && \
|
||||||
|
apt-get update && apt-get install -y curl && \
|
||||||
|
sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' && \
|
||||||
|
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
# Install build dependencies
|
# Install build dependencies
|
||||||
RUN if [ "$TARGETPLATFORM" = "linux/arm/v7" ]; then \
|
RUN if [ "$TARGETPLATFORM" = "linux/arm/v7" ]; then \
|
||||||
apt-get update && \
|
apt-get update && \
|
||||||
@@ -29,7 +36,7 @@ RUN if [ "$TARGETPLATFORM" = "linux/arm/v7" ]; then \
|
|||||||
export CFLAGS="-D_FILE_OFFSET_BITS=64" && \
|
export CFLAGS="-D_FILE_OFFSET_BITS=64" && \
|
||||||
export CXXFLAGS="-D_FILE_OFFSET_BITS=64" && \
|
export CXXFLAGS="-D_FILE_OFFSET_BITS=64" && \
|
||||||
./bootstrap && \
|
./bootstrap && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
sudo make install && \
|
sudo make install && \
|
||||||
cd .. && \
|
cd .. && \
|
||||||
cmake --version && \
|
cmake --version && \
|
||||||
@@ -52,7 +59,7 @@ RUN apt-get update && apt-get install -y ros-noetic-librealsense2 && \
|
|||||||
# Taken from https://github.com/microsoft/Azure-Kinect-Sensor-SDK/issues/1190#issuecomment-822772494
|
# Taken from https://github.com/microsoft/Azure-Kinect-Sensor-SDK/issues/1190#issuecomment-822772494
|
||||||
# K4A binaries on 20.04 not released yet, we should take those from 18.04
|
# K4A binaries on 20.04 not released yet, we should take those from 18.04
|
||||||
RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then echo "Installing k4a..." && \
|
RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then echo "Installing k4a..." && \
|
||||||
apt-get update && apt-get install -y curl && \
|
apt-get update && \
|
||||||
echo "Download libk4a1.3_1.3.0_amd64.deb..." && \
|
echo "Download libk4a1.3_1.3.0_amd64.deb..." && \
|
||||||
curl -sSL https://packages.microsoft.com/ubuntu/18.04/prod/pool/main/libk/libk4a1.3/libk4a1.3_1.3.0_amd64.deb > /tmp/libk4a1.3_1.3.0_amd64.deb && \
|
curl -sSL https://packages.microsoft.com/ubuntu/18.04/prod/pool/main/libk/libk4a1.3/libk4a1.3_1.3.0_amd64.deb > /tmp/libk4a1.3_1.3.0_amd64.deb && \
|
||||||
echo "Download libk4a1.3-dev_1.3.0_amd64.deb..." && \
|
echo "Download libk4a1.3-dev_1.3.0_amd64.deb..." && \
|
||||||
@@ -84,7 +91,7 @@ RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then echo "Installing libfreenect2
|
|||||||
mkdir build && \
|
mkdir build && \
|
||||||
cd build && \
|
cd build && \
|
||||||
cmake .. && \
|
cmake .. && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd && \
|
cd && \
|
||||||
rm -r libfreenect2; fi
|
rm -r libfreenect2; fi
|
||||||
@@ -98,7 +105,7 @@ RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then echo "Installing zed-open-cap
|
|||||||
mkdir build && \
|
mkdir build && \
|
||||||
cd build && \
|
cd build && \
|
||||||
cmake .. && \
|
cmake .. && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd && \
|
cd && \
|
||||||
rm -r zed-open-capture; fi
|
rm -r zed-open-capture; fi
|
||||||
@@ -117,7 +124,7 @@ RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then git clone https://github.com/
|
|||||||
mkdir build && \
|
mkdir build && \
|
||||||
cd build && \
|
cd build && \
|
||||||
cmake -DUSE_PYTHON=OFF -DOIIO_BUILD_TESTS=OFF -DOIIO_BUILD_TOOLS=OFF .. && \
|
cmake -DUSE_PYTHON=OFF -DOIIO_BUILD_TESTS=OFF -DOIIO_BUILD_TOOLS=OFF .. && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd && \
|
cd && \
|
||||||
rm -r oiio; fi
|
rm -r oiio; fi
|
||||||
@@ -127,7 +134,7 @@ RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then git clone https://github.com/
|
|||||||
mkdir build && \
|
mkdir build && \
|
||||||
cd build && \
|
cd build && \
|
||||||
cmake .. && \
|
cmake .. && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd && \
|
cd && \
|
||||||
rm -r assimp; fi
|
rm -r assimp; fi
|
||||||
@@ -140,7 +147,7 @@ RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then git clone https://github.com/
|
|||||||
git apply geogram_8b2ae61.patch && \
|
git apply geogram_8b2ae61.patch && \
|
||||||
./configure.sh && \
|
./configure.sh && \
|
||||||
cd build/Linux64-gcc-dynamic-Release && \
|
cd build/Linux64-gcc-dynamic-Release && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd && \
|
cd && \
|
||||||
rm -r geogram; fi
|
rm -r geogram; fi
|
||||||
@@ -148,12 +155,12 @@ RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then git clone https://github.com/
|
|||||||
cd AliceVision && \
|
cd AliceVision && \
|
||||||
git checkout 0f6115b6af6183c524aa7fcf26141337c1cf3872 && \
|
git checkout 0f6115b6af6183c524aa7fcf26141337c1cf3872 && \
|
||||||
git submodule update -i && \
|
git submodule update -i && \
|
||||||
wget https://gist.githubusercontent.com/matlabbe/1df724465106c056ca4cc195c81d8cf0/raw/b3ed4cb8f9b270833a40d57d870a259eabfa4415/alicevision_0f6115b.patch && \
|
wget https://gist.githubusercontent.com/matlabbe/1df724465106c056ca4cc195c81d8cf0/raw/5e3437cf6229c8d534bbaee475ed9bcb92eb84a1/alicevision_0f6115b.patch && \
|
||||||
git apply alicevision_0f6115b.patch && \
|
git apply alicevision_0f6115b.patch && \
|
||||||
mkdir build && \
|
mkdir build && \
|
||||||
cd build && \
|
cd build && \
|
||||||
cmake -DALICEVISION_USE_CUDA=OFF -DALICEVISION_USE_APRILTAG=OFF -DALICEVISION_BUILD_SOFTWARE=OFF .. && \
|
cmake -DALICEVISION_USE_CUDA=OFF -DALICEVISION_USE_APRILTAG=OFF -DALICEVISION_BUILD_SOFTWARE=OFF .. && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd && \
|
cd && \
|
||||||
rm -r AliceVision; fi
|
rm -r AliceVision; fi
|
||||||
@@ -164,11 +171,25 @@ RUN git clone --branch 4.2.0 https://github.com/opencv/opencv.git && \
|
|||||||
mkdir build && \
|
mkdir build && \
|
||||||
cd build && \
|
cd build && \
|
||||||
cmake -DWITH_TBB=ON -DWITH_OPENMP=ON -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 -DWITH_VTK=OFF -DOPENCV_EXTRA_MODULES_PATH=/root/opencv_contrib/modules .. && \
|
cmake -DWITH_TBB=ON -DWITH_OPENMP=ON -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 -DWITH_VTK=OFF -DOPENCV_EXTRA_MODULES_PATH=/root/opencv_contrib/modules .. && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd ../.. && \
|
cd ../.. && \
|
||||||
rm -rf opencv opencv_contrib
|
rm -rf opencv opencv_contrib
|
||||||
|
|
||||||
|
RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then apt-get update && apt install wget && apt-get clean && rm -rf /var/lib/apt/lists/; fi
|
||||||
|
RUN git clone https://github.com/laurentkneip/opengv.git && \
|
||||||
|
cd opengv && \
|
||||||
|
git checkout 91f4b19c73450833a40e463ad3648aae80b3a7f3 && \
|
||||||
|
wget https://gist.githubusercontent.com/matlabbe/a412cf7c4627253874f81a00745a7fbb/raw/accc3acf465d1ffd0304a46b17741f62d4d354ef/opengv_disable_march_native.patch && \
|
||||||
|
git apply opengv_disable_march_native.patch && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_BUILD_TYPE=Release .. && \
|
||||||
|
make -j4 && \
|
||||||
|
make install && \
|
||||||
|
cd && \
|
||||||
|
rm -r opengv
|
||||||
|
|
||||||
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
|
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
|
||||||
|
|
||||||
# for jetson (https://github.com/introlab/rtabmap/issues/776)
|
# for jetson (https://github.com/introlab/rtabmap/issues/776)
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ COPY . /root/rtabmap
|
|||||||
RUN source /ros_entrypoint.sh && \
|
RUN source /ros_entrypoint.sh && \
|
||||||
cd rtabmap/build && \
|
cd rtabmap/build && \
|
||||||
cmake -DWITH_OPENGV=ON .. && \
|
cmake -DWITH_OPENGV=ON .. && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd ../.. && \
|
cd ../.. && \
|
||||||
rm -rf rtabmap && \
|
rm -rf rtabmap && \
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then echo "Installing libfreenect2
|
|||||||
mkdir build && \
|
mkdir build && \
|
||||||
cd build && \
|
cd build && \
|
||||||
cmake .. && \
|
cmake .. && \
|
||||||
make -j$(nproc) && \
|
make -j2 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd && \
|
cd && \
|
||||||
rm -r libfreenect2; fi
|
rm -r libfreenect2; fi
|
||||||
@@ -63,7 +63,7 @@ RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then echo "Installing zed-open-cap
|
|||||||
mkdir build && \
|
mkdir build && \
|
||||||
cd build && \
|
cd build && \
|
||||||
cmake .. && \
|
cmake .. && \
|
||||||
make -j$(nproc) && \
|
make -j2 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd && \
|
cd && \
|
||||||
rm -r zed-open-capture; fi
|
rm -r zed-open-capture; fi
|
||||||
@@ -74,7 +74,7 @@ RUN git clone --branch 4.5.4 https://github.com/opencv/opencv.git && \
|
|||||||
mkdir build && \
|
mkdir build && \
|
||||||
cd build && \
|
cd build && \
|
||||||
cmake -DWITH_TBB=ON -DWITH_OPENMP=ON -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=/root/opencv_contrib/modules .. && \
|
cmake -DWITH_TBB=ON -DWITH_OPENMP=ON -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=/root/opencv_contrib/modules .. && \
|
||||||
make -j$(nproc) && \
|
make -j2 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd ../.. && \
|
cd ../.. && \
|
||||||
rm -rf opencv opencv_contrib
|
rm -rf opencv opencv_contrib
|
||||||
@@ -90,14 +90,14 @@ RUN git clone https://github.com/laurentkneip/opengv.git && \
|
|||||||
mkdir build && \
|
mkdir build && \
|
||||||
cd build && \
|
cd build && \
|
||||||
cmake -DCMAKE_BUILD_TYPE=Release .. && \
|
cmake -DCMAKE_BUILD_TYPE=Release .. && \
|
||||||
make -j$(nproc) && \
|
make -j2 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd && \
|
cd && \
|
||||||
rm -r opengv
|
rm -r opengv
|
||||||
|
|
||||||
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
|
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
|
||||||
|
|
||||||
COPY ./docker/jammy/deps/ros_entrypoint.sh /ros_entrypoint.sh
|
RUN echo -e '#!/bin/bash\nset -e\n\n# setup ros2 environment\nsource "/opt/ros/humble/setup.bash" --\nexec "$@"' > /ros_entrypoint.sh
|
||||||
RUN chmod +x /ros_entrypoint.sh
|
RUN chmod +x /ros_entrypoint.sh
|
||||||
ENTRYPOINT [ "/ros_entrypoint.sh" ]
|
ENTRYPOINT [ "/ros_entrypoint.sh" ]
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# setup ros2 environment
|
|
||||||
source "/opt/ros/humble/setup.bash" --
|
|
||||||
exec "$@"
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# Image: introlab3it/rtabmap:noble-kilted
|
||||||
|
|
||||||
|
FROM introlab3it/rtabmap:noble-kilted-deps
|
||||||
|
|
||||||
|
# Will be used to read/store databases on host
|
||||||
|
RUN mkdir -p /root/Documents/RTAB-Map && chmod 777 /root/Documents/RTAB-Map
|
||||||
|
|
||||||
|
# Copy current source code
|
||||||
|
COPY . /root/rtabmap
|
||||||
|
|
||||||
|
# Build RTAB-Map project
|
||||||
|
RUN source /ros_entrypoint.sh && \
|
||||||
|
cd rtabmap/build && \
|
||||||
|
cmake -DWITH_OPENGV=ON .. && \
|
||||||
|
make -j4 && \
|
||||||
|
make install && \
|
||||||
|
cd ../.. && \
|
||||||
|
rm -rf rtabmap && \
|
||||||
|
ldconfig
|
||||||
|
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
|
||||||
|
# Image: introlab3it/rtabmap:noble-kilted-deps
|
||||||
|
|
||||||
|
FROM ubuntu:24.04
|
||||||
|
|
||||||
|
ARG TARGETPLATFORM
|
||||||
|
ENV TARGETPLATFORM=${TARGETPLATFORM:-linux/amd64}
|
||||||
|
RUN echo "I am building for $TARGETPLATFORM"
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
# Install ROS2
|
||||||
|
RUN apt update && \
|
||||||
|
apt install software-properties-common -y && \
|
||||||
|
add-apt-repository universe && \
|
||||||
|
apt update && \
|
||||||
|
apt install curl -y && \
|
||||||
|
curl -sSL 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 $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | tee /etc/apt/sources.list.d/ros2.list > /dev/null && \
|
||||||
|
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-kilted-ros-base \
|
||||||
|
ros-dev-tools \
|
||||||
|
ros-kilted-cv-bridge \
|
||||||
|
ros-kilted-image-geometry \
|
||||||
|
ros-kilted-laser-geometry \
|
||||||
|
ros-kilted-pcl-conversions \
|
||||||
|
ros-kilted-rviz-common \
|
||||||
|
ros-kilted-rviz-rendering \
|
||||||
|
ros-kilted-rviz-default-plugins \
|
||||||
|
ros-kilted-pcl-ros \
|
||||||
|
ros-kilted-imu-filter-madgwick \
|
||||||
|
ros-kilted-velodyne \
|
||||||
|
ros-kilted-image-transport \
|
||||||
|
ros-kilted-octomap-msgs \
|
||||||
|
ros-kilted-libg2o \
|
||||||
|
ros-kilted-libpointmatcher \
|
||||||
|
ros-kilted-qt-gui-cpp \
|
||||||
|
ros-kilted-diagnostic-updater && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
WORKDIR /root/
|
||||||
|
|
||||||
|
# GTSAM (we cannot use ros-kilted-gtsam on Noble because it is linked to a different internal Eigen version than system one)
|
||||||
|
RUN git clone https://github.com/borglab/gtsam.git && \
|
||||||
|
cd gtsam && \
|
||||||
|
git checkout 4.2.0 && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_BUILD_TYPE=Release -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF -DGTSAM_USE_SYSTEM_EIGEN=ON .. && \
|
||||||
|
make -j4 && \
|
||||||
|
make install && \
|
||||||
|
cd && \
|
||||||
|
rm -r gtsam
|
||||||
|
|
||||||
|
# libfreenect2
|
||||||
|
RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then echo "Installing libfreenect2..." && \
|
||||||
|
apt-get update && apt-get install -y mesa-utils xserver-xorg-video-all libusb-1.0-0-dev libturbojpeg0-dev libglfw3-dev && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/ && \
|
||||||
|
git clone https://github.com/OpenKinect/libfreenect2 && \
|
||||||
|
cd libfreenect2 && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_BUILD_TYPE=Release .. && \
|
||||||
|
make -j4 && \
|
||||||
|
make install && \
|
||||||
|
cd && \
|
||||||
|
rm -r libfreenect2; fi
|
||||||
|
|
||||||
|
# zed open capture
|
||||||
|
RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then echo "Installing zed-open-capture..." && \
|
||||||
|
apt-get update && apt install -y libusb-1.0-0-dev libhidapi-libusb0 libhidapi-dev wget && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/ && \
|
||||||
|
git clone https://github.com/stereolabs/zed-open-capture.git && \
|
||||||
|
cd zed-open-capture && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_BUILD_TYPE=Release .. && \
|
||||||
|
make -j4 && \
|
||||||
|
make install && \
|
||||||
|
cd && \
|
||||||
|
rm -r zed-open-capture; fi
|
||||||
|
|
||||||
|
# OpenCV with all modules (same version than distro version to avoid conflicts with cv_bridge ros package)
|
||||||
|
RUN git clone --branch 4.6.0 https://github.com/opencv/opencv.git && \
|
||||||
|
git clone --branch 4.6.0 https://github.com/opencv/opencv_contrib.git && \
|
||||||
|
cd opencv && \
|
||||||
|
sed -i '/#include <libavformat\/avformat.h>/i #include <libavcodec/version.h>' modules/videoio/src/ffmpeg_codecs.hpp && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TBB=ON -DWITH_ADE=OFF -DWITH_OPENMP=ON -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=/root/opencv_contrib/modules .. && \
|
||||||
|
make -j4 && \
|
||||||
|
make install && \
|
||||||
|
cd ../.. && \
|
||||||
|
rm -rf opencv opencv_contrib
|
||||||
|
|
||||||
|
RUN git clone https://github.com/laurentkneip/opengv.git && \
|
||||||
|
cd opengv && \
|
||||||
|
git checkout 91f4b19c73450833a40e463ad3648aae80b3a7f3 && \
|
||||||
|
wget https://gist.githubusercontent.com/matlabbe/a412cf7c4627253874f81a00745a7fbb/raw/accc3acf465d1ffd0304a46b17741f62d4d354ef/opengv_disable_march_native.patch && \
|
||||||
|
git apply opengv_disable_march_native.patch && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=OFF .. && \
|
||||||
|
make -j4 && \
|
||||||
|
make install && \
|
||||||
|
cd && \
|
||||||
|
rm -r opengv
|
||||||
|
|
||||||
|
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/kilted/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/kilted/lib/x86_64-linux-gnu:/opt/ros/kilted/lib/aarch64-linux-gnu
|
||||||
|
|
||||||
|
# for jetson (https://github.com/introlab/rtabmap/issues/776)
|
||||||
|
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/aarch64-linux-gnu/tegra
|
||||||
|
|
||||||
+1
-15
@@ -2,20 +2,6 @@
|
|||||||
|
|
||||||
FROM introlab3it/rtabmap:noble-deps
|
FROM introlab3it/rtabmap:noble-deps
|
||||||
|
|
||||||
# OpenGV (issue seg fault on my computer, moved here from noble-deps to be built on ci)
|
|
||||||
RUN git clone https://github.com/laurentkneip/opengv.git && \
|
|
||||||
cd opengv && \
|
|
||||||
git checkout 91f4b19c73450833a40e463ad3648aae80b3a7f3 && \
|
|
||||||
wget https://gist.githubusercontent.com/matlabbe/a412cf7c4627253874f81a00745a7fbb/raw/accc3acf465d1ffd0304a46b17741f62d4d354ef/opengv_disable_march_native.patch && \
|
|
||||||
git apply opengv_disable_march_native.patch && \
|
|
||||||
mkdir build && \
|
|
||||||
cd build && \
|
|
||||||
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=OFF .. && \
|
|
||||||
make -j$(nproc) && \
|
|
||||||
make install && \
|
|
||||||
cd && \
|
|
||||||
rm -r opengv
|
|
||||||
|
|
||||||
# Will be used to read/store databases on host
|
# Will be used to read/store databases on host
|
||||||
RUN mkdir -p /root/Documents/RTAB-Map && chmod 777 /root/Documents/RTAB-Map
|
RUN mkdir -p /root/Documents/RTAB-Map && chmod 777 /root/Documents/RTAB-Map
|
||||||
|
|
||||||
@@ -26,7 +12,7 @@ COPY . /root/rtabmap
|
|||||||
RUN source /ros_entrypoint.sh && \
|
RUN source /ros_entrypoint.sh && \
|
||||||
cd rtabmap/build && \
|
cd rtabmap/build && \
|
||||||
cmake -DWITH_OPENGV=ON .. && \
|
cmake -DWITH_OPENGV=ON .. && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd ../.. && \
|
cd ../.. && \
|
||||||
rm -rf rtabmap && \
|
rm -rf rtabmap && \
|
||||||
|
|||||||
@@ -0,0 +1,206 @@
|
|||||||
|
# Image: introlab3it/rtabmap:android-noble-deps
|
||||||
|
|
||||||
|
FROM ubuntu:24.04
|
||||||
|
|
||||||
|
# Install build dependencies
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends apt-utils
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
git unzip wget ant cmake \
|
||||||
|
g++ lib32stdc++6 lib32z1 \
|
||||||
|
software-properties-common \
|
||||||
|
freeglut3-dev \
|
||||||
|
openjdk-8-jdk openjdk-8-jre \
|
||||||
|
curl
|
||||||
|
|
||||||
|
ENV ANDROID_HOME=/opt/android-sdk
|
||||||
|
ENV PATH=$PATH:/opt/android-sdk/cmdline-tools/latest/bin:/opt/android-sdk/tools:/opt/android-sdk/platform-tools:/opt/android-sdk/ndk/21.4.7075529
|
||||||
|
ENV ANDROID_NDK=/opt/android-sdk/ndk/21.4.7075529
|
||||||
|
ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
|
||||||
|
|
||||||
|
WORKDIR /root/
|
||||||
|
|
||||||
|
# Setup android sdk
|
||||||
|
RUN wget -nv https://dl.google.com/android/repository/commandlinetools-linux-7583922_latest.zip && \
|
||||||
|
unzip -qq commandlinetools-linux-7583922_latest.zip && \
|
||||||
|
rm commandlinetools-linux-7583922_latest.zip && \
|
||||||
|
mkdir $ANDROID_HOME && \
|
||||||
|
mkdir $ANDROID_HOME/cmdline-tools && \
|
||||||
|
mv cmdline-tools $ANDROID_HOME/cmdline-tools/latest
|
||||||
|
# We should use build-tools <=30 to avoid dx missing error
|
||||||
|
RUN echo y | sdkmanager --install "platform-tools" "platforms;android-23" "platforms;android-24" "platforms;android-26" "platforms;android-30" "build-tools;30.0.3" "ndk;21.4.7075529"
|
||||||
|
|
||||||
|
# we need <=r25 tools to use "android" command (now deprecated)
|
||||||
|
RUN wget -nv http://dl-ssl.google.com/android/repository/tools_r25.2.5-linux.zip && \
|
||||||
|
unzip -qq tools_r25.2.5-linux.zip && \
|
||||||
|
mv tools $ANDROID_HOME/. && \
|
||||||
|
rm tools_r25.2.5-linux.zip
|
||||||
|
|
||||||
|
##############
|
||||||
|
# Dependencies (took from docker/bionic/android/deps.bash)
|
||||||
|
##############
|
||||||
|
|
||||||
|
# Install directory for all dependencies
|
||||||
|
RUN mkdir -p /opt/android/arm64-v8a
|
||||||
|
|
||||||
|
# Boost
|
||||||
|
RUN echo "Install boost..." && \
|
||||||
|
wget -nv https://downloads.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz && \
|
||||||
|
tar -xzf boost_1_59_0.tar.gz && \
|
||||||
|
cd boost_1_59_0 && \
|
||||||
|
wget -nv https://gist.github.com/matlabbe/0bce8feeb73a499a76afbbcc5c687221/raw/1733253195bc4d4d9b7f9eda1e60628dc1e51429/BoostConfig.cmake.in && \
|
||||||
|
wget -nv https://gist.github.com/matlabbe/0bce8feeb73a499a76afbbcc5c687221/raw/1733253195bc4d4d9b7f9eda1e60628dc1e51429/CMakeLists.txt && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_NDK=$ANDROID_NDK -DANDROID_NATIVE_API_LEVEL=23 -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" .. && \
|
||||||
|
make -j4 && \
|
||||||
|
make install && \
|
||||||
|
cd /root && \
|
||||||
|
rm -r boost_1_59_0.tar.gz boost_1_59_0
|
||||||
|
|
||||||
|
# eigen
|
||||||
|
RUN echo "Install eigen..." && \
|
||||||
|
curl -L https://gitlab.com/libeigen/eigen/-/archive/3.3.9/eigen-3.3.9.tar.gz -o 3.3.9.tar.gz && \
|
||||||
|
tar -xzf 3.3.9.tar.gz && \
|
||||||
|
cd eigen-3.3.9 && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_NDK=$ANDROID_NDK -DANDROID_NATIVE_API_LEVEL=23 -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" .. && \
|
||||||
|
make -j4 && \
|
||||||
|
make install && \
|
||||||
|
cd /root && \
|
||||||
|
rm -r 3.3.9.tar.gz eigen-3.3.9
|
||||||
|
|
||||||
|
# FLANN
|
||||||
|
RUN echo "Install flann..." && \
|
||||||
|
git clone -b 1.8.4 https://github.com/mariusmuja/flann.git && \
|
||||||
|
cd flann && \
|
||||||
|
wget -nv https://gist.githubusercontent.com/matlabbe/cacff9f8271d0c42acd622939a26cab4/raw/85baf4927b32844ebd7f8eccce421bde181cd190/flann_1_8_4_android_fix.patch && \
|
||||||
|
git apply flann_1_8_4_android_fix.patch && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_NDK=$ANDROID_NDK -DANDROID_NATIVE_API_LEVEL=23 -DBUILD_SHARED_LIBS=OFF -DBUILD_PYTHON_BINDINGS=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" .. && \
|
||||||
|
make -j4 && \
|
||||||
|
make install && \
|
||||||
|
cd /root && \
|
||||||
|
rm -rf flann
|
||||||
|
|
||||||
|
# GTSAM
|
||||||
|
RUN echo "Install gtsam..." && \
|
||||||
|
git clone https://bitbucket.org/gtborg/gtsam.git && \
|
||||||
|
cd gtsam && \
|
||||||
|
git checkout fbb9d3bdda8b88df51896bc401bfd170573e66f5 && \
|
||||||
|
wget -nv https://gist.github.com/matlabbe/726b490c658afd3293f4b3f2f501b863/raw/df09fc8e238a495d66b062d92dc1c1fb20a581e8/gtsam_GKlib_android_fix.patch && \
|
||||||
|
git apply gtsam_GKlib_android_fix.patch && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_NDK=$ANDROID_NDK -DANDROID_NATIVE_API_LEVEL=23 -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" -DMETIS_SHARED=OFF -DGTSAM_BUILD_STATIC_LIBRARY=ON -DGTSAM_BUILD_TESTS=OFF -DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF -DGTSAM_USE_SYSTEM_EIGEN=ON .. && \
|
||||||
|
make -j4 && \
|
||||||
|
make install && \
|
||||||
|
cd /root && \
|
||||||
|
rm -rf gtsam
|
||||||
|
|
||||||
|
# g2o
|
||||||
|
RUN echo "Install g2o..." && \
|
||||||
|
git clone https://github.com/RainerKuemmerle/g2o.git && \
|
||||||
|
cd g2o && \
|
||||||
|
git checkout a3f7706bdbb849b2808dc3e1b7aee189f63b498e && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_NDK=$ANDROID_NDK -DANDROID_NATIVE_API_LEVEL=23 -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_LGPL_SHARED_LIBS=OFF -DG2O_BUILD_APPS=OFF -DG2O_BUILD_EXAMPLES=OFF -DG2O_USE_OPENGL=OFF .. && \
|
||||||
|
make -j4 && \
|
||||||
|
make install && \
|
||||||
|
cd /root && \
|
||||||
|
rm -rf g2o
|
||||||
|
|
||||||
|
# VTK
|
||||||
|
RUN echo "Install VTK..." && \
|
||||||
|
git clone https://github.com/Kitware/VTK.git && \
|
||||||
|
cd VTK && \
|
||||||
|
git checkout tags/v8.2.0 && \
|
||||||
|
wget https://gist.github.com/matlabbe/e217259fb8ece9ee6daf5a8f70e896a0/raw/2214b503a537d6431d764526b5b780f07d6f168d/vtk_8_2_0_android_r21_fix.patch && \
|
||||||
|
git apply vtk_8_2_0_android_r21_fix.patch && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF -DVTK_ANDROID_BUILD=ON -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/android/arm64-v8a -DANDROID_ARCH_ABI=arm64-v8a -DCMAKE_FIND_ROOT_PATH="/opt/android/arm64-v8a/bin;/opt/android/arm64-v8a;/opt/android/arm64-v8a/share" .. && \
|
||||||
|
make -j4 && \
|
||||||
|
cp -r CMakeExternals/Install/vtk-android/* /opt/android/arm64-v8a/. && \
|
||||||
|
cd /root && \
|
||||||
|
rm -rf VTK
|
||||||
|
|
||||||
|
# PCL
|
||||||
|
RUN echo "Install pcl..." && \
|
||||||
|
git clone https://github.com/PointCloudLibrary/pcl.git && \
|
||||||
|
cd pcl && \
|
||||||
|
git checkout tags/pcl-1.8.0 && \
|
||||||
|
wget https://gist.github.com/matlabbe/41812e50e459b2f27b331a2343569e5d/raw/b2fc0c4d1cfffb3a9f2811abae782e317c539bfb/pcl_1_8_0_vtk_android_support.patch && \
|
||||||
|
git apply pcl_1_8_0_vtk_android_support.patch && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
# do it 2 times because there is a cmake error on the first time and not the second time!?
|
||||||
|
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_NDK=$ANDROID_NDK -DANDROID_NATIVE_API_LEVEL=23 -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_apps=OFF -DBUILD_examples=OFF -DBUILD_tools=OFF -DBUILD_visualization=OFF -DBUILD_tracking=OFF -DBUILD_people=OFF -DBUILD_tools=OFF -DBUILD_global_tests=OFF -DWITH_QT=OFF -DWITH_OPENGL=OFF -DWITH_VTK=ON -DPCL_SHARED_LIBS=OFF .. || true && \
|
||||||
|
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_NDK=$ANDROID_NDK -DANDROID_NATIVE_API_LEVEL=23 -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_apps=OFF -DBUILD_examples=OFF -DBUILD_tools=OFF -DBUILD_visualization=OFF -DBUILD_tracking=OFF -DBUILD_people=OFF -DBUILD_tools=OFF -DBUILD_global_tests=OFF -DWITH_QT=OFF -DWITH_OPENGL=OFF -DWITH_VTK=ON -DPCL_SHARED_LIBS=OFF .. && \
|
||||||
|
make -j4 && \
|
||||||
|
make install && \
|
||||||
|
cd /root && \
|
||||||
|
rm -rf pcl
|
||||||
|
|
||||||
|
# make sure opencv is using the shared version of zlib
|
||||||
|
# see https://github.com/android/ndk/issues/1179
|
||||||
|
RUN mv $ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libz.a $ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libz.a.back
|
||||||
|
|
||||||
|
# OpenCV
|
||||||
|
RUN echo "Install OpenCV..." && \
|
||||||
|
git clone https://github.com/opencv/opencv_contrib.git && \
|
||||||
|
git clone https://github.com/opencv/opencv.git && \
|
||||||
|
cd opencv_contrib && \
|
||||||
|
git checkout tags/4.5.5 && \
|
||||||
|
cd /root && \
|
||||||
|
cd opencv && \
|
||||||
|
git checkout tags/4.5.5 && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_NDK=$ANDROID_NDK -DANDROID_NATIVE_API_LEVEL=23 -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" -DOPENCV_EXTRA_MODULES_PATH=/root/opencv_contrib/modules -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DWITH_CUDA=OFF -DBUILD_opencv_structured_light=OFF -DBUILD_ANDROID_PROJECTS=OFF -DOPENCV_ENABLE_NONFREE=ON -DBUILD_ANDROID_EXAMPLES=OFF -DWITH_PROTOBUF=OFF -DBUILD_opencv_stereo=OFF -DBUILD_JAVA=OFF -DWITH_QUIRC=OFF -DBUILD_opencv_js_bindings_generator=OFF -DBUILD_opencv_objc_bindings_generator=OFF -DBUILD_opencv_objdetect=OFF -DBUILD_opencv_xobjdetect=OFF .. && \
|
||||||
|
make -j4 && \
|
||||||
|
make install && \
|
||||||
|
cd /root && \
|
||||||
|
rm -rf opencv opencv_contrib
|
||||||
|
|
||||||
|
RUN echo "Strip libraries..." && \
|
||||||
|
$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-strip -g -S -d --strip-debug --verbose /opt/android/arm64-v8a/lib/*.a && \
|
||||||
|
$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-strip -g -S -d --strip-debug --verbose /opt/android/arm64-v8a/sdk/native/staticlibs/arm64-v8a/*.a
|
||||||
|
|
||||||
|
RUN mkdir /opt/android/lib
|
||||||
|
|
||||||
|
# tango
|
||||||
|
RUN wget 'https://docs.google.com/uc?authuser=0&id=12rHHkYM5k-UnQn-xGXs9JqYWhSXrgJr3&export=download' -O TangoSDK_Ikariotikos_C.zip && \
|
||||||
|
unzip -qq TangoSDK_Ikariotikos_C.zip && \
|
||||||
|
rm TangoSDK_Ikariotikos_C.zip && \
|
||||||
|
cp -r lib_tango_client_api/include/* /opt/android/arm64-v8a/include/. && \
|
||||||
|
cp -r lib_tango_client_api/lib/arm64-v8a/* /opt/android/arm64-v8a/lib/. && \
|
||||||
|
rm -r lib_tango_client_api && \
|
||||||
|
wget 'https://docs.google.com/uc?authuser=0&id=1AqVuEVu5284X6OgrGWu12VTrx4pY99Jb&export=download' -O TangoSupport_Ikariotikos_C.zip && \
|
||||||
|
unzip -qq TangoSupport_Ikariotikos_C.zip && \
|
||||||
|
rm TangoSupport_Ikariotikos_C.zip && \
|
||||||
|
cp -r lib_tango_support_api/include/* /opt/android/arm64-v8a/include/. && \
|
||||||
|
cp -r lib_tango_support_api/lib/arm64-v8a/* /opt/android/arm64-v8a/lib/. && \
|
||||||
|
rm -r lib_tango_support_api && \
|
||||||
|
wget 'https://docs.google.com/uc?authuser=0&id=1s5iPJ7xiridj9Jj--gCy2XiQFniheVm6&export=download' -O TangoSDK_Ikariotikos_Java.jar && \
|
||||||
|
mv TangoSDK_Ikariotikos_Java.jar /opt/android/lib/
|
||||||
|
|
||||||
|
# ARCore
|
||||||
|
RUN wget 'https://docs.google.com/uc?authuser=0&id=1VsibeqRYpS5pjmrG-vYTXyiPg8kbIfVN&export=download' -O arcore.zip && \
|
||||||
|
unzip -qq arcore.zip && \
|
||||||
|
rm arcore.zip && \
|
||||||
|
cp -r arcore1_18/include/* /opt/android/arm64-v8a/include/. && \
|
||||||
|
cp -r arcore1_18/arm64-v8a/* /opt/android/arm64-v8a/lib/. && \
|
||||||
|
cp arcore1_18/*.jar /opt/android/lib/ && \
|
||||||
|
rm -r arcore1_18
|
||||||
|
|
||||||
|
# AREngine
|
||||||
|
RUN wget 'https://docs.google.com/uc?authuser=0&id=1rdaD2Z1QBv-SUeUy0oBmg3C2odfxTHgR&export=download' -O arengine.zip && \
|
||||||
|
unzip -qq arengine.zip && \
|
||||||
|
rm arengine.zip && \
|
||||||
|
cp -r arengine/include/* /opt/android/arm64-v8a/include/. && \
|
||||||
|
cp -r arengine/arm64-v8a/* /opt/android/arm64-v8a/lib/. && \
|
||||||
|
cp arengine/*.jar /opt/android/lib/ && \
|
||||||
|
rm -r arengine
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
# Image: introlab3it/rtabmap:androidXX
|
||||||
|
|
||||||
|
FROM introlab3it/rtabmap:android-noble-deps
|
||||||
|
|
||||||
|
ARG API_VERSION=23
|
||||||
|
|
||||||
|
# Copy current source code
|
||||||
|
COPY . /root/rtabmap-tango
|
||||||
|
|
||||||
|
WORKDIR /root/rtabmap-tango
|
||||||
|
|
||||||
|
RUN /bin/bash -c "./docker/noble/android/rtabmap_apiXX/rtabmap.bash /opt/android $API_VERSION"
|
||||||
|
|
||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ $# -ne 2 ]; then
|
||||||
|
echo "rtabmap.bash android_install_prefix api_level (23 for tango, 24 for arengine) # Example: build.bash /opt/android 24"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
prefix=$1
|
||||||
|
api=$2
|
||||||
|
|
||||||
|
# copy required jars
|
||||||
|
cp /opt/android/lib/*.jar app/android/libs/.
|
||||||
|
|
||||||
|
# resource tool
|
||||||
|
cd build
|
||||||
|
cmake -DANDROID_PREBUILD=ON ..
|
||||||
|
make
|
||||||
|
|
||||||
|
# rtabmap
|
||||||
|
mkdir arm64-v8a
|
||||||
|
cd 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=$api -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$prefix/arm64-v8a -DCMAKE_FIND_ROOT_PATH="$prefix/arm64-v8a/bin;$prefix/arm64-v8a;$prefix/arm64-v8a/share" -DBUILD_EXAMPLES=OFF -DBUILD_TOOLS=OFF -DOpenCV_DIR=$prefix/arm64-v8a/sdk/native/jni ../..
|
||||||
|
make
|
||||||
|
make clean
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ RUN git clone https://github.com/borglab/gtsam.git && \
|
|||||||
mkdir build && \
|
mkdir build && \
|
||||||
cd build && \
|
cd build && \
|
||||||
cmake -DCMAKE_BUILD_TYPE=Release -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF -DGTSAM_USE_SYSTEM_EIGEN=ON .. && \
|
cmake -DCMAKE_BUILD_TYPE=Release -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF -DGTSAM_USE_SYSTEM_EIGEN=ON .. && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd && \
|
cd && \
|
||||||
rm -r gtsam
|
rm -r gtsam
|
||||||
@@ -72,7 +72,7 @@ RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then echo "Installing libfreenect2
|
|||||||
mkdir build && \
|
mkdir build && \
|
||||||
cd build && \
|
cd build && \
|
||||||
cmake -DCMAKE_BUILD_TYPE=Release .. && \
|
cmake -DCMAKE_BUILD_TYPE=Release .. && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd && \
|
cd && \
|
||||||
rm -r libfreenect2; fi
|
rm -r libfreenect2; fi
|
||||||
@@ -86,29 +86,40 @@ RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then echo "Installing zed-open-cap
|
|||||||
mkdir build && \
|
mkdir build && \
|
||||||
cd build && \
|
cd build && \
|
||||||
cmake -DCMAKE_BUILD_TYPE=Release .. && \
|
cmake -DCMAKE_BUILD_TYPE=Release .. && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd && \
|
cd && \
|
||||||
rm -r zed-open-capture; fi
|
rm -r zed-open-capture; fi
|
||||||
|
|
||||||
# OpenCV with all modules (same version than distro version to avoid conflicts with cv_bridge ros package)
|
# OpenCV with all modules (same version than distro version to avoid conflicts with cv_bridge ros package)
|
||||||
COPY ./docker/noble/deps/opencv_4_6_0_ffmpeg.patch .
|
|
||||||
RUN git clone --branch 4.6.0 https://github.com/opencv/opencv.git && \
|
RUN git clone --branch 4.6.0 https://github.com/opencv/opencv.git && \
|
||||||
git clone --branch 4.6.0 https://github.com/opencv/opencv_contrib.git && \
|
git clone --branch 4.6.0 https://github.com/opencv/opencv_contrib.git && \
|
||||||
mv opencv_4_6_0_ffmpeg.patch opencv/. && \
|
|
||||||
cd opencv && \
|
cd opencv && \
|
||||||
git apply opencv_4_6_0_ffmpeg.patch && \
|
sed -i '/#include <libavformat\/avformat.h>/i #include <libavcodec/version.h>' modules/videoio/src/ffmpeg_codecs.hpp && \
|
||||||
mkdir build && \
|
mkdir build && \
|
||||||
cd build && \
|
cd build && \
|
||||||
cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TBB=ON -DWITH_ADE=OFF -DWITH_OPENMP=ON -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=/root/opencv_contrib/modules .. && \
|
cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TBB=ON -DWITH_ADE=OFF -DWITH_OPENMP=ON -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=/root/opencv_contrib/modules .. && \
|
||||||
make -j$(nproc) && \
|
make -j4 && \
|
||||||
make install && \
|
make install && \
|
||||||
cd ../.. && \
|
cd ../.. && \
|
||||||
rm -rf opencv opencv_contrib
|
rm -rf opencv opencv_contrib
|
||||||
|
|
||||||
|
RUN git clone https://github.com/laurentkneip/opengv.git && \
|
||||||
|
cd opengv && \
|
||||||
|
git checkout 91f4b19c73450833a40e463ad3648aae80b3a7f3 && \
|
||||||
|
wget https://gist.githubusercontent.com/matlabbe/a412cf7c4627253874f81a00745a7fbb/raw/accc3acf465d1ffd0304a46b17741f62d4d354ef/opengv_disable_march_native.patch && \
|
||||||
|
git apply opengv_disable_march_native.patch && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=OFF .. && \
|
||||||
|
make -j4 && \
|
||||||
|
make install && \
|
||||||
|
cd && \
|
||||||
|
rm -r opengv
|
||||||
|
|
||||||
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
|
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
|
||||||
|
|
||||||
COPY ./docker/noble/deps/ros_entrypoint.sh /ros_entrypoint.sh
|
RUN echo -e '#!/bin/bash\nset -e\n\n# setup ros2 environment\nsource "/opt/ros/jazzy/setup.bash" --\nexec "$@"' > /ros_entrypoint.sh
|
||||||
RUN chmod +x /ros_entrypoint.sh
|
RUN chmod +x /ros_entrypoint.sh
|
||||||
ENTRYPOINT [ "/ros_entrypoint.sh" ]
|
ENTRYPOINT [ "/ros_entrypoint.sh" ]
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
diff --git a/modules/videoio/src/ffmpeg_codecs.hpp b/modules/videoio/src/ffmpeg_codecs.hpp
|
|
||||||
index 61788e0345..faad2596ed 100644
|
|
||||||
--- a/modules/videoio/src/ffmpeg_codecs.hpp
|
|
||||||
+++ b/modules/videoio/src/ffmpeg_codecs.hpp
|
|
||||||
@@ -60,6 +60,7 @@ extern "C" {
|
|
||||||
#include <errno.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+#include <libavcodec/version.h>
|
|
||||||
#include <libavformat/avformat.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# setup ros2 environment
|
|
||||||
source "/opt/ros/jazzy/setup.bash" --
|
|
||||||
exec "$@"
|
|
||||||
@@ -256,7 +256,8 @@ int main(int argc, char * argv[])
|
|||||||
node.sensorData(),
|
node.sensorData(),
|
||||||
4, // image decimation before creating the clouds
|
4, // image decimation before creating the clouds
|
||||||
4.0f, // maximum depth of the cloud
|
4.0f, // maximum depth of the cloud
|
||||||
0.0f);
|
0.0f,
|
||||||
|
0);
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr tmpNoNaN(new pcl::PointCloud<pcl::PointXYZRGB>);
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr tmpNoNaN(new pcl::PointCloud<pcl::PointXYZRGB>);
|
||||||
std::vector<int> index;
|
std::vector<int> index;
|
||||||
pcl::removeNaNFromPointCloud(*tmp, *tmpNoNaN, index);
|
pcl::removeNaNFromPointCloud(*tmp, *tmpNoNaN, index);
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ public:
|
|||||||
void updateLocalPath(const std::vector<int> & localPath);
|
void updateLocalPath(const std::vector<int> & localPath);
|
||||||
void setGlobalPath(const std::vector<std::pair<int, Transform> > & globalPath);
|
void setGlobalPath(const std::vector<std::pair<int, Transform> > & globalPath);
|
||||||
void setCurrentGoalID(int id, const Transform & pose = Transform());
|
void setCurrentGoalID(int id, const Transform & pose = Transform());
|
||||||
|
void setNodeInfo(int id, const QString & info);
|
||||||
void setLocalRadius(float radius);
|
void setLocalRadius(float radius);
|
||||||
void highlightNode(int nodeId, int highlightIndex);
|
void highlightNode(int nodeId, int highlightIndex);
|
||||||
void clearGraph();
|
void clearGraph();
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ public:
|
|||||||
QRectF sceneRect() const;
|
QRectF sceneRect() const;
|
||||||
bool isImageShown() const;
|
bool isImageShown() const;
|
||||||
bool isImageDepthShown() const;
|
bool isImageDepthShown() const;
|
||||||
|
bool isImageDepthConfidenceShown() const;
|
||||||
bool isFeaturesShown() const;
|
bool isFeaturesShown() const;
|
||||||
bool isLinesShown() const;
|
bool isLinesShown() const;
|
||||||
int getAlpha() const {return _alpha;}
|
int getAlpha() const {return _alpha;}
|
||||||
@@ -82,6 +83,7 @@ public:
|
|||||||
void setFeaturesShown(bool shown);
|
void setFeaturesShown(bool shown);
|
||||||
void setImageShown(bool shown);
|
void setImageShown(bool shown);
|
||||||
void setImageDepthShown(bool shown);
|
void setImageDepthShown(bool shown);
|
||||||
|
void setImageDepthConfidenceShown(bool shown);
|
||||||
void setLinesShown(bool shown);
|
void setLinesShown(bool shown);
|
||||||
void setGraphicsViewMode(bool on);
|
void setGraphicsViewMode(bool on);
|
||||||
void setGraphicsViewScaled(bool scaled);
|
void setGraphicsViewScaled(bool scaled);
|
||||||
@@ -98,8 +100,8 @@ public:
|
|||||||
void addFeature(int id, const cv::KeyPoint & kpt, float depth, QColor color);
|
void addFeature(int id, const cv::KeyPoint & kpt, float depth, QColor color);
|
||||||
void addLine(float x1, float y1, float x2, float y2, QColor color, const QString & text = QString());
|
void addLine(float x1, float y1, float x2, float y2, QColor color, const QString & text = QString());
|
||||||
void setImage(const QImage & image, const std::vector<CameraModel> & models = std::vector<CameraModel>(), const Transform & pose = Transform());
|
void setImage(const QImage & image, const std::vector<CameraModel> & models = std::vector<CameraModel>(), const Transform & pose = Transform());
|
||||||
void setImageDepth(const cv::Mat & imageDepth);
|
void setImageDepth(const cv::Mat & imageDepth, const cv::Mat & imageDepthConfidence = cv::Mat());
|
||||||
void setImageDepth(const QImage & image);
|
void setImageDepth(const QImage & image, const QImage & imageDepthConfidence = QImage());
|
||||||
void setFeatureColor(int id, QColor color);
|
void setFeatureColor(int id, QColor color);
|
||||||
void setFeaturesColor(QColor color);
|
void setFeaturesColor(QColor color);
|
||||||
void setAlpha(int alpha);
|
void setAlpha(int alpha);
|
||||||
@@ -147,6 +149,7 @@ private:
|
|||||||
QMenu * _menu;
|
QMenu * _menu;
|
||||||
QAction * _showImage;
|
QAction * _showImage;
|
||||||
QAction * _showImageDepth;
|
QAction * _showImageDepth;
|
||||||
|
QAction * _showImageDepthConfidence;
|
||||||
QAction * _showFeatures;
|
QAction * _showFeatures;
|
||||||
QAction * _showLines;
|
QAction * _showLines;
|
||||||
QAction * _setFeatureColor;
|
QAction * _setFeatureColor;
|
||||||
@@ -175,9 +178,12 @@ private:
|
|||||||
QList<QGraphicsLineItem*> _lines;
|
QList<QGraphicsLineItem*> _lines;
|
||||||
QGraphicsPixmapItem * _imageItem;
|
QGraphicsPixmapItem * _imageItem;
|
||||||
QGraphicsPixmapItem * _imageDepthItem;
|
QGraphicsPixmapItem * _imageDepthItem;
|
||||||
|
QGraphicsPixmapItem * _imageDepthConfidenceItem;
|
||||||
QPixmap _image;
|
QPixmap _image;
|
||||||
QPixmap _imageDepth;
|
QPixmap _imageDepth;
|
||||||
|
QPixmap _imageDepthConfidence;
|
||||||
cv::Mat _imageDepthCv;
|
cv::Mat _imageDepthCv;
|
||||||
|
cv::Mat _imageDepthConfidenceCv;
|
||||||
std::vector<CameraModel> _models;
|
std::vector<CameraModel> _models;
|
||||||
Transform _pose;
|
Transform _pose;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -208,6 +208,7 @@ public:
|
|||||||
double getCloudMaxDepth(int index) const; // 0=map, 1=odom
|
double getCloudMaxDepth(int index) const; // 0=map, 1=odom
|
||||||
double getCloudMinDepth(int index) const; // 0=map, 1=odom
|
double getCloudMinDepth(int index) const; // 0=map, 1=odom
|
||||||
std::vector<float> getCloudRoiRatios(int index) const; // 0=map, 1=odom
|
std::vector<float> getCloudRoiRatios(int index) const; // 0=map, 1=odom
|
||||||
|
unsigned char getCloudConfidenceThr(int index) const; // 0=map, 1=odom
|
||||||
int getCloudColorScheme(int index) const; // 0=map, 1=odom
|
int getCloudColorScheme(int index) const; // 0=map, 1=odom
|
||||||
double getCloudOpacity(int index) const; // 0=map, 1=odom
|
double getCloudOpacity(int index) const; // 0=map, 1=odom
|
||||||
int getCloudPointSize(int index) const; // 0=map, 1=odom
|
int getCloudPointSize(int index) const; // 0=map, 1=odom
|
||||||
@@ -466,6 +467,7 @@ private:
|
|||||||
QVector<QDoubleSpinBox*> _3dRenderingMaxDepth;
|
QVector<QDoubleSpinBox*> _3dRenderingMaxDepth;
|
||||||
QVector<QDoubleSpinBox*> _3dRenderingMinDepth;
|
QVector<QDoubleSpinBox*> _3dRenderingMinDepth;
|
||||||
QVector<QLineEdit*> _3dRenderingRoiRatios;
|
QVector<QLineEdit*> _3dRenderingRoiRatios;
|
||||||
|
QVector<QSpinBox*> _3dRenderingDepthConfidenceThr;
|
||||||
QVector<QSpinBox*> _3dRenderingColorScheme;
|
QVector<QSpinBox*> _3dRenderingColorScheme;
|
||||||
QVector<QDoubleSpinBox*> _3dRenderingOpacity;
|
QVector<QDoubleSpinBox*> _3dRenderingOpacity;
|
||||||
QVector<QSpinBox*> _3dRenderingPtSize;
|
QVector<QSpinBox*> _3dRenderingPtSize;
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ enum uCvQtDepthColorMap{
|
|||||||
* depth (float32, uint16) image and RGB/BGR 8bits images.
|
* depth (float32, uint16) image and RGB/BGR 8bits images.
|
||||||
* @param image the cv::Mat image (can be 1 channel [CV_8U, CV_16U or CV_32F] or 3 channels [CV_U8])
|
* @param image the cv::Mat image (can be 1 channel [CV_8U, CV_16U or CV_32F] or 3 channels [CV_U8])
|
||||||
* @param isBgr if 3 channels, it is BGR or RGB order.
|
* @param isBgr if 3 channels, it is BGR or RGB order.
|
||||||
* @param colorMap gradient of color to use to visualize depth
|
* @param colorMap gradient of color to use to visualize depth or monochrome images
|
||||||
* @param depthMin fixed minimum range (m) of the depth gradient (if depthMax<=depthMin, max/min are computed based on data in depth image)
|
* @param depthMin fixed minimum range (m) of the depth gradient (if depthMax<=depthMin, max/min are computed based on data in depth image)
|
||||||
* @param depthMax fixed maximum range (m) of the depth gradient (if depthMax<=depthMin, max/min are computed based on data in depth image)
|
* @param depthMax fixed maximum range (m) of the depth gradient (if depthMax<=depthMin, max/min are computed based on data in depth image)
|
||||||
* @return the QImage
|
* @return the QImage
|
||||||
@@ -47,7 +47,7 @@ enum uCvQtDepthColorMap{
|
|||||||
inline QImage uCvMat2QImage(
|
inline QImage uCvMat2QImage(
|
||||||
const cv::Mat & image,
|
const cv::Mat & image,
|
||||||
bool isBgr = true,
|
bool isBgr = true,
|
||||||
uCvQtDepthColorMap colorMap = uCvQtDepthWhiteToBlack,
|
uCvQtDepthColorMap colorMap = uCvQtDepthBlackToWhite,
|
||||||
float depthMin = 0,
|
float depthMin = 0,
|
||||||
float depthMax = 0)
|
float depthMax = 0)
|
||||||
{
|
{
|
||||||
@@ -81,9 +81,30 @@ inline QImage uCvMat2QImage(
|
|||||||
{
|
{
|
||||||
// mono grayscale
|
// mono grayscale
|
||||||
qtemp = QImage(image.data, image.cols, image.rows, image.cols, QImage::Format_Indexed8).copy();
|
qtemp = QImage(image.data, image.cols, image.rows, image.cols, QImage::Format_Indexed8).copy();
|
||||||
|
|
||||||
QVector<QRgb> my_table;
|
QVector<QRgb> my_table;
|
||||||
for(int i = 0; i < 256; i++)
|
my_table.reserve(256);
|
||||||
my_table.push_back(qRgb(i,i,i));
|
if(colorMap == uCvQtDepthRedToBlue || colorMap == uCvQtDepthBlueToRed)
|
||||||
|
{
|
||||||
|
if(colorMap == uCvQtDepthBlueToRed) {
|
||||||
|
for(int i = 0; i < 256; i++)
|
||||||
|
my_table.push_back(QColor::fromHsv(255-i, 255, 255, 255).rgb());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for(int i = 0; i < 256; i++)
|
||||||
|
my_table.push_back(QColor::fromHsv(i, 255, 255, 255).rgb());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(colorMap == uCvQtDepthBlackToWhite)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < 256; i++)
|
||||||
|
my_table.push_back(qRgb(i,i,i));
|
||||||
|
}
|
||||||
|
else // uCvQtDepthWhiteToBlack
|
||||||
|
{
|
||||||
|
for(int i = 0; i < 256; i++)
|
||||||
|
my_table.push_back(qRgb(255-i,255-i,255-i));
|
||||||
|
}
|
||||||
qtemp.setColorTable(my_table);
|
qtemp.setColorTable(my_table);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -427,6 +427,10 @@ DatabaseViewer::DatabaseViewer(const QString & ini, QWidget * parent) :
|
|||||||
connect(ui_->checkBox_showDisparityInsteadOfRight, SIGNAL(stateChanged(int)), this, SLOT(update3dView()));
|
connect(ui_->checkBox_showDisparityInsteadOfRight, SIGNAL(stateChanged(int)), this, SLOT(update3dView()));
|
||||||
connect(ui_->spinBox_decimation, SIGNAL(valueChanged(int)), this, SLOT(updateConstraintView()));
|
connect(ui_->spinBox_decimation, SIGNAL(valueChanged(int)), this, SLOT(updateConstraintView()));
|
||||||
connect(ui_->spinBox_decimation, SIGNAL(valueChanged(int)), this, SLOT(update3dView()));
|
connect(ui_->spinBox_decimation, SIGNAL(valueChanged(int)), this, SLOT(update3dView()));
|
||||||
|
connect(ui_->spinBox_depthConfidence, SIGNAL(valueChanged(int)), this, SLOT(updateConstraintView()));
|
||||||
|
connect(ui_->spinBox_depthConfidence, SIGNAL(valueChanged(int)), this, SLOT(update3dView()));
|
||||||
|
connect(ui_->doubleSpinBox_depthEdgeBleedingError, SIGNAL(valueChanged(double)), this, SLOT(updateConstraintView()));
|
||||||
|
connect(ui_->doubleSpinBox_depthEdgeBleedingError, SIGNAL(valueChanged(double)), this, SLOT(update3dView()));
|
||||||
connect(ui_->groupBox_posefiltering, SIGNAL(clicked(bool)), this, SLOT(updateGraphView()));
|
connect(ui_->groupBox_posefiltering, SIGNAL(clicked(bool)), this, SLOT(updateGraphView()));
|
||||||
connect(ui_->doubleSpinBox_posefilteringRadius, SIGNAL(editingFinished()), this, SLOT(updateGraphView()));
|
connect(ui_->doubleSpinBox_posefilteringRadius, SIGNAL(editingFinished()), this, SLOT(updateGraphView()));
|
||||||
connect(ui_->doubleSpinBox_posefilteringAngle, SIGNAL(editingFinished()), this, SLOT(updateGraphView()));
|
connect(ui_->doubleSpinBox_posefilteringAngle, SIGNAL(editingFinished()), this, SLOT(updateGraphView()));
|
||||||
@@ -457,6 +461,8 @@ DatabaseViewer::DatabaseViewer(const QString & ini, QWidget * parent) :
|
|||||||
connect(ui_->checkBox_cameraProjection, SIGNAL(stateChanged(int)), this, SLOT(configModified()));
|
connect(ui_->checkBox_cameraProjection, SIGNAL(stateChanged(int)), this, SLOT(configModified()));
|
||||||
connect(ui_->checkBox_showDisparityInsteadOfRight, SIGNAL(stateChanged(int)), this, SLOT(configModified()));
|
connect(ui_->checkBox_showDisparityInsteadOfRight, SIGNAL(stateChanged(int)), this, SLOT(configModified()));
|
||||||
connect(ui_->spinBox_decimation, SIGNAL(valueChanged(int)), this, SLOT(configModified()));
|
connect(ui_->spinBox_decimation, SIGNAL(valueChanged(int)), this, SLOT(configModified()));
|
||||||
|
connect(ui_->spinBox_depthConfidence, SIGNAL(valueChanged(int)), this, SLOT(configModified()));
|
||||||
|
connect(ui_->doubleSpinBox_depthEdgeBleedingError, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
||||||
connect(ui_->groupBox_posefiltering, SIGNAL(clicked(bool)), this, SLOT(configModified()));
|
connect(ui_->groupBox_posefiltering, SIGNAL(clicked(bool)), this, SLOT(configModified()));
|
||||||
connect(ui_->doubleSpinBox_posefilteringRadius, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
connect(ui_->doubleSpinBox_posefilteringRadius, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
||||||
connect(ui_->doubleSpinBox_posefilteringAngle, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
connect(ui_->doubleSpinBox_posefilteringAngle, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
||||||
@@ -616,6 +622,8 @@ void DatabaseViewer::readSettings()
|
|||||||
ui_->doubleSpinBox_gainCompensationRadius->setValue(settings.value("gainCompensationRadius", ui_->doubleSpinBox_gainCompensationRadius->value()).toDouble());
|
ui_->doubleSpinBox_gainCompensationRadius->setValue(settings.value("gainCompensationRadius", ui_->doubleSpinBox_gainCompensationRadius->value()).toDouble());
|
||||||
ui_->doubleSpinBox_voxelSize->setValue(settings.value("voxelSize", ui_->doubleSpinBox_voxelSize->value()).toDouble());
|
ui_->doubleSpinBox_voxelSize->setValue(settings.value("voxelSize", ui_->doubleSpinBox_voxelSize->value()).toDouble());
|
||||||
ui_->spinBox_decimation->setValue(settings.value("decimation", ui_->spinBox_decimation->value()).toInt());
|
ui_->spinBox_decimation->setValue(settings.value("decimation", ui_->spinBox_decimation->value()).toInt());
|
||||||
|
ui_->spinBox_depthConfidence->setValue(settings.value("depth_confidence_thr", ui_->spinBox_depthConfidence->value()).toInt());
|
||||||
|
ui_->doubleSpinBox_depthEdgeBleedingError->setValue(settings.value("depth_bleeding_error", ui_->doubleSpinBox_depthEdgeBleedingError->value()).toDouble());
|
||||||
ui_->checkBox_cameraProjection->setChecked(settings.value("camProj", ui_->checkBox_cameraProjection->isChecked()).toBool());
|
ui_->checkBox_cameraProjection->setChecked(settings.value("camProj", ui_->checkBox_cameraProjection->isChecked()).toBool());
|
||||||
ui_->checkBox_showDisparityInsteadOfRight->setChecked(settings.value("showDisp", ui_->checkBox_showDisparityInsteadOfRight->isChecked()).toBool());
|
ui_->checkBox_showDisparityInsteadOfRight->setChecked(settings.value("showDisp", ui_->checkBox_showDisparityInsteadOfRight->isChecked()).toBool());
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
@@ -707,6 +715,8 @@ void DatabaseViewer::writeSettings()
|
|||||||
settings.setValue("gainCompensationRadius", ui_->doubleSpinBox_gainCompensationRadius->value());
|
settings.setValue("gainCompensationRadius", ui_->doubleSpinBox_gainCompensationRadius->value());
|
||||||
settings.setValue("voxelSize", ui_->doubleSpinBox_voxelSize->value());
|
settings.setValue("voxelSize", ui_->doubleSpinBox_voxelSize->value());
|
||||||
settings.setValue("decimation", ui_->spinBox_decimation->value());
|
settings.setValue("decimation", ui_->spinBox_decimation->value());
|
||||||
|
settings.setValue("depth_confidence", ui_->spinBox_depthConfidence->value());
|
||||||
|
settings.setValue("depth_bleeding_error", ui_->doubleSpinBox_depthEdgeBleedingError->value());
|
||||||
settings.setValue("camProj", ui_->checkBox_cameraProjection->isChecked());
|
settings.setValue("camProj", ui_->checkBox_cameraProjection->isChecked());
|
||||||
settings.setValue("showDisp", ui_->checkBox_showDisparityInsteadOfRight->isChecked());
|
settings.setValue("showDisp", ui_->checkBox_showDisparityInsteadOfRight->isChecked());
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
@@ -801,6 +811,8 @@ void DatabaseViewer::restoreDefaultSettings()
|
|||||||
ui_->doubleSpinBox_gainCompensationRadius->setValue(0.0);
|
ui_->doubleSpinBox_gainCompensationRadius->setValue(0.0);
|
||||||
ui_->doubleSpinBox_voxelSize->setValue(0.0);
|
ui_->doubleSpinBox_voxelSize->setValue(0.0);
|
||||||
ui_->spinBox_decimation->setValue(1);
|
ui_->spinBox_decimation->setValue(1);
|
||||||
|
ui_->spinBox_depthConfidence->setValue(0);
|
||||||
|
ui_->doubleSpinBox_depthEdgeBleedingError->setValue(0.0);
|
||||||
ui_->checkBox_cameraProjection->setChecked(false);
|
ui_->checkBox_cameraProjection->setChecked(false);
|
||||||
ui_->checkBox_showDisparityInsteadOfRight->setChecked(false);
|
ui_->checkBox_showDisparityInsteadOfRight->setChecked(false);
|
||||||
|
|
||||||
@@ -1584,6 +1596,11 @@ void DatabaseViewer::extractImages()
|
|||||||
dir.mkdir(QString("%1/rgb").arg(path));
|
dir.mkdir(QString("%1/rgb").arg(path));
|
||||||
dir.mkdir(QString("%1/depth").arg(path));
|
dir.mkdir(QString("%1/depth").arg(path));
|
||||||
dir.mkdir(QString("%1/calib").arg(path));
|
dir.mkdir(QString("%1/calib").arg(path));
|
||||||
|
if(!data.depthConfidenceRaw().empty())
|
||||||
|
{
|
||||||
|
dir.mkdir(QString("%1/confidence").arg(path));
|
||||||
|
directoriesCreated = true;
|
||||||
|
}
|
||||||
directoriesCreated = true;
|
directoriesCreated = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1668,7 +1685,14 @@ void DatabaseViewer::extractImages()
|
|||||||
UWARN("Failed saving \"%s\"", QString("%1/rgb/%2.%3").arg(path).arg(id).arg(ext).toStdString().c_str());
|
UWARN("Failed saving \"%s\"", QString("%1/rgb/%2.%3").arg(path).arg(id).arg(ext).toStdString().c_str());
|
||||||
if(!cv::imwrite(QString("%1/depth/%2.png").arg(path).arg(id).toStdString(), data.depthRaw().type()==CV_32FC1?util2d::cvtDepthFromFloat(data.depthRaw()):data.depthRaw()))
|
if(!cv::imwrite(QString("%1/depth/%2.png").arg(path).arg(id).toStdString(), data.depthRaw().type()==CV_32FC1?util2d::cvtDepthFromFloat(data.depthRaw()):data.depthRaw()))
|
||||||
UWARN("Failed saving \"%s\"", QString("%1/depth/%2.png").arg(path).arg(id).toStdString().c_str());
|
UWARN("Failed saving \"%s\"", QString("%1/depth/%2.png").arg(path).arg(id).toStdString().c_str());
|
||||||
UINFO(QString("Saved rgb/%1.%2 and depth/%1.png").arg(id).arg(ext).toStdString().c_str());
|
if(data.depthConfidenceRaw().empty()) {
|
||||||
|
UINFO(QString("Saved rgb/%1.%2 and depth/%1.png").arg(id).arg(ext).toStdString().c_str());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(!cv::imwrite(QString("%1/confidence/%2.png").arg(path).arg(id).toStdString(), data.depthConfidenceRaw()))
|
||||||
|
UWARN("Failed saving \"%s\"", QString("%1/confidence/%2.png").arg(path).arg(id).toStdString().c_str());
|
||||||
|
UINFO(QString("Saved rgb/%1.%2, depth/%1.png and confidence/%1.png").arg(id).arg(ext).toStdString().c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -3457,18 +3481,24 @@ void DatabaseViewer::exportOptimizedMesh()
|
|||||||
path += ".obj";
|
path += ".obj";
|
||||||
}
|
}
|
||||||
QString baseName = QFileInfo(path).baseName();
|
QString baseName = QFileInfo(path).baseName();
|
||||||
|
UDEBUG("Materials: %d", mesh->tex_materials.size());
|
||||||
if(mesh->tex_materials.size() == 1)
|
if(mesh->tex_materials.size() == 1)
|
||||||
{
|
{
|
||||||
mesh->tex_materials.at(0).tex_file = baseName.toStdString() + ".png";
|
mesh->tex_materials.at(0).tex_file = baseName.toStdString() + ".png";
|
||||||
cv::imwrite((QFileInfo(path).absoluteDir().absolutePath()+QDir::separator()+baseName).toStdString() + ".png", textures);
|
std::string filename = (QFileInfo(path).absoluteDir().absolutePath()+QDir::separator()+baseName).toStdString() + ".png";
|
||||||
|
cv::imwrite(filename, textures);
|
||||||
|
UDEBUG("Saved %s", filename.c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
QDir(QFileInfo(path).absoluteDir().absolutePath()).mkdir(baseName);
|
||||||
for(unsigned int i=0; i<mesh->tex_materials.size(); ++i)
|
for(unsigned int i=0; i<mesh->tex_materials.size(); ++i)
|
||||||
{
|
{
|
||||||
mesh->tex_materials.at(i).tex_file = (baseName+QDir::separator()+QString::number(i)+".png").toStdString();
|
mesh->tex_materials.at(i).tex_file = (baseName+QDir::separator()+QString::number(i)+".png").toStdString();
|
||||||
UASSERT((i+1)*textures.rows <= (unsigned int)textures.cols);
|
UASSERT((i+1)*textures.rows <= (unsigned int)textures.cols);
|
||||||
cv::imwrite((QFileInfo(path).absoluteDir().absolutePath()+QDir::separator()+baseName+QDir::separator()+QString::number(i)+".png").toStdString(), textures(cv::Range::all(), cv::Range(i*textures.rows, (i+1)*textures.rows)));
|
std::string filename = (QFileInfo(path).absoluteDir().absolutePath()+QDir::separator()+baseName+QDir::separator()+QString::number(i)+".png").toStdString();
|
||||||
|
cv::imwrite(filename, textures(cv::Range::all(), cv::Range(i*textures.rows, (i+1)*textures.rows)));
|
||||||
|
UDEBUG("Saved %s", filename.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pcl::io::saveOBJFile(path.toStdString(), *mesh);
|
pcl::io::saveOBJFile(path.toStdString(), *mesh);
|
||||||
@@ -4807,7 +4837,7 @@ void DatabaseViewer::update(int value,
|
|||||||
|
|
||||||
if(!imgDepth.empty())
|
if(!imgDepth.empty())
|
||||||
{
|
{
|
||||||
view->setImageDepth(imgDepth);
|
view->setImageDepth(imgDepth, data.depthConfidenceRaw());
|
||||||
if(img.isNull())
|
if(img.isNull())
|
||||||
{
|
{
|
||||||
rect.setWidth(imgDepth.cols);
|
rect.setWidth(imgDepth.cols);
|
||||||
@@ -5266,6 +5296,12 @@ void DatabaseViewer::update(int value,
|
|||||||
{
|
{
|
||||||
if(!data.depthOrRightRaw().empty())
|
if(!data.depthOrRightRaw().empty())
|
||||||
{
|
{
|
||||||
|
if(!data.depthRaw().empty() && ui_->doubleSpinBox_depthEdgeBleedingError->value() > 0.0) {
|
||||||
|
cv::Mat depth = data.depthRaw();
|
||||||
|
util2d::depthBleedingFiltering(depth, ui_->doubleSpinBox_depthEdgeBleedingError->value());
|
||||||
|
data.setRGBDImage(data.imageRaw(), depth, data.depthConfidenceRaw(), data.cameraModels());
|
||||||
|
}
|
||||||
|
|
||||||
if(!data.imageRaw().empty())
|
if(!data.imageRaw().empty())
|
||||||
{
|
{
|
||||||
std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> clouds;
|
std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> clouds;
|
||||||
@@ -5281,8 +5317,13 @@ void DatabaseViewer::update(int value,
|
|||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud = util3d::cloudFromDepthRGB(
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud = util3d::cloudFromDepthRGB(
|
||||||
data.imageRaw(),
|
data.imageRaw(),
|
||||||
depth,
|
depth,
|
||||||
|
data.depthConfidenceRaw(),
|
||||||
data.cameraModels()[0],
|
data.cameraModels()[0],
|
||||||
ui_->spinBox_decimation->value(),0,0,indices.get());
|
ui_->spinBox_decimation->value(),
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
(unsigned char)ui_->spinBox_depthConfidence->value(),
|
||||||
|
indices.get());
|
||||||
if(indices->size())
|
if(indices->size())
|
||||||
{
|
{
|
||||||
clouds.push_back(util3d::transformPointCloud(cloud, data.cameraModels()[0].localTransform()));
|
clouds.push_back(util3d::transformPointCloud(cloud, data.cameraModels()[0].localTransform()));
|
||||||
@@ -5291,7 +5332,14 @@ void DatabaseViewer::update(int value,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
clouds = util3d::cloudsRGBFromSensorData(data, ui_->spinBox_decimation->value(), 0, 0, &allIndices, ui_->parameters_toolbox->getParameters());
|
clouds = util3d::cloudsRGBFromSensorData(
|
||||||
|
data,
|
||||||
|
ui_->spinBox_decimation->value(),
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
&allIndices,
|
||||||
|
ui_->parameters_toolbox->getParameters(),std::vector<float>(),
|
||||||
|
(unsigned char)ui_->spinBox_depthConfidence->value());
|
||||||
}
|
}
|
||||||
UASSERT(clouds.size() == allIndices.size());
|
UASSERT(clouds.size() == allIndices.size());
|
||||||
for(size_t i=0; i<allIndices.size(); ++i)
|
for(size_t i=0; i<allIndices.size(); ++i)
|
||||||
@@ -5366,7 +5414,14 @@ void DatabaseViewer::update(int value,
|
|||||||
std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> clouds;
|
std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> clouds;
|
||||||
std::vector<pcl::IndicesPtr> allIndices;
|
std::vector<pcl::IndicesPtr> allIndices;
|
||||||
|
|
||||||
clouds = util3d::cloudsFromSensorData(data, ui_->spinBox_decimation->value(), 0, 0, &allIndices, ui_->parameters_toolbox->getParameters());
|
clouds = util3d::cloudsFromSensorData(
|
||||||
|
data,
|
||||||
|
ui_->spinBox_decimation->value(),
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
&allIndices, ui_->parameters_toolbox->getParameters(),
|
||||||
|
std::vector<float>(),
|
||||||
|
(unsigned char)ui_->spinBox_depthConfidence->value());
|
||||||
UASSERT(clouds.size() == allIndices.size());
|
UASSERT(clouds.size() == allIndices.size());
|
||||||
for(size_t i=0; i<allIndices.size(); ++i)
|
for(size_t i=0; i<allIndices.size(); ++i)
|
||||||
{
|
{
|
||||||
@@ -6358,11 +6413,12 @@ void DatabaseViewer::updateConstraintView(
|
|||||||
ui_->checkBox_showOptimized->setEnabled(true);
|
ui_->checkBox_showOptimized->setEnabled(true);
|
||||||
Transform topt = iterFrom->second.inverse()*iterTo->second;
|
Transform topt = iterFrom->second.inverse()*iterTo->second;
|
||||||
float diff = topt.getDistance(t);
|
float diff = topt.getDistance(t);
|
||||||
|
|
||||||
Transform v1 = t.rotation()*Transform(1,0,0,0,0,0);
|
Transform v1 = t.rotation()*Transform(1,0,0,0,0,0);
|
||||||
Transform v2 = topt.rotation()*Transform(1,0,0,0,0,0);
|
Transform v2 = topt.rotation()*Transform(1,0,0,0,0,0);
|
||||||
float a = pcl::getAngle3D(Eigen::Vector4f(v1.x(), v1.y(), v1.z(), 0), Eigen::Vector4f(v2.x(), v2.y(), v2.z(), 0));
|
float a = pcl::getAngle3D(Eigen::Vector4f(v1.x(), v1.y(), v1.z(), 0), Eigen::Vector4f(v2.x(), v2.y(), v2.z(), 0));
|
||||||
a = (a *180.0f) / CV_PI;
|
a = (a *180.0f) / CV_PI;
|
||||||
ui_->label_constraint_opt->setText(QString("%1\n(error=%2% a=%3)").arg(QString(topt.prettyPrint().c_str()).replace(" ", "\n")).arg((t.getNorm()>0?diff/t.getNorm():0)*100.0f).arg(a));
|
ui_->label_constraint_opt->setText(QString("%1\n(error=%2% a=%3 deg)").arg(QString(topt.prettyPrint().c_str()).replace(" ", "\n")).arg((t.getNorm()>0?diff/t.getNorm():0)*100.0f).arg(a));
|
||||||
|
|
||||||
if(ui_->checkBox_showOptimized->isChecked())
|
if(ui_->checkBox_showOptimized->isChecked())
|
||||||
{
|
{
|
||||||
@@ -6493,11 +6549,37 @@ void DatabaseViewer::updateConstraintView(
|
|||||||
pcl::IndicesPtr indicesTo(new std::vector<int>);
|
pcl::IndicesPtr indicesTo(new std::vector<int>);
|
||||||
if(!dataFrom.imageRaw().empty() && !dataFrom.depthOrRightRaw().empty())
|
if(!dataFrom.imageRaw().empty() && !dataFrom.depthOrRightRaw().empty())
|
||||||
{
|
{
|
||||||
cloudFrom=util3d::cloudRGBFromSensorData(dataFrom, ui_->spinBox_decimation->value(), 0, 0, indicesFrom.get(), ui_->parameters_toolbox->getParameters());
|
if(!dataFrom.depthRaw().empty() && ui_->doubleSpinBox_depthEdgeBleedingError->value() > 0.0) {
|
||||||
|
cv::Mat depth = dataFrom.depthRaw();
|
||||||
|
util2d::depthBleedingFiltering(depth, ui_->doubleSpinBox_depthEdgeBleedingError->value());
|
||||||
|
dataFrom.setRGBDImage(dataFrom.imageRaw(), depth, dataFrom.depthConfidenceRaw(), dataFrom.cameraModels());
|
||||||
|
}
|
||||||
|
cloudFrom=util3d::cloudRGBFromSensorData(
|
||||||
|
dataFrom,
|
||||||
|
ui_->spinBox_decimation->value(),
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
indicesFrom.get(),
|
||||||
|
ui_->parameters_toolbox->getParameters(),
|
||||||
|
std::vector<float>(),
|
||||||
|
(unsigned char)ui_->spinBox_depthConfidence->value());
|
||||||
}
|
}
|
||||||
if(!dataTo.imageRaw().empty() && !dataTo.depthOrRightRaw().empty())
|
if(!dataTo.imageRaw().empty() && !dataTo.depthOrRightRaw().empty())
|
||||||
{
|
{
|
||||||
cloudTo=util3d::cloudRGBFromSensorData(dataTo, ui_->spinBox_decimation->value(), 0, 0, indicesTo.get(), ui_->parameters_toolbox->getParameters());
|
if(!dataTo.depthRaw().empty() && ui_->doubleSpinBox_depthEdgeBleedingError->value() > 0.0) {
|
||||||
|
cv::Mat depth = dataTo.depthRaw();
|
||||||
|
util2d::depthBleedingFiltering(depth, ui_->doubleSpinBox_depthEdgeBleedingError->value());
|
||||||
|
dataTo.setRGBDImage(dataTo.imageRaw(), depth, dataTo.depthConfidenceRaw(), dataTo.cameraModels());
|
||||||
|
}
|
||||||
|
cloudTo=util3d::cloudRGBFromSensorData(
|
||||||
|
dataTo,
|
||||||
|
ui_->spinBox_decimation->value(),
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
indicesTo.get(),
|
||||||
|
ui_->parameters_toolbox->getParameters(),
|
||||||
|
std::vector<float>(),
|
||||||
|
(unsigned char)ui_->spinBox_depthConfidence->value());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(cloudTo.get() && indicesTo->size())
|
if(cloudTo.get() && indicesTo->size())
|
||||||
|
|||||||
@@ -203,6 +203,7 @@ void ExportBundlerDialog::exportBundler(
|
|||||||
}
|
}
|
||||||
if(_ui->sba_iterations->value() > 0)
|
if(_ui->sba_iterations->value() > 0)
|
||||||
{
|
{
|
||||||
|
UINFO("Do BA optimization with %d iterations.", _ui->sba_iterations->value());
|
||||||
poses = sba->optimizeBA(
|
poses = sba->optimizeBA(
|
||||||
posesOut.begin()->first,
|
posesOut.begin()->first,
|
||||||
posesOut,
|
posesOut,
|
||||||
@@ -210,11 +211,12 @@ void ExportBundlerDialog::exportBundler(
|
|||||||
signatures.toStdMap(),
|
signatures.toStdMap(),
|
||||||
points3DMap,
|
points3DMap,
|
||||||
wordReferences,
|
wordReferences,
|
||||||
_ui->sba_rematchFeatures->isChecked());
|
_ui->sba_rematchFeatures->isChecked(),
|
||||||
|
parametersSBA);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// do not optimize, just compute 3D features and word correspondences
|
UINFO("Do not optimize, just compute 3D features and word correspondences.");
|
||||||
poses = posesOut;
|
poses = posesOut;
|
||||||
sba->computeBACorrespondences(poses,
|
sba->computeBACorrespondences(poses,
|
||||||
linksOut,
|
linksOut,
|
||||||
|
|||||||
@@ -151,6 +151,9 @@ ExportCloudsDialog::ExportCloudsDialog(QWidget *parent) :
|
|||||||
connect(_ui->lineEdit_distortionModel, SIGNAL(textChanged(const QString &)), this, SIGNAL(configChanged()));
|
connect(_ui->lineEdit_distortionModel, SIGNAL(textChanged(const QString &)), this, SIGNAL(configChanged()));
|
||||||
connect(_ui->toolButton_distortionModel, SIGNAL(clicked()), this, SLOT(selectDistortionModel()));
|
connect(_ui->toolButton_distortionModel, SIGNAL(clicked()), this, SLOT(selectDistortionModel()));
|
||||||
|
|
||||||
|
connect(_ui->spinBox_depthConfidence, SIGNAL(valueChanged(int)), this, SIGNAL(configChanged()));
|
||||||
|
connect(_ui->doubleSpinBox_depthEdgeFiltering, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
||||||
|
|
||||||
connect(_ui->checkBox_bilateral, SIGNAL(stateChanged(int)), this, SIGNAL(configChanged()));
|
connect(_ui->checkBox_bilateral, SIGNAL(stateChanged(int)), this, SIGNAL(configChanged()));
|
||||||
connect(_ui->checkBox_bilateral, SIGNAL(stateChanged(int)), this, SLOT(updateReconstructionFlavor()));
|
connect(_ui->checkBox_bilateral, SIGNAL(stateChanged(int)), this, SLOT(updateReconstructionFlavor()));
|
||||||
connect(_ui->doubleSpinBox_bilateral_sigmaS, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
connect(_ui->doubleSpinBox_bilateral_sigmaS, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
||||||
@@ -401,6 +404,8 @@ void ExportCloudsDialog::saveSettings(QSettings & settings, const QString & grou
|
|||||||
settings.setValue("regenerate_fill_error", _ui->spinBox_fillDepthHolesError->value());
|
settings.setValue("regenerate_fill_error", _ui->spinBox_fillDepthHolesError->value());
|
||||||
settings.setValue("regenerate_roi", _ui->lineEdit_roiRatios->text());
|
settings.setValue("regenerate_roi", _ui->lineEdit_roiRatios->text());
|
||||||
settings.setValue("regenerate_distortion_model", _ui->lineEdit_distortionModel->text());
|
settings.setValue("regenerate_distortion_model", _ui->lineEdit_distortionModel->text());
|
||||||
|
settings.setValue("regenerate_min_depth_confidence", _ui->spinBox_depthConfidence->value());
|
||||||
|
settings.setValue("regenerate_edge_bleeding_error", _ui->doubleSpinBox_depthEdgeFiltering->value());
|
||||||
|
|
||||||
settings.setValue("bilateral", _ui->checkBox_bilateral->isChecked());
|
settings.setValue("bilateral", _ui->checkBox_bilateral->isChecked());
|
||||||
settings.setValue("bilateral_sigma_s", _ui->doubleSpinBox_bilateral_sigmaS->value());
|
settings.setValue("bilateral_sigma_s", _ui->doubleSpinBox_bilateral_sigmaS->value());
|
||||||
@@ -584,6 +589,8 @@ void ExportCloudsDialog::loadSettings(QSettings & settings, const QString & grou
|
|||||||
_ui->spinBox_fillDepthHolesError->setValue(settings.value("regenerate_fill_error", _ui->spinBox_fillDepthHolesError->value()).toInt());
|
_ui->spinBox_fillDepthHolesError->setValue(settings.value("regenerate_fill_error", _ui->spinBox_fillDepthHolesError->value()).toInt());
|
||||||
_ui->lineEdit_roiRatios->setText(settings.value("regenerate_roi", _ui->lineEdit_roiRatios->text()).toString());
|
_ui->lineEdit_roiRatios->setText(settings.value("regenerate_roi", _ui->lineEdit_roiRatios->text()).toString());
|
||||||
_ui->lineEdit_distortionModel->setText(settings.value("regenerate_distortion_model", _ui->lineEdit_distortionModel->text()).toString());
|
_ui->lineEdit_distortionModel->setText(settings.value("regenerate_distortion_model", _ui->lineEdit_distortionModel->text()).toString());
|
||||||
|
_ui->spinBox_depthConfidence->setValue(settings.value("regenerate_min_depth_confidence", _ui->spinBox_depthConfidence->value()).toInt());
|
||||||
|
_ui->doubleSpinBox_depthEdgeFiltering->setValue(settings.value("regenerate_edge_bleeding_error", _ui->doubleSpinBox_depthEdgeFiltering->value()).toDouble());
|
||||||
|
|
||||||
_ui->checkBox_bilateral->setChecked(settings.value("bilateral", _ui->checkBox_bilateral->isChecked()).toBool());
|
_ui->checkBox_bilateral->setChecked(settings.value("bilateral", _ui->checkBox_bilateral->isChecked()).toBool());
|
||||||
_ui->doubleSpinBox_bilateral_sigmaS->setValue(settings.value("bilateral_sigma_s", _ui->doubleSpinBox_bilateral_sigmaS->value()).toDouble());
|
_ui->doubleSpinBox_bilateral_sigmaS->setValue(settings.value("bilateral_sigma_s", _ui->doubleSpinBox_bilateral_sigmaS->value()).toDouble());
|
||||||
@@ -770,6 +777,8 @@ void ExportCloudsDialog::restoreDefaults()
|
|||||||
_ui->spinBox_fillDepthHolesError->setValue(2);
|
_ui->spinBox_fillDepthHolesError->setValue(2);
|
||||||
_ui->lineEdit_roiRatios->setText("0.0 0.0 0.0 0.0");
|
_ui->lineEdit_roiRatios->setText("0.0 0.0 0.0 0.0");
|
||||||
_ui->lineEdit_distortionModel->setText("");
|
_ui->lineEdit_distortionModel->setText("");
|
||||||
|
_ui->spinBox_depthConfidence->setValue(0);
|
||||||
|
_ui->doubleSpinBox_depthEdgeFiltering->setValue(0.0);
|
||||||
|
|
||||||
_ui->checkBox_bilateral->setChecked(false);
|
_ui->checkBox_bilateral->setChecked(false);
|
||||||
_ui->doubleSpinBox_bilateral_sigmaS->setValue(10.0);
|
_ui->doubleSpinBox_bilateral_sigmaS->setValue(10.0);
|
||||||
@@ -3685,20 +3694,30 @@ std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::Indic
|
|||||||
{
|
{
|
||||||
const Signature & s = cachedSignatures.find(iter->first).value();
|
const Signature & s = cachedSignatures.find(iter->first).value();
|
||||||
data = s.sensorData();
|
data = s.sensorData();
|
||||||
cv::Mat image,depth;
|
cv::Mat image,depth,confidence;
|
||||||
data.uncompressData(
|
data.uncompressData(
|
||||||
_ui->checkBox_fromDepth->isChecked()?&image:0,
|
_ui->checkBox_fromDepth->isChecked()?&image:0,
|
||||||
_ui->checkBox_fromDepth->isChecked()?&depth:0,
|
_ui->checkBox_fromDepth->isChecked()?&depth:0,
|
||||||
!_ui->checkBox_fromDepth->isChecked()?&scan:0);
|
!_ui->checkBox_fromDepth->isChecked()?&scan:0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
_ui->checkBox_fromDepth->isChecked()?&confidence:0);
|
||||||
}
|
}
|
||||||
else if(_dbDriver)
|
else if(_dbDriver)
|
||||||
{
|
{
|
||||||
cv::Mat image,depth;
|
cv::Mat image,depth,confidence;
|
||||||
_dbDriver->getNodeData(iter->first, data, _ui->checkBox_fromDepth->isChecked(), !_ui->checkBox_fromDepth->isChecked(), false, false);
|
_dbDriver->getNodeData(iter->first, data, _ui->checkBox_fromDepth->isChecked(), !_ui->checkBox_fromDepth->isChecked(), false, false);
|
||||||
data.uncompressData(
|
data.uncompressData(
|
||||||
_ui->checkBox_fromDepth->isChecked()?&image:0,
|
_ui->checkBox_fromDepth->isChecked()?&image:0,
|
||||||
_ui->checkBox_fromDepth->isChecked()?&depth:0,
|
_ui->checkBox_fromDepth->isChecked()?&depth:0,
|
||||||
!_ui->checkBox_fromDepth->isChecked()?&scan:0);
|
!_ui->checkBox_fromDepth->isChecked()?&scan:0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
_ui->checkBox_fromDepth->isChecked()?&confidence:0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(_ui->checkBox_fromDepth->isChecked() && !data.imageRaw().empty() && !data.depthOrRightRaw().empty())
|
if(_ui->checkBox_fromDepth->isChecked() && !data.imageRaw().empty() && !data.depthOrRightRaw().empty())
|
||||||
@@ -3719,6 +3738,12 @@ std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::Indic
|
|||||||
model.undistort(depth);
|
model.undistort(depth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// edge bleeding filter
|
||||||
|
if(!depth.empty() && _ui->doubleSpinBox_depthEdgeFiltering->value()>0.0)
|
||||||
|
{
|
||||||
|
util2d::depthBleedingFiltering(depth, _ui->doubleSpinBox_depthEdgeFiltering->value());
|
||||||
|
}
|
||||||
|
|
||||||
// bilateral filtering
|
// bilateral filtering
|
||||||
if(!depth.empty() && _ui->checkBox_bilateral->isChecked())
|
if(!depth.empty() && _ui->checkBox_bilateral->isChecked())
|
||||||
{
|
{
|
||||||
@@ -3729,7 +3754,7 @@ std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::Indic
|
|||||||
|
|
||||||
if(!depth.empty())
|
if(!depth.empty())
|
||||||
{
|
{
|
||||||
data.setRGBDImage(data.imageRaw(), depth, data.cameraModels());
|
data.setRGBDImage(data.imageRaw(), depth, data.depthConfidenceRaw(), data.cameraModels());
|
||||||
}
|
}
|
||||||
|
|
||||||
UASSERT(iter->first == data.id());
|
UASSERT(iter->first == data.id());
|
||||||
@@ -3754,7 +3779,8 @@ std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::Indic
|
|||||||
_ui->doubleSpinBox_minDepth->value(),
|
_ui->doubleSpinBox_minDepth->value(),
|
||||||
indices.get(),
|
indices.get(),
|
||||||
parameters,
|
parameters,
|
||||||
roiRatios);
|
roiRatios,
|
||||||
|
(unsigned char)_ui->spinBox_depthConfidence->value());
|
||||||
|
|
||||||
if(cloudWithoutNormals->size())
|
if(cloudWithoutNormals->size())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -109,6 +109,10 @@ public:
|
|||||||
_value = value;
|
_value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setToolTipInfo(const QString & info) {
|
||||||
|
_info = info;
|
||||||
|
}
|
||||||
|
|
||||||
void setRadius(float radius)
|
void setRadius(float radius)
|
||||||
{
|
{
|
||||||
float r,p,yaw;
|
float r,p,yaw;
|
||||||
@@ -160,6 +164,10 @@ protected:
|
|||||||
{
|
{
|
||||||
msg += QString("\n%1=%2").arg(_valueName).arg(_value);
|
msg += QString("\n%1=%2").arg(_valueName).arg(_value);
|
||||||
}
|
}
|
||||||
|
if(!_info.isEmpty())
|
||||||
|
{
|
||||||
|
msg += QString("\n%1").arg(_info);
|
||||||
|
}
|
||||||
|
|
||||||
this->setToolTip(msg);
|
this->setToolTip(msg);
|
||||||
|
|
||||||
@@ -181,6 +189,7 @@ private:
|
|||||||
QGraphicsLineItem * _line;
|
QGraphicsLineItem * _line;
|
||||||
QString _valueName;
|
QString _valueName;
|
||||||
float _value;
|
float _value;
|
||||||
|
QString _info;
|
||||||
};
|
};
|
||||||
|
|
||||||
class NodeGPSItem: public NodeItem
|
class NodeGPSItem: public NodeItem
|
||||||
@@ -522,6 +531,7 @@ void GraphViewer::updateGraph(const std::map<int, Transform> & poses,
|
|||||||
}
|
}
|
||||||
iter.value()->hide();
|
iter.value()->hide();
|
||||||
iter.value()->setColor(color); // reset color
|
iter.value()->setColor(color); // reset color
|
||||||
|
iter.value()->setToolTipInfo(QString());
|
||||||
iter.value()->setZValue(iter.key()<0?21:20);
|
iter.value()->setZValue(iter.key()<0?21:20);
|
||||||
}
|
}
|
||||||
for(QMultiMap<int, LinkItem*>::iterator iter = _linkItems.begin(); iter!=_linkItems.end(); ++iter)
|
for(QMultiMap<int, LinkItem*>::iterator iter = _linkItems.begin(); iter!=_linkItems.end(); ++iter)
|
||||||
@@ -558,7 +568,7 @@ void GraphViewer::updateGraph(const std::map<int, Transform> & poses,
|
|||||||
item->setZValue(iter->first<0?21:20);
|
item->setZValue(iter->first<0?21:20);
|
||||||
item->setColor(color);
|
item->setColor(color);
|
||||||
item->setParentItem(_graphRoot);
|
item->setParentItem(_graphRoot);
|
||||||
item->setVisible(_nodeVisible);
|
item->show();
|
||||||
_nodeItems.insert(iter->first, item);
|
_nodeItems.insert(iter->first, item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -732,6 +742,7 @@ void GraphViewer::updateGraph(const std::map<int, Transform> & poses,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
iter.value()->setVisible(_nodeVisible);
|
||||||
++iter;
|
++iter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1166,6 +1177,19 @@ void GraphViewer::setCurrentGoalID(int id, const Transform & pose)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GraphViewer::setNodeInfo(int id, const QString & info)
|
||||||
|
{
|
||||||
|
NodeItem * node = _nodeItems.value(id, 0);
|
||||||
|
if(node)
|
||||||
|
{
|
||||||
|
node->setToolTipInfo(info);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UWARN("Node %d not found in the graph", id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GraphViewer::setLocalRadius(float radius)
|
void GraphViewer::setLocalRadius(float radius)
|
||||||
{
|
{
|
||||||
_localRadius->setRect(-radius*100, -radius*100, radius*200, radius*200);
|
_localRadius->setRect(-radius*100, -radius*100, radius*200, radius*200);
|
||||||
|
|||||||
+156
-47
@@ -181,7 +181,8 @@ ImageView::ImageView(QWidget * parent) :
|
|||||||
_depthColorMapMinRange(0),
|
_depthColorMapMinRange(0),
|
||||||
_depthColorMapMaxRange(0),
|
_depthColorMapMaxRange(0),
|
||||||
_imageItem(0),
|
_imageItem(0),
|
||||||
_imageDepthItem(0)
|
_imageDepthItem(0),
|
||||||
|
_imageDepthConfidenceItem(0)
|
||||||
{
|
{
|
||||||
#if QT_VERSION >= 0x050000
|
#if QT_VERSION >= 0x050000
|
||||||
_savedFileName = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
|
_savedFileName = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
|
||||||
@@ -209,9 +210,12 @@ ImageView::ImageView(QWidget * parent) :
|
|||||||
_showImage = _menu->addAction(tr("Show image"));
|
_showImage = _menu->addAction(tr("Show image"));
|
||||||
_showImage->setCheckable(true);
|
_showImage->setCheckable(true);
|
||||||
_showImage->setChecked(true);
|
_showImage->setChecked(true);
|
||||||
_showImageDepth = _menu->addAction(tr("Show image depth"));
|
_showImageDepth = _menu->addAction(tr("Show depth image"));
|
||||||
_showImageDepth->setCheckable(true);
|
_showImageDepth->setCheckable(true);
|
||||||
_showImageDepth->setChecked(false);
|
_showImageDepth->setChecked(false);
|
||||||
|
_showImageDepthConfidence = _menu->addAction(tr("Show depth confidence"));
|
||||||
|
_showImageDepthConfidence->setCheckable(true);
|
||||||
|
_showImageDepthConfidence->setChecked(false);
|
||||||
_featureMenu = _menu->addMenu("Features");
|
_featureMenu = _menu->addMenu("Features");
|
||||||
_showFeatures = _featureMenu->addAction(tr("Show features"));
|
_showFeatures = _featureMenu->addAction(tr("Show features"));
|
||||||
_showFeatures->setCheckable(true);
|
_showFeatures->setCheckable(true);
|
||||||
@@ -293,6 +297,7 @@ void ImageView::saveSettings(QSettings & settings, const QString & group) const
|
|||||||
}
|
}
|
||||||
settings.setValue("image_shown", this->isImageShown());
|
settings.setValue("image_shown", this->isImageShown());
|
||||||
settings.setValue("depth_shown", this->isImageDepthShown());
|
settings.setValue("depth_shown", this->isImageDepthShown());
|
||||||
|
settings.setValue("confidence_shown", this->isImageDepthConfidenceShown());
|
||||||
settings.setValue("features_shown", this->isFeaturesShown());
|
settings.setValue("features_shown", this->isFeaturesShown());
|
||||||
settings.setValue("features_size", this->getFeaturesSize());
|
settings.setValue("features_size", this->getFeaturesSize());
|
||||||
settings.setValue("lines_shown", this->isLinesShown());
|
settings.setValue("lines_shown", this->isLinesShown());
|
||||||
@@ -322,6 +327,7 @@ void ImageView::loadSettings(QSettings & settings, const QString & group)
|
|||||||
}
|
}
|
||||||
this->setImageShown(settings.value("image_shown", this->isImageShown()).toBool());
|
this->setImageShown(settings.value("image_shown", this->isImageShown()).toBool());
|
||||||
this->setImageDepthShown(settings.value("depth_shown", this->isImageDepthShown()).toBool());
|
this->setImageDepthShown(settings.value("depth_shown", this->isImageDepthShown()).toBool());
|
||||||
|
this->setImageDepthConfidenceShown(settings.value("confidence_shown", this->isImageDepthConfidenceShown()).toBool());
|
||||||
this->setFeaturesShown(settings.value("features_shown", this->isFeaturesShown()).toBool());
|
this->setFeaturesShown(settings.value("features_shown", this->isFeaturesShown()).toBool());
|
||||||
this->setFeaturesSize(settings.value("features_size", this->getFeaturesSize()).toInt());
|
this->setFeaturesSize(settings.value("features_size", this->getFeaturesSize()).toInt());
|
||||||
this->setLinesShown(settings.value("lines_shown", this->isLinesShown()).toBool());
|
this->setLinesShown(settings.value("lines_shown", this->isLinesShown()).toBool());
|
||||||
@@ -363,6 +369,11 @@ bool ImageView::isImageDepthShown() const
|
|||||||
return _showImageDepth->isChecked();
|
return _showImageDepth->isChecked();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ImageView::isImageDepthConfidenceShown() const
|
||||||
|
{
|
||||||
|
return _showImageDepthConfidence->isChecked();
|
||||||
|
}
|
||||||
|
|
||||||
bool ImageView::isFeaturesShown() const
|
bool ImageView::isFeaturesShown() const
|
||||||
{
|
{
|
||||||
return _showFeatures->isChecked();
|
return _showFeatures->isChecked();
|
||||||
@@ -466,6 +477,13 @@ void ImageView::setImageShown(bool shown)
|
|||||||
void ImageView::setImageDepthShown(bool shown)
|
void ImageView::setImageDepthShown(bool shown)
|
||||||
{
|
{
|
||||||
_showImageDepth->setChecked(shown);
|
_showImageDepth->setChecked(shown);
|
||||||
|
if(shown)
|
||||||
|
{
|
||||||
|
_showImageDepthConfidence->setChecked(false);
|
||||||
|
if(_imageDepthConfidenceItem) {
|
||||||
|
_imageDepthConfidenceItem->setVisible(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
if(_imageDepthItem)
|
if(_imageDepthItem)
|
||||||
{
|
{
|
||||||
_imageDepthItem->setVisible(_showImageDepth->isChecked());
|
_imageDepthItem->setVisible(_showImageDepth->isChecked());
|
||||||
@@ -478,6 +496,28 @@ void ImageView::setImageDepthShown(bool shown)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImageView::setImageDepthConfidenceShown(bool shown)
|
||||||
|
{
|
||||||
|
_showImageDepthConfidence->setChecked(shown);
|
||||||
|
if(shown)
|
||||||
|
{
|
||||||
|
_showImageDepth->setChecked(false);
|
||||||
|
if(_imageDepthItem) {
|
||||||
|
_imageDepthItem->setVisible(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(_imageDepthConfidenceItem)
|
||||||
|
{
|
||||||
|
_imageDepthConfidenceItem->setVisible(_showImageDepthConfidence->isChecked());
|
||||||
|
this->updateOpacity();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!_graphicsView->isVisible())
|
||||||
|
{
|
||||||
|
this->update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool ImageView::isLinesShown() const
|
bool ImageView::isLinesShown() const
|
||||||
{
|
{
|
||||||
return _showLines->isChecked();
|
return _showLines->isChecked();
|
||||||
@@ -517,6 +557,8 @@ void ImageView::setGraphicsViewMode(bool on)
|
|||||||
_graphicsView->setVisible(on);
|
_graphicsView->setVisible(on);
|
||||||
_scaleMenu->setEnabled(on);
|
_scaleMenu->setEnabled(on);
|
||||||
|
|
||||||
|
_mouseTracking->setEnabled(!on);
|
||||||
|
|
||||||
if(on)
|
if(on)
|
||||||
{
|
{
|
||||||
for(QMultiMap<int, KeypointItem*>::iterator iter=_features.begin(); iter!=_features.end(); ++iter)
|
for(QMultiMap<int, KeypointItem*>::iterator iter=_features.begin(); iter!=_features.end(); ++iter)
|
||||||
@@ -550,11 +592,20 @@ void ImageView::setGraphicsViewMode(bool on)
|
|||||||
{
|
{
|
||||||
_imageDepthItem->setPixmap(_imageDepth);
|
_imageDepthItem->setPixmap(_imageDepth);
|
||||||
}
|
}
|
||||||
else
|
else if(!_imageDepth.isNull())
|
||||||
{
|
{
|
||||||
_imageDepthItem = _graphicsView->scene()->addPixmap(_imageDepth);
|
_imageDepthItem = _graphicsView->scene()->addPixmap(_imageDepth);
|
||||||
_imageDepthItem->setVisible(_showImageDepth->isChecked());
|
_imageDepthItem->setVisible(_showImageDepth->isChecked());
|
||||||
}
|
}
|
||||||
|
if(_imageDepthConfidenceItem)
|
||||||
|
{
|
||||||
|
_imageDepthConfidenceItem->setPixmap(_imageDepthConfidence);
|
||||||
|
}
|
||||||
|
else if(!_imageDepthConfidence.isNull())
|
||||||
|
{
|
||||||
|
_imageDepthConfidenceItem = _graphicsView->scene()->addPixmap(_imageDepthConfidence);
|
||||||
|
_imageDepthConfidenceItem->setVisible(_showImageDepthConfidence->isChecked());
|
||||||
|
}
|
||||||
this->updateOpacity();
|
this->updateOpacity();
|
||||||
|
|
||||||
if(_graphicsViewScaled->isChecked())
|
if(_graphicsViewScaled->isChecked())
|
||||||
@@ -790,7 +841,8 @@ void ImageView::paintEvent(QPaintEvent *event)
|
|||||||
|
|
||||||
painter.save();
|
painter.save();
|
||||||
if(_showImage->isChecked() && !_image.isNull() &&
|
if(_showImage->isChecked() && !_image.isNull() &&
|
||||||
_showImageDepth->isChecked() && !_imageDepth.isNull())
|
((_showImageDepth->isChecked() && !_imageDepth.isNull()) ||
|
||||||
|
(_showImageDepthConfidence->isChecked()&&!_imageDepthConfidence.isNull())))
|
||||||
{
|
{
|
||||||
painter.setOpacity(0.5);
|
painter.setOpacity(0.5);
|
||||||
}
|
}
|
||||||
@@ -804,6 +856,10 @@ void ImageView::paintEvent(QPaintEvent *event)
|
|||||||
{
|
{
|
||||||
painter.drawPixmap(QPoint(0,0), _imageDepth);
|
painter.drawPixmap(QPoint(0,0), _imageDepth);
|
||||||
}
|
}
|
||||||
|
else if(_showImageDepthConfidence->isChecked() && !_imageDepthConfidence.isNull())
|
||||||
|
{
|
||||||
|
painter.drawPixmap(QPoint(0,0), _imageDepthConfidence);
|
||||||
|
}
|
||||||
painter.restore();
|
painter.restore();
|
||||||
|
|
||||||
if(_showFeatures->isChecked())
|
if(_showFeatures->isChecked())
|
||||||
@@ -966,6 +1022,11 @@ void ImageView::contextMenuEvent(QContextMenuEvent * e)
|
|||||||
this->setImageDepthShown(_showImageDepth->isChecked());
|
this->setImageDepthShown(_showImageDepth->isChecked());
|
||||||
Q_EMIT configChanged();
|
Q_EMIT configChanged();
|
||||||
}
|
}
|
||||||
|
else if(action == _showImageDepthConfidence)
|
||||||
|
{
|
||||||
|
this->setImageDepthConfidenceShown(_showImageDepthConfidence->isChecked());
|
||||||
|
Q_EMIT configChanged();
|
||||||
|
}
|
||||||
else if(action == _showLines)
|
else if(action == _showLines)
|
||||||
{
|
{
|
||||||
this->setLinesShown(_showLines->isChecked());
|
this->setLinesShown(_showLines->isChecked());
|
||||||
@@ -988,8 +1049,9 @@ void ImageView::contextMenuEvent(QContextMenuEvent * e)
|
|||||||
}
|
}
|
||||||
else if(action == _colorMapBlackToWhite || action == _colorMapWhiteToBlack || action == _colorMapRedToBlue || action == _colorMapBlueToRed)
|
else if(action == _colorMapBlackToWhite || action == _colorMapWhiteToBlack || action == _colorMapRedToBlue || action == _colorMapBlueToRed)
|
||||||
{
|
{
|
||||||
if(!_imageDepthCv.empty())
|
if(!_imageDepthCv.empty()) {
|
||||||
this->setImageDepth(_imageDepthCv);
|
this->setImageDepth(_imageDepthCv, _imageDepthConfidenceCv);
|
||||||
|
}
|
||||||
Q_EMIT configChanged();
|
Q_EMIT configChanged();
|
||||||
}
|
}
|
||||||
else if(action == _colorMapMinRange)
|
else if(action == _colorMapMinRange)
|
||||||
@@ -999,8 +1061,9 @@ void ImageView::contextMenuEvent(QContextMenuEvent * e)
|
|||||||
if(ok)
|
if(ok)
|
||||||
{
|
{
|
||||||
this->setDepthColorMapRange(value, _depthColorMapMaxRange);
|
this->setDepthColorMapRange(value, _depthColorMapMaxRange);
|
||||||
if(!_imageDepthCv.empty())
|
if(!_imageDepthCv.empty()) {
|
||||||
this->setImageDepth(_imageDepthCv);
|
this->setImageDepth(_imageDepthCv, _imageDepthConfidenceCv);
|
||||||
|
}
|
||||||
Q_EMIT configChanged();
|
Q_EMIT configChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1011,8 +1074,9 @@ void ImageView::contextMenuEvent(QContextMenuEvent * e)
|
|||||||
if(ok)
|
if(ok)
|
||||||
{
|
{
|
||||||
this->setDepthColorMapRange(_depthColorMapMinRange, value);
|
this->setDepthColorMapRange(_depthColorMapMinRange, value);
|
||||||
if(!_imageDepthCv.empty())
|
if(!_imageDepthCv.empty()) {
|
||||||
this->setImageDepth(_imageDepthCv);
|
this->setImageDepth(_imageDepthCv, _imageDepthConfidenceCv);
|
||||||
|
}
|
||||||
Q_EMIT configChanged();
|
Q_EMIT configChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1047,7 +1111,7 @@ void ImageView::contextMenuEvent(QContextMenuEvent * e)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(action == _showImage || action ==_showImageDepth)
|
if(action == _showImage || action ==_showImageDepth || action ==_showImageDepthConfidence)
|
||||||
{
|
{
|
||||||
this->updateOpacity();
|
this->updateOpacity();
|
||||||
Q_EMIT configChanged();
|
Q_EMIT configChanged();
|
||||||
@@ -1059,17 +1123,16 @@ void ImageView::mouseMoveEvent(QMouseEvent * event)
|
|||||||
if(_mouseTracking->isChecked() &&
|
if(_mouseTracking->isChecked() &&
|
||||||
!_graphicsView->scene()->sceneRect().isNull() &&
|
!_graphicsView->scene()->sceneRect().isNull() &&
|
||||||
!_image.isNull() &&
|
!_image.isNull() &&
|
||||||
!_imageDepthCv.empty() &&
|
!_imageDepthCv.empty() &&(_imageDepthCv.type() == CV_16UC1 || _imageDepthCv.type() == CV_32FC1))
|
||||||
(_imageDepthCv.type() == CV_16UC1 || _imageDepthCv.type() == CV_32FC1))
|
|
||||||
{
|
{
|
||||||
float scale, offsetX, offsetY;
|
float scale, offsetX, offsetY;
|
||||||
computeScaleOffsets(this->rect(), scale, offsetX, offsetY);
|
computeScaleOffsets(this->rect(), scale, offsetX, offsetY);
|
||||||
float u = (event->pos().x() - offsetX) / scale;
|
float u = (event->pos().x() - offsetX) / scale;
|
||||||
float v = (event->pos().y() - offsetY) / scale;
|
float v = (event->pos().y() - offsetY) / scale;
|
||||||
float depthScale = 1;
|
float depthScale = 1;
|
||||||
if(_image.width() > _imageDepth.width())
|
if(_image.width() > _imageDepthCv.cols)
|
||||||
{
|
{
|
||||||
depthScale = _imageDepth.width() / _image.width();
|
depthScale = float(_imageDepthCv.cols) / float(_image.width());
|
||||||
}
|
}
|
||||||
int ud = int(u*depthScale);
|
int ud = int(u*depthScale);
|
||||||
int vd = int(v*depthScale);
|
int vd = int(v*depthScale);
|
||||||
@@ -1077,33 +1140,47 @@ void ImageView::mouseMoveEvent(QMouseEvent * event)
|
|||||||
ud < _imageDepthCv.cols &&
|
ud < _imageDepthCv.cols &&
|
||||||
vd < _imageDepthCv.rows)
|
vd < _imageDepthCv.rows)
|
||||||
{
|
{
|
||||||
float depth = 0;
|
if( _showImageDepthConfidence->isChecked() &&
|
||||||
if(_imageDepthCv.type() == CV_32FC1)
|
!_imageDepthConfidenceCv.empty() &&
|
||||||
|
_imageDepthCv.size() == _imageDepthConfidenceCv.size())
|
||||||
{
|
{
|
||||||
depth = _imageDepthCv.at<float>(vd, ud);
|
unsigned char confidence = _imageDepthConfidenceCv.at<unsigned char>(vd, ud);
|
||||||
|
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||||
|
QToolTip::showText(event->globalPosition().toPoint(), tr("Confidence=%1%").arg(confidence));
|
||||||
|
#else
|
||||||
|
QToolTip::showText(event->globalPos(), tr("Confidence=%1%").arg(confidence));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
depth = float(_imageDepthCv.at<unsigned short>(vd, ud)) / 1000.0f;
|
float depth = 0;
|
||||||
}
|
if(_imageDepthCv.type() == CV_32FC1)
|
||||||
|
{
|
||||||
|
depth = _imageDepthCv.at<float>(vd, ud);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
depth = float(_imageDepthCv.at<unsigned short>(vd, ud)) / 1000.0f;
|
||||||
|
}
|
||||||
|
|
||||||
cv::Point3f pt(0,0,0);
|
cv::Point3f pt(0,0,0);
|
||||||
if(depth>0 && !_models.empty() && !_pose.isNull())
|
if(depth>0 && !_models.empty() && !_pose.isNull())
|
||||||
{
|
{
|
||||||
int subImageWidth = _imageDepthCv.cols / _models.size();
|
int subImageWidth = _imageDepthCv.cols / _models.size();
|
||||||
int subImageIndex = ud / subImageWidth;
|
int subImageIndex = ud / subImageWidth;
|
||||||
UASSERT(subImageIndex < (int)_models.size());
|
UASSERT(subImageIndex < (int)_models.size());
|
||||||
float x,y,z;
|
float x,y,z;
|
||||||
_models[subImageIndex].project(u, v, depth, x, y, z);
|
_models[subImageIndex].project(u, v, depth, x, y, z);
|
||||||
pt = cv::Point3f(x,y,z);
|
pt = cv::Point3f(x,y,z);
|
||||||
pt = util3d::transformPoint(pt, _pose*_models[subImageIndex].localTransform());
|
pt = util3d::transformPoint(pt, _pose*_models[subImageIndex].localTransform());
|
||||||
}
|
}
|
||||||
|
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||||
QToolTip::showText(event->globalPosition().toPoint(), pt.x!=0?tr("Depth=%1m Map=(%2,%3,%4)").arg(depth).arg(pt.x).arg(pt.y).arg(pt.z):depth > 0?tr("Depth=%1m").arg(depth):tr("Depth=NA"));
|
QToolTip::showText(event->globalPosition().toPoint(), pt.x!=0?tr("Depth=%1m Map=(%2,%3,%4)").arg(depth).arg(pt.x).arg(pt.y).arg(pt.z):depth > 0?tr("Depth=%1m").arg(depth):tr("Depth=NA"));
|
||||||
#else
|
#else
|
||||||
QToolTip::showText(event->globalPos(), pt.x!=0?tr("Depth=%1m Map=(%2,%3,%4)").arg(depth).arg(pt.x).arg(pt.y).arg(pt.z):depth > 0?tr("Depth=%1m").arg(depth):tr("Depth=NA"));
|
QToolTip::showText(event->globalPos(), pt.x!=0?tr("Depth=%1m Map=(%2,%3,%4)").arg(depth).arg(pt.x).arg(pt.y).arg(pt.z):depth > 0?tr("Depth=%1m").arg(depth):tr("Depth=NA"));
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1115,23 +1192,31 @@ void ImageView::mouseMoveEvent(QMouseEvent * event)
|
|||||||
|
|
||||||
void ImageView::updateOpacity()
|
void ImageView::updateOpacity()
|
||||||
{
|
{
|
||||||
if(_imageItem && _imageDepthItem)
|
if(_imageItem && (_imageDepthItem || _imageDepthConfidenceItem))
|
||||||
{
|
{
|
||||||
if(_imageItem->isVisible() && _imageDepthItem->isVisible())
|
if(_imageItem->isVisible() &&
|
||||||
|
((_imageDepthItem && _imageDepthItem->isVisible()) ||
|
||||||
|
(_imageDepthConfidenceItem && _imageDepthConfidenceItem->isVisible())))
|
||||||
{
|
{
|
||||||
QGraphicsOpacityEffect * effect = new QGraphicsOpacityEffect();
|
if(_imageDepthItem) {
|
||||||
effect->setOpacity(0.5);
|
QGraphicsOpacityEffect * effect = new QGraphicsOpacityEffect();
|
||||||
_imageDepthItem->setGraphicsEffect(effect);
|
effect->setOpacity(0.5);
|
||||||
}
|
_imageDepthItem->setGraphicsEffect(effect);
|
||||||
else
|
}
|
||||||
{
|
if(_imageDepthConfidenceItem) {
|
||||||
_imageDepthItem->setGraphicsEffect(0);
|
QGraphicsOpacityEffect * effect = new QGraphicsOpacityEffect();
|
||||||
|
effect->setOpacity(0.5);
|
||||||
|
_imageDepthConfidenceItem->setGraphicsEffect(effect);
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(_imageDepthItem)
|
if(_imageDepthItem) {
|
||||||
{
|
|
||||||
_imageDepthItem->setGraphicsEffect(0);
|
_imageDepthItem->setGraphicsEffect(0);
|
||||||
}
|
}
|
||||||
|
if(_imageDepthConfidenceItem) {
|
||||||
|
_imageDepthConfidenceItem->setGraphicsEffect(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImageView::setFeatures(const std::multimap<int, cv::KeyPoint> & refWords, const cv::Mat & depth, const QColor & color)
|
void ImageView::setFeatures(const std::multimap<int, cv::KeyPoint> & refWords, const cv::Mat & depth, const QColor & color)
|
||||||
@@ -1261,15 +1346,23 @@ void ImageView::setImage(const QImage & image, const std::vector<CameraModel> &
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImageView::setImageDepth(const cv::Mat & imageDepth)
|
void ImageView::setImageDepth(const cv::Mat & imageDepth, const cv::Mat & imageDepthConfidence)
|
||||||
{
|
{
|
||||||
_imageDepthCv = imageDepth;
|
_imageDepthCv = imageDepth;
|
||||||
setImageDepth(uCvMat2QImage(_imageDepthCv, true, getDepthColorMap(), _depthColorMapMinRange, _depthColorMapMaxRange));
|
_imageDepthConfidenceCv = imageDepthConfidence;
|
||||||
|
setImageDepth(
|
||||||
|
uCvMat2QImage(_imageDepthCv, true, getDepthColorMap(), _depthColorMapMinRange, _depthColorMapMaxRange),
|
||||||
|
uCvMat2QImage(_imageDepthConfidenceCv, true, getDepthColorMap()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImageView::setImageDepth(const QImage & imageDepth)
|
void ImageView::setImageDepth(const QImage & imageDepth, const QImage & imageDepthConfidence)
|
||||||
{
|
{
|
||||||
_imageDepth = QPixmap::fromImage(imageDepth);
|
_imageDepth = QPixmap::fromImage(imageDepth);
|
||||||
|
if(!imageDepthConfidence.isNull()) {
|
||||||
|
_imageDepthConfidence = QPixmap::fromImage(imageDepthConfidence);
|
||||||
|
} else {
|
||||||
|
_showImageDepthConfidence->setChecked(false);
|
||||||
|
}
|
||||||
|
|
||||||
UASSERT(_imageDepth.width() && _imageDepth.height());
|
UASSERT(_imageDepth.width() && _imageDepth.height());
|
||||||
|
|
||||||
@@ -1279,6 +1372,9 @@ void ImageView::setImageDepth(const QImage & imageDepth)
|
|||||||
{
|
{
|
||||||
// scale depth to rgb
|
// scale depth to rgb
|
||||||
_imageDepth = _imageDepth.scaled(_image.size());
|
_imageDepth = _imageDepth.scaled(_image.size());
|
||||||
|
if(!_imageDepthConfidence.isNull()) {
|
||||||
|
_imageDepthConfidence = _imageDepthConfidence.scaled(_image.size());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(_graphicsView->isVisible())
|
if(_graphicsView->isVisible())
|
||||||
@@ -1286,11 +1382,18 @@ void ImageView::setImageDepth(const QImage & imageDepth)
|
|||||||
if(_imageDepthItem)
|
if(_imageDepthItem)
|
||||||
{
|
{
|
||||||
_imageDepthItem->setPixmap(_imageDepth);
|
_imageDepthItem->setPixmap(_imageDepth);
|
||||||
|
if(_imageDepthConfidenceItem) {
|
||||||
|
_imageDepthConfidenceItem->setPixmap(_imageDepthConfidence);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_imageDepthItem = _graphicsView->scene()->addPixmap(_imageDepth);
|
_imageDepthItem = _graphicsView->scene()->addPixmap(_imageDepth);
|
||||||
_imageDepthItem->setVisible(_showImageDepth->isChecked());
|
_imageDepthItem->setVisible(_showImageDepth->isChecked());
|
||||||
|
if(!_imageDepthConfidence.isNull()) {
|
||||||
|
_imageDepthConfidenceItem = _graphicsView->scene()->addPixmap(_imageDepthConfidence);
|
||||||
|
_imageDepthConfidenceItem->setVisible(_showImageDepthConfidence->isChecked());
|
||||||
|
}
|
||||||
this->updateOpacity();
|
this->updateOpacity();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1471,6 +1574,12 @@ void ImageView::clear()
|
|||||||
delete _imageDepthItem;
|
delete _imageDepthItem;
|
||||||
_imageDepthItem = 0;
|
_imageDepthItem = 0;
|
||||||
}
|
}
|
||||||
|
if(_imageDepthConfidenceItem)
|
||||||
|
{
|
||||||
|
_graphicsView->scene()->removeItem(_imageDepthConfidenceItem);
|
||||||
|
delete _imageDepthConfidenceItem;
|
||||||
|
_imageDepthConfidenceItem = 0;
|
||||||
|
}
|
||||||
_imageDepth = QPixmap();
|
_imageDepth = QPixmap();
|
||||||
|
|
||||||
_graphicsView->scene()->setSceneRect(QRectF());
|
_graphicsView->scene()->setSceneRect(QRectF());
|
||||||
|
|||||||
+25
-10
@@ -1225,13 +1225,15 @@ void MainWindow::processOdometry(const rtabmap::OdometryEvent & odom, bool dataI
|
|||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
|
||||||
pcl::IndicesPtr indices(new std::vector<int>);
|
pcl::IndicesPtr indices(new std::vector<int>);
|
||||||
|
|
||||||
cloud = util3d::cloudRGBFromSensorData(*data,
|
cloud = util3d::cloudRGBFromSensorData(
|
||||||
|
*data,
|
||||||
_preferencesDialog->getCloudDecimation(1),
|
_preferencesDialog->getCloudDecimation(1),
|
||||||
_preferencesDialog->getCloudMaxDepth(1),
|
_preferencesDialog->getCloudMaxDepth(1),
|
||||||
_preferencesDialog->getCloudMinDepth(1),
|
_preferencesDialog->getCloudMinDepth(1),
|
||||||
indices.get(),
|
indices.get(),
|
||||||
_preferencesDialog->getAllParameters(),
|
_preferencesDialog->getAllParameters(),
|
||||||
_preferencesDialog->getCloudRoiRatios(1));
|
_preferencesDialog->getCloudRoiRatios(1),
|
||||||
|
_preferencesDialog->getCloudConfidenceThr(1));
|
||||||
if(indices->size())
|
if(indices->size())
|
||||||
{
|
{
|
||||||
cloud = util3d::transformPointCloud(cloud, pose);
|
cloud = util3d::transformPointCloud(cloud, pose);
|
||||||
@@ -1717,7 +1719,7 @@ void MainWindow::processOdometry(const rtabmap::OdometryEvent & odom, bool dataI
|
|||||||
_ui->imageView_odometry->setImage(uCvMat2QImage(data->imageRaw()));
|
_ui->imageView_odometry->setImage(uCvMat2QImage(data->imageRaw()));
|
||||||
if(_ui->imageView_odometry->isImageDepthShown() && !data->depthOrRightRaw().empty())
|
if(_ui->imageView_odometry->isImageDepthShown() && !data->depthOrRightRaw().empty())
|
||||||
{
|
{
|
||||||
_ui->imageView_odometry->setImageDepth(data->depthOrRightRaw());
|
_ui->imageView_odometry->setImageDepth(data->depthOrRightRaw(), data->depthConfidenceRaw());
|
||||||
}
|
}
|
||||||
|
|
||||||
if( odom.info().type == (int)Odometry::kTypeF2M ||
|
if( odom.info().type == (int)Odometry::kTypeF2M ||
|
||||||
@@ -1908,9 +1910,8 @@ void MainWindow::processOdometry(const rtabmap::OdometryEvent & odom, bool dataI
|
|||||||
{
|
{
|
||||||
if(!odomT.isNull())
|
if(!odomT.isNull())
|
||||||
{
|
{
|
||||||
rtabmap::Transform diff = odom.info().transformGroundTruth.inverse()*odomT;
|
_ui->statsToolBox->updateStat("Odometry/TG_error_lin/m", _preferencesDialog->isTimeUsedInFigures()?data->stamp()-_firstStamp:(float)data->id(), odom.info().transformGroundTruth.getDistance(odomT), _preferencesDialog->isCacheSavedInFigures());
|
||||||
_ui->statsToolBox->updateStat("Odometry/TG_error_lin/m", _preferencesDialog->isTimeUsedInFigures()?data->stamp()-_firstStamp:(float)data->id(), diff.getNorm(), _preferencesDialog->isCacheSavedInFigures());
|
_ui->statsToolBox->updateStat("Odometry/TG_error_ang/deg", _preferencesDialog->isTimeUsedInFigures()?data->stamp()-_firstStamp:(float)data->id(), odom.info().transformGroundTruth.getAngle(odomT)*180.0/CV_PI, _preferencesDialog->isCacheSavedInFigures());
|
||||||
_ui->statsToolBox->updateStat("Odometry/TG_error_ang/deg", _preferencesDialog->isTimeUsedInFigures()?data->stamp()-_firstStamp:(float)data->id(), diff.getAngle()*180.0/CV_PI, _preferencesDialog->isCacheSavedInFigures());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
odom.info().transformGroundTruth.getTranslationAndEulerAngles(x,y,z,roll,pitch,yaw);
|
odom.info().transformGroundTruth.getTranslationAndEulerAngles(x,y,z,roll,pitch,yaw);
|
||||||
@@ -2343,7 +2344,7 @@ void MainWindow::processStats(const rtabmap::Statistics & stat)
|
|||||||
}
|
}
|
||||||
if(!signature.sensorData().depthOrRightRaw().empty())
|
if(!signature.sensorData().depthOrRightRaw().empty())
|
||||||
{
|
{
|
||||||
_ui->imageView_source->setImageDepth(signature.sensorData().depthOrRightRaw());
|
_ui->imageView_source->setImageDepth(signature.sensorData().depthOrRightRaw(), signature.sensorData().depthConfidenceRaw());
|
||||||
}
|
}
|
||||||
if(img.isNull() && signature.sensorData().depthOrRightRaw().empty())
|
if(img.isNull() && signature.sensorData().depthOrRightRaw().empty())
|
||||||
{
|
{
|
||||||
@@ -2375,7 +2376,7 @@ void MainWindow::processStats(const rtabmap::Statistics & stat)
|
|||||||
}
|
}
|
||||||
if(!loopSignature.sensorData().depthOrRightRaw().empty())
|
if(!loopSignature.sensorData().depthOrRightRaw().empty())
|
||||||
{
|
{
|
||||||
_ui->imageView_loopClosure->setImageDepth(loopSignature.sensorData().depthOrRightRaw());
|
_ui->imageView_loopClosure->setImageDepth(loopSignature.sensorData().depthOrRightRaw(), loopSignature.sensorData().depthConfidenceRaw());
|
||||||
}
|
}
|
||||||
if(_ui->imageView_loopClosure->sceneRect().isNull())
|
if(_ui->imageView_loopClosure->sceneRect().isNull())
|
||||||
{
|
{
|
||||||
@@ -3718,7 +3719,8 @@ std::pair<pcl::PointCloud<pcl::PointXYZRGB>::Ptr, pcl::IndicesPtr> MainWindow::c
|
|||||||
_preferencesDialog->getCloudMinDepth(0),
|
_preferencesDialog->getCloudMinDepth(0),
|
||||||
indices.get(),
|
indices.get(),
|
||||||
allParameters,
|
allParameters,
|
||||||
_preferencesDialog->getCloudRoiRatios(0));
|
_preferencesDialog->getCloudRoiRatios(0),
|
||||||
|
_preferencesDialog->getCloudConfidenceThr(0));
|
||||||
|
|
||||||
// view point
|
// view point
|
||||||
Eigen::Vector3f viewPoint(0.0f,0.0f,0.0f);
|
Eigen::Vector3f viewPoint(0.0f,0.0f,0.0f);
|
||||||
@@ -8187,6 +8189,12 @@ void MainWindow::exportImages()
|
|||||||
QDir dir;
|
QDir dir;
|
||||||
dir.mkdir(QString("%1/rgb").arg(path));
|
dir.mkdir(QString("%1/rgb").arg(path));
|
||||||
dir.mkdir(QString("%1/depth").arg(path));
|
dir.mkdir(QString("%1/depth").arg(path));
|
||||||
|
|
||||||
|
if(!data.depthConfidenceRaw().empty())
|
||||||
|
{
|
||||||
|
QDir dir;
|
||||||
|
dir.mkdir(QString("%1/confidence").arg(path));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(data.cameraModels().size() > 1)
|
if(data.cameraModels().size() > 1)
|
||||||
@@ -8245,7 +8253,14 @@ void MainWindow::exportImages()
|
|||||||
UWARN("Failed saving \"%s\"", QString("%1/rgb/%2.%3").arg(path).arg(id).arg(ext).toStdString().c_str());
|
UWARN("Failed saving \"%s\"", QString("%1/rgb/%2.%3").arg(path).arg(id).arg(ext).toStdString().c_str());
|
||||||
if(!cv::imwrite(QString("%1/depth/%2.png").arg(path).arg(id).toStdString(), data.depthRaw().type()==CV_32FC1?util2d::cvtDepthFromFloat(data.depthRaw()):data.depthRaw()))
|
if(!cv::imwrite(QString("%1/depth/%2.png").arg(path).arg(id).toStdString(), data.depthRaw().type()==CV_32FC1?util2d::cvtDepthFromFloat(data.depthRaw()):data.depthRaw()))
|
||||||
UWARN("Failed saving \"%s\"", QString("%1/depth/%2.png").arg(path).arg(id).toStdString().c_str());
|
UWARN("Failed saving \"%s\"", QString("%1/depth/%2.png").arg(path).arg(id).toStdString().c_str());
|
||||||
info = tr("Saved rgb/%1.%2 and depth/%1.png.").arg(id).arg(ext);
|
if(data.depthConfidenceRaw().empty()) {
|
||||||
|
info = tr("Saved rgb/%1.%2 and depth/%1.png.").arg(id).arg(ext);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(!cv::imwrite(QString("%1/confidence/%2.png").arg(path).arg(id).toStdString(), data.depthConfidenceRaw()))
|
||||||
|
UWARN("Failed saving \"%s\"", QString("%1/confidence/%2.png").arg(path).arg(id).toStdString().c_str());
|
||||||
|
info = tr("Saved rgb/%1.%2, depth/%1.png and confidence/%1.png.").arg(id).arg(ext);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(!data.imageRaw().empty())
|
else if(!data.imageRaw().empty())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -551,6 +551,10 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
_3dRenderingRoiRatios[0] = _ui->lineEdit_roiRatios;
|
_3dRenderingRoiRatios[0] = _ui->lineEdit_roiRatios;
|
||||||
_3dRenderingRoiRatios[1] = _ui->lineEdit_roiRatios_odom;
|
_3dRenderingRoiRatios[1] = _ui->lineEdit_roiRatios_odom;
|
||||||
|
|
||||||
|
_3dRenderingDepthConfidenceThr.resize(2);
|
||||||
|
_3dRenderingDepthConfidenceThr[0] = _ui->spinBox_depthConf;
|
||||||
|
_3dRenderingDepthConfidenceThr[1] = _ui->spinBox_depthConf_odom;
|
||||||
|
|
||||||
_3dRenderingColorScheme.resize(2);
|
_3dRenderingColorScheme.resize(2);
|
||||||
_3dRenderingColorScheme[0] = _ui->spinBox_colorScheme;
|
_3dRenderingColorScheme[0] = _ui->spinBox_colorScheme;
|
||||||
_3dRenderingColorScheme[1] = _ui->spinBox_colorScheme_odom;
|
_3dRenderingColorScheme[1] = _ui->spinBox_colorScheme_odom;
|
||||||
@@ -622,6 +626,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
connect(_3dRenderingMaxDepth[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingMaxDepth[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_3dRenderingMinDepth[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingMinDepth[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_3dRenderingRoiRatios[i], SIGNAL(textChanged(const QString &)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingRoiRatios[i], SIGNAL(textChanged(const QString &)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
|
connect(_3dRenderingDepthConfidenceThr[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_3dRenderingShowScans[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingShowScans[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_3dRenderingShowFeatures[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingShowFeatures[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_3dRenderingShowFrustums[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingShowFrustums[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
@@ -2030,6 +2035,7 @@ void PreferencesDialog::resetSettings(QGroupBox * groupBox)
|
|||||||
_3dRenderingMaxDepth[i]->setValue(0.0);
|
_3dRenderingMaxDepth[i]->setValue(0.0);
|
||||||
_3dRenderingMinDepth[i]->setValue(0.0);
|
_3dRenderingMinDepth[i]->setValue(0.0);
|
||||||
_3dRenderingRoiRatios[i]->setText("0.0 0.0 0.0 0.0");
|
_3dRenderingRoiRatios[i]->setText("0.0 0.0 0.0 0.0");
|
||||||
|
_3dRenderingDepthConfidenceThr[i]->setValue(0);
|
||||||
_3dRenderingShowScans[i]->setChecked(true);
|
_3dRenderingShowScans[i]->setChecked(true);
|
||||||
_3dRenderingShowFeatures[i]->setChecked(i==0?false:true);
|
_3dRenderingShowFeatures[i]->setChecked(i==0?false:true);
|
||||||
_3dRenderingShowFrustums[i]->setChecked(false);
|
_3dRenderingShowFrustums[i]->setChecked(false);
|
||||||
@@ -2548,6 +2554,7 @@ void PreferencesDialog::readGuiSettings(const QString & filePath)
|
|||||||
_3dRenderingMaxDepth[i]->setValue(settings.value(QString("maxDepth%1").arg(i), _3dRenderingMaxDepth[i]->value()).toDouble());
|
_3dRenderingMaxDepth[i]->setValue(settings.value(QString("maxDepth%1").arg(i), _3dRenderingMaxDepth[i]->value()).toDouble());
|
||||||
_3dRenderingMinDepth[i]->setValue(settings.value(QString("minDepth%1").arg(i), _3dRenderingMinDepth[i]->value()).toDouble());
|
_3dRenderingMinDepth[i]->setValue(settings.value(QString("minDepth%1").arg(i), _3dRenderingMinDepth[i]->value()).toDouble());
|
||||||
_3dRenderingRoiRatios[i]->setText(settings.value(QString("roiRatios%1").arg(i), _3dRenderingRoiRatios[i]->text()).toString());
|
_3dRenderingRoiRatios[i]->setText(settings.value(QString("roiRatios%1").arg(i), _3dRenderingRoiRatios[i]->text()).toString());
|
||||||
|
_3dRenderingDepthConfidenceThr[i]->setValue(settings.value(QString("depthConf%1").arg(i), _3dRenderingDepthConfidenceThr[i]->value()).toInt());
|
||||||
_3dRenderingShowScans[i]->setChecked(settings.value(QString("showScans%1").arg(i), _3dRenderingShowScans[i]->isChecked()).toBool());
|
_3dRenderingShowScans[i]->setChecked(settings.value(QString("showScans%1").arg(i), _3dRenderingShowScans[i]->isChecked()).toBool());
|
||||||
_3dRenderingShowFeatures[i]->setChecked(settings.value(QString("showFeatures%1").arg(i), _3dRenderingShowFeatures[i]->isChecked()).toBool());
|
_3dRenderingShowFeatures[i]->setChecked(settings.value(QString("showFeatures%1").arg(i), _3dRenderingShowFeatures[i]->isChecked()).toBool());
|
||||||
_3dRenderingShowFrustums[i]->setChecked(settings.value(QString("showFrustums%1").arg(i), _3dRenderingShowFrustums[i]->isChecked()).toBool());
|
_3dRenderingShowFrustums[i]->setChecked(settings.value(QString("showFrustums%1").arg(i), _3dRenderingShowFrustums[i]->isChecked()).toBool());
|
||||||
@@ -3156,6 +3163,7 @@ void PreferencesDialog::writeGuiSettings(const QString & filePath) const
|
|||||||
settings.setValue(QString("maxDepth%1").arg(i), _3dRenderingMaxDepth[i]->value());
|
settings.setValue(QString("maxDepth%1").arg(i), _3dRenderingMaxDepth[i]->value());
|
||||||
settings.setValue(QString("minDepth%1").arg(i), _3dRenderingMinDepth[i]->value());
|
settings.setValue(QString("minDepth%1").arg(i), _3dRenderingMinDepth[i]->value());
|
||||||
settings.setValue(QString("roiRatios%1").arg(i), _3dRenderingRoiRatios[i]->text());
|
settings.setValue(QString("roiRatios%1").arg(i), _3dRenderingRoiRatios[i]->text());
|
||||||
|
settings.setValue(QString("depthConf%1").arg(i), _3dRenderingDepthConfidenceThr[i]->value());
|
||||||
settings.setValue(QString("showScans%1").arg(i), _3dRenderingShowScans[i]->isChecked());
|
settings.setValue(QString("showScans%1").arg(i), _3dRenderingShowScans[i]->isChecked());
|
||||||
settings.setValue(QString("showFeatures%1").arg(i), _3dRenderingShowFeatures[i]->isChecked());
|
settings.setValue(QString("showFeatures%1").arg(i), _3dRenderingShowFeatures[i]->isChecked());
|
||||||
settings.setValue(QString("showFrustums%1").arg(i), _3dRenderingShowFrustums[i]->isChecked());
|
settings.setValue(QString("showFrustums%1").arg(i), _3dRenderingShowFrustums[i]->isChecked());
|
||||||
@@ -6105,6 +6113,11 @@ std::vector<float> PreferencesDialog::getCloudRoiRatios(int index) const
|
|||||||
}
|
}
|
||||||
return roiRatios;
|
return roiRatios;
|
||||||
}
|
}
|
||||||
|
unsigned char PreferencesDialog::getCloudConfidenceThr(int index) const
|
||||||
|
{
|
||||||
|
UASSERT(index >= 0 && index <= 1);
|
||||||
|
return (unsigned char)_3dRenderingDepthConfidenceThr[index]->value();
|
||||||
|
}
|
||||||
int PreferencesDialog::getCloudColorScheme(int index) const
|
int PreferencesDialog::getCloudColorScheme(int index) const
|
||||||
{
|
{
|
||||||
UASSERT(index >= 0 && index <= 1);
|
UASSERT(index >= 0 && index <= 1);
|
||||||
|
|||||||
+261
-203
@@ -61,7 +61,7 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>419</width>
|
<width>307</width>
|
||||||
<height>389</height>
|
<height>389</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
@@ -392,7 +392,7 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>418</width>
|
<width>306</width>
|
||||||
<height>389</height>
|
<height>389</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
@@ -1643,7 +1643,7 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QToolBox" name="toolBox">
|
<widget class="QToolBox" name="toolBox">
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>2</number>
|
<number>1</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_3">
|
<widget class="QWidget" name="page_3">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
@@ -1805,9 +1805,9 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>-316</y>
|
||||||
<width>276</width>
|
<width>518</width>
|
||||||
<height>1201</height>
|
<height>1071</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<attribute name="label">
|
<attribute name="label">
|
||||||
@@ -1816,24 +1816,57 @@
|
|||||||
<layout class="QVBoxLayout" name="verticalLayout_16">
|
<layout class="QVBoxLayout" name="verticalLayout_16">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QGridLayout" name="gridLayout_9" columnstretch="0,0">
|
<layout class="QGridLayout" name="gridLayout_9" columnstretch="0,0">
|
||||||
<item row="6" column="1">
|
<item row="3" column="1">
|
||||||
<widget class="QLabel" name="label_53">
|
<widget class="QLabel" name="label_octomap_empty_3">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>OctoMap</string>
|
<string>Ground cell color</string>
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="15" column="1">
|
|
||||||
<widget class="QLabel" name="label_57">
|
|
||||||
<property name="text">
|
|
||||||
<string>Crop radius when filtering empty space from 2d occupancy grid.</string>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="15" column="0">
|
<item row="14" column="1">
|
||||||
|
<widget class="QLabel" name="label_61">
|
||||||
|
<property name="text">
|
||||||
|
<string>Minimum depth confidence.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="18" column="1">
|
||||||
|
<widget class="QLabel" name="label_59">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show probabilistic occupancy grid in Graph View.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="11" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_grid_regenerateFromSavedGrid">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_grid_empty">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="17" column="0">
|
||||||
<widget class="QSpinBox" name="spinBox_cropRadius">
|
<widget class="QSpinBox" name="spinBox_cropRadius">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> pixels</string>
|
<string> pixels</string>
|
||||||
@@ -1843,13 +1876,13 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="16" column="0">
|
<item row="20" column="1">
|
||||||
<widget class="QCheckBox" name="checkBox_grid_showProbMap">
|
<widget class="QLabel" name="label_logger_level_2">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string>For stereo data, show disparity instead of right image in main views.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checked">
|
<property name="wordWrap">
|
||||||
<bool>false</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -1869,33 +1902,17 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="0">
|
<item row="5" column="0">
|
||||||
<widget class="QSpinBox" name="spinBox_grid_depth">
|
<layout class="QHBoxLayout" name="horizontalLayout_17">
|
||||||
<property name="prefix">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>16</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>16</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_9">
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QToolButton" name="toolButton_groundColor">
|
<widget class="QToolButton" name="toolButton_frontierColor">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>...</string>
|
<string>...</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLineEdit" name="lineEdit_groundColor">
|
<widget class="QLineEdit" name="lineEdit_frontierColor">
|
||||||
<property name="readOnly">
|
<property name="readOnly">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
@@ -1903,18 +1920,18 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="1">
|
<item row="17" column="1">
|
||||||
<widget class="QLabel" name="label_octomap_cubes">
|
<widget class="QLabel" name="label_57">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>OctoMap: Rendering type</string>
|
<string>Crop radius when filtering empty space from 2d occupancy grid.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="18" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_grid_frontiers">
|
<widget class="QCheckBox" name="checkBox_grid_showProbMap">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
@@ -1923,10 +1940,20 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="14" column="1">
|
<item row="19" column="1">
|
||||||
<widget class="QLabel" name="label_54">
|
<widget class="QLabel" name="label_60">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Voxel size (for clouds and scans)</string>
|
<string>Create RGB-D cloud from RGB projection on scan.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="11" column="1">
|
||||||
|
<widget class="QLabel" name="label_55">
|
||||||
|
<property name="text">
|
||||||
|
<string>Local grid: regenerate from saved grid instead of sensors</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@@ -1943,20 +1970,13 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="11" column="0">
|
<item row="9" column="1">
|
||||||
<widget class="QCheckBox" name="checkBox_grid_regenerateFromSavedGrid">
|
<widget class="QLabel" name="label_octomap_cubes">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string>OctoMap: Rendering type</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checked">
|
<property name="wordWrap">
|
||||||
<bool>false</bool>
|
<bool>true</bool>
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="0">
|
|
||||||
<widget class="QCheckBox" name="checkBox_octomap">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -1980,8 +2000,8 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="18" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_showDisparityInsteadOfRight">
|
<widget class="QCheckBox" name="checkBox_grid_frontiers">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
@@ -1990,105 +2010,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="16" column="1">
|
<item row="19" column="0">
|
||||||
<widget class="QLabel" name="label_59">
|
|
||||||
<property name="text">
|
|
||||||
<string>Show probabilistic occupancy grid in Graph View.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="18" column="1">
|
|
||||||
<widget class="QLabel" name="label_logger_level_2">
|
|
||||||
<property name="text">
|
|
||||||
<string>For stereo data, show disparity instead of right image in main views.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="1">
|
|
||||||
<widget class="QLabel" name="label_octomap_empty_3">
|
|
||||||
<property name="text">
|
|
||||||
<string>Ground cell color</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="12" column="0">
|
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_gainCompensationRadius">
|
|
||||||
<property name="suffix">
|
|
||||||
<string> m</string>
|
|
||||||
</property>
|
|
||||||
<property name="decimals">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<double>0.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<double>10.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<double>0.010000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<double>0.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="1">
|
|
||||||
<widget class="QLabel" name="label_octomap_empty_4">
|
|
||||||
<property name="text">
|
|
||||||
<string>Empty cell color</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_12">
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="toolButton_emptyColor">
|
|
||||||
<property name="text">
|
|
||||||
<string>...</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="lineEdit_emptyColor">
|
|
||||||
<property name="readOnly">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_11">
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="toolButton_obstacleColor">
|
|
||||||
<property name="text">
|
|
||||||
<string>...</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="lineEdit_obstacleColor">
|
|
||||||
<property name="readOnly">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="17" column="0">
|
|
||||||
<widget class="QCheckBox" name="checkBox_cameraProjection">
|
<widget class="QCheckBox" name="checkBox_cameraProjection">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -2098,20 +2020,10 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0">
|
<item row="0" column="1">
|
||||||
<widget class="QCheckBox" name="checkBox_grid_empty">
|
<widget class="QLabel" name="label_octomap_empty">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string>Show empty space</string>
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="11" column="1">
|
|
||||||
<widget class="QLabel" name="label_55">
|
|
||||||
<property name="text">
|
|
||||||
<string>Local grid: regenerate from saved grid instead of sensors</string>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@@ -2128,20 +2040,17 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="17" column="1">
|
<item row="6" column="1">
|
||||||
<widget class="QLabel" name="label_60">
|
<widget class="QLabel" name="label_53">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Create RGB-D cloud from RGB projection on scan.</string>
|
<string>OctoMap</string>
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="1">
|
<item row="16" column="1">
|
||||||
<widget class="QLabel" name="label_octomap_empty">
|
<widget class="QLabel" name="label_54">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Show empty space</string>
|
<string>Voxel size (for clouds and scans)</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@@ -2167,6 +2076,64 @@
|
|||||||
</item>
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="10" column="0">
|
||||||
|
<widget class="QSpinBox" name="spinBox_grid_depth">
|
||||||
|
<property name="prefix">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>16</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>16</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="12" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_gainCompensationRadius">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>10.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.010000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QLabel" name="label_octomap_frontiers_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>Frontier cell color</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QLabel" name="label_octomap_empty_4">
|
||||||
|
<property name="text">
|
||||||
|
<string>Empty cell color</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="13" column="1">
|
<item row="13" column="1">
|
||||||
<widget class="QLabel" name="label_56">
|
<widget class="QLabel" name="label_56">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -2177,7 +2144,32 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="14" column="0">
|
<item row="6" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_octomap">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_9">
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="toolButton_groundColor">
|
||||||
|
<property name="text">
|
||||||
|
<string>...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="lineEdit_groundColor">
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="16" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxelSize">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxelSize">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -2199,27 +2191,17 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="1">
|
<item row="2" column="0">
|
||||||
<widget class="QLabel" name="label_octomap_frontiers_3">
|
<layout class="QHBoxLayout" name="horizontalLayout_11">
|
||||||
<property name="text">
|
|
||||||
<string>Frontier cell color</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_17">
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QToolButton" name="toolButton_frontierColor">
|
<widget class="QToolButton" name="toolButton_obstacleColor">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>...</string>
|
<string>...</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLineEdit" name="lineEdit_frontierColor">
|
<widget class="QLineEdit" name="lineEdit_obstacleColor">
|
||||||
<property name="readOnly">
|
<property name="readOnly">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
@@ -2227,6 +2209,82 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="20" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_showDisparityInsteadOfRight">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_12">
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="toolButton_emptyColor">
|
||||||
|
<property name="text">
|
||||||
|
<string>...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="lineEdit_emptyColor">
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="15" column="1">
|
||||||
|
<widget class="QLabel" name="label_62">
|
||||||
|
<property name="text">
|
||||||
|
<string>Depth's edge bleeding filtering error.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="15" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_depthEdgeBleedingError">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>10.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.010000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="14" column="0">
|
||||||
|
<widget class="QSpinBox" name="spinBox_depthConfidence">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> %</string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>100</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@@ -2468,7 +2526,7 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>294</width>
|
<width>296</width>
|
||||||
<height>272</height>
|
<height>272</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
@@ -2642,8 +2700,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>181</width>
|
<width>428</width>
|
||||||
<height>485</height>
|
<height>196</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<attribute name="label">
|
<attribute name="label">
|
||||||
|
|||||||
@@ -23,9 +23,9 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>-2495</y>
|
<y>-654</y>
|
||||||
<width>861</width>
|
<width>861</width>
|
||||||
<height>6426</height>
|
<height>6498</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_13">
|
<layout class="QVBoxLayout" name="verticalLayout_13">
|
||||||
@@ -710,6 +710,26 @@
|
|||||||
<layout class="QVBoxLayout" name="verticalLayout_14">
|
<layout class="QVBoxLayout" name="verticalLayout_14">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QGridLayout" name="gridLayout" columnstretch="0,0,1">
|
<layout class="QGridLayout" name="gridLayout" columnstretch="0,0,1">
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QLineEdit" name="lineEdit_roiRatios"/>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="2">
|
||||||
|
<widget class="QLabel" name="label_133">
|
||||||
|
<property name="text">
|
||||||
|
<string>3D cloud minimum depth.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QSpinBox" name="spinBox_fillDepthHolesError">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> %</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="6" column="2">
|
<item row="6" column="2">
|
||||||
<widget class="QLabel" name="label_134">
|
<widget class="QLabel" name="label_134">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -720,13 +740,10 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="2">
|
<item row="4" column="1">
|
||||||
<widget class="QLabel" name="label_135">
|
<widget class="QSpinBox" name="spinBox_fillDepthHoles">
|
||||||
<property name="text">
|
<property name="suffix">
|
||||||
<string>ROI ratios [left, right, top, bottom] between 0 and 1. Only generate 3D points for pixels inside the region of interest (RGB image).</string>
|
<string> pixels</string>
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -749,21 +766,18 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="2">
|
<item row="3" column="2">
|
||||||
<widget class="QLabel" name="label_198">
|
<widget class="QLabel" name="label_135">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Fill depth hole error.</string>
|
<string>ROI ratios [left, right, top, bottom] between 0 and 1. Only generate 3D points for pixels inside the region of interest (RGB image).</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1">
|
<item row="6" column="1">
|
||||||
<widget class="QLineEdit" name="lineEdit_roiRatios"/>
|
<widget class="QLineEdit" name="lineEdit_distortionModel"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
<item row="2" column="1">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_minDepth">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_minDepth">
|
||||||
@@ -794,39 +808,6 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="1">
|
|
||||||
<widget class="QCheckBox" name="checkBox_subtraction">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="1">
|
|
||||||
<widget class="QLineEdit" name="lineEdit_distortionModel"/>
|
|
||||||
</item>
|
|
||||||
<item row="8" column="2">
|
|
||||||
<widget class="QLabel" name="label_137">
|
|
||||||
<property name="text">
|
|
||||||
<string>Cloud subtraction. Superposed points from different nodes are filtered.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="2">
|
|
||||||
<widget class="QLabel" name="label_197">
|
|
||||||
<property name="text">
|
|
||||||
<string>Fill depth hole size (0 means no fill).</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="2">
|
<item row="1" column="2">
|
||||||
<widget class="QLabel" name="label_132">
|
<widget class="QLabel" name="label_132">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -850,13 +831,6 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="1">
|
|
||||||
<widget class="QSpinBox" name="spinBox_fillDepthHolesError">
|
|
||||||
<property name="suffix">
|
|
||||||
<string> %</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="0">
|
<item row="6" column="0">
|
||||||
<widget class="QToolButton" name="toolButton_distortionModel">
|
<widget class="QToolButton" name="toolButton_distortionModel">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -864,24 +838,57 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="1">
|
<item row="10" column="2">
|
||||||
<widget class="QCheckBox" name="checkBox_bilateral">
|
<widget class="QLabel" name="label_137">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string>Cloud subtraction. Superposed points from different nodes are filtered.</string>
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="2">
|
|
||||||
<widget class="QLabel" name="label_133">
|
|
||||||
<property name="text">
|
|
||||||
<string>3D cloud minimum depth.</string>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="2">
|
<item row="5" column="2">
|
||||||
|
<widget class="QLabel" name="label_198">
|
||||||
|
<property name="text">
|
||||||
|
<string>Fill depth hole error.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="10" column="1">
|
||||||
|
<widget class="QCheckBox" name="checkBox_subtraction">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="8" column="1">
|
||||||
|
<widget class="QCheckBox" name="checkBox_bilateral">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="2">
|
||||||
|
<widget class="QLabel" name="label_197">
|
||||||
|
<property name="text">
|
||||||
|
<string>Fill depth hole size (0 means no fill).</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="8" column="2">
|
||||||
<widget class="QLabel" name="label_136">
|
<widget class="QLabel" name="label_136">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Bilateral filtering of the depth image. Reduce noise in depth images.</string>
|
<string>Bilateral filtering of the depth image. Reduce noise in depth images.</string>
|
||||||
@@ -891,10 +898,52 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="1">
|
<item row="7" column="2">
|
||||||
<widget class="QSpinBox" name="spinBox_fillDepthHoles">
|
<widget class="QLabel" name="label_147">
|
||||||
|
<property name="text">
|
||||||
|
<string>Depth's edge bleeding filter error (0 means disabled). Reduce depth noise around edges.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="1">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_depthEdgeFiltering">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> pixels</string>
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>100.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.100000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>4.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="9" column="2">
|
||||||
|
<widget class="QLabel" name="label_149">
|
||||||
|
<property name="text">
|
||||||
|
<string>Minimum depth confidence: 0% is low confidence, 100% is high confidence. Ignored if no depth confidence images were recorded or if set to 0%.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="9" column="1">
|
||||||
|
<widget class="QSpinBox" name="spinBox_depthConfidence">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> %</string>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>100</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
+432
-387
@@ -63,7 +63,7 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>-659</y>
|
<y>0</y>
|
||||||
<width>713</width>
|
<width>713</width>
|
||||||
<height>4705</height>
|
<height>4705</height>
|
||||||
</rect>
|
</rect>
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
<enum>QFrame::Raised</enum>
|
<enum>QFrame::Raised</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>12</number>
|
<number>1</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_22">
|
<widget class="QWidget" name="page_22">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,0">
|
<layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,0">
|
||||||
@@ -750,96 +750,6 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
<layout class="QVBoxLayout" name="verticalLayout_112">
|
<layout class="QVBoxLayout" name="verticalLayout_112">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,0,1">
|
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,0,1">
|
||||||
<item row="5" column="0">
|
|
||||||
<widget class="QLineEdit" name="lineEdit_roiRatios"/>
|
|
||||||
</item>
|
|
||||||
<item row="15" column="0">
|
|
||||||
<widget class="QSpinBox" name="spinBox_ptsize">
|
|
||||||
<property name="minimum">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>64</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="10" column="2">
|
|
||||||
<widget class="QLabel" name="label_355">
|
|
||||||
<property name="text">
|
|
||||||
<string>Floor filtering height (0=Disabled). This is done in /map frame.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="8" column="2">
|
|
||||||
<widget class="QLabel" name="label_169">
|
|
||||||
<property name="text">
|
|
||||||
<string>Noise filtering min neighbors.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="12" column="0">
|
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_normalRadiusSearch">
|
|
||||||
<property name="singleStep">
|
|
||||||
<double>0.010000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="13" column="2">
|
|
||||||
<widget class="QLabel" name="label_459">
|
|
||||||
<property name="text">
|
|
||||||
<string>Default color scheme key.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="13" column="1">
|
|
||||||
<widget class="QSpinBox" name="spinBox_colorScheme_odom"/>
|
|
||||||
</item>
|
|
||||||
<item row="13" column="0">
|
|
||||||
<widget class="QSpinBox" name="spinBox_colorScheme"/>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="1">
|
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_maxDepth_odom">
|
|
||||||
<property name="suffix">
|
|
||||||
<string> m</string>
|
|
||||||
</property>
|
|
||||||
<property name="decimals">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<double>100.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<double>0.100000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<double>0.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="1">
|
|
||||||
<widget class="QLineEdit" name="lineEdit_roiRatios_odom"/>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QLabel" name="label_154">
|
<widget class="QLabel" name="label_154">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -853,157 +763,24 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="1">
|
<item row="9" column="0">
|
||||||
<widget class="QLabel" name="label_137">
|
<widget class="QSpinBox" name="spinBox_noiseMinNeighbors">
|
||||||
<property name="text">
|
|
||||||
<string>Odometry</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QCheckBox" name="checkBox_showClouds">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QCheckBox" name="checkBox_showOdomClouds">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="2">
|
|
||||||
<widget class="QLabel" name="label_119">
|
|
||||||
<property name="text">
|
|
||||||
<string>Show 3D clouds.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QSpinBox" name="spinBox_decimation_odom">
|
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>-32</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>32</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="2">
|
|
||||||
<widget class="QLabel" name="label_108">
|
|
||||||
<property name="text">
|
|
||||||
<string>Decimation (1-2-4-8-...). Negative decimation is done from RGB size instead of depth size (if depth is smaller than RGB, it may be interpolated depending of the decimation value).</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="14" column="0">
|
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity">
|
|
||||||
<property name="suffix">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="decimals">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<double>1.000000000000000</double>
|
<number>1000</number>
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<double>0.100000000000000</double>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<double>1.000000000000000</double>
|
<number>5</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="14" column="2">
|
<item row="5" column="0">
|
||||||
<widget class="QLabel" name="label_155">
|
<widget class="QLineEdit" name="lineEdit_roiRatios"/>
|
||||||
<property name="text">
|
|
||||||
<string>Opacity.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
</item>
|
||||||
<item row="15" column="2">
|
<item row="3" column="1">
|
||||||
<widget class="QLabel" name="label_157">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_maxDepth_odom">
|
||||||
<property name="text">
|
|
||||||
<string>Point size (1..64).</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="7" column="0">
|
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_noiseRadius">
|
|
||||||
<property name="suffix">
|
|
||||||
<string> m</string>
|
|
||||||
</property>
|
|
||||||
<property name="decimals">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<double>1.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<double>0.050000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<double>0.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QSpinBox" name="spinBox_decimation">
|
|
||||||
<property name="minimum">
|
|
||||||
<number>-32</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>32</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_maxDepth">
|
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
</property>
|
</property>
|
||||||
@@ -1016,60 +793,6 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
<property name="singleStep">
|
<property name="singleStep">
|
||||||
<double>0.100000000000000</double>
|
<double>0.100000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
<property name="value">
|
|
||||||
<double>4.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="2">
|
|
||||||
<widget class="QLabel" name="label_132">
|
|
||||||
<property name="text">
|
|
||||||
<string>Maximum depth (0 means no limit).</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="0">
|
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_minDepth">
|
|
||||||
<property name="suffix">
|
|
||||||
<string> m</string>
|
|
||||||
</property>
|
|
||||||
<property name="decimals">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<double>100.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<double>0.100000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<double>0.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="1">
|
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_minDepth_odom">
|
|
||||||
<property name="suffix">
|
|
||||||
<string> m</string>
|
|
||||||
</property>
|
|
||||||
<property name="decimals">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<double>0.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<double>100.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<double>0.100000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<double>0.000000000000000</double>
|
<double>0.000000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
@@ -1088,10 +811,13 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="2">
|
<item row="14" column="0">
|
||||||
<widget class="QLabel" name="label_353">
|
<widget class="QSpinBox" name="spinBox_colorScheme"/>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="2">
|
||||||
|
<widget class="QLabel" name="label_108">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>ROI ratios [left right top bottom] between 0 and 1.</string>
|
<string>Decimation (1-2-4-8-...). Negative decimation is done from RGB size instead of depth size (if depth is smaller than RGB, it may be interpolated depending of the decimation value).</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@@ -1101,90 +827,23 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="0">
|
<item row="12" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_floorFilterHeight">
|
<widget class="QSpinBox" name="spinBox_normalKSearch">
|
||||||
<property name="suffix">
|
|
||||||
<string> m</string>
|
|
||||||
</property>
|
|
||||||
<property name="decimals">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<double>-10.000000000000000</double>
|
<number>0</number>
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<double>10.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<double>0.100000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<double>0.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="0">
|
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxel">
|
|
||||||
<property name="suffix">
|
|
||||||
<string> m</string>
|
|
||||||
</property>
|
|
||||||
<property name="decimals">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<double>1.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<double>0.010000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<double>0.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="15" column="1">
|
|
||||||
<widget class="QSpinBox" name="spinBox_ptsize_odom">
|
|
||||||
<property name="minimum">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>64</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="7" column="2">
|
|
||||||
<widget class="QLabel" name="label_168">
|
|
||||||
<property name="text">
|
|
||||||
<string>Noise filtering radius (0=disabled). Done after voxel filtering.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="8" column="0">
|
|
||||||
<widget class="QSpinBox" name="spinBox_noiseMinNeighbors">
|
|
||||||
<property name="minimum">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>1000</number>
|
<number>1000</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<number>5</number>
|
<number>10</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="2">
|
<item row="15" column="2">
|
||||||
<widget class="QLabel" name="label_338">
|
<widget class="QLabel" name="label_155">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Ceiling filtering height (0=Disabled). This is done in /map frame.</string>
|
<string>Opacity.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@@ -1194,20 +853,46 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="2">
|
<item row="15" column="1">
|
||||||
<widget class="QLabel" name="label_171">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity_odom">
|
||||||
<property name="text">
|
<property name="suffix">
|
||||||
<string>Voxel filtering size (0=disabled).</string>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="decimals">
|
||||||
<bool>true</bool>
|
<number>2</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="textInteractionFlags">
|
<property name="maximum">
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
<double>1.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.100000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>1.000000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="0">
|
<item row="13" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_normalRadiusSearch">
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.010000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QSpinBox" name="spinBox_decimation">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>-32</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>32</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="10" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_ceilingFilterHeight">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_ceilingFilterHeight">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -1229,23 +914,29 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="11" column="0">
|
<item row="4" column="0">
|
||||||
<widget class="QSpinBox" name="spinBox_normalKSearch">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_minDepth">
|
||||||
<property name="minimum">
|
<property name="suffix">
|
||||||
<number>0</number>
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>1</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>1000</number>
|
<double>100.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.100000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<number>10</number>
|
<double>0.000000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="11" column="2">
|
<item row="1" column="2">
|
||||||
<widget class="QLabel" name="label_210">
|
<widget class="QLabel" name="label_119">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Normal K search. If not 0, normals will be computed and added to created cloud for visualization (keys 7, 8 and 9).</string>
|
<string>Show 3D clouds.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@@ -1255,7 +946,181 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="12" column="2">
|
<item row="8" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_noiseRadius">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>1.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.050000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLabel" name="label_137">
|
||||||
|
<property name="text">
|
||||||
|
<string>Odometry</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QCheckBox" name="checkBox_showOdomClouds">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="14" column="1">
|
||||||
|
<widget class="QSpinBox" name="spinBox_colorScheme_odom"/>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="2">
|
||||||
|
<widget class="QLabel" name="label_353">
|
||||||
|
<property name="text">
|
||||||
|
<string>ROI ratios [left right top bottom] between 0 and 1.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="16" column="2">
|
||||||
|
<widget class="QLabel" name="label_157">
|
||||||
|
<property name="text">
|
||||||
|
<string>Point size (1..64).</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="16" column="0">
|
||||||
|
<widget class="QSpinBox" name="spinBox_ptsize">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>64</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_maxDepth">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>100.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.100000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>4.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="2">
|
||||||
|
<widget class="QLabel" name="label_171">
|
||||||
|
<property name="text">
|
||||||
|
<string>Voxel filtering size (0=disabled).</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="11" column="2">
|
||||||
|
<widget class="QLabel" name="label_355">
|
||||||
|
<property name="text">
|
||||||
|
<string>Floor filtering height (0=Disabled). This is done in /map frame.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="10" column="2">
|
||||||
|
<widget class="QLabel" name="label_338">
|
||||||
|
<property name="text">
|
||||||
|
<string>Ceiling filtering height (0=Disabled). This is done in /map frame.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="11" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_floorFilterHeight">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<double>-10.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>10.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.100000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_showClouds">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="13" column="2">
|
||||||
<widget class="QLabel" name="label_427">
|
<widget class="QLabel" name="label_427">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Normal radius search. If not 0, normals will be computed and added to created cloud for visualization (keys 7, 8 and 9).</string>
|
<string>Normal radius search. If not 0, normals will be computed and added to created cloud for visualization (keys 7, 8 and 9).</string>
|
||||||
@@ -1268,8 +1133,117 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="14" column="1">
|
<item row="2" column="1">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity_odom">
|
<widget class="QSpinBox" name="spinBox_decimation_odom">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>-32</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>32</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_minDepth_odom">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>100.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.100000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxel">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>1.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.010000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="14" column="2">
|
||||||
|
<widget class="QLabel" name="label_459">
|
||||||
|
<property name="text">
|
||||||
|
<string>Default color scheme key.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="12" column="2">
|
||||||
|
<widget class="QLabel" name="label_210">
|
||||||
|
<property name="text">
|
||||||
|
<string>Normal K search. If not 0, normals will be computed and added to created cloud for visualization (keys 7, 8 and 9).</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="2">
|
||||||
|
<widget class="QLabel" name="label_132">
|
||||||
|
<property name="text">
|
||||||
|
<string>Maximum depth (0 means no limit).</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QLineEdit" name="lineEdit_roiRatios_odom"/>
|
||||||
|
</item>
|
||||||
|
<item row="8" column="2">
|
||||||
|
<widget class="QLabel" name="label_168">
|
||||||
|
<property name="text">
|
||||||
|
<string>Noise filtering radius (0=disabled). Done after voxel filtering.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="15" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
@@ -1287,6 +1261,77 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="16" column="1">
|
||||||
|
<widget class="QSpinBox" name="spinBox_ptsize_odom">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>64</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="9" column="2">
|
||||||
|
<widget class="QLabel" name="label_169">
|
||||||
|
<property name="text">
|
||||||
|
<string>Noise filtering min neighbors.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="2">
|
||||||
|
<widget class="QLabel" name="label_298">
|
||||||
|
<property name="text">
|
||||||
|
<string>Minimum depth confidence.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="1">
|
||||||
|
<widget class="QSpinBox" name="spinBox_depthConf_odom">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> %</string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>100</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="0">
|
||||||
|
<widget class="QSpinBox" name="spinBox_depthConf">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> %</string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>100</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@@ -27177,13 +27222,13 @@ Lower the ratio -> higher the precision.</string>
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox_detector_superpoint_torch2">
|
<widget class="QGroupBox" name="groupBox_detector_superpoint_torch2">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>SupertPoint Torch</string>
|
<string>SuperPoint Torch</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_147">
|
<layout class="QVBoxLayout" name="verticalLayout_147">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_575">
|
<widget class="QLabel" name="label_575">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string><html><head/><body><p>SupertPoint c++ implementation from <a href="https://github.com/KinglittleQ/SuperPoint_SLAM"><span style=" text-decoration: underline; color:#0000ff;">SuperPoint_SLAM</span></a> project based on pytorch. A <span style=" font-weight:600;">superpoint.pt</span> weights file can be downloaded from its Git. It should be the same weights file <a href="https://pytorch.org/tutorials/advanced/cpp_export.html"><span style=" text-decoration: underline; color:#0000ff;">converted</span></a> from <span style=" font-weight:600;">superpoint.pth</span> of the <a href="https://github.com/magicleap/SuperPointPretrainedNetwork"><span style=" text-decoration: underline; color:#0000ff;">SuperPointPretrainedNetwork</span></a> project.</p></body></html></string>
|
<string><html><head/><body><p>SuperPoint c++ implementation from <a href="https://github.com/KinglittleQ/SuperPoint_SLAM"><span style=" text-decoration: underline; color:#0000ff;">SuperPoint_SLAM</span></a> project based on pytorch. A <span style=" font-weight:600;">superpoint.pt</span> weights file can be downloaded from its Git. It should be the same weights file <a href="https://pytorch.org/tutorials/advanced/cpp_export.html"><span style=" text-decoration: underline; color:#0000ff;">converted</span></a> from <span style=" font-weight:600;">superpoint.pth</span> of the <a href="https://github.com/magicleap/SuperPointPretrainedNetwork"><span style=" text-decoration: underline; color:#0000ff;">SuperPointPretrainedNetwork</span></a> project.</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<package format="2">
|
<package format="2">
|
||||||
<name>rtabmap</name>
|
<name>rtabmap</name>
|
||||||
<version>0.21.14</version>
|
<version>0.22.0</version>
|
||||||
<description>RTAB-Map's standalone library. RTAB-Map is a RGB-D SLAM approach with real-time constraints.</description>
|
<description>RTAB-Map's standalone library. RTAB-Map is a RGB-D SLAM approach with real-time constraints.</description>
|
||||||
<maintainer email="[email protected]">Mathieu Labbe</maintainer>
|
<maintainer email="[email protected]">Mathieu Labbe</maintainer>
|
||||||
<author>Mathieu Labbe</author>
|
<author>Mathieu Labbe</author>
|
||||||
|
|||||||
+50
-3
@@ -153,6 +153,8 @@ void showUsage()
|
|||||||
" --min_range # Minimum range of the created clouds (default 0 m).\n"
|
" --min_range # Minimum range of the created clouds (default 0 m).\n"
|
||||||
" --max_range # Maximum range of the created clouds (default 4 m, 0 m with --scan).\n"
|
" --max_range # Maximum range of the created clouds (default 4 m, 0 m with --scan).\n"
|
||||||
" --decimation # Depth image decimation before creating the clouds (default 4, 1 with --scan).\n"
|
" --decimation # Depth image decimation before creating the clouds (default 4, 1 with --scan).\n"
|
||||||
|
" --edge_bleeding_error # Depth's edge bleeding filtering error (default 0 m).\n"
|
||||||
|
" --depth_confidence # Depth confidence threshold (should be in [0,100]) (default 0=Low).\n"
|
||||||
" --voxel # Voxel size of the created clouds (default 0.01 m, 0 m with --scan).\n"
|
" --voxel # Voxel size of the created clouds (default 0.01 m, 0 m with --scan).\n"
|
||||||
" --ground_normals_up # Flip ground normals up if close to -z axis (default 0, 0=disabled, value should be >0 and <1, typical 0.9).\n"
|
" --ground_normals_up # Flip ground normals up if close to -z axis (default 0, 0=disabled, value should be >0 and <1, typical 0.9).\n"
|
||||||
" --noise_radius # Noise filtering search radius (default 0, 0=disabled).\n"
|
" --noise_radius # Noise filtering search radius (default 0, 0=disabled).\n"
|
||||||
@@ -214,6 +216,8 @@ int main(int argc, char * argv[])
|
|||||||
float poissonSize = 0.03;
|
float poissonSize = 0.03;
|
||||||
int maxPolygons = 300000;
|
int maxPolygons = 300000;
|
||||||
int decimation = -1;
|
int decimation = -1;
|
||||||
|
float depthEdgeBleedingFilterError = 0.0f;
|
||||||
|
unsigned char depthConfidenceThr = 0;
|
||||||
float minRange = 0.0f;
|
float minRange = 0.0f;
|
||||||
float maxRange = -1.0f;
|
float maxRange = -1.0f;
|
||||||
float voxelSize = -1.0f;
|
float voxelSize = -1.0f;
|
||||||
@@ -773,6 +777,30 @@ int main(int argc, char * argv[])
|
|||||||
showUsage();
|
showUsage();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(std::strcmp(argv[i], "--edge_bleeding_error") == 0)
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
if(i<argc-1)
|
||||||
|
{
|
||||||
|
depthEdgeBleedingFilterError = uStr2Float(argv[i]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
showUsage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(std::strcmp(argv[i], "--depth_confidence") == 0)
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
if(i<argc-1)
|
||||||
|
{
|
||||||
|
depthConfidenceThr = (unsigned char)uStr2Int(argv[i]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
showUsage();
|
||||||
|
}
|
||||||
|
}
|
||||||
else if(std::strcmp(argv[i], "--voxel") == 0)
|
else if(std::strcmp(argv[i], "--voxel") == 0)
|
||||||
{
|
{
|
||||||
++i;
|
++i;
|
||||||
@@ -1432,6 +1460,7 @@ int main(int argc, char * argv[])
|
|||||||
bool densityFiltered = !densityPoses.empty() && densityPoses.find(iter->first) == densityPoses.end();
|
bool densityFiltered = !densityPoses.empty() && densityPoses.find(iter->first) == densityPoses.end();
|
||||||
cv::Mat rgb;
|
cv::Mat rgb;
|
||||||
cv::Mat depth;
|
cv::Mat depth;
|
||||||
|
cv::Mat confidence;
|
||||||
pcl::IndicesPtr indices(new std::vector<int>);
|
pcl::IndicesPtr indices(new std::vector<int>);
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
|
||||||
pcl::PointCloud<pcl::PointXYZI>::Ptr cloudI;
|
pcl::PointCloud<pcl::PointXYZI>::Ptr cloudI;
|
||||||
@@ -1440,7 +1469,7 @@ int main(int argc, char * argv[])
|
|||||||
if(!densityFiltered && cloudFromScan && (exportCloud || exportMesh))
|
if(!densityFiltered && cloudFromScan && (exportCloud || exportMesh))
|
||||||
{
|
{
|
||||||
LaserScan scan;
|
LaserScan scan;
|
||||||
data.uncompressData(exportImages?&rgb:0, (texture||exportImages)&&!data.depthOrRightCompressed().empty()?&depth:0, &scan);
|
data.uncompressData(exportImages?&rgb:0, (texture||exportImages)&&!data.depthOrRightCompressed().empty()?&depth:0, &scan, 0, 0, 0, 0, exportImages?&confidence:0);
|
||||||
if(scan.empty())
|
if(scan.empty())
|
||||||
{
|
{
|
||||||
printf("Node %d doesn't have scan data, empty cloud is created.\n", iter->first);
|
printf("Node %d doesn't have scan data, empty cloud is created.\n", iter->first);
|
||||||
@@ -1468,7 +1497,7 @@ int main(int argc, char * argv[])
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data.uncompressData(&rgb, &depth);
|
data.uncompressData(&rgb, &depth, 0, 0, 0, 0, 0, &confidence);
|
||||||
if(!densityFiltered && (exportCloud || exportMesh))
|
if(!densityFiltered && (exportCloud || exportMesh))
|
||||||
{
|
{
|
||||||
if(depth.empty())
|
if(depth.empty())
|
||||||
@@ -1476,12 +1505,20 @@ int main(int argc, char * argv[])
|
|||||||
printf("Node %d doesn't have depth or stereo data, empty cloud is "
|
printf("Node %d doesn't have depth or stereo data, empty cloud is "
|
||||||
"created (if you want to create point cloud from scan, use --scan option).\n", iter->first);
|
"created (if you want to create point cloud from scan, use --scan option).\n", iter->first);
|
||||||
}
|
}
|
||||||
|
else if(!data.depthRaw().empty() && depthEdgeBleedingFilterError>0.0f)
|
||||||
|
{
|
||||||
|
util2d::depthBleedingFiltering(depth, depthEdgeBleedingFilterError);
|
||||||
|
data.setRGBDImage(data.imageRaw(), depth, data.depthConfidenceRaw(), data.cameraModels());
|
||||||
|
}
|
||||||
cloud = util3d::cloudRGBFromSensorData(
|
cloud = util3d::cloudRGBFromSensorData(
|
||||||
data,
|
data,
|
||||||
decimation, // image decimation before creating the clouds
|
decimation, // image decimation before creating the clouds
|
||||||
maxRange, // maximum depth of the cloud
|
maxRange, // maximum depth of the cloud
|
||||||
minRange,
|
minRange,
|
||||||
indices.get());
|
indices.get(),
|
||||||
|
ParametersMap(),
|
||||||
|
std::vector<float>(),
|
||||||
|
depthConfidenceThr);
|
||||||
if(noiseRadius>0.0f && noiseMinNeighbors>0)
|
if(noiseRadius>0.0f && noiseMinNeighbors>0)
|
||||||
{
|
{
|
||||||
indices = util3d::radiusFiltering(cloud, indices, noiseRadius, noiseMinNeighbors);
|
indices = util3d::radiusFiltering(cloud, indices, noiseRadius, noiseMinNeighbors);
|
||||||
@@ -1525,6 +1562,16 @@ int main(int argc, char * argv[])
|
|||||||
outputPath=dir+"/"+(exportImagesId?uNumber2Str(iter->first):uFormat("%f", stamp))+ext;
|
outputPath=dir+"/"+(exportImagesId?uNumber2Str(iter->first):uFormat("%f", stamp))+ext;
|
||||||
cv::imwrite(outputPath, depthExported);
|
cv::imwrite(outputPath, depthExported);
|
||||||
}
|
}
|
||||||
|
if(!confidence.empty())
|
||||||
|
{
|
||||||
|
dir = outputDirectory+"/"+baseName+"_confidence";
|
||||||
|
if(!UDirectory::exists(dir)) {
|
||||||
|
UDirectory::makeDir(dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
outputPath=dir+"/"+(exportImagesId?uNumber2Str(iter->first):uFormat("%f", stamp))+".png";
|
||||||
|
cv::imwrite(outputPath, confidence);
|
||||||
|
}
|
||||||
|
|
||||||
// save calibration per image (calibration can change over time, e.g. camera has auto focus)
|
// save calibration per image (calibration can change over time, e.g. camera has auto focus)
|
||||||
for(size_t i=0; i<models.size(); ++i)
|
for(size_t i=0; i<models.size(); ++i)
|
||||||
|
|||||||
@@ -1255,9 +1255,8 @@ int main(int argc, char * argv[])
|
|||||||
t.r11(), t.r12(), t.r13(), t.x()*bestScale,
|
t.r11(), t.r12(), t.r13(), t.x()*bestScale,
|
||||||
t.r21(), t.r22(), t.r23(), t.y()*bestScale,
|
t.r21(), t.r22(), t.r23(), t.y()*bestScale,
|
||||||
t.r31(), t.r32(), t.r33(), t.z()*bestScale);
|
t.r31(), t.r32(), t.r33(), t.z()*bestScale);
|
||||||
Transform diff = gtLink.inverse()*scaledLink;
|
sumDist += gtLink.getDistance(scaledLink);
|
||||||
sumDist += diff.getNorm();
|
sumAngle += gtLink.getAngle(scaledLink);
|
||||||
sumAngle += diff.getAngle();
|
|
||||||
++count;
|
++count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1289,7 +1289,7 @@ int main(int argc, char * argv[])
|
|||||||
!info.odomPose.isNull())
|
!info.odomPose.isNull())
|
||||||
{
|
{
|
||||||
float distance = odomPose.getDistance(info.odomPose);
|
float distance = odomPose.getDistance(info.odomPose);
|
||||||
float angle = (odomPose.inverse()*info.odomPose).getAngle();
|
float angle = odomPose.getAngle(info.odomPose);
|
||||||
odomDistances.push_back(distance);
|
odomDistances.push_back(distance);
|
||||||
if(distance < linearUpdate && angle <= angularUpdate)
|
if(distance < linearUpdate && angle <= angularUpdate)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user