Skip to content

Commit

Permalink
Release 1.3.0: CUDA 10.0 and Ubuntu 18.04 compatibility.
Browse files Browse the repository at this point in the history
Uses C++11 by default. Adds ROS-connected DistanceROSDemo example. Improved Visualizer Shared Memory error handling.

Major changes:
- Added DistanceROSDemo to show-case a ROS node subscribing to PCL point-clouds.
- Implemented additional merge functions
  - Added TemplateVoxelMap.merge(TemplateVoxelList)
  - Added functions to merge TemplateVoxelList into BitVoxelList and CountingVoxelList;
- Added TemplateVoxelMap::clone and TemplateVoxelList::clone, was previously
only available in DistanceVoxelMap
- Added functions that implement the morphological operations Closing, Dilation and Erosion
- Added function getCenterOfMass to TemplateVoxelList and TemplateVoxelMap
- Added BitVoxelList::copyCoordsToHostBvmBounded: allows the selective copy of voxels with BitVoxelMeanings in a given range
- Updated icmaker and icl_core to fix issues with new Boost and CMake versions

Possibly breaking changes:
- C++11 support is active by default. The new "indigo" branch has C++11 deactivated by default, is identical otherwise
- changed BitVoxelList::findMatchingVoxels signature:
  - Implicitly set argument list1 to 'this'.
  - Add option omit_coords: if true, output VoxelLists will only contain voxel IDs and data but the coord_list will be empty (default). If set to false, voxel coordinates will also be copied to the output lists.

Additional changes:
- gvl_ompl_planner:
  - fixed collision check threshold value
  - updated comments and logging output
- gvl_ompl_planner: added comment regarding LD_LIBRARY_PATH
- fix MetaPointCloud name unknown for robot links without geometry
- updated stb_image.h to version 2.19
- fix ROS&Urdf CMake discovery issue
- add tests for TemplateVoxelList and TemplateVoxelMap clone
- add hollie_from_pointcloud2.pcd for example DistanceVoxelTest.cpp
- fix a CountingVoxelList visualization issue

Known Issues:
- Eigen 3 issues: can be fixed by cloning a more current unstable Eigen version and placing it in CMAKE_PREFIX_PATH
  + on Ubuntu 18.04 with CUDA 10.0: "math_functions.hpp not found"
  + Eigen 3.3.4 and 3.3.5 with CUDA 9.0, 9.1, 9.2: Error: class "Eigen::half" has no member "x"
  + see http://eigen.tuxfamily.org/index.php?title=Main_Page#Download
- If the ROS dependency was found, but the GPU-Voxels URDF features are still unabailable, run `source /opt/ros/YOUR_ROS_DISTRO/setup.bash` before running cmake.
- Cuda 8.0: Code compiled with Cuda 8.0 works fine with older GPU drivers such as 375.66, but there are runtime errors with driver 384.111 and newer ("PTX JIT compilation failed").
  + Easy fix: use Cuda 10 with a current 410 or newer driver version. Cuda 10 is also available for Ubuntu 14.04 and 16.04.
- The GLM headers provided by Ubuntu 16.04 have to be patched to allow usage of the visualizer.
  - see g-truc/glm#530
  - patch for /usr/include/glm/detail/func_common.inl in packages/gpu_voxels/doc/glm_fix_issu530.patch
- The constant cMAX_NR_OF_BLOCKS is currently limited to 65535, while current CUDA devices support over 2 billion blocks
  - relevant during computeLinearLoad calls and collision checking
  • Loading branch information
cjue committed Jan 10, 2019
1 parent d494206 commit 7419848
Show file tree
Hide file tree
Showing 53 changed files with 3,424 additions and 958 deletions.
20 changes: 13 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ If you have questions or experience any problems with the software, please post
at https://github.com/fzi-forschungszentrum-informatik/gpu-voxels/issues

## Install dependencies:
This software is tested under 64 Bit Ubuntu Linux 14.04 and 16.04.
This software is tested under 64 Bit Ubuntu Linux 14.04, 16.04 and 18.04.
Find detailed installation and linking instructions in our Doxygen.

**Core:**

- CUDA 7.5, 8.0 and 9.2
- CUDA 7.5, 8.0, 9.x or 10.0
- PCL
- OpenNI
- Boost
Expand Down Expand Up @@ -51,20 +51,25 @@ Doxygen files can be generated by

make doc

