mirror of
https://github.com/introlab/rtabmap.git
synced 2026-10-06 18:17:47 +08:00
Added RANSAC rejection filter to PCL ICP
This commit is contained in:
@@ -448,10 +448,6 @@ class RtabmapIntegrationFixture : public ::testing::Test {};
|
||||
// ---------------------------------------------------------------------------
|
||||
TEST_F(RtabmapIntegrationFixture, NetherdroneLidar3D)
|
||||
{
|
||||
#ifndef RTABMAP_POINTMATCHER
|
||||
GTEST_SKIP() << "Sparse 3D lidar ICP needs libpointmatcher; the PCL "
|
||||
"fallback diverges on this dataset.";
|
||||
#endif
|
||||
const std::string dbPath = testDataPath("netherdrone_lidar3d_sample_15s.db");
|
||||
SKIP_IF_MISSING(dbPath);
|
||||
|
||||
@@ -474,7 +470,15 @@ TEST_F(RtabmapIntegrationFixture, NetherdroneLidar3D)
|
||||
rtabmapParams[Parameters::kIcpIterations()] = "10";
|
||||
rtabmapParams[Parameters::kIcpMaxCorrespondenceDistance()] = uNumber2Str(voxelSize * 10.0f);
|
||||
rtabmapParams[Parameters::kIcpMaxTranslation()] = "3";
|
||||
// OutlierRatio means different things per ICP backend (see Parameters.h):
|
||||
// libpointmatcher uses it as TrimmedDist keep-ratio (mild trim at 0.7);
|
||||
// PCL uses it as a RANSAC threshold multiplier on maxCorrespondenceDistance,
|
||||
// where 0.1 gives the aggressive filtering this sparse lidar needs.
|
||||
#ifdef RTABMAP_POINTMATCHER
|
||||
rtabmapParams[Parameters::kIcpOutlierRatio()] = "0.7";
|
||||
#else
|
||||
rtabmapParams[Parameters::kIcpOutlierRatio()] = "0.1";
|
||||
#endif
|
||||
rtabmapParams[Parameters::kIcpPointToPlane()] = "true";
|
||||
rtabmapParams[Parameters::kIcpPointToPlaneK()] = "20";
|
||||
rtabmapParams[Parameters::kIcpPointToPlaneRadius()] = "0";
|
||||
@@ -554,12 +558,19 @@ TEST_F(RtabmapIntegrationFixture, NetherdroneLidar3D)
|
||||
EXPECT_NEAR(1845, result.octomapObstacleCells, 50);
|
||||
#endif
|
||||
|
||||
// Replay is deterministic; matching golden GT was captured from a clean
|
||||
// run of this exact configuration, so RMSE should be ~0.
|
||||
// libpointmatcher's TrimmedDist outlier filter aligns this sparse 3D-lidar
|
||||
// dataset to sub-mm RMSE against the golden trajectory. With PCL ICP the
|
||||
// best we can do is a RANSAC correspondence rejector (see
|
||||
// util3d_registration.cpp), which converges but to a looser ~3 cm RMSE.
|
||||
ASSERT_GE(result.translationalRmseFinal, 0.0f)
|
||||
<< "No Gt/translational_rmse in stats (golden GT not injected?)";
|
||||
#ifdef RTABMAP_POINTMATCHER
|
||||
EXPECT_LT(result.translationalRmseFinal, 0.001f)
|
||||
<< "Final trajectory RMSE = " << result.translationalRmseFinal << " m";
|
||||
#else
|
||||
EXPECT_LT(result.translationalRmseFinal, 0.05f)
|
||||
<< "Final trajectory RMSE = " << result.translationalRmseFinal << " m";
|
||||
#endif
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
@@ -672,7 +683,12 @@ TEST_F(RtabmapIntegrationFixture, PR2_Scan2D_RGBD_IcpReg)
|
||||
rtabmapParams[Parameters::kIcpCorrespondenceRatio()] = "0.10";
|
||||
rtabmapParams[Parameters::kIcpEpsilon()] = "0.001";
|
||||
rtabmapParams[Parameters::kIcpMaxTranslation()] = "0.5";
|
||||
// See Netherdrone test comment: OutlierRatio is backend-dependent.
|
||||
#ifdef RTABMAP_POINTMATCHER
|
||||
rtabmapParams[Parameters::kIcpOutlierRatio()] = "0.95";
|
||||
#else
|
||||
rtabmapParams[Parameters::kIcpOutlierRatio()] = "0.85";
|
||||
#endif
|
||||
rtabmapParams[Parameters::kIcpPointToPlane()] = "true";
|
||||
rtabmapParams[Parameters::kIcpVoxelSize()] = "0.0";
|
||||
rtabmapParams[Parameters::kMemBinDataKept()] = "true";
|
||||
@@ -700,11 +716,13 @@ TEST_F(RtabmapIntegrationFixture, PR2_Scan2D_RGBD_IcpReg)
|
||||
EXPECT_EQ(21, result.finalGlobalGraphSize);
|
||||
EXPECT_GE(result.proximityDetections, 1)
|
||||
<< "PR2 2D-scan dataset should produce proximity detections";
|
||||
// Observed: empty 22785-23106, obstacle 1302-1410.
|
||||
// Observed: empty 22785-23455, obstacle 1302-1580. Range widened to
|
||||
// absorb run-to-run variance from the RANSAC correspondence rejector
|
||||
// installed in the PCL ICP path (util3d_registration.cpp).
|
||||
EXPECT_GE(result.gridEmptyCells, 22500);
|
||||
EXPECT_LE(result.gridEmptyCells, 23200);
|
||||
EXPECT_LE(result.gridEmptyCells, 23800);
|
||||
EXPECT_GE(result.gridObstacleCells, 1250);
|
||||
EXPECT_LE(result.gridObstacleCells, 1450);
|
||||
EXPECT_LE(result.gridObstacleCells, 1700);
|
||||
#ifdef RTABMAP_OCTOMAP
|
||||
// 2D-laser-only signatures: nothing to assemble into a 3D OctoMap.
|
||||
EXPECT_EQ(0, result.octomapEmptyCells);
|
||||
|
||||
Reference in New Issue
Block a user