CARLA
 
载入中...
搜索中...
未找到
Geometry.h
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
7#pragma once
8
10#include "carla/geom/Math.h"
12#include "carla/geom/Rtree.h"
13
14namespace carla {
15namespace road {
16namespace element {
17
18 enum class GeometryType : unsigned int {
19 LINE,
20 ARC,
21 SPIRAL,
22 POLY3,
24 };
25
27
29 : location(0, 0, 0),
30 tangent(0) {}
31 DirectedPoint(const geom::Location &l, double t)
32 : location(l),
33 tangent(t) {}
34 DirectedPoint(float x, float y, float z, double t)
35 : location(x, y, z),
36 tangent(t) {}
37
38 geom::Location location = {0.0f, 0.0f, 0.0f};
39 double tangent = 0.0; // [radians]
40 double pitch = 0.0; // [radians]
41
42 void ApplyLateralOffset(float lateral_offset);
43
44 friend bool operator==(const DirectedPoint &lhs, const DirectedPoint &rhs) {
45 return (lhs.location == rhs.location) && (lhs.tangent == rhs.tangent);
46 }
47 };
48
49 class Geometry {
50 public:
51
53 return _type;
54 }
55 double GetLength() const {
56 return _length;
57 }
58 double GetStartOffset() const {
60 }
61 double GetHeading() const {
62 return _heading;
63 }
64
68
69 virtual ~Geometry() = default;
70
71 virtual DirectedPoint PosFromDist(double dist) const = 0;
72
73 virtual std::pair<float, float> DistanceTo(const geom::Location &p) const = 0;
74
75 protected:
76
78 GeometryType type,
79 double start_offset,
80 double length,
81 double heading,
82 const geom::Location &start_pos)
83 : _type(type),
84 _length(length),
85 _start_position_offset(start_offset),
86 _heading(heading),
87 _start_position(start_pos) {}
88
89 protected:
90
91 GeometryType _type; // geometry type
92 double _length; // length of the road section [meters]
93
94 double _start_position_offset; // s-offset [meters]
95 double _heading; // start orientation [radians]
96
98 };
99
100 class GeometryLine final : public Geometry {
101 public:
102
104 double start_offset,
105 double length,
106 double heading,
107 const geom::Location &start_pos)
108 : Geometry(GeometryType::LINE, start_offset, length, heading, start_pos) {}
109
110 DirectedPoint PosFromDist(double dist) const override;
111
112 /// Returns a pair containing:
113 /// - @b first: distance to the nearest point in this line from the
114 /// beginning of the shape.
115 /// - @b second: Euclidean distance from the nearest point in this line to
116 /// p.
117 /// @param p point to calculate the distance
118 std::pair<float, float> DistanceTo(const geom::Location &p) const override {
120 p,
122 PosFromDist(_length).location);
123 }
124
125 };
126
127 class GeometryArc final : public Geometry {
128 public:
129
131 double start_offset,
132 double length,
133 double heading,
134 const geom::Location &start_pos,
135 double curv)
136 : Geometry(GeometryType::ARC, start_offset, length, heading, start_pos),
137 _curvature(curv) {}
138
139 DirectedPoint PosFromDist(double dist) const override;
140
141 /// Returns a pair containing:
142 /// - @b first: distance to the nearest point in this arc from the
143 /// beginning of the shape.
144 /// - @b second: Euclidean distance from the nearest point in this arc to p.
145 /// @param p point to calculate the distance
146 std::pair<float, float> DistanceTo(const geom::Location &p) const override {
148 p,
150 static_cast<float>(_length),
151 static_cast<float>(_heading),
152 static_cast<float>(_curvature));
153 }
154
155 double GetCurvature() const {
156 return _curvature;
157 }
158
159 private:
160
162 };
163
164 class GeometrySpiral final : public Geometry {
165 public:
166
168 double start_offset,
169 double length,
170 double heading,
171 const geom::Location &start_pos,
172 double curv_s,
173 double curv_e)
174 : Geometry(GeometryType::SPIRAL, start_offset, length, heading, start_pos),
175 _curve_start(curv_s),
176 _curve_end(curv_e) {}
177
178 double GetCurveStart() {
179 return _curve_start;
180 }
181
182 double GetCurveEnd() {
183 return _curve_end;
184 }
185
186 DirectedPoint PosFromDist(double dist) const override;
187
188 std::pair<float, float> DistanceTo(const geom::Location &) const override;
189
190 private:
191
194 };
195
196 class GeometryPoly3 final : public Geometry {
197 public:
198
200 double start_offset,
201 double length,
202 double heading,
203 const geom::Location &start_pos,
204 double a,
205 double b,
206 double c,
207 double d)
208 : Geometry(GeometryType::POLY3, start_offset, length, heading, start_pos),
209 _a(a),
210 _b(b),
211 _c(c),
212 _d(d) {
213 _poly.Set(a, b, c, d);
215 }
216
217 double Geta() const {
218 return _a;
219 }
220 double Getb() const {
221 return _b;
222 }
223 double Getc() const {
224 return _c;
225 }
226 double Getd() const {
227 return _d;
228 }
229
230 DirectedPoint PosFromDist(double dist) const override;
231
232 std::pair<float, float> DistanceTo(const geom::Location &) const override;
233
234 private:
235
237
238 double _a;
239 double _b;
240 double _c;
241 double _d;
242
243 struct RtreeValue {
244 double u = 0;
245 double v = 0;
246 double s = 0;
247 double t = 0;
248 };
252 void PreComputeSpline();
253 };
254
255 class GeometryParamPoly3 final : public Geometry {
256 public:
257
259 double start_offset,
260 double length,
261 double heading,
262 const geom::Location &start_pos,
263 double aU,
264 double bU,
265 double cU,
266 double dU,
267 double aV,
268 double bV,
269 double cV,
270 double dV,
271 bool arcLength)
272 : Geometry(GeometryType::POLY3PARAM, start_offset, length, heading, start_pos),
273 _aU(aU),
274 _bU(bU),
275 _cU(cU),
276 _dU(dU),
277 _aV(aV),
278 _bV(bV),
279 _cV(cV),
280 _dV(dV),
281 _arcLength(arcLength) {
282 _polyU.Set(aU, bU, cU, dU);
283 _polyV.Set(aV, bV, cV, dV);
285 }
286
287 double GetaU() const {
288 return _aU;
289 }
290 double GetbU() const {
291 return _bU;
292 }
293 double GetcU() const {
294 return _cU;
295 }
296 double GetdU() const {
297 return _dU;
298 }
299 double GetaV() const {
300 return _aV;
301 }
302 double GetbV() const {
303 return _bV;
304 }
305 double GetcV() const {
306 return _cV;
307 }
308 double GetdV() const {
309 return _dV;
310 }
311
312 DirectedPoint PosFromDist(double dist) const override;
313
314 std::pair<float, float> DistanceTo(const geom::Location &) const override;
315
316 private:
317
320 double _aU;
321 double _bU;
322 double _cU;
323 double _dU;
324 double _aV;
325 double _bV;
326 double _cV;
327 double _dV;
329
330 struct RtreeValue {
331 double u = 0;
332 double v = 0;
333 double s = 0;
334 double t_u = 0;
335 double t_v = 0;
336 };
340 void PreComputeSpline();
341 };
342
343} // namespace element
344} // namespace road
345} // namespace carla
Describes a Cubic Polynomial so: f(x) = a + bx + cx^2 + dx^3
void Set(const value_type &a, const value_type &b, const value_type &c, const value_type &d, const value_type &s)
static std::pair< float, float > DistanceSegmentToPoint(const Vector3D &p, const Vector3D &v, const Vector3D &w)
Returns a pair containing:
Definition Math.cpp:18
static std::pair< float, float > DistanceArcToPoint(Vector3D p, Vector3D start_pos, float length, float heading, float curvature)
Returns a pair containing:
Definition Math.cpp:33
std::pair< BSegment, std::pair< RtreeValue, RtreeValue > > TreeElement
Definition Rtree.h:91
std::pair< float, float > DistanceTo(const geom::Location &p) const override
Returns a pair containing:
Definition Geometry.h:146
DirectedPoint PosFromDist(double dist) const override
Definition Geometry.cpp:45
GeometryArc(double start_offset, double length, double heading, const geom::Location &start_pos, double curv)
Definition Geometry.h:130
GeometryLine(double start_offset, double length, double heading, const geom::Location &start_pos)
Definition Geometry.h:103
DirectedPoint PosFromDist(double dist) const override
Definition Geometry.cpp:36
std::pair< float, float > DistanceTo(const geom::Location &p) const override
Returns a pair containing:
Definition Geometry.h:118
DirectedPoint PosFromDist(double dist) const override
Definition Geometry.cpp:166
std::pair< float, float > DistanceTo(const geom::Location &) const override
Definition Geometry.cpp:185
GeometryParamPoly3(double start_offset, double length, double heading, const geom::Location &start_pos, double aU, double bU, double cU, double dU, double aV, double bV, double cV, double dV, bool arcLength)
Definition Geometry.h:258
geom::CubicPolynomial _poly
Definition Geometry.h:236
std::pair< float, float > DistanceTo(const geom::Location &) const override
Definition Geometry.cpp:128
GeometryPoly3(double start_offset, double length, double heading, const geom::Location &start_pos, double a, double b, double c, double d)
Definition Geometry.h:199
DirectedPoint PosFromDist(double dist) const override
Definition Geometry.cpp:109
std::pair< float, float > DistanceTo(const geom::Location &) const override
Definition Geometry.cpp:103
DirectedPoint PosFromDist(double dist) const override
Definition Geometry.cpp:69
GeometrySpiral(double start_offset, double length, double heading, const geom::Location &start_pos, double curv_s, double curv_e)
Definition Geometry.h:167
Geometry(GeometryType type, double start_offset, double length, double heading, const geom::Location &start_pos)
Definition Geometry.h:77
geom::Location _start_position
Definition Geometry.h:97
double GetStartOffset() const
Definition Geometry.h:58
virtual DirectedPoint PosFromDist(double dist) const =0
virtual std::pair< float, float > DistanceTo(const geom::Location &p) const =0
GeometryType GetType() const
Definition Geometry.h:52
const geom::Location & GetStartPosition()
Definition Geometry.h:65
This file contains definitions of common data structures used in traffic manager.
Definition Carla.cpp:133
void ApplyLateralOffset(float lateral_offset)
Definition Geometry.cpp:28
DirectedPoint(const geom::Location &l, double t)
Definition Geometry.h:31
DirectedPoint(float x, float y, float z, double t)
Definition Geometry.h:34
friend bool operator==(const DirectedPoint &lhs, const DirectedPoint &rhs)
Definition Geometry.h:44