## Enabling C++11
C++11 is not enabled by default. To compile in C++11 mode add this to the top of packages/gpu_voxels/CMakeLists.txt:
## Compiling without C++11
C++11 is enabled by default. To compile without C++11 mode comment out this at the top of packages/gpu_voxels/CMakeLists.txt:
SET(CMAKE_CXX_STANDARD 11)
This is important if you are still using ROS Indigo and need to compile without C++11 support for compatibility reasons. There is a separate indigo branch that only differs in this line to disable C++11 during compilation.

## Known issues
- Cuda 8.0: Code compiled with Cuda 8.0 works fine with older GPU drivers such as 375.66, but there are runtime errors with driver 384.111 and newer ("PTX JIT compilation failed").
- If the ROS dependency was found, but the GPU-Voxels URDF features are still unabailable, run `source /opt/ros/YOUR_ROS_DISTRO/setup.bash` before running cmake.
- Eigen 3 issues: can be fixed by cloning a more current unstable Eigen version and placing it in CMAKE_PREFIX_PATH
+ on Ubuntu 18.04 with CUDA 10.0: "math_functions.hpp not found"
+ Eigen 3.3.4 and 3.3.5 with CUDA 9.0, 9.1, 9.2: Error: class "Eigen::half" has no member "x"
+ see http://eigen.tuxfamily.org/index.php?title=Main_Page#Download
- Cuda 8.0: Code compiled with Cuda 8.0 works fine with older GPU drivers such as 375.66, but there are runtime errors with driver 384.111 and newer ("PTX JIT compilation failed"). Easy fix: use Cuda 10 with a current 410 or newer driver version. Cuda 10 is also available for Ubuntu 14.04 and 16.04.
- GLM: There is a known bug in GLM on Ubuntu 16.04 that has to be patched to allow usage of the visualizer. Apply the patch described at https://github.com/g-truc/glm/issues/530 to /usr/include/glm/detail/func_common.inl
- Eigen 3.3.4 and 3.3.5 with CUDA 9.0, 9.1, 9.2: Error: class "Eigen::half" has no member "x". Can be fixed by using latest unstable version of Eigen

## Maintainers:
The library is developed and maintained by:

- Andreas Hermann
- Christian Jülg
- Andreas Hermann

Contributors are (in temporal order):

Expand All @@ -75,6 +80,7 @@ Contributors are (in temporal order):
- Herbert Pietrzyk
- Gabriele Bolano
- Florian Fervers
- Erik Albert

## License:
The software in this repository underlies different licenses.
Expand Down
50 changes: 50 additions & 0 deletions changelog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -509,3 +509,53 @@ V1.2.2 (2018-08-29):
====================
Fix missing CUDA include and link directive in gvl_ompl_planner and example_howto_link


V1.3.0 (2019-01-07):
====================
CUDA 10.0 and Ubuntu 18.04 compatibility. Use C++11 by default. Add
ROS-connected DistanceROSDemo example. Improve Visualizer Shared Memory error handling.

Major changes:
- Added DistanceROSDemo to show-case a ROS node subscribing to PCL point-clouds.
- Implemented additional merge functions
- Added TemplateVoxelMap.merge(TemplateVoxelList)
- Added functions to merge TemplateVoxelList into BitVoxelList and CountingVoxelList;
- Added TemplateVoxelMap::clone and TemplateVoxelList::clone, was previously
only available in DistanceVoxelMap
- Added functions that implement the morphological operations Closing, Dilation and Erosion
- Added function getCenterOfMass to TemplateVoxelList and TemplateVoxelMap
- Added BitVoxelList::copyCoordsToHostBvmBounded: allows the selective copy of voxels with BitVoxelMeanings in a given range
- Updated icmaker and icl_core to fix issues with new Boost and CMake versions

Possibly breaking changes:
- C++11 support is active by default. The new "indigo" branch has C++11 deactivated by default, is identical otherwise
- changed BitVoxelList::findMatchingVoxels signature:
- Implicitly set argument list1 to 'this'.
- Add option omit_coords: if true, output VoxelLists will only contain voxel IDs and data but the coord_list will be empty (default). If set to false, voxel coordinates will also be copied to the output lists.

Additional changes:
- gvl_ompl_planner:
- fixed collision check threshold value
- updated comments and logging output
- gvl_ompl_planner: added comment regarding LD_LIBRARY_PATH
- fix MetaPointCloud name unknown for robot links without geometry
- updated stb_image.h to version 2.19
- fix ROS&Urdf CMake discovery issue
- add tests for TemplateVoxelList and TemplateVoxelMap clone
- add hollie_from_pointcloud2.pcd for example DistanceVoxelTest.cpp
- fix a CountingVoxelList visualization issue

