se2ez
space.cpp
Go to the documentation of this file.
1 /* Author: Zachary Kingston */
2 
3 #include <se2ez/core/joint.h>
4 #include <se2ez/core/frame.h>
5 #include <se2ez/core/robot.h>
6 #include <se2ez/core/state.h>
7 
8 #include <se2ez/plan/space.h>
10 #include <se2ez/plan/sampler.h>
11 
12 #include <ompl/base/spaces/RealVectorStateProjections.h>
13 
14 using namespace se2ez;
15 
16 ///
17 /// StateSpace::StateType
18 ///
19 
21  : ompl::base::RealVectorStateSpace::StateType(), state(std::make_shared<se2ez::State>(robot))
22 {
23  values = state->data.data();
24 }
25 
26 ///
27 /// StateSpace
28 ///
29 
31  : ompl::base::RealVectorStateSpace(robot->getNumJoints()), robot_(robot), frames_(robot->getJoints())
32 {
33  const auto &upper = robot_->getUpperLimits();
34  const auto &lower = robot_->getLowerLimits();
35  for (unsigned int i = 0; i < dimension_; ++i)
36  {
37  bounds_.setLow(i, lower[i]);
38  bounds_.setHigh(i, upper[i]);
39  }
40 
41  // Heuristic for decent VSF in serial chain manipulators
42  setLongestValidSegmentFraction(0.01 / robot->getNumJoints() / 2);
43 }
44 
45 void plan::StateSpace::enforceBounds(ompl::base::State *state) const
46 {
47  auto *as = state->as<StateType>();
48  robot_->enforceLimits(as->state);
49 }
50 
51 bool plan::StateSpace::satisfiesBounds(const ompl::base::State *state) const
52 {
53  const auto *as = state->as<StateType>();
54  return robot_->inLimits(as->state);
55 }
56 
57 double plan::StateSpace::distance(const ompl::base::State *state1, const ompl::base::State *state2) const
58 {
59  const auto *as1 = state1->as<StateType>();
60  const auto *as2 = state2->as<StateType>();
61 
62  return robot_->distance(as1->state, as2->state);
63 }
64 
65 bool plan::StateSpace::equalStates(const ompl::base::State *state1, const ompl::base::State *state2) const
66 {
67  return distance(state1, state2) < 2 * math::eps;
68 }
69 
70 void plan::StateSpace::interpolate(const ompl::base::State *from, const ompl::base::State *to, double t,
71  ompl::base::State *state) const
72 {
73  const auto *af = from->as<StateType>();
74  const auto *at = to->as<StateType>();
75  auto *as = state->as<StateType>();
76 
77  robot_->interpolate(af->state, at->state, t, as->state);
78 }
79 
80 void plan::StateSpace::copyState(ompl::base::State *destination, const ompl::base::State *source) const
81 {
82  auto *ad = destination->as<StateType>();
83  const auto *as = source->as<StateType>();
84 
85  ad->state->copy(as->state);
86 }
87 
88 ompl::base::State *plan::StateSpace::allocState() const
89 {
90  return new StateType(robot_);
91 }
92 
93 ompl::base::State *plan::StateSpace::allocState(const StatePtr &state) const
94 {
95  auto *s = new StateType(robot_);
96  s->state = state;
97 
98  return s;
99 }
100 
101 void plan::StateSpace::freeState(ompl::base::State *state) const
102 {
103  auto *as = state->as<StateType>();
104  delete as;
105 }
106 
107 void plan::StateSpace::printState(const ompl::base::State *state, std::ostream &out) const
108 {
109  const auto *as = state->as<StateType>();
110  for (const auto &pair : frames_)
111  {
112  const auto &frame = pair.second;
113  out << frame->frame->getName() << tf::printVector(frame->getValuesConst(as->state->data))
114  << std::endl;
115  }
116 
117  out << std::endl;
118 }
119 
120 double *plan::StateSpace::getValueAddressAtIndex(ompl::base::State *state, unsigned int index) const
121 {
122  auto *as = state->as<StateType>();
123  as->state->dirty = true;
124  return index < dimension_ ? &as->state->data[index] : nullptr;
125 
126  // return ompl::base::RealVectorStateSpace::getValueAddressAtIndex(state, index);
127 }
128 
129 ompl::base::StateSamplerPtr plan::StateSpace::allocDefaultStateSampler() const
130 {
131  return std::make_shared<plan::StateSampler>(this);
132 }
133 
135 {
136  const auto &ees = robot_->getEEs();
137  for (const auto &ee : ees)
138  {
139  registerProjection(ee + ":R2", std::make_shared<R2Projection>(this, ee));
140  registerProjection(ee + ":SE2", std::make_shared<SE2Projection>(this, ee));
141  }
142 
143  if (ees.empty())
144  {
145  if (dimension_ > 2)
146  {
147  int p = std::max(2, (int)ceil(log((double)dimension_)));
148  registerDefaultProjection(
149  std::make_shared<ompl::base::RealVectorRandomLinearProjectionEvaluator>(this, p));
150  }
151  else
152  registerDefaultProjection(
153  std::make_shared<ompl::base::RealVectorIdentityProjectionEvaluator>(this));
154  }
155  else
156  registerDefaultProjection(getRegisteredProjections().find(ees.front() + ":R2")->second);
157 }
158 
160 {
161  return robot_;
162 }
StateType(const RobotPtr &robot)
Definition: space.cpp:20
A shared pointer wrapper for se2ez::State.
A representation of a state of a Robot.
Definition: state.h:28
void interpolate(const ompl::base::State *from, const ompl::base::State *to, double t, ompl::base::State *state) const override
Definition: space.cpp:70
T endl(T... args)
std::vector< std::pair< std::string, Robot::FrameDataPtr > > frames_
Definition: space.h:61
void printState(const ompl::base::State *state, std::ostream &out) const override
Definition: space.cpp:107
bool satisfiesBounds(const ompl::base::State *state) const override
Definition: space.cpp:51
void copyState(ompl::base::State *destination, const ompl::base::State *source) const override
Definition: space.cpp:80
void enforceBounds(ompl::base::State *state) const override
Definition: space.cpp:45
bool equalStates(const ompl::base::State *state1, const ompl::base::State *state2) const override
Definition: space.cpp:65
Definition: goals.h:10
StateSpace(const RobotPtr &robot)
Definition: space.cpp:30
void freeState(ompl::base::State *state) const override
Definition: space.cpp:101
static const double eps
Definition: math.h:36
ompl::base::State * allocState() const override
Definition: space.cpp:88
T max(T... args)
const RobotPtr robot_
Definition: space.h:60
double * getValueAddressAtIndex(ompl::base::State *state, unsigned int index) const override
Definition: space.cpp:120
ompl::base::StateSamplerPtr allocDefaultStateSampler() const override
Definition: space.cpp:129
double distance(const ompl::base::State *state1, const ompl::base::State *state2) const override
Definition: space.cpp:57
A shared pointer wrapper for se2ez::Robot.
std::string printVector(const Eigen::VectorXd &v, unsigned int precision=4)
Returns a string of a vector&#39;s contents.
Definition: math.cpp:90
const RobotPtr getRobot() const
Definition: space.cpp:159
Main namespace.
Definition: collision.h:11
void registerProjections() override
Definition: space.cpp:134