#6 Add camera settings and implement stereo mode

This commit is contained in:
nsubiron 2017-04-05 14:16:24 +02:00
parent f2aa3da9b7
commit 43ed5fd6a0
10 changed files with 254 additions and 57 deletions

View File

@ -16,7 +16,37 @@ ReadPort=2002
[CARLA/SceneCapture]
; Valid values: Mono, Stereo, NoCapture.
; The mode is overriden by the client if networking is enabled.
Mode=Mono
; Size of the captured image in pixels.
ImageSizeX=720
ImageSizeY=512
[CARLA/SceneCapture/Mono]
; Image size can also be changed by mode.
ImageSizeX=720
ImageSizeY=512
; Position of the camera relative to the car in centimeters.
CameraPositionX=170
CameraPositionY=0
CameraPositionZ=150
; Rotation of the camera relative to the car in degrees.
CameraRotationPitch=0
CameraRotationRoll=0
CameraRotationYaw=0
[CARLA/SceneCapture/Stereo]
; Position of the cameras relative to the car in centimeters.
Camera0PositionX=170
Camera0PositionY=30
Camera0PositionZ=150
Camera1PositionX=170
Camera1PositionY=-30
Camera1PositionZ=150
; Rotation of the cameras relative to the car in degrees.
Camera0RotationPitch=0
Camera0RotationRoll=0
Camera0RotationYaw=0
Camera1RotationPitch=0
Camera1RotationRoll=0
Camera1RotationYaw=0

View File

