CARLA
 
载入中...
搜索中...
未找到
LargeMapManager.h
浏览该文件的文档.
1// Copyright (c) 2021 Computer Vision Center (CVC) at the Universitat Autonoma de Barcelona (UAB).
2// This work is licensed under the terms of the MIT license.
3// For a copy, see <https://opensource.org/licenses/MIT>.
4
5#pragma once
6
7#include "CoreMinimal.h"
8#include "Actor/CarlaActor.h"
9#include "GameFramework/Actor.h"
10
11#include "Engine/LevelStreamingDynamic.h"
12
13#include "Math/DVector.h"
14
15#include "LargeMapManager.generated.h"
16
17
18//TODO: Cache CarlaEpisode。
19
20USTRUCT()
22{
23 GENERATED_BODY()
24
26
28 const FCarlaActor* InCarlaActor,
29 const FTransform& InTransform)
30 : CarlaActor(InCarlaActor),
31 WorldLocation(FDVector(InTransform.GetTranslation())),
32 Rotation(InTransform.GetRotation()) {}
33
35
37
38 FQuat Rotation;
39};
40
41USTRUCT(BlueprintType)
43{
44 GENERATED_BODY()
45
46 UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Carla Map Tile")
47 FString Name; // Tile_{TileID_X}_{TileID_Y}
48
49 // 绝对位置不依赖于重新定基准。
50 UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Carla Map Tile")
51 FVector Location{0.0f};
52 //TODO: not FVector
53
54 UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Carla Map Tile")
55 ULevelStreamingDynamic* StreamingLevel = nullptr;
56
57 bool TilesSpawned = false;
58};
59
60UCLASS()
61class CARLA_API ALargeMapManager : public AActor
62{
63 GENERATED_BODY()
64
65public:
66
67 using TileID = uint64;
68
69 //为该参与者的属性设置默认值。
70
72
74
75protected:
76 //在游戏开始或生成时被调用。
77 virtual void BeginPlay() override;
78
79 void PreWorldOriginOffset(UWorld* InWorld, FIntVector InSrcOrigin, FIntVector InDstOrigin);
80 void PostWorldOriginOffset(UWorld* InWorld, FIntVector InSrcOrigin, FIntVector InDstOrigin);
81
82 void OnLevelAddedToWorld(ULevel* InLevel, UWorld* InWorld);
83 void OnLevelRemovedFromWorld(ULevel* InLevel, UWorld* InWorld);
84
85public:
86
87 void RegisterInitialObjects();
88
89 void OnActorSpawned(const FCarlaActor& CarlaActor);
90
91 UFUNCTION(Category="Large Map Manager")
92 void OnActorDestroyed(AActor* DestroyedActor);
93
94 // 每帧被调用。
95 void Tick(float DeltaTime) override;
96
97 UFUNCTION(BlueprintCallable, Category = "Large Map Manager")
98 void GenerateMap(FString InAssetsPath);
99
100 UFUNCTION(BlueprintCallable, Category = "Large Map Manager")
101 void GenerateLargeMap();
102
103 void GenerateMap(TArray<TPair<FString, FIntVector>> MapPathsIds);
104
105 UFUNCTION(BlueprintCallable, CallInEditor, Category = "Large Map Manager")
106 void ClearWorldAndTiles();
107
108 UFUNCTION(BlueprintCallable, CallInEditor, Category = "Large Map Manager")
109 void GenerateMap_Editor()
110 {
111 if (!LargeMapTilePath.IsEmpty()) GenerateMap(LargeMapTilePath);
112 }
113
114 void AddActorToUnloadedList(const FCarlaActor& CarlaActor, const FTransform& Transform);
115
116 UFUNCTION(BlueprintCallable, Category = "Large Map Manager")
117 FIntVector GetNumTilesInXY() const;
118
119 UFUNCTION(BlueprintCallable, Category = "Large Map Manager")
120 int GetNumTiles() const
121 {
122 return MapTiles.Num();
123 }
124
125 UFUNCTION(BlueprintCallable, Category = "Large Map Manager")
126 bool IsLevelOfTileLoaded(FIntVector InTileID) const;
127
128 bool IsTileLoaded(TileID TileId) const
129 {
130 return CurrentTilesLoaded.Contains(TileId);
131 }
132
133 bool IsTileLoaded(FVector Location) const
134 {
135 return IsTileLoaded(GetTileID(Location));
136 }
137
138 bool IsTileLoaded(FDVector Location) const
139 {
140 return IsTileLoaded(GetTileID(Location));
141 }
142
143 FTransform GlobalToLocalTransform(const FTransform& InTransform) const;
144 FVector GlobalToLocalLocation(const FVector& InLocation) const;
145
146 FTransform LocalToGlobalTransform(const FTransform& InTransform) const;
147 FVector LocalToGlobalLocation(const FVector& InLocation) const;
148
149 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Large Map Manager")
150 FString LargeMapTilePath = "/Game/Carla/Maps/testmap";
151 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Large Map Manager")
152 FString LargeMapName = "testmap";
153
154 void SetTile0Offset(const FVector& Offset);
155
156 void SetTileSize(float Size);
157
158 float GetTileSize();
159
160 FVector GetTile0Offset();
161
162 void SetLayerStreamingDistance(float Distance);
163
164 void SetActorStreamingDistance(float Distance);
165
166 float GetLayerStreamingDistance() const;
167
168 float GetActorStreamingDistance() const;
169
170 UFUNCTION(BlueprintCallable, Category = "Large Map Manager")
171 FIntVector GetTileVectorID(FVector TileLocation) const;
172
173 FIntVector GetTileVectorID(FDVector TileLocation) const;
174
175 FIntVector GetTileVectorID(TileID TileID) const;
176
177 FVector GetTileLocation(TileID TileID) const;
178
179 UFUNCTION(BlueprintCallable, Category = "Large Map Manager")
180 FVector GetTileLocation(FIntVector TileVectorID) const;
181
182 FDVector GetTileLocationD(TileID TileID) const;
183
184 FDVector GetTileLocationD(FIntVector TileVectorID) const;
185
186 /// 从给定的位置检索覆盖该区域的图块ID。
187 TileID GetTileID(FVector TileLocation) const;
188
189 TileID GetTileID(FDVector TileLocation) const;
190
191 TileID GetTileID(FIntVector TileVectorID) const;
192public:
193 FCarlaMapTile* GetCarlaMapTile(FVector Location);
194
195 FCarlaMapTile& GetCarlaMapTile(ULevel* InLevel);
196
197 UFUNCTION(BlueprintCallable, Category = "Large Map Manager")
198 FCarlaMapTile& GetCarlaMapTile(FIntVector TileVectorID);
199
200 FCarlaMapTile* GetCarlaMapTile(TileID TileID);
201
202 FCarlaMapTile& LoadCarlaMapTile(FString TileMapPath, TileID TileId);
203
204 ACarlaWheeledVehicle* GetHeroVehicle();
205
206 // 默认情况下,当周围没有其他自车时,旁观者会被当作自车来对待。
207 //但这可以通过Python应用程序编程接口(API)来更改,最终会在这个函数中体现出来。
208 bool SpectatorAsEgo = false;
209 void ConsiderSpectatorAsEgo(bool _SpectatorAsEgo);
210
211protected:
212
213 void RemoveLandscapeCollisionIfHaveTerraMechanics(ULevel* InLevel);
214
215 void UpdateTilesState();
216
217 void RemovePendingActorsToRemove();
218
219 //检查是否有任何处于活动状态的参与者需要转换为休眠状态的参与者。
220 //因为它超出了范围(参与者流送距离)
221 // 仅存储所选参与者的数组
222 void CheckActiveActors();
223
224 // 将超出范围的活动参与者转换为休眠参与者。
225 void ConvertActiveToDormantActors();
226
227 // 检查是否有任何休眠参与者需要转换为活动参与者。
228// 因为它进入了范围(参与者流送距离)
229// 仅存储所选参与者的数组
230 void CheckDormantActors();
231
232 // 将超出范围的活动参与者转换为休眠参与者。
233 void ConvertDormantToActiveActors();
234
235 void CheckIfRebaseIsNeeded();
236
237 void GetTilesToConsider(
238 const AActor* ActorToConsider,
239 TSet<TileID>& OutTilesToConsider);
240
241 void GetTilesThatNeedToChangeState(
242 const TSet<TileID>& InTilesToConsider,
243 TSet<TileID>& OutTilesToBeVisible,
244 TSet<TileID>& OutTilesToHidde);
245
246 void UpdateTileState(
247 const TSet<TileID>& InTilesToUpdate,
248 bool InShouldBlockOnLoad,
249 bool InShouldBeLoaded,
250 bool InShouldBeVisible);
251
252 void UpdateCurrentTilesLoaded(
253 const TSet<TileID>& InTilesToBeVisible,
254 const TSet<TileID>& InTilesToHidde);
255
256 UPROPERTY(VisibleAnywhere, Category = "Large Map Manager")
257 TMap<uint64, FCarlaMapTile> MapTiles;
258
259 // 所有要考虑用于瓦片加载的参与者(所有主车)
260// 数组中的第一个参与者是被选中用于重新定基准的那个参与者
261//TODO: support rebase in more than one hero vehicle
262 UPROPERTY(VisibleAnywhere, Category = "Large Map Manager")
263 TArray<AActor*> ActorsToConsider;
264
265 UPROPERTY(VisibleAnywhere, Category = "Large Map Manager")
266 AActor* Spectator = nullptr;
267 //UPROPERTY(VisibleAnywhere, Category = "Large Map Manager")
268 TArray<FCarlaActor::IdType> ActiveActors;
269 TArray<FCarlaActor::IdType> DormantActors;
270
271 //临时集合用于移除参与者。这样做只是为了避免在更新循环中移除它们。
272 TSet<AActor*> ActorsToRemove;
273 TSet<FCarlaActor::IdType> ActivesToRemove;
274 TSet<FCarlaActor::IdType> DormantsToRemove;
275
276 // 用于将参与者从一个数组移动到另一个数组的辅助工具。.
277 TSet<FCarlaActor::IdType> ActiveToDormantActors;
278 TSet<FCarlaActor::IdType> DormantToActiveActors;
279
280 UPROPERTY(VisibleAnywhere, Category = "Large Map Manager")
281 TSet<uint64> CurrentTilesLoaded;
282
283 // 重新定基准后的当前原点。
284 UPROPERTY(VisibleAnywhere, Category = "Large Map Manager")
285 FIntVector CurrentOriginInt{ 0 };
286
288
289 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Large Map Manager")
290 FVector Tile0Offset = FVector(0,0,0);
291
292 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Large Map Manager")
293 float TickInterval = 0.0f;
294
295 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Large Map Manager")
296 float LayerStreamingDistance = 3.0f * 1000.0f * 100.0f;
297
298 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Large Map Manager")
299 float ActorStreamingDistance = 2.0f * 1000.0f * 100.0f;
300
301 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Large Map Manager")
302 float RebaseOriginDistance = 2.0f * 1000.0f * 100.0f;
303
304 float LayerStreamingDistanceSquared = LayerStreamingDistance * LayerStreamingDistance;
305 float ActorStreamingDistanceSquared = ActorStreamingDistance * ActorStreamingDistance;
306 float RebaseOriginDistanceSquared = RebaseOriginDistance * RebaseOriginDistance;
307
308 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Large Map Manager")
309 float TileSide = 2.0f * 1000.0f * 100.0f; // 2km
310
311 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Large Map Manager")
312 FVector LocalTileOffset = FVector(0,0,0);
313
314 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Large Map Manager")
315 bool ShouldTilesBlockOnLoad = false;
316
317
318 void RegisterTilesInWorldComposition();
319
320 FString GenerateTileName(TileID TileID);
321
322 FString TileIDToString(TileID TileID);
323
324 void DumpTilesTable() const;
325
326 void PrintMapInfo();
327
328 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Large Map Manager")
329 FString AssetsPath = "";
330
331 FString BaseTileMapPath = "/Game/Carla/Maps/LargeMap/EmptyTileBase";
332
333 FColor PositonMsgColor = FColor::Purple;
334
335 const int32 TilesDistMsgIndex = 100;
336 const int32 MaxTilesDistMsgIndex = TilesDistMsgIndex + 10;
337
338 const int32 ClientLocMsgIndex = 200;
339 const int32 MaxClientLocMsgIndex = ClientLocMsgIndex + 10;
340
341 UPROPERTY(EditAnywhere, Category = "Large Map Manager")
342 float MsgTime = 1.0f;
343
344 UPROPERTY(EditAnywhere, Category = "Large Map Manager")
345 bool bPrintMapInfo = true;
346
347 UPROPERTY(EditAnywhere, Category = "Large Map Manager")
348 bool bPrintErrors = false;
349
350 UPROPERTY(VisibleAnywhere, Category = "Large Map Manager")
351 bool bHasTerramechanics = false;
352};
sode override
Definition ActorData.h:280
return true
Base class for CARLA wheeled vehicles.
bool IsTileLoaded(FDVector Location) const
bool IsTileLoaded(FVector Location) const
查看一个参与者和它的属性
Definition CarlaActor.h:23
地图类的前向声明,用于在LaneInvasionSensor类中可能的引用。
FActiveActor(const FCarlaActor *InCarlaActor, const FTransform &InTransform)
const FCarlaActor * CarlaActor
FDVector WorldLocation