Coder Social home page Coder Social logo

prbonn / kiss-icp Goto Github PK

View Code? Open in Web Editor NEW
1.5K 42.0 301.0 506 KB

A LiDAR odometry pipeline that just works

Home Page: https://www.ipb.uni-bonn.de/wp-content/papercite-data/pdf/vizzo2023ral.pdf

License: MIT License

Python 56.43% Jupyter Notebook 8.33% CMake 5.67% Makefile 0.13% C++ 29.44%
3d-mapping icp lidar-slam slam robotics ros ros2

kiss-icp's Introduction

KISS-ICP



Demo   •   Install   •   ROS 2   •   Paper   •   Contact Us

KISS-ICP is a LiDAR Odometry pipeline that just works on most of the cases without tunning any parameter.

KISS-ICP Demo


Install

pip install kiss-icp

Next, follow the instructions on how to run the system by typing:

kiss_icp_pipeline --help
This should print the following help message:

out

For advanced instructions on the Python package please see this README

ROS support

ROS 2
cd ~/ros2_ws/src/ && git clone https://github.com/PRBonn/kiss-icp && cd ~/ros2_ws/ && colcon build --packages-select kiss_icp

For more detailed instructions on the ROS wrapper, please visit this README

ROS 1

⚠️ ⚠️ ROS 1 is deprecated in KISS-ICP and is not officially supported anymore. Upgrade now to ROS 2! ⚠️ ⚠️

The last release that supports ROS 1 is v0.3.0, if you still need ROS 1 support please check that version.

Citation

If you use this library for any academic work, please cite our original paper.

@article{vizzo2023ral,
  author    = {Vizzo, Ignacio and Guadagnino, Tiziano and Mersch, Benedikt and Wiesmann, Louis and Behley, Jens and Stachniss, Cyrill},
  title     = {{KISS-ICP: In Defense of Point-to-Point ICP -- Simple, Accurate, and Robust Registration If Done the Right Way}},
  journal   = {IEEE Robotics and Automation Letters (RA-L)},
  pages     = {1029--1036},
  doi       = {10.1109/LRA.2023.3236571},
  volume    = {8},
  number    = {2},
  year      = {2023},
  codeurl   = {https://github.com/PRBonn/kiss-icp},
}

Contributing

We envision KISS-ICP as a community-driven project, we love to see how the project is growing thanks to the contributions from the community. We would love to see your face in the list below, just open a Pull Request!

kiss-icp's People

Contributors

02alexander avatar ahans avatar benemer avatar bexcite avatar changh95 avatar dllu avatar fghoussen avatar giafranchini avatar hokim98 avatar horverno avatar jacksonk9 avatar jlblancoc avatar jtbandes avatar kulfer80 avatar kurthobein avatar limhyungtae avatar maik13579 avatar markuspi avatar nachovizzo avatar nehildanis avatar roncapat avatar saurabh1002 avatar shrijitsingh99 avatar stachnis avatar sumanthrao1997 avatar tizianoguadagnino avatar wep21 avatar willcbaker avatar ybrunken avatar zzodo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

kiss-icp's Issues

Downsampling coefficients sizes

Hey, Good work with the paper and thanks for sharing your code.

In the paper, you have mentioned that you use double downsampling using /alpha and /beta as coefficients. Can you tell what is the default value of these coefficients in the released code.

Sorry, I could not find it anywhere.

Registration with other ICP variants from Open3D using KISS-ICP

Hi team!

Congratulations on the release :) its been a long time coming.

I am curious if it was intended or even possible to modify the registration method using Open3D functions (either Python or C++), while keeping all other variables constant.

In my mind, I would like to run and analyze the results for a dataset using point to point, point to plane, and other distance metrics.

Thanks again!

Error after visualization finishes.

Hi all,

I am using Kiss ICP on the Kitti dataset sequence 07.
After the visualization finishes (looks awesome, by the way), I get the following error:
"'cat' is not recognized as an internal or external command, operable program or batch file".

The results section appears to output as expected.
Is this error a cause for concern?

Thank you

