PIK ROS
PikRos.hpp
Go to the documentation of this file.
1 
8 #ifndef PIK_ROS_H_
9 #define PIK_ROS_H_
10 
11 #include "MoveItWrapper.hpp"
12 
13 #include <Eigen/Dense>
14 #include <PtscEigen.hpp>
15 
16 namespace PikRos
17 {
18 
21 {
22  FRAME_POSITION,
26 };
27 
32 enum ApproachAxis
33 {
34  X,
35  Y,
36  Z
37 };
38 
40 struct IkTask
41 {
50  IkTask( IkTaskType t_type, const std::string &t_frame_name,
51  const Eigen::VectorXd &t_desired_value,
52  ApproachAxis t_approach_axis = Z);
53 
55  Eigen::Vector3d getAppAxisVector() const;
56 
57  IkTaskType type;
58  std::string frame_name;
59  Eigen::VectorXd desired_value;
60  ApproachAxis approach_axis;
61 };
62 
64 struct Settings
65 {
66  uint32_t max_iterations = 10000;
67  double err_norm_threshold = 1e-3;
68  double gradient_threshold = 1e-3;
69  double polish_gradient_threshold = 1e-2;
70  double dq_limit = (double)(10.0 * M_PI / 180.0);
71  double polish_dq_limit = (double)(3.0 * M_PI / 180.0);
72  double lin_err_clamp_magnitude = 0.2;
73  double ang_err_clamp_magnitude = 15.0 * M_PI / 180.0;
74  bool use_constrained_opt = true;
75  bool polish_solution = false;
76  bool debug_mode = false;
77  double timeout = 2.0;
78 };
79 
81 class Gradient
82 {
83 public:
84  Gradient(double initial_value);
85  void updateGradient(double current_value);
86  double getGradient() const;
87 private:
88  double current_value_;
89  double ex_value_;
90  double gradient_;
91 };
92 
98 class Pik
99 {
100 public:
108  Pik(ros::NodeHandle &nh_, const std::string &robot_name,
109  const std::string &joint_model_group_name,
110  const Settings &settings = Settings());
111 
118  Eigen::VectorXd solve(const std::vector<IkTask> &ik_tasks,
119  const Eigen::VectorXd& q_initial_guess );
120 
125  void goToJointPosition(const Eigen::VectorXd &q) const;
126 
132  void printErrors(const Eigen::VectorXd &q, const std::vector<IkTask> &ik_tasks) const;
133 
134 private:
135  MoveItWrapper moveit_wrapper_;
136  Settings settings_;
137  const uint32_t n_dof_;
138 
139  Eigen::Vector3d getOrientationErrorRPY( Eigen::Quaterniond desired_quat,
140  Eigen::Quaterniond current_quat,
141  bool clamp_err = false ) const;
142 
143  bool reachedErrNormThreshold(const Eigen::VectorXd &q, const std::vector<IkTask> &ik_tasks) const;
144  static double getAbsGradientSum(const std::vector<Gradient> &gradients);
145  bool reachedGradientThreshold(const std::vector<Gradient> &gradients) const;
146 
147  Eigen::MatrixXd getTaskJacobian( const Eigen::VectorXd &q, IkTask task ) const;
148  Eigen::VectorXd solvePtscProblem(const std::vector<PtscEigen::Task> &ptsc_tasks) const;
149 
150  Eigen::VectorXd getTaskValue( const Eigen::VectorXd &q, IkTask task ) const; //These functions go to IkTask!
151  Eigen::VectorXd getTaskError( const Eigen::VectorXd &q, IkTask task, bool clamp_err = false ) const;
152 
153  static Eigen::VectorXd clampMagnitude(const Eigen::VectorXd &input_vec, double magnitude);
154  static Eigen::VectorXd limitQ(const Eigen::VectorXd &q);
155  static Eigen::VectorXd limitDq(const Eigen::VectorXd &dq, double dq_limit);
156  static Eigen::Quaterniond vec2quat(const Eigen::VectorXd &q_vec);
157 
158  bool reached_polish_solution_threshold_ = false;
159 
160  static int sign(double a);
161 
162  bool reachedStoppingCriteria() const;
163  void initializeSolver(const std::vector<IkTask> &ik_tasks,
164  const Eigen::VectorXd& q_initial_guess);
165 
166  Eigen::VectorXd current_q_;
167  std::vector<PikRos::IkTask> ik_tasks_;
168  double solver_elapsed_time_; //in seconds
169  std::vector<Gradient> current_gradients_;
170  uint32_t current_ik_iteration_;
171 };
172 };
173 #endif //PIK_ROS_H_
Definition: PikRos.hpp:24
Gradient class.
Definition: PikRos.hpp:81
IkTask(IkTaskType t_type, const std::string &t_frame_name, const Eigen::VectorXd &t_desired_value, ApproachAxis t_approach_axis=Z)
Construct a new Ik Task object.
Definition: PikRos.cpp:17
Prioritized inverse kinematics solver.
Definition: PikRos.hpp:98
Eigen::Vector3d getAppAxisVector() const
Get the approach axis Vector.
Definition: PikRos.cpp:52
Definition: MoveItWrapper.hpp:20
Definition: PikRos.hpp:25
Ik task structure.
Definition: PikRos.hpp:40
IkTaskType
Definition: PikRos.hpp:20
Definition: PikRos.hpp:16
Definition: PikRos.hpp:23
Solver settings.
Definition: PikRos.hpp:64