Retrieve sensor definition from static function

This commit is contained in:
nsubiron 2018-09-29 19:35:28 +02:00
parent cca42fd618
commit 93809422bd
9 changed files with 106 additions and 30 deletions

View File

@ -32,6 +32,7 @@ namespace detail {
template <size_t Index>
struct get_by_index {
using type = void;
using key = void;
};
};
@ -64,6 +65,12 @@ namespace detail {
Value,
typename CompileTimeTypeMapImpl<Size, Rest...>::template get_by_index<Index>::type
>::type;
using key = typename std::conditional<
Index == current_index(),
Key,
typename CompileTimeTypeMapImpl<Size, Rest...>::template get_by_index<Index>::key
>::type;
};
};

View File

@ -4,12 +4,19 @@
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
#pragma once
#ifndef LIBCARLA_SENSOR_REGISTRY_INCLUDE_H
#define LIBCARLA_SENSOR_REGISTRY_INCLUDE_H
#include "carla/sensor/CompositeSerializer.h"
// =============================================================================
// Follow the 4 steps to register a new sensor.
// =============================================================================
// 1. Include the serializer here.
#include "carla/sensor/s11n/ImageSerializer.h"
// 2. Add a forward-declaration of the sensor here.
class ADepthCamera;
class ASceneCaptureCamera;
class ASemanticSegmentationCamera;
@ -17,6 +24,9 @@ class ASemanticSegmentationCamera;
namespace carla {
namespace sensor {
// 3. Register the sensor and its serializer in the SensorRegistry.
/// Contains a registry of all the sensors available.
using SensorRegistry = CompositeSerializer<
std::pair<ASceneCaptureCamera *, s11n::ImageSerializer>,
std::pair<ADepthCamera *, s11n::ImageSerializer>,
@ -25,3 +35,14 @@ namespace sensor {
} // namespace sensor
} // namespace carla
#endif // LIBCARLA_SENSOR_REGISTRY_INCLUDE_H
#ifdef LIBCARLA_SENSOR_REGISTRY_WITH_SENSOR_INCLUDES
// 4. Include the sensor here.
#include "Carla/Sensor/DepthCamera.h"
#include "Carla/Sensor/SceneCaptureCamera.h"
#include "Carla/Sensor/SemanticSegmentationCamera.h"
#endif // LIBCARLA_SENSOR_REGISTRY_WITH_SENSOR_INCLUDES

View File

@ -185,14 +185,23 @@ bool UActorBlueprintFunctionLibrary::CheckActorDefinitions(const TArray<FActorDe
/// -- Helpers to create actor definitions -------------------------------------
/// ============================================================================
FActorDefinition UActorBlueprintFunctionLibrary::MakeCameraDefinition(
const FString &Id)
{
FActorDefinition Definition;
bool Success;
MakeCameraDefinition(Id, Success, Definition);
check(Success);
return Definition;
}
void UActorBlueprintFunctionLibrary::MakeCameraDefinition(
const FCameraParameters &Parameters,
const FString &Id,
bool &Success,
FActorDefinition &Definition)
{
Definition.Id = JoinStrings(TEXT("."), TEXT("sensor"), Parameters.Id).ToLower();
Definition.Class = Parameters.Class;
Definition.Tags = JoinStrings(TEXT(","), TEXT("sensor"), Parameters.Id).ToLower();
Definition.Id = JoinStrings(TEXT("."), TEXT("sensor"), Id).ToLower();
Definition.Tags = JoinStrings(TEXT(","), TEXT("sensor"), Id).ToLower();
// FOV.
FActorVariation FOV;
FOV.Id = TEXT("fov");

View File

@ -13,18 +13,6 @@
#include "ActorBlueprintFunctionLibrary.generated.h"
USTRUCT(BlueprintType)
struct CARLA_API FCameraParameters
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString Id;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TSubclassOf<AActor> Class;
};
USTRUCT(BlueprintType)
struct CARLA_API FVehicleParameters
{
@ -73,9 +61,11 @@ public:
/// ==========================================================================
/// @{
static FActorDefinition MakeCameraDefinition(const FString &Id);
UFUNCTION(Category = "Carla Actor", BlueprintCallable)
static void MakeCameraDefinition(
const FCameraParameters &Parameters,
const FString &Id,
bool &Success,
FActorDefinition &Definition);

View File

@ -18,6 +18,11 @@ class CARLA_API ADepthCamera : public AShaderBasedSensor
public:
static FActorDefinition GetSensorDefinition()
{
return UActorBlueprintFunctionLibrary::MakeCameraDefinition(TEXT("depth_camera"));
}
ADepthCamera(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{

View File

@ -18,6 +18,11 @@ class CARLA_API ASceneCaptureCamera : public ASceneCaptureSensor
public:
static FActorDefinition GetSensorDefinition()
{
return UActorBlueprintFunctionLibrary::MakeCameraDefinition(TEXT("camera"));
}
using ASceneCaptureSensor::EnablePostProcessingEffects;
protected:

View File

@ -18,6 +18,11 @@ class CARLA_API ASemanticSegmentationCamera : public AShaderBasedSensor
public:
static FActorDefinition GetSensorDefinition()
{
return UActorBlueprintFunctionLibrary::MakeCameraDefinition(TEXT("semseg_camera"));
}
ASemanticSegmentationCamera(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{

View File

@ -10,19 +10,52 @@
#include "Carla/Actor/ActorBlueprintFunctionLibrary.h"
#include "Carla/Sensor/SceneCaptureCamera.h"
TArray<FActorDefinition> ADeprecatedSensorFactory::GetDefinitions()
#include <compiler/disable-ue4-macros.h>
#include <carla/sensor/SensorRegistry.h>
#include <compiler/enable-ue4-macros.h>
#define LIBCARLA_SENSOR_REGISTRY_WITH_SENSOR_INCLUDES
#include <carla/sensor/SensorRegistry.h>
#undef LIBCARLA_SENSOR_REGISTRY_WITH_SENSOR_INCLUDES
/// Call GetSensorDefinition() on each sensor registered in the SensorRegistry.
class FSensorDefinitionGatherer
{
FActorDefinition Cameras;
bool Success = false;
UActorBlueprintFunctionLibrary::MakeCameraDefinition(
{TEXT("camera"), ASceneCaptureCamera::StaticClass()},
Success,
Cameras);
check(Success);
return {Cameras};
using Registry = carla::sensor::SensorRegistry;
template <size_t Index>
static void Append_impl(TArray<FActorDefinition> &Definitions)
{
using SensorPtrType = typename Registry::get_by_index<Index>::key;
using SensorType = typename std::remove_pointer<SensorPtrType>::type;
auto Def = SensorType::GetSensorDefinition();
Def.Class = SensorType::StaticClass();
Definitions.Add(Def);
}
template <size_t... Is>
static void Append_impl(
TArray<FActorDefinition> &Definitions,
std::index_sequence<Is...>)
{
std::initializer_list<int> ({(Append_impl<Is>(Definitions), 0)...});
}
public:
static void AppendSensorDefinitions(TArray<FActorDefinition> &Definitions)
{
Append_impl(Definitions, std::make_index_sequence<Registry::size()>());
}
};
TArray<FActorDefinition> ASensorFactory::GetDefinitions()
{
TArray<FActorDefinition> Definitions;
FSensorDefinitionGatherer::AppendSensorDefinitions(Definitions);
return Definitions;
}
FActorSpawnResult ADeprecatedSensorFactory::SpawnActor(
FActorSpawnResult ASensorFactory::SpawnActor(
const FTransform &Transform,
const FActorDescription &Description)
{
@ -32,7 +65,8 @@ FActorSpawnResult ADeprecatedSensorFactory::SpawnActor(
{
return {};
}
auto *Sensor = World->SpawnActorDeferred<ASceneCaptureCamera>(
/// @todo Here we may spawn something else than a scene capture.
auto *Sensor = World->SpawnActorDeferred<ASceneCaptureSensor>(
Description.Class,
Transform,
this,

View File

@ -13,7 +13,7 @@
/// Object in charge of spawning sensors.
UCLASS()
class CARLA_API ADeprecatedSensorFactory : public ACarlaActorFactory
class CARLA_API ASensorFactory : public ACarlaActorFactory
{
GENERATED_BODY()