Trajectory.h
Go to the documentation of this file.
1 /**
2  * This file is part of ArmarX.
3  *
4  * ArmarX is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * ArmarX is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * @author Fabian Reister ( fabian dot reister at kit dot edu )
17  * @author Christian R. G. Dreher ( c dot dreher at kit dot edu )
18  * @date 2021
19  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20  * GNU General Public License
21  */
22 
23 #pragma once
24 
25 #include <cstddef>
26 #include <memory>
27 #include <utility>
28 #include <vector>
29 
31 
33 
35 {
36 
38  {
40  float velocity; // [mm/s]
41  };
42 
43  using GlobalTrajectoryPoints = std::vector<GlobalTrajectoryPoint>;
44 
45  struct Projection
46  {
48 
51 
52  enum class Segment
53  {
54  FIRST,
56  FINAL
57  };
58 
60  };
61 
63  {
66  };
67 
68  using GlobalTrajectoryPtr = std::shared_ptr<class GlobalTrajectory>;
69 
71  {
72  public:
73  GlobalTrajectory() = default;
74 
75  GlobalTrajectory(const std::vector<GlobalTrajectoryPoint>& points) : pts(points)
76  {
77  }
78 
79  Projection getProjection(const Position& point,
80  const VelocityInterpolation& velocityInterpolation) const;
81 
82  /**
83  * @brief Project point onto the trajectory and return a new trajectory along the old one
84  * from that point for the specified distance.
85  * @return The subtrajectory and whether the subtrajectory ends at the same point,
86  * as this trajectory
87  */
88  std::pair<GlobalTrajectory, bool> getSubTrajectory(const Position& point,
89  const float distance) const;
90 
91  /**
92  * @brief Project point onto the trajectory and evaluate the remaining distance from there
93  * on.
94  * @param point: current location, from which on to measure
95  * @return Remaining translation along the trajectory in mm (ignoring rotations!)
96  */
97  float getRemainingDistance(const Position& point) const;
98 
99  /**
100  * @brief Project point onto the trajectory and evaluate the remaining duration from there
101  * on.
102  * @param point: current location, from which on to measure
103  * @param linearVelocity: velocity for translations in mm/s
104  * @param angularVelocity: velocity for rotations in rad/s
105  * @return Remaining translation along the trajectory in s
106  */
107  float getRemainingDuration(const Position& point, float linearVelocity = 400,
108  float angularVelocity = 0.5) const;
109 
110  [[nodiscard]] std::vector<Position> positions() const noexcept;
111 
112  [[nodiscard]] std::vector<Pose> poses() const noexcept;
113 
114  //! Note: the velocity will not be set!
115  // currently, only 2D version
116  // y is pointing forward
117  static GlobalTrajectory FromPath(const Path& path, float velocity);
118  static GlobalTrajectory FromPath(const Path& path, const std::vector<float>& velocity);
119 
120  //! Note: the velocity will not be set!
121  // currently, only 2D version
122  // y is pointing forward
123  static GlobalTrajectory
124  FromPath(const Pose& start, const Positions& waypoints, const Pose& goal, float velocity);
125 
126 
127  static GlobalTrajectory FromPath(const Pose& start,
128  const Positions& waypoints,
129  const Pose& goal,
130  const std::vector<float>& velocity);
131 
132 
133  GlobalTrajectory resample(float eps) const;
134 
135  float length() const;
136 
137  void setMaxVelocity(float maxVelocity);
138 
139  bool hasMaxDistanceBetweenWaypoints(float maxDistance) const;
140 
141  const std::vector<GlobalTrajectoryPoint>& points() const;
142 
144 
145  float duration(core::VelocityInterpolation interpolation) const;
146 
147  bool isValid() const noexcept;
148 
149  using Indices = std::vector<std::size_t>;
150 
151  /**
152  * @brief get all points within a certain radius that are directly connected to idx
153  *
154  * @return the list without idx
155  *
156  */
157  Indices allConnectedPointsInRange(std::size_t idx, float radius) const;
158 
159  private:
160  struct InternalProjection
161  {
162  GlobalTrajectoryPoint projection;
163  size_t indexBefore;
164  };
165 
166  InternalProjection
167  projectInternal(const Position& point,
168  const VelocityInterpolation& velocityInterpolation) const;
169 
170 
171  private:
172  std::vector<GlobalTrajectoryPoint> pts;
173  };
174 
176  {
179  };
180 
181  using LocalTrajectoryPoints = std::vector<LocalTrajectoryPoint>;
182 
183  struct Evaluation
184  {
187  };
188 
190  {
191  public:
192  LocalTrajectory() = default;
193 
194  LocalTrajectory(const std::vector<LocalTrajectoryPoint>& points) : pts(points)
195  {
196  }
197 
198  const std::vector<LocalTrajectoryPoint>& points() const;
199 
200  std::vector<LocalTrajectoryPoint>& mutablePoints();
201 
202  Evaluation evaluate(const DateTime& timestamp) const;
203 
204 
205  private:
206  std::vector<LocalTrajectoryPoint> pts;
207  };
208 
209 
210 } // namespace armarx::navigation::core
armarx::navigation::core::GlobalTrajectory
Definition: Trajectory.h:70
armarx::navigation::core::VelocityInterpolation
VelocityInterpolation
Definition: Trajectory.h:62
armarx::navigation::core::GlobalTrajectory::mutablePoints
std::vector< GlobalTrajectoryPoint > & mutablePoints()
Definition: Trajectory.cpp:796
armarx::navigation::core::Projection::Segment::INTERMEDIATE
@ INTERMEDIATE
armarx::navigation::core::LocalTrajectory::mutablePoints
std::vector< LocalTrajectoryPoint > & mutablePoints()
Definition: Trajectory.cpp:901
armarx::navigation::core::Projection::wayPointAfter
GlobalTrajectoryPoint wayPointAfter
Definition: Trajectory.h:50
armarx::navigation::core::Projection
Definition: Trajectory.h:45
armarx::navigation::core::GlobalTrajectory::isValid
bool isValid() const noexcept
Definition: Trajectory.cpp:837
armarx::navigation::core::VelocityInterpolation::LinearInterpolation
@ LinearInterpolation
armarx::navigation::core::GlobalTrajectory::GlobalTrajectory
GlobalTrajectory(const std::vector< GlobalTrajectoryPoint > &points)
Definition: Trajectory.h:75
armarx::navigation::core::GlobalTrajectory::Indices
std::vector< std::size_t > Indices
Definition: Trajectory.h:149
armarx::navigation::core::Pose
Eigen::Isometry3f Pose
Definition: basic_types.h:31
armarx::navigation::core::GlobalTrajectoryPoint::waypoint
Waypoint waypoint
Definition: Trajectory.h:39
basic_types.h
DateTime.h
armarx::navigation::core::GlobalTrajectoryPoint::velocity
float velocity
Definition: Trajectory.h:40
armarx::navigation::core::Projection::Segment::FIRST
@ FIRST
armarx::navigation::core::Projection::Segment
Segment
Definition: Trajectory.h:52
armarx::navigation::core::LocalTrajectoryPoint::timestamp
DateTime timestamp
Definition: Trajectory.h:177
armarx::navigation::core
This file is part of ArmarX.
Definition: aron_conversions.cpp:19
armarx::navigation::core::LocalTrajectoryPoints
std::vector< LocalTrajectoryPoint > LocalTrajectoryPoints
Definition: Trajectory.h:181
armarx::navigation::core::GlobalTrajectory::GlobalTrajectory
GlobalTrajectory()=default
armarx::navigation::core::GlobalTrajectoryPoints
std::vector< GlobalTrajectoryPoint > GlobalTrajectoryPoints
Definition: Trajectory.h:43
armarx::navigation::core::Projection::wayPointBefore
GlobalTrajectoryPoint wayPointBefore
Definition: Trajectory.h:49
armarx::navigation::core::GlobalTrajectoryPtr
std::shared_ptr< class GlobalTrajectory > GlobalTrajectoryPtr
Definition: Trajectory.h:68
armarx::navigation::core::Projection::Segment::FINAL
@ FINAL
armarx::navigation::core::GlobalTrajectoryPoint
Definition: Trajectory.h:37
armarx::navigation::core::LocalTrajectory::points
const std::vector< LocalTrajectoryPoint > & points() const
Definition: Trajectory.cpp:895
armarx::navigation::core::GlobalTrajectory::setMaxVelocity
void setMaxVelocity(float maxVelocity)
Definition: Trajectory.cpp:761
armarx::navigation::core::Twist
Definition: basic_types.h:53
armarx::navigation::core::LocalTrajectoryPoint
Definition: Trajectory.h:175
armarx::navigation::core::Evaluation::feedforwardTwist
core::Twist feedforwardTwist
Definition: Trajectory.h:186
armarx::navigation::core::GlobalTrajectory::getSubTrajectory
std::pair< GlobalTrajectory, bool > getSubTrajectory(const Position &point, const float distance) const
Project point onto the trajectory and return a new trajectory along the old one from that point for t...
Definition: Trajectory.cpp:289
armarx::navigation::core::Projection::projection
GlobalTrajectoryPoint projection
Definition: Trajectory.h:47
armarx::navigation::core::GlobalTrajectory::length
float length() const
Definition: Trajectory.cpp:740
armarx::navigation::core::Waypoint
Definition: basic_types.h:48
armarx::navigation::core::GlobalTrajectory::FromPath
static GlobalTrajectory FromPath(const Path &path, float velocity)
Note: the velocity will not be set!
Definition: Trajectory.cpp:417
timestamp
std::string timestamp()
Definition: CartographerAdapter.cpp:85
armarx::navigation::core::LocalTrajectory
Definition: Trajectory.h:189
armarx::navigation::core::GlobalTrajectory::getRemainingDuration
float getRemainingDuration(const Position &point, float linearVelocity=400, float angularVelocity=0.5) const
Project point onto the trajectory and evaluate the remaining duration from there on.
Definition: Trajectory.cpp:354
armarx::navigation::core::GlobalTrajectory::poses
std::vector< Pose > poses() const noexcept
Definition: Trajectory.cpp:402
armarx::navigation::core::LocalTrajectoryPoint::pose
core::Pose pose
Definition: Trajectory.h:178
armarx::navigation::core::LocalTrajectory::LocalTrajectory
LocalTrajectory()=default
armarx::core::time::DateTime
Represents a point in time.
Definition: DateTime.h:24
armarx::navigation::core::GlobalTrajectory::duration
float duration(core::VelocityInterpolation interpolation) const
Definition: Trajectory.cpp:802
armarx::navigation::core::Positions
std::vector< Position > Positions
Definition: basic_types.h:37
armarx::navigation::core::Evaluation::pose
core::Pose pose
Definition: Trajectory.h:185
std
Definition: Application.h:66
armarx::navigation::core::Path
std::vector< Pose > Path
Definition: basic_types.h:46
armarx::navigation::core::LocalTrajectory::evaluate
Evaluation evaluate(const DateTime &timestamp) const
Definition: Trajectory.cpp:907
armarx::navigation::core::GlobalTrajectory::positions
std::vector< Position > positions() const noexcept
Definition: Trajectory.cpp:388
armarx::navigation::core::GlobalTrajectory::allConnectedPointsInRange
Indices allConnectedPointsInRange(std::size_t idx, float radius) const
get all points within a certain radius that are directly connected to idx
Definition: Trajectory.cpp:846
distance
double distance(const Point &a, const Point &b)
Definition: point.hpp:95
armarx::navigation::core::GlobalTrajectory::getProjection
Projection getProjection(const Position &point, const VelocityInterpolation &velocityInterpolation) const
Definition: Trajectory.cpp:245
armarx::navigation::core::Position
Eigen::Vector3f Position
Definition: basic_types.h:36
armarx::navigation::core::Evaluation
Definition: Trajectory.h:183
armarx::navigation::core::GlobalTrajectory::hasMaxDistanceBetweenWaypoints
bool hasMaxDistanceBetweenWaypoints(float maxDistance) const
Definition: Trajectory.cpp:772
armarx::navigation::core::Projection::segment
Segment segment
Definition: Trajectory.h:59
armarx::navigation::core::GlobalTrajectory::points
const std::vector< GlobalTrajectoryPoint > & points() const
Definition: Trajectory.cpp:790
armarx::navigation::core::GlobalTrajectory::resample
GlobalTrajectory resample(float eps) const
Definition: Trajectory.cpp:639
armarx::navigation::core::LocalTrajectory::LocalTrajectory
LocalTrajectory(const std::vector< LocalTrajectoryPoint > &points)
Definition: Trajectory.h:194
armarx::navigation::core::GlobalTrajectory::getRemainingDistance
float getRemainingDistance(const Position &point) const
Project point onto the trajectory and evaluate the remaining distance from there on.
Definition: Trajectory.cpp:332
armarx::navigation::core::VelocityInterpolation::LastWaypoint
@ LastWaypoint