NASA Astrobee Robot Software  0.19.1
Flight software for the Astrobee robots operating inside the International Space Station.
nonlinear_trajectory.h
Go to the documentation of this file.
1 /* Copyright (c) 2017, United States Government, as represented by the
2  * Administrator of the National Aeronautics and Space Administration.
3  *
4  * All rights reserved.
5  *
6  * The Astrobee platform is licensed under the Apache License, Version 2.0
7  * (the "License"); you may not use this file except in compliance with the
8  * License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15  * License for the specific language governing permissions and limitations
16  * under the License.
17  */
18 
22 #include <boost/algorithm/clamp.hpp>
23 #include <map>
24 #include <tuple>
25 #include <utility>
26 #include <vector>
27 
28 #ifndef TRAJ_OPT_PRO_NONLINEAR_TRAJECTORY_H_
29 #define TRAJ_OPT_PRO_NONLINEAR_TRAJECTORY_H_
30 
31 namespace traj_opt {
32 
33 typedef std::vector<Variable *> NLTimes;
34 typedef std::vector<Variable *> NLPoly;
35 typedef std::vector<NLPoly> NLSpline;
36 typedef std::vector<NLSpline> NLTraj;
37 
38 // to maintain same tensor ordering of (dim,segment) for ball confinement
39 typedef std::vector<Variable *> NLChain; // (xc,yc,zc,radius)
40 typedef std::vector<NLChain> NLBeads;
41 
42 class AxbConstraint;
43 class BallConstraint;
44 
45 class SymbolicPoly {
46  typedef std::tuple<Variable *, Variable *, int>
47  PolyTriple; // for linear polys in c
48  typedef std::tuple<Variable *, Variable *, Variable *, int>
49  PolyQuad; // for quadratic polys in c
50 
51  public:
52  SymbolicPoly() {} // null constructor
53  // form of a*coeff*t^n
54  SymbolicPoly(Variable *coeff, Variable *time, int n, decimal_t a);
55  // form of a*coeff0*coeff1*t^n
56  SymbolicPoly(Variable *coeff0, Variable *coeff1, Variable *time, int n,
57  decimal_t a);
59  friend SymbolicPoly operator*(decimal_t lhs, const SymbolicPoly &rhs);
61  // for these derrivaties assume only linear terms
62  ETV gradient(int u_id);
63  ETV hessian();
64  // for these derrivaties assume only quadratic terms
65  ETV quad_gradient(int u_id);
67  ETV quad_hessian();
68 
69  SymbolicPoly square(); // returns the square the linear parts
70  void add(const SymbolicPoly &rhs);
71  friend std::ostream &operator<<(std::ostream &os, const SymbolicPoly &poly);
72 
73  private:
74  std::map<PolyTriple, decimal_t> poly_map;
75  std::map<PolyQuad, decimal_t> quad_map;
76 };
77 
78 class PolyCost;
79 class TimeBound;
81  public:
82  // standard contruction
84  const std::vector<Waypoint> &waypoints,
85  const std::vector<std::pair<MatD, VecD> > &cons, int deg = 7,
86  int min_dim = 3, boost::shared_ptr<std::vector<decimal_t> > ds =
87  boost::shared_ptr<std::vector<decimal_t> >(),
88  boost::shared_ptr<VecDVec> path = boost::shared_ptr<VecDVec>(),
89  bool time_opt = false, decimal_t gap = 1e-8, int max_it = 200);
90  // nonconvex pointcloud test
91  NonlinearTrajectory(const std::vector<Waypoint> &waypoints,
92  const Vec3Vec &points, int segs, decimal_t dt);
93  virtual ~NonlinearTrajectory() {}
94 
95  decimal_t getTotalTime() const;
96  bool evaluate(decimal_t t, uint derr, VecD &out) const;
99  bool isSolved() { return solved_; }
100  Vec4Vec getBeads();
101  void scaleTime(decimal_t ratio);
102  SolverInfo getInfo(std::vector<TrajData> *history = NULL);
103 
104  protected:
105  void allocate_poly(
106  boost::shared_ptr<std::vector<decimal_t> > ds =
107  boost::shared_ptr<std::vector<decimal_t> >(),
108  boost::shared_ptr<VecDVec> path = boost::shared_ptr<VecDVec>());
109  void allocate_beads();
110  void link_sections(); // note, requires endpoint basis
111  void add_boundary(
112  const std::vector<Waypoint> &waypoints); // add boundary values
113  void add_Axb(const std::vector<std::pair<MatD, VecD> > &cons);
114  void addCloudConstraint(const Vec3Vec &points);
115  void addPosTime(); // ensures time segments are >
116  void addTimeBound(boost::shared_ptr<std::vector<decimal_t> > ds =
117  boost::shared_ptr<std::vector<decimal_t> >());
118  void make_convex(boost::shared_ptr<std::vector<decimal_t> > ds);
123 
124  boost::shared_ptr<PolyCost> cost;
125  boost::shared_ptr<BasisTransformer> basisT;
126  // sizes
127  // dim_ in parent
128  int seg_, deg_;
130  bool solved_{false};
131  friend class AxbConstraint;
132  friend class BallConstraint;
133 };
134 class PolyCost : public CostFunction {
135  public:
136  PolyCost(const NLTraj &traj, const NLTimes &times, BasisBundlePro &basis,
137  int min_dim);
139  ETV gradient();
140  ETV hessian();
141 
142  private:
143  SymbolicPoly poly;
144  MatD cost_v_;
145  Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic> cost_n_;
146  void init_constants();
147 
148  public:
149  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
150 };
151 
152 } // namespace traj_opt
153 #endif // TRAJ_OPT_PRO_NONLINEAR_TRAJECTORY_H_
trajectory_solver.h
traj_opt::SymbolicPoly::SymbolicPoly
SymbolicPoly()
Definition: nonlinear_trajectory.h:52
traj_opt::SymbolicPoly::evaluate
decimal_t evaluate()
Definition: nonlinear_polynomial.cpp:73
traj_opt::MatD
Eigen::Matrix< decimal_t, Eigen::Dynamic, Eigen::Dynamic > MatD
Definition: types.h:51
traj_opt::Trajectory
Definition: trajectory.h:35
traj_opt::SymbolicPoly
Definition: nonlinear_trajectory.h:45
traj_opt::NonlinearTrajectory::getCost
decimal_t getCost()
Definition: nonlinear_trajectory.cpp:133
traj_opt::NonlinearTrajectory::addTimeBound
void addTimeBound(boost::shared_ptr< std::vector< decimal_t > > ds=boost::shared_ptr< std::vector< decimal_t > >())
Definition: nonlinear_trajectory.cpp:372
traj_opt::NonlinearTrajectory::cost
boost::shared_ptr< PolyCost > cost
Definition: nonlinear_trajectory.h:124
nonlinear_solver.h
traj_opt::Vec4Vec
std::vector< Vec4, Eigen::aligned_allocator< Vec4 > > Vec4Vec
Definition: types.h:45
traj_opt::NonlinearTrajectory::link_sections
void link_sections()
Definition: nonlinear_trajectory.cpp:171
traj_opt::PolyCost::gradient
ETV gradient()
Definition: nonlinear_trajectory.cpp:498
traj_opt::NLTraj
std::vector< NLSpline > NLTraj
Definition: nonlinear_trajectory.h:36
traj_opt::NLTimes
std::vector< Variable * > NLTimes
Definition: nonlinear_trajectory.h:33
traj_opt::TrajData
Definition: traj_data.h:61
traj_opt::NonlinearTrajectory::basis
BasisBundlePro basis
Definition: nonlinear_trajectory.h:129
traj_opt::NonlinearTrajectory::make_convex
void make_convex(boost::shared_ptr< std::vector< decimal_t > > ds)
Definition: nonlinear_trajectory.cpp:185
traj_opt::SymbolicPoly::square
SymbolicPoly square()
Definition: nonlinear_polynomial.cpp:272
traj_opt::NonlinearTrajectory::getBeads
Vec4Vec getBeads()
Definition: nonlinear_trajectory.cpp:516
traj_opt::NonlinearTrajectory::solved_
bool solved_
Definition: nonlinear_trajectory.h:130
traj_opt::NonlinearTrajectory::solver
NonlinearSolver solver
Definition: nonlinear_trajectory.h:119
traj_opt::decimal_t
double decimal_t
Definition: types.h:35
traj_opt::CostFunction
Definition: nonlinear_solver.h:116
traj_opt::PolyCost::PolyCost
PolyCost(const NLTraj &traj, const NLTimes &times, BasisBundlePro &basis, int min_dim)
Definition: nonlinear_trajectory.cpp:474
polynomial_basis.h
traj_opt::NonlinearTrajectory::scaleTime
void scaleTime(decimal_t ratio)
Definition: nonlinear_trajectory.cpp:522
traj_opt::SymbolicPoly::hessian
ETV hessian()
Definition: nonlinear_polynomial.cpp:118
traj_opt::SymbolicPoly::add
void add(const SymbolicPoly &rhs)
Definition: nonlinear_polynomial.cpp:33
traj_opt::BasisBundlePro
Definition: polynomial_basis.h:67
traj_opt::NonlinearTrajectory::add_Axb
void add_Axb(const std::vector< std::pair< MatD, VecD > > &cons)
Definition: nonlinear_trajectory.cpp:386
traj_opt::NLBeads
std::vector< NLChain > NLBeads
Definition: nonlinear_trajectory.h:40
traj_opt::NonlinearTrajectory::isSolved
bool isSolved()
Definition: nonlinear_trajectory.h:99
traj_opt::SolverInfo
Definition: traj_data.h:74
traj_opt::NonlinearTrajectory::addPosTime
void addPosTime()
Definition: nonlinear_trajectory.cpp:365
traj_opt::Vec3Vec
std::vector< Vec3, Eigen::aligned_allocator< Vec3 > > Vec3Vec
Definition: types.h:46
traj_opt::SymbolicPoly::operator*
friend SymbolicPoly operator*(decimal_t lhs, const SymbolicPoly &rhs)
Definition: nonlinear_polynomial.cpp:65
traj_opt
Definition: msg_traj.h:27
traj_opt::PolyCost
Definition: nonlinear_trajectory.h:134
traj_opt::NonlinearTrajectory::times
NLTimes times
Definition: nonlinear_trajectory.h:121
traj_opt::SymbolicPoly::quad_hessian
ETV quad_hessian()
Definition: nonlinear_polynomial.cpp:206
traj_opt::PolyCost::evaluate
decimal_t evaluate()
Definition: nonlinear_trajectory.cpp:497
traj_opt::SymbolicPoly::operator+=
SymbolicPoly & operator+=(const SymbolicPoly &rhs)
Definition: nonlinear_polynomial.cpp:57
traj_opt::PolyCost::hessian
ETV hessian()
Definition: nonlinear_trajectory.cpp:499
traj_opt::NonlinearTrajectory::deg_
int deg_
Definition: nonlinear_trajectory.h:128
traj_opt::Variable
Definition: nonlinear_solver.h:56
traj_opt::SymbolicPoly::gradient
ETV gradient(int u_id)
Definition: nonlinear_polynomial.cpp:94
traj_opt::NonlinearTrajectory::addCloudConstraint
void addCloudConstraint(const Vec3Vec &points)
Definition: nonlinear_trajectory.cpp:501
traj_opt::NonlinearTrajectory::getTotalTime
decimal_t getTotalTime() const
Definition: nonlinear_trajectory.cpp:404
traj_opt::NonlinearTrajectory::getInfo
SolverInfo getInfo(std::vector< TrajData > *history=NULL)
Definition: nonlinear_trajectory.cpp:534
traj_opt::NLPoly
std::vector< Variable * > NLPoly
Definition: nonlinear_trajectory.h:34
traj_opt::NonlinearTrajectory::evaluate
bool evaluate(decimal_t t, uint derr, VecD &out) const
Definition: nonlinear_trajectory.cpp:409
traj_opt::NonlinearTrajectory::NonlinearTrajectory
NonlinearTrajectory(const std::vector< Waypoint > &waypoints, const std::vector< std::pair< MatD, VecD > > &cons, int deg=7, int min_dim=3, boost::shared_ptr< std::vector< decimal_t > > ds=boost::shared_ptr< std::vector< decimal_t > >(), boost::shared_ptr< VecDVec > path=boost::shared_ptr< VecDVec >(), bool time_opt=false, decimal_t gap=1e-8, int max_it=200)
traj_opt::NonlinearTrajectory::~NonlinearTrajectory
virtual ~NonlinearTrajectory()
Definition: nonlinear_trajectory.h:93
traj_opt::BallConstraint
Definition: nonlinear_trajectory.cpp:258
traj_opt::NonlinearSolver
Definition: nonlinear_solver.h:125
traj_opt::NonlinearTrajectory::traj
NLTraj traj
Definition: nonlinear_trajectory.h:120
traj_opt::NonlinearTrajectory::allocate_beads
void allocate_beads()
Definition: nonlinear_trajectory.cpp:162
traj_opt::NLSpline
std::vector< NLPoly > NLSpline
Definition: nonlinear_trajectory.h:35
traj_opt::AxbConstraint
Definition: nonlinear_trajectory.cpp:223
traj_opt::SymbolicPoly::operator<<
friend std::ostream & operator<<(std::ostream &os, const SymbolicPoly &poly)
Definition: nonlinear_trajectory.cpp:455
traj_opt::SymbolicPoly::quad_gradient
ETV quad_gradient()
Definition: nonlinear_polynomial.cpp:149
traj_opt::VecD
Eigen::Matrix< decimal_t, Eigen::Dynamic, 1 > VecD
Definition: types.h:49
traj_opt::NonlinearTrajectory::serialize
TrajData serialize()
Definition: nonlinear_trajectory.cpp:430
traj_opt::NLChain
std::vector< Variable * > NLChain
Definition: nonlinear_trajectory.h:39
traj_opt::NonlinearTrajectory::beads
NLBeads beads
Definition: nonlinear_trajectory.h:122
traj_opt::ETV
std::vector< ET > ETV
Definition: nonlinear_solver.h:45
traj_opt::NonlinearTrajectory::allocate_poly
void allocate_poly(boost::shared_ptr< std::vector< decimal_t > > ds=boost::shared_ptr< std::vector< decimal_t > >(), boost::shared_ptr< VecDVec > path=boost::shared_ptr< VecDVec >())
Definition: nonlinear_trajectory.cpp:135
traj_opt::NonlinearTrajectory::add_boundary
void add_boundary(const std::vector< Waypoint > &waypoints)
Definition: nonlinear_trajectory.cpp:198
traj_opt::NonlinearTrajectory::seg_
int seg_
Definition: nonlinear_trajectory.h:128
traj_opt::NonlinearTrajectory::basisT
boost::shared_ptr< BasisTransformer > basisT
Definition: nonlinear_trajectory.h:125
traj_opt::NonlinearTrajectory
Definition: nonlinear_trajectory.h:80