Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bev version #116

Open
wants to merge 20 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
build
export
CMakeLists.txt.user
external_link_path
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,12 @@ This is important if you are still using ROS Indigo and need to compile without
- 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.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- 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.
- If the ROS dependency was found, but the GPU-Voxels URDF features are still unavailable, run `source /opt/ros/$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"
```bash
git clone https://gitlab.com/libeigen/eigen.git
sudo cp -r signature_of_eigen3_matrix_library /usr/include/eigen3
sudo cp -r unsupported/ /usr/include/eigen3
sudo cp -r Eigen/ /usr/include/eigen3
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We shouldn't overwrite system-installed packages. What is this required for?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As mentioned in README, to fix "math_functions.hpp not found" on Ubuntu 18.04 with CUDA 10.0.
If you have a better way to fix this, I'm okay with that.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I remember that some way of introducing a newer version of Eigen was needed when Ubuntu 18.04 came out.

We have a script that clones Eigen into a subfolder so you can add it to the build itself, for 18.04, I prefer that over the system overwrite also.

Copy link

@wxmerkt wxmerkt Jan 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could check the Eigen version and conditionally use FetchContent or ExternalProject_Add to fetch if required?

```
+ 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.
Expand Down
2 changes: 1 addition & 1 deletion packages/gpu_voxels/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ ICMAKER_CONFIGURE_PACKAGE()

###############################################################################
# Build examples
ADD_SUBDIRECTORY(src/examples)
# ADD_SUBDIRECTORY(src/examples)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd suggest adding an OPTION(BUILD_EXAMPLES ON) so it doesn't need to be commented

Suggested change
# ADD_SUBDIRECTORY(src/examples)
IF(BUILD_EXAMPLES)
ADD_SUBDIRECTORY(src/examples)
ENDIF(BUILD_EXAMPLES)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you disable this to save compilation time or because of errors?
I would prefer introducing a CMake build option for this.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As mentioned before, no issues was found. I agree with that suggestion.


IF(BUILD_TESTS)
ENDIF(BUILD_TESTS)
Expand Down
4 changes: 2 additions & 2 deletions packages/gpu_voxels/src/examples/RaycastingSensorExample.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,8 @@ int main(int argc, char* argv[])
for(size_t pos = 50; pos < 100; ++pos)
{
// We perform the insertion and the raycasting twice, so that in the visualizer we can display either all probabilistic voxels or only the occupied ones (without the free ones)
prob_map->insertSensorData(obstacle, Vector3f(pos, 2, pos/2.0), true, true, eBVM_OCCUPIED, rob_map->getDeviceDataPtr());
prob_map2->insertSensorData(obstacle, Vector3f(pos, 2, pos/2.0), true, false, eBVM_OCCUPIED, rob_map->getDeviceDataPtr());
prob_map->insertSensorData(obstacle, Vector3f(pos, 2, pos/2.0), true, true, eBVM_OCCUPIED, MAX_PROBABILITY, rob_map->getDeviceDataPtr());
prob_map2->insertSensorData(obstacle, Vector3f(pos, 2, pos/2.0), true, false, eBVM_OCCUPIED, MAX_PROBABILITY, rob_map->getDeviceDataPtr());
}

while(true)
Expand Down
32 changes: 32 additions & 0 deletions packages/gpu_voxels/src/gpu_voxels/helpers/PointCloud.cu
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include <gpu_voxels/logging/logging_gpu_voxels.h>
#include <gpu_voxels/helpers/kernels/HelperOperations.h>
#include <gpu_voxels/helpers/PointcloudFileHandler.h>
#include <sensor_msgs/point_cloud2_iterator.h>

namespace gpu_voxels
{
Expand Down Expand Up @@ -357,4 +358,35 @@ void PointCloud::print()
std::cout << std::endl << std::endl;
}

sensor_msgs::PointCloud2 PointCloud::getPointCloud2()
{
sensor_msgs::PointCloud2 pointcloud_msg;

Vector3f* tmp = this->getPoints();
size_t mPointCloudSize = this->getPointCloudSize();

pointcloud_msg.header.frame_id = "GPU_voxels";//voxel_point_cloud_frame; // use same reference as in transform_...
pointcloud_msg.header.stamp = ros::Time::now();
pointcloud_msg.height = 1;
pointcloud_msg.width = mPointCloudSize;
pointcloud_msg.row_step = pointcloud_msg.width * pointcloud_msg.point_step;

sensor_msgs::PointCloud2Modifier modifier(pointcloud_msg);
modifier.setPointCloud2FieldsByString(1, "xyz");

sensor_msgs::PointCloud2Iterator<float>iter_x(pointcloud_msg, "x");
sensor_msgs::PointCloud2Iterator<float>iter_y(pointcloud_msg, "y");
sensor_msgs::PointCloud2Iterator<float>iter_z(pointcloud_msg, "z");

for(size_t i=0; i<mPointCloudSize; i++)
{
*iter_x = tmp[i].x;
*iter_y = tmp[i].y;
*iter_z = tmp[i].z;

++iter_x; ++iter_y; ++iter_z;
}
return pointcloud_msg;
}

}// end namespace gpu_voxels
4 changes: 4 additions & 0 deletions packages/gpu_voxels/src/gpu_voxels/helpers/PointCloud.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
#include <gpu_voxels/helpers/cuda_handling.hpp>
#include <gpu_voxels/helpers/MathHelpers.h>

#include <sensor_msgs/PointCloud2.h>

namespace gpu_voxels
{

Expand Down Expand Up @@ -141,6 +143,8 @@ class PointCloud
//for testing
void print();

sensor_msgs::PointCloud2 getPointCloud2();

private:

//! Only allocates memory
Expand Down
18 changes: 18 additions & 0 deletions packages/gpu_voxels/src/gpu_voxels/helpers/cuda_vectors.h
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,24 @@ struct Vector3f
return *this;
}

__device__ __host__
inline Vector3f& operator*=(const float& b)
{
x *= b;
y *= b;
z *= b;
return *this;
}

__device__ __host__
inline Vector3f& operator/=(const float& b)
{
x /= b;
y /= b;
z /= b;
return *this;
}

__device__ __host__
inline bool operator==(const Vector3f& b) const
{
Expand Down
2 changes: 2 additions & 0 deletions packages/gpu_voxels/src/gpu_voxels/voxel/AbstractVoxel.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ class AbstractVoxel
__host__ __device__
bool isOccupied(float col_threshold) const;

public:

};

} // end of ns
Expand Down
3 changes: 3 additions & 0 deletions packages/gpu_voxels/src/gpu_voxels/voxel/DistanceVoxel.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ class DistanceVoxel //: public AbstractVoxel
__host__ __device__
const Vector3ui getObstacle() const;

__host__ __device__
const uint32_t getObstacleID() const;

/**
* @brief get squared distance (optimization: don't compute square root; distances are not accumulated during DVM computation)
*
Expand Down
5 changes: 5 additions & 0 deletions packages/gpu_voxels/src/gpu_voxels/voxel/DistanceVoxel.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ const Vector3ui DistanceVoxel::getObstacle() const {
return Vector3ui(x, y, z);
}

__host__ __device__
const uint32_t DistanceVoxel::getObstacleID() const {
return m_obstacle;
}

__host__ __device__
DistanceVoxel::pba_dist_t DistanceVoxel::squaredObstacleDistance(Vector3i this_position) const{
Vector3ui obstacle = getObstacle();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ void ProbabilisticVoxel::insert(const BitVoxelMeaning voxel_meaning)
break;
case eBVM_COLLISION :
case eBVM_OCCUPIED :
updateOccupancy(cSENSOR_MODEL_OCCUPIED);
updateOccupancy(cSENSOR_MODEL_OCCUPIED);
break;
case eBVM_UNKNOWN :
case eBVM_UNDEFINED :
Expand Down
7 changes: 6 additions & 1 deletion packages/gpu_voxels/src/gpu_voxels/voxelmap/ProbVoxelMap.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include <gpu_voxels/helpers/common_defines.h>
#include <gpu_voxels/helpers/cuda_datatypes.h>
#include <gpu_voxels/helpers/CollisionInterfaces.h>
#include <sensor_msgs/PointCloud2.h>

namespace gpu_voxels {
namespace voxelmap {
Expand All @@ -46,7 +47,7 @@ class ProbVoxelMap: public TemplateVoxelMap<ProbabilisticVoxel>,

template<std::size_t length>
void insertSensorData(const PointCloud &global_points, const Vector3f &sensor_pose, const bool enable_raycasting, const bool cut_real_robot,
const BitVoxelMeaning robot_voxel_meaning, BitVoxel<length>* robot_map = NULL);
const BitVoxelMeaning robot_voxel_meaning, const Probability prob, BitVoxel<length>* robot_map = NULL);

virtual bool insertMetaPointCloudWithSelfCollisionCheck(const MetaPointCloud *robot_links,
const std::vector<BitVoxelMeaning>& voxel_meanings = std::vector<BitVoxelMeaning>(),
Expand All @@ -61,6 +62,10 @@ class ProbVoxelMap: public TemplateVoxelMap<ProbabilisticVoxel>,

size_t collideWith(const voxelmap::BitVectorVoxelMap* map, float coll_threshold = 1.0, const Vector3i &offset = Vector3i());
size_t collideWith(const voxelmap::ProbVoxelMap* map, float coll_threshold = 1.0, const Vector3i &offset = Vector3i());

virtual void moveInto(ProbVoxelMap& dest, const Vector3f offset) const;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should Vector3f be a const-ref?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not that I'm disagreeing with you but, why not?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Assuming it's an Eigen type, it's recommended to pass by const-ref

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now I see what you were saying, I thought that '&' was there. You're right.

virtual void move(Voxel* dest_data, const Voxel* src_data, const Vector3f offset) const;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similarly here, should Vector3f a const-ref?

virtual void publishPointcloud(sensor_msgs::PointCloud2* pointcloud_msg, const float occupancyThreshold=0.5);
};

} // end of namespace
Expand Down
51 changes: 48 additions & 3 deletions packages/gpu_voxels/src/gpu_voxels/voxelmap/ProbVoxelMap.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <gpu_voxels/voxelmap/kernels/VoxelMapOperations.hpp>
#include <gpu_voxels/voxel/BitVoxel.hpp>
#include <gpu_voxels/voxel/ProbabilisticVoxel.hpp>
#include <gpu_voxels/helpers/PointCloud.h>

namespace gpu_voxels {
namespace voxelmap {
Expand All @@ -51,7 +52,7 @@ ProbVoxelMap::~ProbVoxelMap()

template<std::size_t length>
void ProbVoxelMap::insertSensorData(const PointCloud &global_points, const Vector3f &sensor_pose, const bool enable_raycasting,
const bool cut_real_robot, const BitVoxelMeaning robot_voxel_meaning,
const bool cut_real_robot, const BitVoxelMeaning robot_voxel_meaning, const Probability prob,
BitVoxel<length>* robot_map)
{
lock_guard guard(this->m_mutex);
Expand All @@ -63,19 +64,49 @@ void ProbVoxelMap::insertSensorData(const PointCloud &global_points, const Vecto
{
kernelInsertSensorData<<<m_blocks, m_threads>>>(
m_dev_data, m_voxelmap_size, m_dim, m_voxel_side_length, sensor_pose,
global_points.getConstDevicePointer(), global_points.getPointCloudSize(), cut_real_robot, robot_map, robot_voxel_meaning, RayCaster());
global_points.getConstDevicePointer(), global_points.getPointCloudSize(), cut_real_robot, robot_map, robot_voxel_meaning, prob, RayCaster());
CHECK_CUDA_ERROR();
}
else
{
kernelInsertSensorData<<<m_blocks, m_threads>>>(
m_dev_data, m_voxelmap_size, m_dim, m_voxel_side_length, sensor_pose,
global_points.getConstDevicePointer(), global_points.getPointCloudSize(), cut_real_robot, robot_map, robot_voxel_meaning, DummyRayCaster());
global_points.getConstDevicePointer(), global_points.getPointCloudSize(), cut_real_robot, robot_map, robot_voxel_meaning, prob, DummyRayCaster());
CHECK_CUDA_ERROR();
}
HANDLE_CUDA_ERROR(cudaDeviceSynchronize());
}

/**
* Convert a ProbVoxelMap as a pointcloud in ROS.
*
* In RViz: add the pointcloud, set render settings to Boxes, scale to voxel_side_length
*/
void ProbVoxelMap::publishPointcloud(sensor_msgs::PointCloud2* pointcloud_msg, const float occupancyThreshold)
{
Vector3f *m_points;
HANDLE_CUDA_ERROR( cudaMalloc((void** ) &m_points, sizeof(Vector3f)*(m_voxelmap_size-1) ));

size_t cloudSize = 0;
size_t *m_cloudSize;
HANDLE_CUDA_ERROR( cudaMalloc((void** ) &m_cloudSize, sizeof(size_t)));
HANDLE_CUDA_ERROR( cudaMemcpy(m_cloudSize, &cloudSize, sizeof(size_t), cudaMemcpyHostToDevice));

HANDLE_CUDA_ERROR( cudaDeviceSynchronize());
kernelGetProbabilisticPointCloud<<<m_blocks, m_threads>>>(this->m_dev_data, m_points, occupancyThreshold, m_voxelmap_size, m_voxel_side_length, m_dim, m_cloudSize);
HANDLE_CUDA_ERROR( cudaDeviceSynchronize());
HANDLE_CUDA_ERROR( cudaMemcpy(&cloudSize, m_cloudSize, sizeof(size_t), cudaMemcpyDeviceToHost));

Vector3f *points = new Vector3f[cloudSize];;
HANDLE_CUDA_ERROR( cudaMemcpy(points, m_points, sizeof(Vector3f)*cloudSize, cudaMemcpyDeviceToHost));
PointCloud pointcloud(points, cloudSize);

(*pointcloud_msg) = pointcloud.getPointCloud2();

HANDLE_CUDA_ERROR(cudaFree(m_points));
HANDLE_CUDA_ERROR(cudaFree(m_cloudSize));
}

bool ProbVoxelMap::insertMetaPointCloudWithSelfCollisionCheck(const MetaPointCloud *robot_links,
const std::vector<BitVoxelMeaning>& voxel_meanings,
const std::vector<BitVector<BIT_VECTOR_LENGTH> >& collision_masks,
Expand Down Expand Up @@ -108,6 +139,20 @@ size_t ProbVoxelMap::collideWith(const ProbVoxelMap *map, float coll_threshold,
return collisionCheckWithCounterRelativeTransform((TemplateVoxelMap*)map, collider, offset); //does the locking
}

void ProbVoxelMap::move(Voxel* dest_data, const Voxel* src_data, const Vector3f offset) const
{
HANDLE_CUDA_ERROR(cudaDeviceSynchronize());
kernelMoveMap<<<m_blocks, m_threads>>>(dest_data, src_data, m_voxelmap_size, m_voxel_side_length, this->m_dim, offset);
HANDLE_CUDA_ERROR(cudaDeviceSynchronize());
CHECK_CUDA_ERROR();
}

void ProbVoxelMap::moveInto(ProbVoxelMap& dest, const Vector3f offset) const
{
assert(this->m_dim == dest.m_dim);
move(dest.m_dev_data, this->m_dev_data, offset);
}

} // end of namespace
} // end of namespace

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ class TemplateVoxelMap : public AbstractVoxelMap

//! result array for collision check with counter on device
uint16_t* m_dev_collision_check_results_counter;

void erode(Voxel* d_dest_data, const Voxel* d_src_data, float erode_threshold, float occupied_threshold) const;

void insertDilatedCoordinateList(Voxel* d_dest_data, const Vector3ui* d_src_coordinates, uint32_t size, const BitVoxelMeaning voxel_meaning);
Expand Down
14 changes: 10 additions & 4 deletions packages/gpu_voxels/src/gpu_voxels/voxelmap/TemplateVoxelMap.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1050,6 +1050,12 @@ bool TemplateVoxelMap<Voxel>::merge(const GpuVoxelsMapSharedPtr other, const Vec
if (voxel_offset != Vector3i()) {
LOGGING_ERROR_C(VoxelmapLog, TemplateVoxelMap, "You tried to apply an offset while merging a VoxelList into a DistanceVoxelMap (not supported yet)!" << endl);
return false;

}

BitVoxelMeaning meaning = eBVM_OCCUPIED;
if (new_meaning != NULL) {
meaning = *new_meaning;
}

boost::lock(this->m_mutex, other->m_mutex);
Expand All @@ -1061,26 +1067,26 @@ bool TemplateVoxelMap<Voxel>::merge(const GpuVoxelsMapSharedPtr other, const Vec
case MT_BITVECTOR_VOXELLIST:
{
voxellist::TemplateVoxelList<BitVectorVoxel, MapVoxelID>* voxelList = other->as<voxellist::TemplateVoxelList<BitVectorVoxel, MapVoxelID> >();
insertCoordinateList(voxelList->getDeviceCoordPtr(), voxelList->m_dev_coord_list.size(), eBVM_OCCUPIED);
insertCoordinateList(voxelList->getDeviceCoordPtr(), voxelList->m_dev_coord_list.size(), meaning);
return true;
}

case MT_PROBAB_VOXELLIST:
{
voxellist::TemplateVoxelList<ProbabilisticVoxel, MapVoxelID>* voxelList = other->as<voxellist::TemplateVoxelList<ProbabilisticVoxel, MapVoxelID> >();
insertCoordinateList(voxelList->getDeviceCoordPtr(), voxelList->m_dev_coord_list.size(), eBVM_OCCUPIED);
insertCoordinateList(voxelList->getDeviceCoordPtr(), voxelList->m_dev_coord_list.size(), meaning);
return true;
}

case MT_COUNTING_VOXELLIST:
{
voxellist::TemplateVoxelList<CountingVoxel, MapVoxelID>* voxelList = other->as<voxellist::TemplateVoxelList<CountingVoxel, MapVoxelID> >();
insertCoordinateList(voxelList->getDeviceCoordPtr(), voxelList->m_dev_coord_list.size(), eBVM_OCCUPIED);
insertCoordinateList(voxelList->getDeviceCoordPtr(), voxelList->m_dev_coord_list.size(), meaning);
return true;
}

default:
LOGGING_ERROR_C(VoxelmapLog, TemplateVoxelMap, GPU_VOXELS_MAP_OPERATION_NOT_YET_SUPPORTED << endl);
LOGGING_ERROR_C(VoxelmapLog, TemplateVoxelMap, GPU_VOXELS_MAP_OPERATION_NOT_YET_SUPPORTED << " MapType: " << other->getMapType() << endl);
return false;
}
}
Expand Down
2 changes: 1 addition & 1 deletion packages/gpu_voxels/src/gpu_voxels/voxelmap/VoxelMap.cu
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ template uint32_t TemplateVoxelMap<ProbabilisticVoxel>::collisionCheckWithCounte
// ############################### ProbVoxelMap (inherits from TemplateVoxelMap) ######################################
// Explicitly instantiate template methods to enable GCC to link agains NVCC compiled objects
template void ProbVoxelMap::insertSensorData<BIT_VECTOR_LENGTH>(const PointCloud&, const Vector3f&, const bool, const bool,
const BitVoxelMeaning, BitVoxel<BIT_VECTOR_LENGTH>*);
const BitVoxelMeaning, const Probability, BitVoxel<BIT_VECTOR_LENGTH>*);



Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <gpu_voxels/voxel/BitVoxel.h>
#include <gpu_voxels/voxel/ProbabilisticVoxel.h>
#include <gpu_voxels/voxel/DistanceVoxel.h>
#include <gpu_voxels/helpers/PointCloud.h>

#include <thrust/transform.h>

Expand Down Expand Up @@ -389,7 +390,7 @@ __global__
void kernelInsertSensorData(ProbabilisticVoxel* voxelmap, const uint32_t voxelmap_size,
const Vector3ui dimensions, const float voxel_side_length, const Vector3f sensor_pose,
const Vector3f* sensor_data, const size_t num_points, const bool cut_real_robot,
BitVoxel<length>* robotmap, const uint32_t bit_index, RayCasting rayCaster);
BitVoxel<length>* robotmap, const uint32_t bit_index, const Probability prob, RayCasting rayCaster);

/*!
* Collide two voxel maps.
Expand Down Expand Up @@ -446,6 +447,13 @@ void kernelInsertDilatedCoordinateTuples(Voxel* voxelmap, const Vector3ui dimens
const Vector3ui *coordinates, const std::size_t sizePoints, const BitVoxelMeaning voxel_meaning,
bool *points_outside_map);

__global__
void kernelMoveMap(ProbabilisticVoxel* voxelmap_out, const ProbabilisticVoxel* voxelmap_in, const uint32_t voxelmap_size, const float voxel_side_length, const Vector3ui dimensions, const Vector3f offset);

__global__
void kernelGetProbabilisticPointCloud(const ProbabilisticVoxel* voxelmap, Vector3f* pointCloud, const float occupancyThreshold,
const uint32_t voxelmap_size, const float voxel_side_length, const Vector3ui dimensions, size_t *cloudSize);

template<class Voxel>
__global__
void kernelErode(Voxel* voxelmap_out, const Voxel* voxelmap_in, const Vector3ui dimensions, float occupied_threshold, float erode_threshold);
Expand Down
Loading