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
void FK5Dof(const robot_model::RobotModel &robot_model, const Eigen::VectorXd &positions, Eigen::Vector3d &xyz_out, Eigen::Vector3d &tip_axis) const
Definition: arm.cpp:5
Represents a chain or tree of robot elements (rigid bodies and joints).
void getEndEffector(const Eigen::VectorXd &positions, Eigen::Matrix4d &transform) const
Generates the forward kinematics to the end effector (leaf node) frame(s).
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
Eigen::VectorXd solveIK3Dof(const robot_model::RobotModel &robot_model, const Eigen::VectorXd &initial_positions, const Eigen::Vector3d &target_xyz) const
Eigen::Vector3d FK3Dof(const robot_model::RobotModel &robot_model, const Eigen::VectorXd &positions) const
void FK6Dof(const robot_model::RobotModel &robot_model, const Eigen::VectorXd &positions, Eigen::Vector3d &xyz_out, Eigen::Matrix3d &orientation) const
Eigen::VectorXd solveIK6Dof(const robot_model::RobotModel &robot_model, const Eigen::VectorXd &initial_positions, const Eigen::Vector3d &target_xyz, const Eigen::Matrix3d &orientation) const
size_t getDoFCount() const
Returns the number of settable degrees of freedom in the kinematic tree. (This is equal to the number...
IKResult solveIK(const Eigen::VectorXd &initial_positions, Eigen::VectorXd &result, Args...objectives) const
Solves for an inverse kinematics solution given a set of objectives.
void setJointLimits(const robot_model::RobotModel &robot_model, const Eigen::VectorXd &min_positions, const Eigen::VectorXd &max_positions)


hebi_cpp_api_ros
Author(s): Chris Bollinger , Matthew Tesch
autogenerated on Thu May 28 2020 03:14:45