CARLA
 
载入中...
搜索中...
未找到
SignComponent.cpp
浏览该文件的文档.
1// Copyright (c) 2020 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
7
8#include "SignComponent.h"
9
13#include "carla/rpc/String.h"
15
16USignComponent::USignComponent()
17{
18 PrimaryComponentTick.bCanEverTick = false;
19}
20
21// 游戏开始时调用
22void USignComponent::BeginPlay()
23{
24 Super::BeginPlay();
25
26}
27
28// 每帧调用
29void USignComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
30{
31 Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
32
33}
34
35const FString& USignComponent::GetSignId() const
36{
37 return SignId;
38}
39
40void USignComponent::SetSignId(const FString &Id) {
41 SignId = Id;
42}
43
44void USignComponent::InitializeSign(const cr::Map &Map)
45{
46
47}
48
49TArray<std::pair<cr::RoadId, const cre::RoadInfoSignal*>>
50 USignComponent::GetAllReferencesToThisSignal(const cr::Map &Map)
51{
52 TArray<std::pair<cr::RoadId, const cre::RoadInfoSignal*>> Result;
53 auto waypoints = Map.GenerateWaypointsOnRoadEntries();
54 std::unordered_set<cr::RoadId> ExploredRoads;
55 for (auto & waypoint : waypoints)
56 {
57 // 检查我们是否已经探索过这条路
58 if (ExploredRoads.count(waypoint.road_id) > 0)
59 {
60 continue;
61 }
62 ExploredRoads.insert(waypoint.road_id);
63
64 // 同一条路探索多次(影响性能,不影响行为)
65 auto SignalReferences = Map.GetLane(waypoint).
66 GetRoad()->GetInfos<cre::RoadInfoSignal>();
67 for (auto *SignalReference : SignalReferences)
68 {
69 FString SignalId(SignalReference->GetSignalId().c_str());
70 if(SignalId == GetSignId())
71 {
72 Result.Add({waypoint.road_id, SignalReference});
73 }
74 }
75 }
76 return Result;
77}
78
79// 根据信号 ID 从给定的地图中获取对应的信号对象。
80const cr::Signal* USignComponent::GetSignal(const cr::Map &Map) const
81{
82 std::string std_signal_id = carla::rpc::FromFString(GetSignId());
83 if (Map.GetSignals().count(std_signal_id))
84 {
85 return Map.GetSignals().at(std_signal_id).get();
86 }
87 return nullptr;
88}
89
90// 创建并生成一个新的触发器盒子组件,并将其附加到父 Actor 上。
91// 设置触发器盒子的位置、大小和附加规则,并返回创建的 UBoxComponent 对象。
92UBoxComponent* USignComponent::GenerateTriggerBox(const FTransform &BoxTransform,
93 float BoxSize)
94{
95 AActor *ParentActor = GetOwner();
96 UBoxComponent *BoxComponent = NewObject<UBoxComponent>(ParentActor);
97 BoxComponent->RegisterComponent();
98 BoxComponent->AttachToComponent(
99 ParentActor->GetRootComponent(),
100 FAttachmentTransformRules::KeepRelativeTransform);
101 BoxComponent->SetWorldTransform(BoxTransform);
102 BoxComponent->SetBoxExtent(FVector(BoxSize, BoxSize, BoxSize), true);
103 return BoxComponent;
104}
105
106UBoxComponent* USignComponent::GenerateTriggerBox(const FTransform &BoxTransform,
107 const FVector &BoxSize)
108{
109 AActor *ParentActor = GetOwner();
110 UBoxComponent *BoxComponent = NewObject<UBoxComponent>(ParentActor);
111 BoxComponent->RegisterComponent();
112 BoxComponent->AttachToComponent(
113 ParentActor->GetRootComponent(),
114 FAttachmentTransformRules::KeepRelativeTransform);
115 BoxComponent->SetWorldTransform(BoxTransform);
116 BoxComponent->SetBoxExtent(BoxSize, true);
117 return BoxComponent;
118}
119
120void USignComponent::AddEffectTriggerVolume(UBoxComponent* TriggerVolume)
121{
122 EffectTriggerVolumes.Add(TriggerVolume);
123}
124
125const TArray<UBoxComponent*> USignComponent::GetEffectTriggerVolume() const
126{
127 return EffectTriggerVolumes;
128}
地图类的前向声明,用于在LaneInvasionSensor类中可能的引用。
std::string SignId
Definition RoadTypes.h:35