Robotics StackExchange | Archived questions

ROS2 with openvr always fails

Hi, I'm porting robosavvy's vive_ros repo into ros2 and no matter what I do, every time I start a ROS2 node it always fails with error
[ros2run]: Aborted

I'm using Ubuntu 22.04, ROS2 Humble, openvr 1.23.7 cpp, and a NULL HMD
A very basic ROS2 node call with cause the failure:

 #include "rclcpp/rclcpp.hpp" 
 int main(int argc, char **argv) {
 rclcpp::init(argc, argv);
 auto node = std::make_shared<rclcpp::Node>("my_node_name");
 rclcpp::spin(node);
 rclcpp::shutdown();
 return 0; 
 }

And my CMakelist.txt is the following:

cmake_minimum_required(VERSION 3.5) project(vive_ros)

## set definition, path, compileflags add_definitions(-DLINUX -DLINUX64
-DPOSIX) set(OPENVR "$ENV{HOME}/libraries/openvr") add_definitions(-DOPENVR_PATH="${OPENVR}")
## for source code to get sample textures and shader files path set(THIRDPARTY_DIR ${OPENVR}/samples/thirdparty) set(SHARED_SRC_DIR ${OPENVR}/samples/shared) set(CMAKE_CXX_FLAGS         "${CMAKE_CXX_FLAGS} -std=c++17
-include ${SHARED_SRC_DIR}/compat.h") set(CMAKE_CXX_FLAGS_DEBUG   "${CMAKE_CXX_FLAGS_DEBUG} -Wall
-Wextra -pedantic -g") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")

## find openvr
find_library(OPENVR_LIBRARIES
  NAMES
    openvr_api
  PATHS
    ${OPENVR}/bin
    ${OPENVR}/lib
  PATH_SUFFIXES
    linux64
  NO_DEFAULT_PATH
  NO_CMAKE_FIND_ROOT_PATH
)
set(OPENVR_INCLUDE_DIR ${OPENVR}/headers ${OPENVR}/samples)

## find SDL
set(SDL_REQUIRED_LIBRARIES SDL2)
foreach(lib ${SDL_REQUIRED_LIBRARIES})
  find_library(${lib}_LIBRARY
    NAMES
      ${lib}
    PATHS
      ${THIRDPARTY_DIR}/sdl2-2.0.3/bin
    PATH_SUFFIXES
      linux64
    )
  list(APPEND SDL2_LIBRARIES ${${lib}_LIBRARY})
endforeach()
set(SDL2_INCLUDE_DIR ${THIRDPARTY_DIR}/sdl2-2.0.3/include)

## common src from openvr sample
file(GLOB SHARED_SRC_FILES
  ${SHARED_SRC_DIR}/*.cpp
  ${SHARED_SRC_DIR}/*.h
)

## find opengl (OpenGL specific)
find_package(OpenGL REQUIRED)
find_package(GLEW 1.11 REQUIRED)

## find vulkan (vulkan specific)
find_library(VULKAN_LIBRARY
  NAMES
    vulkan-1
    vulkan
  PATHS
    ${THIRDPARTY_DIR}/vulkan-1.0.49.0/lib
  PATH_SUFFIXES
    linux64
  NO_DEFAULT_PATH
)
set(VULKAN_INCLUDE_DIR ${THIRDPARTY_DIR}/vulkan-1.0.49.0/include)

## add include path
include_directories(
  ${SDL2_INCLUDE_DIR}
  ${OPENVR_INCLUDE_DIR}
  ${OPENGL_INCLUDE_DIR} ## (OpenGL specific)
  ${GLEW_INCLUDE_DIR} ## (OpenGL specific)
  ${VULKAN_INCLUDE_DIR} ## (Vulkan specific)
)

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(tf2 REQUIRED)
find_package(tf2_ros REQUIRED)
find_package(std_srvs REQUIRED)
find_package(std_msgs REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(cv_bridge REQUIRED)
find_package(image_transport REQUIRED)

set(CMAKE_BUILD_TYPE "Release")


include_directories(
 ./include
)

# VIVE node:
add_executable(minimal_controller_node
  ${SHARED_SRC_FILES}
  src/minimal_controller_node.cpp
  src/vr_interface.cpp
)

ament_target_dependencies(minimal_controller_node rclcpp std_srvs std_msgs cv_bridge image_transport geometry_msgs tf2 tf2_ros)

target_link_directories(minimal_controller_node PUBLIC ${OPENVR}/lib/linux64)


## link all
target_link_libraries(minimal_controller_node
  ${OPENGL_LIBRARIES} ## (OpenGL specific)
  ${GLEW_LIBRARIES} ## (OpenGL specific)
  ${VULKAN_LIBRARY} ## (Vulkan specific)
  ${SDL2_LIBRARIES}
  ${OPENVR_LIBRARIES}
  ${CMAKE_DL_LIBS}
  ${EXTRA_LIBS}
)

install(TARGETS
  minimal_controller_node
  DESTINATION lib/${PROJECT_NAME}
)

install(DIRECTORY launch
  DESTINATION share/${PROJECT_NAME}
)

ament_package()

Copy of my post on the openvr Github issues page:
https://github.com/ValveSoftware/openvr/issues/1744

Asked by buckley.toby on 2023-05-22 10:07:01 UTC

Comments

Answers