contact_managers_plugin_factory.cpp
Go to the documentation of this file.
1 
29 #include <boost/algorithm/string.hpp>
31 
38 #include <boost_plugin_loader/plugin_loader.hpp>
39 #include <console_bridge/console.h>
40 
41 static const std::string TESSERACT_CONTACT_MANAGERS_PLUGIN_DIRECTORIES_ENV = "TESSERACT_CONTACT_MANAGERS_PLUGIN_"
42  "DIRECTORIES";
43 static const std::string TESSERACT_CONTACT_MANAGERS_PLUGINS_ENV = "TESSERACT_CONTACT_MANAGERS_PLUGINS";
44 
46 
47 namespace tesseract_collision
48 {
49 std::string DiscreteContactManagerFactory::getSection() { return "DiscColl"; }
50 
51 std::string ContinuousContactManagerFactory::getSection() { return "ContColl"; }
52 
54 {
57  plugin_loader_.search_paths.insert(TESSERACT_CONTACT_MANAGERS_PLUGIN_PATH);
58  boost::split(plugin_loader_.search_libraries,
59  TESSERACT_CONTACT_MANAGERS_PLUGINS,
60  boost::is_any_of(":"),
61  boost::token_compress_on);
62 }
63 
64 void ContactManagersPluginFactory::loadConfig(const YAML::Node& config)
65 {
66  if (const YAML::Node& plugin_info = config[ContactManagersPluginInfo::CONFIG_KEY])
67  {
68  auto cm_plugin_info = plugin_info.as<tesseract_common::ContactManagersPluginInfo>();
69  plugin_loader_.search_paths.insert(cm_plugin_info.search_paths.begin(), cm_plugin_info.search_paths.end());
70  plugin_loader_.search_libraries.insert(cm_plugin_info.search_libraries.begin(),
71  cm_plugin_info.search_libraries.end());
72  discrete_plugin_info_ = cm_plugin_info.discrete_plugin_infos;
73  continuous_plugin_info_ = cm_plugin_info.continuous_plugin_infos;
74  }
75 }
76 
78  const tesseract_common::ResourceLocator& locator)
80 {
81  config = tesseract_common::processYamlIncludeDirective(config, locator);
82  loadConfig(config);
83 }
84 
86  const tesseract_common::ResourceLocator& locator)
88 {
89  loadConfig(tesseract_common::loadYamlFile(config.string(), locator));
90 }
91 
93  const tesseract_common::ResourceLocator& locator)
95 {
97 }
98 
99 // This prevents it from being defined inline.
100 // If not the forward declare of PluginLoader cause compiler error.
102 
103 void ContactManagersPluginFactory::addSearchPath(const std::string& path) { plugin_loader_.search_paths.insert(path); }
104 
105 std::set<std::string> ContactManagersPluginFactory::getSearchPaths() const { return plugin_loader_.search_paths; }
106 
108 
109 void ContactManagersPluginFactory::addSearchLibrary(const std::string& library_name)
110 {
111  plugin_loader_.search_libraries.insert(library_name);
112 }
113 
115 {
116  return plugin_loader_.search_libraries;
117 }
118 
120 
122  tesseract_common::PluginInfo plugin_info)
123 {
124  discrete_plugin_info_.plugins[name] = std::move(plugin_info);
125 }
126 
128 {
129  return !discrete_plugin_info_.plugins.empty();
130 }
131 
133 {
135 }
136 
138 {
139  auto cm_it = discrete_plugin_info_.plugins.find(name);
140  if (cm_it == discrete_plugin_info_.plugins.end())
141  throw std::runtime_error("ContactManagersPluginFactory, tried to remove discrete contact manager '" + name +
142  "' that does not exist!");
143 
144  discrete_plugin_info_.plugins.erase(cm_it);
145 
148 }
149 
151 {
152  auto cm_it = discrete_plugin_info_.plugins.find(name);
153  if (cm_it == discrete_plugin_info_.plugins.end())
154  throw std::runtime_error("ContactManagersPluginFactory, tried to set default discrete contact manager '" + name +
155  "' that does not exist!");
156 
158 }
159 
161 {
162  if (discrete_plugin_info_.plugins.empty())
163  throw std::runtime_error("ContactManagersPluginFactory, tried to get default discrete contact manager but none "
164  "exist!");
165 
167  return discrete_plugin_info_.plugins.begin()->first;
168 
170 }
171 
173  tesseract_common::PluginInfo plugin_info)
174 {
175  continuous_plugin_info_.plugins[name] = std::move(plugin_info);
176 }
177 
179 {
180  return !continuous_plugin_info_.plugins.empty();
181 }
182 
184 {
186 }
187 
189 {
190  auto cm_it = continuous_plugin_info_.plugins.find(name);
191  if (cm_it == continuous_plugin_info_.plugins.end())
192  throw std::runtime_error("ContactManagersPluginFactory, tried to remove continuous contact manager '" + name +
193  "' that does not exist!");
194 
195  continuous_plugin_info_.plugins.erase(cm_it);
196 
199 }
200 
202 {
203  auto cm_it = continuous_plugin_info_.plugins.find(name);
204  if (cm_it == continuous_plugin_info_.plugins.end())
205  throw std::runtime_error("ContactManagersPluginFactory, tried to set default continuous contact manager '" + name +
206  "' that does not exist!");
207 
209 }
210 
212 {
213  if (continuous_plugin_info_.plugins.empty())
214  throw std::runtime_error("ContactManagersPluginFactory, tried to get default continuous contact manager but none "
215  "exist!");
216 
218  return continuous_plugin_info_.plugins.begin()->first;
219 
221 }
222 
223 std::unique_ptr<DiscreteContactManager>
225 {
226  auto cm_it = discrete_plugin_info_.plugins.find(name);
227  if (cm_it == discrete_plugin_info_.plugins.end())
228  {
229  CONSOLE_BRIDGE_logWarn("ContactManagersPluginFactory, tried to get discrete contact manager '%s' that does not "
230  "exist!",
231  name.c_str());
232  return nullptr;
233  }
234 
235  return createDiscreteContactManager(name, cm_it->second);
236 }
237 
238 std::unique_ptr<DiscreteContactManager>
240  const tesseract_common::PluginInfo& plugin_info) const
241 {
242  try
243  {
244  auto it = discrete_factories_.find(plugin_info.class_name);
245  if (it != discrete_factories_.end())
246  return it->second->create(name, plugin_info.config);
247 
248  auto plugin = plugin_loader_.createInstance<DiscreteContactManagerFactory>(plugin_info.class_name);
249  if (plugin == nullptr)
250  {
251  CONSOLE_BRIDGE_logWarn("Failed to load symbol '%s'", plugin_info.class_name.c_str());
252  return nullptr;
253  }
254  discrete_factories_[plugin_info.class_name] = plugin;
255  return plugin->create(name, plugin_info.config);
256  }
257  // LCOV_EXCL_START
258  catch (const std::exception&)
259  {
260  CONSOLE_BRIDGE_logWarn("Failed to load symbol '%s'", plugin_info.class_name.c_str());
261  return nullptr;
262  }
263  // LCOV_EXCL_STOP
264 }
265 
266 std::unique_ptr<ContinuousContactManager>
268 {
269  auto cm_it = continuous_plugin_info_.plugins.find(name);
270  if (cm_it == continuous_plugin_info_.plugins.end())
271  {
272  CONSOLE_BRIDGE_logWarn("ContactManagersPluginFactory, tried to get continuous contact manager '%s' that does not "
273  "exist!",
274  name.c_str());
275  return nullptr;
276  }
277 
278  return createContinuousContactManager(name, cm_it->second);
279 }
280 
281 std::unique_ptr<ContinuousContactManager>
283  const tesseract_common::PluginInfo& plugin_info) const
284 {
285  try
286  {
287  auto it = continuous_factories_.find(plugin_info.class_name);
288  if (it != continuous_factories_.end())
289  return it->second->create(name, plugin_info.config);
290 
291  auto plugin = plugin_loader_.createInstance<ContinuousContactManagerFactory>(plugin_info.class_name);
292  if (plugin == nullptr)
293  {
294  CONSOLE_BRIDGE_logWarn("Failed to load symbol '%s'", plugin_info.class_name.c_str());
295  return nullptr;
296  }
297  continuous_factories_[plugin_info.class_name] = plugin;
298  return plugin->create(name, plugin_info.config);
299  }
300  // LCOV_EXCL_START
301  catch (const std::exception&)
302  {
303  CONSOLE_BRIDGE_logWarn("Failed to load symbol '%s'", plugin_info.class_name.c_str());
304  return nullptr;
305  }
306  // LCOV_EXCL_STOP
307 }
308 
309 void ContactManagersPluginFactory::saveConfig(const std::filesystem::path& file_path) const
310 {
311  YAML::Node config = getConfig();
312  std::ofstream fout(file_path.string());
313  fout << config;
314 }
315 
317 {
319  cm_plugins.search_paths = plugin_loader_.search_paths;
320  cm_plugins.search_libraries = plugin_loader_.search_libraries;
323 
324  YAML::Node config;
325  config[ContactManagersPluginInfo::CONFIG_KEY] = cm_plugins;
326 
327  return config;
328 }
329 
330 } // namespace tesseract_collision
contact_managers_plugin_factory.h
Factory for loading contact managers as plugins.
tesseract_collision::ContactManagersPluginFactory::discrete_factories_
std::map< std::string, DiscreteContactManagerFactory::Ptr > discrete_factories_
Definition: contact_managers_plugin_factory.h:281
tesseract_collision::ContactManagersPluginFactory::createDiscreteContactManager
std::unique_ptr< DiscreteContactManager > createDiscreteContactManager(const std::string &name) const
Get discrete contact manager object given name.
Definition: contact_managers_plugin_factory.cpp:224
tesseract_common::processYamlIncludeDirective
YAML::Node processYamlIncludeDirective(const YAML::Node &node, const ResourceLocator &locator)
yaml_extenstions.h
tesseract_collision::ContactManagersPluginFactory::hasContinuousContactManagerPlugins
bool hasContinuousContactManagerPlugins() const
Check if it has continuous contact manager plugins.
Definition: contact_managers_plugin_factory.cpp:178
tesseract_collision::ContactManagersPluginFactory::saveConfig
void saveConfig(const std::filesystem::path &file_path) const
Save the plugin information to a yaml config file.
Definition: contact_managers_plugin_factory.cpp:309
resource_locator.h
tesseract_collision::ContactManagersPluginFactory::addSearchLibrary
void addSearchLibrary(const std::string &library_name)
Add a library to search for plugin name.
Definition: contact_managers_plugin_factory.cpp:109
tesseract_collision::ContactManagersPluginFactory::removeContinuousContactManagerPlugin
void removeContinuousContactManagerPlugin(const std::string &name)
Remove continuous contact manager plugin.
Definition: contact_managers_plugin_factory.cpp:188
tesseract_collision::DiscreteContactManagerFactory::getSection
static std::string getSection()
Definition: contact_managers_plugin_factory.cpp:49
tesseract_collision::ContactManagersPluginFactory::createContinuousContactManager
std::unique_ptr< ContinuousContactManager > createContinuousContactManager(const std::string &name) const
Get continuous contact manager object given name.
Definition: contact_managers_plugin_factory.cpp:267
discrete_contact_manager.h
This is the discrete contact manager base class.
tesseract_collision::DiscreteContactManagerFactory
Define a discrete contact manager plugin which the factory can create an instance.
Definition: contact_managers_plugin_factory.h:58
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
tesseract_collision::ContactManagersPluginFactory::getDefaultDiscreteContactManagerPlugin
std::string getDefaultDiscreteContactManagerPlugin() const
Get the default discrete contact manager.
Definition: contact_managers_plugin_factory.cpp:160
tesseract_collision::ContinuousContactManagerFactory::getSection
static std::string getSection()
Definition: contact_managers_plugin_factory.cpp:51
TESSERACT_CONTACT_MANAGERS_PLUGIN_DIRECTORIES_ENV
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH static const TESSERACT_COMMON_IGNORE_WARNINGS_POP std::string TESSERACT_CONTACT_MANAGERS_PLUGIN_DIRECTORIES_ENV
Definition: contact_managers_plugin_factory.cpp:41
tesseract_collision::ContactManagersPluginFactory::continuous_plugin_info_
tesseract_common::PluginInfoContainer continuous_plugin_info_
Definition: contact_managers_plugin_factory.h:284
tesseract_common::ContactManagersPluginInfo::discrete_plugin_infos
tesseract_common::PluginInfoContainer discrete_plugin_infos
tesseract_collision::ContactManagersPluginFactory::addSearchPath
void addSearchPath(const std::string &path)
Add location for the plugin loader to search.
Definition: contact_managers_plugin_factory.cpp:103
tesseract_common::ContactManagersPluginInfo::continuous_plugin_infos
tesseract_common::PluginInfoContainer continuous_plugin_infos
tesseract_common::PluginInfo::class_name
std::string class_name
name
std::string name
tesseract_collision::ContactManagersPluginFactory::getSearchLibraries
std::set< std::string > getSearchLibraries() const
Get the plugin search libraries.
Definition: contact_managers_plugin_factory.cpp:114
tesseract_collision::ContactManagersPluginFactory::setDefaultDiscreteContactManagerPlugin
void setDefaultDiscreteContactManagerPlugin(const std::string &name)
Set a default discrete contact manager.
Definition: contact_managers_plugin_factory.cpp:150
tesseract_collision::ContactManagersPluginFactory::loadConfig
void loadConfig(const YAML::Node &config)
Definition: contact_managers_plugin_factory.cpp:64
tesseract_collision::ContinuousContactManagerFactory
Define a continuous contact manager plugin which the factory can create an instance.
Definition: contact_managers_plugin_factory.h:79
tesseract_common::ContactManagersPluginInfo
tesseract_common::PluginInfo
tesseract_collision::ContactManagersPluginFactory::getContinuousContactManagerPlugins
tesseract_common::PluginInfoMap getContinuousContactManagerPlugins() const
Get the map of continuous contact manager plugin.
Definition: contact_managers_plugin_factory.cpp:183
tesseract_common::ResourceLocator
tesseract_common::loadYamlString
YAML::Node loadYamlString(const std::string &yaml_string, const ResourceLocator &locator)
tesseract_common::PluginInfoContainer::default_plugin
std::string default_plugin
tesseract_common::loadYamlFile
YAML::Node loadYamlFile(const std::string &file_path, const ResourceLocator &locator)
TESSERACT_COMMON_IGNORE_WARNINGS_POP
Definition: create_convex_hull.cpp:37
tesseract_collision::ContactManagersPluginFactory::getConfig
YAML::Node getConfig() const
Get the plugin information config as a yaml node.
Definition: contact_managers_plugin_factory.cpp:316
tesseract_common::PluginInfo::config
YAML::Node config
tesseract_collision::ContactManagersPluginFactory::hasDiscreteContactManagerPlugins
bool hasDiscreteContactManagerPlugins() const
Check if it has discrete contact manager plugins.
Definition: contact_managers_plugin_factory.cpp:127
tesseract_collision::ContactManagersPluginFactory::discrete_plugin_info_
tesseract_common::PluginInfoContainer discrete_plugin_info_
Definition: contact_managers_plugin_factory.h:283
tesseract_common::PluginInfoMap
std::map< std::string, PluginInfo > PluginInfoMap
tesseract_collision::ContactManagersPluginFactory::clearSearchLibraries
void clearSearchLibraries()
Clean the search libraries.
Definition: contact_managers_plugin_factory.cpp:119
TESSERACT_CONTACT_MANAGERS_PLUGINS_ENV
static const std::string TESSERACT_CONTACT_MANAGERS_PLUGINS_ENV
Definition: contact_managers_plugin_factory.cpp:43
tesseract_common::ContactManagersPluginInfo::search_libraries
std::set< std::string > search_libraries
tesseract_collision::ContactManagersPluginFactory::addContinuousContactManagerPlugin
void addContinuousContactManagerPlugin(const std::string &name, tesseract_common::PluginInfo plugin_info)
Add a continuous contact manager plugin.
Definition: contact_managers_plugin_factory.cpp:172
tesseract_collision::ContactManagersPluginFactory
Definition: contact_managers_plugin_factory.h:100
yaml_utils.h
tesseract_collision::ContactManagersPluginFactory::getDiscreteContactManagerPlugins
tesseract_common::PluginInfoMap getDiscreteContactManagerPlugins() const
Get the map of discrete contact manager plugin.
Definition: contact_managers_plugin_factory.cpp:132
tesseract_collision::ContactManagersPluginFactory::addDiscreteContactManagerPlugin
void addDiscreteContactManagerPlugin(const std::string &name, tesseract_common::PluginInfo plugin_info)
Add a discrete contact manager plugin.
Definition: contact_managers_plugin_factory.cpp:121
tesseract_collision::ContactManagersPluginFactory::plugin_loader_
boost_plugin_loader::PluginLoader plugin_loader_
Definition: contact_managers_plugin_factory.h:285
tesseract_collision
Definition: bullet_cast_bvh_manager.h:48
tesseract_collision::ContactManagersPluginFactory::getDefaultContinuousContactManagerPlugin
std::string getDefaultContinuousContactManagerPlugin() const
Get the default continuous contact manager.
Definition: contact_managers_plugin_factory.cpp:211
macros.h
tesseract_collision::ContactManagersPluginFactory::getSearchPaths
std::set< std::string > getSearchPaths() const
Get the plugin search paths.
Definition: contact_managers_plugin_factory.cpp:105
tesseract_common::PluginInfoContainer::plugins
PluginInfoMap plugins
tesseract_collision::ContactManagersPluginFactory::clearSearchPaths
void clearSearchPaths()
Clear the search paths.
Definition: contact_managers_plugin_factory.cpp:107
tesseract_collision::ContactManagersPluginFactory::continuous_factories_
std::map< std::string, ContinuousContactManagerFactory::Ptr > continuous_factories_
Definition: contact_managers_plugin_factory.h:282
tesseract_common::ContactManagersPluginInfo::search_paths
std::set< std::string > search_paths
tesseract_collision::ContactManagersPluginFactory::setDefaultContinuousContactManagerPlugin
void setDefaultContinuousContactManagerPlugin(const std::string &name)
Set a default continuous contact manager.
Definition: contact_managers_plugin_factory.cpp:201
tesseract_collision::ContactManagersPluginFactory::ContactManagersPluginFactory
ContactManagersPluginFactory()
Definition: contact_managers_plugin_factory.cpp:53
continuous_contact_manager.h
This is the continuous contact manager base class.
tesseract_collision::ContactManagersPluginFactory::removeDiscreteContactManagerPlugin
void removeDiscreteContactManagerPlugin(const std::string &name)
Remove discrete contact manager plugin.
Definition: contact_managers_plugin_factory.cpp:137
tesseract_collision::ContactManagersPluginFactory::~ContactManagersPluginFactory
~ContactManagersPluginFactory()


tesseract_collision
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:01:52