From b0824623634b5b65bfca99c8eaffe1d2dc44b520 Mon Sep 17 00:00:00 2001 From: nsubiron Date: Fri, 28 Jul 2017 13:13:19 +0200 Subject: [PATCH] Send info of dynamic objects --- Source/Carla/AI/VehicleSpawnerBase.h | 17 ++++-- Source/Carla/AI/WalkerSpawnerBase.h | 8 +++ Source/Carla/Game/CarlaGameController.cpp | 8 ++- Source/Carla/Game/CarlaGameController.h | 3 + Source/Carla/Game/CarlaGameModeBase.cpp | 11 ++++ Source/Carla/Game/CarlaGameState.h | 16 ++++++ Source/Carla/Game/CarlaServer.cpp | 68 ++++++++++++++++++++++- Source/Carla/Game/CarlaServer.h | 4 +- Source/Carla/Game/MockGameController.cpp | 2 +- 9 files changed, 129 insertions(+), 8 deletions(-) diff --git a/Source/Carla/AI/VehicleSpawnerBase.h b/Source/Carla/AI/VehicleSpawnerBase.h index 8a066e5fb..f56542b75 100644 --- a/Source/Carla/AI/VehicleSpawnerBase.h +++ b/Source/Carla/AI/VehicleSpawnerBase.h @@ -33,15 +33,24 @@ protected: public: - void SetNumberOfVehicles(int32 Count); + void SetNumberOfVehicles(int32 Count); - APlayerStart* GetRandomSpawnPoint(); + int32 GetNumberOfSpawnedVehicles() const + { + return Vehicles.Num(); + } - void SpawnVehicleAtSpawnPoint(const APlayerStart &SpawnPoint); + const TArray &GetVehicles() const { + return Vehicles; + } protected: -/** If false, no walker will be spawned. */ + APlayerStart* GetRandomSpawnPoint(); + + void SpawnVehicleAtSpawnPoint(const APlayerStart &SpawnPoint); + + /** If false, no walker will be spawned. */ UPROPERTY(Category = "Vehicle Spawner", EditAnywhere) bool bSpawnVehicles = true; diff --git a/Source/Carla/AI/WalkerSpawnerBase.h b/Source/Carla/AI/WalkerSpawnerBase.h index 3c7020ed3..8b54b6e4d 100644 --- a/Source/Carla/AI/WalkerSpawnerBase.h +++ b/Source/Carla/AI/WalkerSpawnerBase.h @@ -64,6 +64,14 @@ public: return Walkers.Num() + WalkersBlackList.Num(); } + const TArray &GetWalkersWhiteList() const { + return Walkers; + } + + const TArray &GetWalkersBlackList() const { + return WalkersBlackList; + } + private: const AWalkerSpawnPointBase &GetRandomSpawnPoint(); diff --git a/Source/Carla/Game/CarlaGameController.cpp b/Source/Carla/Game/CarlaGameController.cpp index be880ba1f..4d35aea05 100644 --- a/Source/Carla/Game/CarlaGameController.cpp +++ b/Source/Carla/Game/CarlaGameController.cpp @@ -75,6 +75,9 @@ void CarlaGameController::RegisterPlayer(AController &NewPlayer) void CarlaGameController::BeginPlay() { + check(Player != nullptr); + GameState = Cast(Player->GetWorld()->GetGameState()); + check(GameState != nullptr); if (Server != nullptr) { if (Errc::Success != Server->SendEpisodeReady(BLOCKING)) { UE_LOG(LogCarlaServer, Warning, TEXT("Failed to read episode start, server needs restart")); @@ -108,7 +111,10 @@ void CarlaGameController::Tick(float DeltaSeconds) // Send measurements. if (Server != nullptr) { - if (Errc::Error == Server->SendMeasurements(Player->GetPlayerState())) { + check(GameState != nullptr); + if (Errc::Error == Server->SendMeasurements( + *GameState, + Player->GetPlayerState())) { Server = nullptr; } } diff --git a/Source/Carla/Game/CarlaGameController.h b/Source/Carla/Game/CarlaGameController.h index 665826605..1ba2f6496 100644 --- a/Source/Carla/Game/CarlaGameController.h +++ b/Source/Carla/Game/CarlaGameController.h @@ -4,6 +4,7 @@ #include "CarlaGameControllerBase.h" +class ACarlaGameState; class ACarlaVehicleController; class CarlaServer; @@ -34,5 +35,7 @@ private: ACarlaVehicleController *Player = nullptr; + const ACarlaGameState *GameState = nullptr; + UCarlaSettings *CarlaSettings = nullptr; }; diff --git a/Source/Carla/Game/CarlaGameModeBase.cpp b/Source/Carla/Game/CarlaGameModeBase.cpp index c3483a76a..4b13db7fa 100644 --- a/Source/Carla/Game/CarlaGameModeBase.cpp +++ b/Source/Carla/Game/CarlaGameModeBase.cpp @@ -124,6 +124,17 @@ void ACarlaGameModeBase::BeginPlay() { Super::BeginPlay(); + auto CarlaGameState = Cast(GameState); + checkf( + CarlaGameState != nullptr, + TEXT("GameState is not a ACarlaGameState, did you forget to set it in the project settings?")); + if (WalkerSpawner != nullptr) { + CarlaGameState->WalkerSpawner = WalkerSpawner; + } + if (VehicleSpawner != nullptr) { + CarlaGameState->VehicleSpawner = VehicleSpawner; + } + const auto &CarlaSettings = GameInstance->GetCarlaSettings(); // Setup semantic segmentation if necessary. diff --git a/Source/Carla/Game/CarlaGameState.h b/Source/Carla/Game/CarlaGameState.h index 9cd335222..285e65fc9 100644 --- a/Source/Carla/Game/CarlaGameState.h +++ b/Source/Carla/Game/CarlaGameState.h @@ -13,7 +13,23 @@ class CARLA_API ACarlaGameState : public AGameStateBase { GENERATED_BODY() +public: + const AVehicleSpawnerBase *GetVehicleSpawner() const { + return VehicleSpawner; + } + const AWalkerSpawnerBase *GetWalkerSpawner() const { + return WalkerSpawner; + } +private: + + friend class ACarlaGameModeBase; + + UPROPERTY() + AVehicleSpawnerBase *VehicleSpawner = nullptr; + + UPROPERTY() + AWalkerSpawnerBase *WalkerSpawner = nullptr; }; diff --git a/Source/Carla/Game/CarlaServer.cpp b/Source/Carla/Game/CarlaServer.cpp index dad29a70c..b369f313b 100644 --- a/Source/Carla/Game/CarlaServer.cpp +++ b/Source/Carla/Game/CarlaServer.cpp @@ -181,7 +181,68 @@ CarlaServer::ErrorCode CarlaServer::ReadControl(ACarlaVehicleController &Player, return ec; } -CarlaServer::ErrorCode CarlaServer::SendMeasurements(const ACarlaPlayerState &PlayerState) +static void SetBoxAndSpeed(carla_agent &values, const ACharacter *Walker) +{ + values.forward_speed = FVector::DotProduct(Walker->GetVelocity(), Walker->GetActorRotation().Vector()) * 0.036f; + /// @todo Perhaps the box it is not the same for every walker... + values.box_extent = {45.0f, 35.0f, 100.0f}; +} + +static void SetBoxAndSpeed(carla_agent &values, const AWheeledVehicle *Vehicle) +{ + /// @todo This is very slow and the code is duplicated at + /// ACarlaVehicleController. + values.forward_speed = Vehicle->GetVehicleMovementComponent()->GetForwardSpeed() * 0.036f; + TArray BoundingBoxes; + Vehicle->GetComponents(BoundingBoxes); + if (BoundingBoxes.Num() > 0) { + Set(values.box_extent, BoundingBoxes[0]->GetScaledBoxExtent()); + } else { + UE_LOG(LogCarla, Error, TEXT("Vehicle is missing the bounding box!")); + } +} + +template +static void AddAgents(TArray &Agents, const TArray &Actors, uint32 type) +{ + for (auto &&Actor : Actors) { + Agents.Emplace(); + auto &values = Agents.Last(); + values.id = GetTypeHash(Actor); + values.type = type; + Set(values.transform, Actor->GetActorTransform()); + SetBoxAndSpeed(values, Actor); + } +} + +static void GetAgentInfo( + const ACarlaGameState &GameState, + TArray &Agents) +{ + auto *WalkerSpawner = GameState.GetWalkerSpawner(); + auto *VehicleSpawner = GameState.GetVehicleSpawner(); + + uint32 NumberOfAgents = 0u; + if (WalkerSpawner != nullptr) { + NumberOfAgents += WalkerSpawner->GetCurrentNumberOfWalkers(); + } + if (VehicleSpawner != nullptr) { + NumberOfAgents += VehicleSpawner->GetNumberOfSpawnedVehicles(); + } + Agents.Reserve(NumberOfAgents); + + if (WalkerSpawner != nullptr) { + AddAgents(Agents, WalkerSpawner->GetWalkersWhiteList(), CARLA_SERVER_AGENT_PEDESTRIAN); + AddAgents(Agents, WalkerSpawner->GetWalkersBlackList(), CARLA_SERVER_AGENT_PEDESTRIAN); + } + if (VehicleSpawner != nullptr) { + AddAgents(Agents, VehicleSpawner->GetVehicles(), CARLA_SERVER_AGENT_VEHICLE); + } +} + +CarlaServer::ErrorCode CarlaServer::SendMeasurements( + const ACarlaGameState &GameState, + const ACarlaPlayerState &PlayerState) { // Measurements. carla_measurements values; @@ -197,6 +258,11 @@ CarlaServer::ErrorCode CarlaServer::SendMeasurements(const ACarlaPlayerState &Pl Set(player.intersection_otherlane, PlayerState.GetOtherLaneIntersectionFactor()); Set(player.intersection_offroad, PlayerState.GetOffRoadIntersectionFactor()); + TArray Agents; + GetAgentInfo(GameState, Agents); + values.non_player_agents = (Agents.Num() > 0 ? Agents.GetData() : nullptr); + values.number_of_non_player_agents = Agents.Num(); + // Images. const auto NumberOfImages = PlayerState.GetNumberOfImages(); TUniquePtr images; diff --git a/Source/Carla/Game/CarlaServer.h b/Source/Carla/Game/CarlaServer.h index dec0909e3..54cfc3cf8 100644 --- a/Source/Carla/Game/CarlaServer.h +++ b/Source/Carla/Game/CarlaServer.h @@ -36,7 +36,9 @@ public: ErrorCode ReadControl(ACarlaVehicleController &Player, bool bBlocking); - ErrorCode SendMeasurements(const ACarlaPlayerState &PlayerState); + ErrorCode SendMeasurements( + const ACarlaGameState &GameState, + const ACarlaPlayerState &PlayerState); private: diff --git a/Source/Carla/Game/MockGameController.cpp b/Source/Carla/Game/MockGameController.cpp index 188df3e43..85b02b209 100644 --- a/Source/Carla/Game/MockGameController.cpp +++ b/Source/Carla/Game/MockGameController.cpp @@ -6,7 +6,7 @@ MockGameController::MockGameController(const FMockGameControllerSettings &InSettings) : Settings(InSettings) {} -void MockGameController::Initialize(UCarlaSettings & CarlaSettings) +void MockGameController::Initialize(UCarlaSettings &CarlaSettings) { #if WITH_EDITOR if (Settings.bOverrideCarlaSettings) {