Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ROS2] Loading plugins from a non-ROS package #161

Open
schornakj opened this issue Jul 22, 2019 · 1 comment
Open

[ROS2] Loading plugins from a non-ROS package #161

schornakj opened this issue Jul 22, 2019 · 1 comment

Comments

@schornakj
Copy link

In ROS 1, the paths to all packages used in the project workspace are added to the ROS_PACKAGE_PATH environment variable, including pure CMake packages. This allows pluginlib to find libraries defined in non-ROS libraries, since the ROS 1 implementation of ClassLoader uses ros::package::path().

However, in ROS 2 there are different environment variables for CMAKE_PREFIX_PATH and AMENT_PREFIX_PATH. The first one contains all CMake packages used in my project, while the second one is a subset of the first only containing ament CMake packages. The ROS 2 implementation of ClassLoader uses ament_index_cpp::get_package_prefix(), which apparently only looks for packages in AMENT_PREFIX_PATH. This means that (so far) I can no longer load libraries defined in non-ROS packages.

The Tesseract motion planning pipeline is an example of something affected by this difference in behavior. The tesseract_plugins package defines several plugins which use libraries created by the ROS-agnostic tesseract_collision package, and these plugins are loaded at runtime by classes in the tesseract_monitoring ROS package. This works just fine in ROS 1 but in my ROS 2 port I get errors like:

[my_project_planning_manager_node-1] terminate called after throwing an instance of 'pluginlib::ClassLoaderException'
[my_project_planning_manager_node-1]   what():  package 'tesseract_collision' not found, searching: [/home/joe/workspaces/ros2_ws/install/xacro, /home/joe/workspaces/ros2_ws/install/opencv_tests, /home/joe/workspaces/ros2_ws/install/joint_state_publisher, /home/joe/workspaces/ros2_ws/install/vision_opencv, /home/joe/workspaces/ros2_ws/install/my_project_planning, /home/joe/workspaces/ros2_ws/install/tesseract_monitoring, /home/joe/workspaces/ros2_ws/install/tesseract_rosutils, /home/joe/workspaces/ros2_ws/install/tesseract_plugins, /home/joe/workspaces/ros2_ws/install/tesseract_msgs, /home/joe/workspaces/ros2_ws/install/srdfdom, /home/joe/workspaces/ros2_ws/install/robot_state_publisher, /home/joe/workspaces/ros2_ws/install/rct_ros_tools, /home/joe/workspaces/ros2_ws/install/rct_image_tools, /home/joe/workspaces/ros2_ws/install/rct_optimizations, /home/joe/workspaces/ros2_ws/install/octomap_msgs, /home/joe/workspaces/ros2_ws/install/mutable_transform_publisher, /home/joe/workspaces/ros2_ws/install/mutable_transform_publisher_msgs, /home/joe/workspaces/ros2_ws/install/image_geometry, /home/joe/workspaces/ros2_ws/install/cv_bridge, /opt/ros/dashing]

Any thoughts? I'd be open to package configuration workarounds on my end as well.

(pinging @Levi-Armstrong as the Tesseract package maintainer)

@schornakj
Copy link
Author

schornakj commented Jul 23, 2019

A slightly messy workaround is to manually append the non-ROS package containing the libraries I want to load to the AMENT_PREFIX_PATH environment variable, since ament_index_cpp::get_resource() uses this variable to populate its search paths (via ament_index_cpp::get_search_paths()).

edit: It also looks for an empty file with the same name as the package at a specific path within the package install directory: ros2_ws/install/tesseract_collision/share/ament_index/resource_index/packages/tesseract_collision

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant