Add CUDA to ROS2 - Foxy

asked 2020-12-07 06:42:38 -0500

maze gravatar image

I'have sucess to add cuda functions into realsense package with dashing but now it's modern Cmake i'cant figure out how to do that in the same package...

Here are my files :

CMakeLists.txt

----------
    cmake_minimum_required(VERSION 3.5)
set(CMAKE_CUDA_COMPILER "/usr/local/cuda-10.2/bin/nvcc")
project(realsense_ros LANGUAGES CXX CUDA)

# Default to C99
if(NOT CMAKE_C_STANDARD)
  set(CMAKE_C_STANDARD 99)
endif()

# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 14)
endif()


# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclcpp_components REQUIRED)
find_package(nav_msgs REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(OpenCV REQUIRED)
find_package(tf2 REQUIRED)
find_package(tf2_ros REQUIRED)
find_package(realsense_msgs)

find_package(realsense2)
find_library(realsense2_LIBRARIES realsense2)
find_path(realsense2_INCLUDE_DIRS librealsense2/rs.hpp)


set(dependencies
  rclcpp
  rclcpp_components
  nav_msgs
  sensor_msgs
  tf2
  tf2_ros
  realsense2
  realsense_msgs
)

include_directories(
  ${CMAKE_CURRENT_SOURCE_DIR}/include
  ${realsense2_INCLUDE_DIRS}
)

set(node_plugins "")


add_library(cudalib SHARED
  src/cuda_processing.cu
  )
  set_target_properties(cudalib PROPERTIES CUDA_SEPARABLE_COMPILATION ON)

add_library(${PROJECT_NAME} SHARED
  src/rs_factory.cpp
  src/rs_d435.cpp
  src/rs_d435i.cpp
  src/rs_t265.cpp
) 

target_include_directories(${PROJECT_NAME} PUBLIC cudalib)

target_link_libraries(${PROJECT_NAME}
  ${realsense2_LIBRARIES}
  ${OpenCV_LIBRARIES}
  cudalib
)
ament_target_dependencies(${PROJECT_NAME} ${dependencies} )
rclcpp_components_register_nodes(${PROJECT_NAME} "realsense::RealSenseNodeFactory")
set(node_plugins "${node_plugins}realsense::RealSenseNodeFactory;$<TARGET_FILE:${PROJECT_NAME}>\n")
file(GENERATE
  OUTPUT
  "${CMAKE_CURRENT_BINARY_DIR}/test_ament_index/$<CONFIG>/share/ament_index/resource_index/node_plugin/${PROJECT_NAME}"
  CONTENT "${node_plugins}")
install(TARGETS ${PROJECT_NAME}
  ARCHIVE DESTINATION lib
  LIBRARY DESTINATION lib
  RUNTIME DESTINATION bin
)
install(
  DIRECTORY include/
  DESTINATION include
)



ament_export_include_directories(include)
ament_export_libraries(${PROJECT_NAME})

ament_package()

----------

cuda_processing.cu

#include <stdio.h>
#include <cuda.h>
#include <cuda_runtime.h>

void __global__ cuda_postprocess_Realsense_TransformData(float *cuda_points_array_ptr_x,
                        float *cuda_points_array_ptr_y,
                        float *cuda_points_array_ptr_z,

                        float *cuda_outputTable_dist,

                        int cuda_Width,
                        int cuda_Height,

                        float teta_angle
                        )
{
// some code
}


void calculateData( float* points_array_ptr_x,
                    float* points_array_ptr_y,
                    float* points_array_ptr_z,

                    float* CPU_camera_outputTable_dist,

                    int _width,
                    int _height,

                    float teta_angle                                
                    )
{
    // Some code
}

rs_d435.cpp

#include <opencv2/opencv.hpp>
#include <memory>
#include <utility>
#include <vector>
#include "sensor_msgs/point_cloud2_iterator.hpp"
#include "realsense/rs_d435.hpp"


float* points_array_ptr_x = new float[1280 * 720 +1280]  ;
float* points_array_ptr_y = new float[1280 * 720 +1280]  ;
float* points_array_ptr_z = new float[1280 * 720 +1280]  ;

float* CPU_camera_outputTable_dist = new float[1280];

bool enable_laserscan = true ;                   

 void calculateData(    float* points_array_ptr_x,
                      float* points_array_ptr_y,
                      float* points_array_ptr_z,

                      float* CPU_camera_outputTable_dist,

                      int _width,
                      int _height,

                      float teta_angle                              
                      );

// rs_d435.cpp code with a call to calculateData on one function

I can compile it but when i launch : ros2 launch realsense_examples rs_camera.launch.py

I'have this error :

ros2_ws/install/realsense_ros/lib/librealsense_ros.so: undefined symbol: _ZTIN9realsense13RealSenseBaseE

This is like the cuda file is compile with cxx and not nvcc

edit retag flag offensive close merge delete