kinematics_helper.cpp
Go to the documentation of this file.
1 #include "kinematics_helper.hpp"
2 
3 namespace hebi {
4 namespace experimental {
5 namespace arm {
6 namespace internal {
7 
9  const robot_model::RobotModel& robot_model,
10  const Eigen::VectorXd& min_positions,
11  const Eigen::VectorXd& max_positions)
12 {
13  // Reset:
15 
16  size_t expected_size = robot_model.getDoFCount();
17  if (min_positions.size() != expected_size || max_positions.size() != expected_size)
18  return;
19 
20  // Any nans?
21  for (size_t i = 0; i < expected_size; ++i)
22  {
23  if (std::isnan(min_positions_[i]) || std::isnan(max_positions_[i]))
24  return;
25  }
26 
27  min_positions_.resize(expected_size);
28  max_positions_.resize(expected_size);
29  use_joint_limits_ = true;
30 
31  for (size_t i = 0; i < expected_size; ++i)
32  {
33  min_positions_[i] = min_positions[i];
34  max_positions_[i] = max_positions[i];
35  }
36 }
37 
39 {
40  use_joint_limits_ = false;
41  min_positions_.resize(0);
42  max_positions_.resize(0);
43 }
44 
46  const robot_model::RobotModel& robot_model,
47  const Eigen::VectorXd& initial_positions,
48  const Eigen::Vector3d& target_xyz) const
49 {
50  // NOTE: may want to customize the IK here!
51  // TODO: smartly handle IK failures!
52  Eigen::VectorXd ik_result_joint_angles(initial_positions.size());
53  if (use_joint_limits_) {
54  robot_model.solveIK(
55  initial_positions,
56  ik_result_joint_angles,
59  );
60  } else {
61  robot_model.solveIK(
62  initial_positions,
63  ik_result_joint_angles,
65  );
66  }
67  return ik_result_joint_angles;
68 }
69 
71  const robot_model::RobotModel& robot_model,
72  const Eigen::VectorXd& initial_positions,
73  const Eigen::Vector3d& target_xyz,
74  const Eigen::Vector3d& end_tip) const
75 {
76  // NOTE: may want to customize the IK here!
77  // TODO: smartly handle exceptions?
78  Eigen::VectorXd ik_result_joint_angles(initial_positions.size());
79  if (use_joint_limits_) {
80  robot_model.solveIK(
81  initial_positions,
82  ik_result_joint_angles,
86  );
87  } else {
88  robot_model.solveIK(
89  initial_positions,
90  ik_result_joint_angles,
93  );
94  }
95  return ik_result_joint_angles;
96 }
97 
99  const robot_model::RobotModel& robot_model,
100  const Eigen::VectorXd& initial_positions,
101  const Eigen::Vector3d& target_xyz,
102  const Eigen::Matrix3d& orientation) const
103 {
104  // NOTE: may want to customize the IK here!
105  // TODO: smartly handle exceptions?
106  Eigen::VectorXd ik_result_joint_angles(initial_positions.size());
107  if (use_joint_limits_) {
108  robot_model.solveIK(
109  initial_positions,
110  ik_result_joint_angles,
114  );
115  } else {
116  robot_model.solveIK(
117  initial_positions,
118  ik_result_joint_angles,
121  );
122  }
123  return ik_result_joint_angles;
124 }
125 
126 Eigen::Vector3d KinematicsHelper::FK3Dof(
127  const robot_model::RobotModel& robot_model,
128  const Eigen::VectorXd& positions) const
129 {
130  Eigen::Matrix4d transform;
131  robot_model.getEndEffector(positions, transform);
132  return Eigen::Vector3d(transform(0,3), transform(1,3), transform(2,3));
133 }
134 
136  const robot_model::RobotModel& robot_model,
137  const Eigen::VectorXd& positions,
138  Eigen::Vector3d& xyz_out,
139  Eigen::Vector3d& tip_axis) const
140 {
141  Eigen::Matrix4d transform;
142  robot_model.getEndEffector(positions, transform);
143  xyz_out = Eigen::Vector3d(transform(0,3), transform(1,3), transform(2,3));
144  tip_axis = Eigen::Vector3d(transform(0,2), transform(1,2), transform(2,2));
145 }
146 
148  const robot_model::RobotModel& robot_model,
149  const Eigen::VectorXd& positions,
150  Eigen::Vector3d& xyz_out,
151  Eigen::Matrix3d& orientation) const
152 {
153  Eigen::Matrix4d transform;
154  robot_model.getEndEffector(positions, transform);
155  xyz_out = Eigen::Vector3d(transform(0,3), transform(1,3), transform(2,3));
156  orientation = transform.block<3,3>(0,0);
157 }
158 
159 } // namespace internal
160 } // namespace arm
161 } // namespace experimental
162 } // namespace hebi
hebi::experimental::arm::internal::KinematicsHelper::clearJointLimits
void clearJointLimits()
Definition: kinematics_helper.cpp:38
hebi::experimental::arm::internal::KinematicsHelper::FK3Dof
Eigen::Vector3d FK3Dof(const robot_model::RobotModel &robot_model, const Eigen::VectorXd &positions) const
Definition: kinematics_helper.cpp:126
hebi::robot_model::RobotModel::solveIK
IKResult solveIK(const Eigen::VectorXd &initial_positions, Eigen::VectorXd &result, Args... objectives) const
Solves for an inverse kinematics solution given a set of objectives.
Definition: robot_model.hpp:714
hebi::experimental::arm::internal::KinematicsHelper::solveIK6Dof
Eigen::VectorXd solveIK6Dof(const robot_model::RobotModel &robot_model, const Eigen::VectorXd &initial_positions, const Eigen::Vector3d &target_xyz, const Eigen::Matrix3d &orientation) const
Definition: kinematics_helper.cpp:98
hebi::robot_model::RobotModel::getEndEffector
void getEndEffector(const Eigen::VectorXd &positions, Eigen::Matrix4d &transform) const
Generates the forward kinematics to the end effector (leaf node) frame(s).
Definition: robot_model.cpp:238
hebi::robot_model::EndEffectorPositionObjective
Definition: robot_model.hpp:36
hebi::experimental::arm::internal::KinematicsHelper::FK6Dof
void FK6Dof(const robot_model::RobotModel &robot_model, const Eigen::VectorXd &positions, Eigen::Vector3d &xyz_out, Eigen::Matrix3d &orientation) const
Definition: kinematics_helper.cpp:147
hebi::experimental::arm::internal::KinematicsHelper::setJointLimits
void setJointLimits(const robot_model::RobotModel &robot_model, const Eigen::VectorXd &min_positions, const Eigen::VectorXd &max_positions)
Definition: kinematics_helper.cpp:8
hebi::robot_model::EndEffectorTipAxisObjective
Definition: robot_model.hpp:57
hebi::robot_model::EndEffectorSO3Objective
Definition: robot_model.hpp:46
hebi::experimental::arm::internal::KinematicsHelper::solveIK3Dof
Eigen::VectorXd solveIK3Dof(const robot_model::RobotModel &robot_model, const Eigen::VectorXd &initial_positions, const Eigen::Vector3d &target_xyz) const
Definition: kinematics_helper.cpp:45
hebi::experimental::arm::internal::KinematicsHelper::use_joint_limits_
bool use_joint_limits_
Definition: kinematics_helper.hpp:57
kinematics_helper.hpp
hebi
Definition: arm.cpp:5
hebi::robot_model::RobotModel::getDoFCount
size_t getDoFCount() const
Returns the number of settable degrees of freedom in the kinematic tree. (This is equal to the number...
Definition: robot_model.cpp:141
hebi::experimental::arm::internal::KinematicsHelper::max_positions_
Eigen::VectorXd max_positions_
Definition: kinematics_helper.hpp:59
hebi::experimental::arm::internal::KinematicsHelper::FK5Dof
void FK5Dof(const robot_model::RobotModel &robot_model, const Eigen::VectorXd &positions, Eigen::Vector3d &xyz_out, Eigen::Vector3d &tip_axis) const
Definition: kinematics_helper.cpp:135
hebi::experimental::arm::internal::KinematicsHelper::solveIK5Dof
Eigen::VectorXd solveIK5Dof(const robot_model::RobotModel &robot_model, const Eigen::VectorXd &initial_positions, const Eigen::Vector3d &target_xyz, const Eigen::Vector3d &end_tip) const
Definition: kinematics_helper.cpp:70
hebi::robot_model::JointLimitConstraint
Definition: robot_model.hpp:67
hebi::experimental::arm::internal::KinematicsHelper::min_positions_
Eigen::VectorXd min_positions_
Definition: kinematics_helper.hpp:58
hebi::robot_model::RobotModel
Represents a chain or tree of robot elements (rigid bodies and joints).
Definition: robot_model.hpp:419


hebi_cpp_api_ros
Author(s): Chris Bollinger , Matthew Tesch
autogenerated on Fri Aug 2 2024 08:35:18