Program Listing for File AtlasChart.h
↰ Return to documentation for file (src/ompl/base/spaces/constraint/AtlasChart.h)
/*********************************************************************
* Software License Agreement (BSD License)
*
* Copyright (c) 2014, Rice University
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of the Rice University nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*********************************************************************/
/* Author: Zachary Kingston, Caleb Voss */
#ifndef OMPL_BASE_SPACES_ATLAS_CHART_
#define OMPL_BASE_SPACES_ATLAS_CHART_
#include "ompl/base/spaces/constraint/AtlasStateSpace.h"
#include "ompl/datastructures/PDF.h"
#include <vector>
#include <Eigen/Core>
namespace ompl
{
namespace base
{
class AtlasChart
{
private:
class Halfspace
{
public:
// non-copyable
Halfspace(const Halfspace &) = delete;
Halfspace &operator=(const Halfspace &) = delete;
Halfspace(const AtlasChart *owner, const AtlasChart *neighbor);
bool contains(const Eigen::Ref<const Eigen::VectorXd> &v) const;
void checkNear(const Eigen::Ref<const Eigen::VectorXd> &v) const;
bool circleIntersect(double r, Eigen::Ref<Eigen::VectorXd> v1, Eigen::Ref<Eigen::VectorXd> v2) const;
static void intersect(const Halfspace &l1, const Halfspace &l2, Eigen::Ref<Eigen::VectorXd> out);
void setComplement(Halfspace *complement)
{
complement_ = complement;
}
Halfspace *getComplement() const
{
return complement_;
}
const AtlasChart *getOwner() const
{
return owner_;
}
private:
const AtlasChart *owner_;
Halfspace *complement_{nullptr};
Eigen::VectorXd u_;
double usqnorm_;
double rhs_;
void setU(const Eigen::Ref<const Eigen::VectorXd> &u);
double distanceToPoint(const Eigen::Ref<const Eigen::VectorXd> &v) const;
void expandToInclude(const Eigen::Ref<const Eigen::VectorXd> &x);
};
public:
// non-copyable
AtlasChart(const AtlasChart &) = delete;
AtlasChart &operator=(const AtlasChart &) = delete;
AtlasChart(const AtlasStateSpace *atlas, const AtlasStateSpace::StateType *state);
~AtlasChart();
void clear();
const AtlasStateSpace::StateType *getOrigin() const
{
return state_;
}
unsigned int getAmbientDimension() const
{
return n_;
}
unsigned int getManifoldDimension() const
{
return k_;
}
void phi(const Eigen::Ref<const Eigen::VectorXd> &u, Eigen::Ref<Eigen::VectorXd> out) const;
bool psi(const Eigen::Ref<const Eigen::VectorXd> &u, Eigen::Ref<Eigen::VectorXd> out) const;
void psiInverse(const Eigen::Ref<const Eigen::VectorXd> &x, Eigen::Ref<Eigen::VectorXd> out) const;
bool inPolytope(const Eigen::Ref<const Eigen::VectorXd> &u, const Halfspace *ignore1 = nullptr,
const Halfspace *ignore2 = nullptr) const;
void borderCheck(const Eigen::Ref<const Eigen::VectorXd> &v) const;
const AtlasChart *owningNeighbor(const Eigen::Ref<const Eigen::VectorXd> &x) const;
bool toPolygon(std::vector<Eigen::VectorXd> &vertices) const;
std::size_t getNeighborCount() const
{
return polytope_.size();
}
bool estimateIsFrontier() const;
static void generateHalfspace(AtlasChart *c1, AtlasChart *c2);
protected:
const Constraint *constraint_;
std::vector<Halfspace *> polytope_;
void addBoundary(Halfspace *halfspace);
private:
const unsigned int n_;
const unsigned int k_;
const AtlasStateSpace::StateType *state_;
const Eigen::MatrixXd bigPhi_;
const double radius_;
};
}
}
#endif