Robust LiDAR SLAM

Overview

SC-A-LOAM

What is SC-A-LOAM?

  • A real-time LiDAR SLAM package that integrates A-LOAM and ScanContext.
    • A-LOAM for odometry (i.e., consecutive motion estimation)
    • ScanContext for coarse global localization that can deal with big drifts (i.e., place recognition as kidnapped robot problem without initial pose)
    • and iSAM2 of GTSAM is used for pose-graph optimization.
  • This package aims to show ScanContext's handy applicability.
    • The only things a user should do is just to include Scancontext.h, call makeAndSaveScancontextAndKeys and detectLoopClosureID.

Features

  1. A modular implementation
    • The only difference from A-LOAM is the addition of the laserPosegraphOptimization.cpp file. In the new file, we subscribe the point cloud topic and odometry topic (as a result of A-LOAM, published from laserMapping.cpp). That is, our implementation is generic to any front-end odometry methods. Thus, our pose-graph optimization module (i.e., laserPosegraphOptimization.cpp) can easily be integrated with any odometry algorithms such as non-LOAM family or even other sensors (e.g., visual odometry).
  2. A strong place recognition and loop closing
    • We integrated ScanContext as a loop detector into A-LOAM, and ISAM2-based pose-graph optimization is followed. (see https://youtu.be/okML_zNadhY?t=313 to enjoy the drift-closing moment)
  3. (optional) Altitude stabilization using consumer-level GPS
    • To make a result more trustworthy, we supports GPS (consumer-level price, such as U-Blox EVK-7P)-based altitude stabilization. The LOAM family of methods are known to be susceptible to z-errors in outdoors. We used the robust loss for only the altitude term. For the details, see the variable robustGPSNoise in the laserPosegraphOptimization.cpp file.

Prerequisites (dependencies)

  • We mainly depend on ROS, Ceres (for A-LOAM), and GTSAM (for pose-graph optimization).
    • For the details to install the prerequisites, please follow the A-LOAM and LIO-SAM repositiory.
  • The below examples are done under ROS melodic (ubuntu 18) and GTSAM version 4.x.

How to use?

  • First, install the abovementioned dependencies, and follow below lines.
    mkdir -p ~/catkin_scaloam_ws/src
    cd ~/catkin_scaloam_ws/src
    git clone https://github.com/gisbi-kim/SC-A-LOAM.git
    cd ../
    catkin_make
    source ~/catkin_scaloam_ws/devel/setup.bash
    roslaunch aloam_velodyne aloam_mulran.launch # for MulRan dataset setting 

Example Results

Riverside 01, MulRan dataset

KITTI 05

Acknowledgements

  • Thanks to LOAM, A-LOAM, and LIO-SAM code authors. The major codes in this repository are borrowed from their efforts.

Maintainer

TODO

  • More examples on other datasets (KITTI, complex urban dataset, etc.)
  • Delayed RS loop closings
  • data saver (e.g., pose-graph, optimized map)
  • SLAM with multi-session localization
  • Efficient whole map visualization
Comments
  • Does the line

    Does the line "loopFindNearKeyframesCloud(cureKeyframeCloud, _curr_kf_idx, 0, _loop_kf_idx);" works as it should be?

    Hi, thanks for your excellent contribution!

    When I learned your code, I wondered if line 433 in laserPosegraphOptimization.cpp(mentioned below) works well as it's supposed to be. In my opinion, we should extract the point cloud in the global frame corresponding to "_curr_kf_idx" in this step. However, the function "loopFindNearKeyframesCloud" doesn't use the second parameter. Is there a mistake or I have a wrong understanding?

    Looking forward to your reply. Thanks a lot!

    void loopFindNearKeyframesCloud( pcl::PointCloud<PointType>::Ptr& nearKeyframes, const int& key, const int& submap_size, const int& root_idx)
    {
        // extract and stacking near keyframes (in global coord)
        nearKeyframes->clear();
        for (int i = -submap_size; i <= submap_size; ++i) {
            int keyNear = root_idx + i;
            if (keyNear < 0 || keyNear >= int(keyframeLaserClouds.size()) )
                continue;
    
            mKF.lock(); 
            *nearKeyframes += * local2global(keyframeLaserClouds[keyNear], keyframePosesUpdated[keyNear]);
            mKF.unlock(); 
        }
    
        if (nearKeyframes->empty())
            return;
    
        // downsample near keyframes
        pcl::PointCloud<PointType>::Ptr cloud_temp(new pcl::PointCloud<PointType>());
        downSizeFilterICP.setInputCloud(nearKeyframes);
        downSizeFilterICP.filter(*cloud_temp);
        *nearKeyframes = *cloud_temp;
    } // loopFindNearKeyframesCloud
    

    https://github.com/gisbi-kim/SC-A-LOAM/blob/f088000dfc383937609df416523a38fab06d36d0/src/laserPosegraphOptimization.cpp#L433

    bug 
    opened by QiMingZhenFan 5
  • Question about

    Question about "loopFindNearKeyframesCloud(cureKeyframeCloud, _curr_kf_idx, 0, _loop_kf_idx) ?

    Hi, thanks for your contribution. I have same question same as the question https://github.com/gisbi-kim/SC-A-LOAM/issues/7 However, I think the code still have something wrong, the code in the repo is as:

     void loopFindNearKeyframesCloud( pcl::PointCloud<PointType>::Ptr& nearKeyframes, const int& key, const int& submap_size, const int& root_idx)
    {
        // extract and stacking near keyframes (in global coord)
        nearKeyframes->clear();
        for (int i = -submap_size; i <= submap_size; ++i) {
            int keyNear = key + i; 
            if (keyNear < 0 || keyNear >= int(keyframeLaserClouds.size()) )
                continue;
    
            mKF.lock(); 
            *nearKeyframes += * local2global(keyframeLaserClouds[keyNear], keyframePosesUpdated[root_idx]);
            mKF.unlock(); 
        }
        if (nearKeyframes->empty())
            return;
        pcl::PointCloud<PointType>::Ptr cloud_temp(new pcl::PointCloud<PointType>());
        downSizeFilterICP.setInputCloud(nearKeyframes);
        downSizeFilterICP.filter(*cloud_temp);
        *nearKeyframes = *cloud_temp;
    } // loopFindNearKeyframesCloud
    

    where *nearKeyframes += * local2global(keyframeLaserClouds[keyNear], keyframePosesUpdated[root_idx]) should be:

    *nearKeyframes += * local2global(keyframeLaserClouds[keyNear], keyframePosesUpdated[keyNear]);
    

    The target of the function “loopFindNearKeyframesCloud ” is transforming the nearby keyframe point cloud stored in keyframeLaserClouds from thr Lidar coordinate to the world coordinate, to form a submap in _loop_kf_idx, so I think local2global should be the tranformation stored in keyframePosesUpdated[keyNear].

    微信图片_20220309111635

    opened by Tina1994 4
  • roslaunch aloam_velodyne aloam_mulran.launch # for MulRan dataset setting

    roslaunch aloam_velodyne aloam_mulran.launch # for MulRan dataset setting

    dji@dji-MANIFOLD-2-C:~/catkin_scaloam_ws/src/SC-A-LOAM$ roslaunch aloam_velodyne aloam_mulran.launch ... logging to /home/dji/.ros/log/26d237ca-c6c4-11eb-bfca-34d26269e60d/roslaunch-dji-MANIFOLD-2-C-14613.log Checking log directory for disk usage. This may take a while. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB.

    started roslaunch server http://dji-MANIFOLD-2-C:34089/

    SUMMARY

    PARAMETERS

    • /keyframe_meter_gap: 1.0
    • /lidar_type: OS1-64
    • /mapping_line_resolution: 0.4
    • /mapping_plane_resolution: 0.8
    • /mapping_skip_frame: 1
    • /minimum_range: 0.5
    • /rosdistro: melodic
    • /rosversion: 1.14.11
    • /save_directory: /home/user/Docume...
    • /sc_dist_thres: 0.2
    • /sc_max_radius: 80.0
    • /scan_line: 64

    NODES / alaserMapping (aloam_velodyne/alaserMapping) alaserOdometry (aloam_velodyne/alaserOdometry) alaserPGO (aloam_velodyne/alaserPGO) ascanRegistration (aloam_velodyne/ascanRegistration) rviz (rviz/rviz)

    auto-starting new master process[master]: started with pid [14623] ROS_MASTER_URI=http://localhost:11311

    setting /run_id to 26d237ca-c6c4-11eb-bfca-34d26269e60d process[rosout-1]: started with pid [14634] started core service [/rosout] process[ascanRegistration-2]: started with pid [14641] process[alaserOdometry-3]: started with pid [14642] process[alaserMapping-4]: started with pid [14643] ERROR: cannot launch node of type [aloam_velodyne/alaserPGO]: Cannot locate node of type [alaserPGO] in package [aloam_velodyne]. Make sure file exists in package path and permission is set to executable (chmod +x) process[rviz-6]: started with pid [14649] QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms" ... QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqeglfs.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqeglfs.so, metadata= { "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3", "MetaData": { "Keys": [ "eglfs" ] }, "className": "QEglFSIntegrationPlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("eglfs") QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqlinuxfb.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqlinuxfb.so, metadata= { "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3", "MetaData": { "Keys": [ "linuxfb" ] }, "className": "QLinuxFbIntegrationPlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("linuxfb") QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqminimal.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqminimal.so, metadata= { "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3", "MetaData": { "Keys": [ "minimal" ] }, "className": "QMinimalIntegrationPlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("minimal") QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqminimalegl.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqminimalegl.so, metadata= { "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3", "MetaData": { "Keys": [ "minimalegl" ] }, "className": "QMinimalEglIntegrationPlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("minimalegl") QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqoffscreen.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqoffscreen.so, metadata= { "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3", "MetaData": { "Keys": [ "offscreen" ] }, "className": "QOffscreenIntegrationPlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("offscreen") QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqvnc.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqvnc.so, metadata= { "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3", "MetaData": { "Keys": [ "vnc" ] }, "className": "QVncIntegrationPlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("vnc") QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so, metadata= { "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3", "MetaData": { "Keys": [ "xcb" ] }, "className": "QXcbIntegrationPlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("xcb") QFactoryLoader::QFactoryLoader() checking directory path "/opt/ros/melodic/lib/rviz/platforms" ... loaded library "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so" loaded library "Xcursor" QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/x86_64-linux-gnu/qt5/plugins/xcbglintegrations" ... QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/xcbglintegrations/libqxcb-egl-integration.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/xcbglintegrations/libqxcb-egl-integration.so, metadata= { "IID": "org.qt-project.Qt.QPA.Xcb.QXcbGlIntegrationFactoryInterface.5.5", "MetaData": { "Keys": [ "xcb_egl" ] }, "className": "QXcbEglIntegrationPlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("xcb_egl") QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/xcbglintegrations/libqxcb-glx-integration.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/xcbglintegrations/libqxcb-glx-integration.so, metadata= { "IID": "org.qt-project.Qt.QPA.Xcb.QXcbGlIntegrationFactoryInterface.5.5", "MetaData": { "Keys": [ "xcb_glx" ] }, "className": "QXcbGlxIntegrationPlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("xcb_glx") QFactoryLoader::QFactoryLoader() checking directory path "/opt/ros/melodic/lib/rviz/xcbglintegrations" ... loaded library "/usr/lib/x86_64-linux-gnu/qt5/plugins/xcbglintegrations/libqxcb-glx-integration.so" QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/x86_64-linux-gnu/qt5/plugins/platformthemes" ... QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platformthemes/libqgtk3.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platformthemes/libqgtk3.so, metadata= { "IID": "org.qt-project.Qt.QPA.QPlatformThemeFactoryInterface.5.1", "MetaData": { "Keys": [ "gtk3" ] }, "className": "QGtk3ThemePlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("gtk3") QFactoryLoader::QFactoryLoader() checking directory path "/opt/ros/melodic/lib/rviz/platformthemes" ... loaded library "/usr/lib/x86_64-linux-gnu/qt5/plugins/platformthemes/libqgtk3.so" QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts" ... QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin.so, metadata= { "IID": "org.qt-project.Qt.QPlatformInputContextFactoryInterface.5.1", "MetaData": { "Keys": [ "compose", "xim" ] }, "className": "QComposePlatformInputContextPlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("compose", "xim") QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libibusplatforminputcontextplugin.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libibusplatforminputcontextplugin.so, metadata= { "IID": "org.qt-project.Qt.QPlatformInputContextFactoryInterface.5.1", "MetaData": { "Keys": [ "ibus" ] }, "className": "QIbusPlatformInputContextPlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("ibus") QFactoryLoader::QFactoryLoader() checking directory path "/opt/ros/melodic/lib/rviz/platforminputcontexts" ... loaded library "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libibusplatforminputcontextplugin.so" QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/x86_64-linux-gnu/qt5/plugins/styles" ... QFactoryLoader::QFactoryLoader() checking directory path "/opt/ros/melodic/lib/rviz/styles" ... QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/x86_64-linux-gnu/qt5/plugins/iconengines" ... QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/iconengines/libqsvgicon.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/iconengines/libqsvgicon.so, metadata= { "IID": "org.qt-project.Qt.QIconEngineFactoryInterface", "MetaData": { "Keys": [ "svg", "svgz", "svg.gz" ] }, "className": "QSvgIconPlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("svg", "svgz", "svg.gz") QFactoryLoader::QFactoryLoader() checking directory path "/opt/ros/melodic/lib/rviz/iconengines" ... QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats" ... QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqgif.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqgif.so, metadata= { "IID": "org.qt-project.Qt.QImageIOHandlerFactoryInterface", "MetaData": { "Keys": [ "gif" ], "MimeTypes": [ "image/gif" ] }, "className": "QGifPlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("gif") QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqico.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqico.so, metadata= { "IID": "org.qt-project.Qt.QImageIOHandlerFactoryInterface", "MetaData": { "Keys": [ "ico", "cur" ], "MimeTypes": [ "image/vnd.microsoft.icon" ] }, "className": "QICOPlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("ico", "cur") QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqjpeg.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqjpeg.so, metadata= { "IID": "org.qt-project.Qt.QImageIOHandlerFactoryInterface", "MetaData": { "Keys": [ "jpg", "jpeg" ], "MimeTypes": [ "image/jpeg", "image/jpeg" ] }, "className": "QJpegPlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("jpg", "jpeg") QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqsvg.so" Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqsvg.so, metadata= { "IID": "org.qt-project.Qt.QImageIOHandlerFactoryInterface", "MetaData": { "Keys": [ "svg", "svgz" ], "MimeTypes": [ "image/svg+xml", "image/svg+xml-compressed" ] }, "className": "QSvgPlugin", "debug": false, "version": 329989 }

    Got keys from plugin meta data ("svg", "svgz") QFactoryLoader::QFactoryLoader() checking directory path "/opt/ros/melodic/lib/rviz/imageformats" ... loaded library "/usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqgif.so" loaded library "/usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqico.so" loaded library "/usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqjpeg.so" loaded library "/usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqsvg.so" QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/x86_64-linux-gnu/qt5/plugins/accessible" ... QFactoryLoader::QFactoryLoader() checking directory path "/opt/ros/melodic/lib/rviz/accessible" ... QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/x86_64-linux-gnu/qt5/plugins/accessiblebridge" ... QFactoryLoader::QFactoryLoader() checking directory path "/opt/ros/melodic/lib/rviz/accessiblebridge" ... loaded library "/usr/lib/x86_64-linux-gnu/qt5/plugins/iconengines/libqsvgicon.so" ^C[rviz-6] killing on exit [alaserMapping-4] killing on exit [alaserOdometry-3] killing on exit [ascanRegistration-2] killing on exit terminate called without an active exception QLibraryPrivate::unload succeeded on "/usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqgif.so" QLibraryPrivate::unload succeeded on "/usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqico.so" QLibraryPrivate::unload succeeded on "/usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqjpeg.so" QLibraryPrivate::unload succeeded on "/usr/lib/x86_64-linux-gnu/qt5/plugins/imageformats/libqsvg.so" QLibraryPrivate::unload succeeded on "/usr/lib/x86_64-linux-gnu/qt5/plugins/iconengines/libqsvgicon.so" QLibraryPrivate::unload succeeded on "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libibusplatforminputcontextplugin.so" QLibraryPrivate::unload succeeded on "/usr/lib/x86_64-linux-gnu/qt5/plugins/platformthemes/libqgtk3.so" QLibraryPrivate::unload succeeded on "/usr/lib/x86_64-linux-gnu/qt5/plugins/xcbglintegrations/libqxcb-glx-integration.so" QLibraryPrivate::unload succeeded on "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so" QLibraryPrivate::unload succeeded on "Xcursor" (faked) [rosout-1] killing on exit [master] killing on exit shutting down processing monitor... ... shutting down processing monitor complete done dji@dji-MANIFOLD-2-C:~/catkin_scaloam_ws/src/SC-A-LOAM$ ls

    ERROR: cannot launch node of type [aloam_velodyne/alaserPGO]: Cannot locate node of type [alaserPGO] in package [aloam_velodyne]. Make sure file exists in package path and permission is set to executable (chmod +x)

    opened by kxch928925819 4
  • failed when catkin_make the project

    failed when catkin_make the project

    I got the following error message when run catkin_make to build the project. I am using Ubuntu 18.04, and it can run A-LOAM perfectly, and I have installed GTSAM4.0.0. Does anyone know how to fix the error? thank you very much.

    [ 63%] Linking CXX executable /home/ruofei/code_project/cpp_project/catkin_scaloam_ws/devel/lib/aloam_velodyne/ascanRegistration [ 72%] Linking CXX executable /home/ruofei/code_project/cpp_project/catkin_scaloam_ws/devel/lib/aloam_velodyne/kittiHelper [ 72%] Built target kittiHelper [ 72%] Built target ascanRegistration In file included from /usr/include/pcl-1.8/pcl/sample_consensus/sac_model.h:52:0, from /usr/include/pcl-1.8/pcl/sample_consensus/sac.h:45, from /usr/include/pcl-1.8/pcl/sample_consensus/ransac.h:44, from /usr/include/pcl-1.8/pcl/registration/icp.h:45, from /home/ruofei/code_project/cpp_project/catkin_scaloam_ws/src/SC-A-LOAM/src/laserPosegraphOptimization.cpp:19: /usr/include/pcl-1.8/pcl/sample_consensus/model_types.h: In function ‘void __static_initialization_and_destruction_0(int, int)’: /usr/include/pcl-1.8/pcl/sample_consensus/model_types.h:99:3: warning: ‘pcl::SAC_SAMPLE_SIZE’ is deprecated: This map is deprecated and is kept only to prevent breaking existing user code. Starting from PCL 1.8.0 model sample size is a protected member of the SampleConsensusModel class [-Wdeprecated-declarations] SAC_SAMPLE_SIZE (sample_size_pairs, sample_size_pairs + sizeof (sample_size_pairs) / sizeof (SampleSizeModel)); ^~~~~~~~~~~~~~~ /usr/include/pcl-1.8/pcl/sample_consensus/model_types.h:99:3: note: declared here SC-A-LOAM/CMakeFiles/alaserPGO.dir/build.make:62: recipe for target 'SC-A-LOAM/CMakeFiles/alaserPGO.dir/src/laserPosegraphOptimization.cpp.o' failed make[2]: *** [SC-A-LOAM/CMakeFiles/alaserPGO.dir/src/laserPosegraphOptimization.cpp.o] Error 1 CMakeFiles/Makefile2:1436: recipe for target 'SC-A-LOAM/CMakeFiles/alaserPGO.dir/all' failed make[1]: *** [SC-A-LOAM/CMakeFiles/alaserPGO.dir/all] Error 2 Makefile:140: recipe for target 'all' failed make: *** [all] Error 2 Invoking "make -j20 -l20" failed

    opened by bairuofei 1
  • loop closure problem

    loop closure problem

    Hi there,

    I am trying to generate a map which has big loop about 7-8 km, but loop is not closing so I investigated the code and I saw a line that prepare GPS noise error (https://github.com/gisbi-kim/SC-A-LOAM/blob/321cb4b07b7815c114237ce5d87014d2e46b972c/src/laserPosegraphOptimization.cpp#L301) here. I decreased the error value to 2 meter xy, 1 meter height. But this action was not solve the problem.

    Also a few line below there is a comment 'https://github.com/gisbi-kim/SC-A-LOAM/blob/321cb4b07b7815c114237ce5d87014d2e46b972c/src/laserPosegraphOptimization.cpp#L304' like that. So current GPS usage only includes for height correction, to solve the loop closure problem I think that I have to use GPS more effectively for xy dimensions.

    Do you have any suggestion to me?

    Thanks... loop

    opened by mertyavuz41 0
  • error during build

    error during build

    After installing the necessary dependencies and cloning the git, I faced the following error during build:

    [ 90%] Built target alaserMapping [ 90%] Built target ascanRegistration [100%] Linking CXX executable /home/mcw/catkin_scaloam/devel/lib/aloam_velodyne/alaserPGO /usr/bin/ld: cannot find -lBoost::timer collect2: error: ld returned 1 exit status SC-A-LOAM/CMakeFiles/alaserPGO.dir/build.make:468: recipe for target '/home/mcw/catkin_scaloam/devel/lib/aloam_velodyne/alaserPGO' failed make[2]: *** [/home/mcw/catkin_scaloam/devel/lib/aloam_velodyne/alaserPGO] Error 1 CMakeFiles/Makefile2:1436: recipe for target 'SC-A-LOAM/CMakeFiles/alaserPGO.dir/all' failed make[1]: *** [SC-A-LOAM/CMakeFiles/alaserPGO.dir/all] Error 2 Makefile:140: recipe for target 'all' failed make: *** [all] Error 2 Invoking "make -j4 -l4" failed

    opened by vickyskarthik 0
  • Pose Graph doesn't converge

    Pose Graph doesn't converge

    @gisbi-kim When I am using aloam_velodyne_HDL-64.launch file the odometry is working great but I am getting this warning message

    Warning

    After the mini-kitti-publisher is done publishing the points the I recieve the optimized_poses.txt file but this is the output on my terminal and this doesn't converge even after leaving it for more than half an hour.

    No covergence

    I am using Ros Melodic on VMware. Can you recommend what should I do ?

    Let me know if you need more information.

    Once again thank you for creating this repository.

    opened by Shubham-2302 0
  • Kitti dataset results in inccorect orientation

    Kitti dataset results in inccorect orientation

    I am using Sc-A-LOAM to generate odometry. This outputs a txt file called optimised poses. When I use evo_traj on the optimised poses vs kitti ground truth for 05 sequence. This is my result. number of poses and ground truth comparison

    The ground truth is in xz plane and my results are in xy plane. What is the best way to output the optimised_poses.txt in the xz plane? optimized_poses.txt This is in kitti format and thus doesn't have any time stamps and as you can see from the image has less number of total poses.

    I am using ROS Melodic, Ubuntu 18.04 I am using minikitti publisher to publish the Kitti data & using aloam_velodyne_HDL_64.launch

    Let me know if you need any more information.

    Any help is appreciated.

    @gisbi-kim

    opened by Shubham-2302 0
  • Transform error in pgoOdom

    Transform error in pgoOdom

    Hi,

    After running sc-a-loam for a few minutes, all of a sudden I get the following error (keeps repeating until process is closed): Saving the posegraph ... running isam2 optimization ... Saving the posegraph ... running isam2 optimization ... Saving the posegraph ... [ERROR] [1658300918.247001921]: Error transforming odometry 'pgoOdom' from frame '/camera_init' to frame 'camera_init' [ERROR] [1658300918.342610283]: Error transforming odometry 'pgoOdom' from frame '/camera_init' to frame 'camera_init' [ERROR] [1658300918.437678957]: Error transforming odometry 'pgoOdom' from frame '/camera_init' to frame 'camera_init' [ERROR] [1658300918.534470309]: Error transforming odometry 'pgoOdom' from frame '/camera_init' to frame 'camera_init' I've tried renaming the the camera_init topic in laserPosegraphOptimization.cpp without the leading '/', to no avail. Any ideas on what the issue might be?

    opened by mar-watt 0
  • How to judge the true and false positives of the loop closure and how to get the precision and recall rate

    How to judge the true and false positives of the loop closure and how to get the precision and recall rate

    I'm new to SLAM, so I don't know how to determine the true and false positives of the loop closure detected by Scan-context, and how the precision and recall rates mentioned in the paper are calculated?

    opened by James-919 0
  • Bug in laserPosegraphOptimization.cpp?

    Bug in laserPosegraphOptimization.cpp?

    In the function loopFindNearKeyframesCloud (line 412), key frames are being combined into a single point cloud to be used as the target in the ICP registration (doICPVirtualRelative).

    This is how it is:

    *nearKeyframes += * local2global(keyframeLaserClouds[keyNear], keyframePosesUpdated[root_idx]);

    This is how it should be (I guess):

    *nearKeyframes += * local2global(keyframeLaserClouds[keyNear], keyframePosesUpdated[keyNear]);

    This way, the correct pose for each key frame cloud is used when converting them to the global coordinate frame. The original line results a cluttered point cloud, and thus the ICP registration results often a poor fitness score. Because the best matching key frame with index 'key' (predicted by the scan context matching) is still included in the cluttered cloud, the registration may still result a correct transform. But not always. At least not with my LiDAR data collected with Ouster OS1-32.

    opened by PaulKemppi 1
  • running crashed with Mid-70+ex-imu

    running crashed with Mid-70+ex-imu

    Hi, I use livox mid 70 with a extend imu running fast-lio,and it looks good. but when I run another node in SC-PGO it always crashed at begining, the log in screen is "running isam2 optimization",and after some lines like this, the ros node is crashed. my launch file is below:

    <param name="scan_line" type="int" value="64" />
    
    <!-- if 1, do mapping 10 Hz, if 2, do mapping 5 Hz. Suggest to use 1, it will adjust frequence automaticlly -->
    <!-- <param name="mapping_skip_frame" type="int" value="1" /> -->
    
    <!-- remove too closed points -->
    <param name="minimum_range" type="double" value="0.5"/>
    
    <param name="mapping_line_resolution" type="double" value="0.4"/> <!-- A-LOAM -->
    <param name="mapping_plane_resolution" type="double" value="0.8"/> <!-- A-LOAM -->
    
    <param name="mapviz_filter_size" type="double" value="0.05"/>
    
    <!-- SC-A-LOAM -->
    <param name="keyframe_meter_gap" type="double" value="0.5"/>
    
    <!-- Scan Context -->
    <param name="sc_dist_thres" type="double" value="0.3"/> <!-- SC-A-LOAM, if want no outliers, use 0.1-0.15 -->
    
    <!-- for MulRan -->
    <!-- <param name="lidar_type" type="string" value="OS1-64"/> -->
    
    <!-- input from FASTLIO2 -->
    <remap from="/aft_mapped_to_init" to="/Odometry"/>
    <remap from="/velodyne_cloud_registered_local" to="/cloud_registered_body"/>
    <remap from="/cloud_for_scancontext" to="/cloud_registered_lidar"/>   <!-- because ScanContext requires lidar-ego-centric coordinate for the better performance -->
    
    <!-- utils -->
    <param name="save_directory" type="string" value="$(env HOME)/sc-fast_ws/"/>  <!-- CHANGE THIS and end with / -->
    
    <!-- nodes -->
    <node pkg="aloam_velodyne" type="alaserPGO" name="alaserPGO" output="screen" /> <!-- Scan Context-based PGO -->
    
    <!-- visulaization -->
    <arg name="rvizscpgo" default="false" />
    <group if="$(arg rvizscpgo)">
        <node launch-prefix="nice" pkg="rviz" type="rviz" name="rvizscpgo" args="-d $(find aloam_velodyne)/rviz_cfg/aloam_velodyne.rviz" />
    </group>
    
    opened by gongyue666 3
Owner
Giseop Kim
Ph.D student, KAIST
Giseop Kim
A real-time, direct and tightly-coupled LiDAR-Inertial SLAM for high velocities with spinning LiDARs

LIMO-Velo [Alpha] ?? [16 February 2022] ?? The project is on alpha stage, so be sure to open Issues and Discussions and give all the feedback you can!

Andreu Huguet 150 Dec 28, 2022
RRxIO - Robust Radar Visual/Thermal Inertial Odometry: Robust and accurate state estimation even in challenging visual conditions.

RRxIO - Robust Radar Visual/Thermal Inertial Odometry RRxIO offers robust and accurate state estimation even in challenging visual conditions. RRxIO c

Christopher Doer 63 Dec 20, 2022
A ros package for robust odometry and mapping using LiDAR with aid of different sensors

W-LOAM A ros package for robust odometry and mapping using LiDAR with aid of different sensors Demo Video https://www.bilibili.com/video/BV1Fy4y1L7kZ?

Saki-Chen 51 Nov 2, 2022
Livox-Mapping - An all-in-one and ready-to-use LiDAR-inertial odometry system for Livox LiDAR

Livox-Mapping This repository implements an all-in-one and ready-to-use LiDAR-inertial odometry system for Livox LiDAR. The system is developed based

null 257 Dec 27, 2022
Lidar-with-velocity - Lidar with Velocity: Motion Distortion Correction of Point Clouds from Oscillating Scanning Lidars

Lidar with Velocity A robust camera and Lidar fusion based velocity estimator to undistort the pointcloud. This repository is a barebones implementati

ISEE Research Group 163 Dec 15, 2022
Helper C++ classes to quickly preintegrate IMU measurements between SLAM keyframes

mola-imu-preintegration Integrator of IMU angular velocity readings. This repository provides: IMUIntegrator and RotationIntegrator: C++ classes to in

The MOLA SLAM framework 12 Nov 21, 2022
QPEP (Quadratic Pose Estimation Problems) Enhanced VINS-Mono SLAM System

VINS-Mono-QPEP The QPEP (Quadratic Pose Estimation Problems) Enhanced VINS-Mono

Jin Wu 36 Nov 2, 2022
Robust multi-prompt delimited control and effect handlers in C/C++

libmprompt Note: The library is under development and not yet complete. This library should not be used in production code. Latest release: v0.2, 2021

Koka Language and Related Tools 94 Dec 27, 2022
VID-Fusion: Robust Visual-Inertial-Dynamics Odometry for Accurate External Force Estimation

VID-Fusion VID-Fusion: Robust Visual-Inertial-Dynamics Odometry for Accurate External Force Estimation Authors: Ziming Ding , Tiankai Yang, Kunyi Zhan

ZJU FAST Lab 86 Nov 18, 2022
Integrate the ZENO node system into Blender for creating robust physics animations!

ZenoBlend Integrate the ZENO node system into Blender for creating robust physics animations! End-user Installation Goto Release page, and click Asset

Zenus Technology 36 Oct 28, 2022
weggli is a fast and robust semantic search tool for C and C++ codebases. It is designed to help security researchers identify interesting functionality in large codebases.

weggli is a fast and robust semantic search tool for C and C++ codebases. It is designed to help security researchers identify interesting functionality in large codebases.

Google Project Zero 2k Dec 28, 2022
Program your micro-controllers in a fast and robust high-level language.

Toit language implementation This repository contains the Toit language implementation. It is fully open source and consists of the compiler, virtual

Toit language 988 Jan 4, 2023
A generic and robust calibration toolbox for multi-camera systems

MC-Calib Toolbox described in the paper "MultiCamCalib: A Generic Calibration Toolbox for Multi-Camera Systems". Installation Requirements: Ceres, Boo

null 204 Jan 5, 2023
lib release of paper [TopoTag: A Robust and Scalable Topological Fiducial Marker System]

Library release of paper TopoTag: A Robust and Scalable Topological Fiducial Marker System. Project page: https://herohuyongtao.github.io/research/pub

Yongtao Hu 7 Jul 13, 2022
Mars_lib - MaRS: A Modular and Robust Sensor-Fusion Framework

Introduction The Modular and Robust State-Estimation Framework, or short, MaRS, is a recursive filtering framework that allows for truly modular multi

Control of Networked Systems - University of Klagenfurt 146 Jan 5, 2023
FastFormat - The fastest, most robust C++ formatting library

FastFormat The fastest, most robust C++ formatting library Git access to the FastFormat formatting library (C++) FastFormat is an extremely fast, 100%

null 52 Nov 20, 2022
Wykobi is an efficient, robust and simple to use multi-platform 2D/3D computational geometry library.

Description Wykobi is an efficient, robust and simple to use multi-platform 2D/3D computational geometry library. Wykobi provides a concise, predictab

Arash Partow 131 Oct 24, 2022
This repository is used for automatic calibration between high resolution LiDAR and camera in targetless scenes.

livox_camera_calib livox_camera_calib is a robust, high accuracy extrinsic calibration tool between high resolution LiDAR (e.g. Livox) and camera in t

HKU-Mars-Lab 491 Dec 29, 2022
LVI-SAM: Tightly-coupled Lidar-Visual-Inertial Odometry via Smoothing and Mapping

LVI-SAM This repository contains code for a lidar-visual-inertial odometry and mapping system, which combines the advantages of LIO-SAM and Vins-Mono

Tixiao Shan 1.1k Jan 8, 2023