Known Issues:
- Eigen 3 issues: can be fixed by cloning a more current unstable Eigen version and placing it in CMAKE_PREFIX_PATH
+ on Ubuntu 18.04 with CUDA 10.0: "math_functions.hpp not found"
+ Eigen 3.3.4 and 3.3.5 with CUDA 9.0, 9.1, 9.2: Error: class "Eigen::half" has no member "x"
+ see http://eigen.tuxfamily.org/index.php?title=Main_Page#Download
- If the ROS dependency was found, but the GPU-Voxels URDF features are still unabailable, run `source /opt/ros/YOUR_ROS_DISTRO/setup.bash` before running cmake.
- Cuda 8.0: Code compiled with Cuda 8.0 works fine with older GPU drivers such as 375.66, but there are runtime errors with driver 384.111 and newer ("PTX JIT compilation failed").
+ Easy fix: use Cuda 10 with a current 410 or newer driver version. Cuda 10 is also available for Ubuntu 14.04 and 16.04.
- The GLM headers provided by Ubuntu 16.04 have to be patched to allow usage of the visualizer.
- see https://github.com/g-truc/glm/issues/530
- patch for /usr/include/glm/detail/func_common.inl in packages/gpu_voxels/doc/glm_fix_issu530.patch
- The constant cMAX_NR_OF_BLOCKS is currently limited to 65535, while current CUDA devices support over 2 billion blocks
- relevant during computeLinearLoad calls and collision checking

2 changes: 2 additions & 0 deletions gvl_ompl_planning/README.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ This example uses GPU-Voxels data structures and collision checking to plan the

* Launch planner
export GPU_VOXELS_MODEL_PATH=<gpu-voxels-path>/packages/gpu_voxels/models/
# if libs are not found: export LD_LIBRARY_PATH=<gpu-voxels-path>/export/lib:$LD_LIBRARY_PATH
./gvl_ompl_planner

* Start Visualizer
Expand All @@ -55,5 +56,6 @@ This example uses GPU-Voxels data structures and collision checking to plan the
cmake -DCMAKE_PREFIX_PATH=<gpu-voxels-path>/export:~/pcl-1.8.1/build/lib/ ..
make
ldd gvl_ompl_planner | grep -F "libpcl" # make sure there are no pcl 1.7 libraries linked in
# if libs are not found: export LD_LIBRARY_PATH=<gpu-voxels-path>/export/lib:$LD_LIBRARY_PATH
./gvl_ompl_planner

4 changes: 2 additions & 2 deletions gvl_ompl_planning/gvl_ompl_planner_helper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ bool GvlOmplPlannerHelper::isValid(const ompl::base::State *state) const
PERF_MON_SILENT_MEASURE_AND_RESET_INFO_P("insert", "Pose Insertion", "pose_check");

PERF_MON_START("coll_test");
size_t num_colls_pc = gvl->getMap("myRobotMap")->as<voxelmap::ProbVoxelMap>()->collideWith(gvl->getMap("myEnvironmentMap")->as<voxelmap::ProbVoxelMap>());
size_t num_colls_pc = gvl->getMap("myRobotMap")->as<voxelmap::ProbVoxelMap>()->collideWith(gvl->getMap("myEnvironmentMap")->as<voxelmap::ProbVoxelMap>(), 0.7f);
PERF_MON_SILENT_MEASURE_AND_RESET_INFO_P("coll_test", "Pose Collsion", "pose_check");

