Robotics StackExchange | Archived questions

polygon_plugin tutorial

Hi there, I'm looking for some clarification: After following the plugin tutorial I'm ending up with this error:

[ERROR] [1497996344.648813880]: Skipping XML Document "$/home/carson/catkin_ws/src/pluginlib_tutorials_/src/polygon_plugins.xml" which had no Root Element.  This likely means the XML is malformed or missing.

[ERROR] [1497996344.648951692]: The plugin failed to load for some reason. Error: According to the loaded plugin descriptions the class polygon_plugins::Triangle with base class type polygon_base::RegularPolygon does not exist.

The difficulty seems to be when working with the polygon_plugins.xml file (which seems to have some inconsistent text), ie where does it go, and which part of the tutorial should be in it.

Currently it looks like the example plugin xml before the writer looks deeper at the code, when some of the text starts to change.

Thanks in advance

Asked by crvogt on 2017-06-20 18:18:22 UTC

Comments

Your post is missing the error.

Asked by Geoff on 2017-06-20 19:04:32 UTC

Thanks for the note. It showed up in the preview

Asked by crvogt on 2017-06-20 19:07:36 UTC

Can you post that source file (polygon_plugins.xml) as well?

Asked by Geoff on 2017-06-20 19:09:08 UTC

@crvogt: for console copy-pastes you'll need to use the Preformatted Text button (the one with 101010 on it). Otherwise things like [ERROR] will get filtered out of the HTML rendering.

Asked by gvdhoorn on 2017-06-21 01:56:07 UTC

Answers

Be sure to not miss in your "polygon_plugins" CMakeLists the line

pluginlib_export_plugin_description_file(polygon_base plugins.xml)

The entire CMakeLists must be

    cmake_minimum_required(VERSION 3.5)
project(polygon_plugins)

# 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()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(ament_cmake_ros REQUIRED)
find_package(polygon_base REQUIRED)
find_package(pluginlib REQUIRED)

add_library(polygon_plugins src/polygon_plugins.cpp)
target_include_directories(polygon_plugins PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>)
ament_target_dependencies(
  polygon_plugins
  "polygon_base"
  "pluginlib"
)

pluginlib_export_plugin_description_file(polygon_base plugins.xml)

# Causes the visibility macros to use dllexport rather than dllimport,
# which is appropriate when building the dll but not consuming it.
target_compile_definitions(polygon_plugins PRIVATE "POLYGON_PLUGINS_BUILDING_LIBRARY")

install(
  DIRECTORY include/
  DESTINATION include
)
install(
  TARGETS polygon_plugins
  EXPORT export_${PROJECT_NAME}
  ARCHIVE DESTINATION lib
  LIBRARY DESTINATION lib
  RUNTIME DESTINATION bin
)

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # uncomment the line when a copyright and license is not present in all source files
  #set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # uncomment the line when this package is not in a git repo
  #set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

ament_export_include_directories(
  include
)
ament_export_libraries(
  polygon_plugins
)
ament_export_targets(
  export_${PROJECT_NAME}
)

ament_package()

Hope it helps

Asked by dottant on 2022-04-13 11:22:53 UTC

Comments