robot_cpp/include/robot/plugin_loader_helper.h
2026-01-31 17:20:07 +07:00

107 lines
3.2 KiB
C++

/*********************************************************************
*
* Software License Agreement (BSD License)
*
* Plugin Loader Helper for Boost.DLL
* Maps symbol names (export names) to library file paths
* Similar to plugins.xml but for boost::dll
*********************************************************************/
#ifndef ROBOT_PLUGIN_LOADER_HELPER_H_
#define ROBOT_PLUGIN_LOADER_HELPER_H_
#include <string>
#include <vector>
#include <map>
#include <yaml-cpp/yaml.h>
#include <filesystem>
#include <robot/robot.h>
namespace robot
{
/**
* @class PluginLoaderHelper
* @brief Helper class to find library paths from symbol names (export names)
*
* This class reads a YAML configuration file (similar to plugins.xml) that maps
* symbol names (export names used in BOOST_DLL_ALIAS) to library file paths.
*
* Usage:
* PluginLoaderHelper loader;
* std::string lib_path = loader.findLibraryPath("CustomPlanner");
* if (!lib_path.empty()) {
* // Use lib_path with boost::dll::import_alias
* }
*/
class PluginLoaderHelper
{
public:
/**
* @brief Constructor
*/
PluginLoaderHelper();
/**
* @brief Constructor
* @param nh NodeHandle to read parameters from
* @param config_namespace Namespace in NodeHandle where plugins are stored (default: root)
*/
PluginLoaderHelper(robot::NodeHandle nh, const std::string& config_namespace = "");
/**
* @brief Find library path from symbol name (export name)
* @param symbol_name The export name (e.g., "CustomPlanner", "PNKXLocalPlanner")
* @return Full path to the library file, or empty string if not found
*/
std::string findLibraryPath(const std::string& symbol_name);
/**
* @brief Check if a symbol is registered
* @param symbol_name The export name
* @return True if symbol is found in config
*/
bool hasSymbol(const std::string& symbol_name) const;
/**
* @brief Set NodeHandle and namespace for reading plugins
* @param nh NodeHandle to read parameters from
* @param config_namespace Namespace in NodeHandle where plugins are stored
*/
void setNodeHandle(robot::NodeHandle nh, const std::string& config_namespace = "");
/**
* @brief Get all registered symbol names
* @return Vector of all symbol names
*/
std::vector<std::string> getRegisteredSymbols() const;
/**
* @brief Get build directory (CMAKE_BINARY_DIR) at runtime
* @return Build directory path, or empty if not found
*/
static std::string getBuildDirectory();
/**
* @brief Get workspace path at runtime
* @return Workspace path (e.g., /home/robotics/AGV/Diff_Wheel_Prj/t800_v2_ws), or empty if not found
*/
static std::string getWorkspacePath();
private:
/**
* @brief Resolve library path (handle relative paths, search in search_paths)
* @param library_path Path from config (may be relative or absolute)
* @return Resolved absolute path, or empty if not found
*/
std::string resolveLibraryPath(const std::string& library_path) const;
robot::NodeHandle nh_; // NodeHandle to read parameters
std::string config_namespace_; // Namespace for plugins in NodeHandle
std::vector<std::string> search_paths_; // Search paths for libraries
};
} // namespace robot
#endif // ROBOT_PLUGIN_LOADER_HELPER_H_