17#include "GameFramework/Controller.h"
41 UE_LOG(LogCarla, Warning, TEXT(
"Invalid definition '%s' ignored"), *Definition.
Id);
53 return ActorFactory.
SpawnActor(Transform, Description);
60 const FTransform &Transform,
68 UE_LOG(LogCarla, Error, TEXT(
"Invalid ActorDescription '%s' (UId=%d)"), *Description.
Id, Description.
UId);
69 return MakeTuple(EActorSpawnResultStatus::InvalidDescription,
nullptr);
73 UE_LOG(LogCarla, Log, TEXT(
"Spawning actor '%s'"), *Description.
Id);
81 if ((Result.
Status == EActorSpawnResultStatus::Success) && (Result.
Actor ==
nullptr))
83 UE_LOG(LogCarla, Warning, TEXT(
"ActorSpawnResult: Trying to spawn '%s'"), *Description.
Id);
84 UE_LOG(LogCarla, Warning, TEXT(
"ActorSpawnResult: Reported success but did not return an actor"));
85 Result.
Status = EActorSpawnResultStatus::UnknownError;
94 UE_LOG(LogCarla, Warning, TEXT(
"Failed to spawn actor '%s'"), *Description.
Id);
95 check(Result.
Status != EActorSpawnResultStatus::Success);
103 return MakeTuple(Result.
Status, View);
107 const FTransform &Transform,
113 UE_LOG(LogCarla, Error, TEXT(
"Invalid ActorDescription '%s' (UId=%d)"), *Description.
Id, Description.
UId);
118 UE_LOG(LogCarla, Log, TEXT(
"Spawning actor '%s'"), *Description.
Id);
126 if ((Result.
Status == EActorSpawnResultStatus::Success) && (Result.
Actor ==
nullptr))
128 UE_LOG(LogCarla, Warning, TEXT(
"ActorSpawnResult: Trying to spawn '%s'"), *Description.
Id);
129 UE_LOG(LogCarla, Warning, TEXT(
"ActorSpawnResult: Reported success but did not return an actor"));
130 Result.
Status = EActorSpawnResultStatus::UnknownError;
135 if (Result.
Status == EActorSpawnResultStatus::Success)
152 UE_LOG(LogCarla, Warning, TEXT(
"Trying to destroy actor that is not in the registry"));
163 AController* Controller = (Pawn !=
nullptr ? Pawn->GetController() :
nullptr);
164 if (Controller !=
nullptr)
166 UE_LOG(LogCarla, Log, TEXT(
"Destroying actor's controller: '%s'"), *Id);
167 bool Success = Controller->Destroy();
170 UE_LOG(LogCarla, Error, TEXT(
"Failed to destroy actor's controller: '%s'"), *Id);
185 UE_LOG(LogCarla, Log, TEXT(
"UActorDispatcher::Destroying actor: '%s' %x"), *Id,
Actor);
189 UE_LOG(LogCarla, Error, TEXT(
"Failed to destroy actor: '%s'"), *Id);
194 Registry.Deregister(ActorId);
210 #if defined(WITH_ROS2)
212 if (ROS2->IsEnabled())
219 if (Attr.Key ==
"ros_name")
221 RosName = std::string(TCHAR_TO_UTF8(*Attr.Value.Value));
225 const std::string
id = std::string(TCHAR_TO_UTF8(*Description.
Id));
228 if(RosName.find(
"vehicle") != std::string::npos)
230 std::string VehicleName =
"vehicle" + std::to_string(View->
GetActorId());
232 ROS2->AddActorRosName(
static_cast<void*
>(&
Actor), VehicleName);
236 size_t pos = RosName.find_last_of(
'.');
237 if (pos != std::string::npos) {
238 std::string lastToken = RosName.substr(pos + 1) +
"__";
239 ROS2->AddActorRosName(
static_cast<void*
>(&
Actor), lastToken);
243 ROS2->AddActorRosName(
static_cast<void*
>(&
Actor), RosName);
249 if (Attr.Key ==
"role_name" && (Attr.Value.Value ==
"hero" || Attr.Value.Value ==
"ego"))
255 boost::variant2::visit(Handler, Data);
268 Registry.PutActorToSleep(Id, CarlaEpisode);
273 Registry.WakeActorUp(Id, CarlaEpisode);
287 #if defined(WITH_ROS2)
289 if (ROS2->IsEnabled())
291 ROS2->RemoveActorRosName(
reinterpret_cast<void *
>(
Actor));
UE_LOG(LogCarla, Log, TEXT("UActorDispatcher::Destroying actor: '%s' %x"), *Id, Actor)
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld Actor
virtual TArray< FActorDefinition > GetDefinitions()
virtual FActorSpawnResult SpawnActor(const FTransform &SpawnAtTransform, const FActorDescription &ActorDescription)
static void TagActor(const AActor &Actor, bool bTagForSemanticSegmentation)
设置角色的标签。
FCarlaActor::IdType IdType
FCarlaActor * Register(AActor &Actor, FActorDescription Description, IdType DesiredId=0)
名称 参与者注册函数
void Deregister(IdType Id)
FCarlaActor * FindCarlaActor(IdType Id)
const FActorInfo * GetActorInfo() const
IdType GetActorId() const
static bool CheckActorDefinition(const FActorDefinition &ActorDefinitions)
返回角色定义是否有效。打印所有找到的错误
void OnActorDestroyed(AActor *Actor)
TFunction< FActorSpawnResult(const FTransform &, const FActorDescription &)> SpawnFunctionType
void Bind(FActorDefinition Definition, SpawnFunctionType SpawnFunction)
void PutActorToSleep(FCarlaActor::IdType Id, UCarlaEpisode *CarlaEpisode)
void WakeActorUp(FCarlaActor::IdType Id, UCarlaEpisode *CarlaEpisode)
bool DestroyActor(AActor *Actor)
FCarlaActor * RegisterActor(AActor &Actor, FActorDescription ActorDescription, FActorRegistry::IdType DesiredId=0)
AActor * ReSpawnActor(const FTransform &Transform, FActorDescription ActorDescription)
TPair< EActorSpawnResultStatus, FCarlaActor * > SpawnActor(const FTransform &Transform, FActorDescription ActorDescription, FCarlaActor::IdType DesiredId=0)
TArray< FActorDefinition > Definitions
TArray< SpawnFunctionType > SpawnFunctions
TArray< TSubclassOf< AActor > > Classes
static std::shared_ptr< ROS2 > GetInstance()
boost::variant2::variant< VehicleControl > ROS2CallbackData
TSubclassOf< AActor > Class
要生成的参与者类(可选)
TMap< FString, FActorAttribute > Variations
用户选择了参与者的变化版本。请注意,此时是 由不可修改的属性表示
TSubclassOf< AActor > Class
要生成的参与者类
FActorDescription Description
EActorSpawnResultStatus Status