//std::cout << "Validity check on state [" << values[0] << ", " << values[1] << ", " << values[2] << ", " << values[3] << ", " << values[4] << ", " << values[5] << "] resulting in " << num_colls_pc << " colls." << std::endl;
Expand Down Expand Up @@ -324,7 +324,7 @@ bool GvlOmplPlannerHelper::checkMotion(const ompl::base::State *s1, const ompl::

//gvl->visualizeMap("myRobotMap");
PERF_MON_START("coll_test");
size_t num_colls_pc = gvl->getMap("myRobotMap")->as<voxelmap::ProbVoxelMap>()->collideWith(gvl->getMap("myEnvironmentMap")->as<voxelmap::ProbVoxelMap>());
size_t num_colls_pc = gvl->getMap("myRobotMap")->as<voxelmap::ProbVoxelMap>()->collideWith(gvl->getMap("myEnvironmentMap")->as<voxelmap::ProbVoxelMap>(), 0.7f);
//std::cout << "CheckMotion1 for " << nd << " segments. Resulting in " << num_colls_pc << " colls." << std::endl;
PERF_MON_SILENT_MEASURE_AND_RESET_INFO_P("coll_test", "Pose Collsion", "motion_check");

Expand Down
26 changes: 15 additions & 11 deletions packages/gpu_voxels/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# this is for emacs file handling -*- mode: cmake; indent-tabs-mode: nil -*-

SET(CMAKE_CXX_STANDARD 11) # uncomment to activate C++11 mode
SET(CMAKE_CXX_STANDARD 11) # comment out to deactivate C++11 when using ROS indigo to avoid incompatibilities

# --- To be used by other modules ---
SET(GPU_VOXELS_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_BINARY_DIR}/src" CACHE INTERNAL "")
Expand All @@ -25,20 +25,20 @@ FIND_PACKAGE(GLM)
FIND_PACKAGE(OpenGL)
FIND_PACKAGE(GLUT)

# Dependencies for ROS interconnect
FIND_PACKAGE(ROS)

# Dependencies for URDF loading (also requires ROS for kdl/frames.hpp)
FIND_PACKAGE(urdfdom)
FIND_PACKAGE(orocos_kdl)
FIND_PACKAGE(kdl_parser)

# Dependencied for Benchmarking against Octomap
# Dependencies for Benchmarking against Octomap
FIND_PACKAGE(Octomap)

# Dependencies for PCL interfaces
FIND_PACKAGE(PCL)

# Dependencies for ROS interconnect
FIND_PACKAGE(ROS)

FIND_PACKAGE(pcl_ros)

# Dependencies for Kinect support
Expand Down Expand Up @@ -82,9 +82,9 @@ ELSE(ROS_FOUND)
MESSAGE(STATUS "[WARNING] Building GPU-Voxels without ROS connections. ROS not found.")
ENDIF(ROS_FOUND)

IF(urdfdom_FOUND AND orocos_kdl_FOUND AND kdl_parser_FOUND AND ROS_FOUND)
IF(urdfdom_FOUND AND orocos_kdl_FOUND AND kdl_parser_FOUND)
MESSAGE(STATUS "[OK] Building GPU-Voxels with URDF support. urdfdom, orocos and kdl_parser and ROS-kdl were found.")
ELSE(urdfdom_FOUND AND orocos_kdl_FOUND AND kdl_parser_FOUND AND ROS_FOUND)
ELSE(urdfdom_FOUND AND orocos_kdl_FOUND AND kdl_parser_FOUND)
MESSAGE(STATUS "[WARNING] Building GPU-Voxels without URDF support. Could not find the following packages:")
IF(NOT urdfdom_FOUND)
MESSAGE(STATUS " urdfdom")
Expand All @@ -95,10 +95,10 @@ ELSE(urdfdom_FOUND AND orocos_kdl_FOUND AND kdl_parser_FOUND AND ROS_FOUND)
IF(NOT kdl_parser_FOUND)
MESSAGE(STATUS " kdl_parser")
ENDIF(NOT kdl_parser_FOUND)
IF(NOT ROS_FOUND)
MESSAGE(STATUS " ROS")
ENDIF(NOT ROS_FOUND)
ENDIF(urdfdom_FOUND AND orocos_kdl_FOUND AND kdl_parser_FOUND AND ROS_FOUND)
IF(ROS_FOUND)
MESSAGE(STATUS "!!! to fix this, source /opt/ros/YOUR_ROS_DISTRO/setup.bash before building !!!")
ENDIF(ROS_FOUND)
ENDIF(urdfdom_FOUND AND orocos_kdl_FOUND AND kdl_parser_FOUND)

#IF(OPENNI2_FOUND)
# MESSAGE(STATUS "[OK] Building GPU-Voxels with Kinect support. OpenNI2 was found.")
Expand Down Expand Up @@ -137,9 +137,13 @@ MESSAGE(STATUS "----------------------------------------------------------------
# GPU-Voxels requires GPU CUDA capabilities >= 2.0
#SET(ICMAKER_CUDA_COMPUTE_VERSION 20)
SET(ICMAKER_CUDA_COMPUTE_VERSION 35)

SET(ICMAKER_CUDA_ARCH compute_${ICMAKER_CUDA_COMPUTE_VERSION})
SET(ICMAKER_CUDA_CODE compute_${ICMAKER_CUDA_COMPUTE_VERSION})

#Usage example for specifying PTX for compute_35 and cubin for sm_51:
# SET(ICMAKER_CUDA_CODE compute_35,sm_51)

## Uncomment this definition if you want to avoid PTX JIT compilation at first runtime.
## Having both a compute_ and a sm_ code target will include both PTX and CUBIN in the final binary.
## IMPORTANT: Check your device's compute capability. the sm_xy argument needs to match your device to have any effect!
Expand Down
1 change: 1 addition & 0 deletions packages/gpu_voxels/LICENSE.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ To clarify this:
- GPU-Voxels is distributed under the CDDL license
- PBA kernel code in GPU-Voxels is distributed under the BSD-like license found in LICENSE_PBA.txt
- icl_core helber library is distributed under CDDL license
- stb_image.h is distributed under two licenses, see LICENSE_std_image.txt
39 changes: 39 additions & 0 deletions packages/gpu_voxels/LICENSE_stb_image.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
------------------------------------------------------------------------------
This software is available under 2 licenses -- choose whichever you prefer.
------------------------------------------------------------------------------
ALTERNATIVE A - MIT License
Copyright (c) 2017 Sean Barrett
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
------------------------------------------------------------------------------
ALTERNATIVE B - Public Domain (www.unlicense.org)
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
software, either in source code form or as a compiled binary, for any purpose,
commercial or non-commercial, and by any means.
In jurisdictions that recognize copyright laws, the author or authors of this
software dedicate any and all copyright interest in the software to the public
domain. We make this dedication for the benefit of the public at large and to
the detriment of our heirs and successors. We intend this dedication to be an
overt act of relinquishment in perpetuity of all present and future rights to
this software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
------------------------------------------------------------------------------
22 changes: 16 additions & 6 deletions packages/gpu_voxels/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ If you have questions or experience any problems with the software, please post
at https://github.com/fzi-forschungszentrum-informatik/gpu-voxels/issues

## Install dependencies:
This software is tested under 64 Bit Ubuntu Linux 14.04 and 16.04.
This software is tested under 64 Bit Ubuntu Linux 14.04, 16.04 and 18.04.
Find detailed installation and linking instructions in our Doxygen.

**Core:**

- CUDA 7.5, 8.0 and 9.2
- CUDA 7.5, 8.0, 9.x or 10.0
- PCL
- OpenNI
- Boost
Expand Down Expand Up @@ -51,20 +51,29 @@ Doxygen files can be generated by

make doc

## Compiling without C++11
C++11 is enabled by default. To compile without C++11 mode comment out this at the top of packages/gpu_voxels/CMakeLists.txt:
SET(CMAKE_CXX_STANDARD 11)
This is important if you are still using ROS Indigo and need to compile without C++11 support for compatibility reasons. There is a separate indigo branch that only differs in this line to disable C++11 during compilation.

## Enabling C++11
C++11 is not enabled by default. To compile in C++11 mode add this to the top of packages/gpu_voxels/CMakeLists.txt:
C++11 is enabled by default. To compile without C++11 mode comment out this at the top of packages/gpu_voxels/CMakeLists.txt:
SET(CMAKE_CXX_STANDARD 11)

## Known issues
- Cuda 8.0: Code compiled with Cuda 8.0 works fine with older GPU drivers such as 375.66, but there are runtime errors with driver 384.111 and newer ("PTX JIT compilation failed").
- If the ROS dependency was found, but the GPU-Voxels URDF features are still unabailable, run `source /opt/ros/YOUR_ROS_DISTRO/setup.bash` before running cmake.
- Eigen 3 issues: can be fixed by cloning a more current unstable Eigen version and placing it in CMAKE_PREFIX_PATH
+ on Ubuntu 18.04 with CUDA 10.0: "math_functions.hpp not found"
+ Eigen 3.3.4 and 3.3.5 with CUDA 9.0, 9.1, 9.2: Error: class "Eigen::half" has no member "x"
+ see http://eigen.tuxfamily.org/index.php?title=Main_Page#Download
- Cuda 8.0: Code compiled with Cuda 8.0 works fine with older GPU drivers such as 375.66, but there are runtime errors with driver 384.111 and newer ("PTX JIT compilation failed"). Easy fix: use Cuda 10 with a current 410 or newer driver version. Cuda 10 is also available for Ubuntu 14.04 and 16.04.
- GLM: There is a known bug in GLM on Ubuntu 16.04 that has to be patched to allow usage of the visualizer. Apply the patch described at https://github.com/g-truc/glm/issues/530 to /usr/include/glm/detail/func_common.inl
- Eigen 3.3.4 and 3.3.5 with CUDA 9.0, 9.1, 9.2: Error: class "Eigen::half" has no member "x". Can be fixed by using latest unstable version of Eigen

## Maintainers:
The library is developed and maintained by:

- Andreas Hermann
- Christian Jülg
- Andreas Hermann

Contributors are (in temporal order):

Expand All @@ -75,6 +84,7 @@ Contributors are (in temporal order):
- Herbert Pietrzyk
- Gabriele Bolano
- Florian Fervers
- Erik Albert

## License:
The software in this repository underlies different licenses.
Expand Down
Loading

0 comments on commit 7419848

Please sign in to comment.