Branch data Line data Source code
1 : : // ----------------- BEGIN LICENSE BLOCK ---------------------------------
2 : : //
3 : : // Copyright (C) 2018-2021 Intel Corporation
4 : : //
5 : : // SPDX-License-Identifier: LGPL-2.1-only
6 : : //
7 : : // ----------------- END LICENSE BLOCK -----------------------------------
8 : :
9 : : #include "TestSupport.hpp"
10 : : #include "ad/rss/core/RssSituationExtraction.hpp"
11 : :
12 : : namespace ad {
13 : : namespace rss {
14 : : namespace core {
15 : :
16 : : class RssSituationExtractionIntersectionTests : public testing::Test
17 : : {
18 : : protected:
19 : 4 : virtual void SetUp()
20 : : {
21 : 4 : worldModel.defaultEgoVehicleRssDynamics = getEgoRssDynamics();
22 : 4 : leadingObject = createObject(36., 0.);
23 : 4 : leadingObject.objectId = 0;
24 : 4 : scene.situationType = situation::SituationType::IntersectionEgoHasPriority;
25 : 4 : scene.objectRssDynamics = getObjectRssDynamics();
26 : 4 : scene.egoVehicleRssDynamics = getEgoRssDynamics();
27 : :
28 : : {
29 : 4 : world::OccupiedRegion occupiedRegion;
30 : 4 : occupiedRegion.lonRange.minimum = ParametricValue(0.8);
31 : 4 : occupiedRegion.lonRange.maximum = ParametricValue(1.0);
32 : 4 : occupiedRegion.segmentId = 1.;
33 : 4 : occupiedRegion.latRange.minimum = ParametricValue(0.2);
34 : 4 : occupiedRegion.latRange.maximum = ParametricValue(0.4);
35 : :
36 [ + - ]: 4 : leadingObject.occupiedRegions.push_back(occupiedRegion);
37 : : }
38 : :
39 : 4 : followingObject = createObject(36., 0.);
40 : 4 : followingObject.objectId = 1;
41 : : {
42 : 4 : world::OccupiedRegion occupiedRegion;
43 : 4 : occupiedRegion.lonRange.minimum = ParametricValue(0.1);
44 : 4 : occupiedRegion.lonRange.maximum = ParametricValue(0.2);
45 : 4 : occupiedRegion.segmentId = 1.;
46 : 4 : occupiedRegion.latRange.minimum = ParametricValue(0.6);
47 : 4 : occupiedRegion.latRange.maximum = ParametricValue(0.8);
48 [ + - ]: 4 : followingObject.occupiedRegions.push_back(occupiedRegion);
49 : : }
50 : 4 : }
51 : :
52 : 4 : virtual void TearDown()
53 : : {
54 : 4 : followingObject.occupiedRegions.clear();
55 : 4 : leadingObject.occupiedRegions.clear();
56 : 4 : scene.egoVehicleRoad.clear();
57 : 4 : }
58 : :
59 : 3 : world::RoadArea longitudinalNoDifferenceRoadArea()
60 : : {
61 : 3 : world::RoadArea roadArea;
62 : : {
63 : 6 : world::RoadSegment roadSegment;
64 : 3 : world::LaneSegment laneSegment;
65 : :
66 : 3 : laneSegment.id = 1;
67 : 3 : laneSegment.length.minimum = Distance(10);
68 : 3 : laneSegment.length.maximum = Distance(10);
69 : :
70 : 3 : laneSegment.width.minimum = Distance(5);
71 : 3 : laneSegment.width.maximum = Distance(5);
72 : 3 : laneSegment.type = world::LaneSegmentType::Normal;
73 : :
74 [ + - ]: 3 : roadSegment.push_back(laneSegment);
75 [ + - ]: 3 : roadArea.push_back(roadSegment);
76 : : }
77 : :
78 : : {
79 : 6 : world::RoadSegment roadSegment;
80 : 3 : world::LaneSegment laneSegment;
81 : :
82 : 3 : laneSegment.id = 2;
83 : 3 : laneSegment.length.minimum = Distance(5);
84 : 3 : laneSegment.length.maximum = Distance(5);
85 : :
86 : 3 : laneSegment.width.minimum = Distance(5);
87 : 3 : laneSegment.width.maximum = Distance(5);
88 : 3 : laneSegment.type = world::LaneSegmentType::Intersection;
89 : :
90 [ + - ]: 3 : roadSegment.push_back(laneSegment);
91 : :
92 [ + - ]: 3 : roadArea.push_back(roadSegment);
93 : : }
94 : 3 : return roadArea;
95 : : }
96 : :
97 : 3 : world::RoadArea longitudinalDifferenceRoadArea()
98 : : {
99 : 3 : world::RoadArea roadArea;
100 : : {
101 : 6 : world::RoadSegment roadSegment;
102 : 3 : world::LaneSegment laneSegment;
103 : :
104 : 3 : laneSegment.id = 1;
105 : 3 : laneSegment.length.minimum = Distance(8);
106 : 3 : laneSegment.length.maximum = Distance(10);
107 : :
108 : 3 : laneSegment.width.minimum = Distance(5);
109 : 3 : laneSegment.width.maximum = Distance(5);
110 : 3 : laneSegment.type = world::LaneSegmentType::Normal;
111 : :
112 [ + - ]: 3 : roadSegment.push_back(laneSegment);
113 [ + - ]: 3 : roadArea.push_back(roadSegment);
114 : : }
115 : :
116 : : {
117 : 6 : world::RoadSegment roadSegment;
118 : 3 : world::LaneSegment laneSegment;
119 : :
120 : 3 : laneSegment.id = 2;
121 : 3 : laneSegment.length.minimum = Distance(4);
122 : 3 : laneSegment.length.maximum = Distance(5);
123 : :
124 : 3 : laneSegment.width.minimum = Distance(5);
125 : 3 : laneSegment.width.maximum = Distance(5);
126 : 3 : laneSegment.type = world::LaneSegmentType::Intersection;
127 : :
128 [ + - ]: 3 : roadSegment.push_back(laneSegment);
129 : :
130 [ + - ]: 3 : roadArea.push_back(roadSegment);
131 : : }
132 : 3 : return roadArea;
133 : : }
134 : :
135 : : world::Object followingObject;
136 : : world::Object leadingObject;
137 : : world::WorldModel worldModel;
138 : : world::Scene scene;
139 : : RssSituationExtraction situationExtraction;
140 : : };
141 : :
142 : 2 : TEST_F(RssSituationExtractionIntersectionTests, noLongitudinalDifference)
143 : : {
144 : 1 : situation::SituationSnapshot situationSnapshot;
145 : :
146 [ + - ]: 1 : scene.egoVehicle = objectAsEgo(leadingObject);
147 [ + - ]: 1 : scene.object = followingObject;
148 : :
149 [ + - ]: 1 : scene.egoVehicleRoad = longitudinalNoDifferenceRoadArea();
150 [ + - ]: 1 : scene.intersectingRoad = scene.egoVehicleRoad;
151 : :
152 [ + - ]: 1 : worldModel.scenes.push_back(scene);
153 : 1 : worldModel.timeIndex = 1;
154 : :
155 [ + - - + : 1 : ASSERT_TRUE(situationExtraction.extractSituations(worldModel, situationSnapshot));
- - - - -
- - - ]
156 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.timeIndex, worldModel.timeIndex);
- - - - -
- ]
157 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations.size(), 1u);
- - - - -
- ]
158 : :
159 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].relativePosition.longitudinalDistance, Distance(6.));
- - - - -
- ]
160 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.velocity.speedLon.maximum, Speed(10.));
- - - - -
- ]
161 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.velocity.speedLon.minimum, Speed(10.));
- - - - -
- ]
162 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.dynamics.alphaLon.accelMax,
- - - - -
- ]
163 : : scene.egoVehicleRssDynamics.alphaLon.accelMax);
164 : :
165 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.distanceToEnterIntersection, Distance(0));
- - - - -
- ]
166 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.distanceToLeaveIntersection, Distance(7));
- - - - -
- ]
167 [ - + - - : 1 : ASSERT_TRUE(situationSnapshot.situations[0].egoVehicleState.hasPriority);
- - - - -
- ]
168 : :
169 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].otherVehicleState.distanceToEnterIntersection, Distance(8));
- - - - -
- ]
170 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].otherVehicleState.distanceToLeaveIntersection, Distance(14));
- - - - -
- ]
171 [ - + - - : 1 : ASSERT_FALSE(situationSnapshot.situations[0].otherVehicleState.hasPriority);
- - - - -
- ]
172 : :
173 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].relativePosition.longitudinalPosition,
- - - - -
- ]
174 : : situation::LongitudinalRelativePosition::InFront);
175 : :
176 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].relativePosition.lateralPosition,
- - - - -
- ]
177 : : situation::LateralRelativePosition::Overlap);
178 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].relativePosition.lateralDistance, Distance(0));
- - - - -
- ]
179 : : }
180 : :
181 : 2 : TEST_F(RssSituationExtractionIntersectionTests, longitudinalDifference)
182 : : {
183 : 1 : situation::SituationSnapshot situationSnapshot;
184 : :
185 [ + - ]: 1 : scene.egoVehicle = objectAsEgo(leadingObject);
186 [ + - ]: 1 : scene.object = followingObject;
187 : :
188 [ + - ]: 1 : scene.egoVehicleRoad = longitudinalDifferenceRoadArea();
189 [ + - ]: 1 : scene.intersectingRoad = scene.egoVehicleRoad;
190 : :
191 [ + - ]: 1 : worldModel.scenes.push_back(scene);
192 : 1 : worldModel.timeIndex = 1;
193 : :
194 [ + - - + : 1 : ASSERT_TRUE(situationExtraction.extractSituations(worldModel, situationSnapshot));
- - - - -
- - - ]
195 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.timeIndex, worldModel.timeIndex);
- - - - -
- ]
196 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations.size(), 1u);
- - - - -
- ]
197 : :
198 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.velocity.speedLon.maximum, Speed(10.));
- - - - -
- ]
199 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.velocity.speedLon.minimum, Speed(10.));
- - - - -
- ]
200 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.dynamics.alphaLon.accelMax,
- - - - -
- ]
201 : : scene.egoVehicleRssDynamics.alphaLon.accelMax);
202 : :
203 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.distanceToEnterIntersection, Distance(0.));
- - - - -
- ]
204 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.distanceToLeaveIntersection, Distance(8.6));
- - - - -
- ]
205 [ - + - - : 1 : ASSERT_TRUE(situationSnapshot.situations[0].egoVehicleState.hasPriority);
- - - - -
- ]
206 : :
207 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].otherVehicleState.distanceToEnterIntersection, Distance(6.));
- - - - -
- ]
208 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].otherVehicleState.distanceToLeaveIntersection, Distance(14.2));
- - - - -
- ]
209 [ - + - - : 1 : ASSERT_FALSE(situationSnapshot.situations[0].otherVehicleState.hasPriority);
- - - - -
- ]
210 : :
211 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].relativePosition.longitudinalPosition,
- - - - -
- ]
212 : : situation::LongitudinalRelativePosition::InFront);
213 : :
214 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].relativePosition.lateralPosition,
- - - - -
- ]
215 : : situation::LateralRelativePosition::Overlap);
216 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].relativePosition.lateralDistance, Distance(0));
- - - - -
- ]
217 : : }
218 : :
219 : 2 : TEST_F(RssSituationExtractionIntersectionTests, mergeWorstCaseInFront)
220 : : {
221 : 1 : situation::SituationSnapshot situationSnapshot;
222 : :
223 [ + - ]: 1 : scene.egoVehicle = objectAsEgo(leadingObject);
224 [ + - ]: 1 : scene.object = followingObject;
225 : :
226 [ + - ]: 1 : scene.egoVehicleRoad = longitudinalDifferenceRoadArea();
227 [ + - ]: 1 : scene.intersectingRoad = scene.egoVehicleRoad;
228 [ + - ]: 1 : worldModel.scenes.push_back(scene);
229 : :
230 [ + - ]: 1 : scene.egoVehicleRoad = longitudinalNoDifferenceRoadArea();
231 [ + - ]: 1 : scene.intersectingRoad = scene.egoVehicleRoad;
232 [ + - ]: 1 : worldModel.scenes.push_back(scene);
233 : :
234 : 1 : scene.object.velocity.speedLonMin = Speed(9.0);
235 : 1 : scene.object.velocity.speedLonMax = Speed(9.0);
236 : 1 : scene.object.velocity.speedLatMin = Speed(-1.);
237 : 1 : scene.object.velocity.speedLatMax = Speed(-1.);
238 : :
239 [ + - ]: 1 : worldModel.scenes.push_back(scene);
240 : 1 : worldModel.timeIndex = 1;
241 : :
242 [ + - - + : 1 : ASSERT_TRUE(situationExtraction.extractSituations(worldModel, situationSnapshot));
- - - - -
- - - ]
243 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.timeIndex, worldModel.timeIndex);
- - - - -
- ]
244 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations.size(), 1u);
- - - - -
- ]
245 : :
246 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.dynamics.alphaLon.accelMax,
- - - - -
- ]
247 : : scene.egoVehicleRssDynamics.alphaLon.accelMax);
248 : :
249 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.distanceToEnterIntersection, Distance(0.));
- - - - -
- ]
250 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.distanceToLeaveIntersection, Distance(8.6));
- - - - -
- ]
251 [ - + - - : 1 : ASSERT_TRUE(situationSnapshot.situations[0].egoVehicleState.hasPriority);
- - - - -
- ]
252 : :
253 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].otherVehicleState.velocity.speedLon.minimum, Speed(9.));
- - - - -
- ]
254 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].otherVehicleState.velocity.speedLon.maximum, Speed(10.));
- - - - -
- ]
255 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].otherVehicleState.velocity.speedLat.minimum, Speed(-1.));
- - - - -
- ]
256 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].otherVehicleState.velocity.speedLat.maximum, Speed(0.));
- - - - -
- ]
257 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].otherVehicleState.distanceToEnterIntersection, Distance(6.));
- - - - -
- ]
258 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].otherVehicleState.distanceToLeaveIntersection, Distance(14.2));
- - - - -
- ]
259 [ - + - - : 1 : ASSERT_FALSE(situationSnapshot.situations[0].otherVehicleState.hasPriority);
- - - - -
- ]
260 : :
261 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].relativePosition.longitudinalPosition,
- - - - -
- ]
262 : : situation::LongitudinalRelativePosition::InFront);
263 : :
264 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].relativePosition.lateralPosition,
- - - - -
- ]
265 : : situation::LateralRelativePosition::Overlap);
266 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].relativePosition.lateralDistance, Distance(0));
- - - - -
- ]
267 : : }
268 : :
269 : 2 : TEST_F(RssSituationExtractionIntersectionTests, mergeWorstCaseAtBack)
270 : : {
271 : 1 : situation::SituationSnapshot situationSnapshot;
272 : :
273 [ + - ]: 1 : scene.egoVehicle = objectAsEgo(followingObject);
274 [ + - ]: 1 : scene.object = leadingObject;
275 : :
276 [ + - ]: 1 : scene.egoVehicleRoad = longitudinalDifferenceRoadArea();
277 [ + - ]: 1 : scene.intersectingRoad = scene.egoVehicleRoad;
278 [ + - ]: 1 : worldModel.scenes.push_back(scene);
279 : :
280 [ + - ]: 1 : scene.egoVehicleRoad = longitudinalNoDifferenceRoadArea();
281 [ + - ]: 1 : scene.intersectingRoad = scene.egoVehicleRoad;
282 [ + - ]: 1 : worldModel.scenes.push_back(scene);
283 : :
284 : 1 : scene.egoVehicle.velocity.speedLonMin = Speed(8.0);
285 : 1 : scene.egoVehicle.velocity.speedLonMax = Speed(9.0);
286 : 1 : scene.egoVehicle.velocity.speedLatMin = Speed(-1.);
287 : 1 : scene.egoVehicle.velocity.speedLatMax = Speed(-0.5);
288 [ + - ]: 1 : worldModel.scenes.push_back(scene);
289 : 1 : worldModel.timeIndex = 1;
290 : :
291 [ + - - + : 1 : ASSERT_TRUE(situationExtraction.extractSituations(worldModel, situationSnapshot));
- - - - -
- - - ]
292 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.timeIndex, worldModel.timeIndex);
- - - - -
- ]
293 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations.size(), 1u);
- - - - -
- ]
294 : :
295 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.velocity.speedLon.minimum, Speed(8.));
- - - - -
- ]
296 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.velocity.speedLon.maximum, Speed(10.));
- - - - -
- ]
297 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.velocity.speedLat.minimum, Speed(-1.));
- - - - -
- ]
298 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.velocity.speedLat.maximum, Speed(0.));
- - - - -
- ]
299 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.dynamics.alphaLon.accelMax,
- - - - -
- ]
300 : : scene.egoVehicleRssDynamics.alphaLon.accelMax);
301 : :
302 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.distanceToEnterIntersection, Distance(6.));
- - - - -
- ]
303 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].egoVehicleState.distanceToLeaveIntersection, Distance(14.2));
- - - - -
- ]
304 [ - + - - : 1 : ASSERT_TRUE(situationSnapshot.situations[0].egoVehicleState.hasPriority);
- - - - -
- ]
305 : :
306 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].otherVehicleState.distanceToEnterIntersection, Distance(0.));
- - - - -
- ]
307 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].otherVehicleState.distanceToLeaveIntersection, Distance(8.6));
- - - - -
- ]
308 [ - + - - : 1 : ASSERT_FALSE(situationSnapshot.situations[0].otherVehicleState.hasPriority);
- - - - -
- ]
309 : :
310 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].relativePosition.longitudinalPosition,
- - - - -
- ]
311 : : situation::LongitudinalRelativePosition::AtBack);
312 : :
313 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].relativePosition.lateralPosition,
- - - - -
- ]
314 : : situation::LateralRelativePosition::Overlap);
315 [ + - - + : 1 : ASSERT_EQ(situationSnapshot.situations[0].relativePosition.lateralDistance, Distance(0));
- - - - -
- ]
316 : : }
317 : :
318 : : } // namespace core
319 : : } // namespace rss
320 : : } // namespace ad
|