se2ez
constraint.h
Go to the documentation of this file.
1 /* Author: Zachary Kingston */
2 
3 #ifndef SE2EZ_PLAN_CONSTRAINT_
4 #define SE2EZ_PLAN_CONSTRAINT_
5 
6 #include <mutex>
7 #include <ompl/base/Constraint.h>
8 
10 
11 #include <se2ez/plan/goals.h>
12 
13 namespace se2ez
14 {
15  /** \cond IGNORE */
16  SE2EZ_CLASS_FORWARD(Robot)
17  SE2EZ_CLASS_FORWARD(State)
18  /** \endcond */
19 
20  namespace plan
21  {
23  const std::string &filename);
24 
25  SE2EZ_CLASS_FORWARD(FrameConstraint)
26  SE2EZ_CLASS_FORWARD(LineConstraint)
27  SE2EZ_CLASS_FORWARD(PointConstraint)
28 
29  class FrameConstraint : public ompl::base::Foliation
30  {
31  public:
32  void function(const ompl::base::State *state, //
33  Eigen::Ref<Eigen::VectorXd> out) const override;
34  void function(const Eigen::Ref<const Eigen::VectorXd> &x, //
35  Eigen::Ref<Eigen::VectorXd> out) const override;
36 
37  void jacobian(const ompl::base::State *state, //
38  Eigen::Ref<Eigen::MatrixXd> out) const override;
39  void jacobian(const Eigen::Ref<const Eigen::VectorXd> &x, //
40  Eigen::Ref<Eigen::MatrixXd> out) const override;
41 
42  bool project(ompl::base::State *state) const override;
43  bool project(Eigen::Ref<Eigen::VectorXd> x) const override;
44 
45  double distance(const ompl::base::State *state) const override;
46  bool isSatisfied(const ompl::base::State *state) const override;
47 
48  void setDrawOffset(const Eigen::Ref<const Eigen::Vector2d> &v);
49  const Eigen::Vector2d &getDrawOffset() const;
50 
51  protected:
52  FrameConstraint(const std::string &name, const RobotPtr &robot, const std::string &frame,
53  const std::string &base, unsigned int dimension = 1, unsigned int leaf = 0);
54 
56  getPose(const ompl::base::State *state) const;
57 
59  getPose(const Eigen::Ref<const Eigen::VectorXd> &x) const;
60 
61  virtual void functionInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base,
62  Eigen::Ref<Eigen::VectorXd> out) const = 0;
63  virtual void jacobianInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base,
64  const Eigen::MatrixXd &jac,
65  Eigen::Ref<Eigen::MatrixXd> out) const = 0;
66 
67  Eigen::Vector2d draw_{Eigen::Vector2d::Zero()};
74  };
75 
77  {
78  public:
79  LineConstraint(const std::string &name, const RobotPtr &robot, const std::string &frame,
80  const std::string &base, const Eigen::Vector2d &a, const Eigen::Vector2d &b);
81 
82  ompl::base::FoliationPtr copy() const override;
83  // PointConstraintPtr getLeaf(const StatePtr &state) const;
84 
85  // Eigen::VectorXd getTransversal(const ompl::base::State *state) const override;
86  Eigen::VectorXd getTransversal(const Eigen::Ref<const Eigen::VectorXd> &state) const override;
87  ompl::base::ConstraintPtr getLeaf(const Eigen::Ref<const Eigen::VectorXd> &tv) const override;
88  ompl::base::FoliationPtr getFrond(const Eigen::Ref<const Eigen::VectorXd> &a,
89  const Eigen::Ref<const Eigen::VectorXd> &b) const override;
90 
91  void getEndpoints(Eigen::Ref<Eigen::VectorXd> a, Eigen::Ref<Eigen::VectorXd> b,
92  const StatePtr &state) const;
93 
94  protected:
95  void functionInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base,
96  Eigen::Ref<Eigen::VectorXd> out) const override;
97  void jacobianInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base,
98  const Eigen::MatrixXd &jac, Eigen::Ref<Eigen::MatrixXd> out) const override;
99 
100  private:
101  enum Place
102  {
103  A,
106  };
107 
108  struct Result
109  {
110  Eigen::Vector2d at;
111  Eigen::Vector2d bt;
112  Eigen::Vector2d vt;
113 
114  Eigen::Vector2d ca;
115  Eigen::Vector2d cb;
116  double cv;
117 
119  };
120 
121  void getPlace(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base, Result &r) const;
122 
123  const Eigen::Vector2d a_;
124  const Eigen::Vector2d b_;
125  const Eigen::Vector2d v_;
126  const double abn_;
127  };
128 
130  {
131  public:
132  PointConstraint(const std::string &name, const RobotPtr &robot, const std::string &frame,
133  const std::string &base, const Eigen::Vector2d &p);
134 
135  ompl::base::FoliationPtr copy() const override;
136 
137  // Eigen::VectorXd getTransversal(const ompl::base::State *state) const override;
138  Eigen::VectorXd getTransversal(const Eigen::Ref<const Eigen::VectorXd> &state) const override;
139  ompl::base::ConstraintPtr getLeaf(const Eigen::Ref<const Eigen::VectorXd> &tv) const override;
140  ompl::base::FoliationPtr getFrond(const Eigen::Ref<const Eigen::VectorXd> &a,
141  const Eigen::Ref<const Eigen::VectorXd> &b) const override;
142 
143  void getPoint(Eigen::Ref<Eigen::VectorXd> a, const StatePtr &state) const;
144 
145  protected:
146  void functionInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base,
147  Eigen::Ref<Eigen::VectorXd> out) const override;
148  void jacobianInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base,
149  const Eigen::MatrixXd &jac, Eigen::Ref<Eigen::MatrixXd> out) const override;
150 
151  private:
152  const Eigen::Vector2d p_;
153  };
154 
156  {
157  public:
158  CircleConstraint(const std::string &name, const RobotPtr &robot, const std::string &frame,
159  const std::string &base, const Eigen::Vector2d &p, const Eigen::Vector2d &r, unsigned int exponent = 2);
160 
161  ompl::base::FoliationPtr copy() const override;
162 
163  Eigen::VectorXd getTransversal(const Eigen::Ref<const Eigen::VectorXd> &state) const override;
164  ompl::base::ConstraintPtr getLeaf(const Eigen::Ref<const Eigen::VectorXd> &tv) const override;
165  ompl::base::FoliationPtr getFrond(const Eigen::Ref<const Eigen::VectorXd> &a,
166  const Eigen::Ref<const Eigen::VectorXd> &b) const override;
167 
168  void getCircle(Eigen::Ref<Eigen::VectorXd> p, Eigen::Ref<Eigen::VectorXd> r, double &v,
169  const StatePtr &state) const;
170 
171  protected:
172  double getAngle(const Eigen::Isometry2d &frame, const Eigen::Isometry2d &base) const;
173  void functionInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base,
174  Eigen::Ref<Eigen::VectorXd> out) const override;
175  void jacobianInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base,
176  const Eigen::MatrixXd &jac, Eigen::Ref<Eigen::MatrixXd> out) const override;
177 
178  private:
179  const Eigen::Vector2d p_;
180  const Eigen::Vector2d r_;
181  const unsigned int exp_;
182  };
183 
184  // class OrientationConstraint : public FrameConstraint
185  // {
186  // public:
187  // OrientationConstraint(const RobotPtr &robot, const std::string &frame, //
188  // const double v);
189 
190  // protected:
191  // void functionInternal(const Eigen::Isometry2d &pose, //
192  // Eigen::Ref<Eigen::VectorXd> out) const override;
193  // void jacobianInternal(const Eigen::Isometry2d &pose, const Eigen::MatrixXd &jac, //
194  // Eigen::Ref<Eigen::MatrixXd> out) const override;
195 
196  // private:
197  // const double v_;
198  // };
199 
200  } // namespace plan
201 } // namespace se2ez
202 
203 #endif
const Eigen::Vector2d r_
Definition: constraint.h:180
ompl::base::ConstraintPtr getLeaf(const Eigen::Ref< const Eigen::VectorXd > &tv) const override
Definition: constraint.cpp:285
A shared pointer wrapper for se2ez::State.
void getEndpoints(Eigen::Ref< Eigen::VectorXd > a, Eigen::Ref< Eigen::VectorXd > b, const StatePtr &state) const
Definition: constraint.cpp:413
std::recursive_mutex mutex_
Definition: constraint.h:73
const Eigen::Vector2d v_
Definition: constraint.h:125
void getPlace(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base, Result &r) const
Definition: constraint.cpp:379
void jacobianInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base, const Eigen::MatrixXd &jac, Eigen::Ref< Eigen::MatrixXd > out) const override
Definition: constraint.cpp:359
Definition: goals.h:10
ompl::base::FoliationPtr copy() const override
Definition: constraint.cpp:247
const std::string base_
Definition: constraint.h:71
const Eigen::Vector2d a_
Definition: constraint.h:123
LineConstraint(const std::string &name, const RobotPtr &robot, const std::string &frame, const std::string &base, const Eigen::Vector2d &a, const Eigen::Vector2d &b)
Definition: constraint.cpp:236
const std::string name_
Definition: constraint.h:68
void functionInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base, Eigen::Ref< Eigen::VectorXd > out) const override
Definition: constraint.cpp:339
ompl::base::FoliationPtr getFrond(const Eigen::Ref< const Eigen::VectorXd > &a, const Eigen::Ref< const Eigen::VectorXd > &b) const override
Definition: constraint.cpp:307
const unsigned int exp_
Definition: constraint.h:181
std::map< std::string, ompl::base::ConstraintPtr > loadConstraints(const RobotPtr &robot, const std::string &filename)
Definition: yaml.cpp:135
const std::string frame_
Definition: constraint.h:70
const Eigen::Vector2d p_
Definition: constraint.h:152
A shared pointer wrapper for se2ez::Robot.
const Eigen::Vector2d p_
Definition: constraint.h:179
Main namespace.
Definition: collision.h:11
Eigen::VectorXd getTransversal(const Eigen::Ref< const Eigen::VectorXd > &state) const override
Definition: constraint.cpp:252
const Eigen::Vector2d b_
Definition: constraint.h:124
#define SE2EZ_CLASS_FORWARD(C)
Definition: class_forward.h:9