kdl_fwd_kin_chain.cpp
Go to the documentation of this file.
1 
28 #include <console_bridge/console.h>
32 
35 
36 namespace tesseract_kinematics
37 {
38 using Eigen::MatrixXd;
39 using Eigen::VectorXd;
40 
42  const std::vector<std::pair<std::string, std::string>>& chains,
43  std::string solver_name)
44  : solver_name_(std::move(solver_name))
45 {
46  if (!scene_graph.getLink(scene_graph.getRoot()))
47  throw std::runtime_error("The scene graph has an invalid root.");
48 
49  if (!parseSceneGraph(kdl_data_, scene_graph, chains))
50  throw std::runtime_error("Failed to parse KDL data from Scene Graph");
51 
52  fk_solver_ = std::make_unique<KDL::ChainFkSolverPos_recursive>(kdl_data_.robot_chain);
53  jac_solver_ = std::make_unique<KDL::ChainJntToJacSolver>(kdl_data_.robot_chain);
54 }
55 
57  const std::string& base_link,
58  const std::string& tip_link,
59  std::string solver_name)
60  : KDLFwdKinChain(scene_graph, { std::make_pair(base_link, tip_link) }, std::move(solver_name))
61 {
62 }
63 
64 ForwardKinematics::UPtr KDLFwdKinChain::clone() const { return std::make_unique<KDLFwdKinChain>(*this); }
65 
66 KDLFwdKinChain::KDLFwdKinChain(const KDLFwdKinChain& other) { *this = other; }
68 {
69  name_ = other.name_;
70  kdl_data_ = other.kdl_data_;
71  fk_solver_ = std::make_unique<KDL::ChainFkSolverPos_recursive>(kdl_data_.robot_chain);
72  jac_solver_ = std::make_unique<KDL::ChainJntToJacSolver>(kdl_data_.robot_chain);
73  solver_name_ = other.solver_name_;
74  return *this;
75 }
76 
78 KDLFwdKinChain::calcFwdKinHelperAll(const Eigen::Ref<const Eigen::VectorXd>& joint_angles) const
79 {
80  if (joint_angles.rows() != kdl_data_.robot_chain.getNrOfJoints())
81  throw std::runtime_error("kdl_joints size is not correct!");
82 
83  KDL::JntArray kdl_joints;
84  EigenToKDL(joint_angles, kdl_joints);
85 
86  KDL::Frame kdl_pose;
87  {
88  std::lock_guard<std::mutex> guard(mutex_);
89  fk_solver_->JntToCart(kdl_joints, kdl_pose);
90  }
91 
92  Eigen::Isometry3d pose;
93  KDLToEigen(kdl_pose, pose);
94 
96  poses[kdl_data_.tip_link_name] = pose;
97 
98  return poses;
99 }
100 
101 tesseract_common::TransformMap KDLFwdKinChain::calcFwdKin(const Eigen::Ref<const Eigen::VectorXd>& joint_angles) const
102 {
103  assert(joint_angles.size() == numJoints());
104 
105  return calcFwdKinHelperAll(joint_angles);
106 }
107 
108 bool KDLFwdKinChain::calcJacobianHelper(KDL::Jacobian& jacobian,
109  const Eigen::Ref<const Eigen::VectorXd>& joint_angles,
110  int segment_num) const
111 {
112  KDL::JntArray kdl_joints;
113  EigenToKDL(joint_angles, kdl_joints);
114 
115  // compute jacobian
116  jacobian.resize(static_cast<unsigned>(joint_angles.size()));
117  int success{ -1 };
118  {
119  std::lock_guard<std::mutex> guard(mutex_);
120  success = jac_solver_->JntToJac(kdl_joints, jacobian, segment_num);
121  }
122 
123  if (success < 0)
124  {
125  CONSOLE_BRIDGE_logError("Failed to calculate jacobian");
126  return false;
127  }
128 
129  return true;
130 }
131 
132 Eigen::MatrixXd KDLFwdKinChain::calcJacobian(const Eigen::Ref<const Eigen::VectorXd>& joint_angles,
133  const std::string& link_name) const
134 {
135  assert(joint_angles.size() == numJoints());
136 
137  int segment_nr = kdl_data_.segment_index.at(link_name);
138  KDL::Jacobian kdl_jacobian;
139 
140  if (calcJacobianHelper(kdl_jacobian, joint_angles, segment_nr))
141  {
142  Eigen::MatrixXd jacobian(6, numJoints());
143  KDLToEigen(kdl_jacobian, jacobian);
144  return jacobian;
145  }
146 
147  throw std::runtime_error("KDLFwdKinChain: Failed to calculate jacobian.");
148 }
149 
150 std::vector<std::string> KDLFwdKinChain::getJointNames() const { return kdl_data_.joint_names; }
151 
152 Eigen::Index KDLFwdKinChain::numJoints() const { return static_cast<Eigen::Index>(kdl_data_.joint_names.size()); }
153 
155 
156 std::vector<std::string> KDLFwdKinChain::getTipLinkNames() const { return { kdl_data_.tip_link_name }; }
157 
158 std::string KDLFwdKinChain::getSolverName() const { return solver_name_; }
159 
160 } // namespace tesseract_kinematics
tesseract_kinematics::KDLFwdKinChain::calcFwdKinHelperAll
tesseract_common::TransformMap calcFwdKinHelperAll(const Eigen::Ref< const Eigen::VectorXd > &joint_angles) const
calcFwdKin helper function
Definition: kdl_fwd_kin_chain.cpp:78
graph.h
kdl_fwd_kin_chain.h
Tesseract KDL forward kinematics chain implementation.
tesseract_kinematics::KDLFwdKinChain::operator=
KDLFwdKinChain & operator=(const KDLFwdKinChain &other)
Definition: kdl_fwd_kin_chain.cpp:67
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::KDLFwdKinChain::kdl_data_
KDLChainData kdl_data_
Definition: kdl_fwd_kin_chain.h:104
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
tesseract_kinematics::KDLFwdKinChain::getBaseLinkName
std::string getBaseLinkName() const override final
Get the robot base link name.
Definition: kdl_fwd_kin_chain.cpp:154
tesseract_common::TransformMap
AlignedMap< std::string, Eigen::Isometry3d > TransformMap
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_kinematics::KDLFwdKinChain::fk_solver_
std::unique_ptr< KDL::ChainFkSolverPos_recursive > fk_solver_
Definition: kdl_fwd_kin_chain.h:106
tesseract_kinematics::KDLFwdKinChain::getSolverName
std::string getSolverName() const override final
Get the name of the solver. Recommend using the name of the class.
Definition: kdl_fwd_kin_chain.cpp:158
kdl_parser.h
tesseract_kinematics::KDLFwdKinChain::mutex_
std::mutex mutex_
KDL is not thread safe due to mutable variables in Joint Class.
Definition: kdl_fwd_kin_chain.h:109
tesseract_kinematics::KDLChainData::joint_names
std::vector< std::string > joint_names
List of joint names.
Definition: kdl_utils.h:95
tesseract_kinematics::KDLFwdKinChain::solver_name_
std::string solver_name_
Name of this solver.
Definition: kdl_fwd_kin_chain.h:108
tesseract_kinematics::KDLFwdKinChain::getTipLinkNames
std::vector< std::string > getTipLinkNames() const override final
Get list of tip link names for kinematic object.
Definition: kdl_fwd_kin_chain.cpp:156
tesseract_kinematics::KDLFwdKinChain::KDLFwdKinChain
KDLFwdKinChain(const KDLFwdKinChain &other)
Definition: kdl_fwd_kin_chain.cpp:66
tesseract_kinematics::KDLFwdKinChain
KDL kinematic chain implementation.
Definition: kdl_fwd_kin_chain.h:49
tesseract_kinematics::KDLFwdKinChain::clone
ForwardKinematics::UPtr clone() const override final
Clone the forward kinematics object.
Definition: kdl_fwd_kin_chain.cpp:64
tesseract_kinematics::KDLFwdKinChain::getJointNames
std::vector< std::string > getJointNames() const override final
Get list of joint names for kinematic object.
Definition: kdl_fwd_kin_chain.cpp:150
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::getRoot
const std::string & getRoot() const
tesseract_kinematics::ForwardKinematics::UPtr
std::unique_ptr< ForwardKinematics > UPtr
Definition: forward_kinematics.h:52
tesseract_kinematics
Definition: forward_kinematics.h:40
kdl_utils.h
Tesseract KDL utility functions.
tesseract_scene_graph::SceneGraph::getLink
std::shared_ptr< const Link > getLink(const std::string &name) const
tesseract_kinematics::KDLFwdKinChain::calcJacobian
Eigen::MatrixXd calcJacobian(const Eigen::Ref< const Eigen::VectorXd > &joint_angles, const std::string &joint_link_name) const override final
Calculates the Jacobian matrix for a given joint state in the reference frame of the specified link.
Definition: kdl_fwd_kin_chain.cpp:132
macros.h
tesseract_kinematics::KDLChainData::robot_chain
KDL::Chain robot_chain
KDL Chain object.
Definition: kdl_utils.h:93
tesseract_kinematics::KDLFwdKinChain::calcJacobianHelper
bool calcJacobianHelper(KDL::Jacobian &jacobian, const Eigen::Ref< const Eigen::VectorXd > &joint_angles, int segment_num=-1) const
calcJacobian helper function
Definition: kdl_fwd_kin_chain.cpp:108
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::KDLFwdKinChain::name_
std::string name_
Definition: kdl_fwd_kin_chain.h:105
tesseract_kinematics::KDLFwdKinChain::jac_solver_
std::unique_ptr< KDL::ChainJntToJacSolver > jac_solver_
Definition: kdl_fwd_kin_chain.h:107
tesseract_kinematics::KDLFwdKinChain::numJoints
Eigen::Index numJoints() const override final
Number of joints in robot.
Definition: kdl_fwd_kin_chain.cpp:152
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::KDLFwdKinChain::calcFwdKin
tesseract_common::TransformMap calcFwdKin(const Eigen::Ref< const Eigen::VectorXd > &joint_angles) const override final
Calculates the transform for each tip link in the kinematic group.
Definition: kdl_fwd_kin_chain.cpp:101


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