Skip to content

ROS-independent library for dynamic class (i.e. plugin) introspection and loading from runtime libraries

License

Notifications You must be signed in to change notification settings

ros/class_loader

Folders and files

NameName
Last commit message
Last commit date
Oct 27, 2015
Sep 29, 2012
Jan 16, 2023
Jan 16, 2023
Nov 27, 2023
Oct 23, 2015
Apr 26, 2024
Nov 27, 2023
Apr 27, 2020
May 22, 2020
Feb 18, 2020
Apr 6, 2021
Nov 25, 2020
Apr 8, 2020
Apr 26, 2024

Repository files navigation

class_loader

The class_loader package is a ROS-independent package for loading plugins during runtime and the foundation of the higher level ROS pluginlib library. class_loader utilizes the host operating system's runtime loader to open runtime libraries (e.g. .so/.dll/dylib files), introspect the library for exported plugin classes, and allows users to instantiate objects of said exported classes without the explicit declaration (i.e. header file) for those classes.

class_loader VS pluginlib

class_loader is used in the implementation of the higher-level ROS package pluginlib which is the encouraged method for loading plugins in the ROS ecosystem. You should use class_loader when creating plugins intended for non-ROS packages and pluginlib when exporting plugins to ROS packages.

Quality Declaration

This package claims to be in the Quality Level 1 category, see the Quality Declaration for more details.

Usage

The interface is provided through two classes, class_loader::ClassLoader and class_loader::MultiLibraryClassLoader. Both provide similar interfaces but the former only binds to a single runtime library whereas the latter can associate with multiple libraries. The typical workflow is as follows:

  • Include class_loader/class_loader.h in your source code
  • Instantiate a class_loader::ClassLoader object passing the path and name of the library to open
class_loader::ClassLoader loader("libMyLibrary.so");
  • Query the class for exported classes which have an interface defined by some base class (MyBase in the example)
   std::vector<std::string> classes = loader.getAvailableClasses<MyBase>()
  • Create/destroy objects of said exported classes
 for(unsigned int c = 0; c < classes.size(); ++c)
 {
   boost::shared_ptr<MyBase> plugin = loader.createInstance<MyBase>(classes[c]);
   plugin->someMethod();
   //'plugin' will automatically be deleted when it goes out of scope
 }
  • Destroy the ClassLoader object to shutdown the library.

Example: Basic Workflow for ClassLoader

#include <class_loader/class_loader.h>
#include "MyBase.h" //Defines class MyBase

int main()
{
  class_loader::ClassLoader loader("libMyLibrary.so");
  std::vector<std::string> classes = loader.getAvailableClasses<MyBase>();
  for(unsigned int c = 0; c < classes.size(); ++c)
  {
    boost::shared_ptr<MyBase> plugin = loader.createInstance<MyBase>(classes[c]);
    plugin->someMethod();
  }
}

Visit the class_loader API documentation for a complete list of its main components.

About

ROS-independent library for dynamic class (i.e. plugin) introspection and loading from runtime libraries

Resources

License

Stars

Watchers

Forks

Packages

No packages published