CARLA
 
载入中...
搜索中...
未找到
SpeedLimitComponent.cpp
浏览该文件的文档.
1// Copyright (c) 2021 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
11#include "Game/CarlaStatics.h"
13
19
20void USpeedLimitComponent::SetSpeedLimit(float Limit)
21{
22 SpeedLimit = Limit;
23}
24
25void USpeedLimitComponent::InitializeSign(const carla::road::Map &Map)
26{
27 const double epsilon = 0.00001;
28
29 auto References = GetAllReferencesToThisSignal(Map);
30 auto* Signal = GetSignal(Map);
31 if (Signal)
32 {
33 SetSpeedLimit(Signal->GetValue());
34 }
35
36 for (auto& Reference : References)
37 {
38 auto RoadId = Reference.first;
39 const auto* SignalReference = Reference.second;
40 for(auto &val : SignalReference->GetValidities())
41 {
42 for(auto lane : carla::geom::Math::GenerateRange(val._from_lane, val._to_lane))
43 {
44 if(lane == 0)
45 continue;
46
47 auto signal_waypoint = Map.GetWaypoint(
48 RoadId, lane, SignalReference->GetS()).get();
49
50 if(Map.GetLane(signal_waypoint).GetType() != cr::Lane::LaneType::Driving)
51 continue;
52
53 // 获得车道宽度一半的 90%
54 float BoxSize = static_cast<float>(
55 0.7f*Map.GetLaneWidth(signal_waypoint)*0.5);
56 // 防止出现道路宽度为 0 的情况,这种情况可能发生在刚刚出现的车道上
57 BoxSize = std::max(0.01f, BoxSize);
58 // Get min and max
59 double LaneLength = Map.GetLane(signal_waypoint).GetLength();
60 double LaneDistance = Map.GetLane(signal_waypoint).GetDistance();
61 if(lane < 0)
62 {
63 signal_waypoint.s = FMath::Clamp(signal_waypoint.s - BoxSize,
64 LaneDistance + epsilon, LaneDistance + LaneLength - epsilon);
65 }
66 else
67 {
68 signal_waypoint.s = FMath::Clamp(signal_waypoint.s + BoxSize,
69 LaneDistance + epsilon, LaneDistance + LaneLength - epsilon);
70 }
71 float UnrealBoxSize = 100*BoxSize;
72 FTransform BoxTransform = Map.ComputeTransform(signal_waypoint);
73 ALargeMapManager* LargeMapManager = UCarlaStatics::GetLargeMapManager(GetWorld());
74 if (LargeMapManager)
75 {
76 BoxTransform = LargeMapManager->GlobalToLocalTransform(BoxTransform);
77 }
78 GenerateSpeedBox(BoxTransform, UnrealBoxSize);
79 }
80 }
81 }
82
83}
84
85void USpeedLimitComponent::GenerateSpeedBox(const FTransform BoxTransform, float BoxSize)
86{
87 UBoxComponent* BoxComponent = GenerateTriggerBox(BoxTransform, BoxSize);
88 BoxComponent->OnComponentBeginOverlap.AddDynamic(this, &USpeedLimitComponent::OnOverlapBeginSpeedLimitBox);
89 AddEffectTriggerVolume(BoxComponent);
90}
91
92void USpeedLimitComponent::OnOverlapBeginSpeedLimitBox(UPrimitiveComponent *OverlappedComp,
93 AActor *OtherActor,
94 UPrimitiveComponent *OtherComp,
95 int32 OtherBodyIndex,
96 bool bFromSweep,
97 const FHitResult &SweepResult)
98{
99 ACarlaWheeledVehicle* Vehicle = Cast<ACarlaWheeledVehicle>(OtherActor);
100 if (Vehicle)
101 {
102 auto Controller = Cast<AWheeledVehicleAIController>(Vehicle->GetController());
103 if (Controller)
104 {
105 Controller->SetSpeedLimit(SpeedLimit);
106 }
107 }
108}
float SpeedLimit
Definition ActorData.h:134
Base class for CARLA wheeled vehicles.
FTransform GlobalToLocalTransform(const FTransform &InTransform) const
地图类的前向声明,用于在LaneInvasionSensor类中可能的引用。
static ALargeMapManager * GetLargeMapManager(const UObject *WorldContextObject)
CARLA模拟器的主命名空间。
Definition Carla.cpp:139