Program Listing for File StateSpace.h
↰ Return to documentation for file (src/ompl/base/StateSpace.h
)
/*********************************************************************
* Software License Agreement (BSD License)
*
* Copyright (c) 2010, 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: Ioan Sucan */
#ifndef OMPL_BASE_STATE_SPACE_
#define OMPL_BASE_STATE_SPACE_
#include "ompl/base/State.h"
#include "ompl/base/StateSpaceTypes.h"
#include "ompl/base/StateSampler.h"
#include "ompl/base/ProjectionEvaluator.h"
#include "ompl/base/GenericParam.h"
#include "ompl/util/Console.h"
#include "ompl/util/ClassForward.h"
#include <boost/concept_check.hpp>
#include <iostream>
#include <vector>
#include <string>
#include <map>
namespace ompl
{
namespace base
{
OMPL_CLASS_FORWARD(StateSpace);
class StateSpace
{
public:
// non-copyable
StateSpace(const StateSpace &) = delete;
StateSpace &operator=(const StateSpace &) = delete;
using StateType = ompl::base::State;
StateSpace();
virtual ~StateSpace();
template <class T>
T *as()
{
BOOST_CONCEPT_ASSERT((boost::Convertible<T *, StateSpace *>));
return static_cast<T *>(this);
}
template <class T>
const T *as() const
{
BOOST_CONCEPT_ASSERT((boost::Convertible<T *, StateSpace *>));
return static_cast<const T *>(this);
}
struct SubstateLocation
{
std::vector<std::size_t> chain;
const StateSpace *space;
};
struct ValueLocation
{
SubstateLocation stateLocation;
std::size_t index;
};
enum SanityChecks
{
STATESPACE_DISTANCE_DIFFERENT_STATES = (1 << 1),
STATESPACE_DISTANCE_SYMMETRIC = (1 << 2),
STATESPACE_INTERPOLATION = (1 << 3),
STATESPACE_TRIANGLE_INEQUALITY = (1 << 4),
STATESPACE_DISTANCE_BOUND = (1 << 5),
STATESPACE_RESPECT_BOUNDS = (1 << 6),
STATESPACE_ENFORCE_BOUNDS_NO_OP = (1 << 7),
STATESPACE_SERIALIZATION = (1 << 8)
};
virtual bool isCompound() const;
virtual bool isDiscrete() const;
virtual bool isHybrid() const;
virtual bool isMetricSpace() const
{
return true;
}
virtual bool hasSymmetricDistance() const;
virtual bool hasSymmetricInterpolate() const;
const std::string &getName() const;
void setName(const std::string &name);
int getType() const
{
return type_;
}
bool includes(const StateSpacePtr &other) const;
bool includes(const StateSpace *other) const;
bool covers(const StateSpacePtr &other) const;
bool covers(const StateSpace *other) const;
ParamSet ¶ms()
{
return params_;
}
const ParamSet ¶ms() const
{
return params_;
}
virtual double getLongestValidSegmentFraction() const;
virtual void setLongestValidSegmentFraction(double segmentFraction);
virtual unsigned int validSegmentCount(const State *state1, const State *state2) const;
virtual void setValidSegmentCountFactor(unsigned int factor);
virtual unsigned int getValidSegmentCountFactor() const;
virtual double getLongestValidSegmentLength() const;
virtual void computeSignature(std::vector<int> &signature) const;
virtual unsigned int getDimension() const = 0;
virtual double getMaximumExtent() const = 0;
virtual double getMeasure() const = 0;
virtual void enforceBounds(State *state) const = 0;
virtual bool satisfiesBounds(const State *state) const = 0;
virtual void copyState(State *destination, const State *source) const = 0;
State *cloneState(const State *source) const;
virtual double distance(const State *state1, const State *state2) const = 0;
virtual unsigned int getSerializationLength() const;
virtual void serialize(void *serialization, const State *state) const;
virtual void deserialize(State *state, const void *serialization) const;
virtual bool equalStates(const State *state1, const State *state2) const = 0;
virtual void interpolate(const State *from, const State *to, double t, State *state) const = 0;
virtual StateSamplerPtr allocDefaultStateSampler() const = 0;
virtual StateSamplerPtr allocStateSampler() const;
void setStateSamplerAllocator(const StateSamplerAllocator &ssa);
void clearStateSamplerAllocator();
virtual State *allocState() const = 0;
virtual void freeState(State *state) const = 0;
virtual double *getValueAddressAtIndex(State *state, unsigned int index) const;
virtual const double *getValueAddressAtIndex(const State *state, unsigned int index) const;
virtual const std::vector<ValueLocation> &getValueLocations() const;
virtual const std::map<std::string, ValueLocation> &getValueLocationsByName() const;
virtual double *getValueAddressAtLocation(State *state, const ValueLocation &loc) const;
virtual const double *getValueAddressAtLocation(const State *state, const ValueLocation &loc) const;
virtual double *getValueAddressAtName(State *state, const std::string &name) const;
virtual const double *getValueAddressAtName(const State *state, const std::string &name) const;
virtual void copyToReals(std::vector<double> &reals, const State *source) const;
virtual void copyFromReals(State *destination, const std::vector<double> &reals) const;
void registerProjection(const std::string &name, const ProjectionEvaluatorPtr &projection);
void registerDefaultProjection(const ProjectionEvaluatorPtr &projection);
virtual void registerProjections();
ProjectionEvaluatorPtr getProjection(const std::string &name) const;
ProjectionEvaluatorPtr getDefaultProjection() const;
bool hasProjection(const std::string &name) const;
bool hasDefaultProjection() const;
const std::map<std::string, ProjectionEvaluatorPtr> &getRegisteredProjections() const;
virtual void printState(const State *state, std::ostream &out = std::cout) const;
virtual void printSettings(std::ostream &out) const;
virtual void printProjections(std::ostream &out) const;
virtual void sanityChecks(double zero, double eps, unsigned int flags) const;
virtual void sanityChecks() const;
void diagram(std::ostream &out) const;
void list(std::ostream &out) const;
static void Diagram(std::ostream &out);
static void List(std::ostream &out);
StateSamplerPtr allocSubspaceStateSampler(const StateSpacePtr &subspace) const;
virtual StateSamplerPtr allocSubspaceStateSampler(const StateSpace *subspace) const;
State *getSubstateAtLocation(State *state, const SubstateLocation &loc) const;
const State *getSubstateAtLocation(const State *state, const SubstateLocation &loc) const;
const std::map<std::string, SubstateLocation> &getSubstateLocationsByName() const;
void getCommonSubspaces(const StateSpacePtr &other, std::vector<std::string> &subspaces) const;
void getCommonSubspaces(const StateSpace *other, std::vector<std::string> &subspaces) const;
virtual void computeLocations();
virtual void setup();
protected:
static const std::string DEFAULT_PROJECTION_NAME;
int type_;
StateSamplerAllocator ssa_;
double maxExtent_;
double longestValidSegmentFraction_;
double longestValidSegment_;
unsigned int longestValidSegmentCountFactor_;
std::map<std::string, ProjectionEvaluatorPtr> projections_;
ParamSet params_;
std::vector<ValueLocation> valueLocationsInOrder_;
std::map<std::string, ValueLocation> valueLocationsByName_;
std::map<std::string, SubstateLocation> substateLocationsByName_;
private:
std::string name_;
};
class CompoundStateSpace : public StateSpace
{
public:
using StateType = ompl::base::CompoundState;
CompoundStateSpace();
CompoundStateSpace(const std::vector<StateSpacePtr> &components, const std::vector<double> &weights);
~CompoundStateSpace() override = default;
template <class T>
T *as(const unsigned int index) const
{
BOOST_CONCEPT_ASSERT((boost::Convertible<T *, StateSpace *>));
return static_cast<T *>(getSubspace(index).get());
}
template <class T>
T *as(const std::string &name) const
{
BOOST_CONCEPT_ASSERT((boost::Convertible<T *, StateSpace *>));
return static_cast<T *>(getSubspace(name).get());
}
bool isCompound() const override;
bool isHybrid() const override;
bool isMetricSpace() const override;
void addSubspace(const StateSpacePtr &component, double weight);
unsigned int getSubspaceCount() const;
const StateSpacePtr &getSubspace(unsigned int index) const;
const StateSpacePtr &getSubspace(const std::string &name) const;
unsigned int getSubspaceIndex(const std::string &name) const;
bool hasSubspace(const std::string &name) const;
double getSubspaceWeight(unsigned int index) const;
double getSubspaceWeight(const std::string &name) const;
void setSubspaceWeight(unsigned int index, double weight);
void setSubspaceWeight(const std::string &name, double weight);
const std::vector<StateSpacePtr> &getSubspaces() const;
const std::vector<double> &getSubspaceWeights() const;
bool isLocked() const;
void lock();
StateSamplerPtr allocSubspaceStateSampler(const StateSpace *subspace) const override;
unsigned int getDimension() const override;
double getMaximumExtent() const override;
double getMeasure() const override;
void enforceBounds(State *state) const override;
bool satisfiesBounds(const State *state) const override;
void copyState(State *destination, const State *source) const override;
unsigned int getSerializationLength() const override;
void serialize(void *serialization, const State *state) const override;
void deserialize(State *state, const void *serialization) const override;
double distance(const State *state1, const State *state2) const override;
void setLongestValidSegmentFraction(double segmentFraction) override;
unsigned int validSegmentCount(const State *state1, const State *state2) const override;
bool equalStates(const State *state1, const State *state2) const override;
void interpolate(const State *from, const State *to, double t, State *state) const override;
StateSamplerPtr allocDefaultStateSampler() const override;
State *allocState() const override;
void freeState(State *state) const override;
double *getValueAddressAtIndex(State *state, unsigned int index) const override;
void printState(const State *state, std::ostream &out) const override;
void printSettings(std::ostream &out) const override;
void computeLocations() override;
void setup() override;
protected:
void allocStateComponents(CompoundState *state) const;
std::vector<StateSpacePtr> components_;
unsigned int componentCount_{0u};
std::vector<double> weights_;
double weightSum_{0.0};
bool locked_{false};
};
StateSpacePtr operator+(const StateSpacePtr &a, const StateSpacePtr &b);
StateSpacePtr operator-(const StateSpacePtr &a, const StateSpacePtr &b);
StateSpacePtr operator-(const StateSpacePtr &a, const std::string &name);
StateSpacePtr operator*(const StateSpacePtr &a, const StateSpacePtr &b);
enum AdvancedStateCopyOperation
{
NO_DATA_COPIED = 0,
SOME_DATA_COPIED = 1,
ALL_DATA_COPIED = 2
};
AdvancedStateCopyOperation copyStateData(const StateSpacePtr &destS, State *dest, const StateSpacePtr &sourceS,
const State *source);
AdvancedStateCopyOperation copyStateData(const StateSpace *destS, State *dest, const StateSpace *sourceS,
const State *source);
AdvancedStateCopyOperation copyStateData(const StateSpacePtr &destS, State *dest, const StateSpacePtr &sourceS,
const State *source, const std::vector<std::string> &subspaces);
AdvancedStateCopyOperation copyStateData(const StateSpace *destS, State *dest, const StateSpace *sourceS,
const State *source, const std::vector<std::string> &subspaces);
}
}
#endif