CARLA
 
载入中...
搜索中...
未找到
ActorData.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// 包含ActorData类的头文件
8#include "ActorData.h"
9
10// 包含Carla库中关于游戏集、交通灯、交通标志、交通灯组件、交通灯控制器等相关的头文件
16
17// 包含Carla库中关于游戏模式基础类和静态类的头文件
20
21// 包含Carla库中关于车辆的头文件
23
24// 包含游戏框架中角色移动组件的头文件
25#include "GameFramework/CharacterMovementComponent.h"
26
27// 包含Carla库中关于行人控制器和行人基础类的头文件
30
31// 包含Carla库中关于传感器的头文件
32#include "Carla/Sensor/Sensor.h"
33
34// 包含CarlaActor类的头文件
35#include "CarlaActor.h"
36
37// FActorData类的成员函数,用于重生一个Actor
38AActor* FActorData::RespawnActor(UCarlaEpisode* CarlaEpisode, const FActorInfo& Info)
39{
40 // 获取局部变换,并向上移动15个单位以避免车轮与几何体相交
41 FTransform SpawnTransform = GetLocalTransform(CarlaEpisode);
42 SpawnTransform.AddToTranslation(FVector(0,0,15));
43 // 使用给定的信息和变换重生Actor
44 return CarlaEpisode->ReSpawnActorWithInfo(SpawnTransform, Info.Description);
45}
46
47// FActorData类的成员函数,用于记录Actor的数据
48void FActorData::RecordActorData(FCarlaActor* CarlaActor, UCarlaEpisode* CarlaEpisode)
49{
50 // 获取Actor及其变换
51 AActor* Actor = CarlaActor->GetActor();
52 FTransform Transform = Actor->GetTransform();
53 // 计算位置(考虑到当前地图的原点)
54 Location = FDVector(Transform.GetLocation()) + CarlaEpisode->GetCurrentMapOrigin();
55 Rotation = Transform.GetRotation();
56 Scale = Transform.GetScale3D();
57 // 获取Actor的根组件,并检查是否为UPrimitiveComponent类型
58 UPrimitiveComponent* Component = Cast<UPrimitiveComponent>(Actor->GetRootComponent());
59 if (Component)
60 {
61 // 记录物理模拟状态和角速度
62 bSimulatePhysics = Component->IsSimulatingPhysics();
63 AngularVelocity = Component->GetPhysicsAngularVelocityInDegrees();
64 }
65 // 记录速度
66 Velocity = Actor->GetVelocity();
67}
68
69// FActorData类的成员函数,用于恢复Actor的数据
70void FActorData::RestoreActorData(FCarlaActor* CarlaActor, UCarlaEpisode* CarlaEpisode)
71{
72 // 获取Actor并设置其变换
73 AActor* Actor = CarlaActor->GetActor();
74 Actor->SetActorTransform(GetLocalTransform(CarlaEpisode));
75 // 获取Actor的根组件,并检查是否为UPrimitiveComponent类型
76 UPrimitiveComponent* Component = Cast<UPrimitiveComponent>(Actor->GetRootComponent());
77 if (Component)
78 {
79 // 恢复线性和角速度
80 Component->SetPhysicsLinearVelocity(
81 Velocity, false, "None");
82 Component->SetPhysicsAngularVelocityInDegrees(
83 AngularVelocity, false, "None");
84 }
85 // 尝试将Actor转换为ACharacter或ACarlaWheeledVehicle类型,以特别处理车辆和行人的物理
86 auto* Character = Cast<ACharacter>(Actor);
87 auto* CarlaVehicle = Cast<ACarlaWheeledVehicle>(Actor);
88 if (CarlaVehicle != nullptr){
89 // 车辆物理处理方式不同,因此设置物理模拟状态
90 CarlaVehicle->SetSimulatePhysics(bSimulatePhysics);
91 }
92 else if (Character != nullptr)
93 {
94 // 行人物理处理方式也不同,但此处未实现具体逻辑
95 }
96 // In the rest of actors, the physics is controlled with the UPrimitiveComponent, so we use
97 // that for disable it.
98 else
99 {
100 // 对于其他Actor,使用UPrimitiveComponent控制物理
101 auto RootComponent = Component;
102 if (RootComponent != nullptr)
103 {
104 RootComponent->SetSimulatePhysics(bSimulatePhysics);
105 RootComponent->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
106 }
107 }
108}
109
110// FActorData类的成员函数,用于获取相对于当前地图原点的局部变换
111FTransform FActorData::GetLocalTransform(UCarlaEpisode* CarlaEpisode) const
112{
113 // 计算局部位置(考虑到当前地图的原点)
114 FVector LocalLocation = (Location - CarlaEpisode->GetCurrentMapOrigin()).ToFVector();
115 // 返回包含位置、旋转和缩放的变换
116 return FTransform(Rotation, LocalLocation, Scale);
117}
118
119
120// 记录车辆相关数据
121void FVehicleData::RecordActorData(FCarlaActor* CarlaActor, UCarlaEpisode* CarlaEpisode)
122{
123 FActorData::RecordActorData(CarlaActor, CarlaEpisode);// 继承自基类的记录数据方法
124 AActor* Actor = CarlaActor->GetActor(); // 获取Actor对象
125 ACarlaWheeledVehicle* Vehicle = Cast<ACarlaWheeledVehicle>(Actor); // 将Actor转换为车辆类型
126 if (bSimulatePhysics) // 如果需要模拟物理
127 {
128 PhysicsControl = Vehicle->GetVehiclePhysicsControl();// 获取车辆物理控制数据
129 }
130 Control = Vehicle->GetVehicleControl(); // 获取车辆控制数据
131 AckermannControl = Vehicle->GetVehicleAckermannControl();// 获取Ackermann控制数据
132 bAckermannControlActive = Vehicle->IsAckermannControlActive(); // 检查Ackermann控制是否激活
133 AckermannControllerSettings = Vehicle->GetAckermannControllerSettings();// 获取Ackermann控制器设置
134 LightState = Vehicle->GetVehicleLightState();// 获取车辆灯光状态
135 auto Controller = Cast<AWheeledVehicleAIController>(Vehicle->GetController());// 获取车辆AI控制器
136 if (Controller)
137 {
138 SpeedLimit = Controller->GetSpeedLimit();// 获取速度限制
139 }
140 FailureState = Vehicle->GetFailureState();// 获取车辆故障状态
141}
142
143// 恢复车辆相关数据
144void FVehicleData::RestoreActorData(FCarlaActor* CarlaActor, UCarlaEpisode* CarlaEpisode)
145{
146 FActorData::RestoreActorData(CarlaActor, CarlaEpisode);// 继承自基类的恢复数据方法
147 AActor* Actor = CarlaActor->GetActor();// 获取Actor对象
148 ACarlaWheeledVehicle* Vehicle = Cast<ACarlaWheeledVehicle>(Actor);// 将Actor转换为车辆类型
149 Vehicle->SetSimulatePhysics(bSimulatePhysics);// 设置是否模拟物理
150 if (bSimulatePhysics)// 如果需要模拟物理
151 {
152 Vehicle->ApplyVehiclePhysicsControl(PhysicsControl);// 应用车辆物理控制数据
153 }
154 Vehicle->ApplyAckermannControllerSettings(AckermannControllerSettings);// 应用Ackermann控制器设置
155 if (!bAckermannControlActive)// 如果Ackermann控制不激活
156 {
157 Vehicle->ApplyVehicleControl(Control, EVehicleInputPriority::Client);// 应用车辆控制数据
158 }
159 else
160 {
161 Vehicle->ApplyVehicleAckermannControl(AckermannControl, EVehicleInputPriority::Client);// 应用Ackermann控制数据
162 }
163 Vehicle->SetVehicleLightState(LightState);// 设置车辆灯光状态
164 auto Controller = Cast<AWheeledVehicleAIController>(Vehicle->GetController());/ 获取车辆AI控制器
165 if (Controller)// 如果控制器存在
166 {
167 Controller->SetSpeedLimit(SpeedLimit);// 设置速度限制
168 }
169 Vehicle->SetFailureState(FailureState);// 设置车辆故障状态
170}
171
172// 记录行人相关数据
173void FWalkerData::RecordActorData(FCarlaActor* CarlaActor, UCarlaEpisode* CarlaEpisode)
174{
175 FActorData::RecordActorData(CarlaActor, CarlaEpisode);// 继承自基类的记录数据方法
176 AActor* Actor = CarlaActor->GetActor();// 获取Actor对象
177 auto Walker = Cast<AWalkerBase>(Actor);// 将Actor转换为行人类型
178 auto Controller = Walker != nullptr ? Cast<AWalkerController>(Walker->GetController()) : nullptr;// 获取行人控制器
179 if (Controller != nullptr)
180 {
181 WalkerControl = carla::rpc::WalkerControl{Controller->GetWalkerControl()};// 获取行人控制数据
182 }
183 bAlive = Walker->bAlive;// 获取行人是否存活的状态
184}
185
186// 恢复行人相关数据
187void FWalkerData::RestoreActorData(FCarlaActor* CarlaActor, UCarlaEpisode* CarlaEpisode)
188{
189 FActorData::RestoreActorData(CarlaActor, CarlaEpisode);// 继承自基类的恢复数据方法
190 AActor* Actor = CarlaActor->GetActor();
191 auto Walker = Cast<ACharacter>(Actor); // 将Actor转换为角色类型
192 auto Controller = Walker != nullptr ? Cast<AWalkerController>(Walker->GetController()) : nullptr;
193 if (Controller != nullptr)
194 {
195 Controller->ApplyWalkerControl(WalkerControl);
196 }
197 auto CharacterMovement = Cast<UCharacterMovementComponent>(Walker->GetCharacterMovement());// 获取角色运动组件
198 // TODO: Handle death timer
199}
200
201// 重新生成交通标志Actor
202AActor* FTrafficSignData::RespawnActor(UCarlaEpisode* CarlaEpisode, const FActorInfo& Info)// 获取本地变换
203{
204 FTransform SpawnTransform = GetLocalTransform(CarlaEpisode);// 创建Actor生成参数
205 FActorSpawnParameters SpawnParams;
206 SpawnParams.SpawnCollisionHandlingOverride =
207 ESpawnActorCollisionHandlingMethod::AlwaysSpawn;// 设置碰撞处理方式为总是生成
208 return CarlaEpisode->GetWorld()->SpawnActor<ATrafficSignBase>(// 在世界中生成交通标志Actor
209 Model,
210 SpawnTransform,
211 SpawnParams);
212}
213 // 记录交通标志的actor数据
214void FTrafficSignData::RecordActorData(FCarlaActor* CarlaActor, UCarlaEpisode* CarlaEpisode)
215{// 调用基类方法记录基本的actor数据
216 FActorData::RecordActorData(CarlaActor, CarlaEpisode);
217 // 获取CARLA actor对应的Unreal Engine actor
218 AActor* Actor = CarlaActor->GetActor();
219 // 记录交通标志的模型(类)
220 Model = Actor->GetClass();
221 // 尝试将actor转换为交通标志基类
222 ATrafficSignBase* TrafficSign = Cast<ATrafficSignBase>(Actor);
223 // 在交通标志中查找交通标志组件
224 USignComponent* TrafficSignComponent =
225 Cast<USignComponent>(TrafficSign->FindComponentByClass<USignComponent>());
226 if (TrafficSignComponent)
227 {
228 SignModel = TrafficSignComponent->GetClass();
229 SignId = TrafficSignComponent->GetSignId();
230 }
231}
232// 恢复交通标志的actor数据
233void FTrafficSignData::RestoreActorData(FCarlaActor* CarlaActor, UCarlaEpisode* CarlaEpisode)
234{
235 AActor* Actor = CarlaActor->GetActor();
236 // 如果SignId不为空,说明有交通标志数据需要恢复
237 if (SignId.Len())
238 {// 在actor上创建新的交通标志组件,使用之前记录的模型和ID
239 USignComponent* SignComponent =
240 NewObject<USignComponent>(Actor, SignModel);
241 SignComponent->SetSignId(SignId);
242 // 注册组件,使其生效
243 SignComponent->RegisterComponent();
244 // 将组件附加到actor的根组件上,保持相对变换
245 SignComponent->AttachToComponent(
246 Actor->GetRootComponent(),
247 FAttachmentTransformRules::KeepRelativeTransform);
248 // 获取游戏模式,用于初始化交通标志
249 ACarlaGameModeBase *GameMode = UCarlaStatics::GetGameMode(CarlaEpisode->GetWorld());
250 // 初始化交通标志,需要传入地图对象
251 SignComponent->InitializeSign(GameMode->GetMap().get());
252 }
253}
254
255AActor* FTrafficLightData::RespawnActor(UCarlaEpisode* CarlaEpisode, const FActorInfo& Info)
256{
257 FTransform SpawnTransform = GetLocalTransform(CarlaEpisode);
258 FActorSpawnParameters SpawnParams;
259 SpawnParams.SpawnCollisionHandlingOverride =
260 ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
261 return CarlaEpisode->GetWorld()->SpawnActor<ATrafficLightBase>(
262 Model,
263 SpawnTransform,
264 SpawnParams);
265}
266
267void FTrafficLightData::RecordActorData(FCarlaActor* CarlaActor, UCarlaEpisode* CarlaEpisode)
268{
269 FActorData::RecordActorData(CarlaActor, CarlaEpisode);
270 AActor* Actor = CarlaActor->GetActor();
271 Model = Actor->GetClass();
272 ATrafficLightBase* TrafficLight = Cast<ATrafficLightBase>(Actor);
273 UTrafficLightComponent* Component = TrafficLight->GetTrafficLightComponent();
274 SignId = Component->GetSignId();
275 Controller = Component->GetController();
276 Controller->RemoveTrafficLight(Component);
278 LightState = TrafficLight->GetTrafficLightState();
279 PoleIndex = TrafficLight->GetPoleIndex();
280}
281
282void FTrafficLightData::RestoreActorData(FCarlaActor* CarlaActor, UCarlaEpisode* CarlaEpisode)
283{
284 AActor* Actor = CarlaActor->GetActor();
285 ATrafficLightBase* TrafficLight = Cast<ATrafficLightBase>(Actor);
286 UTrafficLightComponent* Component = TrafficLight->GetTrafficLightComponent();
287 Component->SetSignId(SignId);
289 Controller->AddTrafficLight(Component);
290 ACarlaGameModeBase *GameMode = UCarlaStatics::GetGameMode(CarlaEpisode->GetWorld());
291 Component->InitializeSign(GameMode->GetMap().get());
292 Component->SetLightState(Controller->GetCurrentState().State);
293 TrafficLight->SetPoleIndex(PoleIndex);
294 TrafficLight->SetTrafficLightState(LightState);
295}
296
297void FActorSensorData::RecordActorData(FCarlaActor* CarlaActor, UCarlaEpisode* CarlaEpisode)
298{
299 FActorData::RecordActorData(CarlaActor, CarlaEpisode);
300 AActor* Actor = CarlaActor->GetActor();
301 ASensor* Sensor = Cast<ASensor>(Actor);
302 Stream = Sensor->MoveDataStream();
303}
304 // 恢复传感器的actor数据
305void FActorSensorData::RestoreActorData(FCarlaActor* CarlaActor, UCarlaEpisode* CarlaEpisode)
306{
307 FActorData::RestoreActorData(CarlaActor, CarlaEpisode);
308 AActor* Actor = CarlaActor->GetActor();
309 // 获取传感器,并设置其数据流
310 ASensor* Sensor = Cast<ASensor>(Actor);
311 Sensor->SetDataStream(std::move(Stream));
312}
carla::rpc::VehicleFailureState FailureState
Definition ActorData.h:137
float SpeedLimit
Definition ActorData.h:134
FVehicleLightState LightState
Definition ActorData.h:131
bool bAckermannControlActive
Definition ActorData.h:125
FAckermannControllerSettings AckermannControllerSettings
Definition ActorData.h:128
TSharedPtr< const FActorInfo > Info
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld Actor
CARLA Game Mode 的基类。
const boost::optional< carla::road::Map > & GetMap() const
Base class for CARLA wheeled vehicles.
void SetDataStream(FDataStream InStream)
Replace the FDataStream associated with this sensor.
virtual void RecordActorData(FCarlaActor *CarlaActor, UCarlaEpisode *CarlaEpisode)
Definition ActorData.cpp:48
virtual AActor * RespawnActor(UCarlaEpisode *CarlaEpisode, const FActorInfo &Info)
Definition ActorData.cpp:38
FQuat Rotation
Definition ActorData.h:62
virtual void RestoreActorData(FCarlaActor *CarlaActor, UCarlaEpisode *CarlaEpisode)
Definition ActorData.cpp:70
FVector Velocity
Definition ActorData.h:68
bool bSimulatePhysics
Definition ActorData.h:74
FTransform GetLocalTransform(UCarlaEpisode *CarlaEpisode) const
FVector Scale
Definition ActorData.h:65
FDVector Location
Definition ActorData.h:57
FDataStream Stream
Definition ActorData.h:270
virtual void RestoreActorData(FCarlaActor *CarlaActor, UCarlaEpisode *CarlaEpisode) override
virtual void RecordActorData(FCarlaActor *CarlaActor, UCarlaEpisode *CarlaEpisode) override
查看一个参与者和它的属性
Definition CarlaActor.h:23
AActor * GetActor()
Definition CarlaActor.h:75
virtual void RestoreActorData(FCarlaActor *CarlaActor, UCarlaEpisode *CarlaEpisode) override
ETrafficLightState LightState
Definition ActorData.h:227
TSubclassOf< AActor > Model
Definition ActorData.h:233
UTrafficLightController * Controller
Definition ActorData.h:224
virtual void RecordActorData(FCarlaActor *CarlaActor, UCarlaEpisode *CarlaEpisode) override
virtual AActor * RespawnActor(UCarlaEpisode *CarlaEpisode, const FActorInfo &Info) override
TSubclassOf< UObject > SignModel
Definition ActorData.h:196
virtual void RecordActorData(FCarlaActor *CarlaActor, UCarlaEpisode *CarlaEpisode) override
virtual AActor * RespawnActor(UCarlaEpisode *CarlaEpisode, const FActorInfo &Info) override
TSubclassOf< AActor > Model
Definition ActorData.h:193
virtual void RestoreActorData(FCarlaActor *CarlaActor, UCarlaEpisode *CarlaEpisode) override
FVehicleControl Control
Definition ActorData.h:111
FVehicleAckermannControl AckermannControl
Definition ActorData.h:112
FVehiclePhysicsControl PhysicsControl
Definition ActorData.h:110
carla::rpc::WalkerControl WalkerControl
Definition ActorData.h:165
virtual void RestoreActorData(FCarlaActor *CarlaActor, UCarlaEpisode *CarlaEpisode) override
virtual void RecordActorData(FCarlaActor *CarlaActor, UCarlaEpisode *CarlaEpisode) override
static ACarlaGameModeBase * GetGameMode(const UObject *WorldContextObject)
void RemoveCarlaActorTrafficLight(FCarlaActor *CarlaActor)
const FTrafficLightStage & GetCurrentState() const
void AddCarlaActorTrafficLight(FCarlaActor *CarlaActor)
void AddTrafficLight(UTrafficLightComponent *TrafficLight)
void RemoveTrafficLight(UTrafficLightComponent *TrafficLight)
一个结构体,用于表示演员及其属性的视图。
Definition ActorInfo.h:27
ETrafficLightState State