kdl_utils.cpp
Go to the documentation of this file.
1 
29 #include <console_bridge/console.h>
31 
36 
37 namespace tesseract_kinematics
38 {
39 void KDLToEigen(const KDL::Frame& frame, Eigen::Isometry3d& transform)
40 {
41  transform.setIdentity();
42 
43  // translation
44  for (int i = 0; i < 3; ++i)
45  transform(i, 3) = frame.p[i];
46 
47  // rotation matrix
48  for (int i = 0; i < 9; ++i)
49  transform(i / 3, i % 3) = frame.M.data[i];
50 }
51 
52 void EigenToKDL(const Eigen::Isometry3d& transform, KDL::Frame& frame)
53 {
54  for (int i = 0; i < 3; ++i)
55  frame.p[i] = transform(i, 3);
56 
57  for (int i = 0; i < 9; ++i)
58  frame.M.data[i] = transform(i / 3, i % 3);
59 }
60 
61 void KDLToEigen(const KDL::Jacobian& jacobian, Eigen::Ref<Eigen::MatrixXd> matrix)
62 {
63  assert(matrix.rows() == jacobian.rows());
64  assert(matrix.cols() == jacobian.columns());
65 
66  for (unsigned i = 0; i < jacobian.rows(); ++i)
67  for (unsigned j = 0; j < jacobian.columns(); ++j)
68  matrix(i, j) = jacobian(i, j);
69 }
70 
71 void KDLToEigen(const KDL::Jacobian& jacobian, const std::vector<int>& q_nrs, Eigen::Ref<Eigen::MatrixXd> matrix)
72 {
73  assert(matrix.rows() == jacobian.rows());
74  assert(static_cast<unsigned>(matrix.cols()) == q_nrs.size());
75 
76  for (int i = 0; i < static_cast<int>(jacobian.rows()); ++i)
77  for (int j = 0; j < static_cast<int>(q_nrs.size()); ++j)
78  matrix(i, j) = jacobian(static_cast<unsigned>(i), static_cast<unsigned>(q_nrs[static_cast<size_t>(j)]));
79 }
80 
81 void EigenToKDL(const Eigen::Ref<const Eigen::VectorXd>& vec, KDL::JntArray& joints) { joints.data = vec; }
82 
83 void KDLToEigen(const KDL::JntArray& joints, Eigen::Ref<Eigen::VectorXd> vec) { vec = joints.data; }
84 
86  const tesseract_scene_graph::SceneGraph& scene_graph,
87  const std::vector<std::pair<std::string, std::string>>& chains)
88 {
89  try
90  {
92  results.kdl_tree = data.tree;
93  }
94  catch (...)
95  {
96  CONSOLE_BRIDGE_logError("Failed to parse KDL tree from Scene Graph");
97  return false;
98  }
99 
100  results.chains = chains;
101  results.base_link_name = chains.front().first;
102  for (const auto& chain : chains)
103  {
104  KDL::Chain sub_chain;
105  if (!results.kdl_tree.getChain(chain.first, chain.second, sub_chain))
106  {
107  CONSOLE_BRIDGE_logError(
108  "Failed to initialize KDL between links: '%s' and '%s'", chain.first.c_str(), chain.second.c_str());
109  return false;
110  }
111  results.robot_chain.addChain(sub_chain);
112  }
113  results.tip_link_name = chains.back().second;
114 
115  results.joint_names.clear();
116  results.joint_names.resize(results.robot_chain.getNrOfJoints());
117  results.q_min.resize(results.robot_chain.getNrOfJoints());
118  results.q_max.resize(results.robot_chain.getNrOfJoints());
119 
120  results.segment_index.clear();
121  results.segment_index[results.base_link_name] = 0;
122  results.segment_index[results.tip_link_name] = static_cast<int>(results.robot_chain.getNrOfSegments());
123 
124  for (unsigned i = 0, j = 0; i < results.robot_chain.getNrOfSegments(); ++i)
125  {
126  const KDL::Segment& seg = results.robot_chain.getSegment(i);
127  const KDL::Joint& jnt = seg.getJoint();
128 
129  if (jnt.getType() == KDL::Joint::None)
130  continue;
131 
132  // KDL segments does not contain the the base link in this list. When calling function that take segmentNr, like
133  // JntToCart to get the base link transform you would pass an index of zero and for subsequent links it is
134  // index + 1. This was determined through testing which is captured in this packages unit tests.
135  results.segment_index[seg.getName()] = static_cast<int>(i + 1);
136 
137  results.joint_names[j] = jnt.getName();
138 
139  auto joint = scene_graph.getJoint(results.joint_names[j]);
140  double lower = std::numeric_limits<float>::lowest();
141  double upper = std::numeric_limits<float>::max();
142  // Does the joint have limits?
144  {
145  if (joint->safety)
146  {
147  lower = std::max(joint->limits->lower, joint->safety->soft_lower_limit);
148  upper = std::min(joint->limits->upper, joint->safety->soft_upper_limit);
149  }
150  else
151  {
152  lower = joint->limits->lower;
153  upper = joint->limits->upper;
154  }
155  }
156  // Assign limits
157  results.q_min(j) = lower;
158  results.q_max(j) = upper;
159 
160  ++j;
161  }
162 
163  return true;
164 }
165 
167  const tesseract_scene_graph::SceneGraph& scene_graph,
168  const std::string& base_name,
169  const std::string& tip_name)
170 {
171  std::vector<std::pair<std::string, std::string>> chains;
172  chains.emplace_back(base_name, tip_name);
173  return parseSceneGraph(results, scene_graph, chains);
174 }
175 
176 } // namespace tesseract_kinematics
graph.h
tesseract_kinematics::KDLChainData::kdl_tree
KDL::Tree kdl_tree
KDL tree object.
Definition: kdl_utils.h:94
tesseract_kinematics::KDLChainData
The KDLChainData struct.
Definition: kdl_utils.h:91
tesseract_kinematics::KDLChainData::base_link_name
std::string base_link_name
Link name of first link in the kinematic object.
Definition: kdl_utils.h:96
tesseract_kinematics::KDLChainData::q_min
KDL::JntArray q_min
Lower joint limits.
Definition: kdl_utils.h:100
tesseract_kinematics::KDLChainData::tip_link_name
std::string tip_link_name
Link name of last kink in the kinematic object.
Definition: kdl_utils.h:97
joint.h
tesseract_kinematics::KDLChainData::segment_index
std::map< std::string, int > segment_index
A map from chain link name to kdl chain segment number.
Definition: kdl_utils.h:98
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
tesseract_scene_graph::SceneGraph
tesseract_scene_graph::parseSceneGraph
KDLTreeData parseSceneGraph(const SceneGraph &scene_graph)
kdl_parser.h
tesseract_kinematics::KDLChainData::joint_names
std::vector< std::string > joint_names
List of joint names.
Definition: kdl_utils.h:95
tesseract_kinematics::KDLChainData::chains
std::vector< std::pair< std::string, std::string > > chains
Definition: kdl_utils.h:99
tesseract_scene_graph::KDLTreeData
tesseract_scene_graph::JointType::CONTINUOUS
@ CONTINUOUS
tesseract_kinematics::EigenToKDL
void EigenToKDL(const Eigen::Isometry3d &transform, KDL::Frame &frame)
Convert Eigen::Isometry3d to KDL::Frame.
Definition: kdl_utils.cpp:52
TESSERACT_COMMON_IGNORE_WARNINGS_POP
#define TESSERACT_COMMON_IGNORE_WARNINGS_POP
tesseract_scene_graph::SceneGraph::getJoint
std::shared_ptr< const Joint > getJoint(const std::string &name) const
tesseract_kinematics
Definition: forward_kinematics.h:40
kdl_utils.h
Tesseract KDL utility functions.
tesseract_kinematics::KDLChainData::q_max
KDL::JntArray q_max
Upper joint limits.
Definition: kdl_utils.h:101
macros.h
tesseract_kinematics::KDLChainData::robot_chain
KDL::Chain robot_chain
KDL Chain object.
Definition: kdl_utils.h:93
tesseract_scene_graph::KDLTreeData::tree
EIGEN_MAKE_ALIGNED_OPERATOR_NEW KDL::Tree tree
tesseract_kinematics::parseSceneGraph
bool parseSceneGraph(KDLChainData &results, const tesseract_scene_graph::SceneGraph &scene_graph, const std::vector< std::pair< std::string, std::string >> &chains)
Parse KDL chain data from the scene graph.
Definition: kdl_utils.cpp:85
tesseract_kinematics::KDLToEigen
void KDLToEigen(const KDL::Frame &frame, Eigen::Isometry3d &transform)
Convert KDL::Frame to Eigen::Isometry3d.
Definition: kdl_utils.cpp:39


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