quadrotor_control_bound_cylinder.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018, The Regents of the University of California (Regents).
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above
13  * copyright notice, this list of conditions and the following
14  * disclaimer in the documentation and/or other materials provided
15  * with the distribution.
16  *
17  * 3. Neither the name of the copyright holder 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 AS IS
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * Please contact the author(s) of this library if you have any questions.
34  * Authors: David Fridovich-Keil ( dfk@eecs.berkeley.edu )
35  */
36 
38 //
39 // Cylindrical bound for quadrotor controls. Circle in (pitch, roll), and
40 // intervals in yaw_rate and thrust.
41 //
43 
44 #ifndef FASTRACK_CONTROL_QUADROTOR_CONTROL_BOUND_CYLINDER_H
45 #define FASTRACK_CONTROL_QUADROTOR_CONTROL_BOUND_CYLINDER_H
46 
50 
51 #include <math.h>
52 
53 namespace fastrack {
54 namespace control {
55 
56 class QuadrotorControlBoundCylinder : public ControlBound<QuadrotorControl> {
57  public:
59  explicit QuadrotorControlBoundCylinder(double radius,
60  const ScalarBoundInterval& yaw_rate,
61  const ScalarBoundInterval& thrust)
62  : pitch_roll_radius_(radius),
63  yaw_rate_interval_(yaw_rate),
64  thrust_interval_(thrust) {}
65 
66  // Assume 'params' is laid out as follows:
67  // [radius, min yaw rate, min thrust, max yaw rate, max thrust]
68  explicit QuadrotorControlBoundCylinder(const std::vector<double>& params)
69  : pitch_roll_radius_(params[0]),
70  yaw_rate_interval_(params[1], params[3]),
71  thrust_interval_(params[2], params[4]) {}
72 
73  // Custom definition of copy-assign operator.
75  const QuadrotorControlBoundCylinder& other) {
76  if (&other == this) return *this;
77 
81  return *this;
82  }
83 
84  // Derived classes must be able to check whether a query is inside the
85  // bound.
86  inline bool Contains(const QuadrotorControl& query) const {
87  return std::hypot(query.pitch, query.roll) < pitch_roll_radius_ &&
90  }
91 
92  // Derived classes must be able to compute the projection of a vector
93  // (represented as the templated type) onto the surface of the bound.
94  // NOTE: this is basically solving an LP with the bound as the feasible
95  // set and the query as the coefficients.
97  const QuadrotorControl& query) const {
98  // Compute scaling to project (pitch, roll) onto the cylinder.
99  constexpr double kSmallNumber = 1e-8;
100  const double scaling =
102  std::max(kSmallNumber, std::hypot(query.pitch, query.roll));
103 
104  return QuadrotorControl(scaling * query.pitch, scaling * query.roll,
107  }
108 
109  private:
110  // Radius in (pitch, roll) dimensions.
112 
113  // Intervals in yaw_rate and thrust.
116 }; //\class ControlBound
117 
118 } // namespace control
119 } // namespace fastrack
120 
121 #endif
QuadrotorControl ProjectToSurface(const QuadrotorControl &query) const
double ProjectToSurface(const double &query) const
QuadrotorControlBoundCylinder & operator=(const QuadrotorControlBoundCylinder &other)
bool Contains(const double &query) const
Definition: box.h:53
QuadrotorControlBoundCylinder(const std::vector< double > &params)
QuadrotorControlBoundCylinder(double radius, const ScalarBoundInterval &yaw_rate, const ScalarBoundInterval &thrust)


fastrack
Author(s): David Fridovich-Keil
autogenerated on Mon Aug 3 2020 21:28:37