12 #include <ompl/base/spaces/constraint/ConstrainedStateSpace.h> 19 using namespace se2ez;
23 unsigned int dimension,
unsigned int leaf)
24 :
ompl::base::Foliation(robot->getNumJoints(), dimension, leaf)
29 , state_(
std::make_shared<
State>(robot))
34 if (!robot->getFrame(
frame_))
40 if (!robot->getFrame(
base_))
50 const auto &as = state->as<ompl::base::ConstrainedStateSpace::StateType>()
73 Eigen::Isometry2d frame, base;
79 const auto &as = state->as<ompl::base::ConstrainedStateSpace::StateType>()
93 Eigen::Ref<Eigen::VectorXd> out)
const 97 Eigen::Isometry2d frame, base;
104 const auto &as = state->as<ompl::base::ConstrainedStateSpace::StateType>()
109 Eigen::Isometry2d frame, base;
118 Eigen::MatrixXd
copy = out;
120 ompl::base::Constraint::jacobian(state, out);
123 Eigen::MatrixXd diff = copy - out;
130 Eigen::Ref<Eigen::MatrixXd> out)
const 134 Eigen::Isometry2d frame, base;
143 Eigen::MatrixXd
copy = out;
145 ompl::base::Constraint::jacobian(x, out);
148 Eigen::MatrixXd diff = copy - out;
156 const auto &as = state->as<ompl::base::ConstrainedStateSpace::StateType>()
161 unsigned int iter = 0;
163 Eigen::VectorXd f(getCoDimension());
164 Eigen::MatrixXd j(getCoDimension(), n_);
167 const double squaredTolerance = tolerance_;
170 while ((norm = f.lpNorm<Eigen::Infinity>()) > squaredTolerance && iter++ < maxIterations_)
173 as->data -= j.jacobiSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(f);
180 return norm < squaredTolerance;
188 unsigned int iter = 0;
191 Eigen::VectorXd f(getCoDimension());
192 Eigen::MatrixXd j(getCoDimension(), n_);
194 const double squaredTolerance = tolerance_;
197 while ((norm = f.lpNorm<Eigen::Infinity>()) > squaredTolerance && iter++ < maxIterations_)
200 x -= j.jacobiSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(f);
205 return norm < squaredTolerance;
210 Eigen::VectorXd f(getCoDimension());
217 Eigen::VectorXd f(getCoDimension());
219 return f.allFinite() && f.squaredNorm() <= tolerance_ * tolerance_;
238 const Eigen::Vector2d &b)
242 , v_((b_ - a_).normalized())
243 , abn_((b_ - a_).norm())
254 Eigen::Isometry2d frame, base;
284 ompl::base::ConstraintPtr
287 double cv = transversal[0] *
abn_;
289 Eigen::Vector2d point;
295 point =
a_ + cv *
v_;
308 const Eigen::Ref<const Eigen::VectorXd> &b)
const 310 double acv = a[0] *
abn_, bcv = b[0] *
abn_;
312 Eigen::Vector2d pointA, pointB;
318 pointA =
a_ + acv *
v_;
325 pointB =
a_ + bcv *
v_;
336 base_, pointA, pointB);
340 Eigen::Ref<Eigen::VectorXd> out)
const 348 out[0] = r.
ca.squaredNorm();
351 out[0] = r.
cb.squaredNorm();
354 out[0] = r.
ca.squaredNorm() - pow(r.
cv, 2);
360 const Eigen::MatrixXd &jac, Eigen::Ref<Eigen::MatrixXd> out)
const 368 out = 2 * r.
ca.transpose() * jac.block(0, 0, 2, n_);
371 out = 2 * r.
cb.transpose() * jac.block(0, 0, 2, n_);
374 out = 2 * (r.
ca - r.
cv * r.
vt).transpose() * jac.block(0, 0, 2, n_);
384 r.
vt = base.rotation() *
v_;
386 r.
ca = pose.translation() - r.
at;
387 r.
cb = pose.translation() - r.
bt;
428 const Eigen::Vector2d &p)
450 const Eigen::Ref<const Eigen::VectorXd> &)
const 457 Eigen::Ref<Eigen::VectorXd> out)
const 459 const auto &p = base *
p_;
461 const auto &ca = pose.translation() - p;
462 out[0] = ca.squaredNorm();
466 const Eigen::MatrixXd &jac,
467 Eigen::Ref<Eigen::MatrixXd> out)
const 469 const auto &p = base *
p_;
471 const auto &ca = pose.translation() - p;
472 out = 2 * ca.transpose() * jac.block(0, 0, 2, n_);
487 const Eigen::Vector2d &p,
const Eigen::Vector2d &r,
488 unsigned int exponent)
491 SE2EZ_ERROR(
"CircleConstraint is currently under development! Use at your own risk.");
497 double theta =
std::atan2(frame.translation()[1] /
r_[1] - p[1], frame.translation()[0] /
r_[0] - p[0]);
508 Eigen::Isometry2d frame, base;
517 Eigen::Isometry2d frame, base;
519 auto p = frame.translation() - base.translation();
525 const Eigen::Ref<const Eigen::VectorXd> & ,
const Eigen::Ref<const Eigen::VectorXd> & )
const 532 Eigen::Ref<Eigen::VectorXd> out)
const 534 const auto &p = base *
p_;
536 Eigen::Vector2d ca = (pose.translation() - p).cwiseQuotient(
r_).cwiseAbs();
537 for (
unsigned int i = 1; i <
exp_; ++i)
538 ca = ca.cwiseProduct(ca);
539 out[0] = ca.sum() - 1;
543 const Eigen::MatrixXd &jac,
544 Eigen::Ref<Eigen::MatrixXd> out)
const 546 const auto &p = base *
p_;
548 Eigen::Vector2d ca = (pose.translation() - p).cwiseQuotient(
r_).cwiseAbs();
549 for (
unsigned int i = 1; i <
exp_ - 1; ++i)
550 ca = ca.cwiseProduct(ca);
551 out = exp_ * ca.transpose() * jac.block(0, 0, 2, n_);
555 double &v,
const StatePtr &state)
const Eigen::VectorXd getTransversal(const Eigen::Ref< const Eigen::VectorXd > &state) const override
ompl::base::ConstraintPtr getLeaf(const Eigen::Ref< const Eigen::VectorXd > &tv) const override
ompl::base::ConstraintPtr getLeaf(const Eigen::Ref< const Eigen::VectorXd > &tv) const override
A shared pointer wrapper for se2ez::State.
ompl::base::ConstraintPtr getLeaf(const Eigen::Ref< const Eigen::VectorXd > &tv) const override
void getEndpoints(Eigen::Ref< Eigen::VectorXd > a, Eigen::Ref< Eigen::VectorXd > b, const StatePtr &state) const
PointConstraint(const std::string &name, const RobotPtr &robot, const std::string &frame, const std::string &base, const Eigen::Vector2d &p)
std::string printFrame(const Eigen::Isometry2d &frame)
Returns a string "[x, y, t]" of the translation (x, y) and rotation (t) component of a transform...
A representation of a state of a Robot.
std::recursive_mutex mutex_
double getRotation(const Eigen::Isometry2d &frame)
Gets rotation from a frame from the X-axis (t)
virtual void functionInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base, Eigen::Ref< Eigen::VectorXd > out) const =0
double clamp(double v, double a, double b)
Clamp a value v between a range [a, b].
std::string printMatrix(const Eigen::MatrixXd &v, unsigned int precision=4)
Returns a string of a matrix's contents.
void getPlace(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base, Result &r) const
ompl::base::FoliationPtr getFrond(const Eigen::Ref< const Eigen::VectorXd > &a, const Eigen::Ref< const Eigen::VectorXd > &b) const override
void functionInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base, Eigen::Ref< Eigen::VectorXd > out) const override
#define SE2EZ_INFORM(fmt,...)
void jacobianInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base, const Eigen::MatrixXd &jac, Eigen::Ref< Eigen::MatrixXd > out) const override
const Eigen::Vector2d & getDrawOffset() const
void getPoint(Eigen::Ref< Eigen::VectorXd > a, const StatePtr &state) const
void function(const ompl::base::State *state, Eigen::Ref< Eigen::VectorXd > out) const override
virtual FoliationPtr copy() const =0
ompl::base::FoliationPtr copy() const override
FrameConstraint(const std::string &name, const RobotPtr &robot, const std::string &frame, const std::string &base, unsigned int dimension=1, unsigned int leaf=0)
ompl::base::FoliationPtr getFrond(const Eigen::Ref< const Eigen::VectorXd > &a, const Eigen::Ref< const Eigen::VectorXd > &b) const override
double distance(const ompl::base::State *state) const override
LineConstraint(const std::string &name, const RobotPtr &robot, const std::string &frame, const std::string &base, const Eigen::Vector2d &a, const Eigen::Vector2d &b)
double getAngle(const Eigen::Isometry2d &frame, const Eigen::Isometry2d &base) const
ompl::base::FoliationPtr copy() const override
Eigen::VectorXd toVector(double x)
Converts a single double value into a 1 x 1 matrix.
void functionInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base, Eigen::Ref< Eigen::VectorXd > out) const override
void functionInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base, Eigen::Ref< Eigen::VectorXd > out) const override
virtual void jacobianInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base, const Eigen::MatrixXd &jac, Eigen::Ref< Eigen::MatrixXd > out) const =0
double angleNormalize(double v)
Normalize an angle between -pi to pi.
ompl::base::FoliationPtr getFrond(const Eigen::Ref< const Eigen::VectorXd > &a, const Eigen::Ref< const Eigen::VectorXd > &b) const override
bool isSatisfied(const ompl::base::State *state) const override
void jacobianInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base, const Eigen::MatrixXd &jac, Eigen::Ref< Eigen::MatrixXd > out) const override
unsigned int p_
Leaf dimension.
CircleConstraint(const std::string &name, const RobotPtr &robot, const std::string &frame, const std::string &base, const Eigen::Vector2d &p, const Eigen::Vector2d &r, unsigned int exponent=2)
const std::pair< Eigen::Isometry2d, Eigen::Isometry2d > getPose(const ompl::base::State *state) const
A shared pointer wrapper for se2ez::Robot.
std::string printVector(const Eigen::VectorXd &v, unsigned int precision=4)
Returns a string of a vector's contents.
std::string format(const std::string &fmt, Args &&... args)
void setDrawOffset(const Eigen::Ref< const Eigen::Vector2d > &v)
#define SE2EZ_DEBUG(fmt,...)
Eigen::VectorXd getTransversal(const Eigen::Ref< const Eigen::VectorXd > &state) const override
bool project(ompl::base::State *state) const override
#define SE2EZ_ERROR(fmt,...)
Eigen::VectorXd getTransversal(const Eigen::Ref< const Eigen::VectorXd > &state) const override
double remap(double a1, double a2, double av, double b1, double b2)
Remap a value av in the interval a1, a2 to the interval b1, b2.
ompl::base::FoliationPtr copy() const override
void getCircle(Eigen::Ref< Eigen::VectorXd > p, Eigen::Ref< Eigen::VectorXd > r, double &v, const StatePtr &state) const
void jacobianInternal(const Eigen::Isometry2d &pose, const Eigen::Isometry2d &base, const Eigen::MatrixXd &jac, Eigen::Ref< Eigen::MatrixXd > out) const override
void jacobian(const ompl::base::State *state, Eigen::Ref< Eigen::MatrixXd > out) const override