xml_testdata_loader.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018 Pilz GmbH & Co. KG
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
18 
19 #include <iostream>
20 
21 #include <boost/property_tree/xml_parser.hpp>
22 #include <boost/algorithm/string.hpp>
23 #include <boost/optional.hpp>
24 
28 
29 namespace pt = boost::property_tree;
31 {
32 class CmdReader
33 {
34 public:
35  CmdReader(const pt::ptree::value_type& node) : cmd_node_(node)
36  {
37  }
38 
39 public:
40  std::string getPlanningGroup() const;
41  std::string getTargetLink() const;
42  std::string getStartPoseName() const;
43  std::string getEndPoseName() const;
44 
45  double getVelocityScale() const;
46  double getAccelerationScale() const;
47 
48  CmdReader& setDefaultVelocityScale(double scale);
50 
51 private:
52  const pt::ptree::value_type& cmd_node_;
53 
56 };
57 
58 inline std::string CmdReader::getPlanningGroup() const
59 {
60  return cmd_node_.second.get<std::string>(PLANNING_GROUP_STR);
61 }
62 
63 inline std::string CmdReader::getTargetLink() const
64 {
65  return cmd_node_.second.get<std::string>(TARGET_LINK_STR);
66 }
67 
68 inline std::string CmdReader::getStartPoseName() const
69 {
70  return cmd_node_.second.get<std::string>(START_POS_STR);
71 }
72 
73 inline std::string CmdReader::getEndPoseName() const
74 {
75  return cmd_node_.second.get<std::string>(END_POS_STR);
76 }
77 
78 inline double CmdReader::getVelocityScale() const
79 {
80  return cmd_node_.second.get<double>(VEL_STR, default_velocity_scale_);
81 }
82 
83 inline double CmdReader::getAccelerationScale() const
84 {
85  return cmd_node_.second.get<double>(ACC_STR, default_acceleration_scale_);
86 }
87 
89 {
91  return *this;
92 }
93 
95 {
97  return *this;
98 }
99 
100 template <class CmdType>
102 {
103 public:
104  using FuncType = std::function<CmdType(const std::string&)>;
105 
106  CmdGetterAdapter(FuncType func) : AbstractCmdGetterAdapter(), func_(func)
107  {
108  }
109 
110 public:
111  CmdVariant getCmd(const std::string& cmd_name) const override
112  {
113  return CmdVariant(func_(cmd_name));
114  }
115 
116 private:
118 };
119 
120 XmlTestdataLoader::XmlTestdataLoader(const std::string& path_filename) : TestdataLoader(), path_filename_(path_filename)
121 {
122  // Parse the XML into the property tree.
123  pt::read_xml(path_filename_, tree_, pt::xml_parser::no_comments);
124 
125  using std::placeholders::_1;
126  cmd_getter_funcs_["ptp"] =
128  cmd_getter_funcs_["ptp_joint_cart"] = AbstractCmdGetterUPtr(
130  cmd_getter_funcs_["ptp_cart_cart"] =
132 
133  cmd_getter_funcs_["lin"] =
135  cmd_getter_funcs_["lin_cart"] =
137 
138  cmd_getter_funcs_["circ_center_cart"] = AbstractCmdGetterUPtr(
140  cmd_getter_funcs_["circ_interim_cart"] = AbstractCmdGetterUPtr(
142  cmd_getter_funcs_["circ_joint_interim_cart"] = AbstractCmdGetterUPtr(
144 
145  cmd_getter_funcs_["gripper"] =
147 }
148 
149 XmlTestdataLoader::XmlTestdataLoader(const std::string& path_filename,
150  const moveit::core::RobotModelConstPtr& robot_model)
151  : XmlTestdataLoader(path_filename)
152 {
153  setRobotModel(robot_model);
154 }
155 
157 {
158 }
159 
160 const pt::ptree::value_type& XmlTestdataLoader::findNodeWithName(const boost::property_tree::ptree& tree,
161  const std::string& name,
162  const std::string& key,
163  const std::string& path) const
164 {
165  std::string path_str{ (path.empty() ? NAME_PATH_STR : path) };
166 
167  // Search for node with given name.
168  for (const pt::ptree::value_type& val : tree)
169  {
170  // Ignore attributes which are always the first element of a tree.
171  if (val.first == XML_ATTR_STR)
172  {
173  continue;
174  }
175 
176  if (val.first != key)
177  {
178  continue;
179  }
180 
181  const auto& node{ val.second.get_child(path_str, empty_tree_) };
182  if (node == empty_tree_)
183  {
184  break;
185  }
186  if (node.data() == name)
187  {
188  return val;
189  }
190  }
191 
192  std::string msg;
193  msg.append("Node of type \"")
194  .append(key)
195  .append("\" with ")
196  .append(path_str)
197  .append("=\"")
198  .append(name)
199  .append("\" not found.");
201 }
202 
203 JointConfiguration XmlTestdataLoader::getJoints(const std::string& pos_name, const std::string& group_name) const
204 {
205  // Search for node with given name.
206  const auto& poses_tree{ tree_.get_child(POSES_PATH_STR, empty_tree_) };
207  if (poses_tree == empty_tree_)
208  {
209  throw TestDataLoaderReadingException("No poses found.");
210  }
211  return getJoints(findNodeWithName(poses_tree, pos_name, POSE_STR).second, group_name);
212 }
213 
214 JointConfiguration XmlTestdataLoader::getJoints(const boost::property_tree::ptree& joints_tree,
215  const std::string& group_name) const
216 {
217  // Search joints node with given group_name.
218  if (joints_tree == empty_tree_)
219  {
220  throw TestDataLoaderReadingException("No joints found.");
221  }
222  const auto& joint_node{ findNodeWithName(joints_tree, group_name, JOINT_STR, GROUP_NAME_PATH_STR) };
223 
224  std::vector<std::string> strs;
225  boost::split(strs, joint_node.second.data(), boost::is_any_of(" "));
226  return JointConfiguration(group_name, strVec2doubleVec(strs), robot_model_);
227 }
228 
229 CartesianConfiguration XmlTestdataLoader::getPose(const std::string& pos_name, const std::string& group_name) const
230 {
231  const auto& all_poses_tree{ tree_.get_child(POSES_PATH_STR, empty_tree_) };
232  if (all_poses_tree == empty_tree_)
233  {
234  throw TestDataLoaderReadingException("No poses found.");
235  }
236  const auto& pose_tree{ findNodeWithName(all_poses_tree, pos_name, POSE_STR).second };
237  const auto& xyz_quat_tree{ findNodeWithName(pose_tree, group_name, XYZ_QUAT_STR, GROUP_NAME_PATH_STR).second };
238  const boost::property_tree::ptree& link_name_attr{ xyz_quat_tree.get_child(LINK_NAME_PATH_STR, empty_tree_) };
239  if (link_name_attr == empty_tree_)
240  {
241  throw TestDataLoaderReadingException("No link name found.");
242  }
243 
244  // Get rid of things like "\n", etc.
245  std::string data{ xyz_quat_tree.data() };
246  boost::trim(data);
247 
248  std::vector<std::string> pos_ori_str;
249  boost::split(pos_ori_str, data, boost::is_any_of(" "));
251  group_name, link_name_attr.data(), strVec2doubleVec(pos_ori_str), robot_model_) };
252 
253  const auto& seeds_tree{ xyz_quat_tree.get_child(SEED_STR, empty_tree_) };
254  if (seeds_tree != empty_tree_)
255  {
256  cart_config.setSeed(getJoints(seeds_tree, group_name));
257  }
258  return cart_config;
259 }
260 
261 PtpJoint XmlTestdataLoader::getPtpJoint(const std::string& cmd_name) const
262 {
263  CmdReader cmd_reader{ findCmd(cmd_name, PTPS_PATH_STR, PTP_STR) };
264  std::string planning_group{ cmd_reader.getPlanningGroup() };
265 
266  PtpJoint cmd;
267  cmd.setPlanningGroup(planning_group);
268  cmd.setVelocityScale(cmd_reader.getVelocityScale());
269  cmd.setAccelerationScale(cmd_reader.getAccelerationScale());
270 
271  cmd.setStartConfiguration(getJoints(cmd_reader.getStartPoseName(), planning_group));
272  cmd.setGoalConfiguration(getJoints(cmd_reader.getEndPoseName(), planning_group));
273 
274  return cmd;
275 }
276 
277 PtpJointCart XmlTestdataLoader::getPtpJointCart(const std::string& cmd_name) const
278 {
279  CmdReader cmd_reader{ findCmd(cmd_name, PTPS_PATH_STR, PTP_STR) };
280  std::string planning_group{ cmd_reader.getPlanningGroup() };
281 
283  cmd.setPlanningGroup(planning_group);
284  cmd.setVelocityScale(cmd_reader.getVelocityScale());
285  cmd.setAccelerationScale(cmd_reader.getAccelerationScale());
286 
287  cmd.setStartConfiguration(getJoints(cmd_reader.getStartPoseName(), planning_group));
288  cmd.setGoalConfiguration(getPose(cmd_reader.getEndPoseName(), planning_group));
289 
290  return cmd;
291 }
292 
293 PtpCart XmlTestdataLoader::getPtpCart(const std::string& cmd_name) const
294 {
295  CmdReader cmd_reader{ findCmd(cmd_name, PTPS_PATH_STR, PTP_STR) };
296  std::string planning_group{ cmd_reader.getPlanningGroup() };
297 
298  PtpCart cmd;
299  cmd.setPlanningGroup(planning_group);
300  cmd.setVelocityScale(cmd_reader.getVelocityScale());
301  cmd.setAccelerationScale(cmd_reader.getAccelerationScale());
302 
303  cmd.setStartConfiguration(getPose(cmd_reader.getStartPoseName(), planning_group));
304  cmd.setGoalConfiguration(getPose(cmd_reader.getEndPoseName(), planning_group));
305 
306  return cmd;
307 }
308 
309 LinJoint XmlTestdataLoader::getLinJoint(const std::string& cmd_name) const
310 {
311  CmdReader cmd_reader{ findCmd(cmd_name, LINS_PATH_STR, LIN_STR) };
312  std::string planning_group{ cmd_reader.getPlanningGroup() };
313 
314  LinJoint cmd;
315  cmd.setPlanningGroup(planning_group);
316  cmd.setVelocityScale(cmd_reader.getVelocityScale());
317  cmd.setAccelerationScale(cmd_reader.getAccelerationScale());
318 
319  cmd.setStartConfiguration(getJoints(cmd_reader.getStartPoseName(), planning_group));
320  cmd.setGoalConfiguration(getJoints(cmd_reader.getEndPoseName(), planning_group));
321 
322  return cmd;
323 }
324 
325 LinCart XmlTestdataLoader::getLinCart(const std::string& cmd_name) const
326 {
327  CmdReader cmd_reader{ findCmd(cmd_name, LINS_PATH_STR, LIN_STR) };
328  std::string planning_group{ cmd_reader.getPlanningGroup() };
329 
330  LinCart cmd;
331  cmd.setPlanningGroup(planning_group);
332  cmd.setVelocityScale(cmd_reader.getVelocityScale());
333  cmd.setAccelerationScale(cmd_reader.getAccelerationScale());
334 
335  cmd.setStartConfiguration(getPose(cmd_reader.getStartPoseName(), planning_group));
336  cmd.setGoalConfiguration(getPose(cmd_reader.getEndPoseName(), planning_group));
337 
338  return cmd;
339 }
340 
341 LinJointCart XmlTestdataLoader::getLinJointCart(const std::string& cmd_name) const
342 {
343  CmdReader cmd_reader{ findCmd(cmd_name, LINS_PATH_STR, LIN_STR) };
344  std::string planning_group{ cmd_reader.getPlanningGroup() };
345 
347  cmd.setPlanningGroup(planning_group);
348  cmd.setVelocityScale(cmd_reader.getVelocityScale());
349  cmd.setAccelerationScale(cmd_reader.getAccelerationScale());
350 
351  cmd.setStartConfiguration(getJoints(cmd_reader.getStartPoseName(), planning_group));
352  cmd.setGoalConfiguration(getPose(cmd_reader.getEndPoseName(), planning_group));
353 
354  return cmd;
355 }
356 
357 const pt::ptree::value_type& XmlTestdataLoader::findCmd(const std::string& cmd_name,
358  const std::string& cmd_path,
359  const std::string& cmd_key) const
360 {
361  // Search for node with given name.
362  const boost::property_tree::ptree& cmds_tree{ tree_.get_child(cmd_path, empty_tree_) };
363  if (cmds_tree == empty_tree_)
364  {
365  throw TestDataLoaderReadingException("No list of commands of type \"" + cmd_key + "\" found");
366  }
367 
368  return findNodeWithName(cmds_tree, cmd_name, cmd_key);
369 }
370 
372  const std::string& planning_group) const
373 {
374  const pt::ptree::value_type& cmd_node{ findCmd(cmd_name, CIRCS_PATH_STR, CIRC_STR) };
375  std::string aux_pos_name;
376  try
377  {
378  aux_pos_name = cmd_node.second.get<std::string>(CENTER_POS_STR);
379  }
380  catch (...)
381  {
382  throw TestDataLoaderReadingException("Did not find center of circ");
383  }
384 
385  CartesianCenter aux;
386  aux.setConfiguration(getPose(aux_pos_name, planning_group));
387  return aux;
388 }
389 
391  const std::string& planning_group) const
392 {
393  const pt::ptree::value_type& cmd_node{ findCmd(cmd_name, CIRCS_PATH_STR, CIRC_STR) };
394  std::string aux_pos_name;
395  try
396  {
397  aux_pos_name = cmd_node.second.get<std::string>(INTERMEDIATE_POS_STR);
398  }
399  catch (...)
400  {
401  throw TestDataLoaderReadingException("Did not find interim of circ");
402  }
403 
404  CartesianInterim aux;
405  aux.setConfiguration(getPose(aux_pos_name, planning_group));
406  return aux;
407 }
408 
410 {
411  CmdReader cmd_reader{ findCmd(cmd_name, CIRCS_PATH_STR, CIRC_STR) };
412  std::string planning_group{ cmd_reader.getPlanningGroup() };
413 
415  cmd.setPlanningGroup(planning_group);
416  cmd.setVelocityScale(cmd_reader.getVelocityScale());
417  cmd.setAccelerationScale(cmd_reader.getAccelerationScale());
418 
419  cmd.setStartConfiguration(getPose(cmd_reader.getStartPoseName(), planning_group));
420  cmd.setAuxiliaryConfiguration(getCartesianCenter(cmd_name, planning_group));
421  cmd.setGoalConfiguration(getPose(cmd_reader.getEndPoseName(), planning_group));
422 
423  return cmd;
424 }
425 
427 {
428  CmdReader cmd_reader{ findCmd(cmd_name, CIRCS_PATH_STR, CIRC_STR) };
429  std::string planning_group{ cmd_reader.getPlanningGroup() };
430 
432  cmd.setPlanningGroup(planning_group);
433  cmd.setVelocityScale(cmd_reader.getVelocityScale());
434  cmd.setAccelerationScale(cmd_reader.getAccelerationScale());
435 
436  cmd.setStartConfiguration(getPose(cmd_reader.getStartPoseName(), planning_group));
437  cmd.setAuxiliaryConfiguration(getCartesianInterim(cmd_name, planning_group));
438  cmd.setGoalConfiguration(getPose(cmd_reader.getEndPoseName(), planning_group));
439 
440  return cmd;
441 }
442 
444 {
445  CmdReader cmd_reader{ findCmd(cmd_name, CIRCS_PATH_STR, CIRC_STR) };
446  std::string planning_group{ cmd_reader.getPlanningGroup() };
447 
449  cmd.setPlanningGroup(planning_group);
450  cmd.setVelocityScale(cmd_reader.getVelocityScale());
451  cmd.setAccelerationScale(cmd_reader.getAccelerationScale());
452 
453  cmd.setStartConfiguration(getJoints(cmd_reader.getStartPoseName(), planning_group));
454  cmd.setAuxiliaryConfiguration(getCartesianInterim(cmd_name, planning_group));
455  cmd.setGoalConfiguration(getJoints(cmd_reader.getEndPoseName(), planning_group));
456 
457  return cmd;
458 }
459 
461 {
462  CmdReader cmd_reader{ findCmd(cmd_name, CIRCS_PATH_STR, CIRC_STR) };
463  std::string planning_group{ cmd_reader.getPlanningGroup() };
464 
466  cmd.setPlanningGroup(planning_group);
467  cmd.setVelocityScale(cmd_reader.getVelocityScale());
468  cmd.setAccelerationScale(cmd_reader.getAccelerationScale());
469 
470  cmd.setStartConfiguration(getJoints(cmd_reader.getStartPoseName(), planning_group));
471  cmd.setAuxiliaryConfiguration(getCartesianCenter(cmd_name, planning_group));
472  cmd.setGoalConfiguration(getJoints(cmd_reader.getEndPoseName(), planning_group));
473 
474  return cmd;
475 }
476 
477 Sequence XmlTestdataLoader::getSequence(const std::string& cmd_name) const
478 {
479  Sequence seq;
480 
481  // Find sequence with given name and loop over all its cmds
482  const auto& sequence_cmd_tree{ findCmd(cmd_name, SEQUENCE_PATH_STR, BLEND_STR).second };
483  for (const pt::ptree::value_type& seq_cmd : sequence_cmd_tree)
484  {
485  // Ignore attributes which are always the first element of a tree.
486  if (seq_cmd.first == XML_ATTR_STR)
487  {
488  continue;
489  }
490 
491  // Get name of blend cmd.
492  const boost::property_tree::ptree& cmd_name_attr = seq_cmd.second.get_child(NAME_PATH_STR, empty_tree_);
493  if (cmd_name_attr == empty_tree_)
494  {
495  throw TestDataLoaderReadingException("Did not find name of sequence cmd");
496  }
497 
498  const std::string& cmd_name{ cmd_name_attr.data() };
499 
500  // Get type of blend cmd
501  const boost::property_tree::ptree& type_name_attr{ seq_cmd.second.get_child(CMD_TYPE_PATH_STR, empty_tree_) };
502  if (type_name_attr == empty_tree_)
503  {
504  throw TestDataLoaderReadingException("Did not find type of sequence cmd \"" + cmd_name + "\"");
505  }
506  const std::string& cmd_type{ type_name_attr.data() };
507 
508  // Get blend radius of blend cmd.
509  double blend_radius{ seq_cmd.second.get<double>(BLEND_RADIUS_PATH_STR, DEFAULT_BLEND_RADIUS) };
510 
511  // Read current command from test data + Add command to sequence
512  seq.add(cmd_getter_funcs_.at(cmd_type)->getCmd(cmd_name), blend_radius);
513  }
514 
515  return seq;
516 }
517 
518 Gripper XmlTestdataLoader::getGripper(const std::string& cmd_name) const
519 {
520  CmdReader cmd_reader{ findCmd(cmd_name, GRIPPERS_PATH_STR, GRIPPER_STR) };
521  cmd_reader.setDefaultVelocityScale(DEFAULT_VEL_GRIPPER);
522  cmd_reader.setDefaultAccelerationScale(DEFAULT_ACC_GRIPPER);
523  std::string planning_group{ cmd_reader.getPlanningGroup() };
524 
525  Gripper cmd;
526  cmd.setPlanningGroup(planning_group);
527  cmd.setVelocityScale(cmd_reader.getVelocityScale());
528  cmd.setAccelerationScale(cmd_reader.getAccelerationScale());
529 
530  cmd.setStartConfiguration(getJoints(cmd_reader.getStartPoseName(), planning_group));
531  cmd.setGoalConfiguration(getJoints(cmd_reader.getEndPoseName(), planning_group));
532 
533  return cmd;
534 }
535 
536 } // namespace pilz_industrial_motion_testutils
static std::vector< double > strVec2doubleVec(std::vector< std::string > &strVec)
Converts string vector to double vector.
static constexpr double DEFAULT_VEL
virtual CircInterimCart getCircCartInterimCart(const std::string &cmd_name) const override
std::map< std::string, AbstractCmdGetterUPtr > cmd_getter_funcs_
virtual LinCart getLinCart(const std::string &cmd_name) const override
const std::string CMD_TYPE_PATH_STR
Definition: xml_constants.h:56
static constexpr double DEFAULT_ACC
virtual CircCenterCart getCircCartCenterCart(const std::string &cmd_name) const override
Returns the command with the specified name from the test data.
static constexpr double DEFAULT_VEL_GRIPPER
string cmd
Data class storing all information regarding a Circ command.
Definition: circ.h:31
virtual LinJoint getLinJoint(const std::string &cmd_name) const override
Returns the command with the specified name from the test data.
virtual PtpCart getPtpCart(const std::string &cmd_name) const override
virtual LinJointCart getLinJointCart(const std::string &cmd_name) const override
Implements a test data loader which uses a xml file to store the test data.
void setGoalConfiguration(GoalType goal)
Definition: basecmd.h:64
const std::string BLEND_RADIUS_PATH_STR
Definition: xml_constants.h:57
Data class storing all information regarding a linear command.
Definition: lin.h:30
const pt::ptree::value_type & findCmd(const std::string &cmd_name, const std::string &cmd_path, const std::string &cmd_key) const
Use this function to search for a cmd-node with a given name.
void setAuxiliaryConfiguration(AuxiliaryType auxiliary)
Definition: circ.h:55
void setStartConfiguration(StartType start)
Definition: basecmd.h:58
data
Abstract base class providing a GENERIC getter-function signature which can be used to load DIFFERENT...
void setPlanningGroup(const std::string &planning_group)
Definition: motioncmd.h:52
Class to define a robot configuration in space with the help of joint values.
const std::string CIRCS_PATH_STR
Definition: xml_constants.h:51
virtual JointConfiguration getJoints(const std::string &pos_name, const std::string &group_name) const override
const std::string GROUP_NAME_PATH_STR
Definition: xml_constants.h:59
virtual Sequence getSequence(const std::string &cmd_name) const override
Returns the command with the specified name from the test data.
void setConfiguration(const ConfigType &auxiliary_config)
Definition: circauxiliary.h:49
const std::string CENTER_POS_STR
Definition: xml_constants.h:44
Data class storing all information regarding a Sequence command.
Definition: sequence.h:35
virtual CircJointCenterCart getCircJointCenterCart(const std::string &cmd_name) const override
const std::string PLANNING_GROUP_STR
Definition: xml_constants.h:39
const std::string SEQUENCE_PATH_STR
Definition: xml_constants.h:52
const std::string LINK_NAME_PATH_STR
Definition: xml_constants.h:58
void add(const CmdVariant &cmd, const double blend_radius=0.)
Adds a command to the end of the sequence.
Definition: sequence.h:85
moveit::core::RobotModelConstPtr robot_model_
virtual CircJointInterimCart getCircJointInterimCart(const std::string &cmd_name) const override
CmdVariant getCmd(const std::string &cmd_name) const override
CartesianCenter getCartesianCenter(const std::string &cmd_name, const std::string &planning_group) const
const std::string GRIPPERS_PATH_STR
Definition: xml_constants.h:53
Abstract base class describing the interface to access test data like robot poses and robot commands...
void setAccelerationScale(double acceleration_scale)
Definition: motioncmd.h:67
void setRobotModel(moveit::core::RobotModelConstPtr robot_model)
static constexpr double DEFAULT_ACC_GRIPPER
const pt::ptree::value_type & findNodeWithName(const boost::property_tree::ptree &tree, const std::string &name, const std::string &key, const std::string &path="") const
Use this function to search for a node (like an pos or cmd) with a given name.
void setVelocityScale(double velocity_scale)
Definition: motioncmd.h:62
static constexpr double DEFAULT_BLEND_RADIUS
Class to define a point on the circle on which the robot is supposed to move via circ command...
Definition: interim.h:29
boost::variant< PtpJoint, PtpJointCart, PtpCart, LinJoint, LinCart, CircCenterCart, CircInterimCart, CircJointCenterCart, CircJointInterimCart, Gripper > CmdVariant
const std::string POSES_PATH_STR
Definition: xml_constants.h:48
virtual CartesianConfiguration getPose(const std::string &pos_name, const std::string &group_name) const override
Class to define a robot configuration in space with the help of cartesian coordinates.
const std::string TARGET_LINK_STR
Definition: xml_constants.h:40
Class to define the center point of the circle on which the robot is supposed to move via circ comman...
Definition: center.h:29
virtual Gripper getGripper(const std::string &cmd_name) const override
Returns the command with the specified name from the test data.
virtual PtpJointCart getPtpJointCart(const std::string &cmd_name) const override
std::function< CmdType(const std::string &)> FuncType
std::unique_ptr< AbstractCmdGetterAdapter > AbstractCmdGetterUPtr
CartesianInterim getCartesianInterim(const std::string &cmd_name, const std::string &planning_group) const
CmdReader(const pt::ptree::value_type &node)
const std::string INTERMEDIATE_POS_STR
Definition: xml_constants.h:43
virtual PtpJoint getPtpJoint(const std::string &cmd_name) const override
Returns the command with the specified name from the test data.


pilz_industrial_motion_testutils
Author(s):
autogenerated on Mon Feb 28 2022 23:13:36