Pure cpp example?

Thank you for your great work.
I don't know python so I feel a bit lost.
I would like to know how to load two point clouds and output the transform in pure cpp using kiss-icp.
I took a look at registration.cpp. it seems it only has one parameter: th. If I use registration.cpp, can I reap the benefit of kiss-icp or am I missing a lot stuff?
Would you be so kind to construct of a pure cpp example registering two point clouds using kiss-icp.

Initial guess and configuration

I want to supply an initial guess for each point cloud. Moreover, I would like to be able to modify the configurations of the ICP runs. What exactly should a configuration file look like?

How to evaluate any rosbag files? (To get APE,RPE values)

Hi,
I want to evaluate rosbag files. Now the output poses are obtained in kitti format. I have converted the groundtruth(which is in tum format) into kitti format. But while running evo_ape kitti gt.txt out.txt -va --plot --plot_mode xy --save_results results/ape.zip , got error as : [ERROR] data matrices must have the same shape (since the no of poses are different) and could not able to evaluate. Can you please suggest some method to evaluate any rosbag files?

why the kiss-icp could make the system simple and other reference with also little params to tune [Cannot reopen, so open new one]

I open a new issue since I don't know why I cannot reopen the previous one. Link to previous also

    Thanks for the reply.

As explained in the paper, we do not implement loop-closure

Without this one, I think maybe it may fail a lots of suitation. Did you also do some experiments on the how long will make the odom not so accurate and how to reduce this effect?


Sorry in advance because the following may be considered an offense. Actually not, just my confusion.

I rechecked the paper, and after reading it (but not so detailed sorry), I was still confused about why the kiss-icp could make the system simple. It's pretty much similar core-method to years ago papers like icp and ndt

for the discussion of the parameters. Maybe A-LOAM only has two parameters in their launch file to change:

    <param name="mapping_line_resolution" type="double" value="0.2"/>
    <param name="mapping_plane_resolution" type="double" value="0.4"/>

also autoware.ai 1.13 who open-sourced at 2019 also involved with ndt methods and their parameters could also not so many for 7/8 if you set same resolution all the time.

And there are also many methods (of course you mentioned some in the paper) like with only one LiDAR could also get the odom/pose for point cloud: hdl_graph_slam, BLAM, RAL2022 VoxelMap

Through all these comparisons (all methods I mentioned above could run only on one LiDAR without IMU, camera etc), maybe you could explain more on how your method could be simple without tuning so many params, and also which part makes the result better than others or above methods.

And of course, and still, you did really great thing to make the icp method open for everyone through python pip install. I also learned a lot from your other works.

Originally posted in #12 (comment)

Test in tunnel

Hello, have you ever test your algorithm in a low feature anviroment? Like tunnel with concrete flat walls?

rosbag2: dataloader is not filtering messages by topic

The rosbag2 dataloader iterates through all messages instead of limiting itself to the selected topic.
If a bag with other message types is loaded, an error occurs. In my case, a tf2_msgs/TFMessage was loaded, resulting in this error:

