[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"doc-detail-85764-en":3,"doc-seo-85764-105":28,"detail-sidebar-cat-0-en-105":89},{"code":4,"msg":5,"data":6},0,"success",{"doc_id":7,"user_id":8,"nickname":9,"user_avatar":10,"doc_module":4,"category_id":11,"category_name":12,"doc_title":13,"doc_description":14,"doc_content":15,"file_id":16,"file_url":17,"file_type":18,"file_size":19,"view_count":20,"is_deleted":4,"is_public":20,"is_downloadable":20,"audit_status":20,"page_count":21,"language":22,"language_code":23,"site_id":24,"html_lang":23,"table_of_contents":25,"faqs":26,"seo_title":13,"seo_description":14,"update_tm":27,"read_time":11},85764,2336464648322,"Aria","https://ap-avatar.wpscdn.com/avatar/2200025388227c56fec?_k=1778556882303663488",8,"Research & Report","A Numerically Robust ROS 2 Port of iG-LIO: Diagnosing and Fixing Toolchain-Induced Failures in Incremental GICP LiDAR-Inertial Odometry","iG-LIO is a tightly coupled LiDAR-inertial odometry system fusing generalized-ICP and point-to-plane constraints in an iterated error-state Kalman filter over an incremental voxel map. The report introduces an open-source ROS 2 Jazzy port of the original ROS 1 implementation and diagnoses environment-induced numerical failures that manifest only after porting, including NaN divergences. Root causes are traced to ROS 2 toolchain changes: an IMU QoS mismatch and an uninitialized oneTBB+Eigen parallel-reduce accumulator. Sensor parsing updates, additional driver support, and YAML-exposed runtime configuration are validated on Ouster and Livox datasets.","arXiv :2607 .09947v1 [ cs .RO] 10 Jul 2026  \nA Numerically-Robust ROS 2 Port of iG-LIO: Diagnosing and Fixing Toolchain-Induced Failures in Incremental GICP LiDAR-Inertial Odometry  \nAfonso E. Carvalho∗† David Portugal† Paulo Peixoto†  \n2026-07  \nTechnical Report  \nAbstract  \niG-LIO is a tightly-coupled LiDAR-inertial odometry system fusing generalized-ICP and point-to-plane constraints in an iterated error-state Kalman filter over an incremental voxel map. We report an open-source ROS 2 Jazzy port of the original ROS 1 implementation and, more importantly, the diagnosis of environmentinduced numerical failures that appear only after the port: a mechanically faithful migration – estimation mathematics left unchanged – compiled and ran, yet diverged with NaN internal values. Both causes trace to the modern ROS 2 toolchain, not the algorithm: a Quality-of-Service (QoS) mismatch that silently dropsand reorders IMU samples, and an uninitialized parallel-reduce accumulator arising from the oneTBB + Eigen combination shipped with current distributions. We further correct Ouster point-field parsing to ensure correct point cloud undistortion with newer Ouster revisions, add Velodyne Velarray M1600 support, provide both a compile-time-gated Livox CustomMsg path and a driver-free path for Livox sensors publishing standard PointCloud2 (e.g. Mid-360), and expose the runtime via YAML. The result has been validated in an Ouster OS0 Rev7, an Ouster OS1 Rev 7, and a Livox MID-360 . This report is a citable reference for the port itself, not a claim on the underlying algorithm [1] . The ROS 2 port of iG-LIO described in this document can be found at [https://github.com/Forestry-Robotics-UC/ig_lio/tree/ros2-jazzy](https://github.com/Forestry-Robotics-UC/ig_lio/tree/ros2-jazzy).  \n1 Introduction  \niG-LIO [1] is an incremental GICP-based, tightly-coupled LiDAR-inertial estimator, but its public implementation targets ROS 1, now end-of-life. Porting to ROS 2 [2] is not purely mechanical: ROS 2 replaces ROS 1’s implicit, lossless transport with an explicit QoS contract, and modern distributions bundle substantially newer oneTBBand Eigen than the code was written against. Either change can break a tightly-coupled filter silently – the port compiles, runs, and then diverges. All estimator math (voxel map, GICP + point-to-plane fusion, iterated-EKF propagation) is unchanged from upstream [1, 3]; the migration itself (catkin to ament_cmake, roscpp to rclcpp,.launch [to](to .launch.py)[ .launch.py](to .launch.py), tf to tf2 _ros) is mechanical and not detailed here. This report centers on debugging the two failures that surface only after that migration (Section 2), plus corrected sensor parsing (Section 3) and YAML-configurable QoS/TF/output paths (Section 4) . The estimator and its performance claims belong to the original authors [1] .  \n2 Diagnosing Numerical Failures  \nAfter a mechanically correct port – math unchanged – the solver died with NaN Hessian matrix entries and aborts inside SO3::exp(nan) . Two distinct, environment-level root causes were isolated; they are the most broadly transferable outcome of this work.  \n2.1 A QoS mismatch silently dropping IMU samples  \nThe initial port subscribed using rclcpp::SensorDataQoS(), i.e. BEST_EFFORT with KEEP_LAST(5) , while the data source (bag or driver) published RELIABLE with a deeper queue. This pairing is compatible but silently degrades to best-effort: under the single-threaded spin_some + processing loop, backed-up IMU samples were  \n∗ Robotics Institute (RI), Carnegie Mellon University (CMU), Pittsburgh, USA.†Institute of Systems and Robotics (ISR), University of Coimbra (UC), Coimbra, Portugal.  \ndropped and reordered, corrupting the signal the iterated filter’s propagation depends on. The fix subscribes RELIABLE with a deep IMU queue (KeepLast(2000)) and KeepLast(10) for the LiDAR – reliability is now a YAML parameter (Section 4)– plus a guard rejecting non-physical prediction time steps (∆t","cbCaigbEhXAovWGZ","https://ap.wps.com/l/cbCaigbEhXAovWGZ","pdf",3686469,1,3,"English","en",105,"# Introduction\n# Diagnosing Numerical Failures\n## A QoS mismatch silently dropping IMU samples\n## An uninitialized oneTBB + Eigen reduction accumulator\n# Sensor Support\n# YAML-Configurable QoS/TF/Output Paths","[{\"question\":\"What numerical failures occur after the ROS 2 port of iG-LIO?\",\"answer\":\"The solver produces NaN values, including NaN entries in the Hessian matrix, and aborts inside SO3::exp(nan). These divergences appear only after the migration while the estimator math remains unchanged.\"},{\"question\":\"How does a QoS mismatch contribute to failure in ROS 2?\",\"answer\":\"The port initially used SensorDataQoS (BEST_EFFORT, KEEP_LAST(5)) while the IMU source published RELIABLE with a deeper queue. This silently drops and reorders IMU samples under the single-threaded processing loop, corrupting the filter propagation.\"},{\"question\":\"What toolchain-level issue causes an uninitialized reduction accumulator?\",\"answer\":\"Constraint assembly uses tbb::parallel_reduce with a fixed-size Eigen matrix as the reduction value. oneTBB splits initialize the joined accumulators via default construction, and Eigen’s fixed-size default constructor does not zero-initialize storage, so uninitialized memory sums into H and b, creating NaNs.\"}]",1784206106,{"code":4,"msg":29,"data":30},"ok",{"site_id":24,"language":23,"slug":31,"title":13,"keywords":32,"description":14,"schema_data":33,"social_meta":84,"head_meta":86,"extra_data":88,"updated_unix":27},"a-numerically-robust-ros-2-port-of-ig-lio-diagnosing-and-fixing-toolchain-induced-failures-in-incremental-gicp-lidar-inertial-odometry","",{"@graph":34,"@context":83},[35,51,66],{"@type":36,"itemListElement":37},"BreadcrumbList",[38,42,46,48],{"item":39,"name":40,"@type":41,"position":20},"https://docshare.wps.com","Home","ListItem",{"item":43,"name":44,"@type":41,"position":45},"https://docshare.wps.com/document/","Document",2,{"item":47,"name":12,"@type":41,"position":21},"https://docshare.wps.com/document/research-report/",{"item":49,"name":13,"@type":41,"position":50},"https://docshare.wps.com/document/a-numerically-robust-ros-2-port-of-ig-lio-diagnosing-and-fixing-toolchain-induced-failures-in-incremental-gicp-lidar-inertial-odometry/85764/",4,{"url":49,"name":13,"@type":52,"author":53,"headline":13,"publisher":55,"fileFormat":58,"inLanguage":23,"description":14,"dateModified":59,"datePublished":60,"encodingFormat":58,"isAccessibleForFree":61,"interactionStatistic":62},"DigitalDocument",{"name":9,"@type":54},"Person",{"url":39,"name":56,"@type":57},"DocShare","Organization","application/pdf","2026-07-17","2026-07-16",true,{"@type":63,"interactionType":64,"userInteractionCount":20},"InteractionCounter",{"@type":65},"ViewAction",{"@type":67,"mainEntity":68},"FAQPage",[69,75,79],{"name":70,"@type":71,"acceptedAnswer":72},"What numerical failures occur after the ROS 2 port of iG-LIO?","Question",{"text":73,"@type":74},"The solver produces NaN values, including NaN entries in the Hessian matrix, and aborts inside SO3::exp(nan). These divergences appear only after the migration while the estimator math remains unchanged.","Answer",{"name":76,"@type":71,"acceptedAnswer":77},"How does a QoS mismatch contribute to failure in ROS 2?",{"text":78,"@type":74},"The port initially used SensorDataQoS (BEST_EFFORT, KEEP_LAST(5)) while the IMU source published RELIABLE with a deeper queue. This silently drops and reorders IMU samples under the single-threaded processing loop, corrupting the filter propagation.",{"name":80,"@type":71,"acceptedAnswer":81},"What toolchain-level issue causes an uninitialized reduction accumulator?",{"text":82,"@type":74},"Constraint assembly uses tbb::parallel_reduce with a fixed-size Eigen matrix as the reduction value. oneTBB splits initialize the joined accumulators via default construction, and Eigen’s fixed-size default constructor does not zero-initialize storage, so uninitialized memory sums into H and b, creating NaNs.","https://schema.org",{"og:url":49,"og:type":85,"og:title":13,"og:site_name":56,"og:description":14},"article",{"robots":87,"canonical":49},"index,follow",{"doc_id":7,"site_id":24},{"code":4,"msg":5,"data":90},[91,95,99,103,108,113,118,121,126,129,133],{"id":20,"doc_module":4,"doc_module_name":44,"category_name":92,"show_sort_weight":93,"slug":94},"Story & Novel",90,"story-novel",{"id":45,"doc_module":4,"doc_module_name":44,"category_name":96,"show_sort_weight":97,"slug":98},"Literature",80,"literature",{"id":50,"doc_module":4,"doc_module_name":44,"category_name":100,"show_sort_weight":101,"slug":102},"Exam",70,"exam",{"id":104,"doc_module":4,"doc_module_name":44,"category_name":105,"show_sort_weight":106,"slug":107},5,"Comic",60,"comic",{"id":109,"doc_module":4,"doc_module_name":44,"category_name":110,"show_sort_weight":111,"slug":112},6,"Technology",50,"technology",{"id":114,"doc_module":4,"doc_module_name":44,"category_name":115,"show_sort_weight":116,"slug":117},7,"Healthcare",40,"healthcare",{"id":11,"doc_module":4,"doc_module_name":44,"category_name":12,"show_sort_weight":119,"slug":120},30,"research-report",{"id":122,"doc_module":4,"doc_module_name":44,"category_name":123,"show_sort_weight":124,"slug":125},9,"Religion & Spirituality",20,"religion-spirituality",{"id":124,"doc_module":4,"doc_module_name":44,"category_name":127,"show_sort_weight":124,"slug":128},"World Cup","world-cup",{"id":130,"doc_module":4,"doc_module_name":44,"category_name":131,"show_sort_weight":130,"slug":132},10,"Lifestyle","lifestyle",{"id":134,"doc_module":4,"doc_module_name":44,"category_name":135,"show_sort_weight":104,"slug":136},19,"General","general"]