Rico's Nerd Cluster

「离开世界之前 一切都是过程」

Robotics - [3D SLAM - 5] LIO Hands-On

Spatial Tiling

Issues That I Encountered IMU / LiDAR Synchronization There are several real-world timing problems to handle: The ROS publisher, bag writer, and LiDAR driver are all bursty — LiDAR data can a...

Underwater LiDAR: How Light-Based Sensing Works Beneath the Waves

Introduction LiDAR (Light Detection and Ranging) is incredibly effective in air, enabling autonomous vehicles, drones, and robots to map their surroundings with centimeter-level precision. But wha...

Robotics - [3D SLAM - 6] KISS ICP Review

KISS-ICP: Simple Odometry, Done Carefully The paper’s core claim is simple: you do not need a complicated frontend, feature extraction, normals, surfels, IMU fusion, or learned components to get s...

Robotics - [3D SLAM - 4] GICP

Generalized ICP, BFGS Optimization

1. Intuition In GICP (Segal et al, 2009), each matched pair is not just two points $p_s$ and $p_t$. Each point also carries a local covariance estimated from its neighbors (for example, 20 nearest...

Robotics - [3D SLAM - 3] Lidar Odometry

Direct Lidar Odometry, NDT, Incremental NDT, Indirect Lidar Odometry, LOAM

Direct Lidar Odometry When given two scans, a direct NDT method means no features are extracted. The two scans would directly go through NDT for finding their relative poses. The workflow is as fo...

Robotics - [3D SLAM - 2] Scan Matching Hands-On Notes

Preact-Mojave, Lidar-Only Front-End

Preact-Mojave Build & Workflow The ROS2 driver for Preact-Mojave can be found here. When testing it, I ran into below questions: Why make provision & make ros2? make provisi...

Robotics - [3D SLAM - 1] Scan Matching

3D Point-Point ICP, 3D Point-Plane ICP, NDT

The Scan Matching Problem When we run scan matching, we usually have two point clouds: a source scan $S_1 = {\mathbf{p}_1, \ldots, \mathbf{p}_n}$ (the new measurement), and a target scan $S_...

Robotics - [Bugs - 2] SLAM Related Small Bugs

Passing Ptr By Value

⚠️ Beware of Passing Smart Pointers by Value Passing a smart pointer (e.g. std::shared_ptr or boost::shared_ptr) by value is fine when you’re only modifying the object it points to. But if you int...

Robotics - [Bugs - 1] SLAM Related "Epic Bugs"

G2O Optimization Vertex Updates, Compiler-Specific Bugs, Yaml-cpp

Below is a list of bugs that took me multiple hours, if not days, to troubleshoot and analyze. These are the “epic bugs” that are worth remembering for my career. Epic Bug 1: G2O Optimization Didn...

ROS2 - Time Synchronizer

Time Synchronizer The ApproximateTimeSynchronizer is useful when multiple ROS topics need to be processed together, but their timestamps do not match exactly. In this example, color images, depth ...