kinematics_plugin_factory.cpp
Go to the documentation of this file.
1 
28 #include <boost/algorithm/string.hpp>
30 
39 #include <boost_plugin_loader/plugin_loader.hpp>
40 #include <console_bridge/console.h>
41 #include <fstream>
42 
43 static const std::string TESSERACT_KINEMATICS_PLUGIN_DIRECTORIES_ENV = "TESSERACT_KINEMATICS_PLUGIN_DIRECTORIES";
44 static const std::string TESSERACT_KINEMATICS_PLUGINS_ENV = "TESSERACT_KINEMATICS_PLUGINS";
45 
47 
48 namespace tesseract_kinematics
49 {
50 std::string InvKinFactory::getSection() { return "InvKin"; }
51 
52 std::string FwdKinFactory::getSection() { return "FwdKin"; }
53 
55 {
56  plugin_loader_.search_libraries_env = TESSERACT_KINEMATICS_PLUGINS_ENV;
58  plugin_loader_.search_paths.insert(TESSERACT_KINEMATICS_PLUGIN_PATH);
59  boost::split(
60  plugin_loader_.search_libraries, TESSERACT_KINEMATICS_PLUGINS, boost::is_any_of(":"), boost::token_compress_on);
61 }
62 
63 void KinematicsPluginFactory::loadConfig(const YAML::Node& config)
64 {
65  if (const YAML::Node& plugin_info = config[KinematicsPluginInfo::CONFIG_KEY])
66  {
67  auto kin_plugin_info = plugin_info.as<tesseract_common::KinematicsPluginInfo>();
68  plugin_loader_.search_paths.insert(kin_plugin_info.search_paths.begin(), kin_plugin_info.search_paths.end());
69  plugin_loader_.search_libraries.insert(kin_plugin_info.search_libraries.begin(),
70  kin_plugin_info.search_libraries.end());
71  fwd_plugin_info_ = kin_plugin_info.fwd_plugin_infos;
72  inv_plugin_info_ = kin_plugin_info.inv_plugin_infos;
73  }
74 }
75 
78 {
79  config = tesseract_common::processYamlIncludeDirective(config, locator);
80  loadConfig(config);
81 }
82 
83 KinematicsPluginFactory::KinematicsPluginFactory(const std::filesystem::path& config,
84  const tesseract_common::ResourceLocator& locator)
86 {
87  loadConfig(tesseract_common::loadYamlFile(config.string(), locator));
88 }
89 
91  const tesseract_common::ResourceLocator& locator)
93 {
95 }
96 
97 // This prevents it from being defined inline.
98 // If not the forward declare of PluginLoader cause compiler error.
100 
101 void KinematicsPluginFactory::addSearchPath(const std::string& path) { plugin_loader_.search_paths.insert(path); }
102 
103 std::set<std::string> KinematicsPluginFactory::getSearchPaths() const { return plugin_loader_.search_paths; }
104 
105 void KinematicsPluginFactory::addSearchLibrary(const std::string& library_name)
106 {
107  plugin_loader_.search_libraries.insert(library_name);
108 }
109 
110 std::set<std::string> KinematicsPluginFactory::getSearchLibraries() const { return plugin_loader_.search_libraries; }
111 
112 void KinematicsPluginFactory::addFwdKinPlugin(const std::string& group_name,
113  const std::string& solver_name,
114  tesseract_common::PluginInfo plugin_info)
115 {
116  fwd_plugin_info_[group_name].plugins[solver_name] = std::move(plugin_info);
117 }
118 
119 std::map<std::string, tesseract_common::PluginInfoContainer> KinematicsPluginFactory::getFwdKinPlugins() const
120 {
121  return fwd_plugin_info_;
122 }
123 
124 void KinematicsPluginFactory::removeFwdKinPlugin(const std::string& group_name, const std::string& solver_name)
125 {
126  auto group_it = fwd_plugin_info_.find(group_name);
127  if (group_it == fwd_plugin_info_.end())
128  throw std::runtime_error("KinematicsPluginFactory, tried to removed fwd kin solver '" + solver_name +
129  "' for a group '" + group_name + "' that does not exist!");
130 
131  auto solver_it = group_it->second.plugins.find(solver_name);
132  if (solver_it == group_it->second.plugins.end())
133  throw std::runtime_error("KinematicsPluginFactory, tried to removed fwd kin solver '" + solver_name +
134  "' that does not exist for group '" + group_name + "'!");
135 
136  group_it->second.plugins.erase(solver_it);
137  if (group_it->second.plugins.empty())
138  fwd_plugin_info_.erase(group_it);
139 
140  if (group_it->second.default_plugin == solver_name)
141  group_it->second.default_plugin.clear();
142 }
143 
144 void KinematicsPluginFactory::setDefaultFwdKinPlugin(const std::string& group_name, const std::string& solver_name)
145 {
146  auto group_it = fwd_plugin_info_.find(group_name);
147  if (group_it == fwd_plugin_info_.end())
148  throw std::runtime_error("KinematicsPluginFactory, tried to set default fwd kin solver '" + solver_name +
149  "' for a group '" + group_name + "' that does not exist!");
150 
151  auto solver_it = group_it->second.plugins.find(solver_name);
152  if (solver_it == group_it->second.plugins.end())
153  throw std::runtime_error("KinematicsPluginFactory, tried to set default fwd kin solver '" + solver_name +
154  "' that does not exist for group '" + group_name + "'!");
155 
156  group_it->second.default_plugin = solver_name;
157 }
158 
159 std::string KinematicsPluginFactory::getDefaultFwdKinPlugin(const std::string& group_name) const
160 {
161  auto group_it = fwd_plugin_info_.find(group_name);
162  if (group_it == fwd_plugin_info_.end())
163  throw std::runtime_error("KinematicsPluginFactory, tried to get default fwd kin solver for a group '" + group_name +
164  "' that does not exist!");
165 
166  if (group_it->second.default_plugin.empty())
167  return group_it->second.plugins.begin()->first;
168 
169  return group_it->second.default_plugin;
170 }
171 
172 void KinematicsPluginFactory::addInvKinPlugin(const std::string& group_name,
173  const std::string& solver_name,
174  tesseract_common::PluginInfo plugin_info)
175 {
176  inv_plugin_info_[group_name].plugins[solver_name] = std::move(plugin_info);
177 }
178 
179 std::map<std::string, tesseract_common::PluginInfoContainer> KinematicsPluginFactory::getInvKinPlugins() const
180 {
181  return inv_plugin_info_;
182 }
183 
184 void KinematicsPluginFactory::removeInvKinPlugin(const std::string& group_name, const std::string& solver_name)
185 {
186  auto group_it = inv_plugin_info_.find(group_name);
187  if (group_it == inv_plugin_info_.end())
188  throw std::runtime_error("KinematicsPluginFactory, tried to removed inv kin solver '" + solver_name +
189  "' for a group '" + group_name + "' that does not exist!");
190 
191  auto solver_it = group_it->second.plugins.find(solver_name);
192  if (solver_it == group_it->second.plugins.end())
193  throw std::runtime_error("KinematicsPluginFactory, tried to removed inv kin solver '" + solver_name +
194  "' that does not exist for group '" + group_name + "'!");
195 
196  group_it->second.plugins.erase(solver_it);
197  if (group_it->second.plugins.empty())
198  inv_plugin_info_.erase(group_it);
199 
200  if (group_it->second.default_plugin == solver_name)
201  group_it->second.default_plugin.clear();
202 }
203 
204 void KinematicsPluginFactory::setDefaultInvKinPlugin(const std::string& group_name, const std::string& solver_name)
205 {
206  auto group_it = inv_plugin_info_.find(group_name);
207  if (group_it == inv_plugin_info_.end())
208  throw std::runtime_error("KinematicsPluginFactory, tried to set default inv kin solver '" + solver_name +
209  "' for a group '" + group_name + "' that does not exist!");
210 
211  auto solver_it = group_it->second.plugins.find(solver_name);
212  if (solver_it == group_it->second.plugins.end())
213  throw std::runtime_error("KinematicsPluginFactory, tried to set default inv kin solver '" + solver_name +
214  "' that does not exist for group '" + group_name + "'!");
215 
216  group_it->second.default_plugin = solver_name;
217 }
218 
219 std::string KinematicsPluginFactory::getDefaultInvKinPlugin(const std::string& group_name) const
220 {
221  auto group_it = inv_plugin_info_.find(group_name);
222  if (group_it == inv_plugin_info_.end())
223  throw std::runtime_error("KinematicsPluginFactory, tried to get default inv kin solver for a group '" + group_name +
224  "' that does not exist!");
225 
226  if (group_it->second.default_plugin.empty())
227  return group_it->second.plugins.begin()->first;
228 
229  return group_it->second.default_plugin;
230 }
231 
232 std::unique_ptr<ForwardKinematics>
233 KinematicsPluginFactory::createFwdKin(const std::string& group_name,
234  const std::string& solver_name,
235  const tesseract_scene_graph::SceneGraph& scene_graph,
236  const tesseract_scene_graph::SceneState& scene_state) const
237 {
238  auto group_it = fwd_plugin_info_.find(group_name);
239  if (group_it == fwd_plugin_info_.end())
240  {
241  CONSOLE_BRIDGE_logWarn("KinematicsPluginFactory, tried to get fwd kin solver '%s' for a group '%s' that does not "
242  "exist!",
243  solver_name.c_str(),
244  group_name.c_str());
245  return nullptr;
246  }
247 
248  auto solver_it = group_it->second.plugins.find(solver_name);
249  if (solver_it == group_it->second.plugins.end())
250  {
251  CONSOLE_BRIDGE_logWarn("KinematicsPluginFactory, tried to get fwd kin solver '%s' that does not exist for group "
252  "'%s'!",
253  solver_name.c_str(),
254  group_name.c_str());
255  return nullptr;
256  }
257 
258  return createFwdKin(solver_name, solver_it->second, scene_graph, scene_state);
259 }
260 
261 std::unique_ptr<ForwardKinematics>
262 KinematicsPluginFactory::createFwdKin(const std::string& solver_name,
263  const tesseract_common::PluginInfo& plugin_info,
264  const tesseract_scene_graph::SceneGraph& scene_graph,
265  const tesseract_scene_graph::SceneState& scene_state) const
266 {
267  try
268  {
269  auto it = fwd_kin_factories_.find(plugin_info.class_name);
270  if (it != fwd_kin_factories_.end())
271  return it->second->create(solver_name, scene_graph, scene_state, *this, plugin_info.config);
272 
273  auto plugin = plugin_loader_.createInstance<FwdKinFactory>(plugin_info.class_name);
274  if (plugin == nullptr)
275  {
276  CONSOLE_BRIDGE_logWarn("Failed to load symbol '%s'", plugin_info.class_name.c_str());
277  return nullptr;
278  }
279  fwd_kin_factories_[plugin_info.class_name] = plugin;
280  return plugin->create(solver_name, scene_graph, scene_state, *this, plugin_info.config);
281  }
282  catch (const std::exception&)
283  {
284  CONSOLE_BRIDGE_logWarn("Failed to load symbol '%s'", plugin_info.class_name.c_str());
285  return nullptr;
286  }
287 }
288 
289 std::unique_ptr<InverseKinematics>
290 KinematicsPluginFactory::createInvKin(const std::string& group_name,
291  const std::string& solver_name,
292  const tesseract_scene_graph::SceneGraph& scene_graph,
293  const tesseract_scene_graph::SceneState& scene_state) const
294 {
295  auto group_it = inv_plugin_info_.find(group_name);
296  if (group_it == inv_plugin_info_.end())
297  {
298  CONSOLE_BRIDGE_logWarn("KinematicsPluginFactory, tried to get inv kin solver '%s' for a group '%s' that does not "
299  "exist!",
300  solver_name.c_str(),
301  group_name.c_str());
302  return nullptr;
303  }
304 
305  auto solver_it = group_it->second.plugins.find(solver_name);
306  if (solver_it == group_it->second.plugins.end())
307  {
308  CONSOLE_BRIDGE_logWarn("KinematicsPluginFactory, tried to get inv kin solver '%s' that does not exist for group "
309  "'%s'!",
310  solver_name.c_str(),
311  group_name.c_str());
312  return nullptr;
313  }
314 
315  return createInvKin(solver_name, solver_it->second, scene_graph, scene_state);
316 }
317 
318 std::unique_ptr<InverseKinematics>
319 KinematicsPluginFactory::createInvKin(const std::string& solver_name,
320  const tesseract_common::PluginInfo& plugin_info,
321  const tesseract_scene_graph::SceneGraph& scene_graph,
322  const tesseract_scene_graph::SceneState& scene_state) const
323 {
324  try
325  {
326  auto it = inv_kin_factories_.find(plugin_info.class_name);
327  if (it != inv_kin_factories_.end())
328  return it->second->create(solver_name, scene_graph, scene_state, *this, plugin_info.config);
329 
330  auto plugin = plugin_loader_.createInstance<InvKinFactory>(plugin_info.class_name);
331  if (plugin == nullptr)
332  {
333  CONSOLE_BRIDGE_logWarn("Failed to load symbol '%s'", plugin_info.class_name.c_str());
334  return nullptr;
335  }
336  inv_kin_factories_[plugin_info.class_name] = plugin;
337  return plugin->create(solver_name, scene_graph, scene_state, *this, plugin_info.config);
338  }
339  catch (const std::exception& ex)
340  {
341  CONSOLE_BRIDGE_logWarn(ex.what());
342  return nullptr;
343  }
344 }
345 
346 void KinematicsPluginFactory::saveConfig(const std::filesystem::path& file_path) const
347 {
348  YAML::Node config = getConfig();
349  std::ofstream fout(file_path.string());
350  fout << config;
351 }
352 
354 {
355  tesseract_common::KinematicsPluginInfo kinematic_plugins;
356  kinematic_plugins.search_paths = plugin_loader_.search_paths;
357  kinematic_plugins.search_libraries = plugin_loader_.search_libraries;
358  kinematic_plugins.fwd_plugin_infos = fwd_plugin_info_;
359  kinematic_plugins.inv_plugin_infos = inv_plugin_info_;
360 
361  YAML::Node config;
362  config[KinematicsPluginInfo::CONFIG_KEY] = kinematic_plugins;
363 
364  return config;
365 }
366 
367 } // namespace tesseract_kinematics
tesseract_kinematics::KinematicsPluginFactory::saveConfig
void saveConfig(const std::filesystem::path &file_path) const
Save the plugin information to a yaml config file.
Definition: kinematics_plugin_factory.cpp:346
tesseract_common::processYamlIncludeDirective
YAML::Node processYamlIncludeDirective(const YAML::Node &node, const ResourceLocator &locator)
yaml_extenstions.h
graph.h
tesseract_kinematics::KinematicsPluginFactory::inv_kin_factories_
std::map< std::string, InvKinFactory::Ptr > inv_kin_factories_
Definition: kinematics_plugin_factory.h:306
tesseract_kinematics::InvKinFactory
Define a inverse kinematics plugin which the factory can create an instance.
Definition: kinematics_plugin_factory.h:61
tesseract_kinematics::KinematicsPluginFactory::fwd_kin_factories_
std::map< std::string, FwdKinFactory::Ptr > fwd_kin_factories_
Definition: kinematics_plugin_factory.h:305
TESSERACT_KINEMATICS_PLUGINS_ENV
static const std::string TESSERACT_KINEMATICS_PLUGINS_ENV
Definition: kinematics_plugin_factory.cpp:44
tesseract_kinematics::KinematicsPluginFactory::getDefaultFwdKinPlugin
std::string getDefaultFwdKinPlugin(const std::string &group_name) const
Get the default forward kinematics solver for a group.
Definition: kinematics_plugin_factory.cpp:159
tesseract_kinematics::KinematicsPluginFactory::getInvKinPlugins
std::map< std::string, tesseract_common::PluginInfoContainer > getInvKinPlugins() const
Get the map of inverse kinematic plugins.
Definition: kinematics_plugin_factory.cpp:179
tesseract_kinematics::KinematicsPluginFactory::addInvKinPlugin
void addInvKinPlugin(const std::string &group_name, const std::string &solver_name, tesseract_common::PluginInfo plugin_info)
Add a inverse kinematics plugin to the manager.
Definition: kinematics_plugin_factory.cpp:172
resource_locator.h
inverse_kinematics.h
Inverse kinematics functions.
tesseract_kinematics::KinematicsPluginFactory::getFwdKinPlugins
std::map< std::string, tesseract_common::PluginInfoContainer > getFwdKinPlugins() const
Get the map of forward kinematic plugins.
Definition: kinematics_plugin_factory.cpp:119
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
tesseract_kinematics::KinematicsPluginFactory::inv_plugin_info_
std::map< std::string, tesseract_common::PluginInfoContainer > inv_plugin_info_
Definition: kinematics_plugin_factory.h:308
tesseract_scene_graph::SceneGraph
tesseract_kinematics::FwdKinFactory
Define a forward kinematics plugin which the factory can create an instance.
Definition: kinematics_plugin_factory.h:89
tesseract_kinematics::KinematicsPluginFactory::~KinematicsPluginFactory
~KinematicsPluginFactory()
tesseract_kinematics::KinematicsPluginFactory::getSearchPaths
std::set< std::string > getSearchPaths() const
Get the plugin search paths.
Definition: kinematics_plugin_factory.cpp:103
tesseract_common::KinematicsPluginInfo::search_paths
std::set< std::string > search_paths
tesseract_scene_graph::SceneState
tesseract_kinematics::KinematicsPluginFactory::getDefaultInvKinPlugin
std::string getDefaultInvKinPlugin(const std::string &group_name) const
Get the default forward inverse solver for a group.
Definition: kinematics_plugin_factory.cpp:219
tesseract_common::PluginInfo::class_name
std::string class_name
tesseract_kinematics::InvKinFactory::getSection
static std::string getSection()
Definition: kinematics_plugin_factory.cpp:50
tesseract_common::KinematicsPluginInfo::inv_plugin_infos
std::map< std::string, tesseract_common::PluginInfoContainer > inv_plugin_infos
tesseract_common::PluginInfo
tesseract_kinematics::KinematicsPluginFactory::createInvKin
std::unique_ptr< InverseKinematics > createInvKin(const std::string &group_name, const std::string &solver_name, const tesseract_scene_graph::SceneGraph &scene_graph, const tesseract_scene_graph::SceneState &scene_state) const
Get inverse kinematics object given group name and solver name.
Definition: kinematics_plugin_factory.cpp:290
tesseract_kinematics::FwdKinFactory::getSection
static std::string getSection()
Definition: kinematics_plugin_factory.cpp:52
tesseract_kinematics::KinematicsPluginFactory::removeInvKinPlugin
void removeInvKinPlugin(const std::string &group_name, const std::string &solver_name)
remove inverse kinematics plugin from the manager
Definition: kinematics_plugin_factory.cpp:184
tesseract_common::ResourceLocator
tesseract_kinematics::KinematicsPluginFactory::addSearchLibrary
void addSearchLibrary(const std::string &library_name)
Add a library to search for plugin name.
Definition: kinematics_plugin_factory.cpp:105
tesseract_common::loadYamlString
YAML::Node loadYamlString(const std::string &yaml_string, const ResourceLocator &locator)
tesseract_common::KinematicsPluginInfo
tesseract_kinematics::KinematicsPluginFactory::addSearchPath
void addSearchPath(const std::string &path)
Add location for the plugin loader to search.
Definition: kinematics_plugin_factory.cpp:101
tesseract_kinematics::KinematicsPluginFactory::fwd_plugin_info_
std::map< std::string, tesseract_common::PluginInfoContainer > fwd_plugin_info_
Definition: kinematics_plugin_factory.h:307
tesseract_common::loadYamlFile
YAML::Node loadYamlFile(const std::string &file_path, const ResourceLocator &locator)
forward_kinematics.h
Forward kinematics functions.
tesseract_kinematics::KinematicsPluginFactory::removeFwdKinPlugin
void removeFwdKinPlugin(const std::string &group_name, const std::string &solver_name)
remove forward kinematics plugin from the manager
Definition: kinematics_plugin_factory.cpp:124
tesseract_common::PluginInfo::config
YAML::Node config
tesseract_common::KinematicsPluginInfo::fwd_plugin_infos
std::map< std::string, tesseract_common::PluginInfoContainer > fwd_plugin_infos
tesseract_kinematics::KinematicsPluginFactory::createFwdKin
std::unique_ptr< ForwardKinematics > createFwdKin(const std::string &group_name, const std::string &solver_name, const tesseract_scene_graph::SceneGraph &scene_graph, const tesseract_scene_graph::SceneState &scene_state) const
Get forward kinematics object given group name and solver name.
Definition: kinematics_plugin_factory.cpp:233
tesseract_kinematics::KinematicsPluginFactory::plugin_loader_
boost_plugin_loader::PluginLoader plugin_loader_
Definition: kinematics_plugin_factory.h:309
kinematics_plugin_factory.h
Kinematics Plugin Factory.
TESSERACT_COMMON_IGNORE_WARNINGS_POP
#define TESSERACT_COMMON_IGNORE_WARNINGS_POP
scene_state.h
TESSERACT_KINEMATICS_PLUGIN_DIRECTORIES_ENV
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH static const TESSERACT_COMMON_IGNORE_WARNINGS_POP std::string TESSERACT_KINEMATICS_PLUGIN_DIRECTORIES_ENV
Definition: kinematics_plugin_factory.cpp:43
tesseract_kinematics::KinematicsPluginFactory::setDefaultInvKinPlugin
void setDefaultInvKinPlugin(const std::string &group_name, const std::string &solver_name)
Set a groups default inverse kinematics solver.
Definition: kinematics_plugin_factory.cpp:204
yaml_utils.h
tesseract_kinematics::KinematicsPluginFactory::loadConfig
void loadConfig(const YAML::Node &config)
Definition: kinematics_plugin_factory.cpp:63
tesseract_kinematics
Definition: forward_kinematics.h:40
tesseract_kinematics::KinematicsPluginFactory::getConfig
YAML::Node getConfig() const
Get the plugin information config as a yaml node.
Definition: kinematics_plugin_factory.cpp:353
tesseract_kinematics::KinematicsPluginFactory::getSearchLibraries
std::set< std::string > getSearchLibraries() const
Get the plugin search libraries.
Definition: kinematics_plugin_factory.cpp:110
tesseract_kinematics::KinematicsPluginFactory::KinematicsPluginFactory
KinematicsPluginFactory()
Definition: kinematics_plugin_factory.cpp:54
macros.h
tesseract_kinematics::KinematicsPluginFactory
Definition: kinematics_plugin_factory.h:116
tesseract_kinematics::KinematicsPluginFactory::addFwdKinPlugin
void addFwdKinPlugin(const std::string &group_name, const std::string &solver_name, tesseract_common::PluginInfo plugin_info)
Add a forward kinematics plugin to the manager.
Definition: kinematics_plugin_factory.cpp:112
tesseract_kinematics::KinematicsPluginFactory::setDefaultFwdKinPlugin
void setDefaultFwdKinPlugin(const std::string &group_name, const std::string &solver_name)
Set a groups default forward kinematics solver.
Definition: kinematics_plugin_factory.cpp:144
tesseract_common::KinematicsPluginInfo::search_libraries
std::set< std::string > search_libraries


tesseract_kinematics
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:02:14