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
Issues
  • 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

    [email protected]:~/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 [email protected]:~/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
  • 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
  • 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
  • ERROR install

    ERROR install

    I get this message when execute catkin_make: [-Wreturn-type] } // xy2theta ^ [ 72%] Linking CXX executable /home/id/catkin_scaloam_ws/devel/lib/aloam_velodyne/kittiHelper [ 72%] Linking CXX executable /home/id/catkin_scaloam_ws/devel/lib/aloam_velodyne/ascanRegistration [ 72%] Built target kittiHelper /home/id/catkin_scaloam_ws/src/SC-A-LOAM/src/laserPosegraphOptimization.cpp: In function ‘int main(int, char**)’: /home/id/catkin_scaloam_ws/src/SC-A-LOAM/src/laserPosegraphOptimization.cpp:781:10: warning: variable ‘unused’ set but not used [-Wunused-but-set-variable] auto unused = system((std::string("exec rm -r ") + pgScansDirectory).c_str()); ^~~~~~ [ 72%] Built target ascanRegistration [ 81%] Linking CXX executable /home/id/catkin_scaloam_ws/devel/lib/aloam_velodyne/alaserOdometry [ 81%] Built target alaserOdometry 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/id/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));

    AND THEN WHEN EXECUTING: roslaunch aloam_velodyne aloam_velodyne_HDL_64.launch

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

    setting /run_id to 058225d2-2c07-11ec-8133-3cf011fc43dd process[rosout-1]: started with pid [31000] started core service [/rosout] process[ascanRegistration-2]: started with pid [31003] process[alaserOdometry-3]: started with pid [31008] process[alaserMapping-4]: started with pid [31009] process[alaserPGO-5]: started with pid [31010] /home/id/catkin_scaloam_ws/devel/lib/aloam_velodyne/alaserPGO: error while loading shared libraries: libmetis.so: cannot open shared object file: No such file or directory process[rviz-6]: started with pid [31016]

    [alaserPGO-5] process has died [pid 31010, exit code 127, cmd /home/id/catkin_scaloam_ws/devel/lib/aloam_velodyne/alaserPGO /velodyne_points:=/velodyne_points __name:=alaserPGO __log:=/home/id/.ros/log/058225d2-2c07-11ec-8133-3cf011fc43dd/alaserPGO-5.log].

    log file: /home/id/.ros/log/058225d2-2c07-11ec-8133-3cf011fc43dd/alaserPGO-5*.log [rviz-6] process has finished cleanly

    opened by antun008 5
Owner
Giseop Kim
Ph.D student, KAIST
Giseop Kim
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 56 Jul 26, 2022
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 121 Aug 12, 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 45 Jun 14, 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 201 Jul 31, 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 136 Aug 8, 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 9 Feb 11, 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 27 Jul 19, 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 85 Jul 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 77 Aug 2, 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 31 Jun 10, 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 1.8k Aug 4, 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 929 Aug 5, 2022
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 150 Jul 27, 2022
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 125 Jul 25, 2022
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 51 Jul 12, 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 128 Jul 26, 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 399 Aug 11, 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 1k Aug 10, 2022