9#include "Kismet/GameplayStatics.h"
22UTrafficLightComponent::UTrafficLightComponent()
29 const double epsilon = 0.00001;
31 auto References = GetAllReferencesToThisSignal(
Map);
33 for (
auto& Reference : References)
35 auto RoadId = Reference.first;
36 const auto* SignalReference = Reference.second;
37 for(
auto &validity : SignalReference->GetValidities())
39 for(
auto lane :
carla::geom::Math::GenerateRange(validity._from_lane, validity._to_lane))
45 boost::optional<carla::road::element::Waypoint> opt_signal_waypoint =
Map.GetWaypoint(
46 RoadId, lane, SignalReference->GetS());
47 if(opt_signal_waypoint){
48 signal_waypoint = opt_signal_waypoint.get();
50 UE_LOG(LogCarla, Error, TEXT(
"signal_waypoint is not valid") );
54 if (
Map.IsJunction(RoadId)) {
55 auto predecessors =
Map.GetPredecessors(signal_waypoint);
56 if (predecessors.size() == 1) {
57 auto predecessor = predecessors.front();
58 if (!
Map.IsJunction(predecessor.road_id)) {
59 signal_waypoint = predecessor;
64 if(
Map.GetLane(signal_waypoint).GetType() != cr::Lane::LaneType::Driving)
68 float BoxWidth =
static_cast<float>(
69 0.5f*
Map.GetLaneWidth(signal_waypoint)*0.5);
70 float BoxLength = 1.5f;
71 float BoxHeight = 1.0f;
75 BoxWidth = std::max(0.01f, BoxWidth);
77 double LaneLength =
Map.GetLane(signal_waypoint).GetLength();
78 double LaneDistance =
Map.GetLane(signal_waypoint).GetDistance();
80 float AdditionalDistance = 1.5f;
83 signal_waypoint.
s = FMath::Clamp(signal_waypoint.
s - (BoxLength + AdditionalDistance),
84 LaneDistance + epsilon, LaneDistance + LaneLength - epsilon);
88 signal_waypoint.
s = FMath::Clamp(signal_waypoint.
s + (BoxLength + AdditionalDistance),
89 LaneDistance + epsilon, LaneDistance + LaneLength - epsilon);
91 FTransform BoxTransform =
Map.ComputeTransform(signal_waypoint);
97 GenerateTrafficLightBox(BoxTransform, FVector(100*BoxLength, 100*BoxWidth, 100*BoxHeight));
103void UTrafficLightComponent::GenerateTrafficLightBox(
const FTransform BoxTransform,
104 const FVector BoxSize)
106 UBoxComponent* BoxComponent = GenerateTriggerBox(BoxTransform, BoxSize);
107 BoxComponent->OnComponentBeginOverlap.AddDynamic(
this, &UTrafficLightComponent::OnBeginOverlapTriggerBox);
108 BoxComponent->OnComponentEndOverlap.AddDynamic(
this, &UTrafficLightComponent::OnEndOverlapTriggerBox);
109 AddEffectTriggerVolume(BoxComponent);
115 LightChangeDispatcher.Broadcast();
116 if (GetOwner()->Implements<UTrafficLightInterface>())
118 ITrafficLightInterface::Execute_LightChanged(GetOwner(),
LightState);
126 for (
auto Controller : Vehicles)
128 if (Controller !=
nullptr)
140void UTrafficLightComponent::SetFrozenGroup(
bool InFreeze)
144 GetGroup()->SetFrozenGroup(InFreeze);
150 return TrafficLightController->GetGroup();
155 return TrafficLightController->GetGroup();
160 return TrafficLightController;
165 return TrafficLightController;
171 int32 OtherBodyIndex,
173 const FHitResult &SweepResult)
179 Cast<AWheeledVehicleAIController>(
Vehicle->GetController());
180 if (VehicleController)
183 Vehicles.Add(VehicleController);
184 VehicleController->
SetTrafficLight(Cast<ATrafficLightBase>(GetOwner()));
192 int32 OtherBodyIndex)
198 Cast<AWheeledVehicleAIController>(
Vehicle->GetController());
199 if (VehicleController)
203 Vehicles.Remove(VehicleController);
210 TrafficLightController = Controller;
FVehicleLightState LightState
UE_LOG(LogCarla, Log, TEXT("UActorDispatcher::Destroying actor: '%s' %x"), *Id, Actor)
Base class for CARLA wheeled vehicles.
FTransform GlobalToLocalTransform(const FTransform &InTransform) const
void LightChangedCompatibility(ETrafficLightState NewLightState)
如果你的类继承自UObject,你的类名上方需要加入 UCLASS() 宏 实现交通信号灯状态改变的类
void SetTrafficLightState(ETrafficLightState InTrafficLightState)
设置当前影响此车辆的红绿灯状态。
void SetTrafficLight(ATrafficLightBase *InTrafficLight)
设置当前影响此车辆的红绿灯状态。
地图类的前向声明,用于在LaneInvasionSensor类中可能的引用。
static ALargeMapManager * GetLargeMapManager(const UObject *WorldContextObject)
从 OpenDrive 映射一个控制器。控制相关交通信号灯并包含其循环