Closed JzHuai0108 closed 1 year ago
Hello, thanks for the detailed information. It's always best to share the data to try it ourselves.
This is the typical problem: we are downsampling the input cloud too much.
You can try much more easily the python interface (pip install kiss-icp
) and then apply this fix: https://github.com/PRBonn/kiss-icp/issues/128#issuecomment-1505258331
For ROS (you don't specify, but I'm assuming you are running ROS 1), you can hack a bit the pipeline and recompile by doing:
diff --git a/cpp/kiss_icp/pipeline/KissICP.cpp b/cpp/kiss_icp/pipeline/KissICP.cpp
index 3e06f7f..ba6094b 100644
--- a/cpp/kiss_icp/pipeline/KissICP.cpp
+++ b/cpp/kiss_icp/pipeline/KissICP.cpp
@@ -83,8 +83,7 @@ KissICP::Vector3dVectorTuple KissICP::RegisterFrame(const std::vector<Eigen::Vec
KissICP::Vector3dVectorTuple KissICP::Voxelize(const std::vector<Eigen::Vector3d> &frame) const {
const auto voxel_size = config_.voxel_size;
const auto frame_downsample = kiss_icp::VoxelDownsample(frame, voxel_size * 0.5);
- const auto source = kiss_icp::VoxelDownsample(frame_downsample, voxel_size * 1.5);
- return {source, frame_downsample};
+ return {frame_downsample, frame_downsample};
}
double KissICP::GetAdaptiveThreshold() {
When inspecting your data, I realized a weird pattern, see the attached image. It looks like there are two overlapping lidar scans, also because the scans have points below the ground surface. Do you have an idea why? Maybe the rain caused reflections on the ground. In that case, these could be additional returns due to reflections.
The device was held by a walking person. You may see the zed images in the rosbag. There was moderate to light raining during the data collection. The images show many rain splashes on the ground. The flat basketball court covered by plastic rubber was pretty wet. This may explain some points underground.
The place captured by the sensor rig in a dry night.
The place captured by the sensor rig in a rainy morning.
Alright, I think this explains the reflections! And also the shakiness of the data since it is a walking person.
I am currently downloading the larger dataset. Will get back to you soon :)
There are multiple reasons KISS is having a hard time in this dataset.
First, the LiDAR is rather sparse with 32 beams and a limited field of view (half of the scan is missing due to occlusion).
Second, the motion profile is quite shaky since it is a handheld.
Third, the rain imposes an issue because the beams get reflected at the raindrops which look like random points in the scan plus the reflections on the ground that depend on the viewing angle.
One thing I noticed with 32-beam sensors (for example, the one used in Nuscenes) is that limiting the maximum range improves performance. So with this config:
data:
deskew: True
max_range: 50.0 # can be also changed in the CLI
min_range: 2.0
I managed to run KISS successfully for the first 3,000 frames, so that might be a direction to follow!
Thank you for your time and patience. Your points are convincing. One point I'd like to add is that the 120 m range lidar's beam is more likely to come across rain drops in the round trip as the distance increases. This may also support the decision to use a shorter range than the spec value. Do you have a paypal or buy me a coffee or alipay code? I'd like to buy you a beer.
That's true! However, the points we mask out using max_range
are those that did not get reflected. If there is a reflection within max_range
, there is not much we can do and we keep the point.
I believe the sparsity issue becomes more severe for far-away points which makes it harder to align the scan to the sparse local map, especially when facing changing pitch angles as in your dataset.
Here is the result of the full run using the config from above.
Do you have a paypal or buy me a coffee or alipay code? I'd like to buy you a beer.
All good, but thanks a lot! Maybe there will be an occasion to have a drink when meeting at a conference in the future :)
Best Benedikt
Thanks a lot for your time. We will run the KISS-ICP throughout our datasets. I will close the issue for now.
Maybe there will be an occasion to have a drink when meeting at a conference in the future :)
Definitely.
Sorry to bother you again, but I could not reproduce the result for run3 in your last response. My result looks like below It is very close to your initial result in your first response.
I used the kiss icp master branch, with your recommended parameters, esp., maxrange = 50m. The result for the small loop run2 is good, but for the large loop run3, the result is bad as above. Then, additionally, I also disabled the downsampling (for ICP?) by
return {frame_downsample, frame_downsample};
And I slightly reduced the voxel size, but the result is still poor. Can you please tell me more info about your setup?
My setup: Ubuntu 20.04, ROS1 noetic, kiss-icp master branch, run with the python script, cmd.py, with a specific config yaml containing max_range: 50 m.
Hey,
Are you talking about the data you shared with me? Or is this another run?
As mentioned above, I kept the original downsampling scheme and used the config mentioned above. Please check again.
Best Benedikt
Thank you for the quick reply. This is the same data I shared with you. OK. I will try the program with your setting on another computer.
Dear authors,
Thanks for the great work. We tried the kiss-icp with Hesai XT32 rosbags captured by a handheld device. It worked pretty well for a small loop in a basketball court with the perimeter around 40 meters. You can see the basketball post clearly.
Then we tried it with a >100 GB rosbag. At the beginning (from the same basketball court), it also worked seemingly good. But over time, the trajectory became more erratic. We used the below command
The key parameters
How can we make it work better with the large bag file?