23 const double epsilon = 0.00001;
25 auto References = GetAllReferencesToThisSignal(
Map);
27 for (
auto& Reference : References)
29 auto RoadId = Reference.first;
30 const auto* SignalReference = Reference.second;
31 TSet<carla::road::RoadId> SignalPredecessors;
33 for(
auto &validity : SignalReference->GetValidities())
35 for(
auto lane :
carla::geom::Math::GenerateRange(validity._from_lane, validity._to_lane))
40 auto signal_waypoint =
Map.GetWaypoint(
41 RoadId, lane, SignalReference->GetS()).get();
43 if(
Map.GetLane(signal_waypoint).GetType() != cr::Lane::LaneType::Driving)
46 auto box_waypoint = signal_waypoint;
48 if (
Map.IsJunction(RoadId)) {
49 auto predecessors =
Map.GetPredecessors(box_waypoint);
50 if (predecessors.size() == 1) {
51 auto predecessor = predecessors.front();
52 if (!
Map.IsJunction(predecessor.road_id)) {
53 box_waypoint = predecessor;
59 float BoxWidth =
static_cast<float>(
60 0.5f*
Map.GetLaneWidth(box_waypoint)*0.5);
61 float BoxLength = 1.5f;
62 float BoxHeight = 1.0f;
64 BoxWidth = std::max(0.01f, BoxWidth);
66 double LaneLength =
Map.GetLane(box_waypoint).GetLength();
67 double LaneDistance =
Map.GetLane(box_waypoint).GetDistance();
69 float AdditionalDistance = 1.5f;
72 box_waypoint.s = FMath::Clamp(box_waypoint.s - (BoxLength + AdditionalDistance),
73 LaneDistance + epsilon, LaneDistance + LaneLength - epsilon);
77 box_waypoint.s = FMath::Clamp(box_waypoint.s + (BoxLength + AdditionalDistance),
78 LaneDistance + epsilon, LaneDistance + LaneLength - epsilon);
80 FTransform BoxTransform =
Map.ComputeTransform(box_waypoint);
86 GenerateStopBox(BoxTransform, FVector(100*BoxLength, 100*BoxWidth, 100*BoxHeight));
88 auto Predecessors =
Map.GetPredecessors(signal_waypoint);
89 for(
auto &Prev : Predecessors)
91 if(!SignalPredecessors.Contains(Prev.road_id))
93 SignalPredecessors.Add(Prev.road_id);
100 if(
Map.IsJunction(RoadId))
104 if(
Junction->RoadHasConflicts(RoadId))
106 const auto &ConflictingRoads =
Junction->GetConflictsOfRoad(RoadId);
107 for(
const auto &Conflict : ConflictingRoads)
109 auto Waypoints =
Map.GenerateWaypointsInRoad(Conflict);
110 for(
auto& Waypoint : Waypoints)
113 bool bHasSamePredecessor =
false;
114 auto Predecessors =
Map.GetPredecessors(Waypoint);
115 for(
auto &Prev : Predecessors)
117 if(SignalPredecessors.Contains(Prev.road_id))
119 bHasSamePredecessor =
true;
122 if(bHasSamePredecessor)
126 if(
Map.GetLane(Waypoint).GetType() != cr::Lane::LaneType::Driving)
130 auto CurrentWaypoint = Waypoint;
131 auto NextWaypoint = CurrentWaypoint;
132 float BoxSize =
static_cast<float>(
133 0.9*
Map.GetLaneWidth(NextWaypoint)*0.5);
136 BoxSize = std::max(0.01f, BoxSize);
137 float UEBoxSize = 100*BoxSize;
139 FTransform BoxTransform =
Map.ComputeTransform(NextWaypoint);
145 GenerateCheckBox(BoxTransform, UEBoxSize);
148 auto Next =
Map.GetNext(NextWaypoint, 2*BoxSize);
149 if (Next.size() != 1)
153 NextWaypoint = Next.front();
154 if(NextWaypoint.road_id != Waypoint.road_id)
158 BoxTransform =
Map.ComputeTransform(NextWaypoint);
163 GenerateCheckBox(BoxTransform, UEBoxSize);
167 double AnticipationTime = 0.1;
168 auto Previous =
Map.GetPrevious(Waypoint, 2*BoxSize);
169 std::queue<std::pair<float, carla::road::element::Waypoint>>
171 for (
auto & Prev : Previous)
173 WaypointQueue.push({AnticipationTime, Prev});
175 while (!WaypointQueue.empty())
177 auto CurrentElement = WaypointQueue.front();
179 GenerateCheckBox(
Map.ComputeTransform(CurrentElement.second), UEBoxSize);
187 float RemainingTime = CurrentElement.first - BoxSize/Speed;
188 if(RemainingTime > 0)
190 Previous =
Map.GetPrevious(CurrentElement.second, 2*BoxSize);
191 for (
auto & Prev : Previous)
193 WaypointQueue.push({RemainingTime, Prev});
204void UStopSignComponent::GenerateStopBox(
const FTransform BoxTransform,
205 const FVector BoxSize)
207 UBoxComponent* BoxComponent = GenerateTriggerBox(BoxTransform, BoxSize);
208 BoxComponent->OnComponentBeginOverlap.AddDynamic(
this, &UStopSignComponent::OnOverlapBeginStopEffectBox);
209 BoxComponent->OnComponentEndOverlap.AddDynamic(
this, &UStopSignComponent::OnOverlapEndStopEffectBox);
210 AddEffectTriggerVolume(BoxComponent);
213void UStopSignComponent::GenerateCheckBox(
const FTransform BoxTransform,
216 UBoxComponent* BoxComponent = GenerateTriggerBox(BoxTransform, BoxSize);
217 BoxComponent->OnComponentBeginOverlap.AddDynamic(
this, &UStopSignComponent::OnOverlapBeginStopCheckBox);
218 BoxComponent->OnComponentEndOverlap.AddDynamic(
this, &UStopSignComponent::OnOverlapEndStopCheckBox);
221void UStopSignComponent::GiveWayIfPossible()
223 if (VehiclesToCheck.Num() == 0)
225 for (
auto Vehicle : VehiclesInStop)
228 Cast<AWheeledVehicleAIController>(
Vehicle->GetController());
234 if(VehiclesInStop.Num())
236 for (
auto Vehicle : VehiclesInStop)
239 Cast<AWheeledVehicleAIController>(
Vehicle->GetController());
243 DelayedGiveWay(1.0f);
248void UStopSignComponent::DelayedGiveWay(
float Delay)
250 FTimerHandle TimerHandler;
251 GetWorld()->GetTimerManager().
252 SetTimer(TimerHandler,
this, &UStopSignComponent::GiveWayIfPossible, Delay);
258 int32 OtherBodyIndex,
260 const FHitResult &SweepResult)
266 Cast<AWheeledVehicleAIController>(
Vehicle->GetController());
267 if (VehicleController)
273 DelayedGiveWay(2.0f);
276 RemoveSameVehicleInBothLists();
282 int32 OtherBodyIndex)
287 VehiclesInStop.Remove(
Vehicle);
294 int32 OtherBodyIndex,
296 const FHitResult &SweepResult)
301 if(!VehiclesInStop.Contains(
Vehicle))
303 if (!VehiclesToCheck.Contains(
Vehicle))
305 VehiclesToCheck.Add(
Vehicle, 0);
316 int32 OtherBodyIndex)
321 if(VehiclesToCheck.Contains(
Vehicle))
324 if(VehiclesToCheck[
Vehicle] <= 0)
326 VehiclesToCheck.Remove(
Vehicle);
330 DelayedGiveWay(0.5f);
333void UStopSignComponent::RemoveSameVehicleInBothLists()
335 for(
auto*
Vehicle : VehiclesInStop)
337 if(VehiclesToCheck.Contains(
Vehicle))
339 VehiclesToCheck.Remove(
Vehicle);
Base class for CARLA wheeled vehicles.
FTransform GlobalToLocalTransform(const FTransform &InTransform) const
void SetTrafficLightState(ETrafficLightState InTrafficLightState)
设置当前影响此车辆的红绿灯状态。
地图类的前向声明,用于在LaneInvasionSensor类中可能的引用。
static ALargeMapManager * GetLargeMapManager(const UObject *WorldContextObject)
carla::SharedPtr< carla::client::Junction > Junction