1 /*********************************************************************
2 * Software License Agreement (BSD License)
3 *
4 *  Copyright (c) 2011, Willow Garage, Inc.
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 Willow Garage 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_CONTROL_SIMPLE_DIRECTED_CONTROL_SAMPLER_
38 #define OMPL_CONTROL_SIMPLE_DIRECTED_CONTROL_SAMPLER_
39 
40 #include "ompl/control/DirectedControlSampler.h"
41 #include "ompl/control/ControlSampler.h"
42 
43 namespace ompl
44 {
45     namespace control
46     {
47         /** \brief Implementation of a simple directed control
48             sampler. This is a basic implementation that does not
49             actually take direction into account and builds upon ControlSampler.
50             Instead, a set of k random controls are sampled, and the control that
51             gets the system closest to the target state is returned.
52 
53            @par External documentation
54            K-control sampling is first believed to be proposed in:
55 
56            S.M. LaValle and J.J. Kuffner, Randomized kinodynamic planning, <em>Intl. J. of Robotics Research</em>, vol.
57            20, pp. 378–400, May 2001. DOI: [10.1177/02783640122067453](http://dx.doi.org/10.1177/02783640122067453)<br>
58            [[PDF]](http://ijr.sagepub.com/content/20/5/378.full.pdf)
59            [[more]](http://msl.cs.uiuc.edu/~lavalle/rrtpubs.html) */
60         class SimpleDirectedControlSampler : public DirectedControlSampler
61         {
62         public:
63             /** \brief Constructor takes the state space to construct samples for as argument
64                 Optionally, a \e k value can be given to indicate the number of controls to
65                 try when directing a system toward a specific state.  Default value is 1. */
66             SimpleDirectedControlSampler(const SpaceInformation *si, unsigned int k = 1);
67 
68             ~SimpleDirectedControlSampler() override;
69 
70             /** \brief Retrieve the number of controls to generate when finding the best control. */
getNumControlSamples()71             unsigned int getNumControlSamples() const
72             {
73                 return numControlSamples_;
74             }
75 
76             /** \brief Set the number of controls to generate when finding the best control. */
setNumControlSamples(unsigned int numSamples)77             void setNumControlSamples(unsigned int numSamples)
78             {
79                 numControlSamples_ = numSamples;
80             }
81 
82             /** \brief Sample a control given that it will be applied
83                 to state \e state and the intention is to reach state
84                 \e dest. This is useful for some algorithms that
85                 have a notion of direction in their exploration (e.g.,
86                 \ref cRRT). Furthermore, return the duration for which
87                 this control should be applied. The state
88                 \e dest is modified to match the state reached with the computed
89                 control and duration. The motion is checked for validity. */
90             unsigned int sampleTo(Control *control, const base::State *source, base::State *dest) override;
91 
92             /** \brief Sample a control given that it will be applied
93                 to state \e state and the intention is to reach state
94                 \e dest. Also take into account the fact that the
95                 previously applied control is \e previous. This is
96                 useful for some algorithms that have a notion of
97                 direction in their exploration (e.g.,
98                 \ref cRRT). Furthermore, return the duration for which
99                 this control should be applied. The state \e dest is
100                 modified to match the state reached with the computed
101                 control and duration. The motion is checked for validity. */
102             unsigned int sampleTo(Control *control, const Control *previous, const base::State *source,
103                                   base::State *dest) override;
104 
105         protected:
106             /** \brief Samples \e numControlSamples_ controls, and returns the
107                 control that brings the system the closest to \e target */
108             virtual unsigned int getBestControl(Control *control, const base::State *source, base::State *dest,
109                                                 const Control *previous);
110 
111             /** \brief An instance of the control sampler*/
112             ControlSamplerPtr cs_;
113 
114             /** \brief The number of controls to sample when finding the best control*/
115             unsigned int numControlSamples_;
116         };
117     }
118 }
119 
120 #endif
121