kinematics_factory_unit.cpp
Go to the documentation of this file.
1 
28 #include <gtest/gtest.h>
29 #include <fstream>
31 
32 #include "kinematics_test_utils.h"
37 
38 using namespace tesseract_kinematics::test_suite;
39 using namespace tesseract_kinematics;
40 
41 void runKinematicsFactoryTest(const std::filesystem::path& config_path)
42 {
45  tesseract_scene_graph::KDLStateSolver iiwa_state_solver(*iiwa_scene_graph);
46  tesseract_scene_graph::SceneState iiwa_scene_state = iiwa_state_solver.getState();
47 
49  tesseract_scene_graph::KDLStateSolver abb_state_solver(*abb_scene_graph);
50  tesseract_scene_graph::SceneState abb_scene_state = abb_state_solver.getState();
51 
52  tesseract_scene_graph::SceneGraph::UPtr ur_scene_graph = getSceneGraphUR(UR10Parameters, 0.220941, -0.1719);
53  tesseract_scene_graph::KDLStateSolver ur_state_solver(*ur_scene_graph);
54  tesseract_scene_graph::SceneState ur_scene_state = ur_state_solver.getState();
55 
57  tesseract_scene_graph::KDLStateSolver rop_state_solver(*rop_scene_graph);
58  tesseract_scene_graph::SceneState rop_scene_state = rop_state_solver.getState();
59 
61  tesseract_scene_graph::KDLStateSolver rep_state_solver(*rep_scene_graph);
62  tesseract_scene_graph::SceneState rep_scene_state = rep_state_solver.getState();
63 
64  KinematicsPluginFactory factory(config_path, locator);
65  YAML::Node plugin_config = tesseract_common::loadYamlFile(config_path.string(), locator);
66 
67  const YAML::Node& plugin_info = plugin_config["kinematic_plugins"];
68  const YAML::Node& search_paths = plugin_info["search_paths"];
69  const YAML::Node& search_libraries = plugin_info["search_libraries"];
70  const YAML::Node& fwd_kin_plugins = plugin_info["fwd_kin_plugins"];
71  const YAML::Node& inv_kin_plugins = plugin_info["inv_kin_plugins"];
72 
73  {
74  std::set<std::string> sp = factory.getSearchPaths();
75  EXPECT_EQ(sp.size(), 2);
76 
77  for (auto it = search_paths.begin(); it != search_paths.end(); ++it)
78  {
79  EXPECT_TRUE(sp.find(it->as<std::string>()) != sp.end());
80  }
81  }
82 
83  {
84  std::set<std::string> sl = factory.getSearchLibraries();
85  EXPECT_EQ(sl.size(), 4);
86 
87  for (auto it = search_libraries.begin(); it != search_libraries.end(); ++it)
88  {
89  EXPECT_TRUE(sl.find(it->as<std::string>()) != sl.end());
90  }
91  }
92 
93  EXPECT_EQ(fwd_kin_plugins.size(), 1);
94  for (auto group_it = fwd_kin_plugins.begin(); group_it != fwd_kin_plugins.end(); ++group_it)
95  {
96  auto group_name = group_it->first.as<std::string>();
97  auto plugins = group_it->second["plugins"];
98  for (auto solver_it = plugins.begin(); solver_it != plugins.end(); ++solver_it)
99  {
100  const YAML::Node& plugin = solver_it->second;
101  auto solver_name = solver_it->first.as<std::string>();
102 
104  info.class_name = plugin["class"].as<std::string>();
105  info.config = plugin["config"];
106 
108  if (group_name == "iiwa_manipulator")
109  kin = factory.createFwdKin(group_name, solver_name, *iiwa_scene_graph, iiwa_scene_state);
110  else if (group_name == "abb_manipulator")
111  kin = factory.createFwdKin(group_name, solver_name, *abb_scene_graph, abb_scene_state);
112  else if (group_name == "ur_manipulator")
113  kin = factory.createFwdKin(group_name, solver_name, *ur_scene_graph, ur_scene_state);
114 
115  EXPECT_TRUE(kin != nullptr);
116  }
117  }
118 
119  EXPECT_EQ(inv_kin_plugins.size(), 5);
120  for (auto group_it = inv_kin_plugins.begin(); group_it != inv_kin_plugins.end(); ++group_it)
121  {
122  auto group_name = group_it->first.as<std::string>();
123  auto plugins = group_it->second["plugins"];
124  for (auto solver_it = plugins.begin(); solver_it != plugins.end(); ++solver_it)
125  {
126  const YAML::Node& plugin = solver_it->second;
127  auto solver_name = solver_it->first.as<std::string>();
128 
130  info.class_name = plugin["class"].as<std::string>();
131  info.config = plugin["config"];
132 
134  if (group_name == "iiwa_manipulator")
135  kin = factory.createInvKin(group_name, solver_name, *iiwa_scene_graph, iiwa_scene_state);
136  else if (group_name == "abb_manipulator")
137  kin = factory.createInvKin(group_name, solver_name, *abb_scene_graph, abb_scene_state);
138  else if (group_name == "ur_manipulator")
139  kin = factory.createInvKin(group_name, solver_name, *ur_scene_graph, ur_scene_state);
140  else if (group_name == "rop_manipulator")
141  kin = factory.createInvKin(group_name, solver_name, *rop_scene_graph, rop_scene_state);
142  else if (group_name == "rep_manipulator")
143  kin = factory.createInvKin(group_name, solver_name, *rep_scene_graph, rep_scene_state);
144 
145  EXPECT_TRUE(kin != nullptr);
146  }
147  }
148 
149  factory.saveConfig(std::filesystem::path(tesseract_common::getTempPath()) / "kinematic_plugins_export.yaml");
150 }
151 
152 TEST(TesseractKinematicsFactoryUnit, KDL_OPW_UR_ROP_REP_PluginTest) // NOLINT
153 {
154  std::filesystem::path file_path(__FILE__);
155  std::filesystem::path config_path = file_path.parent_path() / "kinematic_plugins.yaml";
156  runKinematicsFactoryTest(config_path);
157 
158  std::filesystem::path export_config_path = std::filesystem::path(tesseract_common::getTempPath()) / "kinema"
159  "tic_"
160  "plugin"
161  "s_"
162  "export"
163  ".yaml";
164  runKinematicsFactoryTest(export_config_path);
165 }
166 
167 TEST(TesseractKinematicsFactoryUnit, PluginFactorAPIUnit) // NOLINT
168 {
171  tesseract_scene_graph::KDLStateSolver state_solver(*scene_graph);
172  tesseract_scene_graph::SceneState scene_state = state_solver.getState();
173 
174  KinematicsPluginFactory factory;
175  EXPECT_FALSE(factory.getSearchPaths().empty());
176  EXPECT_EQ(factory.getSearchPaths().size(), 1);
177  EXPECT_FALSE(factory.getSearchLibraries().empty());
178  EXPECT_EQ(factory.getSearchLibraries().size(), 4);
179  EXPECT_EQ(factory.getFwdKinPlugins().size(), 0);
180  EXPECT_EQ(factory.getInvKinPlugins().size(), 0);
181 
182  factory.addSearchPath("/usr/local/lib");
183  EXPECT_EQ(factory.getSearchPaths().size(), 2);
184  EXPECT_EQ(factory.getSearchLibraries().size(), 4);
185 
186  factory.addSearchLibrary("tesseract_collision");
187  EXPECT_EQ(factory.getSearchPaths().size(), 2);
188  EXPECT_EQ(factory.getSearchLibraries().size(), 5);
189 
190  {
191  std::map<std::string, tesseract_common::PluginInfoContainer> map = factory.getFwdKinPlugins();
192  EXPECT_TRUE(map.find("manipulator") == map.end());
193 
195  pi.class_name = "KDLFwdKin";
196  factory.addFwdKinPlugin("manipulator", "KDLFwdKin", pi);
197  EXPECT_EQ(factory.getFwdKinPlugins().size(), 1);
198 
199  map = factory.getFwdKinPlugins();
200  EXPECT_TRUE(map.find("manipulator") != map.end());
201  EXPECT_TRUE(map.at("manipulator").plugins.find("KDLFwdKin") != map.at("manipulator").plugins.end());
202  EXPECT_EQ(map.find("manipulator")->second.plugins.size(), 1);
203  EXPECT_EQ(factory.getDefaultFwdKinPlugin("manipulator"), "KDLFwdKin");
204 
206  pi2.class_name = "KDLFwdKin";
207  factory.addFwdKinPlugin("manipulator", "default", pi2);
208  EXPECT_EQ(factory.getFwdKinPlugins().size(), 1);
209 
210  map = factory.getFwdKinPlugins();
211  EXPECT_TRUE(map.find("manipulator") != map.end());
212  EXPECT_TRUE(map.at("manipulator").plugins.find("default") != map.at("manipulator").plugins.end());
213  EXPECT_EQ(map.find("manipulator")->second.plugins.size(), 2);
214  EXPECT_EQ(factory.getDefaultFwdKinPlugin("manipulator"), "KDLFwdKin");
215  factory.setDefaultFwdKinPlugin("manipulator", "default");
216  EXPECT_EQ(factory.getDefaultFwdKinPlugin("manipulator"), "default");
217 
218  EXPECT_ANY_THROW(factory.setDefaultFwdKinPlugin("group_does_not_exist", "default")); // NOLINT
219  EXPECT_ANY_THROW(factory.setDefaultFwdKinPlugin("manipulator", "solver_does_not_exist")); // NOLINT
220  EXPECT_ANY_THROW(factory.removeFwdKinPlugin(
221  "group_does_not_exist",
222  "default")); // NOLINTEXPECT_ANY_THROW(factory.removeFwdKinPlugin("group_does_not_exist",
223  // "default")); // NOLINT
224  EXPECT_ANY_THROW(factory.removeFwdKinPlugin("manipulator", "solver_does_not_exist")); // NOLINT
225  EXPECT_TRUE(factory.createFwdKin("group_does_not_exist", "default", *scene_graph, scene_state) == nullptr);
226  EXPECT_TRUE(factory.createFwdKin("manipulator", "solver_does_not_exist", *scene_graph, scene_state) == nullptr);
227 
228  factory.removeFwdKinPlugin("manipulator", "default");
229 
230  map = factory.getFwdKinPlugins();
231  EXPECT_TRUE(map.find("manipulator") != map.end());
232  EXPECT_EQ(factory.getFwdKinPlugins().size(), 1);
233  EXPECT_EQ(map.find("manipulator")->second.plugins.size(), 1);
234  // The default was removed so it should now be the first solver
235  EXPECT_EQ(factory.getDefaultFwdKinPlugin("manipulator"), "KDLFwdKin");
236  }
237 
238  {
239  std::map<std::string, tesseract_common::PluginInfoContainer> map = factory.getInvKinPlugins();
240  EXPECT_TRUE(map.find("manipulator") == map.end());
241 
243  pi.class_name = "KDLInvKin";
244  factory.addInvKinPlugin("manipulator", "KDLInvKin", pi);
245  EXPECT_EQ(factory.getInvKinPlugins().size(), 1);
246 
247  map = factory.getInvKinPlugins();
248  EXPECT_TRUE(map.find("manipulator") != map.end());
249  EXPECT_TRUE(map.at("manipulator").plugins.find("KDLInvKin") != map.at("manipulator").plugins.end());
250  EXPECT_EQ(map.find("manipulator")->second.plugins.size(), 1);
251  EXPECT_EQ(factory.getDefaultInvKinPlugin("manipulator"), "KDLInvKin");
252 
254  pi2.class_name = "KDLInvKin";
255  factory.addInvKinPlugin("manipulator", "default", pi2);
256  EXPECT_EQ(factory.getInvKinPlugins().size(), 1);
257 
258  map = factory.getInvKinPlugins();
259  EXPECT_TRUE(map.find("manipulator") != map.end());
260  EXPECT_TRUE(map.at("manipulator").plugins.find("default") != map.at("manipulator").plugins.end());
261  EXPECT_EQ(map.find("manipulator")->second.plugins.size(), 2);
262  EXPECT_EQ(factory.getDefaultInvKinPlugin("manipulator"), "KDLInvKin");
263  factory.setDefaultInvKinPlugin("manipulator", "default");
264  EXPECT_EQ(factory.getDefaultInvKinPlugin("manipulator"), "default");
265 
266  EXPECT_ANY_THROW(factory.setDefaultInvKinPlugin("group_does_not_exist", "default")); // NOLINT
267  EXPECT_ANY_THROW(factory.setDefaultInvKinPlugin("manipulator", "solver_does_not_exist")); // NOLINT
268  EXPECT_ANY_THROW(factory.removeInvKinPlugin("group_does_not_exist", "default")); // NOLINT
269  EXPECT_ANY_THROW(factory.removeInvKinPlugin("manipulator", "solver_does_not_exist")); // NOLINT
270  EXPECT_TRUE(factory.createInvKin("group_does_not_exist", "default", *scene_graph, scene_state) == nullptr);
271  EXPECT_TRUE(factory.createInvKin("manipulator", "solver_does_not_exist", *scene_graph, scene_state) == nullptr);
272 
273  factory.removeInvKinPlugin("manipulator", "default");
274 
275  map = factory.getInvKinPlugins();
276  EXPECT_TRUE(map.find("manipulator") != map.end());
277  EXPECT_EQ(factory.getInvKinPlugins().size(), 1);
278  EXPECT_EQ(map.find("manipulator")->second.plugins.size(), 1);
279  // The default was removed so it should now be the first solver
280  EXPECT_EQ(factory.getDefaultInvKinPlugin("manipulator"), "KDLInvKin");
281  }
282 }
283 
284 TEST(TesseractKinematicsFactoryUnit, LoadKinematicsPluginInfoUnit) // NOLINT
285 {
286  using namespace tesseract_scene_graph;
287 
290  tesseract_scene_graph::KDLStateSolver state_solver(*scene_graph);
291  tesseract_scene_graph::SceneState scene_state = state_solver.getState();
292 
293  std::string yaml_string =
294  R"(kinematic_plugins:
295  inv_kin_plugins:
296  manipulator:
297  default: OPWInvKin
298  plugins:
299  OPWInvKin:
300  class: OPWInvKinFactory
301  config:
302  base_link: base_link
303  tip_link: tool0
304  params:
305  a1: 0.100
306  a2: -0.135
307  b: 0.00
308  c1: 0.615
309  c2: 0.705
310  c3: 0.755
311  c4: 0.086
312  offsets: [0, 0, -1.57079632679, 0, 0, 0]
313  sign_corrections: [1, 1, 1, -1, 1, 1])";
314 
315  { // missing entry
316  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
317  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"];
318  plugin.remove("OPWInvKin");
319 
320  KinematicsPluginFactory factory(config, locator);
321  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
322  EXPECT_TRUE(inv_kin == nullptr);
323  }
324  { // missing class
325  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
326  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
327  plugin.remove("class");
328 
329  EXPECT_ANY_THROW(KinematicsPluginFactory factory(config, locator)); // NOLINT
330  }
331  { // missing default (which is allowed)
332  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
333  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
334  plugin.remove("default");
335 
336  KinematicsPluginFactory factory(config, locator);
337  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
338  EXPECT_TRUE(inv_kin != nullptr);
339  }
340 }
341 
342 TEST(TesseractKinematicsFactoryUnit, LoadIKFastKinematicsUnit) // NOLINT
343 {
344  using namespace tesseract_scene_graph;
345 
348  tesseract_scene_graph::KDLStateSolver state_solver(*scene_graph);
349  tesseract_scene_graph::SceneState scene_state = state_solver.getState();
350 
351  std::string yaml_string =
352  R"(kinematic_plugins:
353  search_libraries:
354  - tesseract_kinematics_ikfast_abb_irb2400
355  inv_kin_plugins:
356  manipulator:
357  default: AbbIRB2400IKFast
358  plugins:
359  AbbIRB2400IKFast:
360  class: AbbIRB2400Kinematics
361  config:
362  base_link: base_link
363  tip_link: tool0
364  n_joints: 6)";
365 
366  {
367  KinematicsPluginFactory factory(yaml_string, locator);
368  factory.addSearchPath(std::string(PLUGIN_DIR));
369  auto inv_kin = factory.createInvKin("manipulator", "AbbIRB2400IKFast", *scene_graph, scene_state);
370  EXPECT_TRUE(inv_kin != nullptr);
371  EXPECT_EQ(inv_kin->getSolverName(), "AbbIRB2400IKFast");
372  }
373  { // AbbIRB2400IKFast missing config
374  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
375  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["AbbIRB2400IKFast"];
376  plugin.remove("config");
377 
378  KinematicsPluginFactory factory(config, locator);
379  auto inv_kin = factory.createInvKin("manipulator", "AbbIRB2400IKFast", *scene_graph, scene_state);
380  EXPECT_TRUE(inv_kin == nullptr);
381  }
382  { // AbbIRB2400IKFast missing base_link
383  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
384  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["AbbIRB2400IKFast"];
385  plugin["config"].remove("base_link");
386 
387  KinematicsPluginFactory factory(config, locator);
388  auto inv_kin = factory.createInvKin("manipulator", "AbbIRB2400IKFast", *scene_graph, scene_state);
389  EXPECT_TRUE(inv_kin == nullptr);
390  }
391  { // AbbIRB2400IKFast missing tip_link
392  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
393  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["AbbIRB2400IKFast"];
394  plugin["config"].remove("tip_link");
395 
396  KinematicsPluginFactory factory(config, locator);
397  auto inv_kin = factory.createInvKin("manipulator", "AbbIRB2400IKFast", *scene_graph, scene_state);
398  EXPECT_TRUE(inv_kin == nullptr);
399  }
400 
401  yaml_string =
402  R"(kinematic_plugins:
403  search_libraries:
404  - tesseract_kinematics_ikfast_abb_irb2400
405  inv_kin_plugins:
406  manipulator:
407  default: AbbIRB2400IKFast
408  plugins:
409  AbbIRB2400IKFast:
410  class: AbbIRB2400Kinematics
411  config:
412  base_link: base_link
413  tip_link: tool0
414  n_joints: 6
415  free_joint_states:
416  - [])";
417 
418  {
419  KinematicsPluginFactory factory(yaml_string, locator);
420  factory.addSearchPath(std::string(PLUGIN_DIR));
421  auto inv_kin = factory.createInvKin("manipulator", "AbbIRB2400IKFast", *scene_graph, scene_state);
422  EXPECT_TRUE(inv_kin == nullptr);
423  }
425 }
426 
427 TEST(TesseractKinematicsFactoryUnit, LoadOPWKinematicsUnit) // NOLINT
428 {
429  using namespace tesseract_scene_graph;
430 
433  tesseract_scene_graph::KDLStateSolver state_solver(*scene_graph);
434  tesseract_scene_graph::SceneState scene_state = state_solver.getState();
435 
436  std::string yaml_string =
437  R"(kinematic_plugins:
438  inv_kin_plugins:
439  manipulator:
440  default: OPWInvKin
441  plugins:
442  OPWInvKin:
443  class: OPWInvKinFactory
444  config:
445  base_link: base_link
446  tip_link: tool0
447  params:
448  a1: 0.100
449  a2: -0.135
450  b: 0.00
451  c1: 0.615
452  c2: 0.705
453  c3: 0.755
454  c4: 0.086
455  offsets: [0, 0, -1.57079632679, 0, 0, 0]
456  sign_corrections: [1, 1, 1, -1, 1, 1])";
457 
458  KinematicsPluginFactory factory(yaml_string, locator);
459  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
460  EXPECT_TRUE(inv_kin != nullptr);
461  EXPECT_EQ(inv_kin->getSolverName(), "OPWInvKin");
462 
463  { // missing config
464  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
465  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
466  plugin.remove("config");
467 
468  KinematicsPluginFactory factory(config, locator);
469  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
470  EXPECT_TRUE(inv_kin == nullptr);
471  }
472  { // missing base_link
473  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
474  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
475  plugin["config"].remove("base_link");
476 
477  KinematicsPluginFactory factory(config, locator);
478  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
479  EXPECT_TRUE(inv_kin == nullptr);
480  }
481  { // missing tip_link
482  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
483  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
484  plugin["config"].remove("tip_link");
485 
486  KinematicsPluginFactory factory(config, locator);
487  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
488  EXPECT_TRUE(inv_kin == nullptr);
489  }
490  { // missing params
491  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
492  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
493  plugin["config"].remove("params");
494 
495  KinematicsPluginFactory factory(config, locator);
496  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
497  EXPECT_TRUE(inv_kin == nullptr);
498  }
499  { // missing a1
500  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
501  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
502  plugin["config"]["params"].remove("a1");
503 
504  KinematicsPluginFactory factory(config, locator);
505  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
506  EXPECT_TRUE(inv_kin == nullptr);
507  }
508  { // missing a2
509  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
510  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
511  plugin["config"]["params"].remove("a2");
512 
513  KinematicsPluginFactory factory(config, locator);
514  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
515  EXPECT_TRUE(inv_kin == nullptr);
516  }
517  { // missing b
518  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
519  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
520  plugin["config"]["params"].remove("b");
521 
522  KinematicsPluginFactory factory(config, locator);
523  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
524  EXPECT_TRUE(inv_kin == nullptr);
525  }
526  { // missing c1
527  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
528  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
529  plugin["config"]["params"].remove("c1");
530 
531  KinematicsPluginFactory factory(config, locator);
532  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
533  EXPECT_TRUE(inv_kin == nullptr);
534  }
535  { // missing c2
536  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
537  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
538  plugin["config"]["params"].remove("c2");
539 
540  KinematicsPluginFactory factory(config, locator);
541  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
542  EXPECT_TRUE(inv_kin == nullptr);
543  }
544  { // missing c3
545  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
546  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
547  plugin["config"]["params"].remove("c3");
548 
549  KinematicsPluginFactory factory(config, locator);
550  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
551  EXPECT_TRUE(inv_kin == nullptr);
552  }
553  { // missing c4
554  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
555  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
556  plugin["config"]["params"].remove("c4");
557 
558  KinematicsPluginFactory factory(config, locator);
559  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
560  EXPECT_TRUE(inv_kin == nullptr);
561  }
562  { // missing offset is allowed
563  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
564  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
565  plugin["config"]["params"].remove("offset");
566 
567  KinematicsPluginFactory factory(config, locator);
568  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
569  EXPECT_TRUE(inv_kin != nullptr);
570  }
571  { // missing sign_corrections is allowed
572  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
573  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
574  plugin["config"]["params"].remove("sign_corrections");
575 
576  KinematicsPluginFactory factory(config, locator);
577  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
578  EXPECT_TRUE(inv_kin != nullptr);
579  }
580 
581  { // invalid a1
582  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
583  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
584  plugin["config"]["params"]["a1"] = "abcd";
585 
586  KinematicsPluginFactory factory(config, locator);
587  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
588  EXPECT_TRUE(inv_kin == nullptr);
589  }
590  { // invalid a2
591  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
592  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
593  plugin["config"]["params"]["a2"] = "abcd";
594 
595  KinematicsPluginFactory factory(config, locator);
596  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
597  EXPECT_TRUE(inv_kin == nullptr);
598  }
599  { // invalid b
600  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
601  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
602  plugin["config"]["params"]["b"] = "abcd";
603 
604  KinematicsPluginFactory factory(config, locator);
605  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
606  EXPECT_TRUE(inv_kin == nullptr);
607  }
608  { // invalid c1
609  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
610  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
611  plugin["config"]["params"]["c1"] = "abcd";
612 
613  KinematicsPluginFactory factory(config, locator);
614  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
615  EXPECT_TRUE(inv_kin == nullptr);
616  }
617  { // invalid c2
618  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
619  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
620  plugin["config"]["params"]["c2"] = "abcd";
621 
622  KinematicsPluginFactory factory(config, locator);
623  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
624  EXPECT_TRUE(inv_kin == nullptr);
625  }
626  { // invalid c3
627  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
628  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
629  plugin["config"]["params"]["c3"] = "abcd";
630 
631  KinematicsPluginFactory factory(config, locator);
632  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
633  EXPECT_TRUE(inv_kin == nullptr);
634  }
635  { // invalid c4
636  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
637  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
638  plugin["config"]["params"]["c4"] = "abcd";
639 
640  KinematicsPluginFactory factory(config, locator);
641  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
642  EXPECT_TRUE(inv_kin == nullptr);
643  }
644  { // invalid offset
645  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
646  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
647  plugin["config"]["params"]["offsets"][0] = "abcd";
648 
649  KinematicsPluginFactory factory(config, locator);
650  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
651  EXPECT_TRUE(inv_kin == nullptr);
652  }
653  { // invalid offset size
654  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
655  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
656  plugin["config"]["params"]["offsets"].push_back(0);
657 
658  KinematicsPluginFactory factory(config, locator);
659  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
660  EXPECT_TRUE(inv_kin == nullptr);
661  }
662  { // invalid sign_corrections
663  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
664  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
665  plugin["config"]["params"]["sign_corrections"][0] = "a";
666 
667  KinematicsPluginFactory factory(config, locator);
668  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
669  EXPECT_TRUE(inv_kin == nullptr);
670  }
671  { // invalid sign_corrections
672  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
673  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
674  plugin["config"]["params"]["sign_corrections"][0] = 5;
675 
676  KinematicsPluginFactory factory(config, locator);
677  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
678  EXPECT_TRUE(inv_kin == nullptr);
679  }
680  { // invalid sign_corrections size
681  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
682  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["OPWInvKin"];
683  plugin["config"]["params"]["sign_corrections"].push_back(0);
684 
685  KinematicsPluginFactory factory(config, locator);
686  auto inv_kin = factory.createInvKin("manipulator", "OPWInvKin", *scene_graph, scene_state);
687  EXPECT_TRUE(inv_kin == nullptr);
688  }
689 }
690 
691 TEST(TesseractKinematicsFactoryUnit, LoadURKinematicsUnit) // NOLINT
692 {
693  using namespace tesseract_scene_graph;
694 
697  tesseract_scene_graph::KDLStateSolver state_solver(*scene_graph);
698  tesseract_scene_graph::SceneState scene_state = state_solver.getState();
699 
700  std::string yaml_model_string =
701  R"(kinematic_plugins:
702  inv_kin_plugins:
703  manipulator:
704  default: URInvKin
705  plugins:
706  URInvKin:
707  class: URInvKinFactory
708  config:
709  base_link: base_link
710  tip_link: tool0
711  model: UR10)";
712 
713  std::string yaml_params_string =
714  R"(kinematic_plugins:
715  inv_kin_plugins:
716  manipulator:
717  default: URInvKin
718  plugins:
719  URInvKin:
720  class: URInvKinFactory
721  config:
722  base_link: base_link
723  tip_link: tool0
724  params:
725  d1: 0.1273
726  a2: -0.612
727  a3: -0.5723
728  d4: 0.163941
729  d5: 0.1157
730  d6: 0.0922)";
731 
732  { // Test loading UR10
733  KinematicsPluginFactory factory(yaml_model_string, locator);
734  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
735  EXPECT_TRUE(inv_kin != nullptr);
736  EXPECT_EQ(inv_kin->getSolverName(), "URInvKin");
737  }
738  { // Test loading UR10e
739  YAML::Node config = tesseract_common::loadYamlString(yaml_model_string, locator);
740  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"]["config"]["model"] = "UR10e";
741 
742  KinematicsPluginFactory factory(yaml_model_string, locator);
743  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
744  EXPECT_TRUE(inv_kin != nullptr);
745  EXPECT_EQ(inv_kin->getSolverName(), "URInvKin");
746  }
747  { // Test loading UR5
748  YAML::Node config = tesseract_common::loadYamlString(yaml_model_string, locator);
749  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"]["config"]["model"] = "UR5";
750 
751  KinematicsPluginFactory factory(yaml_model_string, locator);
752  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
753  EXPECT_TRUE(inv_kin != nullptr);
754  EXPECT_EQ(inv_kin->getSolverName(), "URInvKin");
755  }
756  { // Test loading UR5e
757  YAML::Node config = tesseract_common::loadYamlString(yaml_model_string, locator);
758  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"]["config"]["model"] = "UR5e";
759 
760  KinematicsPluginFactory factory(yaml_model_string, locator);
761  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
762  EXPECT_TRUE(inv_kin != nullptr);
763  EXPECT_EQ(inv_kin->getSolverName(), "URInvKin");
764  }
765  { // Test loading UR3
766  YAML::Node config = tesseract_common::loadYamlString(yaml_model_string, locator);
767  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"]["config"]["model"] = "UR3";
768 
769  KinematicsPluginFactory factory(yaml_model_string, locator);
770  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
771  EXPECT_TRUE(inv_kin != nullptr);
772  EXPECT_EQ(inv_kin->getSolverName(), "URInvKin");
773  }
774  { // Test loading UR3e
775  YAML::Node config = tesseract_common::loadYamlString(yaml_model_string, locator);
776  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"]["config"]["model"] = "UR3e";
777 
778  KinematicsPluginFactory factory(yaml_model_string, locator);
779  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
780  EXPECT_TRUE(inv_kin != nullptr);
781  EXPECT_EQ(inv_kin->getSolverName(), "URInvKin");
782  }
783  { // Test loading custom UR parameters
784  KinematicsPluginFactory factory(yaml_model_string, locator);
785  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
786  EXPECT_TRUE(inv_kin != nullptr);
787  EXPECT_EQ(inv_kin->getSolverName(), "URInvKin");
788  }
789  { // invalid ur model
790  YAML::Node config = tesseract_common::loadYamlString(yaml_model_string, locator);
791  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"]["config"]["model"] = "DoesNotE"
792  "xist";
793 
794  KinematicsPluginFactory factory(config, locator);
795  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
796  EXPECT_TRUE(inv_kin == nullptr);
797  }
798  { // missing config
799  YAML::Node config = tesseract_common::loadYamlString(yaml_model_string, locator);
800  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
801  plugin.remove("config");
802 
803  KinematicsPluginFactory factory(config, locator);
804  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
805  EXPECT_TRUE(inv_kin == nullptr);
806  }
807  { // missing base_link
808  YAML::Node config = tesseract_common::loadYamlString(yaml_model_string, locator);
809  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
810  plugin["config"].remove("base_link");
811 
812  KinematicsPluginFactory factory(config, locator);
813  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
814  EXPECT_TRUE(inv_kin == nullptr);
815  }
816  { // missing tip_link
817  YAML::Node config = tesseract_common::loadYamlString(yaml_model_string, locator);
818  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
819  plugin["config"].remove("tip_link");
820 
821  KinematicsPluginFactory factory(config, locator);
822  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
823  EXPECT_TRUE(inv_kin == nullptr);
824  }
825  { // missing model and params
826  YAML::Node config = tesseract_common::loadYamlString(yaml_model_string, locator);
827  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
828  plugin["config"].remove("model");
829 
830  KinematicsPluginFactory factory(config, locator);
831  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
832  EXPECT_TRUE(inv_kin == nullptr);
833  }
834  { // missing model and params
835  YAML::Node config = tesseract_common::loadYamlString(yaml_params_string, locator);
836  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
837  plugin["config"].remove("params");
838 
839  KinematicsPluginFactory factory(config, locator);
840  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
841  EXPECT_TRUE(inv_kin == nullptr);
842  }
843  { // missing d1
844  YAML::Node config = tesseract_common::loadYamlString(yaml_params_string, locator);
845  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
846  plugin["config"]["params"].remove("d1");
847 
848  KinematicsPluginFactory factory(config, locator);
849  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
850  EXPECT_TRUE(inv_kin == nullptr);
851  }
852  { // missing a2
853  YAML::Node config = tesseract_common::loadYamlString(yaml_params_string, locator);
854  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
855  plugin["config"]["params"].remove("a2");
856 
857  KinematicsPluginFactory factory(config, locator);
858  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
859  EXPECT_TRUE(inv_kin == nullptr);
860  }
861  { // missing a3
862  YAML::Node config = tesseract_common::loadYamlString(yaml_params_string, locator);
863  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
864  plugin["config"]["params"].remove("a3");
865 
866  KinematicsPluginFactory factory(config, locator);
867  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
868  EXPECT_TRUE(inv_kin == nullptr);
869  }
870  { // missing d4
871  YAML::Node config = tesseract_common::loadYamlString(yaml_params_string, locator);
872  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
873  plugin["config"]["params"].remove("d4");
874 
875  KinematicsPluginFactory factory(config, locator);
876  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
877  EXPECT_TRUE(inv_kin == nullptr);
878  }
879  { // missing d5
880  YAML::Node config = tesseract_common::loadYamlString(yaml_params_string, locator);
881  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
882  plugin["config"]["params"].remove("d5");
883 
884  KinematicsPluginFactory factory(config, locator);
885  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
886  EXPECT_TRUE(inv_kin == nullptr);
887  }
888  { // missing d6
889  YAML::Node config = tesseract_common::loadYamlString(yaml_params_string, locator);
890  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
891  plugin["config"]["params"].remove("d6");
892 
893  KinematicsPluginFactory factory(config, locator);
894  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
895  EXPECT_TRUE(inv_kin == nullptr);
896  }
897  { // invalid d1
898  YAML::Node config = tesseract_common::loadYamlString(yaml_params_string, locator);
899  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
900  plugin["config"]["params"]["d1"] = "abcd";
901 
902  KinematicsPluginFactory factory(config, locator);
903  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
904  EXPECT_TRUE(inv_kin == nullptr);
905  }
906  { // invalid a2
907  YAML::Node config = tesseract_common::loadYamlString(yaml_params_string, locator);
908  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
909  plugin["config"]["params"]["a2"] = "abcd";
910 
911  KinematicsPluginFactory factory(config, locator);
912  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
913  EXPECT_TRUE(inv_kin == nullptr);
914  }
915  { // invalid a3
916  YAML::Node config = tesseract_common::loadYamlString(yaml_params_string, locator);
917  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
918  plugin["config"]["params"]["a3"] = "abcd";
919 
920  KinematicsPluginFactory factory(config, locator);
921  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
922  EXPECT_TRUE(inv_kin == nullptr);
923  }
924  { // invalid d4
925  YAML::Node config = tesseract_common::loadYamlString(yaml_params_string, locator);
926  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
927  plugin["config"]["params"]["d4"] = "abcd";
928 
929  KinematicsPluginFactory factory(config, locator);
930  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
931  EXPECT_TRUE(inv_kin == nullptr);
932  }
933  { // invalid d5
934  YAML::Node config = tesseract_common::loadYamlString(yaml_params_string, locator);
935  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
936  plugin["config"]["params"]["d5"] = "abcd";
937 
938  KinematicsPluginFactory factory(config, locator);
939  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
940  EXPECT_TRUE(inv_kin == nullptr);
941  }
942  { // invalid d6
943  YAML::Node config = tesseract_common::loadYamlString(yaml_params_string, locator);
944  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["URInvKin"];
945  plugin["config"]["params"]["d6"] = "abcd";
946 
947  KinematicsPluginFactory factory(config, locator);
948  auto inv_kin = factory.createInvKin("manipulator", "URInvKin", *scene_graph, scene_state);
949  EXPECT_TRUE(inv_kin == nullptr);
950  }
951 }
952 
953 TEST(TesseractKinematicsFactoryUnit, LoadREPKinematicsUnit) // NOLINT
954 {
955  using namespace tesseract_scene_graph;
956 
959  tesseract_scene_graph::KDLStateSolver state_solver(*scene_graph);
960  tesseract_scene_graph::SceneState scene_state = state_solver.getState();
961 
962  std::string yaml_string =
963  R"(kinematic_plugins:
964  inv_kin_plugins:
965  manipulator:
966  default: REPInvKin
967  plugins:
968  REPInvKin:
969  class: REPInvKinFactory
970  config:
971  manipulator_reach: 2.0
972  positioner_sample_resolution:
973  - name: positioner_joint_1
974  value: 0.1
975  min: -1.0
976  max: 1.0
977  - name: positioner_joint_2
978  value: 0.1
979  positioner:
980  class: KDLFwdKinChainFactory
981  config:
982  base_link: positioner_base_link
983  tip_link: positioner_tool0
984  manipulator:
985  class: OPWInvKinFactory
986  config:
987  base_link: base_link
988  tip_link: tool0
989  params:
990  a1: 0.100
991  a2: -0.135
992  b: 0.00
993  c1: 0.615
994  c2: 0.705
995  c3: 0.755
996  c4: 0.086
997  offsets: [0, 0, -1.57079632679, 0, 0, 0]
998  sign_corrections: [1, 1, 1, 1, 1, 1])";
999 
1000  KinematicsPluginFactory factory(yaml_string, locator);
1001  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1002  EXPECT_TRUE(inv_kin != nullptr);
1003  EXPECT_EQ(inv_kin->getSolverName(), "REPInvKin");
1004 
1005  { // Invalid positioner sample resolution joint name
1006  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1007  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["REPInvKin"]["config"]
1008  ["positioner_sample_resolution"][0]["name"] = "joint_does_not_exist";
1009 
1010  KinematicsPluginFactory factory(config, locator);
1011  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1012  EXPECT_TRUE(inv_kin == nullptr);
1013  }
1014  { // Invalid positioner sample resolution joint min
1015  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1016  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["REPInvKin"]["config"]
1017  ["positioner_sample_resolution"][0]["min"] = -10000;
1018 
1019  KinematicsPluginFactory factory(config, locator);
1020  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1021  EXPECT_TRUE(inv_kin == nullptr);
1022  }
1023  { // Invalid positioner sample resolution joint max
1024  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1025  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["REPInvKin"]["config"]
1026  ["positioner_sample_resolution"][0]["max"] = 10000;
1027 
1028  KinematicsPluginFactory factory(config, locator);
1029  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1030  EXPECT_TRUE(inv_kin == nullptr);
1031  }
1032  { // Invalid positioner sample resolution joint max is less than min
1033  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1034  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["REPInvKin"]["config"]
1035  ["positioner_sample_resolution"][0]["min"] = 0.6;
1036  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["REPInvKin"]["config"]
1037  ["positioner_sample_resolution"][0]["max"] = 0.3;
1038 
1039  KinematicsPluginFactory factory(config, locator);
1040  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1041  EXPECT_TRUE(inv_kin == nullptr);
1042  }
1043  { // Invalid positioner class
1044  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1045  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["REPInvKin"]["config"]["positioner"]["clas"
1046  "s"] =
1047  "DoesNotExistFactory";
1048 
1049  KinematicsPluginFactory factory(config, locator);
1050  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1051  EXPECT_TRUE(inv_kin == nullptr);
1052  }
1053  { // Invalid manipulator class
1054  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1055  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["REPInvKin"]["config"]["manipulator"]
1056  ["class"] = "DoesNotExistFactory";
1057 
1058  KinematicsPluginFactory factory(config, locator);
1059  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1060  EXPECT_TRUE(inv_kin == nullptr);
1061  }
1062  { // missing config
1063  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1064  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["REPInvKin"];
1065  plugin.remove("config");
1066 
1067  KinematicsPluginFactory factory(config, locator);
1068  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1069  EXPECT_TRUE(inv_kin == nullptr);
1070  }
1071  { // missing manipulator_reach
1072  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1073  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["REPInvKin"];
1074  plugin["config"].remove("manipulator_reach");
1075 
1076  KinematicsPluginFactory factory(config, locator);
1077  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1078  EXPECT_TRUE(inv_kin == nullptr);
1079  }
1080  { // missing positioner_sample_resolution
1081  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1082  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["REPInvKin"];
1083  plugin["config"].remove("positioner_sample_resolution");
1084 
1085  KinematicsPluginFactory factory(config, locator);
1086  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1087  EXPECT_TRUE(inv_kin == nullptr);
1088  }
1089  { // missing positioner_sample_resolution entry name
1090  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1091  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["REPInvKin"];
1092  plugin["config"]["positioner_sample_resolution"][0].remove("name");
1093 
1094  KinematicsPluginFactory factory(config, locator);
1095  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1096  EXPECT_TRUE(inv_kin == nullptr);
1097  }
1098  { // missing positioner_sample_resolution entry value
1099  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1100  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["REPInvKin"];
1101  plugin["config"]["positioner_sample_resolution"][0].remove("value");
1102 
1103  KinematicsPluginFactory factory(config, locator);
1104  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1105  EXPECT_TRUE(inv_kin == nullptr);
1106  }
1107  { // missing positioner
1108  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1109  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["REPInvKin"];
1110  plugin["config"].remove("positioner");
1111 
1112  KinematicsPluginFactory factory(config, locator);
1113  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1114  EXPECT_TRUE(inv_kin == nullptr);
1115  }
1116  { // missing positioner entry class
1117  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1118  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["REPInvKin"];
1119  plugin["config"]["positioner"].remove("class");
1120 
1121  KinematicsPluginFactory factory(config, locator);
1122  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1123  EXPECT_TRUE(inv_kin == nullptr);
1124  }
1125  { // missing manipulator
1126  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1127  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["REPInvKin"];
1128  plugin["config"].remove("manipulator");
1129 
1130  KinematicsPluginFactory factory(config, locator);
1131  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1132  EXPECT_TRUE(inv_kin == nullptr);
1133  }
1134  { // missing manipulator entry class
1135  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1136  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["REPInvKin"];
1137  plugin["config"]["manipulator"].remove("class");
1138 
1139  KinematicsPluginFactory factory(config, locator);
1140  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1141  EXPECT_TRUE(inv_kin == nullptr);
1142  }
1143 }
1144 
1145 TEST(TesseractKinematicsFactoryUnit, LoadROPKinematicsUnit) // NOLINT
1146 {
1147  using namespace tesseract_scene_graph;
1148 
1151  tesseract_scene_graph::KDLStateSolver state_solver(*scene_graph);
1152  tesseract_scene_graph::SceneState scene_state = state_solver.getState();
1153 
1154  std::string yaml_string =
1155  R"(kinematic_plugins:
1156  inv_kin_plugins:
1157  manipulator:
1158  default: ROPInvKin
1159  plugins:
1160  ROPInvKin:
1161  class: ROPInvKinFactory
1162  config:
1163  manipulator_reach: 2.0
1164  positioner_sample_resolution:
1165  - name: positioner_joint_1
1166  value: 0.1
1167  min: -1.0
1168  max: 1.0
1169  positioner:
1170  class: KDLFwdKinChainFactory
1171  config:
1172  base_link: positioner_base_link
1173  tip_link: positioner_tool0
1174  manipulator:
1175  class: OPWInvKinFactory
1176  config:
1177  base_link: base_link
1178  tip_link: tool0
1179  params:
1180  a1: 0.100
1181  a2: -0.135
1182  b: 0.00
1183  c1: 0.615
1184  c2: 0.705
1185  c3: 0.755
1186  c4: 0.086
1187  offsets: [0, 0, -1.57079632679, 0, 0, 0]
1188  sign_corrections: [1, 1, 1, 1, 1, 1])";
1189 
1190  KinematicsPluginFactory factory(yaml_string, locator);
1191  auto inv_kin = factory.createInvKin("manipulator", "ROPInvKin", *scene_graph, scene_state);
1192  EXPECT_TRUE(inv_kin != nullptr);
1193  EXPECT_EQ(inv_kin->getSolverName(), "ROPInvKin");
1194 
1195  { // Invalid positioner sample resolution joint name
1196  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1197  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["ROPInvKin"]["config"]
1198  ["positioner_sample_resolution"][0]["name"] = "joint_does_not_exist";
1199 
1200  KinematicsPluginFactory factory(config, locator);
1201  auto inv_kin = factory.createInvKin("manipulator", "ROPInvKin", *scene_graph, scene_state);
1202  EXPECT_TRUE(inv_kin == nullptr);
1203  }
1204  { // Invalid positioner sample resolution joint min
1205  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1206  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["ROPInvKin"]["config"]
1207  ["positioner_sample_resolution"][0]["min"] = -10000;
1208 
1209  KinematicsPluginFactory factory(config, locator);
1210  auto inv_kin = factory.createInvKin("manipulator", "ROPInvKin", *scene_graph, scene_state);
1211  EXPECT_TRUE(inv_kin == nullptr);
1212  }
1213  { // Invalid positioner sample resolution joint max
1214  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1215  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["ROPInvKin"]["config"]
1216  ["positioner_sample_resolution"][0]["max"] = 10000;
1217 
1218  KinematicsPluginFactory factory(config, locator);
1219  auto inv_kin = factory.createInvKin("manipulator", "ROPInvKin", *scene_graph, scene_state);
1220  EXPECT_TRUE(inv_kin == nullptr);
1221  }
1222  { // Invalid positioner sample resolution joint max is less than min
1223  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1224  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["ROPInvKin"]["config"]
1225  ["positioner_sample_resolution"][0]["min"] = 0.6;
1226  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["ROPInvKin"]["config"]
1227  ["positioner_sample_resolution"][0]["max"] = 0.3;
1228 
1229  KinematicsPluginFactory factory(config, locator);
1230  auto inv_kin = factory.createInvKin("manipulator", "ROPInvKin", *scene_graph, scene_state);
1231  EXPECT_TRUE(inv_kin == nullptr);
1232  }
1233  { // Invalid positioner class
1234  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1235  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["ROPInvKin"]["config"]["positioner"]["clas"
1236  "s"] =
1237  "DoesNotExistFactory";
1238 
1239  KinematicsPluginFactory factory(config, locator);
1240  auto inv_kin = factory.createInvKin("manipulator", "ROPInvKin", *scene_graph, scene_state);
1241  EXPECT_TRUE(inv_kin == nullptr);
1242  }
1243  { // Invalid manipulator class
1244  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1245  config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["ROPInvKin"]["config"]["manipulator"]
1246  ["class"] = "DoesNotExistFactory";
1247 
1248  KinematicsPluginFactory factory(config, locator);
1249  auto inv_kin = factory.createInvKin("manipulator", "ROPInvKin", *scene_graph, scene_state);
1250  EXPECT_TRUE(inv_kin == nullptr);
1251  }
1252  { // missing config
1253  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1254  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["ROPInvKin"];
1255  plugin.remove("config");
1256 
1257  KinematicsPluginFactory factory(config, locator);
1258  auto inv_kin = factory.createInvKin("manipulator", "ROPInvKin", *scene_graph, scene_state);
1259  EXPECT_TRUE(inv_kin == nullptr);
1260  }
1261  { // missing manipulator_reach
1262  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1263  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["ROPInvKin"];
1264  plugin["config"].remove("manipulator_reach");
1265 
1266  KinematicsPluginFactory factory(config, locator);
1267  auto inv_kin = factory.createInvKin("manipulator", "ROPInvKin", *scene_graph, scene_state);
1268  EXPECT_TRUE(inv_kin == nullptr);
1269  }
1270  { // missing positioner_sample_resolution
1271  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1272  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["ROPInvKin"];
1273  plugin["config"].remove("positioner_sample_resolution");
1274 
1275  KinematicsPluginFactory factory(config, locator);
1276  auto inv_kin = factory.createInvKin("manipulator", "ROPInvKin", *scene_graph, scene_state);
1277  EXPECT_TRUE(inv_kin == nullptr);
1278  }
1279  { // missing positioner_sample_resolution entry name
1280  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1281  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["ROPInvKin"];
1282  plugin["config"]["positioner_sample_resolution"][0].remove("name");
1283 
1284  KinematicsPluginFactory factory(config, locator);
1285  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1286  EXPECT_TRUE(inv_kin == nullptr);
1287  }
1288  { // missing positioner_sample_resolution entry value
1289  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1290  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["ROPInvKin"];
1291  plugin["config"]["positioner_sample_resolution"][0].remove("value");
1292 
1293  KinematicsPluginFactory factory(config, locator);
1294  auto inv_kin = factory.createInvKin("manipulator", "REPInvKin", *scene_graph, scene_state);
1295  EXPECT_TRUE(inv_kin == nullptr);
1296  }
1297  { // missing positioner
1298  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1299  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["ROPInvKin"];
1300  plugin["config"].remove("positioner");
1301 
1302  KinematicsPluginFactory factory(config, locator);
1303  auto inv_kin = factory.createInvKin("manipulator", "ROPInvKin", *scene_graph, scene_state);
1304  EXPECT_TRUE(inv_kin == nullptr);
1305  }
1306  { // missing positioner entry class
1307  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1308  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["ROPInvKin"];
1309  plugin["config"]["positioner"].remove("class");
1310 
1311  KinematicsPluginFactory factory(config, locator);
1312  auto inv_kin = factory.createInvKin("manipulator", "ROPInvKin", *scene_graph, scene_state);
1313  EXPECT_TRUE(inv_kin == nullptr);
1314  }
1315  { // missing manipulator
1316  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1317  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["ROPInvKin"];
1318  plugin["config"].remove("manipulator");
1319 
1320  KinematicsPluginFactory factory(config, locator);
1321  auto inv_kin = factory.createInvKin("manipulator", "ROPInvKin", *scene_graph, scene_state);
1322  EXPECT_TRUE(inv_kin == nullptr);
1323  }
1324  { // missing manipulator entry class
1325  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1326  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["ROPInvKin"];
1327  plugin["config"]["manipulator"].remove("class");
1328 
1329  KinematicsPluginFactory factory(config, locator);
1330  auto inv_kin = factory.createInvKin("manipulator", "ROPInvKin", *scene_graph, scene_state);
1331  EXPECT_TRUE(inv_kin == nullptr);
1332  }
1333 }
1334 
1335 TEST(TesseractKinematicsFactoryUnit, LoadKDLKinematicsUnit) // NOLINT
1336 {
1337  using namespace tesseract_scene_graph;
1338 
1341  tesseract_scene_graph::KDLStateSolver state_solver(*scene_graph);
1342  tesseract_scene_graph::SceneState scene_state = state_solver.getState();
1343 
1344  std::string yaml_string =
1345  R"(kinematic_plugins:
1346  fwd_kin_plugins:
1347  manipulator:
1348  default: KDLFwdKinChain
1349  plugins:
1350  KDLFwdKinChain:
1351  class: KDLFwdKinChainFactory
1352  config:
1353  base_link: base_link
1354  tip_link: tool0
1355  inv_kin_plugins:
1356  manipulator:
1357  default: KDLInvKinChainLMA
1358  plugins:
1359  KDLInvKinChainLMA:
1360  class: KDLInvKinChainLMAFactory
1361  config:
1362  base_link: base_link
1363  tip_link: tool0
1364  KDLInvKinChainNR:
1365  class: KDLInvKinChainNRFactory
1366  config:
1367  base_link: base_link
1368  tip_link: tool0
1369  KDLInvKinChainNR_JL:
1370  class: KDLInvKinChainNR_JLFactory
1371  config:
1372  base_link: base_link
1373  tip_link: tool0
1374  KDLInvKinChainLMA_AllParams:
1375  class: KDLInvKinChainLMAFactory
1376  config:
1377  base_link: base_link
1378  tip_link: tool0
1379  task_weights: [1, 1, 1, 0.1, 0.1, 0.1]
1380  eps: 1e-5
1381  max_iterations: 500
1382  eps_joints: 1e-15
1383  KDLInvKinChainNR_AllParams:
1384  class: KDLInvKinChainNRFactory
1385  config:
1386  base_link: base_link
1387  tip_link: tool0
1388  velocity_eps: 0.00001
1389  velocity_iterations: 150
1390  position_eps: 1e-6
1391  position_iterations: 100
1392  KDLInvKinChainNR_JL_AllParams:
1393  class: KDLInvKinChainNR_JLFactory
1394  config:
1395  base_link: base_link
1396  tip_link: tool0
1397  velocity_eps: 0.00001
1398  velocity_iterations: 150
1399  position_eps: 1e-6
1400  position_iterations: 100)";
1401 
1402  {
1403  KinematicsPluginFactory factory(yaml_string, locator);
1404  auto fwd_kin = factory.createFwdKin("manipulator", "KDLFwdKinChain", *scene_graph, scene_state);
1405  EXPECT_TRUE(fwd_kin != nullptr);
1406  EXPECT_EQ(fwd_kin->getSolverName(), "KDLFwdKinChain");
1407  }
1408 
1409  {
1410  KinematicsPluginFactory factory(yaml_string, locator);
1411  auto inv_kin = factory.createInvKin("manipulator", "KDLInvKinChainLMA", *scene_graph, scene_state);
1412  EXPECT_TRUE(inv_kin != nullptr);
1413  EXPECT_EQ(inv_kin->getSolverName(), "KDLInvKinChainLMA");
1414  }
1415 
1416  {
1417  KinematicsPluginFactory factory(yaml_string, locator);
1418  auto inv_kin = factory.createInvKin("manipulator", "KDLInvKinChainNR", *scene_graph, scene_state);
1419  EXPECT_TRUE(inv_kin != nullptr);
1420  EXPECT_EQ(inv_kin->getSolverName(), "KDLInvKinChainNR");
1421  }
1422 
1423  {
1424  KinematicsPluginFactory factory(yaml_string, locator);
1425  auto inv_kin = factory.createInvKin("manipulator", "KDLInvKinChainNR_JL", *scene_graph, scene_state);
1426  EXPECT_TRUE(inv_kin != nullptr);
1427  EXPECT_EQ(inv_kin->getSolverName(), "KDLInvKinChainNR_JL");
1428  }
1429 
1430  { // KDLFwdKinChain missing config
1431  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1432  auto plugin = config["kinematic_plugins"]["fwd_kin_plugins"]["manipulator"]["plugins"]["KDLFwdKinChain"];
1433  plugin.remove("config");
1434 
1435  KinematicsPluginFactory factory(config, locator);
1436  auto kin = factory.createFwdKin("manipulator", "KDLFwdKinChain", *scene_graph, scene_state);
1437  EXPECT_TRUE(kin == nullptr);
1438  }
1439  { // KDLInvKinChainLMA missing config
1440  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1441  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["KDLInvKinChainLMA"];
1442  plugin.remove("config");
1443 
1444  KinematicsPluginFactory factory(config, locator);
1445  auto kin = factory.createInvKin("manipulator", "KDLInvKinChainLMA", *scene_graph, scene_state);
1446  EXPECT_TRUE(kin == nullptr);
1447  }
1448  { // KDLInvKinChainNR missing config
1449  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1450  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["KDLInvKinChainNR"];
1451  plugin.remove("config");
1452 
1453  KinematicsPluginFactory factory(config, locator);
1454  auto kin = factory.createInvKin("manipulator", "KDLInvKinChainNR", *scene_graph, scene_state);
1455  EXPECT_TRUE(kin == nullptr);
1456  }
1457  { // KDLInvKinChainNR_JL missing config
1458  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1459  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["KDLInvKinChainNR_JL"];
1460  plugin.remove("config");
1461 
1462  KinematicsPluginFactory factory(config, locator);
1463  auto kin = factory.createInvKin("manipulator", "KDLInvKinChainNR_JL", *scene_graph, scene_state);
1464  EXPECT_TRUE(kin == nullptr);
1465  }
1466  { // KDLFwdKinChain missing base_link
1467  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1468  auto plugin = config["kinematic_plugins"]["fwd_kin_plugins"]["manipulator"]["plugins"]["KDLFwdKinChain"];
1469  plugin["config"].remove("base_link");
1470 
1471  KinematicsPluginFactory factory(config, locator);
1472  auto kin = factory.createFwdKin("manipulator", "KDLFwdKinChain", *scene_graph, scene_state);
1473  EXPECT_TRUE(kin == nullptr);
1474  }
1475  { // KDLInvKinChainLMA missing base_link
1476  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1477  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["KDLInvKinChainLMA"];
1478  plugin["config"].remove("base_link");
1479 
1480  KinematicsPluginFactory factory(config, locator);
1481  auto kin = factory.createInvKin("manipulator", "KDLInvKinChainLMA", *scene_graph, scene_state);
1482  EXPECT_TRUE(kin == nullptr);
1483  }
1484  { // KDLInvKinChainNR missing base_link
1485  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1486  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["KDLInvKinChainNR"];
1487  plugin["config"].remove("base_link");
1488 
1489  KinematicsPluginFactory factory(config, locator);
1490  auto kin = factory.createInvKin("manipulator", "KDLInvKinChainNR", *scene_graph, scene_state);
1491  EXPECT_TRUE(kin == nullptr);
1492  }
1493  { // KDLInvKinChainNR_JL missing base_link
1494  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1495  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["KDLInvKinChainNR_JL"];
1496  plugin["config"].remove("base_link");
1497 
1498  KinematicsPluginFactory factory(config, locator);
1499  auto kin = factory.createInvKin("manipulator", "KDLInvKinChainNR_JL", *scene_graph, scene_state);
1500  EXPECT_TRUE(kin == nullptr);
1501  }
1502  { // KDLFwdKinChain missing tip_link
1503  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1504  auto plugin = config["kinematic_plugins"]["fwd_kin_plugins"]["manipulator"]["plugins"]["KDLFwdKinChain"];
1505  plugin["config"].remove("tip_link");
1506 
1507  KinematicsPluginFactory factory(config, locator);
1508  auto kin = factory.createFwdKin("manipulator", "KDLFwdKinChain", *scene_graph, scene_state);
1509  EXPECT_TRUE(kin == nullptr);
1510  }
1511  { // KDLInvKinChainLMA missing tip_link
1512  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1513  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["KDLInvKinChainLMA"];
1514  plugin["config"].remove("tip_link");
1515 
1516  KinematicsPluginFactory factory(config, locator);
1517  auto kin = factory.createInvKin("manipulator", "KDLInvKinChainLMA", *scene_graph, scene_state);
1518  EXPECT_TRUE(kin == nullptr);
1519  }
1520  { // KDLInvKinChainNR missing tip_link
1521  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1522  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["KDLInvKinChainNR"];
1523  plugin["config"].remove("tip_link");
1524 
1525  KinematicsPluginFactory factory(config, locator);
1526  auto kin = factory.createInvKin("manipulator", "KDLInvKinChainNR", *scene_graph, scene_state);
1527  EXPECT_TRUE(kin == nullptr);
1528  }
1529  { // KDLInvKinChainNR_JL missing tip_link
1530  YAML::Node config = tesseract_common::loadYamlString(yaml_string, locator);
1531  auto plugin = config["kinematic_plugins"]["inv_kin_plugins"]["manipulator"]["plugins"]["KDLInvKinChainNR_JL"];
1532  plugin["config"].remove("tip_link");
1533 
1534  KinematicsPluginFactory factory(config, locator);
1535  auto kin = factory.createInvKin("manipulator", "KDLInvKinChainNR_JL", *scene_graph, scene_state);
1536  EXPECT_TRUE(kin == nullptr);
1537  }
1538 }
1539 
1540 int main(int argc, char** argv)
1541 {
1542  testing::InitGoogleTest(&argc, argv);
1543 
1544  return RUN_ALL_TESTS();
1545 }
tesseract_scene_graph::KDLStateSolver::getState
SceneState getState() const override final
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::getTempPath
std::string getTempPath()
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
kdl_state_solver.h
runKinematicsFactoryTest
void runKinematicsFactoryTest(const std::filesystem::path &config_path)
Definition: kinematics_factory_unit.cpp:41
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
kinematics_test_utils.h
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
tesseract_kinematics::test_suite::getSceneGraphUR
tesseract_scene_graph::SceneGraph::UPtr getSceneGraphUR(const tesseract_kinematics::URParameters &params, double shoulder_offset, double elbow_offset)
Definition: kinematics_test_utils.h:89
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_scene_graph::SceneGraph::UPtr
std::unique_ptr< SceneGraph > UPtr
tesseract_kinematics::test_suite::getSceneGraphABBExternalPositioner
tesseract_scene_graph::SceneGraph::UPtr getSceneGraphABBExternalPositioner(const tesseract_common::ResourceLocator &locator)
Definition: kinematics_test_utils.h:62
tesseract_kinematics::InverseKinematics::UPtr
std::unique_ptr< InverseKinematics > UPtr
Definition: inverse_kinematics.h:52
tesseract_kinematics::test_suite::getSceneGraphIIWA
tesseract_scene_graph::SceneGraph::UPtr getSceneGraphIIWA(const tesseract_common::ResourceLocator &locator)
Definition: kinematics_test_utils.h:55
tesseract_kinematics::KinematicsPluginFactory::getSearchPaths
std::set< std::string > getSearchPaths() const
Get the plugin search paths.
Definition: kinematics_plugin_factory.cpp:103
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
main
int main(int argc, char **argv)
Definition: kinematics_factory_unit.cpp:1327
tesseract_scene_graph::KDLStateSolver
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::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_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_kinematics::test_suite
Definition: kinematics_test_utils.h:53
tesseract_kinematics::test_suite::getSceneGraphABBOnPositioner
tesseract_scene_graph::SceneGraph::UPtr getSceneGraphABBOnPositioner(const tesseract_common::ResourceLocator &locator)
Definition: kinematics_test_utils.h:70
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_common::loadYamlFile
YAML::Node loadYamlFile(const std::string &file_path, const ResourceLocator &locator)
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_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
kinematics_plugin_factory.h
Kinematics Plugin Factory.
TESSERACT_COMMON_IGNORE_WARNINGS_POP
#define TESSERACT_COMMON_IGNORE_WARNINGS_POP
tesseract_kinematics::UR10Parameters
const static URParameters UR10Parameters(0.1273, -0.612, -0.5723, 0.163941, 0.1157, 0.0922)
The UR10 kinematic parameters.
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::ForwardKinematics::UPtr
std::unique_ptr< ForwardKinematics > UPtr
Definition: forward_kinematics.h:52
TEST
TEST(TesseractKinematicsFactoryUnit, KDL_OPW_UR_ROP_REP_PluginTest)
Definition: kinematics_factory_unit.cpp:152
tesseract_kinematics
Definition: forward_kinematics.h:40
tesseract_common::GeneralResourceLocator
tesseract_kinematics::KinematicsPluginFactory::getSearchLibraries
std::set< std::string > getSearchLibraries() const
Get the plugin search libraries.
Definition: kinematics_plugin_factory.cpp:110
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_scene_graph
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_kinematics::test_suite::getSceneGraphABB
tesseract_scene_graph::SceneGraph::UPtr getSceneGraphABB(const tesseract_common::ResourceLocator &locator)
Definition: kinematics_test_utils.h:77


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