Add CUDA to ROS2 - Foxy
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 realsenseexamples rscamera.launch.py
I'have this error :
ros2ws/install/realsenseros/lib/librealsense_ros.so: undefined symbol: _ZTIN9realsense13RealSenseBaseE
This is like the cuda file is compile with cxx and not nvcc
Asked by maze on 2020-12-07 07:42:38 UTC
Comments