GithubHelp home page GithubHelp logo

url-kaist / patchwork-plusplus Goto Github PK

View Code? Open in Web Editor NEW
527.0 11.0 84.0 35.4 MB

Patchwork++: Fast and robust ground segmentation method for 3D LiDAR scans. @ IROS'22

License: GNU General Public License v3.0

CMake 9.74% C++ 88.59% Shell 1.68%
3d-lidar ground-segmentation point-cloud lidar segmentation ground ground-removal detection ground-detection

patchwork-plusplus's Introduction

Patchwork++

๐Ÿ“‘ About Patchwork++ (IROS'22)

  • A fast, robust, and self-adaptive ground segmentation algorithm on 3D point cloud.

animated

๐Ÿ“‚ What's in this repo

  • C++ source code of Patchwork++ (patchworkpp)
  • Python binding of Patchwork++ using pybind11 (python_wrapper)
  • Examples codes, which visualizes a ground segmentation result by Patchwork++ (examples) ๐Ÿ‘

If you are familiar with ROS, you can also visit here and try executing ROS-based Patchwork++!

๐Ÿ“ฆ Prerequisite packages

You may need to install Eigen, numpy, and Open3D. Open3D is used for point cloud visualization.

# Install prerequisite packages including Open3D
$ git clone https://github.com/url-kaist/patchwork-plusplus
$ cd patchwork-plusplus
$ bash scripts/install_open3d.bash
Manual Installation line-by-line
# To install Eigen and numpy
$ sudo apt-get install libeigen3-dev
$ pip install numpy

# To install Open3D Python packages
$ pip install open3d

# To install Open3D C++ packages
$ git clone https://github.com/isl-org/Open3D
$ cd Open3D
$ util/install_deps_ubuntu.sh # Only needed for Ubuntu
$ mkdir build && cd build
$ cmake ..
$ make # If it fails, try several times or try 'sudo make'
$ sudo make install

โš™๏ธ How to build

Please follow below codes to build Patchwork++.

Python

# in patchwork-plusplus directory
$ pip install . 

C++

# in patchwork-plusplus directory
$ mkdir build && cd build
$ cmake ..
$ make

๐Ÿƒ To run the demo codes

There are some example codes for your convenience! Please try using Patchwork++ to segment ground points in a 3D point cloud ๐Ÿ˜ƒ

Python

# Run patchwork++ and visualize ground points(green) and nonground points(red)
$ python examples/python/demo_visualize.py

# Run patchwork++ with sequential point cloud inputs 
$ python examples/python/demo_sequential.py

C++

# Run patchwork++ and visualize ground points(green) and nonground points(red)
$ ./build/examples/cpp/demo_visualize

# Run patchwork++ with sequential point cloud inputs 
$ ./build/examples/cpp/demo_sequential

# Run patchwork++ with your point cloud file, example here
$ ./build/examples/cpp/demo_visualize ./data/000000.bin # specify file path

Demo Result

If you execute Patchwork++ with given demo codes well, you can get the following result!

It is a ground segmentation result of data/000000.bin file using Open3D visualization. (Ground : Green, Nonground : Red)

Open3D Visualization of "data/000000.bin"

๐Ÿ“ Citation

If you use our codes, please cite our paper (arXiv, IEEE Xplore)

@inproceedings{lee2022patchworkpp,
    title={{Patchwork++: Fast and robust ground segmentation solving partial under-segmentation using 3D point cloud}},
    author={Lee, Seungjae and Lim, Hyungtae and Myung, Hyun},
    booktitle={Proc. IEEE/RSJ Int. Conf. Intell. Robots Syst.},
    year={2022},
    pages={13276-13283}
}

In addition, you can also check the paper of our baseline, Patchwork. (arXiv, IEEE Xplore)

@article{lim2021patchwork,
    title={Patchwork: Concentric Zone-based Region-wise Ground Segmentation with Ground Likelihood Estimation Using a 3D LiDAR Sensor},
    author={Lim, Hyungtae and Minho, Oh and Myung, Hyun},
    journal={IEEE Robotics and Automation Letters},
    year={2021}
}

๐Ÿšฉ Tested Environment

  • Ubuntu 18.04 and 20.04
  • CMake 3.25.1 (>=3.20, min. Required to install Open3D)
  • Open3D 0.15.2
  • pybind11 v2.2.3
  • Eigen 3.3.7

๐Ÿ“ซ Contact Information

If you have any questions, please do not hesitate to contact us

patchwork-plusplus's People

Contributors

barzanisar avatar divinerapier avatar ivdmne avatar kin-zhang avatar seungjae24 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

patchwork-plusplus's Issues

Noise removal vs concentric zone model conversion question

Hello @seungjae24

After diving in your patchwork implementation, I found some inconsistencies that make me wonder whether in some scenario swe can get duplicated point in the output point cloud.

I see at first the reflected_noise_removal is adding noisy points to cloud_non_ground_
Then in a second time the pc2czm is pushing points outside of zones to cloud_non_ground_.

How you can be sure that noisy points will not be duplicated with zone model conversion ? ๐Ÿค”

Thanks again for you great work.

Cheers ! ๐Ÿ˜„

Whether I can skip the installation of Open3D of C++ version, if I only want to use the Python binding of Patchwork++ using pybind11?

While I just run the pip install . in patchwork-plusplus directory with running pip install open3d ahead, some errors interrupts as follows:

Processing /mnt/storage/wjh/Third_Parties/patchwork-plusplus
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Installing backend dependencies ... done
  Preparing metadata (pyproject.toml) ... done
Requirement already satisfied: numpy>=1.23 in /home/wjh/anaconda3/envs/h2mapping/lib/python3.8/site-packages (from pypatchworkpp==0.0.1) (1.24.4)
Building wheels for collected packages: pypatchworkpp
  Building wheel for pypatchworkpp (pyproject.toml) ... error
  error: subprocess-exited-with-error
  
  ร— Building wheel for pypatchworkpp (pyproject.toml) did not run successfully.
  โ”‚ exit code: 1
  โ•ฐโ”€> [45 lines of output]
      *** scikit-build-core 0.7.0 using CMake 3.27.9 (wheel)
      *** Configuring CMake...
      loading initial cache file /tmp/tmpd3hlu9k0/build/CMakeInit.txt
      -- The C compiler identification is GNU 7.5.0
      -- The CXX compiler identification is GNU 7.5.0
      -- Detecting C compiler ABI info
      -- Detecting C compiler ABI info - failed
      -- Check for working C compiler: /usr/bin/cc
      -- Check for working C compiler: /usr/bin/cc - broken
      CMake Error at /tmp/pip-build-env-vobq7vv2/normal/lib/python3.8/site-packages/cmake/data/share/cmake-3.27/Modules/CMakeTestCCompiler.cmake:67 (message):
        The C compiler
      
          "/usr/bin/cc"
      
        is not able to compile a simple test program.
      
        It fails with the following output:
      
          Change Dir: '/tmp/tmpd3hlu9k0/build/CMakeFiles/CMakeScratch/TryCompile-9QWsce'
      
          Run Build Command(s): /tmp/pip-build-env-vobq7vv2/normal/lib/python3.8/site-packages/ninja/data/bin/ninja -v cmTC_478da
          [1/2] /usr/bin/cc    -o CMakeFiles/cmTC_478da.dir/testCCompiler.c.o -c /tmp/tmpd3hlu9k0/build/CMakeFiles/CMakeScratch/TryCompile-9QWsce/testCCompiler.c
          ERROR: ld.so: object '/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS64): ignored.
          ERROR: ld.so: object '/lib64/libstdc++.so' from /etc/ld.so.preload cannot be preloaded (wrong ELF class: ELFCLASS64): ignored.
          [2/2] : && /usr/bin/cc   CMakeFiles/cmTC_478da.dir/testCCompiler.c.o -o cmTC_478da   && :
          FAILED: cmTC_478da
          : && /usr/bin/cc   CMakeFiles/cmTC_478da.dir/testCCompiler.c.o -o cmTC_478da   && :
          ERROR: ld.so: object '/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS64): ignored.
          ERROR: ld.so: object '/lib64/libstdc++.so' from /etc/ld.so.preload cannot be preloaded (wrong ELF class: ELFCLASS64): ignored.
          /usr/lib/gcc/x86_64-linux-gnu/7/../../../../x86_64-linux-gnu/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so: error loading plugin: /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so: wrong ELF class: ELFCLASS64
          collect2: error: ld returned 1 exit status
          ninja: build stopped: subcommand failed.
      
      
      
      
      
        CMake will not be able to correctly generate this project.
      Call Stack (most recent call first):
        CMakeLists.txt:2 (project)
      
      
      -- Configuring incomplete, errors occurred!
      
      *** CMake configuration failed
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for pypatchworkpp
Failed to build pypatchworkpp
ERROR: Could not build wheels for pypatchworkpp, which is required to install pyproject.toml-based projects

Python example, How to get indices of ground points?

Hey @seungjae24 and @LimHyungTae,

In your python example,

ground      = PatchworkPLUSPLUS.getGround()
nonground   = PatchworkPLUSPLUS.getNonground()

These lines return ground and nonground points. How can we get their indices in the original input point cloud? I need the indices so that I can get their corresponding intensities.

Thanks in advance for your help!

I cannot run python example code (demo_sequential.py and demo_visualize). I get cannot find pypatchworkpp!

  • The pypatchworkpp.cpython-38-x86_64-linux-gnu.so is built in /build/python_wrapper. However when I run python examples/python/demo_sequential.py, I get this message Cannot find pypatchworkpp!
  • The CPP examples work fine.
  • When I was searching for similar error I found someone who solved similar problem with pybind11, and he wrote "I fixed this by making sure the module name in my bindings macro, matches the module name in the CMakeLists.txt file."
  • https://stackoverflow.com/questions/50688184/how-do-i-import-a-module-created-with-pybind11-on-ubuntu

ground segmentation issue with nonground points below ground plane

Thanks for sharing your great work. It shows a wonderful performance in general utilization. However, I have been struggling with the high false positive and false negative rate when applying the algorithm in the scene where there are drainage ditches along the side of the road as the picture shown below. Since the algorithm selects the lowest height points as initials seeds, it easily takes the bottom of the drainage ditches as ground and the road next to the ditches as nonground. I tried to use smaller bins to help with this problem, but the running time goes up too much to meet the real time requirement when using bins with smaller size. I was wondering if you could provide any suggestions to cover this scenario. Any thoughts would be appreciated.
drainage-ditch

Have you tried Patchwork++ on nuScenes?

I run your program on one scene in nuScenes, but the performance is not so good as SemanticKITTI. Is it because nuScenes uses a 32-beam LiDAR and the point cloud is sparser? Do you have any suggestions to improve it?
Screenshot from 2022-08-24 10-09-19

Output Indices

Hello! Thanks for open-sourcing this amazing algorithm.

I was wondering can the algorithm output the indices of ground (or nonground) with respect to the original input point cloud. This is because the algorithm can only output XYZ point cloud, but when we have attributes more than XYZ, the output indices could be used for indexing the original input point cloud to get the desired output point cloud.

Thanks for your help in advance.

Segmentation fault (core dumped) when run examples/demo_sequential.py

PatchWorkpp::estimateGround() - Estimation starts !
PatchWorkpp::reflected_noise_removal() - Number of Noises : 1
PatchWorkpp::flush_patches() - Flushed patches successfully!
PatchWorkpp::pc2czm() - Divides pointcloud into the concentric zone model successfully
PatchWorkpp::pc2czm() - Divides pointcloud into the concentric zone model successfully
Time taken : 0.028435(sec) ~ 0.005599(czm) + 0.006544(sort) + 0.010535(pca) + 0.00127(estimate)
PatchWorkpp::estimateGround() - Estimation is finished !
Origianl Points #: 124668
Ground Points #: 72665
Nonground Points #: 52003
Time Taken : 0.028435 (sec)
PatchWorkpp::estimateGround() - Estimation starts !
[1] 41741 segmentation fault (core dumped) python examples/python/demo_sequential.py

How to refine the performance on my own dataset?

Thanks for your great work and release the demo!
When i apply patchwork++ in my own data to segment ground_plane:
one obvious FP on the very flatten ground:
image

image

Also many ground-points on the obvious obstacles:
image

Does it one exist problem of the pathwork++, or can i refine the performance by changing some params?

Building on windows

I'm not quite used to cmake and make, but I was trying to get the examples running on my windows machine. I was using

cmake .. -DCMAKE_TOOLCHAIN_FILE="path"\vcpkg\scripts\buildsystems\vcpkg.cmake

-- Selecting Windows SDK version 10.0.22000.0 to target Windows 10.0.19045.
CMake Deprecation Warning at build/_deps/pybind11-src/CMakeLists.txt:8 (cmake_minimum_required):
Compatibility with CMake < 3.5 will be removed from a future version of
CMake.

Update the VERSION argument value or use a ... suffix to tell
CMake that the project does not need compatibility with older versions.

CMake Deprecation Warning at build/_deps/pybind11-src/tools/pybind11Tools.cmake:8 (cmake_minimum_required):
Compatibility with CMake < 3.5 will be removed from a future version of
CMake.

Update the VERSION argument value or use a ... suffix to tell
CMake that the project does not need compatibility with older versions.
Call Stack (most recent call first):
build/_deps/pybind11-src/CMakeLists.txt:33 (include)

CMake Warning (dev) at "path"/vcpkg/scripts/buildsystems/vcpkg.cmake:859 (_find_package):
Policy CMP0148 is not set: The FindPythonInterp and FindPythonLibs modules
are removed. Run "cmake --help-policy CMP0148" for policy details. Use
the cmake_policy command to set the policy and suppress this warning.

Call Stack (most recent call first):
build/_deps/pybind11-src/tools/FindPythonLibsNew.cmake:60 (find_package)
"path"/vcpkg/scripts/buildsystems/vcpkg.cmake:859 (_find_package)
build/_deps/pybind11-src/tools/pybind11Tools.cmake:16 (find_package)
build/_deps/pybind11-src/CMakeLists.txt:33 (include)
This warning is for project developers. Use -Wno-dev to suppress it.

-- pybind11 v2.2.3
CMake Deprecation Warning at C:/Program Files (x86)/Open3D/CMake/Open3DConfig.cmake:18 (cmake_policy):
The OLD behavior for policy CMP0072 will be removed from a future version
of CMake.

The cmake-policies(7) manual explains that the OLD behaviors of all
policies are deprecated and that a policy should be set to OLD only under
specific short-term circumstances. Projects should be ported to the NEW
behavior and not rely on setting a policy to OLD.
Call Stack (most recent call first):
"path"/vcpkg/scripts/buildsystems/vcpkg.cmake:859 (_find_package)
CMakeLists.txt:24 (find_package)

-- Found Open3D 0.17.0
-- Configuring done (2.3s)
CMake Warning (dev) in CMakeLists.txt:
Policy CMP0111 is not set: An imported target missing its location property
fails during generation. Run "cmake --help-policy CMP0111" for policy
details. Use the cmake_policy command to set the policy and suppress this
warning.

IMPORTED_LOCATION not set for imported target "Open3D::Open3D"
configuration "MinSizeRel".
This warning is for project developers. Use -Wno-dev to suppress it.

CMake Warning (dev) in CMakeLists.txt:
Policy CMP0111 is not set: An imported target missing its location property
fails during generation. Run "cmake --help-policy CMP0111" for policy
details. Use the cmake_policy command to set the policy and suppress this
warning.

IMPORTED_LOCATION not set for imported target "Open3D::Open3D"
configuration "RelWithDebInfo".
This warning is for project developers. Use -Wno-dev to suppress it.

CMake Warning (dev) in CMakeLists.txt:
Policy CMP0111 is not set: An imported target missing its location property
fails during generation. Run "cmake --help-policy CMP0111" for policy
details. Use the cmake_policy command to set the policy and suppress this
warning.

IMPORTED_LOCATION not set for imported target "Open3D::Open3D"
configuration "MinSizeRel".
This warning is for project developers. Use -Wno-dev to suppress it.

CMake Warning (dev) in CMakeLists.txt:
Policy CMP0111 is not set: An imported target missing its location property
fails during generation. Run "cmake --help-policy CMP0111" for policy
details. Use the cmake_policy command to set the policy and suppress this
warning.

IMPORTED_LOCATION not set for imported target "Open3D::Open3D"
configuration "RelWithDebInfo".
This warning is for project developers. Use -Wno-dev to suppress it.

-- Generating done (0.1s)
-- Build files have been written to: G"path"/patchwork-plusplus/build

where "path" is my project directory and Eigen is installed via vcpkg.

When afterwards running msbuild I am getting: after some time those errors:

C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\include\experimental/filesystem(30,1): fatal error C1189: #error: The <experimental/filesystem> header providing std::experimental::filesystem is deprecated by Microsoft and wil
_SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING to suppress this error. ["path"\patchwork-plusplus\build\demo_sequential.vcxproj]

""path"\patchwork-plusplus\build\PATCHWORK.sln" (Standardziel) (1) ->
C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\include\xmemory(154,5): error C3861: "_invalid_parameter": Bezeichner wurde nicht gefunden. ["path"\patchwork-plusplus\build\python_wrapper\pypatchwo
C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\include\xmemory(164,5): error C2039: "_invalid_parameter" ist kein Member von "`global namespace'". [G:\Projekte\FootprintPioneers\3DFoot\patchwork-plusplus\build\python_wrapper\p

where the German lines say "error C3861: "_invalid_parameter": Declerator not found." and "error C2039: "_invalid_parameter" is not a member of "`global namespace'"".

I am a bit lost with those errors or what to do about them.
Do you have an idea?

Best regards

ROS2 Support

Hi
I would like to thank you for your awesome work!

I want to ask, are you going to release ROS2 support or not?

Thanks

How to adjust parameters and visualize them in real-time๏ผŸ

Thank you very much for your masterpiece and your contributions in this field!
I have used your warehouse content perfectly. ๐Ÿ‘
How can I adjust parameters anytime and anywhere like Python and provide me with real-time feedback through visualization๏ผŸ

would you provide the metrics?

Thank you in advance for making your impressive work available to the public. The strategy of patchwork partitioning is a brilliant idea. We'd like to cite your paper in our work.

While reading your code, I didn't find the metrics for accuracy, recall, F1 calculation. Would you kindly provide your code for these calculation?

Question about sensor height parameter

Hello !
Thanks for you work ๐Ÿ˜„ ๐Ÿ’ช๐Ÿป
This question is related to the following issue
Can you explain to me the impact of removing such update on the sensor_height ?
And why do we need to update it in adaptive manner ? ๐Ÿค”

In case we disable the update of the sensor height should we modify this condition in the noise removal process
z < -params_.sensor_height-0.8 and put z < -params_.sensor_height instead ? I did not fully understand this criteria of 0.8

if ( ver_angle_in_deg < params_.RNR_ver_angle_thr && z < -params_.sensor_height-0.8 && cloud_in.row(i)(3) < params_.RNR_intensity_thr)

Thanks for your answer !
Cheers ๐Ÿ‘๐Ÿป

Temporal Ground Revert implementation clarification

Hi, and thank you for open sourcing your algorithm.

By looking at the implementation of the temporal_ground_revert function it seems that the implemented version is a bit more complex than what is described in the paper.
I expected a simple threshold on this value

double mu_flatness = mean_flatness + 1.5*stdev_flatness;

Could you elaborate on the implemented version and its advantages?

My guesses so far are as follows:

  • A flatness probability is computed, instead of applying a "hard threshold". How is it computed?
  • The flatness probability is manually set to 1 if the patch contains enough region-wise ground points and their flatness is below th_dist_ squared. (Is the squared value there to match units of measure or is it an empirical value?)
  • A line probability is also computed, which is set to 1 if the major eigenvalue is at least 8 times the mid eigenvalue. I'm guessing the reasoning here is that a lidar ring within a patch should be close to linear on (flat ground).
  • The two conditions are in a logical and: the ground must be linear and the flatness probability above 0.5

What about System Requirements?

Does this repo support running in Ubuntu 16.04?

As my computer is Ubuntu 16.04, I install an older version of Open3D (0.9.0). But I cannot build Patchwork then.

Or can I run Patchwork on MacOS?

About patchwork++ parameters

Greetings,

First of all thanks for the great work.

I wanted to try patchwork++ in a custom Lidar datas that i collect from my own sensor and it seems the parameters of the algorithm should be adjusted for my environment.

Some of the parameters mentioned in your paper but I couldn't understand some of the parameters in the code.

Could you briefly explain the parameters and how it effects the results ?

Best regards.

params_image

Confused on update_elevation_ and update_flatness_

In the header, these variables appear to just be std::vector<double>[4] but in usage it looks like it should be std::vector<std::vector<double>>[4] based on the attached lines.
What's correct.

update_elevation_[concentric_idx].push_back(ground_elevation);
update_flatness_[concentric_idx].push_back(ground_flatness);

The same pattern holds for the update_flatness_thr_ and update_elevation_thr_ functions. They appear to index into a vector and then call functions on a nested vector.

Am i missing something.

codes question

Hi, I just want to know that :
in PatchWorkpp::estimateGround, Why is update_elevation_thr and update_flatness_thr is in the end, it seems take no effect ?

About ground plane

Hi, Seungjae. I used the official script to test Patchwork++ on example KITTI data and it performed well. I wanna know if Patch++ supports exporting ground plane equations that are similar to Ax + By + Cz + D = 0

concentric_idx is out-of-bound in function PatchWorkpp::estimateGround

Hi,

When I was rewriting this project with Rust, I encountered an array out-of-bounds issue in the function PatchWorkpp::estimateGround, which could run normally in the cpp project. This is because Rust by default checks whether the index of the array is out of bounds. Therefore, I added the following logs to the function PatchWorkpp::estimateGround:

  bool is_upright = ground_uprightness > params_.uprightness_thr;

  std::cout << "zone: " << zone_idx << " ring: " << ring_idx << " sector: " << sector_idx
            << " is_upright: " << is_upright << " heading: " << heading << " concentric_idx: "
            << concentric_idx << " elevation_thr.size(): " << params_.elevation_thr.size()
            << " params_.elevation_thr[" << concentric_idx << "]: "
            << params_.elevation_thr[concentric_idx] << std::endl;
  bool is_not_elevated = ground_elevation < params_.elevation_thr[concentric_idx];
  bool is_flat = ground_flatness < params_.flatness_thr[concentric_idx];

The output of running the test data with data/000002.bin is:

zone: 0 ring: 0 sector: 0 is_upright: 1 heading: -1.73489 concentric_idx: 0 elevation_thr.size(): 4 params_.elevation_thr[0]: 0
zone: 0 ring: 0 sector: 1 is_upright: 1 heading: -1.74432 concentric_idx: 0 elevation_thr.size(): 4 params_.elevation_thr[0]: 0
zone: 0 ring: 0 sector: 2 is_upright: 1 heading: -1.89768 concentric_idx: 0 elevation_thr.size(): 4 params_.elevation_thr[0]: 0
zone: 0 ring: 0 sector: 3 is_upright: 1 heading: -2.02774 concentric_idx: 0 elevation_thr.size(): 4 params_.elevation_thr[0]: 0
zone: 0 ring: 0 sector: 4 is_upright: 1 heading: -1.97894 concentric_idx: 0 elevation_thr.size(): 4 params_.elevation_thr[0]: 0
zone: 0 ring: 0 sector: 5 is_upright: 1 heading: -1.73974 concentric_idx: 0 elevation_thr.size(): 4 params_.elevation_thr[0]: 0
zone: 0 ring: 0 sector: 6 is_upright: 1 heading: -1.75397 concentric_idx: 0 elevation_thr.size(): 4 params_.elevation_thr[0]: 0
zone: 0 ring: 0 sector: 7 is_upright: 1 heading: -1.69606 concentric_idx: 0 elevation_thr.size(): 4 params_.elevation_thr[0]: 0
zone: 0 ring: 0 sector: 8 is_upright: 1 heading: -1.69194 concentric_idx: 0 elevation_thr.size(): 4 params_.elevation_thr[0]: 0
zone: 0 ring: 0 sector: 9 is_upright: 1 heading: -1.82683 concentric_idx: 0 elevation_thr.size(): 4 params_.elevation_thr[0]: 0
zone: 0 ring: 0 sector: 10 is_upright: 1 heading: -1.82479 concentric_idx: 0 elevation_thr.size(): 4 params_.elevation_thr[0]: 0
zone: 0 ring: 0 sector: 11 is_upright: 1 heading: -1.89899 concentric_idx: 0 elevation_thr.size(): 4 params_.elevation_thr[0]: 0
zone: 0 ring: 0 sector: 12 is_upright: 1 heading: -1.94862 concentric_idx: 0 elevation_thr.size(): 4 params_.elevation_thr[0]: 0
zone: 0 ring: 0 sector: 13 is_upright: 1 heading: -1.86376 concentric_idx: 0 elevation_thr.size(): 4 params_.elevation_thr[0]: 0
zone: 0 ring: 0 sector: 14 is_upright: 1 heading: -1.83641 concentric_idx: 0 elevation_thr.size(): 4 params_.elevation_thr[0]: 0
zone: 0 ring: 0 sector: 15 is_upright: 1 heading: -1.74444 concentric_idx: 0 elevation_thr.size(): 4 params_.elevation_thr[0]: 0
zone: 0 ring: 1 sector: 0 is_upright: 1 heading: -1.74813 concentric_idx: 1 elevation_thr.size(): 4 params_.elevation_thr[1]: 0
zone: 0 ring: 1 sector: 1 is_upright: 1 heading: -1.97711 concentric_idx: 1 elevation_thr.size(): 4 params_.elevation_thr[1]: 0
zone: 0 ring: 1 sector: 2 is_upright: 1 heading: -1.97925 concentric_idx: 1 elevation_thr.size(): 4 params_.elevation_thr[1]: 0
zone: 0 ring: 1 sector: 3 is_upright: 1 heading: -1.95138 concentric_idx: 1 elevation_thr.size(): 4 params_.elevation_thr[1]: 0
zone: 0 ring: 1 sector: 4 is_upright: 1 heading: -2.0171 concentric_idx: 1 elevation_thr.size(): 4 params_.elevation_thr[1]: 0
zone: 0 ring: 1 sector: 5 is_upright: 1 heading: -1.81168 concentric_idx: 1 elevation_thr.size(): 4 params_.elevation_thr[1]: 0
zone: 0 ring: 1 sector: 6 is_upright: 1 heading: -1.64348 concentric_idx: 1 elevation_thr.size(): 4 params_.elevation_thr[1]: 0
zone: 0 ring: 1 sector: 7 is_upright: 1 heading: -1.47165 concentric_idx: 1 elevation_thr.size(): 4 params_.elevation_thr[1]: 0
zone: 0 ring: 1 sector: 8 is_upright: 1 heading: -1.7231 concentric_idx: 1 elevation_thr.size(): 4 params_.elevation_thr[1]: 0
zone: 0 ring: 1 sector: 9 is_upright: 1 heading: -1.82779 concentric_idx: 1 elevation_thr.size(): 4 params_.elevation_thr[1]: 0
zone: 0 ring: 1 sector: 10 is_upright: 1 heading: -1.69926 concentric_idx: 1 elevation_thr.size(): 4 params_.elevation_thr[1]: 0
zone: 0 ring: 1 sector: 11 is_upright: 1 heading: -0.983918 concentric_idx: 1 elevation_thr.size(): 4 params_.elevation_thr[1]: 0
zone: 0 ring: 1 sector: 12 is_upright: 0 heading: -9.80688 concentric_idx: 1 elevation_thr.size(): 4 params_.elevation_thr[1]: 0
zone: 0 ring: 1 sector: 13 is_upright: 1 heading: -1.85931 concentric_idx: 1 elevation_thr.size(): 4 params_.elevation_thr[1]: 0
zone: 0 ring: 1 sector: 14 is_upright: 1 heading: -2.07688 concentric_idx: 1 elevation_thr.size(): 4 params_.elevation_thr[1]: 0
zone: 0 ring: 1 sector: 15 is_upright: 1 heading: -1.78912 concentric_idx: 1 elevation_thr.size(): 4 params_.elevation_thr[1]: 0
zone: 1 ring: 0 sector: 0 is_upright: 1 heading: -1.77923 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 1 is_upright: 1 heading: -1.85146 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 2 is_upright: 1 heading: -2.04147 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 3 is_upright: 1 heading: -4.85017 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 4 is_upright: 1 heading: -3.01898 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 5 is_upright: 0 heading: 11.3505 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 6 is_upright: 1 heading: -1.72827 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 7 is_upright: 0 heading: -7.20677 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 8 is_upright: 1 heading: -0.371473 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 9 is_upright: 1 heading: -3.2778 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 10 is_upright: 1 heading: -2.09424 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 11 is_upright: 1 heading: -1.8473 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 12 is_upright: 1 heading: -1.8059 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 13 is_upright: 1 heading: -1.9274 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 14 is_upright: 1 heading: -3.01876 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 15 is_upright: 1 heading: -2.66128 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 16 is_upright: 1 heading: -1.7474 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 17 is_upright: 1 heading: -1.57836 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 18 is_upright: 1 heading: -1.9357 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 19 is_upright: 1 heading: -1.74014 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 20 is_upright: 1 heading: -2.18305 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 21 is_upright: 0 heading: -14.6478 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 22 is_upright: 1 heading: -7.04039 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 24 is_upright: 1 heading: 3.02414 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 27 is_upright: 0 heading: 5.99268 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 28 is_upright: 0 heading: -9.50979 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 29 is_upright: 0 heading: 5.64163 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 30 is_upright: 1 heading: -2.8389 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 0 sector: 31 is_upright: 1 heading: -1.83111 concentric_idx: 2 elevation_thr.size(): 4 params_.elevation_thr[2]: 0
zone: 1 ring: 1 sector: 0 is_upright: 1 heading: -1.7569 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 1 is_upright: 1 heading: -1.97379 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 2 is_upright: 1 heading: -1.88031 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 3 is_upright: 1 heading: -1.79758 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 4 is_upright: 1 heading: -2.8268 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 6 is_upright: 1 heading: -8.24854 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 8 is_upright: 0 heading: -7.88586 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 9 is_upright: 1 heading: -2.15479 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 10 is_upright: 1 heading: -1.87526 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 11 is_upright: 1 heading: -1.61291 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 12 is_upright: 1 heading: -1.76412 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 13 is_upright: 1 heading: -2.17752 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 14 is_upright: 1 heading: -2.75043 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 15 is_upright: 1 heading: -2.68635 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 16 is_upright: 1 heading: -2.25184 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 17 is_upright: 1 heading: -1.57587 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 18 is_upright: 1 heading: -1.84912 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 19 is_upright: 1 heading: -1.79631 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 20 is_upright: 1 heading: -2.19766 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 21 is_upright: 0 heading: 13.7901 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 22 is_upright: 1 heading: -1.46298 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 28 is_upright: 0 heading: -7.12109 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 29 is_upright: 1 heading: -0.523098 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 30 is_upright: 1 heading: -1.78278 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 1 sector: 31 is_upright: 1 heading: -1.79802 concentric_idx: 3 elevation_thr.size(): 4 params_.elevation_thr[3]: 0
zone: 1 ring: 2 sector: 0 is_upright: 1 heading: -1.90191 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 1 is_upright: 1 heading: -1.55174 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 2 is_upright: 1 heading: -5.15133 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 3 is_upright: 1 heading: -2.4352 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 6 is_upright: 1 heading: -9.03573 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 9 is_upright: 1 heading: -4.35488 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 10 is_upright: 1 heading: -2.02637 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 11 is_upright: 1 heading: -1.70659 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 12 is_upright: 1 heading: -1.79044 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 13 is_upright: 1 heading: -0.399824 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 14 is_upright: 1 heading: -0.630776 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 15 is_upright: 1 heading: -2.38564 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 16 is_upright: 1 heading: -2.67708 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 17 is_upright: 1 heading: -1.76968 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 18 is_upright: 1 heading: -1.91007 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 19 is_upright: 1 heading: -1.70562 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 20 is_upright: 1 heading: -1.60357 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 21 is_upright: 1 heading: 0.922151 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 22 is_upright: 1 heading: -2.48282 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 29 is_upright: 1 heading: -1.24315 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 2 sector: 31 is_upright: 1 heading: -1.77973 concentric_idx: 4 elevation_thr.size(): 4 params_.elevation_thr[4]: 0
zone: 1 ring: 3 sector: 0 is_upright: 1 heading: -1.78349 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 1 is_upright: 1 heading: -1.61571 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 2 is_upright: 1 heading: -0.921609 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 3 is_upright: 1 heading: -1.81193 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 4 is_upright: 0 heading: 5.38895 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 6 is_upright: 0 heading: 0.42171 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 10 is_upright: 1 heading: -1.85848 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 11 is_upright: 1 heading: -1.8929 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 12 is_upright: 1 heading: -1.97676 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 13 is_upright: 1 heading: -2.54994 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 14 is_upright: 1 heading: -1.3855 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 15 is_upright: 1 heading: -1.63197 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 16 is_upright: 1 heading: -2.58788 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 17 is_upright: 1 heading: -1.72644 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 18 is_upright: 1 heading: -1.92563 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 19 is_upright: 1 heading: -1.5434 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 20 is_upright: 0 heading: 15.7007 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 21 is_upright: 0 heading: -8.6555 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 22 is_upright: 0 heading: -17.3305 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 30 is_upright: 1 heading: -2.07569 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 1 ring: 3 sector: 31 is_upright: 1 heading: -2.52036 concentric_idx: 5 elevation_thr.size(): 4 params_.elevation_thr[5]: 2.42092e-322
zone: 2 ring: 0 sector: 0 is_upright: 1 heading: -1.65405 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 1 is_upright: 1 heading: -1.53516 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 2 is_upright: 1 heading: -1.50198 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 3 is_upright: 1 heading: -0.894092 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 4 is_upright: 1 heading: -1.55768 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 5 is_upright: 1 heading: -6.55206 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 6 is_upright: 0 heading: -0.899689 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 17 is_upright: 1 heading: -1.66582 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 18 is_upright: 1 heading: -1.93975 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 19 is_upright: 1 heading: -2.04129 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 20 is_upright: 1 heading: -1.87574 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 21 is_upright: 1 heading: -2.29622 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 22 is_upright: 1 heading: -2.47496 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 23 is_upright: 1 heading: -2.04416 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 24 is_upright: 1 heading: -1.41143 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 25 is_upright: 1 heading: -1.08607 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 26 is_upright: 1 heading: -1.42096 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 27 is_upright: 1 heading: -2.07799 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 28 is_upright: 1 heading: -3.00372 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 29 is_upright: 1 heading: -2.45755 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 30 is_upright: 1 heading: -1.63059 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 31 is_upright: 1 heading: -1.75922 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 32 is_upright: 1 heading: -1.84767 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 33 is_upright: 1 heading: -1.82991 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 38 is_upright: 0 heading: 18.5794 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 49 is_upright: 1 heading: -3.9784 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 50 is_upright: 1 heading: 0.197644 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 51 is_upright: 1 heading: -6.82203 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 52 is_upright: 1 heading: -2.12627 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 0 sector: 53 is_upright: 1 heading: -1.37917 concentric_idx: 6 elevation_thr.size(): 4 params_.elevation_thr[6]: 0
zone: 2 ring: 1 sector: 0 is_upright: 1 heading: -1.53547 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 1 is_upright: 1 heading: -2.2019 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 2 is_upright: 1 heading: -2.51867 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 3 is_upright: 1 heading: -2.86431 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 4 is_upright: 0 heading: -9.59709 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 5 is_upright: 0 heading: 23.1276 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 6 is_upright: 0 heading: 5.43914 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 17 is_upright: 1 heading: -8.25023 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 18 is_upright: 1 heading: -1.2161 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 19 is_upright: 1 heading: -2.17524 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 20 is_upright: 1 heading: -1.66528 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 21 is_upright: 1 heading: -2.24303 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 22 is_upright: 1 heading: -11.8847 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 23 is_upright: 1 heading: -1.34775 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 24 is_upright: 1 heading: -1.41634 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 25 is_upright: 1 heading: -1.75594 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 26 is_upright: 1 heading: -2.01781 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 27 is_upright: 1 heading: -1.77348 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 28 is_upright: 1 heading: -1.58782 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 29 is_upright: 1 heading: -2.35226 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 30 is_upright: 1 heading: -1.97541 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 31 is_upright: 1 heading: -1.60827 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 32 is_upright: 1 heading: -1.67812 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 33 is_upright: 1 heading: -1.72362 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 52 is_upright: 1 heading: -2.48215 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 1 sector: 53 is_upright: 1 heading: -1.5967 concentric_idx: 7 elevation_thr.size(): 4 params_.elevation_thr[7]: 0
zone: 2 ring: 2 sector: 0 is_upright: 1 heading: 0.325076 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 1 is_upright: 1 heading: -1.54784 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 2 is_upright: 1 heading: -0.398758 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 3 is_upright: 0 heading: -11.0943 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 18 is_upright: 1 heading: -2.36285 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 19 is_upright: 1 heading: -2.78778 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 20 is_upright: 1 heading: -2.38878 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 21 is_upright: 1 heading: -2.59855 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 22 is_upright: 1 heading: -1.23149 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 23 is_upright: 1 heading: 0.199701 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 24 is_upright: 1 heading: -5.99497 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 25 is_upright: 1 heading: 0.208296 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 26 is_upright: 1 heading: -1.79558 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 27 is_upright: 1 heading: 0.217229 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 28 is_upright: 1 heading: 0.192054 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 29 is_upright: 1 heading: -2.2851 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 30 is_upright: 1 heading: -2.64463 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 31 is_upright: 1 heading: -1.69562 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 32 is_upright: 1 heading: -1.41716 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 33 is_upright: 1 heading: -1.66889 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 52 is_upright: 1 heading: -2.93322 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 2 sector: 53 is_upright: 1 heading: -4.34283 concentric_idx: 8 elevation_thr.size(): 4 params_.elevation_thr[8]: 0
zone: 2 ring: 3 sector: 0 is_upright: 1 heading: 0.31243 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 1 is_upright: 1 heading: 0.179768 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 2 is_upright: 0 heading: -31.1903 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 3 is_upright: 0 heading: -10.5559 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 18 is_upright: 1 heading: 0.261164 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 19 is_upright: 1 heading: 0.101814 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 20 is_upright: 1 heading: -5.47607 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 21 is_upright: 1 heading: -11.2038 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 22 is_upright: 1 heading: 6.68185 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 23 is_upright: 1 heading: 0.200955 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 25 is_upright: 1 heading: 0.183158 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 26 is_upright: 1 heading: -0.960732 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 27 is_upright: 1 heading: 0.195923 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 28 is_upright: 1 heading: 0.217414 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 29 is_upright: 1 heading: -1.86653 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 30 is_upright: 1 heading: 0.251313 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 31 is_upright: 1 heading: 0.137089 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 32 is_upright: 1 heading: -2.46354 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 33 is_upright: 1 heading: -0.95416 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 2 ring: 3 sector: 53 is_upright: 1 heading: -2.32545 concentric_idx: 9 elevation_thr.size(): 4 params_.elevation_thr[9]: 0
zone: 3 ring: 0 sector: 0 is_upright: 1 heading: -1.76806 concentric_idx: 10 elevation_thr.size(): 4 params_.elevation_thr[10]: 0
zone: 3 ring: 0 sector: 1 is_upright: 1 heading: 1.16895 concentric_idx: 10 elevation_thr.size(): 4 params_.elevation_thr[10]: 0
zone: 3 ring: 0 sector: 10 is_upright: 1 heading: -4.60322 concentric_idx: 10 elevation_thr.size(): 4 params_.elevation_thr[10]: 0
zone: 3 ring: 0 sector: 11 is_upright: 1 heading: -6.55625 concentric_idx: 10 elevation_thr.size(): 4 params_.elevation_thr[10]: 0
zone: 3 ring: 0 sector: 12 is_upright: 1 heading: -14.8623 concentric_idx: 10 elevation_thr.size(): 4 params_.elevation_thr[10]: 0
zone: 3 ring: 0 sector: 13 is_upright: 1 heading: 0.213187 concentric_idx: 10 elevation_thr.size(): 4 params_.elevation_thr[10]: 0
zone: 3 ring: 0 sector: 14 is_upright: 1 heading: -2.70924 concentric_idx: 10 elevation_thr.size(): 4 params_.elevation_thr[10]: 0
zone: 3 ring: 0 sector: 15 is_upright: 1 heading: -1.45921 concentric_idx: 10 elevation_thr.size(): 4 params_.elevation_thr[10]: 0
zone: 3 ring: 0 sector: 16 is_upright: 1 heading: -1.62254 concentric_idx: 10 elevation_thr.size(): 4 params_.elevation_thr[10]: 0
zone: 3 ring: 0 sector: 17 is_upright: 1 heading: -1.4258 concentric_idx: 10 elevation_thr.size(): 4 params_.elevation_thr[10]: 0
zone: 3 ring: 0 sector: 18 is_upright: 1 heading: 0.134479 concentric_idx: 10 elevation_thr.size(): 4 params_.elevation_thr[10]: 0
zone: 3 ring: 0 sector: 19 is_upright: 1 heading: -2.63637 concentric_idx: 10 elevation_thr.size(): 4 params_.elevation_thr[10]: 0
zone: 3 ring: 0 sector: 31 is_upright: 1 heading: -2.08973 concentric_idx: 10 elevation_thr.size(): 4 params_.elevation_thr[10]: 0
zone: 3 ring: 1 sector: 0 is_upright: 1 heading: 0.171634 concentric_idx: 11 elevation_thr.size(): 4 params_.elevation_thr[11]: 2.42092e-322
zone: 3 ring: 1 sector: 1 is_upright: 1 heading: -0.666922 concentric_idx: 11 elevation_thr.size(): 4 params_.elevation_thr[11]: 2.42092e-322
zone: 3 ring: 1 sector: 11 is_upright: 1 heading: 1.05295 concentric_idx: 11 elevation_thr.size(): 4 params_.elevation_thr[11]: 2.42092e-322
zone: 3 ring: 1 sector: 12 is_upright: 1 heading: -4.85422 concentric_idx: 11 elevation_thr.size(): 4 params_.elevation_thr[11]: 2.42092e-322
zone: 3 ring: 1 sector: 15 is_upright: 1 heading: -2.00354 concentric_idx: 11 elevation_thr.size(): 4 params_.elevation_thr[11]: 2.42092e-322
zone: 3 ring: 1 sector: 16 is_upright: 1 heading: 0.310362 concentric_idx: 11 elevation_thr.size(): 4 params_.elevation_thr[11]: 2.42092e-322
zone: 3 ring: 1 sector: 17 is_upright: 1 heading: 0.773821 concentric_idx: 11 elevation_thr.size(): 4 params_.elevation_thr[11]: 2.42092e-322
zone: 3 ring: 1 sector: 18 is_upright: 1 heading: 0.144637 concentric_idx: 11 elevation_thr.size(): 4 params_.elevation_thr[11]: 2.42092e-322
zone: 3 ring: 1 sector: 19 is_upright: 1 heading: 0.100965 concentric_idx: 11 elevation_thr.size(): 4 params_.elevation_thr[11]: 2.42092e-322
zone: 3 ring: 1 sector: 31 is_upright: 1 heading: -0.368486 concentric_idx: 11 elevation_thr.size(): 4 params_.elevation_thr[11]: 2.42092e-322
zone: 3 ring: 2 sector: 0 is_upright: 1 heading: -7.9362 concentric_idx: 12 elevation_thr.size(): 4 params_.elevation_thr[12]: 2.7
zone: 3 ring: 2 sector: 1 is_upright: 0 heading: 10.3304 concentric_idx: 12 elevation_thr.size(): 4 params_.elevation_thr[12]: 2.7
zone: 3 ring: 2 sector: 16 is_upright: 1 heading: 0.113328 concentric_idx: 12 elevation_thr.size(): 4 params_.elevation_thr[12]: 2.7
zone: 3 ring: 2 sector: 17 is_upright: 1 heading: 0.22158 concentric_idx: 12 elevation_thr.size(): 4 params_.elevation_thr[12]: 2.7
zone: 3 ring: 2 sector: 18 is_upright: 1 heading: 0.240221 concentric_idx: 12 elevation_thr.size(): 4 params_.elevation_thr[12]: 2.7
zone: 3 ring: 2 sector: 19 is_upright: 1 heading: 0.178299 concentric_idx: 12 elevation_thr.size(): 4 params_.elevation_thr[12]: 2.7
zone: 3 ring: 2 sector: 31 is_upright: 1 heading: -3.00374 concentric_idx: 12 elevation_thr.size(): 4 params_.elevation_thr[12]: 2.7
zone: 3 ring: 3 sector: 0 is_upright: 1 heading: -11.1947 concentric_idx: 13 elevation_thr.size(): 4 params_.elevation_thr[13]: 12.3625
zone: 3 ring: 3 sector: 1 is_upright: 1 heading: 7.5445 concentric_idx: 13 elevation_thr.size(): 4 params_.elevation_thr[13]: 12.3625
zone: 3 ring: 3 sector: 15 is_upright: 1 heading: -9.18612 concentric_idx: 13 elevation_thr.size(): 4 params_.elevation_thr[13]: 12.3625
zone: 3 ring: 3 sector: 16 is_upright: 1 heading: -16.4218 concentric_idx: 13 elevation_thr.size(): 4 params_.elevation_thr[13]: 12.3625
zone: 3 ring: 3 sector: 17 is_upright: 1 heading: -4.75589 concentric_idx: 13 elevation_thr.size(): 4 params_.elevation_thr[13]: 12.3625
zone: 3 ring: 3 sector: 18 is_upright: 1 heading: 0.207667 concentric_idx: 13 elevation_thr.size(): 4 params_.elevation_thr[13]: 12.3625
zone: 3 ring: 3 sector: 19 is_upright: 1 heading: 8.6683 concentric_idx: 13 elevation_thr.size(): 4 params_.elevation_thr[13]: 12.3625
zone: 3 ring: 3 sector: 31 is_upright: 1 heading: 2.2545 concentric_idx: 13 elevation_thr.size(): 4 params_.elevation_thr[13]: 12.3625

The result shows that the length of the vector elevation_thr is always 4 (the maximum legal index value allowed for a vector should theoretically be 3), but the value of the variable concentric_idx increases from 0 to the maximum value of 13, and specific numerical values are obtained by using this value as an index.

What is terrible is that

  • when concentric_idx == 5 or concentric_idx == 11 => params_.elevation_thr[concentric_idx] == 2.42092e-322
  • when concentric_idx == 12 => params_.elevation_thr[concentric_idx] == 2.7.
  • when concentric_idx == 13 => params_.elevation_thr[concentric_idx] == 12.3625.

Even worse, running the program multiple times with data/000002.bin produces exactly the same results.

I cannot determine whether this is an advanced feature of cpp or a hidden bug. If it is a feature, please kindly explain the principle to me, so that I can understand it and consider how to implement this feature in other programming languages in the future.

Thank you!

confused by this line of code

Hi๏ผŒthanks for open_sourcing your amazing algorithm.I have test it in my lidar and it works well. But i am confused by this line of code:

if (normal_(2) < 0) { for(int i=0; i<3; i++) normal_(i) *= -1; }

I have not seen any describes of this code in your paper and when i comment out this code the result seems to be the same.

How to include intensity data

Hi, I'm trying to use your amazing work.

In the data, point cloud was used only x,y,z data.

However, I want to use data including intensity data because I need to use intensity.

How can I do that?

Thank you.

Installing without sudo

Hi, I'm very much interested in your project, and trying to build your repo's wheel so I can try it out for myself. However, the build script is heavily dependent on root privileges/sudo. Do you have a method for building without these requirements and/or prebuilt wheels that you can share?

the sensor height change?

I set the sensor height to 3.0๏ผŒbut on some case it will change like below?

the data is collected on boat. In some case, it work well; but some case, patchwork++ can not master.

did I need to change other params?

[ RNR ] Num of noises : 57
Flushed patches
[ CZM ] Divides pointcloud into the concentric zone model
=========== Temporal Ground Revert (TGR) ===========
[1, 8] mean_flatness: 0.0106572, stdev_flatness: 0.00265974
8th flat_sector_candidate / flatness: 0.0195439 / line_variable: 5.9849 / ground_num : 137
FINAL REJECT
====================================================
sensor height: 0.709483
elevation_thr_  :   -0.4289,  -0.8812,  -0.2444,  -0.1239
flatness_thr_   :   0.0152,  0.0085,  0.0013,  0.0053
Input Point Cloud Size:         18653
Ground Point Cloud Size:        5352
Non-Ground Point Cloud Size:    13301
Timer took 7.17513ms

Depth camera adaptation

thank you for your work

I would like to know:

  1. Can this algorithm be adapted to depth cameras?
  2. If so, what should you pay attention to?

Looking forward to your reply, thank you!

How to implement patchwork++ in Windows ๏ผŸ

Dear author, I am a new graduate student studying programming. Your algorithm is very novel and excellent. So I want to implement it in my computer environment. Can you provide a tutorial on the implementation of this algorithm in the windows environment? When I use cmake GUI, the error it prompts me is: eigen3_ I really don't know how to deal with dir-notfound, because your algorithm has just come out, and there are few tutorials on the network, which is very difficult for beginners like me, so I ask you for advice. Finally, I wish you every success in your work

An error when build patchworkpp

Hello, thank you for your nice work! I want to build patchworkpp with python. After 'cmake ..', when I performed 'make', an error occured as follows. Could you help me fix it?
Scanning dependencies of target patchworkpp [ 25%] Building CXX object patchworkpp/CMakeFiles/patchworkpp.dir/src/patchworkpp.cpp.o In file included from /usr/include/eigen3/Eigen/Core:297:0, from /usr/include/eigen3/Eigen/Dense:1, from /data1/patchwork-plusplus/patchworkpp/include/patchworkpp.h:6, from /data1/patchwork-plusplus/patchworkpp/src/patchworkpp.cpp:1: /usr/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h: In instantiation of โ€˜Eigen::DenseCoeffsBase<Derived, 0>::CoeffReturnType Eigen::DenseCoeffsBase<Derived, 0>::coeff(Eigen::Index) const [with Derived = Eigen::PartialReduxExpr<Eigen::Matrix<float, -1, 3>, Eigen::internal::member_mean<float>, 0>; Eigen::DenseCoeffsBase<Derived, 0>::CoeffReturnType = float; Eigen::Index = long int]โ€™: /usr/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h:181:19: required from โ€˜Eigen::DenseCoeffsBase<Derived, 0>::CoeffReturnType Eigen::DenseCoeffsBase<Derived, 0>::operator()(Eigen::Index) const [with Derived = Eigen::PartialReduxExpr<Eigen::Matrix<float, -1, 3>, Eigen::internal::member_mean<float>, 0>; Eigen::DenseCoeffsBase<Derived, 0>::CoeffReturnType = float; Eigen::Index = long int]โ€™ /data1/patchwork-plusplus/patchworkpp/src/patchworkpp.cpp:61:48: required from here /usr/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h:141:7: error: static assertion failed: THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS EIGEN_STATIC_ASSERT(internal::evaluator<Derived>::Flags & LinearAccessBit, ^ patchworkpp/CMakeFiles/patchworkpp.dir/build.make:81: recipe for target 'patchworkpp/CMakeFiles/patchworkpp.dir/src/patchworkpp.cpp.o' failed make[2]: *** [patchworkpp/CMakeFiles/patchworkpp.dir/src/patchworkpp.cpp.o] Error 1 CMakeFiles/Makefile2:152: recipe for target 'patchworkpp/CMakeFiles/patchworkpp.dir/all' failed make[1]: *** [patchworkpp/CMakeFiles/patchworkpp.dir/all] Error 2 Makefile:148: recipe for target 'all' failed make: *** [all] Error 2

patchwork_parameters

hi, enable_RNR and enable_RVPF is set false by default, Did you not use these two methods?

When using 16-beam lidar, there will be false detection at close range

Thanks for your awsome work, it really helps me a lot.

But when I try to test custom data recorded by my 16-beam lidar, it happens in almost each point cloud, there will be false detection at close range, like this:
image

I wonder if there is any way to solve this problem, or could you please tell me the reason? Thanks a lot.

Return a binary array indicating ground points using python wrapper

Hello,
Thank you for your excellent work.
I am using the python wrapper and I have a question: is it possible to return a binary array indicating which points are ground points?
Since my point clouds have other features besides the reflectance, returning ground as a binary array can help me recover features of nonground points after ground segmentation.
Thank you for your support.

offset of sequential pointcloud?

I modify the demo_visualize.py as followings and test it on kitti odometry

import os
import sys
import open3d as o3d
import numpy as np
# import pypatchworkpp

cur_dir = os.path.dirname(os.path.abspath(__file__))
base_dir = '/media/kang/My Passport/Dataset/KITTI/dataset/sequences'
sequence_list = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10"]

try:
    patchwork_module_path = os.path.join(cur_dir, "../../build/python_wrapper")
    sys.path.insert(0, patchwork_module_path)
    import pypatchworkpp
except ImportError:
    print("Cannot find pypatchworkpp!")
    exit(1)

def read_bin(bin_path):
    scan = np.fromfile(bin_path, dtype=np.float32)
    scan = scan.reshape((-1, 4))

    return scan

if __name__ == "__main__":

    # Patchwork++ initialization
    params = pypatchworkpp.Parameters()
    params.verbose = True

    PatchworkPLUSPLUS = pypatchworkpp.patchworkpp(params)
    for i in range(len(sequence_list)):
        velodyne_path = os.path.join(base_dir, sequence_list[i], 'velodyne')
        pc_list = os.listdir(velodyne_path)
        if not os.path.exists(os.path.join(base_dir, sequence_list[i], 'nonground')):
            os.mkdir(os.path.join(base_dir, sequence_list[i], 'nonground'))
        for j in range(len(pc_list)):
            # Load point cloud
            pointcloud = read_bin(os.path.join(velodyne_path, pc_list[j]))

            # Estimate Ground
            PatchworkPLUSPLUS.estimateGround(pointcloud)

            # Get Ground and Nonground
            # ground = PatchworkPLUSPLUS.getGround()
            nonground   = PatchworkPLUSPLUS.getNonground()
            time_taken = PatchworkPLUSPLUS.getTimeTaken()
            np.save(os.path.join(base_dir, sequence_list[i], 'nonground', '{:06d}'.format(j)), nonground)
            print(f"This is sequence{sequence_list[i]}, images{j}")
            print("Origianl Points  #: ", pointcloud.shape[0])
            print("Nonground Points #: ", nonground.shape[0])
            print("Time Taken : ", time_taken / 1000000, "(sec)")

However, when I check the result in cloudcompare, it seems that there is a offset between original point cloud and estimated nonground points except frame 0.

This is kitti odometry sequence 00, 000001.bin and estimated 000001.pcd
2022-10-01 18-47-32 ็š„ๅฑๅน•ๆˆชๅ›พ

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.