Made by Jaeyoung Jo wodud3743@gmail.com
- Point Cloud Deskewing
- Map structuring and nearest point search based on Voxel Hashing
- Supports various ICP methods (P2P, GICP, VGICP, AVGICP)
- Supports initial position setting via Rviz click (/init_pose)
- Input
- Estimated position nav_msgs/Odometry
- Point cloud sensor_msgs/PointCloud2
- Output
- Estimated position nav_msgs/Odometry (Position, Covariance)
- PCM visualization sensor_msgs/PointCloud2
pcm_matching.cpp
: ROS wrapper. Main function and process executionvoxel_hash_map.cpp
: Voxel Hashing map structuring and nearest point search. Structure definitionregistration.cpp
: Perform ICP with various methods and calculate covariance
- Concurrency control through mutex lock
- Validate input point cloud
- LiDAR message time correction
- Apply configured time delay
- Convert point cloud based on Ouster/General LiDAR type
- Distance-based filtering
- Remove points farther than the configured maximum distance
- Motion correction using IMU data
- Correct point positions during scan start/end time. Move to scan end time
- Calculate synchronized pose at scan end time
- Interpolation using IMU and Odometry data
- If no matching pose, use integration
- Convert original points to PointStruct format
- Perform voxel-based downsampling
- Input:
- Source points (local)
- Voxel map
- Initial pose
- Previous pose (for radar)
- dt (for radar)
- Output:
- Registration result pose
- Success status
- Fitness score
- Check registration success
- Convert ICP pose data to ego coordinate system
- Convert result point cloud to world coordinate system
- Publish the following topics:
- PCM odometry
- ICP result point cloud (downsampled)
- ICP result full point cloud
- Search and associate nearest points in voxel map, then perform ICP
- In the Init function, search for points within gicp_cov_search_dist around each map point
- Calculate covariance of searched points and assign to each point
- During ICP, search and associate nearest points in voxel map, then perform GICP (Covariance not performed on source)
- In the Init function, pre-calculate covariance representing each voxel in the voxel map
- During ICP, find nearest voxel covariance for each point and perform GICP
- In the Init function, pre-calculate covariance representing each voxel in the voxel map
- During ICP, associate each point with all 27 surrounding voxel covariances and perform GICP
- Use the inverse of J^t J of Jacobian J during ICP as state covariance
- Calculate Translation and Rotation separately
- Translation: Uncertainty in x, y, z directions
- Rotation: Uncertainty in roll, pitch, yaw angles
- Normalize remaining elements of the matrix based on the minimum value of the diagonal matrix of covariance
- Final Covariance Calculation
- Translation: Multiply normalized matrix by fitness score
- Rotation: Multiply normalized matrix by pre-configured angle_std