@ -6,6 +6,7 @@
#include "GameFramework/PlayerStart.h"
#include "CarlaPlayerState.h"
#include "CarlaSettings.h"
#include "CarlaVehicleController.h"
#include "SceneCaptureCamera.h"
@ -81,7 +82,7 @@ static bool CheckImageValidity(const ACarlaPlayerState &Player, const carla::Rew
// Wait for the scene init to be sent, return false if we need to restart the
// server.
/// @todo At the moment we just ignored what it is sent.
static bool ReadSceneInit(carla::CarlaServer &Server)
static bool ReadSceneInit(carla::CarlaServer &Server, ESceneCaptureMode &CaptureMode)
{
carla::Mode Mode;
uint32 Scene;
@ -91,6 +92,13 @@ static bool ReadSceneInit(carla::CarlaServer &Server)
if (!Server.tryReadSceneInit(Mode, Scene, Success))
return false;
}
if (Mode == carla::Mode::MONO) {
CaptureMode = ESceneCaptureMode::Mono;
} else if (Mode == carla::Mode::STEREO) {
CaptureMode = ESceneCaptureMode::Stereo;
} else {
CaptureMode = ESceneCaptureMode::NoCapture;
}
return true;
}
@ -200,11 +208,11 @@ CarlaGameController::~CarlaGameController()
UE_LOG(LogCarlaServer, Log, TEXT("Destroying CarlaGameController..."));
}
void CarlaGameController::Initialize()
void CarlaGameController::Initialize(UCarlaSettings &CarlaSettings)
{
if (bServerNeedsRestart) {
UE_LOG(LogCarlaServer, Log, TEXT("Initializing CarlaServer"));
if (Server->init(1u) && ReadSceneInit(*Server)) {
if (Server->init(1u) && ReadSceneInit(*Server, CarlaSettings.SceneCaptureMode)) {
bServerNeedsRestart = false;
} else {
UE_LOG(LogCarlaServer, Warning, TEXT("Failed to initialize, server needs restart"));

View File

@ -19,7 +19,7 @@ public:
~CarlaGameController();
virtual void Initialize() override;
virtual void Initialize(UCarlaSettings &CarlaSettings) override;
virtual APlayerStart *ChoosePlayerStart(const TArray<APlayerStart *> &AvailableStartSpots) override;

View File

@ -6,6 +6,7 @@
class AController;
class APlayerStart;
class UCarlaSettings;
/// Base class for a CARLA game controller.
class CARLA_API CarlaGameControllerBase
@ -14,7 +15,7 @@ public:
virtual ~CarlaGameControllerBase() {}
virtual void Initialize() = 0;
virtual void Initialize(UCarlaSettings &CarlaSettings) = 0;
virtual APlayerStart *ChoosePlayerStart(const TArray<APlayerStart *> &AvailableStartSpots) = 0;

View File

@ -8,9 +8,8 @@
class UCarlaSettings;
/**
*
*/
/// The game instance contains elements that must be kept alive in between
/// levels. It is instantiate once per game.
UCLASS()
class CARLA_API UCarlaGameInstance : public UGameInstance
{
@ -30,6 +29,12 @@ public:
return *GameController;
}
UCarlaSettings &GetCarlaSettings()
{
check(CarlaSettings != nullptr);
return *CarlaSettings;
}
const UCarlaSettings &GetCarlaSettings() const
{
check(CarlaSettings != nullptr);

View File

@ -43,7 +43,8 @@ void ACarlaGameMode::InitGame(
TEXT("GameInstance is not a UCarlaGameInstance, did you forget to set it in the project settings?"));
GameInstance->InitializeGameControllerIfNotPresent();
GameController = &GameInstance->GetGameController();
GameController->Initialize();
GameController->Initialize(GameInstance->GetCarlaSettings());
GameInstance->GetCarlaSettings().LogSettings();
}
void ACarlaGameMode::RestartPlayer(AController* NewPlayer)
@ -85,7 +86,7 @@ void ACarlaGameMode::RegisterPlayer(AController &NewPlayer)
AddTickPrerequisiteActor(&NewPlayer);
GameController->RegisterPlayer(NewPlayer);
PlayerController = &NewPlayer;
AttachCaptureCamerasToPlayer(NewPlayer);
AttachCaptureCamerasToPlayer(*PlayerController);
}
void ACarlaGameMode::RegisterCaptureCamera(
@ -101,18 +102,72 @@ void ACarlaGameMode::RegisterCaptureCamera(
}
}
static ASceneCaptureCamera *SpawnAndAttachCamera(
AController &Player,
const FVector &RelativeLocation,
const FRotator &RelativeRotation,
uint32 ImageSizeX,
uint32 ImageSizeY,
EPostProcessEffect PostProcessEffect)
{
auto Camera = Player.GetWorld()->SpawnActor<ASceneCaptureCamera>(RelativeLocation, RelativeRotation);
Camera->SetImageSize(ImageSizeX, ImageSizeY);
Camera->SetPostProcessEffect(PostProcessEffect);
Camera->AttachToActor(Player.GetPawn(), FAttachmentTransformRules::KeepRelativeTransform);
Camera->SetOwner(Player.GetPawn());
return Camera;
}
void ACarlaGameMode::AttachCaptureCamerasToPlayer(AController &Player)
{
auto &Settings = GameInstance->GetCarlaSettings();
if (Settings.SceneCaptureMode == ESceneCaptureMode::Stereo) {
UE_LOG(LogCarla, Error, TEXT("Stereo mode not yet implemented"));
} else if (Settings.SceneCaptureMode == ESceneCaptureMode::Mono) {
auto TheCamera = GetWorld()->SpawnActor<ASceneCaptureCamera>();
TheCamera->SetPostProcessEffect(EPostProcessEffect::None);
TheCamera->SetImageSize(Settings.ImageSizeX, Settings.ImageSizeY);
TheCamera->AttachToActor(Player.GetPawn(), FAttachmentTransformRules::KeepRelativeTransform);
TheCamera->SetOwner(Player.GetPawn());
if (Settings.SceneCaptureMode == ESceneCaptureMode::Mono) {
auto TheCamera =
SpawnAndAttachCamera(
Player,
Settings.Mono_CameraPosition,
Settings.Mono_CameraRotation,
Settings.Mono_ImageSizeX,
Settings.Mono_ImageSizeY,
EPostProcessEffect::None);
RegisterCaptureCamera(*TheCamera, Player);
} else if (Settings.SceneCaptureMode == ESceneCaptureMode::Stereo) {
auto RGBCamera0 =
SpawnAndAttachCamera(
Player,
Settings.Stereo_Camera0Position,
Settings.Stereo_Camera0Rotation,
Settings.Stereo_ImageSizeX,
Settings.Stereo_ImageSizeY,
EPostProcessEffect::None);
auto DepthCamera0 =
SpawnAndAttachCamera(
Player,
Settings.Stereo_Camera0Position,
Settings.Stereo_Camera0Rotation,
Settings.Stereo_ImageSizeX,
Settings.Stereo_ImageSizeY,
EPostProcessEffect::Depth);
auto RGBCamera1 =
SpawnAndAttachCamera(
Player,
Settings.Stereo_Camera1Position,
Settings.Stereo_Camera1Rotation,
Settings.Stereo_ImageSizeX,
Settings.Stereo_ImageSizeY,
EPostProcessEffect::None);
auto DepthCamera1 =
SpawnAndAttachCamera(
Player,
Settings.Stereo_Camera1Position,
Settings.Stereo_Camera1Rotation,
Settings.Stereo_ImageSizeX,
Settings.Stereo_ImageSizeY,
EPostProcessEffect::Depth);
RegisterCaptureCamera(*RGBCamera0, Player);
RegisterCaptureCamera(*DepthCamera0, Player);
RegisterCaptureCamera(*RGBCamera1, Player);
RegisterCaptureCamera(*DepthCamera1, Player);
}
}

View File

@ -8,15 +8,27 @@
#include <limits>
// INI file sections.
#define S_CARLA_SERVER TEXT("CARLA/Server")
#define S_CARLA_SCENECAPTURE TEXT("CARLA/SceneCapture")
#define S_CARLA_SCENECAPTURE_MONO TEXT("CARLA/SceneCapture/Mono")
#define S_CARLA_SCENECAPTURE_STEREO TEXT("CARLA/SceneCapture/Stereo")
template <typename TARGET, typename SOURCE>
static void SafeCastTo(SOURCE source, TARGET &target)
{
if ((source >= std::numeric_limits<TARGET>::min()) &&
if ((source >= std::numeric_limits<TARGET>::lowest()) &&
(source <= std::numeric_limits<TARGET>::max())) {
target = static_cast<TARGET>(source);
} else {
UE_LOG(LogCarla, Error, TEXT("CarlaSettings: Type cast failed"));
}
}
// =============================================================================
// -- INIFile ------------------------------------------------------------------
// =============================================================================
class INIFile {
public:
@ -69,19 +81,49 @@ private:
FConfigFile ConfigFile;
};
#define CARLA_SERVER_SECTION TEXT("CARLA/Server")
#define CARLA_SCENECAPTURE_SECTION TEXT("CARLA/SceneCapture")
// =============================================================================
// -- Other static methods -----------------------------------------------------
// =============================================================================
static void LoadSettingsFromFile(const FString &FileName, UCarlaSettings &Settings)
{
UE_LOG(LogCarla, Log, TEXT("Loading settings from \"%s\""), *FileName);
INIFile ConfigFile(FileName);
ConfigFile.GetBool(CARLA_SERVER_SECTION, TEXT("UseNetworking"), Settings.bUseNetworking);
ConfigFile.GetInt(CARLA_SERVER_SECTION, TEXT("WorldPort"), Settings.WorldPort);
ConfigFile.GetInt(CARLA_SERVER_SECTION, TEXT("WritePort"), Settings.WritePort);
ConfigFile.GetInt(CARLA_SERVER_SECTION, TEXT("ReadPort"), Settings.ReadPort);
ConfigFile.GetSceneCaptureMode(CARLA_SCENECAPTURE_SECTION, TEXT("Mode"), Settings.SceneCaptureMode);
ConfigFile.GetInt(CARLA_SCENECAPTURE_SECTION, TEXT("ImageSizeX"), Settings.ImageSizeX);
ConfigFile.GetInt(CARLA_SCENECAPTURE_SECTION, TEXT("ImageSizeY"), Settings.ImageSizeY);
// CarlaServer.
ConfigFile.GetBool(S_CARLA_SERVER, TEXT("UseNetworking"), Settings.bUseNetworking);
ConfigFile.GetInt(S_CARLA_SERVER, TEXT("WorldPort"), Settings.WorldPort);
ConfigFile.GetInt(S_CARLA_SERVER, TEXT("WritePort"), Settings.WritePort);
ConfigFile.GetInt(S_CARLA_SERVER, TEXT("ReadPort"), Settings.ReadPort);
// SceneCapture.
ConfigFile.GetSceneCaptureMode(S_CARLA_SCENECAPTURE, TEXT("Mode"), Settings.SceneCaptureMode);
// SceneCapture - Mono.
ConfigFile.GetInt(S_CARLA_SCENECAPTURE, TEXT("ImageSizeX"), Settings.Mono_ImageSizeX);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE, TEXT("ImageSizeY"), Settings.Mono_ImageSizeY);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_MONO, TEXT("ImageSizeX"), Settings.Mono_ImageSizeX);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_MONO, TEXT("ImageSizeY"), Settings.Mono_ImageSizeY);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_MONO, TEXT("CameraPositionX"), Settings.Mono_CameraPosition.X);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_MONO, TEXT("CameraPositionY"), Settings.Mono_CameraPosition.Y);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_MONO, TEXT("CameraPositionZ"), Settings.Mono_CameraPosition.Z);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_MONO, TEXT("CameraRotationPitch"), Settings.Mono_CameraRotation.Pitch);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_MONO, TEXT("CameraRotationRoll"), Settings.Mono_CameraRotation.Roll);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_MONO, TEXT("CameraRotationYaw"), Settings.Mono_CameraRotation.Yaw);
// SceneCapture - Stereo.
ConfigFile.GetInt(S_CARLA_SCENECAPTURE, TEXT("ImageSizeX"), Settings.Stereo_ImageSizeX);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE, TEXT("ImageSizeY"), Settings.Stereo_ImageSizeY);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_STEREO, TEXT("ImageSizeX"), Settings.Stereo_ImageSizeX);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_STEREO, TEXT("ImageSizeY"), Settings.Stereo_ImageSizeY);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_STEREO, TEXT("Camera0PositionX"), Settings.Stereo_Camera0Position.X);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_STEREO, TEXT("Camera0PositionY"), Settings.Stereo_Camera0Position.Y);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_STEREO, TEXT("Camera0PositionZ"), Settings.Stereo_Camera0Position.Z);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_STEREO, TEXT("Camera1PositionX"), Settings.Stereo_Camera1Position.X);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_STEREO, TEXT("Camera1PositionY"), Settings.Stereo_Camera1Position.Y);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_STEREO, TEXT("Camera1PositionZ"), Settings.Stereo_Camera1Position.Z);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_STEREO, TEXT("Camera0RotationPitch"), Settings.Stereo_Camera0Rotation.Pitch);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_STEREO, TEXT("Camera0RotationRoll"), Settings.Stereo_Camera0Rotation.Roll);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_STEREO, TEXT("Camera0RotationYaw"), Settings.Stereo_Camera0Rotation.Yaw);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_STEREO, TEXT("Camera1RotationPitch"), Settings.Stereo_Camera1Rotation.Pitch);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_STEREO, TEXT("Camera1RotationRoll"), Settings.Stereo_Camera1Rotation.Roll);
ConfigFile.GetInt(S_CARLA_SCENECAPTURE_STEREO, TEXT("Camera1RotationYaw"), Settings.Stereo_Camera1Rotation.Yaw);
}
static bool GetSettingsFileName(FString &Value)
@ -101,6 +143,10 @@ static bool GetSettingsFileName(FString &Value)
return false;
}
// =============================================================================
// -- UCarlaSettings -----------------------------------------------------------
// =============================================================================
void UCarlaSettings::LoadSettings()
{
FString FileName;
@ -131,17 +177,27 @@ void UCarlaSettings::LogSettings()
};
UE_LOG(LogCarla, Log, TEXT("== CARLA Settings =============================================================="));
UE_LOG(LogCarla, Log, TEXT("Settings file: %s"), *CurrentFileName);
UE_LOG(LogCarla, Log, TEXT("[%s]"), CARLA_SERVER_SECTION);
UE_LOG(LogCarla, Log, TEXT("UseNetworking=%s"), (bUseNetworking ? TEXT("true") : TEXT("false")));
UE_LOG(LogCarla, Log, TEXT("WorldPort=%d"), WorldPort);
UE_LOG(LogCarla, Log, TEXT("WritePort=%d"), WritePort);
UE_LOG(LogCarla, Log, TEXT("ReadPort=%d"), ReadPort);
UE_LOG(LogCarla, Log, TEXT("[%s]"), CARLA_SCENECAPTURE_SECTION);
UE_LOG(LogCarla, Log, TEXT("Mode=%s"), ModeAsString(SceneCaptureMode));
UE_LOG(LogCarla, Log, TEXT("ImageSizeX=%d"), ImageSizeX);
UE_LOG(LogCarla, Log, TEXT("ImageSizeY=%d"), ImageSizeY);
UE_LOG(LogCarla, Log, TEXT("[%s]"), S_CARLA_SERVER);
UE_LOG(LogCarla, Log, TEXT("Use Networking = %s"), (bUseNetworking ? TEXT("true") : TEXT("false")));
UE_LOG(LogCarla, Log, TEXT("World Port = %d"), WorldPort);
UE_LOG(LogCarla, Log, TEXT("Write Port = %d"), WritePort);
UE_LOG(LogCarla, Log, TEXT("Read Port = %d"), ReadPort);
UE_LOG(LogCarla, Log, TEXT("[%s]"), S_CARLA_SCENECAPTURE);
UE_LOG(LogCarla, Log, TEXT("Mode = %s"), ModeAsString(SceneCaptureMode));
UE_LOG(LogCarla, Log, TEXT("[%s]"), S_CARLA_SCENECAPTURE_MONO);
UE_LOG(LogCarla, Log, TEXT("Image Size = %dx%d"), Mono_ImageSizeX, Mono_ImageSizeY);
UE_LOG(LogCarla, Log, TEXT("Camera Position = (%s)"), *Mono_CameraPosition.ToString());
UE_LOG(LogCarla, Log, TEXT("Camera Rotation = (%s)"), *Mono_CameraRotation.ToString());
UE_LOG(LogCarla, Log, TEXT("[%s]"), S_CARLA_SCENECAPTURE_STEREO);
UE_LOG(LogCarla, Log, TEXT("ImageSize = %dx%d"), Stereo_ImageSizeX, Stereo_ImageSizeY);
UE_LOG(LogCarla, Log, TEXT("Camera0 Position = (%s)"), *Stereo_Camera0Position.ToString());
UE_LOG(LogCarla, Log, TEXT("Camera0 Rotation = (%s)"), *Stereo_Camera0Rotation.ToString());
UE_LOG(LogCarla, Log, TEXT("Camera1 Position = (%s)"), *Stereo_Camera1Position.ToString());
UE_LOG(LogCarla, Log, TEXT("Camera1 Rotation = (%s)"), *Stereo_Camera1Rotation.ToString());
UE_LOG(LogCarla, Log, TEXT("================================================================================"));
}
#undef CARLA_SERVER_SECTION
#undef CARLA_SCENECAPTURE_SECTION
#undef S_CARLA_SERVER
#undef S_CARLA_SCENECAPTURE
#undef S_CARLA_SCENECAPTURE_MONO
#undef S_CARLA_SCENECAPTURE_STEREO