│   162 │   @return: Generator which yields a list of values for each point.                       │
│   163 │   @rtype:  generator                                                                     │
│   164 │   """                                                                                    │
│ > 165 │   fmt = _get_struct_fmt(cloud.is_bigendian, cloud.fields, field_names)                   │
│   166 │   width, height, point_step, row_step, data, isnan = (                                   │
│   167 │   │   cloud.width,                                                                       │
│   168 │   │   cloud.height,   

AttributeError: 'tf2_msgs__msg__TFMessage' object has no attribute 'is_bigendian'

How to run kitti Dataset

    > Great! We will update the requirements once the final release is out there

Hi I am working with exisited ros bag for kitti dataset provided by https://github.com/TixiaoShan/LIO-SAM. I am trying to play with ros2 bag distro(foxy). how to play the recorded bag file. Ros2 version supports your repo?. Can you please share the command line to play the recorded bag.

Originally posted by @jeychandar in #6 (comment)

Understanding results.txt || using Odometry class

Hi there,
i just stumbled upon your package and immediately wanted to implement it using rosbags.
Right now i am trying to add the odometry data by your package to the rosbag it computed the results from.
To do that i need to access the results.txt file to get the odometry poses, but i can't make any sense of the data because there are no headers. Inside the file i've got 12 columns with the first few rows looking like this:

1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00
9.999999711059284202e-01 -2.400804165259540733e-04 1.222847832533963897e-05 8.258102111220366921e-04 2.400793544131477855e-04 9.999999674152875162e-01 8.678322002267612996e-05 -5.400251581990733827e-04 -1.224931287848869576e-05 -8.678028170997378161e-05 9.999999961595685827e-01 9.241217928896763032e-04
9.999999713982442584e-01 -2.328933806818532222e-04 5.444431718310490417e-05 3.126774040866899841e-03 2.328875374537698380e-04 9.999999671243473554e-01 1.073065630439657049e-04 -2.864865709705111813e-03 -5.446930638144911101e-05 -1.072938805718524999e-04 9.999999927605589534e-01 5.713978243111453477e-04
9.999998599926138709e-01 -5.269703872605559572e-04 4.813484465951453590e-05 4.437574595513965083e-03 5.269658025174510461e-04 9.999998566209455930e-01 9.521097921298995439e-05 -3.412845015088020531e-03 -4.818501112457336972e-05 -9.518560046570457471e-05 9.999999943089531440e-01 3.367572128525797744e-04
9.999999767921304850e-01 -1.915944538939269560e-04 9.852564843819771830e-05 2.718310528250500457e-04 1.915844334738978495e-04 9.999999764759462950e-01 1.017030527285415158e-04 -1.342178107914551288e-03 -9.854513186132195018e-05 -1.016841743876916625e-04 9.999999899745927179e-01 1.360622256089990493e-03
9.999999466533188164e-01 3.236382936657829419e-04 4.417707308967581221e-05 4.595372215706258756e-03 -3.236419340691338350e-04 9.999999442312083042e-01 8.242255066951736833e-05 2.075344798108761388e-04 -4.415039553231553447e-05 -8.243684382592414168e-05 9.999999956274544521e-01 2.531409155395558490e-04

Can you help me with either how to assign coordinates to the corresponding data inside the results.txt file, or how to use the python kiss-icp package inside a ros node in order to process sensor_msgs/PointCloud2 data on-the-fly (for example using the package's Odometry Class)?

AttributeError: module 'numpy' has no attribute 'str'

First of all, thank you so much for publishing the source code!

Starting with numpy version 1.20.0, the use of np.str has been deprecated and its support has been completely removed in numpy version 1.24.0, leading to an AttributeError: module 'numpy' has no attribute 'str' when trying to use KISS-ICP for example with PCD files.

The user manual suggests to instead use the plain Python str:

To give a clear guideline for the vast majority of cases, for the types bool, object, str (and unicode) using the plain version is shorter and clear, and generally a good replacement.

Visualisation range, or internal map range?

open3d viewport needs to be larger, or the internal map size. the pointcloud displayed during visualization will populate to a certain range (not the lidar range) which causes mapping failure. As the odometry / local frame reaches the edge of this region the map will collapse. - there be dragons.

Ros2 bag support ?

Hello,
Paper looks great! Is there a way to test this with ros2 bags ?

Could not find a version that satisfies the requirement kiss-icp

When trying to install this in an Ubuntu bionic docker container with the command

pip install --user kiss-icp

I get the following output:

Collecting kiss-icp
  Could not find a version that satisfies the requirement kiss-icp (from versions: )
No matching distribution found for kiss-icp

This is with pip version pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7).

I was able to install it on another machine that had a newer version of pip.

Is there a minimum version specified somewhere?

Robesense Lidars

First of all, fantastic work! Really appreciate the defense of ICP algorithm 😄

Had you have the chance to do some tests with a Robosense Lidar? I'd be very interested in the performance with those type of Lidars.

Bad result on Maicity Dataset

Thanks for your excellent job!

But I cannot get a correct result on Maicity Dataset, here is the result:
image

The x-axis of the first 10 frames stays invariant, which is incorrect. But the follow-up result is correct.
This Dataset runs well with puma, so I guess it's not the problem of the dataset.

What should I do to get a correct result?

(Question, not issue) When will the full source code be released?

Hi there,

I really like what you guys have done. I would like to take a look at the source code, and saw the comment on the main page that the code will be released once the review process of the paper is complete.

Is there an estimation of when this will be completed? Thank you!

Mac M1: python3.9 and python3.10 packages missing

Tried to install on Mac M1 arm and because it doesn't have pre-compiled wheels, the attempt to compile locally also failed.

Collecting scipy
  Using cached scipy-1.9.2.tar.gz (42.1 MB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... error
  error: subprocess-exited-with-error

  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─> [66 lines of output]
      The Meson build system
      Version: 0.63.3
      Source dir: /private/var/folders/k2/06nf1_6s039601g5ply3b63h00054w/T/pip-install-ovshm20c/scipy_fb0ee8bf9ea2434bb6b7426918caf471
      Build dir: /private/var/folders/k2/06nf1_6s039601g5ply3b63h00054w/T/pip-install-ovshm20c/scipy_fb0ee8bf9ea2434bb6b7426918caf471/.mesonpy-o2z7u9kx/build
      Build type: native build
      Project name: SciPy
      Project version: 1.9.2
      C compiler for the host machine: cc (clang 12.0.5 "Apple clang version 12.0.5 (clang-1205.0.22.9)")
      C linker for the host machine: cc ld64 650.9
      C++ compiler for the host machine: c++ (clang 12.0.5 "Apple clang version 12.0.5 (clang-1205.0.22.9)")
      C++ linker for the host machine: c++ ld64 650.9
      Host machine cpu family: aarch64
      Host machine cpu: arm64
      Compiler for C supports arguments -Wno-unused-but-set-variable: NO
      Compiler for C supports arguments -Wno-unused-but-set-variable: NO (cached)
      Compiler for C supports arguments -Wno-unused-function: YES
      Compiler for C supports arguments -Wno-conversion: YES
      Compiler for C supports arguments -Wno-misleading-indentation: YES
      Compiler for C supports arguments -Wno-incompatible-pointer-types: YES
      Library m found: YES
      Fortran compiler for the host machine: gfortran (gcc 12.1.0 "GNU Fortran (Homebrew GCC 12.1.0) 12.1.0")
      Fortran linker for the host machine: gfortran ld64 650.9
      Compiler for Fortran supports arguments -Wno-conversion: YES
      Program cython found: YES (/private/var/folders/k2/06nf1_6s039601g5ply3b63h00054w/T/pip-build-env-k6wcpwx6/overlay/bin/cython)
      Program pythran found: YES (/private/var/folders/k2/06nf1_6s039601g5ply3b63h00054w/T/pip-build-env-k6wcpwx6/overlay/bin/pythran)
      Program cp found: YES (/bin/cp)
      Program python found: YES (some.venv-kiss-39/bin/python3.9)
      Found pkg-config: /opt/homebrew/bin/pkg-config (0.29.2)
      Library npymath found: YES
      Library npyrandom found: YES
      Found CMake: /opt/homebrew/bin/cmake (3.24.0)
      Run-time dependency openblas found: NO (tried pkgconfig, framework and cmake)
      Run-time dependency openblas found: NO (tried pkgconfig, framework and cmake)

      ../../scipy/meson.build:129:0: ERROR: Dependency "OpenBLAS" not found, tried pkgconfig, framework and cmake

Or it's probably because scipy doesn't support Mac M1 yet? idk. But just leave it here for visibility since you did a great job of Mac x64 support as I can see from wheels available on PyPi and maybe this is interesting to other people as well.

Installation unsuccessful

@stachnis Hi I am new to this field. I studied your work it was amazing. Interested to know how this works. As per your readme file I have installed everything but still shows kiss_icp_pipeline:Command not found. Am I missing any dependencies?.Can you clarify me. Thanks in advance

Rosbag convertion issue

Thanks for this great job.

I am trying your algorithm on kitti dataset for benchmarking and understand well how it works. I generally work on ros1 and kitti2bag tool is not converting point cloud good.

After using that converted point cloud on kiss-icp it gives huge error when I evaluate.
image

is there any way to correct that conversion?

online SLAM

Hello,

is there a way to use the library for online data processing? (see pseudocode below)


while True:
    pts_3d = acquire_data_from_depth_sensor()
    pose = kiss_icp(pts_3d)

Is kiss-ICP work with 2D LIDARs ?

Hi,
First, thank you for this amazing work, its really interesting and im looking forward to work with it !
My question is quite straight forward : is it possible to have the same result if we want to work with 2D LIDARs ? or this approach is exclusively used for 3D LIDARs ?

Best regards

What assumption(s) does your deskewing option have?

Hi,

First thanks a lot for not only releasing not only a great tool, but also an awesome CLI! 👍

I have trouble when working with the ego motion compensation/deskewing option which probably has assumptions on the input data. Currently, my results look like this when using a motion compensated point cloud:
Results using deskewed point cloud
However, when using the "raw" point cloud with the "--deskew" option, they look like this:
Results using original point cloud

When looking at the pole, I expect that there is some error in deskewing the data as the overall motion is just fine. Hence my question: What are your assumptions on the point cloud? Or what is your source for the points' timing information?

The assumption in deskew.py, self.mid_pose_timestamp = 0.5 is fulfilled with my data already, as is the frequency / scan duration.

Thanks a lot in advance! Really looking forward for the C++ release.

catkin build : undefined reference to pthread

Hi there,
I face the following error during catkin build. Has anyone come across the same?

kiss_icp/src/cpp/kiss_icp/tbb/lib/libtbb.a(governor.cpp.o): undefined reference to symbol 'pthread_key_delete@@GLIBC_2.2.5'
/lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line

Thank you in advance,
Martin

Robust kernel formula (code vs paper)

Hi! At first, thank you for your great work!

I am really interested in this topic since I was working a long time with lidar odometry algorithms and I think I share your excitement regarding simplicity and independence of different sensors and platforms.

I was just reading the paper and digging through the implementation. Doing this, one question came up regarding the following line:

auto Weight = [&](double residual2) { return square(th) / square(th + residual2); };

Can you explain how this coincides with formula 13 from the paper (the robust kernel):

$$ p(e) = \frac{e^2/2}{\kappa_t + e^2} ~~, \text{with} ~~ \kappa_t = \sigma_t/3 $$

I already found that th equals sigma/3, so this would be $\kappa_t$ in the paper and residual2 would be $e$. But I don't see that this equals this formula. What I see is:

$$ p(e) = \frac{\kappa^2}{(\kappa + e)^2} $$

Add Covariance

I have the ros node running and it has been very easy to get up and running when compared to other options. However, before I can integrate this into a larger system, I need covariances for the estimated odometry. Have you thought about how to compute uncertainties for the results of KISS-ICP?

Great work!! I'm excited to try this out on more datasets!

Full release date?

Hi team,

I hope the holidays and the upcoming new year find you all well!
From previous posts, I understand that the full release of KISS-ICP will occur once the paper is accepted, but I haven't seen any recent news.
Are there any updates or an expected timeline for acceptance?

Thank you and wishing the best,
Everett

Python3.10 and numpy

kiss_icp_pipeline --visualize folderofpcdscans
returns "module numpy has no attribute 'str'"

was a folder of .pcd files ever tested?

Error when using Kitti data_odometry_gray dataset

Hi!

I am attempting to run KISS ICP on the Kitti gray odometry dataset.

I am using this argument
kiss_icp_pipeline --dataloader kitti --sequence 07 --visualize "path\to\dataset"
which results in this error:
┌─────────────────────────────── Traceback (most recent call last) ────────────────────────────────┐ │ C:\ProgramData\Anaconda3\lib\site-packages\kiss_icp\tools\cmd.py:144 in kiss_icp_pipeline │ │ │ │ 141 │ from kiss_icp.datasets import dataset_factory │ │ 142 │ from kiss_icp.pipeline import OdometryPipeline │ │ 143 │ │ │ > 144 │ OdometryPipeline( │ │ 145 │ │ dataset=dataset_factory( │ │ 146 │ │ │ dataloader=dataloader, │ │ 147 │ │ │ data_dir=data, │ │ │ │ ┌─────────────────────────────────────────── locals ───────────────────────────────────────────┐ │ │ │ config = WindowsPath('C:/ProgramData/Anaconda3/lib/site-packages/kiss_icp/config/… │ │ │ │ data = WindowsPath('C:/Users/Everett/KITTI/dataset') │ │ │ │ dataloader = 'kitti' │ │ │ │ dataset_factory = <function dataset_factory at 0x000001FC120119D0> │ │ │ │ deskew = False │ │ │ │ jump = 0 │ │ │ │ max_range = None │ │ │ │ n_scans = -1 │ │ │ │ no_cache = None │ │ │ │ OdometryPipeline = <class 'kiss_icp.pipeline.OdometryPipeline'> │ │ │ │ sequence = 7 │ │ │ │ topic = None │ │ │ │ visualize = True │ │ │ └──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ C:\ProgramData\Anaconda3\lib\site-packages\kiss_icp\pipeline.py:50 in run │ │ │ │ 47 │ # Public interface ------ │ │ 48 │ def run(self): │ │ 49 │ │ self._run_pipeline() │ │ > 50 │ │ self._write_result_poses() │ │ 51 │ │ self._write_cfg() │ │ 52 │ │ return self._run_evaluation() │ │ 53 │ │ │ │ ┌───────────────────────────────── locals ─────────────────────────────────┐ │ │ │ self = <kiss_icp.pipeline.OdometryPipeline object at 0x000001FC13ECC1F0> │ │ │ └──────────────────────────────────────────────────────────────────────────┘ │ │ │ │ C:\ProgramData\Anaconda3\lib\site-packages\kiss_icp\pipeline.py:91 in _write_result_poses │ │ │ │ 88 │ │ return self._get_results_dir(self.config.out_dir) │ │ 89 │ │ │ 90 │ def _write_result_poses(self): │ │ > 91 │ │ self._write_poses(self.poses, f"{self.results_dir}/{self._dataset.sequence_id}.t │ │ 92 │ │ │ 93 │ def _get_fps(self): │ │ 94 │ │ total_time_ns = reduce(lambda a, b: a + b, self.times) │ │ │ │ ┌───────────────────────────────── locals ─────────────────────────────────┐ │ │ │ self = <kiss_icp.pipeline.OdometryPipeline object at 0x000001FC13ECC1F0> │ │ │ └──────────────────────────────────────────────────────────────────────────┘ │ │ │ │ C:\ProgramData\Anaconda3\lib\site-packages\kiss_icp\pipeline.py:80 in _write_poses │ │ │ │ 77 │ │ np.savetxt( │ │ 78 │ │ │ fname=filename, │ │ 79 │ │ │ X=_to_kitti_format( │ │ > 80 │ │ │ │ self._dataset.apply_calibration(poses) │ │ 81 │ │ │ │ if hasattr(self._dataset, "apply_calibration") │ │ 82 │ │ │ │ else poses │ │ 83 │ │ │ ), │ │ │ │ ┌─────────────────────────────────────────── locals ───────────────────────────────────────────┐ │ │ │ _to_kitti_format = <function OdometryPipeline._write_poses.<locals>._to_kitti_format at │ │ │ │ 0x000001FC1509C820> │ │ │ │ filename = 'C:\\Windows\\System32\\results\\2022-10-09_14-58-21/07.txt' │ │ │ │ poses = [] │ │ │ │ self = <kiss_icp.pipeline.OdometryPipeline object at 0x000001FC13ECC1F0> │ │ │ └──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ C:\ProgramData\Anaconda3\lib\site-packages\kiss_icp\datasets\kitti.py:60 in apply_calibration │ │ │ │ 57 │ │ """Converts from Velodyne to Camera Frame""" │ │ 58 │ │ Tr = np.eye(4, dtype=np.float64) │ │ 59 │ │ Tr[:3, :4] = self.calibration["Tr"].reshape(3, 4) │ │ > 60 │ │ return Tr @ poses @ np.linalg.inv(Tr) │ │ 61 │ │ │ 62 │ @memoize() │ │ 63 │ def read_point_cloud(self, scan_file: str, config: KISSConfig.data): │ │ │ │ ┌────────────────────────────────────── locals ───────────────────────────────────────┐ │ │ │ poses = [] │ │ │ │ self = <kiss_icp.datasets.kitti.KITTIOdometryDataset object at 0x000001FC127577F0> │ │ │ │ Tr = array([[-0.00185774, -0.99996597, -0.00803998, -0.00478403], │ │ │ │ │ [-0.00648147, 0.00805186, -0.99994659, -0.07337429], │ │ │ │ │ [ 0.99997729, -0.00180553, -0.0064962 , -0.3339968 ], │ │ │ │ │ [ 0. , 0. , 0. , 1. ]]) │ │ │ └─────────────────────────────────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────────────────────────────────────┘ ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 0 is different from 4)

Is there any suggestions on how to resolve this issue?

MulRan Dataset loader

Hello,
First thanks for the great work.

I have a general question about the pre-defined loaders, you have for some benchmark samples like kitti, Mulran and etc.
I would like to done some test on Mulran sample which consists of a few sequences as ["kaist/KAIST01", "kaist/KAIST02", "kaist/KAIST03", "dcc/DCC01", "dcc/DCC02", "dcc/DCC03", "riverside/Riverside01", "riverside/Riverside02", "riverside/Riverside03", "sejong/Sejong01", "sejong/Sejong02", "sejong/Sejong03"]
But I couldn't find a link for downloading those samples on the Mulran webpage. Is it possible if I can know how can I get access these samples? (I can see the explanation on the website but no link to download)

Thanks and looking forward to your response.

Difference between paper with implementation?

Hi,

First of all, I would like to thanks to great studies. When I examine the code I observed that difference between mentioned paper deskewing formula and implemented deskewing method.

Formula has exp process but I could not see exp process on the code.
Paper:
image

Code:

tbb::parallel_for(size_t(0), frame.size(), [&](size_t i) {
const auto& dt = timestamps[i];
const auto motion = MakeTransform(dt * linear_velocity, dt * angular_velocity);
corrected_frame[i] = motion * frame[i];
});
return corrected_frame;

Am i missing something?

Long pauses and constant velocity rotation cases

I've been playing with kiss-icp package and testing it with some real-world data that people may have. And it performed well in most cases which is just amazing to see and kudos to the team to make such a great ICP. Two cases that I observe are not doing well during my tests.

NOTE1: I fully understand that paper is done, so if it's smth out of scope and not needed to be adressed it's ok.

NOTE2: I've made a custom data loader to read data from pcap for a specific sensor, and there maybe some errors there. However I see the great performance on majority of other cases, including the correct deskew results of a point clouds, so it gives me the clue that custom Dataloader maybe fine after all.

Case 1: Long pauses before the first non-zero movement.

Consider a vehicle with a sensor mounted on top (360 spinner, 64 beams) , and driver is preparing for a ride without any movement for a first 2 minutes, than a small movement like 10m forward, and then no movement for like another 3 minutes, and when the car finally started the movement it just completely lost for a while, until some time. (I may guess it's smth with an accumulated tau distance distributions, but maybe smth else...)
After another 1-3 minutes of movement odometry kicks off more or less and then everything is fine.

Before movement:
20221018_150618_case1_before_move

Move about 10meters after a long pause:
20221018_150731_case1_move_10m

Long paus
20221018_151038_case1_after_long_pause
e continues:

Movement after the long pause and recovery in 2-3 minutes:
20221018_151340_case1_recovery

Case 2: Constant velocity rotation (in a room or construction site)

It's not a single case and was also observed on other non-room cases.

Simple room with almost plain walls but multiple corners and indentation in a wall visible (180 degree, spinner, 20hz, 32 beams) and a sensor rotating very smoothly around Z axis (like on a turntable) (with some pauses without rotation for 10-30 seconds, so it's case1 here as well probably). Result is a jerky trajectory that if drawn smeared a lot of that room.

Before the move:
20221018_152755_case2_before

After some movements:
20221018_152830_case2_after

Tried things:

I tried to tune some params, but no luck, seems that min_motion_th should have had some impact, but don't see any improvements.

Will be happy to test the fully released version and contribute the data loader for running kiss-icp on real world pcap data easily for one of the sensors.

Cheers!

Some questions on: Which seq is the preview demo video used? whether close-loop and how to initial when rotating without IMU, data structure

Hi, Thanks for your work!

I have following question after view this repo and the paper.

  1. which seq is the preview demo video used? https://user-images.githubusercontent.com/38326482/189950820-030fd9e4-406b-4d14-8171-43b134344223.mp4
  2. whether close-loop use in kisss-icp? since the drift happen on ICP and NDT normally happen with really large map, it perform great with small size
  3. How to initial motion when agent rotate really quick without IMU but only odometry velocity? since I met the problem when I refactor the autoware ndt_mapping and running in the kitti dataset in real-time 10Hz in i7-9700H, but when it met the big rotate it will have error calculation(but when slow down the bag play it perform well.
  4. Whether the hash table better than octrees in kiss-icp? is there any ablation study to see which data structure is better under this paper? mentioned in the paper: the used data structure can be easily replaced with VDBs [16], [30], Octrees [28], [32], or KD-Trees [2].
  5. Is there any comparsion on how sparse the LiDAR that the system cannot provide accurate odom? like 16, 32, 64, 128 LiDAR

Output result format

Please give a hint as to the fields in the ..txt output file contained in the results folder when processing .xyz dataset.
Thank you.

Ouput folder is empty

Hi,

First of all, think you very much for providing the library, it looks very promising.
I am trying to run a scenario where a folder contains several point-cloud files, in a PLY format. These files contain de-skewed Velodyne data.
So far, running the pipeline results in a rapidly progressing progress bar and no results other than a clone of the config file...
Is there some way to understand/log any issues which might cause such behavior?

Thank you in advance,
Gabi

invalid value arccos...

220/2547 [01:05<00:55, 41.89 frames/s] ... kiss_icp/odometry.py:115: RuntimeWarning: invalid value encountered in arccos
theta = np.arccos(0.5 * (np.trace(Delta_t[:3, :3]) - 1))
16%|███████████▏ | 401/2547 [01:13<00:23, 92.18 frames/s]

Lidar moving forwards then turned around / 180 degrees.

Invalid value encountered in arccos

When running with a rosbag and a pointcloud from an Ouster OS1 lidar, the visualizer appears and I see some points briefly rendered once I start playing the data. However, shortly after it begins, I get the message

/home/user/.local/lib/python3.8/site-packages/kiss_icp/odometry.py:80: RuntimeWarning: invalid value encountered in arccos
  theta = np.arccos(0.5 * (np.trace(Delta_t[:3, :3]) - 1))

and then no more points appear in the visualizer. Is there a specific requirement for pointcloud data that I might not be meeting?

Generating GT Poses from .PLY collection?

Hi all,
I saw a flurry of posts regarding custom datasets in KISS.

It got me thinking about a folder of .PLY files I have that can be visualized in KISS ICP, but no metrics are created because there are no GT poses available.

Is there a way to generate the poses without IMU data? Or some other way to get around this issue?

Thanks all.

ROS2 Datasets Wanted

I have a preliminary version of KISS-ICP working in a ROS2 environment, but I'm having trouble to find some mobile robots public datasets out there to try out the system.

So far, I could only try the bagfile (rather small) from #6. But I would like to test it on more outdoor scenarios. If you have some data you would like to try, please send it to us! Link, GDrive, etc.
image

image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.