moveit2
The MoveIt Motion Planning Framework for ROS 2.
conversions.cpp
Go to the documentation of this file.
1 /*********************************************************************
2  * Software License Agreement (BSD License)
3  *
4  * Copyright (c) 2013, Ioan A. Sucan
5  * Copyright (c) 2011-2013, Willow Garage, Inc.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * * Redistributions of source code must retain the above copyright
13  * notice, this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above
15  * copyright notice, this list of conditions and the following
16  * disclaimer in the documentation and/or other materials provided
17  * with the distribution.
18  * * Neither the name of the Willow Garage nor the names of its
19  * contributors may be used to endorse or promote products derived
20  * from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33  * POSSIBILITY OF SUCH DAMAGE.
34  *********************************************************************/
35 
36 /* Author: Ioan Sucan, Dave Coleman */
37 
39 #include <geometric_shapes/shape_operations.h>
40 #include <rclcpp/logger.hpp>
41 #include <rclcpp/logging.hpp>
42 #include <tf2_eigen/tf2_eigen.hpp>
43 #include <string>
44 
45 namespace moveit
46 {
47 namespace core
48 {
49 // ********************************************
50 // * Internal (hidden) functions
51 // ********************************************
52 
53 namespace
54 {
55 // Logger
56 static const rclcpp::Logger LOGGER = rclcpp::get_logger("moveit_robot_state.conversions");
57 
58 static bool _jointStateToRobotState(const sensor_msgs::msg::JointState& joint_state, RobotState& state)
59 {
60  if (joint_state.name.size() != joint_state.position.size())
61  {
62  RCLCPP_ERROR(LOGGER, "Different number of names and positions in JointState message: %zu, %zu",
63  joint_state.name.size(), joint_state.position.size());
64  return false;
65  }
66 
67  state.setVariableValues(joint_state);
68 
69  return true;
70 }
71 
72 static bool _multiDOFJointsToRobotState(const sensor_msgs::msg::MultiDOFJointState& mjs, RobotState& state,
73  const Transforms* tf)
74 {
75  std::size_t nj = mjs.joint_names.size();
76  if (nj != mjs.transforms.size())
77  {
78  RCLCPP_ERROR(LOGGER, "Different number of names, values or frames in MultiDOFJointState message.");
79  return false;
80  }
81 
82  bool error = false;
83  Eigen::Isometry3d inv_t;
84  bool use_inv_t = false;
85 
86  if (nj > 0 && !Transforms::sameFrame(mjs.header.frame_id, state.getRobotModel()->getModelFrame()))
87  {
88  if (tf)
89  try
90  {
91  // find the transform that takes the given frame_id to the desired fixed frame
92  const Eigen::Isometry3d& t2fixed_frame = tf->getTransform(mjs.header.frame_id);
93  // we update the value of the transform so that it transforms from the known fixed frame to the desired child
94  // link
95  inv_t = t2fixed_frame.inverse();
96  use_inv_t = true;
97  }
98  catch (std::exception& ex)
99  {
100  RCLCPP_ERROR(LOGGER, "Caught %s", ex.what());
101  error = true;
102  }
103  else
104  error = true;
105 
106  if (error)
107  RCLCPP_WARN(LOGGER,
108  "The transform for multi-dof joints was specified in frame '%s' "
109  "but it was not possible to transform that to frame '%s'",
110  mjs.header.frame_id.c_str(), state.getRobotModel()->getModelFrame().c_str());
111  }
112 
113  for (std::size_t i = 0; i < nj; ++i)
114  {
115  const std::string& joint_name = mjs.joint_names[i];
116  if (!state.getRobotModel()->hasJointModel(joint_name))
117  {
118  RCLCPP_WARN(LOGGER, "No joint matching multi-dof joint '%s'", joint_name.c_str());
119  error = true;
120  continue;
121  }
122  Eigen::Isometry3d transf = tf2::transformToEigen(mjs.transforms[i]);
123  // if frames do not mach, attempt to transform
124  if (use_inv_t)
125  transf = transf * inv_t;
126 
127  state.setJointPositions(joint_name, transf);
128  }
129 
130  return !error;
131 }
132 
133 static inline void _robotStateToMultiDOFJointState(const RobotState& state, sensor_msgs::msg::MultiDOFJointState& mjs)
134 {
135  const std::vector<const JointModel*>& js = state.getRobotModel()->getMultiDOFJointModels();
136  mjs.joint_names.clear();
137  mjs.transforms.clear();
138  for (const JointModel* joint_model : js)
139  {
140  geometry_msgs::msg::TransformStamped p;
141  if (state.dirtyJointTransform(joint_model))
142  {
143  Eigen::Isometry3d t;
144  t.setIdentity();
145  joint_model->computeTransform(state.getJointPositions(joint_model), t);
146  p = tf2::eigenToTransform(t);
147  }
148  else
149  p = tf2::eigenToTransform(state.getJointTransform(joint_model));
150  mjs.joint_names.push_back(joint_model->getName());
151  mjs.transforms.push_back(p.transform);
152  }
153  mjs.header.frame_id = state.getRobotModel()->getModelFrame();
154 }
155 
156 class ShapeVisitorAddToCollisionObject : public boost::static_visitor<void>
157 {
158 public:
159  ShapeVisitorAddToCollisionObject(moveit_msgs::msg::CollisionObject* obj) : boost::static_visitor<void>(), obj_(obj)
160  {
161  }
162 
163  void addToObject(const shapes::ShapeMsg& sm, const geometry_msgs::msg::Pose& pose)
164  {
165  pose_ = &pose;
166  boost::apply_visitor(*this, sm);
167  }
168 
169  void operator()(const shape_msgs::msg::Plane& shape_msg) const
170  {
171  obj_->planes.push_back(shape_msg);
172  obj_->plane_poses.push_back(*pose_);
173  }
174 
175  void operator()(const shape_msgs::msg::Mesh& shape_msg) const
176  {
177  obj_->meshes.push_back(shape_msg);
178  obj_->mesh_poses.push_back(*pose_);
179  }
180 
181  void operator()(const shape_msgs::msg::SolidPrimitive& shape_msg) const
182  {
183  obj_->primitives.push_back(shape_msg);
184  obj_->primitive_poses.push_back(*pose_);
185  }
186 
187 private:
188  moveit_msgs::msg::CollisionObject* obj_;
189  const geometry_msgs::msg::Pose* pose_;
190 };
191 
192 static void _attachedBodyToMsg(const AttachedBody& attached_body, moveit_msgs::msg::AttachedCollisionObject& aco)
193 {
194  aco.link_name = attached_body.getAttachedLinkName();
195  aco.detach_posture = attached_body.getDetachPosture();
196  const std::set<std::string>& touch_links = attached_body.getTouchLinks();
197  aco.touch_links.clear();
198  for (const std::string& touch_link : touch_links)
199  aco.touch_links.push_back(touch_link);
200  aco.object.header.frame_id = aco.link_name;
201  aco.object.id = attached_body.getName();
202  aco.object.pose = tf2::toMsg(attached_body.getPose());
203 
204  aco.object.operation = moveit_msgs::msg::CollisionObject::ADD;
205  const std::vector<shapes::ShapeConstPtr>& ab_shapes = attached_body.getShapes();
206  const EigenSTL::vector_Isometry3d& shape_poses = attached_body.getShapePoses();
207  ShapeVisitorAddToCollisionObject sv(&aco.object);
208  aco.object.primitives.clear();
209  aco.object.meshes.clear();
210  aco.object.planes.clear();
211  aco.object.primitive_poses.clear();
212  aco.object.mesh_poses.clear();
213  aco.object.plane_poses.clear();
214  for (std::size_t j = 0; j < ab_shapes.size(); ++j)
215  {
216  shapes::ShapeMsg sm;
217  if (shapes::constructMsgFromShape(ab_shapes[j].get(), sm))
218  {
219  geometry_msgs::msg::Pose p;
220  p = tf2::toMsg(shape_poses[j]);
221  sv.addToObject(sm, p);
222  }
223  }
224  aco.object.subframe_names.clear();
225  aco.object.subframe_poses.clear();
226  for (const auto& frame_pair : attached_body.getSubframes())
227  {
228  aco.object.subframe_names.push_back(frame_pair.first);
229  geometry_msgs::msg::Pose pose;
230  pose = tf2::toMsg(frame_pair.second);
231  aco.object.subframe_poses.push_back(pose);
232  }
233 }
234 
235 static void _msgToAttachedBody(const Transforms* tf, const moveit_msgs::msg::AttachedCollisionObject& aco,
236  RobotState& state)
237 {
238  if (aco.object.operation == moveit_msgs::msg::CollisionObject::ADD)
239  {
240  if (!aco.object.primitives.empty() || !aco.object.meshes.empty() || !aco.object.planes.empty())
241  {
242  if (aco.object.primitives.size() != aco.object.primitive_poses.size())
243  {
244  RCLCPP_ERROR(LOGGER, "Number of primitive shapes does not match "
245  "number of poses in collision object message");
246  return;
247  }
248 
249  if (aco.object.meshes.size() != aco.object.mesh_poses.size())
250  {
251  RCLCPP_ERROR(LOGGER, "Number of meshes does not match number of poses in collision object message");
252  return;
253  }
254 
255  if (aco.object.planes.size() != aco.object.plane_poses.size())
256  {
257  RCLCPP_ERROR(LOGGER, "Number of planes does not match number of poses in collision object message");
258  return;
259  }
260 
261  if (aco.object.subframe_poses.size() != aco.object.subframe_names.size())
262  {
263  RCLCPP_ERROR(LOGGER, "Number of subframe poses does not match number of subframe names in message");
264  return;
265  }
266 
267  const LinkModel* lm = state.getLinkModel(aco.link_name);
268  if (lm)
269  {
270  Eigen::Isometry3d object_pose;
271  tf2::fromMsg(aco.object.pose, object_pose);
272 
273  std::vector<shapes::ShapeConstPtr> shapes;
274  EigenSTL::vector_Isometry3d shape_poses;
275  const auto num_shapes = aco.object.primitives.size() + aco.object.meshes.size() + aco.object.planes.size();
276  shapes.reserve(num_shapes);
277  shape_poses.reserve(num_shapes);
278 
279  auto append = [&shapes, &shape_poses](shapes::Shape* s, const geometry_msgs::msg::Pose& pose_msg) {
280  if (!s)
281  return;
282  Eigen::Isometry3d pose;
283  tf2::fromMsg(pose_msg, pose);
284  shapes.emplace_back(shapes::ShapeConstPtr(s));
285  shape_poses.emplace_back(std::move(pose));
286  };
287 
288  for (std::size_t i = 0; i < aco.object.primitives.size(); ++i)
289  append(shapes::constructShapeFromMsg(aco.object.primitives[i]), aco.object.primitive_poses[i]);
290  for (std::size_t i = 0; i < aco.object.meshes.size(); ++i)
291  append(shapes::constructShapeFromMsg(aco.object.meshes[i]), aco.object.mesh_poses[i]);
292  for (std::size_t i = 0; i < aco.object.planes.size(); ++i)
293  append(shapes::constructShapeFromMsg(aco.object.planes[i]), aco.object.plane_poses[i]);
294 
295  moveit::core::FixedTransformsMap subframe_poses;
296  for (std::size_t i = 0; i < aco.object.subframe_poses.size(); ++i)
297  {
298  Eigen::Isometry3d p;
299  tf2::fromMsg(aco.object.subframe_poses[i], p);
300  std::string name = aco.object.subframe_names[i];
301  subframe_poses[name] = p;
302  }
303 
304  // Transform shape pose to link frame
305  if (!Transforms::sameFrame(aco.object.header.frame_id, aco.link_name))
306  {
307  bool frame_found = false;
308  Eigen::Isometry3d world_to_header_frame;
309  world_to_header_frame = state.getFrameTransform(aco.object.header.frame_id, &frame_found);
310  if (!frame_found)
311  {
312  if (tf && tf->canTransform(aco.object.header.frame_id))
313  world_to_header_frame = tf->getTransform(aco.object.header.frame_id);
314  else
315  {
316  world_to_header_frame.setIdentity();
317  RCLCPP_ERROR(LOGGER,
318  "Cannot properly transform from frame '%s'. "
319  "The pose of the attached body may be incorrect",
320  aco.object.header.frame_id.c_str());
321  }
322  }
323  object_pose = state.getGlobalLinkTransform(lm).inverse() * world_to_header_frame * object_pose;
324  }
325 
326  if (shapes.empty())
327  {
328  RCLCPP_ERROR(LOGGER, "There is no geometry to attach to link '%s' as part of attached body '%s'",
329  aco.link_name.c_str(), aco.object.id.c_str());
330  }
331  else
332  {
333  if (state.clearAttachedBody(aco.object.id))
334  RCLCPP_DEBUG(LOGGER,
335  "The robot state already had an object named '%s' attached to link '%s'. "
336  "The object was replaced.",
337  aco.object.id.c_str(), aco.link_name.c_str());
338  state.attachBody(aco.object.id, object_pose, shapes, shape_poses, aco.touch_links, aco.link_name,
339  aco.detach_posture, subframe_poses);
340  RCLCPP_DEBUG(LOGGER, "Attached object '%s' to link '%s'", aco.object.id.c_str(), aco.link_name.c_str());
341  }
342  }
343  }
344  else
345  RCLCPP_ERROR(LOGGER, "The attached body for link '%s' has no geometry", aco.link_name.c_str());
346  }
347  else if (aco.object.operation == moveit_msgs::msg::CollisionObject::REMOVE)
348  {
349  if (!state.clearAttachedBody(aco.object.id))
350  RCLCPP_ERROR(LOGGER, "The attached body '%s' can not be removed because it does not exist", aco.link_name.c_str());
351  }
352  else
353  RCLCPP_ERROR(LOGGER, "Unknown collision object operation: %d", aco.object.operation);
354 }
355 
356 static bool _robotStateMsgToRobotStateHelper(const Transforms* tf, const moveit_msgs::msg::RobotState& robot_state,
357  RobotState& state, bool copy_attached_bodies)
358 {
359  bool valid;
360  const moveit_msgs::msg::RobotState& rs = robot_state;
361 
362  if (!rs.is_diff && rs.joint_state.name.empty() && rs.multi_dof_joint_state.joint_names.empty())
363  {
364  RCLCPP_ERROR(LOGGER, "Found empty JointState message");
365  return false;
366  }
367 
368  bool result1 = _jointStateToRobotState(robot_state.joint_state, state);
369  bool result2 = _multiDOFJointsToRobotState(robot_state.multi_dof_joint_state, state, tf);
370  valid = result1 || result2;
371 
372  if (valid && copy_attached_bodies)
373  {
374  if (!robot_state.is_diff)
375  state.clearAttachedBodies();
376  for (const moveit_msgs::msg::AttachedCollisionObject& attached_collision_object :
377  robot_state.attached_collision_objects)
378  _msgToAttachedBody(tf, attached_collision_object, state);
379  }
380 
381  return valid;
382 }
383 } // namespace
384 
385 // ********************************************
386 
387 // ********************************************
388 // * Exposed functions
389 // ********************************************
390 
391 bool jointStateToRobotState(const sensor_msgs::msg::JointState& joint_state, RobotState& state)
392 {
393  bool result = _jointStateToRobotState(joint_state, state);
394  state.update();
395  return result;
396 }
397 
398 bool robotStateMsgToRobotState(const moveit_msgs::msg::RobotState& robot_state, RobotState& state,
399  bool copy_attached_bodies)
400 {
401  bool result = _robotStateMsgToRobotStateHelper(nullptr, robot_state, state, copy_attached_bodies);
402  state.update();
403  return result;
404 }
405 
406 bool robotStateMsgToRobotState(const Transforms& tf, const moveit_msgs::msg::RobotState& robot_state, RobotState& state,
407  bool copy_attached_bodies)
408 {
409  bool result = _robotStateMsgToRobotStateHelper(&tf, robot_state, state, copy_attached_bodies);
410  state.update();
411  return result;
412 }
413 
414 void robotStateToRobotStateMsg(const RobotState& state, moveit_msgs::msg::RobotState& robot_state,
415  bool copy_attached_bodies)
416 {
417  robot_state.is_diff = false;
418  robotStateToJointStateMsg(state, robot_state.joint_state);
419  _robotStateToMultiDOFJointState(state, robot_state.multi_dof_joint_state);
420 
421  if (copy_attached_bodies)
422  {
423  std::vector<const AttachedBody*> attached_bodies;
424  state.getAttachedBodies(attached_bodies);
425  attachedBodiesToAttachedCollisionObjectMsgs(attached_bodies, robot_state.attached_collision_objects);
426  }
427 }
428 
430  const std::vector<const AttachedBody*>& attached_bodies,
431  std::vector<moveit_msgs::msg::AttachedCollisionObject>& attached_collision_objs)
432 {
433  attached_collision_objs.resize(attached_bodies.size());
434  for (std::size_t i = 0; i < attached_bodies.size(); ++i)
435  _attachedBodyToMsg(*attached_bodies[i], attached_collision_objs[i]);
436 }
437 
438 void robotStateToJointStateMsg(const RobotState& state, sensor_msgs::msg::JointState& joint_state)
439 {
440  const std::vector<const JointModel*>& js = state.getRobotModel()->getSingleDOFJointModels();
441  joint_state = sensor_msgs::msg::JointState();
442 
443  for (const JointModel* joint_model : js)
444  {
445  joint_state.name.push_back(joint_model->getName());
446  joint_state.position.push_back(state.getVariablePosition(joint_model->getFirstVariableIndex()));
447  if (state.hasVelocities())
448  joint_state.velocity.push_back(state.getVariableVelocity(joint_model->getFirstVariableIndex()));
449  }
450 
451  // if inconsistent number of velocities are specified, discard them
452  if (joint_state.velocity.size() != joint_state.position.size())
453  joint_state.velocity.clear();
454 
455  joint_state.header.frame_id = state.getRobotModel()->getModelFrame();
456 }
457 
458 bool jointTrajPointToRobotState(const trajectory_msgs::msg::JointTrajectory& trajectory, std::size_t point_id,
459  RobotState& state)
460 {
461  if (trajectory.points.empty() || point_id > trajectory.points.size() - 1)
462  {
463  RCLCPP_ERROR(LOGGER, "Invalid point_id");
464  return false;
465  }
466  if (trajectory.joint_names.empty())
467  {
468  RCLCPP_ERROR(LOGGER, "No joint names specified");
469  return false;
470  }
471 
472  state.setVariablePositions(trajectory.joint_names, trajectory.points[point_id].positions);
473  if (!trajectory.points[point_id].velocities.empty())
474  state.setVariableVelocities(trajectory.joint_names, trajectory.points[point_id].velocities);
475  if (!trajectory.points[point_id].accelerations.empty())
476  state.setVariableAccelerations(trajectory.joint_names, trajectory.points[point_id].accelerations);
477  if (!trajectory.points[point_id].effort.empty())
478  state.setVariableEffort(trajectory.joint_names, trajectory.points[point_id].effort);
479 
480  return true;
481 }
482 
483 void robotStateToStream(const RobotState& state, std::ostream& out, bool include_header, const std::string& separator)
484 {
485  // Output name of variables
486  if (include_header)
487  {
488  for (std::size_t i = 0; i < state.getVariableCount(); ++i)
489  {
490  out << state.getVariableNames()[i];
491 
492  // Output comma except at end
493  if (i < state.getVariableCount() - 1)
494  out << separator;
495  }
496  out << '\n';
497  }
498 
499  // Output values of joints
500  for (std::size_t i = 0; i < state.getVariableCount(); ++i)
501  {
502  out << state.getVariablePositions()[i];
503 
504  // Output comma except at end
505  if (i < state.getVariableCount() - 1)
506  out << separator;
507  }
508  out << '\n';
509 }
510 
511 void robotStateToStream(const RobotState& state, std::ostream& out,
512  const std::vector<std::string>& joint_groups_ordering, bool include_header,
513  const std::string& separator)
514 {
515  std::stringstream headers;
516  std::stringstream joints;
517 
518  for (const std::string& joint_group_id : joint_groups_ordering)
519  {
520  const JointModelGroup* jmg = state.getRobotModel()->getJointModelGroup(joint_group_id);
521 
522  // Output name of variables
523  if (include_header)
524  {
525  for (std::size_t i = 0; i < jmg->getVariableCount(); ++i)
526  {
527  headers << jmg->getVariableNames()[i] << separator;
528  }
529  }
530 
531  // Copy the joint positions for each joint model group
532  std::vector<double> group_variable_positions;
533  state.copyJointGroupPositions(jmg, group_variable_positions);
534 
535  // Output values of joints
536  for (std::size_t i = 0; i < jmg->getVariableCount(); ++i)
537  {
538  joints << group_variable_positions[i] << separator;
539  }
540  }
541 
542  // Push all headers and joints to our output stream
543  if (include_header)
544  out << headers.str() << '\n';
545  out << joints.str() << '\n';
546 }
547 
548 void streamToRobotState(RobotState& state, const std::string& line, const std::string& separator)
549 {
550  std::stringstream line_stream(line);
551  std::string cell;
552 
553  // For each item/column
554  for (std::size_t i = 0; i < state.getVariableCount(); ++i)
555  {
556  // Get a variable
557  if (!std::getline(line_stream, cell, separator[0]))
558  RCLCPP_ERROR(LOGGER, "Missing variable %s", state.getVariableNames()[i].c_str());
559  state.getVariablePositions()[i] = std::stod(cell);
560  }
561 }
562 
563 } // end of namespace core
564 } // end of namespace moveit
unsigned int getVariableCount() const
Get the number of variables that describe this joint group. This includes variables necessary for mim...
const std::vector< std::string > & getVariableNames() const
Get the names of the variables that make up the joints included in this group. The number of returned...
A joint from the robot. Models the transform that this joint applies in the kinematic chain....
Definition: joint_model.h:117
Representation of a robot's state. This includes position, velocity, acceleration and effort.
Definition: robot_state.h:90
void setVariablePositions(const double *position)
It is assumed positions is an array containing the new positions for all variables in this state....
bool hasVelocities() const
By default, if velocities are never set or initialized, the state remembers that there are no velocit...
Definition: robot_state.h:229
double getVariableVelocity(const std::string &variable) const
Get the velocity of a particular variable. An exception is thrown if the variable is not known.
Definition: robot_state.h:296
void getAttachedBodies(std::vector< const AttachedBody * > &attached_bodies) const
Get all bodies attached to the model corresponding to this state.
void copyJointGroupPositions(const std::string &joint_group_name, std::vector< double > &gstate) const
For a given group, copy the position values of the variables that make up the group into another loca...
Definition: robot_state.h:691
const RobotModelConstPtr & getRobotModel() const
Get the robot model this state is constructed for.
Definition: robot_state.h:104
void setVariableVelocities(const double *velocity)
Given an array with velocity values for all variables, set those values as the velocities in this sta...
Definition: robot_state.h:253
double * getVariablePositions()
Get a raw pointer to the positions of the variables stored in this state. Use carefully....
Definition: robot_state.h:147
void setVariableEffort(const double *effort)
Given an array with effort values for all variables, set those values as the effort in this state.
Definition: robot_state.h:445
double getVariablePosition(const std::string &variable) const
Get the position of a particular variable. An exception is thrown if the variable is not known.
Definition: robot_state.h:207
void update(bool force=false)
Update all transforms.
std::size_t getVariableCount() const
Get the number of variables that make up this state.
Definition: robot_state.h:110
void setVariableAccelerations(const double *acceleration)
Given an array with acceleration values for all variables, set those values as the accelerations in t...
Definition: robot_state.h:348
const std::vector< std::string > & getVariableNames() const
Get the names of the variables that make up this state, in the order they are stored in memory.
Definition: robot_state.h:116
Provides an implementation of a snapshot of a transform tree that can be easily queried for transform...
Definition: transforms.h:59
static bool sameFrame(const std::string &frame1, const std::string &frame2)
Check if two frames end up being the same once the missing / are added as prefix (if they are missing...
Definition: transforms.cpp:64
void robotStateToRobotStateMsg(const RobotState &state, moveit_msgs::msg::RobotState &robot_state, bool copy_attached_bodies=true)
Convert a MoveIt robot state to a robot state message.
bool jointTrajPointToRobotState(const trajectory_msgs::msg::JointTrajectory &trajectory, std::size_t point_id, RobotState &state)
Convert a joint trajectory point to a MoveIt robot state.
bool jointStateToRobotState(const sensor_msgs::msg::JointState &joint_state, RobotState &state)
Convert a joint state to a MoveIt robot state.
void attachedBodiesToAttachedCollisionObjectMsgs(const std::vector< const AttachedBody * > &attached_bodies, std::vector< moveit_msgs::msg::AttachedCollisionObject > &attached_collision_objs)
Convert AttachedBodies to AttachedCollisionObjects.
void robotStateToStream(const RobotState &state, std::ostream &out, bool include_header=true, const std::string &separator=",")
Convert a MoveIt robot state to common separated values (CSV) on a single line that is outputted to a...
std::map< std::string, Eigen::Isometry3d, std::less< std::string >, Eigen::aligned_allocator< std::pair< const std::string, Eigen::Isometry3d > > > FixedTransformsMap
Map frame names to the transformation matrix that can transform objects from the frame name to the pl...
Definition: transforms.h:53
void robotStateToJointStateMsg(const RobotState &state, sensor_msgs::msg::JointState &joint_state)
Convert a MoveIt robot state to a joint state message.
void streamToRobotState(RobotState &state, const std::string &line, const std::string &separator=",")
Convert a string of joint values from a file (CSV) or input source into a RobotState.
bool robotStateMsgToRobotState(const Transforms &tf, const moveit_msgs::msg::RobotState &robot_state, RobotState &state, bool copy_attached_bodies=true)
Convert a robot state msg (with accompanying extra transforms) to a MoveIt robot state.
Main namespace for MoveIt.
Definition: exceptions.h:43
p
Definition: pick.py:62
std::string append(const std::string &left, const std::string &right)
name
Definition: setup.py:7
Definition: world.h:49
const rclcpp::Logger LOGGER
Definition: async_test.h:31