Add LIO-SAM as an odometry strategy#1684
Open
abhi2198 wants to merge 4 commits intointrolab:masterfrom
Open
Conversation
…ration Introduce PointXYZIRT point type and kXYZIRT LaserScan format (x,y,z, intensity,ring,time) so that ring indices survive the scan pipeline. Update OdometryLIOSAM to require kXYZIRT and properly split ring/time into the parallel buffers LIO-SAM expects. Extend deskewing to preserve ring data and disable base-class deskew in OdometryLIOSAM since LIO-SAM handles it internally.
matlabbe
reviewed
Apr 6, 2026
matlabbe
reviewed
Apr 6, 2026
matlabbe
reviewed
Apr 6, 2026
Member
|
Thank you for this PR! Overall it looks good! I've already put some comments. I'll be pretty busy this week on a field test trip but I can make the suggested changes next weekend/week if you don't have time to do it this week. |
- Add OdomLIOSAM/ConfigPath parameter to load LIO-SAM settings from a YAML file. When set, individual params are ignored. Extrinsics from sensor local transforms always override config file values. - Defer LioSamCore initialization until both IMU and lidar local transforms are available, computing T_lidar_imu from sensor data. IMU samples are buffered and replayed after init. - Fix deferred init for scan-only messages that arrive after IMU local transform is already cached. - Add LIO-SAM entry to odometry strategy combo box (index 14) with full PreferencesDialog panel including config path browse button and all parameter widgets.
Author
|
@matlabbe I have addressed all the PR comments. I have updated the Lio_sam fork with a paramserver as well. Let me know if I missed anything. Liosam refactored repo - https://github.com/abhi2198/liosam_library |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary:
Odom/Strategy 14) that uses the[lio_sam_core](https://github.com/abhi2198/liosam_nodelets)library for lidar-inertial odometry, with loop closure disabled (deferred to rtabmap)kXYZIRTLaserScan format (x,y,z,intensity,ring,time) so per-point ring and time fields survive the scan pipeline end-to-endkXYZIRT, preserving ring data through the correctionDetails
Build system (
CMakeLists.txt,Version.h.in,corelib/src/CMakeLists.txt)WITH_LIOSAMoption gated behindfind_package(lio_sam)lio_sam_corelibrary; definesRTABMAP_LIOSAMwhen foundNew odometry backend
OdometryLIOSAM.h/OdometryLIOSAM.cpp— wrapslio_sam::LioSamCorecanProcessAsyncIMU(), feedsaddImu()onevery IMU sample
kXYZIRTscans; splits them into the three parallel buffers(PointXYZI + ring vector + time vector) that LIO-SAM expects
linear/angular output variance
OdomLIOSAM/*) for sensor type, scangeometry, IMU noise, and feature thresholds
Registration in odometry factory
Odometry.h:kTypeLIOSAM = 14Odometry.cpp: factorycreate()caseParameters.h/Parameters.cpp: strategy description updated,OdomLIOSAM/*params declared,--infooutput addedNew scan format
kXYZIRTLaserScan.h/LaserScan.cpp: enum value 12, 6-channel, withhasRing()/getRingOffset()/isScanHasRing()accessors;getTimeOffset()corrected for per-format channel layout; validationassertions updated
util3d.h:PointXYZIRTPCL struct +POINT_CLOUD_REGISTER_POINT_STRUCTutil3d.cpp:laserScanFromPointCloud(PointXYZIRT)overloads,laserScanToPointCloud2routing forkXYZIRTDeskewing
deskew()format check relaxed from== kXYZITtohasTime()post-correction
kXYZITpath unchanged