1 /********************************************************************* 2 * Software License Agreement (BSD License) 3 * 4 * Copyright (c) 2010, Rice University 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * * Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * * Redistributions in binary form must reproduce the above 14 * copyright notice, this list of conditions and the following 15 * disclaimer in the documentation and/or other materials provided 16 * with the distribution. 17 * * Neither the name of the Rice University nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 25 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 29 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 32 * POSSIBILITY OF SUCH DAMAGE. 33 *********************************************************************/ 34 35 /* Author: Ioan Sucan */ 36 37 #ifndef OMPL_BASE_SPACES_SO2_STATE_SPACE_ 38 #define OMPL_BASE_SPACES_SO2_STATE_SPACE_ 39 40 #include "ompl/base/StateSpace.h" 41 42 namespace ompl 43 { 44 namespace base 45 { 46 /** \brief State space sampler for SO(2) */ 47 class SO2StateSampler : public StateSampler 48 { 49 public: 50 /** \brief Constructor */ SO2StateSampler(const StateSpace * space)51 SO2StateSampler(const StateSpace *space) : StateSampler(space) 52 { 53 } 54 55 void sampleUniform(State *state) override; 56 void sampleUniformNear(State *state, const State *near, double distance) override; 57 void sampleGaussian(State *state, const State *mean, double stdDev) override; 58 }; 59 60 /** \brief A state space representing SO(2). The distance 61 function and interpolation take into account angle 62 wrapping. */ 63 class SO2StateSpace : public StateSpace 64 { 65 public: 66 /** \brief The definition of a state in SO(2) */ 67 class StateType : public State 68 { 69 public: 70 /** \brief Set the state to identity -- no rotation (value = 0.0) */ setIdentity()71 void setIdentity() 72 { 73 value = 0.0; 74 } 75 76 /** \brief The value of the angle in the interval (-Pi, Pi] */ 77 double value; 78 }; 79 SO2StateSpace()80 SO2StateSpace() 81 { 82 setName("SO2" + getName()); 83 type_ = STATE_SPACE_SO2; 84 } 85 86 ~SO2StateSpace() override = default; 87 88 unsigned int getDimension() const override; 89 90 double getMaximumExtent() const override; 91 92 double getMeasure() const override; 93 94 /** \brief Normalize the value of the state to the interval [-Pi, Pi) */ 95 void enforceBounds(State *state) const override; 96 97 /** \brief Check if the value of the state is in the interval [-Pi, Pi) */ 98 bool satisfiesBounds(const State *state) const override; 99 100 void copyState(State *destination, const State *source) const override; 101 102 unsigned int getSerializationLength() const override; 103 104 void serialize(void *serialization, const State *state) const override; 105 106 void deserialize(State *state, const void *serialization) const override; 107 108 double distance(const State *state1, const State *state2) const override; 109 110 bool equalStates(const State *state1, const State *state2) const override; 111 112 void interpolate(const State *from, const State *to, double t, State *state) const override; 113 114 StateSamplerPtr allocDefaultStateSampler() const override; 115 116 State *allocState() const override; 117 118 void freeState(State *state) const override; 119 120 double *getValueAddressAtIndex(State *state, unsigned int index) const override; 121 122 void printState(const State *state, std::ostream &out) const override; 123 124 void printSettings(std::ostream &out) const override; 125 126 void registerProjections() override; 127 }; 128 } 129 } 130 131 #endif 132