diff --git a/.gitignore b/.gitignore index e37fefa1..f75eb164 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ **/build +**/log +**/install # Prerequisites diff --git a/.gitmodules b/.gitmodules index bcdb5b96..7a35ef9c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,3 +2,6 @@ path = nvblox url = https://github.com/nvidia-isaac/nvblox.git branch = public +[submodule "cuda_image_convert"] + path = cuda_image_convert + url = git@github.com:nakai-omer/cuda_image_convert.git diff --git a/cuda_image_convert b/cuda_image_convert new file mode 160000 index 00000000..0eb656a8 --- /dev/null +++ b/cuda_image_convert @@ -0,0 +1 @@ +Subproject commit 0eb656a852a929f05bcd84a2de56ac65313d203d diff --git a/nvblox_ros/CMakeLists.txt b/nvblox_ros/CMakeLists.txt index 22680bc3..70706f14 100644 --- a/nvblox_ros/CMakeLists.txt +++ b/nvblox_ros/CMakeLists.txt @@ -38,6 +38,8 @@ find_package(libstatistics_collector REQUIRED) find_package(message_filters REQUIRED) find_package(Threads REQUIRED) find_package(nvblox REQUIRED) +find_package(glog REQUIRED) +find_package(cuda_image_convert REQUIRED) find_package(visualization_msgs REQUIRED) ######## @@ -57,7 +59,7 @@ add_library(${PROJECT_NAME}_lib SHARED src/lib/nvblox_node.cpp src/lib/qos.cpp ) -target_link_libraries(${PROJECT_NAME}_lib nvblox::nvblox_lib nvblox::nvblox_eigen pthread) +target_link_libraries(${PROJECT_NAME}_lib nvblox::nvblox_lib nvblox::nvblox_eigen pthread cuda_image_convert) ament_target_dependencies(${PROJECT_NAME}_lib nvblox sensor_msgs @@ -69,6 +71,7 @@ ament_target_dependencies(${PROJECT_NAME}_lib std_srvs tf2_ros message_filters + cuda_image_convert visualization_msgs ) target_include_directories(${PROJECT_NAME}_lib PUBLIC diff --git a/nvblox_ros/include/nvblox_ros/conversions.hpp b/nvblox_ros/include/nvblox_ros/conversions.hpp index 6a75e8a9..505a660e 100644 --- a/nvblox_ros/include/nvblox_ros/conversions.hpp +++ b/nvblox_ros/include/nvblox_ros/conversions.hpp @@ -22,9 +22,10 @@ #include #include #include +#include +#include #include - namespace nvblox { diff --git a/nvblox_ros/package.xml b/nvblox_ros/package.xml index 678d738d..70b1c3ba 100644 --- a/nvblox_ros/package.xml +++ b/nvblox_ros/package.xml @@ -17,12 +17,12 @@ license agreement from NVIDIA CORPORATION is strictly prohibited. NVBlox ROS2 interface Helen Oleynikova - Hemal Shah + Hemal Shah NVIDIA Isaac ROS Software License - https://developer.nvidia.com/isaac-ros-gems/ + https://developer.nvidia.com/isaac-ros-gems/ Helen Oleynikova Alexander Millane - + ament_cmake ament_cmake_auto @@ -37,6 +37,7 @@ license agreement from NVIDIA CORPORATION is strictly prohibited. tf2_ros message_filters nvblox + cuda_image_convert ament_lint_auto ament_lint_common diff --git a/nvblox_ros/src/lib/conversions.cpp b/nvblox_ros/src/lib/conversions.cpp index 260c6c23..ca73e332 100644 --- a/nvblox_ros/src/lib/conversions.cpp +++ b/nvblox_ros/src/lib/conversions.cpp @@ -40,14 +40,35 @@ bool RosConverter::colorImageFromImageMessage( { CHECK_NOTNULL(color_image); - // First check if we actually have a valid image here. + void* final_image = NULL; + if (image_msg->encoding != "rgb8") { - return false; + if(!cudaAllocMapped(&final_image, image_msg->width, image_msg->height, IMAGE_RGB8)) { + return false; + } + + auto input_format = imageFormatFromStr(image_msg->encoding.c_str()); + void* inputCPU = NULL; + void* inputGPU = NULL; + auto input_size = imageFormatSize(input_format, image_msg->width, image_msg->height); + + if (!cudaAllocMapped((void**)&inputCPU, (void**)&inputGPU, input_size)) { + return false; + } + + memcpy(inputCPU, image_msg->data.data(), input_size); + + if(CUDA_FAILED(cudaConvertColor(inputGPU, input_format, final_image, IMAGE_RGB8, image_msg->width, image_msg->height))) { + return false; + } + } + else { + final_image = const_cast(&image_msg->data[0]); } color_image->populateFromBuffer( image_msg->height, image_msg->width, - reinterpret_cast(&image_msg->data[0]), MemoryType::kDevice); + reinterpret_cast(final_image), MemoryType::kDevice); return true; }