@@ -56,6 +56,13 @@ message ReferenceLine
5656 // Together, these rules allow directly putting OpenDRIVE S coordinates
5757 // into an OSI ReferenceLine.
5858 //
59+ // If the reference line approximates a curve (e.g. a clothoid in
60+ // OpenDRIVE), the points must be chosen in a way that the lateral distance
61+ // to the ideal line does not exceed 5cm. As shown in the following image:
62+ //
63+ // \image html line_approximation_error.svg "Approximation error"
64+ // Approximation error green line.
65+ //
5966 // Between two ReferenceLinePoints, both the world coordinate and the S
6067 // coordinate is interpolated linearly. So each S value uniquely describes
6168 // a point on the polyline.
@@ -106,7 +113,8 @@ message ReferenceLine
106113 // coordinate is no longer calculated in the XY plane (as proposed for
107114 // OSI). It doesn't seem feasable to implement the same tilting for OSI,
108115 // so simulation tools will have to consider superElevation and convert
109- // the T coordinate accordingly.
116+ // the T coordinate accordingly: t_OSI = t_OpenDRIVE * cos(alpha), where
117+ // alpha is the superelevation angle.
110118 // - The angle will not be perfectly the same, due to the use of line
111119 // segments in OSI, and curves in OpenDRIVE. In the authors opinion, the
112120 // difference will be negligible if the poly_line is suitably sampled.
@@ -120,9 +128,6 @@ message ReferenceLine
120128 // for lanes without superelevation, and to make it easier to convert
121129 // between OSI and OpenDRIVE in case superelevation is present.
122130 //
123- // TODO Describe needed precision.
124- // TODO Describe how large angles between line segments are allowed to be.
125- //
126131 repeated ReferenceLinePoint poly_line = 2 ;
127132
128133 // A point on the reference line
@@ -186,6 +191,21 @@ message LogicalLaneBoundary
186191 // At the place where the boundary suddenly increases, two points will have
187192 // the same S coordinate.
188193 //
194+ // If the boundary approximates a curve (e.g. a cubic function in
195+ // OpenDRIVE), the points must be chosen in a way that the lateral distance
196+ // to the ideal line does not exceed 5cm. As shown in the following image:
197+ //
198+ // \image html line_approximation_error.svg "Approximation error"
199+ // Approximation error green line.
200+ //
201+ // The Z error (difference in Z height between boundary_line and the "real"
202+ // line) must also not exceed 5cm.
203+ //
204+ // Note: if two lanes have different Z heights (e.g. a driving lane is
205+ // beside a sidewalk, where the sidewalk is 10cm higher than the road),
206+ // then these lanes cannot share a boundary, since their boundaries have
207+ // different Z heights.
208+ //
189209 repeated LogicalBoundaryPoint boundary_line = 2 ;
190210
191211 // The reference line for this boundary.
@@ -366,18 +386,21 @@ message LogicalLane
366386 // Lanes that are directly right of this lane, without gap or overlap.
367387 // "Right" is in definition direction (not driving direction), so right lanes
368388 // have smaller T coordinates.
389+ // Entries must be ordered: first by start_s, then by end_s.
369390 //
370391 repeated LaneRelation right_adjacent_lane = 9 ;
371392
372393 // Lanes that are directly left of this lane, without gap or overlap.
373394 // "Left" is in definition direction (not driving direction), so left lanes
374395 // have larger T coordinates.
396+ // Entries must be ordered: first by start_s, then by end_s.
375397 //
376398 repeated LaneRelation left_adjacent_lane = 10 ;
377399
378400 // Lanes that partially or completely overlap this lane. Only overlaps
379401 // laterally larger than 5cm are considered overlaps for the purpose of
380402 // this relation.
403+ // Entries must be ordered: first by start_s, then by end_s.
381404 //
382405 repeated LaneRelation overlapping_lane = 11 ;
383406
@@ -386,7 +409,11 @@ message LogicalLane
386409 // All LogicalLaneBoundary elements referenced here must refer to the same
387410 // ReferenceLine as this lane.
388411 // The boundaries together must cover the whole length of the lane (the
389- // range [start_s,end_s]) without gap or overlap.
412+ // range [start_s,end_s]) without gap or overlap. The boundaries must be
413+ // stored in ascending order, starting with the smallest S position.
414+ // Consecutive boundaries must share a point: the last point of the
415+ // previous boundary must be identical to the first point of the next
416+ // boundary.
390417 //
391418 // TODO Is it allowed for the boundaries to be longer than the lane?
392419 // Theoretically, this could be done. Then the user would have to limit the
@@ -399,7 +426,11 @@ message LogicalLane
399426 // All LogicalLaneBoundary elements referenced here must refer to the same
400427 // ReferenceLine as this lane.
401428 // The boundaries together must cover the whole length of the lane (the
402- // range [start_s,end_s]) without gap or overlap.
429+ // range [start_s,end_s]) without gap or overlap. The boundaries must be
430+ // stored in ascending order, starting with the smallest S position.
431+ // Consecutive boundaries must share a point: the last point of the
432+ // previous boundary must be identical to the first point of the next
433+ // boundary.
403434 //
404435 // TODO Is it allowed for the boundaries to be longer than the lane?
405436 // Theoretically, this could be done. Then the user would have to limit the
0 commit comments