28 #include <console_bridge/console.h>
44 std::vector<std::string> joint_names,
47 : name_(std::move(name)), state_(scene_state), joint_names_(std::move(joint_names))
51 if (scene_graph.
getJoint(joint_name) ==
nullptr)
52 throw std::runtime_error(
"Joint name '" + joint_name +
"' does not exist in the provided scene graph!");
57 state_solver_ = std::make_unique<tesseract_scene_graph::KDLStateSolver>(scene_graph, data);
59 std::vector<std::string> solver_jn =
state_solver_->getActiveJointNames();
62 std::distance(solver_jn.begin(), std::find(solver_jn.begin(), solver_jn.end(), joint_name)));
64 std::vector<std::string> active_link_names =
state_solver_->getActiveLinkNames();
65 for (
const auto& link : scene_graph.
getLinks())
68 auto it = std::find(active_link_names.begin(), active_link_names.end(), link->getName());
69 if (it == active_link_names.end())
77 for (Eigen::Index i = 0; i < static_cast<Eigen::Index>(
joint_names_.size()); ++i)
104 throw std::runtime_error(
"JointGroup: Static link names are not correct!");
134 const std::string& link_name)
const
139 for (Eigen::Index i = 0; i <
numJoints(); ++i)
140 kin_jac.col(i) = solver_jac.col(
jacobian_map_[
static_cast<std::size_t
>(i)]);
146 const std::string& link_name,
147 const Eigen::Vector3d& link_point)
const
149 Eigen::MatrixXd kin_jac =
calcJacobian(joint_angles, link_name);
161 const std::string& base_link_name,
162 const std::string& link_name)
const
170 for (Eigen::Index i = 0; i <
numJoints(); ++i)
171 kin_jac.col(i) = solver_jac.col(
jacobian_map_[
static_cast<std::size_t
>(i)]);
174 if (std::find(active_links.begin(), active_links.end(), base_link_name) != active_links.end())
178 const Eigen::Isometry3d& base_link_tf = state.
link_transforms[base_link_name];
181 Eigen::MatrixXd base_kin_jac(6,
numJoints());
182 for (Eigen::Index i = 0; i <
numJoints(); ++i)
183 base_kin_jac.col(i) = base_link_jac.col(
jacobian_map_[
static_cast<std::size_t
>(i)]);
188 kin_jac = kin_jac + base_kin_jac;
199 const std::string& base_link_name,
200 const std::string& link_name,
201 const Eigen::Vector3d& link_point)
const
204 return calcJacobian(joint_angles, link_name, link_point);
209 for (Eigen::Index i = 0; i <
numJoints(); ++i)
210 kin_jac.col(i) = solver_jac.col(
jacobian_map_[
static_cast<std::size_t
>(i)]);
216 const Eigen::Isometry3d& base_link_tf = state.
link_transforms[base_link_name];
219 if (std::find(active_links.begin(), active_links.end(), base_link_name) != active_links.end())
222 Eigen::MatrixXd base_kin_jac(6,
numJoints());
223 for (Eigen::Index i = 0; i <
numJoints(); ++i)
224 base_kin_jac.col(i) = base_link_jac.col(
jacobian_map_[
static_cast<std::size_t
>(i)]);
231 kin_jac = kin_jac + base_kin_jac;
244 if (vec.size() !=
static_cast<Eigen::Index
>(
joint_names_.size()))
246 CONSOLE_BRIDGE_logError(
247 "Number of joint angles (%d) don't match robot_model (%d)",
static_cast<int>(vec.size()),
numJoints());
251 for (
int i = 0; i < vec.size(); ++i)
255 CONSOLE_BRIDGE_logDebug(
"Joint %s is out-of-range (%g < %g < %g)",
292 throw std::runtime_error(
"Kinematics Group limits assigned are invalid!");