View File

@ -19,6 +19,14 @@ class CARLA_API UCarlaSettings : public UObject
{
GENERATED_BODY()
public:
/** Load the settings based on the command-line arguments and the INI file if provided. */
void LoadSettings();
/** Log settings values. */
void LogSettings();
private:
/** File name of the settings file used to load this settings. Empty if none used. */
@ -58,25 +66,59 @@ public:
UPROPERTY(Category = "Scene Capture", EditDefaultsOnly)
ESceneCaptureMode SceneCaptureMode = ESceneCaptureMode::Mono;
/** X size in pixels of the captured image. */
UPROPERTY(Category = "Scene Capture", EditDefaultsOnly)
uint32 ImageSizeX = 720u;
/** Y size in pixels of the captured image. */
UPROPERTY(Category = "Scene Capture", EditDefaultsOnly)
uint32 ImageSizeY = 512u;
/// @}
// ===========================================================================
// -- Other ------------------------------------------------------------------
/// @name Scene Capture - Mono
// ===========================================================================
/// @{
public:
/** Load the settings based on the command-line arguments and the INI file if provided . */
void LoadSettings();
/** X size in pixels of the captured image. */
UPROPERTY(Category = "Scene Capture|Mono", EditDefaultsOnly)
uint32 Mono_ImageSizeX = 720u;
/** Log settings values . */
void LogSettings();
/** Y size in pixels of the captured image. */
UPROPERTY(Category = "Scene Capture|Mono", EditDefaultsOnly)
uint32 Mono_ImageSizeY = 512u;
/** Camera position relative to the car. */
UPROPERTY(Category = "Scene Capture|Mono", EditDefaultsOnly)
FVector Mono_CameraPosition = {170.0f, 0.0f, 150.0f};
/** Camera rotation relative to the car. */
UPROPERTY(Category = "Scene Capture|Mono", EditDefaultsOnly)
FRotator Mono_CameraRotation = {0.0f, 0.0f, 0.0f};
/// @}
// ===========================================================================
/// @name Scene Capture - Stereo
// ===========================================================================
/// @{
public:
/** X size in pixels of the captured image. */
UPROPERTY(Category = "Scene Capture|Stereo", EditDefaultsOnly)
uint32 Stereo_ImageSizeX = 720u;
/** Y size in pixels of the captured image. */
UPROPERTY(Category = "Scene Capture|Stereo", EditDefaultsOnly)
uint32 Stereo_ImageSizeY = 512u;
/** Camera0 position relative to the car. */
UPROPERTY(Category = "Scene Capture|Stereo", EditDefaultsOnly)
FVector Stereo_Camera0Position = {170.0f, 30.0f, 150.0f};
/** Camera0 rotation relative to the car. */
UPROPERTY(Category = "Scene Capture|Stereo", EditDefaultsOnly)
FRotator Stereo_Camera0Rotation = {0.0f, 0.0f, 0.0f};
/** Camera1 position relative to the car. */
UPROPERTY(Category = "Scene Capture|Stereo", EditDefaultsOnly)
FVector Stereo_Camera1Position = {170.0f, -30.0f, 150.0f};
/** Camera1 rotation relative to the car. */
UPROPERTY(Category = "Scene Capture|Stereo", EditDefaultsOnly)
FRotator Stereo_Camera1Rotation = {0.0f, 0.0f, 0.0f};
/// @}
};

View File

@ -3,7 +3,7 @@
#include "Carla.h"
#include "MockGameController.h"
void MockGameController::Initialize()
void MockGameController::Initialize(UCarlaSettings & /*CarlaSettings*/)
{
}
@ -29,7 +29,7 @@ void MockGameController::BeginPlay()
}
void MockGameController::Tick(float DeltaSeconds)
void MockGameController::Tick(float /*DeltaSeconds*/)
{
}

View File

@ -9,7 +9,7 @@ class CARLA_API MockGameController : public CarlaGameControllerBase
{
public:
virtual void Initialize() override;
virtual void Initialize(UCarlaSettings &CarlaSettings) override;
virtual APlayerStart *ChoosePlayerStart(const TArray<APlayerStart *> &AvailableStartSpots) override;