mirror of
https://github.com/introlab/rtabmap.git
synced 2026-10-04 00:57:46 +08:00
Added coverage report
This commit is contained in:
@@ -0,0 +1,122 @@
|
|||||||
|
name: Coverage
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
env:
|
||||||
|
BUILD_TYPE: Debug
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
coverage:
|
||||||
|
name: Coverage (ubuntu-24.04)
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install Linux dependencies
|
||||||
|
run: |
|
||||||
|
DEBIAN_FRONTEND=noninteractive
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y \
|
||||||
|
lcov \
|
||||||
|
libopencv-dev \
|
||||||
|
libpcl-dev \
|
||||||
|
git \
|
||||||
|
cmake \
|
||||||
|
software-properties-common \
|
||||||
|
libyaml-cpp-dev
|
||||||
|
|
||||||
|
- name: Configure CMake
|
||||||
|
run: |
|
||||||
|
cmake -B ${{ github.workspace }}/build \
|
||||||
|
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
|
||||||
|
-DENABLE_COVERAGE=ON \
|
||||||
|
-DBUILD_TESTING=ON \
|
||||||
|
-DWITH_QT=OFF \
|
||||||
|
-DWITH_PYTHON=OFF \
|
||||||
|
-DWITH_CERES=OFF \
|
||||||
|
-DWITH_G2O=OFF \
|
||||||
|
-DWITH_GTSAM=OFF \
|
||||||
|
-DWITH_MRPT=OFF \
|
||||||
|
-DWITH_VERTIGO=OFF \
|
||||||
|
-DWITH_CVSBA=OFF \
|
||||||
|
-DWITH_POINTMATCHER=OFF \
|
||||||
|
-DWITH_CCCORELIB=OFF \
|
||||||
|
-DWITH_OPEN3D=OFF \
|
||||||
|
-DWITH_LOAM=OFF \
|
||||||
|
-DWITH_FLOAM=OFF \
|
||||||
|
-DWITH_LIOSAM=OFF \
|
||||||
|
-DWITH_FLYCAPTURE2=OFF \
|
||||||
|
-DWITH_ZED=OFF \
|
||||||
|
-DWITH_ZEDOC=OFF \
|
||||||
|
-DWITH_REALSENSE=OFF
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: cmake --build ${{ github.workspace }}/build -j$(nproc)
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
working-directory: ${{ github.workspace }}/build
|
||||||
|
run: |
|
||||||
|
export LD_LIBRARY_PATH="${{ github.workspace }}/build/bin${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
||||||
|
find ${{ github.workspace }}/build -name '*.gcda' -delete
|
||||||
|
ctest --output-on-failure || true
|
||||||
|
|
||||||
|
- name: Generate LCOV report
|
||||||
|
run: |
|
||||||
|
GCOV_VER="$(gcc -dumpversion | cut -d. -f1)"
|
||||||
|
if command -v "gcov-${GCOV_VER}" >/dev/null 2>&1; then
|
||||||
|
GCOV_TOOL="gcov-${GCOV_VER}"
|
||||||
|
else
|
||||||
|
GCOV_TOOL="gcov"
|
||||||
|
fi
|
||||||
|
LCOV_IGNORE=(--ignore-errors gcov,source,graph)
|
||||||
|
|
||||||
|
lcov --gcov-tool "$GCOV_TOOL" "${LCOV_IGNORE[@]}" \
|
||||||
|
--capture \
|
||||||
|
--directory ${{ github.workspace }}/build \
|
||||||
|
--output-file lcov.info
|
||||||
|
|
||||||
|
lcov "${LCOV_IGNORE[@]}" --extract lcov.info \
|
||||||
|
'${{ github.workspace }}/*' \
|
||||||
|
--output-file lcov.info
|
||||||
|
lcov "${LCOV_IGNORE[@]}" --remove lcov.info \
|
||||||
|
'*/googletest/*' \
|
||||||
|
'*/_deps/*' \
|
||||||
|
'*/sqlite3/*' \
|
||||||
|
'*/corelib/test/*' \
|
||||||
|
'*/utilite/test/*' \
|
||||||
|
--output-file lcov.info
|
||||||
|
|
||||||
|
lcov --summary lcov.info
|
||||||
|
|
||||||
|
- name: HTML coverage report
|
||||||
|
run: genhtml lcov.info --output-directory coverage-html --legend --demangle-cpp
|
||||||
|
|
||||||
|
- name: Upload HTML coverage artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: coverage-html
|
||||||
|
path: coverage-html
|
||||||
|
retention-days: 14
|
||||||
|
|
||||||
|
- name: Upload to Codecov
|
||||||
|
if: ${{ secrets.CODECOV_TOKEN != '' }}
|
||||||
|
uses: codecov/codecov-action@v5
|
||||||
|
with:
|
||||||
|
files: lcov.info
|
||||||
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
fail_ci_if_error: false
|
||||||
@@ -12,3 +12,10 @@ compile_flags.txt
|
|||||||
tags
|
tags
|
||||||
build_*
|
build_*
|
||||||
*.bak
|
*.bak
|
||||||
|
|
||||||
|
# Coverage (coverage-report.sh / .github/workflows/coverage.yml)
|
||||||
|
build-coverage/
|
||||||
|
coverage-html/
|
||||||
|
lcov.info
|
||||||
|
*.gcda
|
||||||
|
*.gcno
|
||||||
|
|||||||
@@ -185,6 +185,17 @@ if(BUILD_TESTING)
|
|||||||
set(TEST_DATA_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/data")
|
set(TEST_DATA_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/data")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
OPTION(ENABLE_COVERAGE "Build with gcov/llvm coverage instrumentation (for CI)" OFF)
|
||||||
|
IF(ENABLE_COVERAGE)
|
||||||
|
IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||||
|
MESSAGE(STATUS "Coverage instrumentation enabled")
|
||||||
|
ADD_COMPILE_OPTIONS(--coverage -O0 -g)
|
||||||
|
ADD_LINK_OPTIONS(--coverage)
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(WARNING "ENABLE_COVERAGE is only supported with GCC or Clang")
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
####### DEPENDENCIES #######
|
####### DEPENDENCIES #######
|
||||||
IF(MOBILE_BUILD)
|
IF(MOBILE_BUILD)
|
||||||
option(WITH_QT "Include Qt support" OFF)
|
option(WITH_QT "Include Qt support" OFF)
|
||||||
@@ -1472,6 +1483,7 @@ MESSAGE(STATUS " BUILD_APP = ${BUILD_APP}")
|
|||||||
MESSAGE(STATUS " BUILD_TOOLS = ${BUILD_TOOLS}")
|
MESSAGE(STATUS " BUILD_TOOLS = ${BUILD_TOOLS}")
|
||||||
MESSAGE(STATUS " BUILD_EXAMPLES = ${BUILD_EXAMPLES}")
|
MESSAGE(STATUS " BUILD_EXAMPLES = ${BUILD_EXAMPLES}")
|
||||||
MESSAGE(STATUS " BUILD_TESTING = ${BUILD_TESTING}")
|
MESSAGE(STATUS " BUILD_TESTING = ${BUILD_TESTING}")
|
||||||
|
MESSAGE(STATUS " ENABLE_COVERAGE = ${ENABLE_COVERAGE}")
|
||||||
IF(NOT WIN32)
|
IF(NOT WIN32)
|
||||||
# see comment above for the BUILD_SHARED_LIBS option on Windows
|
# see comment above for the BUILD_SHARED_LIBS option on Windows
|
||||||
MESSAGE(STATUS " BUILD_SHARED_LIBS = ${BUILD_SHARED_LIBS}")
|
MESSAGE(STATUS " BUILD_SHARED_LIBS = ${BUILD_SHARED_LIBS}")
|
||||||
|
|||||||
@@ -420,7 +420,10 @@ unsigned long BayesFilter::getMemoryUsed() const
|
|||||||
{
|
{
|
||||||
long memoryUsage = sizeof(BayesFilter);
|
long memoryUsage = sizeof(BayesFilter);
|
||||||
memoryUsage += _posterior.size() * (sizeof(float)+sizeof(int)+sizeof(std::map<int, float>::iterator)) + sizeof(std::map<int, float>);
|
memoryUsage += _posterior.size() * (sizeof(float)+sizeof(int)+sizeof(std::map<int, float>::iterator)) + sizeof(std::map<int, float>);
|
||||||
memoryUsage += _prediction.total() * _prediction.elemSize();
|
if(!_prediction.empty())
|
||||||
|
{
|
||||||
|
memoryUsage += _prediction.total() * _prediction.elemSize();
|
||||||
|
}
|
||||||
memoryUsage += _predictionLC.size() * sizeof(double);
|
memoryUsage += _predictionLC.size() * sizeof(double);
|
||||||
memoryUsage += _neighborsIndex.size() * (sizeof(int)+sizeof(std::map<int, int>)+sizeof(std::map<int, std::map<int, int> >::iterator)) + sizeof(std::map<int, std::map<int, int> >);
|
memoryUsage += _neighborsIndex.size() * (sizeof(int)+sizeof(std::map<int, int>)+sizeof(std::map<int, std::map<int, int> >::iterator)) + sizeof(std::map<int, std::map<int, int> >);
|
||||||
for(std::map<int, std::map<int, int> >::const_iterator iter=_neighborsIndex.begin(); iter!=_neighborsIndex.end(); ++iter)
|
for(std::map<int, std::map<int, int> >::const_iterator iter=_neighborsIndex.begin(); iter!=_neighborsIndex.end(); ++iter)
|
||||||
|
|||||||
@@ -331,6 +331,10 @@ std::string uncompressString(const cv::Mat & bytes)
|
|||||||
|
|
||||||
std::string compressedDepthFormat(const cv::Mat & bytes)
|
std::string compressedDepthFormat(const cv::Mat & bytes)
|
||||||
{
|
{
|
||||||
|
if(bytes.empty())
|
||||||
|
{
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
return compressedDepthFormat(bytes.data, bytes.rows * bytes.cols * bytes.elemSize());
|
return compressedDepthFormat(bytes.data, bytes.rows * bytes.cols * bytes.elemSize());
|
||||||
}
|
}
|
||||||
std::string compressedDepthFormat(const std::vector<unsigned char> & bytes)
|
std::string compressedDepthFormat(const std::vector<unsigned char> & bytes)
|
||||||
|
|||||||
+33
-15
@@ -36,6 +36,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
namespace rtabmap
|
namespace rtabmap
|
||||||
{
|
{
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
bool isOccupancyGridLayerFormatSupported(const cv::Mat & layer)
|
||||||
|
{
|
||||||
|
if(layer.empty())
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return layer.type() == CV_32FC2 ||
|
||||||
|
layer.type() == CV_32FC3 ||
|
||||||
|
layer.type() == CV_32FC(4) ||
|
||||||
|
layer.type() == CV_32FC(5) ||
|
||||||
|
layer.type() == CV_32FC(6) ||
|
||||||
|
layer.type() == CV_32FC(7) ||
|
||||||
|
(layer.type() == CV_8UC1 && layer.rows == 1);
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
// empty constructor
|
// empty constructor
|
||||||
SensorData::SensorData() :
|
SensorData::SensorData() :
|
||||||
_id(0),
|
_id(0),
|
||||||
@@ -582,6 +599,19 @@ void SensorData::setOccupancyGrid(
|
|||||||
_emptyCellsRaw = cv::Mat();
|
_emptyCellsRaw = cv::Mat();
|
||||||
_emptyCellsCompressed = cv::Mat();
|
_emptyCellsCompressed = cv::Mat();
|
||||||
|
|
||||||
|
if(!ground.empty() && !isOccupancyGridLayerFormatSupported(ground))
|
||||||
|
{
|
||||||
|
UFATAL("Unsupported local occupancy grid format for ground cells: OpenCV type=%d size=%dx%d", ground.type(), ground.cols, ground.rows);
|
||||||
|
}
|
||||||
|
if(!obstacles.empty() && !isOccupancyGridLayerFormatSupported(obstacles))
|
||||||
|
{
|
||||||
|
UFATAL("Unsupported local occupancy grid format for obstacle cells: OpenCV type=%d size=%dx%d", obstacles.type(), obstacles.cols, obstacles.rows);
|
||||||
|
}
|
||||||
|
if(!empty.empty() && !isOccupancyGridLayerFormatSupported(empty))
|
||||||
|
{
|
||||||
|
UFATAL("Unsupported local occupancy grid format for empty cells: OpenCV type=%d size=%dx%d", empty.type(), empty.cols, empty.rows);
|
||||||
|
}
|
||||||
|
|
||||||
CompressionThread ctGround(ground);
|
CompressionThread ctGround(ground);
|
||||||
CompressionThread ctObstacles(obstacles);
|
CompressionThread ctObstacles(obstacles);
|
||||||
CompressionThread ctEmpty(empty);
|
CompressionThread ctEmpty(empty);
|
||||||
@@ -593,14 +623,10 @@ void SensorData::setOccupancyGrid(
|
|||||||
_groundCellsRaw = ground;
|
_groundCellsRaw = ground;
|
||||||
ctGround.start();
|
ctGround.start();
|
||||||
}
|
}
|
||||||
else if(ground.type() == CV_8UC1 && ground.rows == 1)
|
else // CV_8UC1 && rows == 1
|
||||||
{
|
{
|
||||||
_groundCellsCompressed = ground;
|
_groundCellsCompressed = ground;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
UFATAL("Unsupported local occupancy grid format for ground cells: OpenCV type=%d size=%dx%d", ground.type(), ground.cols, ground.rows);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(!obstacles.empty())
|
if(!obstacles.empty())
|
||||||
{
|
{
|
||||||
@@ -609,14 +635,10 @@ void SensorData::setOccupancyGrid(
|
|||||||
_obstacleCellsRaw = obstacles;
|
_obstacleCellsRaw = obstacles;
|
||||||
ctObstacles.start();
|
ctObstacles.start();
|
||||||
}
|
}
|
||||||
else if(obstacles.type() == CV_8UC1 && obstacles.rows == 1)
|
else // CV_8UC1 && rows == 1
|
||||||
{
|
{
|
||||||
_obstacleCellsCompressed = obstacles;
|
_obstacleCellsCompressed = obstacles;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
UFATAL("Unsupported local occupancy grid format for obstacle cells: OpenCV type=%d size=%dx%d", obstacles.type(), obstacles.cols, obstacles.rows);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(!empty.empty())
|
if(!empty.empty())
|
||||||
{
|
{
|
||||||
@@ -625,14 +647,10 @@ void SensorData::setOccupancyGrid(
|
|||||||
_emptyCellsRaw = empty;
|
_emptyCellsRaw = empty;
|
||||||
ctEmpty.start();
|
ctEmpty.start();
|
||||||
}
|
}
|
||||||
else if(empty.type() == CV_8UC1 && empty.rows == 1)
|
else // CV_8UC1 && rows == 1
|
||||||
{
|
{
|
||||||
_emptyCellsCompressed = empty;
|
_emptyCellsCompressed = empty;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
UFATAL("Unsupported local occupancy grid format for empty cells: OpenCV type=%d size=%dx%d", empty.type(), empty.cols, empty.rows);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ctGround.join();
|
ctGround.join();
|
||||||
ctObstacles.join();
|
ctObstacles.join();
|
||||||
|
|||||||
@@ -377,7 +377,10 @@ unsigned long VWDictionary::getMemoryUsed() const
|
|||||||
{
|
{
|
||||||
long memoryUsage = sizeof(VWDictionary);
|
long memoryUsage = sizeof(VWDictionary);
|
||||||
memoryUsage += getIndexMemoryUsed();
|
memoryUsage += getIndexMemoryUsed();
|
||||||
memoryUsage += _dataTree.total()*_dataTree.elemSize();
|
if(!_dataTree.empty())
|
||||||
|
{
|
||||||
|
memoryUsage += _dataTree.total()*_dataTree.elemSize();
|
||||||
|
}
|
||||||
if(!_visualWords.empty())
|
if(!_visualWords.empty())
|
||||||
{
|
{
|
||||||
memoryUsage += _visualWords.size()*(sizeof(int) + _visualWords.rbegin()->second->getMemoryUsed() + sizeof(std::map<int, VisualWord *>::iterator)) + sizeof(std::map<int, VisualWord *>);
|
memoryUsage += _visualWords.size()*(sizeof(int) + _visualWords.rbegin()->second->getMemoryUsed() + sizeof(std::map<int, VisualWord *>::iterator)) + sizeof(std::map<int, VisualWord *>);
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <pcl/surface/mls.h>
|
#include <pcl/surface/mls.h>
|
||||||
#include <pcl18/surface/texture_mapping.h>
|
#include <pcl18/surface/texture_mapping.h>
|
||||||
#include <pcl/features/integral_image_normal.h>
|
#include <pcl/features/integral_image_normal.h>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
#ifdef RTABMAP_ALICE_VISION
|
#ifdef RTABMAP_ALICE_VISION
|
||||||
#include <aliceVision/sfmData/SfMData.hpp>
|
#include <aliceVision/sfmData/SfMData.hpp>
|
||||||
@@ -91,6 +92,23 @@ namespace rtabmap
|
|||||||
namespace util3d
|
namespace util3d
|
||||||
{
|
{
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
float pcaEigenvalueAt(const cv::Mat & eigenvalues, int index)
|
||||||
|
{
|
||||||
|
if(eigenvalues.empty())
|
||||||
|
{
|
||||||
|
return 0.f;
|
||||||
|
}
|
||||||
|
if(eigenvalues.rows == 1)
|
||||||
|
{
|
||||||
|
index = std::min(index, eigenvalues.cols - 1);
|
||||||
|
return eigenvalues.at<float>(0, index);
|
||||||
|
}
|
||||||
|
index = std::min(index, eigenvalues.rows - 1);
|
||||||
|
return eigenvalues.at<float>(index, 0);
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
void createPolygonIndexes(
|
void createPolygonIndexes(
|
||||||
const std::vector<pcl::Vertices> & polygons,
|
const std::vector<pcl::Vertices> & polygons,
|
||||||
int cloudSize,
|
int cloudSize,
|
||||||
@@ -3218,7 +3236,7 @@ float computeNormalsComplexity(
|
|||||||
}
|
}
|
||||||
if(oi>1)
|
if(oi>1)
|
||||||
{
|
{
|
||||||
cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi*2)), cv::Mat(), CV_PCA_DATA_AS_ROW);
|
cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi)), cv::Mat(), CV_PCA_DATA_AS_ROW);
|
||||||
|
|
||||||
if(pcaEigenVectors)
|
if(pcaEigenVectors)
|
||||||
{
|
{
|
||||||
@@ -3230,7 +3248,7 @@ float computeNormalsComplexity(
|
|||||||
}
|
}
|
||||||
UASSERT((is2d && pca_analysis.eigenvalues.total()>=2) || (!is2d && pca_analysis.eigenvalues.total()>=3));
|
UASSERT((is2d && pca_analysis.eigenvalues.total()>=2) || (!is2d && pca_analysis.eigenvalues.total()>=3));
|
||||||
// Get last eigen value, scale between 0 and 1: 0=low complexity, 1=high complexity
|
// Get last eigen value, scale between 0 and 1: 0=low complexity, 1=high complexity
|
||||||
return pca_analysis.eigenvalues.at<float>(0, is2d?1:2)*(is2d?2.0f:3.0f);
|
return pcaEigenvalueAt(pca_analysis.eigenvalues, is2d?1:2)*(is2d?2.0f:3.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(!scan.isEmpty())
|
else if(!scan.isEmpty())
|
||||||
@@ -3279,7 +3297,7 @@ float computeNormalsComplexity(
|
|||||||
}
|
}
|
||||||
if(oi>1)
|
if(oi>1)
|
||||||
{
|
{
|
||||||
cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi*2)), cv::Mat(), CV_PCA_DATA_AS_ROW);
|
cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi)), cv::Mat(), CV_PCA_DATA_AS_ROW);
|
||||||
|
|
||||||
if(pcaEigenVectors)
|
if(pcaEigenVectors)
|
||||||
{
|
{
|
||||||
@@ -3291,7 +3309,7 @@ float computeNormalsComplexity(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get last eigen value, scale between 0 and 1: 0=low complexity, 1=high complexity
|
// Get last eigen value, scale between 0 and 1: 0=low complexity, 1=high complexity
|
||||||
return pca_analysis.eigenvalues.at<float>(0, is2d?1:2)*(is2d?2.0f:3.0f);
|
return pcaEigenvalueAt(pca_analysis.eigenvalues, is2d?1:2)*(is2d?2.0f:3.0f);
|
||||||
}
|
}
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
@@ -3335,7 +3353,7 @@ float computeNormalsComplexity(
|
|||||||
}
|
}
|
||||||
if(oi>1)
|
if(oi>1)
|
||||||
{
|
{
|
||||||
cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi*2)), cv::Mat(), CV_PCA_DATA_AS_ROW);
|
cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi)), cv::Mat(), CV_PCA_DATA_AS_ROW);
|
||||||
|
|
||||||
if(pcaEigenVectors)
|
if(pcaEigenVectors)
|
||||||
{
|
{
|
||||||
@@ -3347,7 +3365,7 @@ float computeNormalsComplexity(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get last eigen value, scale between 0 and 1: 0=low complexity, 1=high complexity
|
// Get last eigen value, scale between 0 and 1: 0=low complexity, 1=high complexity
|
||||||
return pca_analysis.eigenvalues.at<float>(0, is2d?1:2)*(is2d?2.0f:3.0f);
|
return pcaEigenvalueAt(pca_analysis.eigenvalues, is2d?1:2)*(is2d?2.0f:3.0f);
|
||||||
}
|
}
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
@@ -3391,7 +3409,7 @@ float computeNormalsComplexity(
|
|||||||
}
|
}
|
||||||
if(oi>1)
|
if(oi>1)
|
||||||
{
|
{
|
||||||
cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi*2)), cv::Mat(), CV_PCA_DATA_AS_ROW);
|
cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi)), cv::Mat(), CV_PCA_DATA_AS_ROW);
|
||||||
|
|
||||||
if(pcaEigenVectors)
|
if(pcaEigenVectors)
|
||||||
{
|
{
|
||||||
@@ -3403,7 +3421,7 @@ float computeNormalsComplexity(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get last eigen value, scale between 0 and 1: 0=low complexity, 1=high complexity
|
// Get last eigen value, scale between 0 and 1: 0=low complexity, 1=high complexity
|
||||||
return pca_analysis.eigenvalues.at<float>(0, is2d?1:2)*(is2d?2.0f:3.0f);
|
return pcaEigenvalueAt(pca_analysis.eigenvalues, is2d?1:2)*(is2d?2.0f:3.0f);
|
||||||
}
|
}
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
@@ -3447,7 +3465,7 @@ float computeNormalsComplexity(
|
|||||||
}
|
}
|
||||||
if(oi>1)
|
if(oi>1)
|
||||||
{
|
{
|
||||||
cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi*2)), cv::Mat(), CV_PCA_DATA_AS_ROW);
|
cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi)), cv::Mat(), CV_PCA_DATA_AS_ROW);
|
||||||
|
|
||||||
if(pcaEigenVectors)
|
if(pcaEigenVectors)
|
||||||
{
|
{
|
||||||
@@ -3459,7 +3477,7 @@ float computeNormalsComplexity(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get last eigen value, scale between 0 and 1: 0=low complexity, 1=high complexity
|
// Get last eigen value, scale between 0 and 1: 0=low complexity, 1=high complexity
|
||||||
return pca_analysis.eigenvalues.at<float>(0, is2d?1:2)*(is2d?2.0f:3.0f);
|
return pcaEigenvalueAt(pca_analysis.eigenvalues, is2d?1:2)*(is2d?2.0f:3.0f);
|
||||||
}
|
}
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|||||||
+30
-30
@@ -4,149 +4,149 @@ add_definitions("-DRTABMAP_TEST_DATA_ROOT=\"${TEST_DATA_ROOT}\"")
|
|||||||
#util2d.h
|
#util2d.h
|
||||||
add_executable(test_util2d test_util2d.cpp)
|
add_executable(test_util2d test_util2d.cpp)
|
||||||
target_link_libraries(test_util2d gtest_main rtabmap_core)
|
target_link_libraries(test_util2d gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_util2d)
|
add_test(NAME test_util2d COMMAND test_util2d)
|
||||||
|
|
||||||
#util3d.h
|
#util3d.h
|
||||||
add_executable(test_util3d test_util3d.cpp)
|
add_executable(test_util3d test_util3d.cpp)
|
||||||
target_link_libraries(test_util3d gtest_main rtabmap_core)
|
target_link_libraries(test_util3d gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_util3d)
|
add_test(NAME test_util3d COMMAND test_util3d)
|
||||||
|
|
||||||
#util3d_transforms.h
|
#util3d_transforms.h
|
||||||
add_executable(test_util3d_transforms test_util3d_transforms.cpp)
|
add_executable(test_util3d_transforms test_util3d_transforms.cpp)
|
||||||
target_link_libraries(test_util3d_transforms gtest_main rtabmap_core)
|
target_link_libraries(test_util3d_transforms gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_util3d_transforms)
|
add_test(NAME test_util3d_transforms COMMAND test_util3d_transforms)
|
||||||
|
|
||||||
#util3d_filtering.h
|
#util3d_filtering.h
|
||||||
add_executable(test_util3d_filtering test_util3d_filtering.cpp)
|
add_executable(test_util3d_filtering test_util3d_filtering.cpp)
|
||||||
target_link_libraries(test_util3d_filtering gtest_main rtabmap_core)
|
target_link_libraries(test_util3d_filtering gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_util3d_filtering)
|
add_test(NAME test_util3d_filtering COMMAND test_util3d_filtering)
|
||||||
|
|
||||||
#util3d_registration.h
|
#util3d_registration.h
|
||||||
add_executable(test_util3d_registration test_util3d_registration.cpp)
|
add_executable(test_util3d_registration test_util3d_registration.cpp)
|
||||||
target_link_libraries(test_util3d_registration gtest_main rtabmap_core)
|
target_link_libraries(test_util3d_registration gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_util3d_registration)
|
add_test(NAME test_util3d_registration COMMAND test_util3d_registration)
|
||||||
|
|
||||||
#util3d_features.h
|
#util3d_features.h
|
||||||
add_executable(test_util3d_features test_util3d_features.cpp)
|
add_executable(test_util3d_features test_util3d_features.cpp)
|
||||||
target_link_libraries(test_util3d_features gtest_main rtabmap_core)
|
target_link_libraries(test_util3d_features gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_util3d_features)
|
add_test(NAME test_util3d_features COMMAND test_util3d_features)
|
||||||
|
|
||||||
#util3d_correspondences.h
|
#util3d_correspondences.h
|
||||||
add_executable(test_util3d_correspondences test_util3d_correspondences.cpp)
|
add_executable(test_util3d_correspondences test_util3d_correspondences.cpp)
|
||||||
target_link_libraries(test_util3d_correspondences gtest_main rtabmap_core)
|
target_link_libraries(test_util3d_correspondences gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_util3d_correspondences)
|
add_test(NAME test_util3d_correspondences COMMAND test_util3d_correspondences)
|
||||||
|
|
||||||
#util3d_mapping.h
|
#util3d_mapping.h
|
||||||
add_executable(test_util3d_mapping test_util3d_mapping.cpp)
|
add_executable(test_util3d_mapping test_util3d_mapping.cpp)
|
||||||
target_link_libraries(test_util3d_mapping gtest_main rtabmap_core)
|
target_link_libraries(test_util3d_mapping gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_util3d_mapping)
|
add_test(NAME test_util3d_mapping COMMAND test_util3d_mapping)
|
||||||
|
|
||||||
#util3d_motion_estimation.h
|
#util3d_motion_estimation.h
|
||||||
add_executable(test_util3d_motion_estimation test_util3d_motion_estimation.cpp)
|
add_executable(test_util3d_motion_estimation test_util3d_motion_estimation.cpp)
|
||||||
target_link_libraries(test_util3d_motion_estimation gtest_main rtabmap_core)
|
target_link_libraries(test_util3d_motion_estimation gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_util3d_motion_estimation)
|
add_test(NAME test_util3d_motion_estimation COMMAND test_util3d_motion_estimation)
|
||||||
|
|
||||||
#util3d_surface.h
|
#util3d_surface.h
|
||||||
add_executable(test_util3d_surface test_util3d_surface.cpp)
|
add_executable(test_util3d_surface test_util3d_surface.cpp)
|
||||||
target_link_libraries(test_util3d_surface gtest_main rtabmap_core)
|
target_link_libraries(test_util3d_surface gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_util3d_surface)
|
add_test(NAME test_util3d_surface COMMAND test_util3d_surface)
|
||||||
|
|
||||||
#VisualWord.h
|
#VisualWord.h
|
||||||
add_executable(test_visualword test_visualword.cpp)
|
add_executable(test_visualword test_visualword.cpp)
|
||||||
target_link_libraries(test_visualword gtest_main rtabmap_core)
|
target_link_libraries(test_visualword gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_visualword)
|
add_test(NAME test_visualword COMMAND test_visualword)
|
||||||
|
|
||||||
#VWDictionary.h
|
#VWDictionary.h
|
||||||
add_executable(test_vwdictionary test_vwdictionary.cpp)
|
add_executable(test_vwdictionary test_vwdictionary.cpp)
|
||||||
target_link_libraries(test_vwdictionary gtest_main rtabmap_core)
|
target_link_libraries(test_vwdictionary gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_vwdictionary)
|
add_test(NAME test_vwdictionary COMMAND test_vwdictionary)
|
||||||
|
|
||||||
#Transform.h
|
#Transform.h
|
||||||
add_executable(test_transform test_transform.cpp)
|
add_executable(test_transform test_transform.cpp)
|
||||||
target_link_libraries(test_transform gtest_main rtabmap_core)
|
target_link_libraries(test_transform gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_transform)
|
add_test(NAME test_transform COMMAND test_transform)
|
||||||
|
|
||||||
#StereoDense.h (tests both BM and SGBM strategies)
|
#StereoDense.h (tests both BM and SGBM strategies)
|
||||||
add_executable(test_stereo_dense test_stereo_dense.cpp)
|
add_executable(test_stereo_dense test_stereo_dense.cpp)
|
||||||
target_link_libraries(test_stereo_dense gtest_main rtabmap_core)
|
target_link_libraries(test_stereo_dense gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_stereo_dense)
|
add_test(NAME test_stereo_dense COMMAND test_stereo_dense)
|
||||||
|
|
||||||
#Stereo.h (tests both BlockMatching and OpticalFlow strategies)
|
#Stereo.h (tests both BlockMatching and OpticalFlow strategies)
|
||||||
add_executable(test_stereo test_stereo.cpp)
|
add_executable(test_stereo test_stereo.cpp)
|
||||||
target_link_libraries(test_stereo gtest_main rtabmap_core)
|
target_link_libraries(test_stereo gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_stereo)
|
add_test(NAME test_stereo COMMAND test_stereo)
|
||||||
|
|
||||||
#CameraModel.h
|
#CameraModel.h
|
||||||
add_executable(test_cameramodel test_cameramodel.cpp)
|
add_executable(test_cameramodel test_cameramodel.cpp)
|
||||||
target_link_libraries(test_cameramodel gtest_main rtabmap_core)
|
target_link_libraries(test_cameramodel gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_cameramodel)
|
add_test(NAME test_cameramodel COMMAND test_cameramodel)
|
||||||
|
|
||||||
#StereoCameraModel.h
|
#StereoCameraModel.h
|
||||||
add_executable(test_stereocameramodel test_stereocameramodel.cpp)
|
add_executable(test_stereocameramodel test_stereocameramodel.cpp)
|
||||||
target_link_libraries(test_stereocameramodel gtest_main rtabmap_core)
|
target_link_libraries(test_stereocameramodel gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_stereocameramodel)
|
add_test(NAME test_stereocameramodel COMMAND test_stereocameramodel)
|
||||||
|
|
||||||
#Statistics.h
|
#Statistics.h
|
||||||
add_executable(test_statistics test_statistics.cpp)
|
add_executable(test_statistics test_statistics.cpp)
|
||||||
target_link_libraries(test_statistics gtest_main rtabmap_core)
|
target_link_libraries(test_statistics gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_statistics)
|
add_test(NAME test_statistics COMMAND test_statistics)
|
||||||
|
|
||||||
#BayesFilter.h
|
#BayesFilter.h
|
||||||
add_executable(test_bayesfilter test_bayesfilter.cpp)
|
add_executable(test_bayesfilter test_bayesfilter.cpp)
|
||||||
target_link_libraries(test_bayesfilter gtest_main rtabmap_core)
|
target_link_libraries(test_bayesfilter gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_bayesfilter)
|
add_test(NAME test_bayesfilter COMMAND test_bayesfilter)
|
||||||
|
|
||||||
#Link.h
|
#Link.h
|
||||||
add_executable(test_link test_link.cpp)
|
add_executable(test_link test_link.cpp)
|
||||||
target_link_libraries(test_link gtest_main rtabmap_core)
|
target_link_libraries(test_link gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_link)
|
add_test(NAME test_link COMMAND test_link)
|
||||||
|
|
||||||
#GPS.h
|
#GPS.h
|
||||||
add_executable(test_gps test_gps.cpp)
|
add_executable(test_gps test_gps.cpp)
|
||||||
target_link_libraries(test_gps gtest_main rtabmap_core)
|
target_link_libraries(test_gps gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_gps)
|
add_test(NAME test_gps COMMAND test_gps)
|
||||||
|
|
||||||
#GeodeticCoords.h
|
#GeodeticCoords.h
|
||||||
add_executable(test_geodeticcoords test_geodeticcoords.cpp)
|
add_executable(test_geodeticcoords test_geodeticcoords.cpp)
|
||||||
target_link_libraries(test_geodeticcoords gtest_main rtabmap_core)
|
target_link_libraries(test_geodeticcoords gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_geodeticcoords)
|
add_test(NAME test_geodeticcoords COMMAND test_geodeticcoords)
|
||||||
|
|
||||||
#Compression.h
|
#Compression.h
|
||||||
add_executable(test_compression test_compression.cpp)
|
add_executable(test_compression test_compression.cpp)
|
||||||
target_link_libraries(test_compression gtest_main rtabmap_core)
|
target_link_libraries(test_compression gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_compression)
|
add_test(NAME test_compression COMMAND test_compression)
|
||||||
|
|
||||||
#Odometry.h
|
#Odometry.h
|
||||||
add_executable(test_odometry test_odometry.cpp)
|
add_executable(test_odometry test_odometry.cpp)
|
||||||
target_link_libraries(test_odometry gtest_main rtabmap_core)
|
target_link_libraries(test_odometry gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_odometry)
|
add_test(NAME test_odometry COMMAND test_odometry)
|
||||||
|
|
||||||
#DBDriver.h
|
#DBDriver.h
|
||||||
add_executable(test_dbdriver test_dbdriver.cpp)
|
add_executable(test_dbdriver test_dbdriver.cpp)
|
||||||
target_link_libraries(test_dbdriver gtest_main rtabmap_core)
|
target_link_libraries(test_dbdriver gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_dbdriver)
|
add_test(NAME test_dbdriver COMMAND test_dbdriver)
|
||||||
|
|
||||||
#Signature.h
|
#Signature.h
|
||||||
add_executable(test_signature test_signature.cpp)
|
add_executable(test_signature test_signature.cpp)
|
||||||
target_link_libraries(test_signature gtest_main rtabmap_core)
|
target_link_libraries(test_signature gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_signature)
|
add_test(NAME test_signature COMMAND test_signature)
|
||||||
|
|
||||||
#SensorEvent.h
|
#SensorEvent.h
|
||||||
add_executable(test_sensorevent test_sensorevent.cpp)
|
add_executable(test_sensorevent test_sensorevent.cpp)
|
||||||
target_link_libraries(test_sensorevent gtest_main rtabmap_core)
|
target_link_libraries(test_sensorevent gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_sensorevent)
|
add_test(NAME test_sensorevent COMMAND test_sensorevent)
|
||||||
|
|
||||||
#SensorData.h
|
#SensorData.h
|
||||||
add_executable(test_sensordata test_sensordata.cpp)
|
add_executable(test_sensordata test_sensordata.cpp)
|
||||||
target_link_libraries(test_sensordata gtest_main rtabmap_core)
|
target_link_libraries(test_sensordata gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_sensordata)
|
add_test(NAME test_sensordata COMMAND test_sensordata)
|
||||||
|
|
||||||
#SensorCapture.h
|
#SensorCapture.h
|
||||||
add_executable(test_sensorcapture test_sensorcapture.cpp)
|
add_executable(test_sensorcapture test_sensorcapture.cpp)
|
||||||
target_link_libraries(test_sensorcapture gtest_main rtabmap_core)
|
target_link_libraries(test_sensorcapture gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_sensorcapture)
|
add_test(NAME test_sensorcapture COMMAND test_sensorcapture)
|
||||||
|
|
||||||
#SensorCaptureThread.h
|
#SensorCaptureThread.h
|
||||||
add_executable(test_sensorcapturethread test_sensorcapturethread.cpp)
|
add_executable(test_sensorcapturethread test_sensorcapturethread.cpp)
|
||||||
target_link_libraries(test_sensorcapturethread gtest_main rtabmap_core)
|
target_link_libraries(test_sensorcapturethread gtest_main rtabmap_core)
|
||||||
gtest_discover_tests(test_sensorcapturethread)
|
add_test(NAME test_sensorcapturethread COMMAND test_sensorcapturethread)
|
||||||
|
|||||||
@@ -451,8 +451,8 @@ TEST(Util3dFiltering, rangeFilteringFilteringRemovesOutOfRangePoints)
|
|||||||
LaserScan result = util3d::rangeFiltering(scan, 2.0f, 5.0f);
|
LaserScan result = util3d::rangeFiltering(scan, 2.0f, 5.0f);
|
||||||
|
|
||||||
ASSERT_EQ(result.size(), 1); // Only the (3,0) point should remain
|
ASSERT_EQ(result.size(), 1); // Only the (3,0) point should remain
|
||||||
EXPECT_FLOAT_EQ(result.data().at<cv::Vec3f>(0)[0], 3.0f); // x
|
EXPECT_FLOAT_EQ(result.data().at<cv::Vec2f>(0)[0], 3.0f); // x
|
||||||
EXPECT_FLOAT_EQ(result.data().at<cv::Vec3f>(0)[1], 0.0f); // y
|
EXPECT_FLOAT_EQ(result.data().at<cv::Vec2f>(0)[1], 0.0f); // y
|
||||||
|
|
||||||
// 3D points: (1,0) [1m], (3,0) [3m], (6,0) [6m]
|
// 3D points: (1,0) [1m], (3,0) [3m], (6,0) [6m]
|
||||||
data = (cv::Mat_<float>(1, 3*3) << 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 6.0f);
|
data = (cv::Mat_<float>(1, 3*3) << 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 6.0f);
|
||||||
@@ -697,9 +697,9 @@ TEST(Util3dFiltering, downsampleImplStepLargerThanCloudSize) {
|
|||||||
|
|
||||||
//LaserScan version
|
//LaserScan version
|
||||||
{
|
{
|
||||||
cv::Mat data(1, 10, CV_32FC3);
|
cv::Mat data(1, 5, CV_32FC3, cv::Scalar(0));
|
||||||
for (int i = 0; i < 5; ++i)
|
for (int i = 0; i < 5; ++i)
|
||||||
data.at<cv::Vec3f>(i)[0] = float(i); // x
|
data.at<cv::Vec3f>(0, i)[0] = float(i); // x
|
||||||
|
|
||||||
auto scan = LaserScan(data, 0, 0, LaserScan::kXYZ);
|
auto scan = LaserScan(data, 0, 0, LaserScan::kXYZ);
|
||||||
auto result = util3d::downsample(scan, 10);
|
auto result = util3d::downsample(scan, 10);
|
||||||
|
|||||||
@@ -550,18 +550,18 @@ TEST(Util3dMotionEstimation, estimateMotion3DTo3DWithNoise) {
|
|||||||
|
|
||||||
for(auto & pt: words3A) {
|
for(auto & pt: words3A) {
|
||||||
cv::Point3f ptT = util3d::transformPoint(pt.second, secondT);
|
cv::Point3f ptT = util3d::transformPoint(pt.second, secondT);
|
||||||
ptT.x += randomNoise(0.02);
|
ptT.x += randomNoise(0.01);
|
||||||
ptT.y += randomNoise(0.02);
|
ptT.y += randomNoise(0.01);
|
||||||
ptT.z += randomNoise(0.02);
|
ptT.z += randomNoise(0.01);
|
||||||
if(pt.second.z < 9) {
|
if(pt.second.z < 9) {
|
||||||
words3B.insert(std::make_pair(pt.first, ptT));
|
words3B.insert(std::make_pair(pt.first, ptT));
|
||||||
}
|
}
|
||||||
else { // outlier
|
else { // outlier
|
||||||
words3B.insert(std::make_pair(pt.first, cv::Point3f(5,5,10)));
|
words3B.insert(std::make_pair(pt.first, cv::Point3f(5,5,10)));
|
||||||
}
|
}
|
||||||
pt.second.x += randomNoise(0.02);
|
pt.second.x += randomNoise(0.01);
|
||||||
pt.second.y += randomNoise(0.02);
|
pt.second.y += randomNoise(0.01);
|
||||||
pt.second.z += randomNoise(0.02);
|
pt.second.z += randomNoise(0.01);
|
||||||
}
|
}
|
||||||
|
|
||||||
cv::Mat covariance;
|
cv::Mat covariance;
|
||||||
|
|||||||
@@ -53,7 +53,8 @@ TEST(Util3dSurface, computeNormalsComplexityVaryingNormals3D)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
complexity = util3d::computeNormalsComplexity(cloudB);
|
complexity = util3d::computeNormalsComplexity(cloudB);
|
||||||
EXPECT_NEAR(complexity, 0.25f, 1e-3);
|
// Smallest PCA eigenvalue is ~0 for discrete normals on orthogonal axes.
|
||||||
|
EXPECT_NEAR(complexity, 0.0f, 1e-3);
|
||||||
|
|
||||||
// Three perpendicular surfaces (one small)
|
// Three perpendicular surfaces (one small)
|
||||||
pcl::PointCloud<pcl::PointNormal> smallCloudB;
|
pcl::PointCloud<pcl::PointNormal> smallCloudB;
|
||||||
@@ -64,8 +65,7 @@ TEST(Util3dSurface, computeNormalsComplexityVaryingNormals3D)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
complexity = util3d::computeNormalsComplexity(smallCloudB);
|
complexity = util3d::computeNormalsComplexity(smallCloudB);
|
||||||
EXPECT_LT(complexity, 0.25f);
|
EXPECT_NEAR(complexity, 0.0f, 1e-3);
|
||||||
EXPECT_GT(complexity, 0.01f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(Util3dSurface, computeNormalsComplexityIdentityVsRotated)
|
TEST(Util3dSurface, computeNormalsComplexityIdentityVsRotated)
|
||||||
@@ -115,7 +115,7 @@ TEST(Util3dSurface, computeNormalsComplexityVaryingNormals2D)
|
|||||||
#endif
|
#endif
|
||||||
// Two perpendicular surfaces
|
// Two perpendicular surfaces
|
||||||
complexity = util3d::computeNormalsComplexity(cloud, Transform(), true);
|
complexity = util3d::computeNormalsComplexity(cloud, Transform(), true);
|
||||||
EXPECT_NEAR(complexity, 0.25f, 1e-3);
|
EXPECT_NEAR(complexity, 0.0f, 1e-3);
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointNormal> cloudB;
|
pcl::PointCloud<pcl::PointNormal> cloudB;
|
||||||
#if PCL_VERSION_COMPARE(>=, 1, 10, 0)
|
#if PCL_VERSION_COMPARE(>=, 1, 10, 0)
|
||||||
@@ -125,8 +125,7 @@ TEST(Util3dSurface, computeNormalsComplexityVaryingNormals2D)
|
|||||||
#endif
|
#endif
|
||||||
// Two perpendicular surfaces (one small)
|
// Two perpendicular surfaces (one small)
|
||||||
complexity = util3d::computeNormalsComplexity(cloudB, Transform(), true);
|
complexity = util3d::computeNormalsComplexity(cloudB, Transform(), true);
|
||||||
EXPECT_LT(complexity, 0.25f);
|
EXPECT_NEAR(complexity, 0.0f, 1e-3);
|
||||||
EXPECT_GT(complexity, 0.01f);
|
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointNormal> corridorLikeCloud;
|
pcl::PointCloud<pcl::PointNormal> corridorLikeCloud;
|
||||||
#if PCL_VERSION_COMPARE(>=, 1, 10, 0)
|
#if PCL_VERSION_COMPARE(>=, 1, 10, 0)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include "rtabmap/utilite/UFile.h"
|
#include "rtabmap/utilite/UFile.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
#include <set>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
@@ -769,15 +770,20 @@ TEST_F(VWDictionaryTest, SetLastWordId)
|
|||||||
|
|
||||||
TEST_F(VWDictionaryTest, DeleteUnusedWords)
|
TEST_F(VWDictionaryTest, DeleteUnusedWords)
|
||||||
{
|
{
|
||||||
// Add words
|
// Add words (orthogonal descriptors so each gets its own visual word)
|
||||||
cv::Mat descriptors(3, 32, CV_32F);
|
cv::Mat descriptors(3, 32, CV_32F, cv::Scalar(0));
|
||||||
cv::randu(descriptors, cv::Scalar(0), cv::Scalar(1));
|
for(int i = 0; i < 3; ++i)
|
||||||
|
{
|
||||||
|
descriptors.at<float>(i, i) = 1.0f;
|
||||||
|
}
|
||||||
std::list<int> wordIds = dict->addNewWords(descriptors, 1);
|
std::list<int> wordIds = dict->addNewWords(descriptors, 1);
|
||||||
|
|
||||||
ASSERT_EQ(wordIds.size(), 3u);
|
ASSERT_EQ(wordIds.size(), 3u);
|
||||||
|
std::set<int> uniqueWordIds(wordIds.begin(), wordIds.end());
|
||||||
|
ASSERT_EQ(uniqueWordIds.size(), 3u);
|
||||||
|
|
||||||
// Remove references to make words unused
|
// Remove references to make words unused
|
||||||
for(int id : wordIds) {
|
for(int id : uniqueWordIds) {
|
||||||
dict->removeAllWordRef(id, 1);
|
dict->removeAllWordRef(id, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Executable
+114
@@ -0,0 +1,114 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Generate an HTML coverage report at coverage-html/index.html
|
||||||
|
# Run from anywhere; defaults: build dir = build-coverage, output = coverage-html/
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
BUILD_DIR="${COVERAGE_BUILD_DIR:-$ROOT/build-coverage}"
|
||||||
|
HTML_DIR="${COVERAGE_HTML_DIR:-$ROOT/coverage-html}"
|
||||||
|
INFO_FILE="${COVERAGE_INFO_FILE:-$ROOT/lcov.info}"
|
||||||
|
JOBS="${JOBS:-$(nproc)}"
|
||||||
|
|
||||||
|
need_cmd() {
|
||||||
|
command -v "$1" >/dev/null 2>&1 || {
|
||||||
|
echo "Error: required command not found: $1" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
need_cmd cmake
|
||||||
|
need_cmd lcov
|
||||||
|
need_cmd genhtml
|
||||||
|
need_cmd gcc
|
||||||
|
|
||||||
|
# lcov defaults to gcov-11 on Ubuntu; use gcov matching the active compiler.
|
||||||
|
detect_gcov_tool() {
|
||||||
|
local ver
|
||||||
|
ver="$(gcc -dumpversion 2>/dev/null | cut -d. -f1)"
|
||||||
|
if [[ -n "$ver" ]] && command -v "gcov-${ver}" >/dev/null 2>&1; then
|
||||||
|
echo "gcov-${ver}"
|
||||||
|
else
|
||||||
|
echo "gcov"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
GCOV_TOOL="$(detect_gcov_tool)"
|
||||||
|
LCOV_IGNORE=(--ignore-errors gcov,source,graph)
|
||||||
|
|
||||||
|
configure_coverage_build() {
|
||||||
|
local -a gtest_args=()
|
||||||
|
if [[ -d "$ROOT/build/_deps/googletest-src" ]]; then
|
||||||
|
gtest_args+=(
|
||||||
|
"-DFETCHCONTENT_SOURCE_DIR_GOOGLETEST=$ROOT/build/_deps/googletest-src"
|
||||||
|
-DFETCHCONTENT_UPDATES_DISCONNECTED=ON
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
cmake -B "$BUILD_DIR" \
|
||||||
|
-DCMAKE_BUILD_TYPE=Debug \
|
||||||
|
-DENABLE_COVERAGE=ON \
|
||||||
|
-DBUILD_TESTING=ON \
|
||||||
|
-DWITH_QT=OFF \
|
||||||
|
-DWITH_PYTHON=OFF \
|
||||||
|
-DWITH_CERES=OFF \
|
||||||
|
-DWITH_G2O=OFF \
|
||||||
|
-DWITH_GTSAM=OFF \
|
||||||
|
-DWITH_MRPT=OFF \
|
||||||
|
-DWITH_VERTIGO=OFF \
|
||||||
|
-DWITH_CVSBA=OFF \
|
||||||
|
-DWITH_POINTMATCHER=OFF \
|
||||||
|
-DWITH_CCCORELIB=OFF \
|
||||||
|
-DWITH_OPEN3D=OFF \
|
||||||
|
-DWITH_LOAM=OFF \
|
||||||
|
-DWITH_FLOAM=OFF \
|
||||||
|
-DWITH_LIOSAM=OFF \
|
||||||
|
-DWITH_FLYCAPTURE2=OFF \
|
||||||
|
-DWITH_ZED=OFF \
|
||||||
|
-DWITH_ZEDOC=OFF \
|
||||||
|
-DWITH_REALSENSE=OFF \
|
||||||
|
"${gtest_args[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ ! -f "$BUILD_DIR/CMakeCache.txt" ]]; then
|
||||||
|
echo "Configuring $BUILD_DIR (Debug + ENABLE_COVERAGE)..."
|
||||||
|
configure_coverage_build
|
||||||
|
elif ! grep -q '^ENABLE_COVERAGE:BOOL=ON' "$BUILD_DIR/CMakeCache.txt" 2>/dev/null; then
|
||||||
|
echo "Reconfiguring $BUILD_DIR with ENABLE_COVERAGE=ON..."
|
||||||
|
configure_coverage_build
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Building $BUILD_DIR (gcov tool: $GCOV_TOOL)..."
|
||||||
|
cmake --build "$BUILD_DIR" -j"$JOBS"
|
||||||
|
|
||||||
|
echo "Clearing old coverage runtime data..."
|
||||||
|
find "$BUILD_DIR" -name '*.gcda' -delete
|
||||||
|
|
||||||
|
echo "Running tests..."
|
||||||
|
# Prepend coverage libs: otherwise LD_LIBRARY_PATH (e.g. ROS) can load
|
||||||
|
# librtabmap from another build tree and .gcda is never written for corelib/src.
|
||||||
|
(
|
||||||
|
export LD_LIBRARY_PATH="$BUILD_DIR/bin${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
||||||
|
cd "$BUILD_DIR" && ctest --output-on-failure
|
||||||
|
)
|
||||||
|
|
||||||
|
echo "Capturing coverage..."
|
||||||
|
lcov --gcov-tool "$GCOV_TOOL" "${LCOV_IGNORE[@]}" \
|
||||||
|
--capture --directory "$BUILD_DIR" --output-file "$INFO_FILE"
|
||||||
|
|
||||||
|
echo "Filtering coverage data (repo sources only)..."
|
||||||
|
lcov "${LCOV_IGNORE[@]}" --extract "$INFO_FILE" \
|
||||||
|
"${ROOT}/*" \
|
||||||
|
--output-file "$INFO_FILE"
|
||||||
|
lcov "${LCOV_IGNORE[@]}" --remove "$INFO_FILE" \
|
||||||
|
'*/googletest/*' \
|
||||||
|
'*/_deps/*' \
|
||||||
|
'*/sqlite3/*' \
|
||||||
|
'*/corelib/test/*' \
|
||||||
|
'*/utilite/test/*' \
|
||||||
|
--output-file "$INFO_FILE"
|
||||||
|
|
||||||
|
echo "Generating HTML..."
|
||||||
|
rm -rf "$HTML_DIR"
|
||||||
|
genhtml "$INFO_FILE" --output-directory "$HTML_DIR" --legend --demangle-cpp
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Done: $HTML_DIR/index.html"
|
||||||
|
lcov --summary "$INFO_FILE" 2>/dev/null || true
|
||||||
+14
-15
@@ -1,67 +1,66 @@
|
|||||||
# UConversion.h
|
# UConversion.h
|
||||||
add_executable(test_uconversion test_uconversion.cpp)
|
add_executable(test_uconversion test_uconversion.cpp)
|
||||||
target_link_libraries(test_uconversion gtest_main rtabmap::utilite)
|
target_link_libraries(test_uconversion gtest_main rtabmap::utilite)
|
||||||
gtest_discover_tests(test_uconversion)
|
add_test(NAME test_uconversion COMMAND test_uconversion)
|
||||||
|
|
||||||
# UTimer.h
|
# UTimer.h
|
||||||
add_executable(test_utimer test_utimer.cpp)
|
add_executable(test_utimer test_utimer.cpp)
|
||||||
target_link_libraries(test_utimer gtest_main rtabmap::utilite)
|
target_link_libraries(test_utimer gtest_main rtabmap::utilite)
|
||||||
gtest_discover_tests(test_utimer)
|
add_test(NAME test_utimer COMMAND test_utimer)
|
||||||
|
|
||||||
# UVariant.h
|
# UVariant.h
|
||||||
add_executable(test_uvariant test_uvariant.cpp)
|
add_executable(test_uvariant test_uvariant.cpp)
|
||||||
target_link_libraries(test_uvariant gtest_main rtabmap::utilite)
|
target_link_libraries(test_uvariant gtest_main rtabmap::utilite)
|
||||||
gtest_discover_tests(test_uvariant)
|
add_test(NAME test_uvariant COMMAND test_uvariant)
|
||||||
|
|
||||||
# UFile.h
|
# UFile.h
|
||||||
add_executable(test_ufile test_ufile.cpp)
|
add_executable(test_ufile test_ufile.cpp)
|
||||||
target_link_libraries(test_ufile gtest_main rtabmap::utilite)
|
target_link_libraries(test_ufile gtest_main rtabmap::utilite)
|
||||||
gtest_discover_tests(test_ufile)
|
add_test(NAME test_ufile COMMAND test_ufile)
|
||||||
|
|
||||||
# UDirectory.h
|
# UDirectory.h
|
||||||
add_executable(test_udirectory test_udirectory.cpp)
|
add_executable(test_udirectory test_udirectory.cpp)
|
||||||
target_link_libraries(test_udirectory gtest_main rtabmap::utilite)
|
target_link_libraries(test_udirectory gtest_main rtabmap::utilite)
|
||||||
gtest_discover_tests(test_udirectory)
|
add_test(NAME test_udirectory COMMAND test_udirectory)
|
||||||
|
|
||||||
# UProcessInfo.h
|
# UProcessInfo.h
|
||||||
add_executable(test_uprocessinfo test_uprocessinfo.cpp)
|
add_executable(test_uprocessinfo test_uprocessinfo.cpp)
|
||||||
target_link_libraries(test_uprocessinfo gtest_main rtabmap::utilite)
|
target_link_libraries(test_uprocessinfo gtest_main rtabmap::utilite)
|
||||||
gtest_discover_tests(test_uprocessinfo)
|
add_test(NAME test_uprocessinfo COMMAND test_uprocessinfo)
|
||||||
|
|
||||||
# UMath.h
|
# UMath.h
|
||||||
add_executable(test_umath test_umath.cpp)
|
add_executable(test_umath test_umath.cpp)
|
||||||
target_link_libraries(test_umath gtest_main rtabmap::utilite)
|
target_link_libraries(test_umath gtest_main rtabmap::utilite)
|
||||||
gtest_discover_tests(test_umath)
|
add_test(NAME test_umath COMMAND test_umath)
|
||||||
|
|
||||||
# UStl.h
|
# UStl.h
|
||||||
add_executable(test_ustl test_ustl.cpp)
|
add_executable(test_ustl test_ustl.cpp)
|
||||||
target_link_libraries(test_ustl gtest_main rtabmap::utilite)
|
target_link_libraries(test_ustl gtest_main rtabmap::utilite)
|
||||||
gtest_discover_tests(test_ustl)
|
add_test(NAME test_ustl COMMAND test_ustl)
|
||||||
|
|
||||||
# UEventsHandler.h, UEventsManager.h, UEventsSender.h
|
# UEventsHandler.h, UEventsManager.h, UEventsSender.h
|
||||||
add_executable(test_uevents test_uevents.cpp)
|
add_executable(test_uevents test_uevents.cpp)
|
||||||
target_link_libraries(test_uevents gtest_main rtabmap::utilite)
|
target_link_libraries(test_uevents gtest_main rtabmap::utilite)
|
||||||
gtest_discover_tests(test_uevents)
|
add_test(NAME test_uevents COMMAND test_uevents)
|
||||||
|
|
||||||
# UMutex.h
|
# UMutex.h
|
||||||
add_executable(test_umutex test_umutex.cpp)
|
add_executable(test_umutex test_umutex.cpp)
|
||||||
target_link_libraries(test_umutex gtest_main rtabmap::utilite)
|
target_link_libraries(test_umutex gtest_main rtabmap::utilite)
|
||||||
gtest_discover_tests(test_umutex)
|
add_test(NAME test_umutex COMMAND test_umutex)
|
||||||
|
|
||||||
# UThread.h
|
# UThread.h
|
||||||
add_executable(test_uthread test_uthread.cpp)
|
add_executable(test_uthread test_uthread.cpp)
|
||||||
target_link_libraries(test_uthread gtest_main rtabmap::utilite)
|
target_link_libraries(test_uthread gtest_main rtabmap::utilite)
|
||||||
gtest_discover_tests(test_uthread)
|
add_test(NAME test_uthread COMMAND test_uthread)
|
||||||
|
|
||||||
# USemaphore.h
|
# USemaphore.h
|
||||||
add_executable(test_usemaphore test_usemaphore.cpp)
|
add_executable(test_usemaphore test_usemaphore.cpp)
|
||||||
target_link_libraries(test_usemaphore gtest_main rtabmap::utilite)
|
target_link_libraries(test_usemaphore gtest_main rtabmap::utilite)
|
||||||
gtest_discover_tests(test_usemaphore)
|
add_test(NAME test_usemaphore COMMAND test_usemaphore)
|
||||||
|
|
||||||
# ULogger.h
|
# ULogger.h
|
||||||
add_executable(test_ulogger test_ulogger.cpp)
|
add_executable(test_ulogger test_ulogger.cpp)
|
||||||
target_link_libraries(test_ulogger gtest_main rtabmap::utilite)
|
target_link_libraries(test_ulogger gtest_main rtabmap::utilite)
|
||||||
gtest_discover_tests(test_ulogger
|
add_test(NAME test_ulogger COMMAND test_ulogger)
|
||||||
PROPERTIES RUN_SERIAL TRUE
|
set_tests_properties(test_ulogger PROPERTIES RUN_SERIAL TRUE)
|
||||||
)
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user