Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added Content/Materials/PP_Segmentation.uasset
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// Copyright 2020-2023 Rapyuta Robotics Co., Ltd.

#include "Sensors/RRROS2CameraComponent.h"

#include "BufferVisualizationData.h"

URRROS2CameraComponent::URRROS2CameraComponent()
Expand All @@ -21,44 +20,70 @@ void URRROS2CameraComponent::PreInitializePublisher(UROS2NodeComponent* InROS2No
{
SceneCaptureComponent->FOVAngle = CameraComponent->FieldOfView;
SceneCaptureComponent->OrthoWidth = CameraComponent->OrthoWidth;
SceneCaptureComponent->ShowFlags.SetTemporalAA(true);

RenderTarget = NewObject<UTextureRenderTarget2D>(this, UTextureRenderTarget2D::StaticClass());

// Set capture source and image properties based on camera type
if (CameraType == EROS2CameraType::RGB)
{
SceneCaptureComponent->CaptureSource = ESceneCaptureSource::SCS_FinalColorHDR;
RenderTarget = NewObject<UTextureRenderTarget2D>(this, UTextureRenderTarget2D::StaticClass());
SceneCaptureComponent->CaptureSource = ESceneCaptureSource::SCS_SceneColorHDR;

RenderTarget->RenderTargetFormat = ETextureRenderTargetFormat::RTF_RGBA8;
RenderTarget->InitCustomFormat(Width, Height, EPixelFormat::PF_B8G8R8A8, true);

Data.Encoding = TEXT("bgr8");
Data.Step = Width * 3;
Data.Data.AddUninitialized(Width * Height * 3);
}
else if (CameraType == EROS2CameraType::DEPTH)
{
CameraComponent->PostProcessSettings.WeightedBlendables.Array.Add(
FWeightedBlendable(1.0f, GetBufferVisualizationData().GetMaterial(TEXT("SceneDepth"))));
FWeightedBlendable(1.0f, GetBufferVisualizationData().GetMaterial(TEXT("SceneDepth")))
);
SceneCaptureComponent->PostProcessSettings = CameraComponent->PostProcessSettings;
SceneCaptureComponent->CaptureSource = ESceneCaptureSource::SCS_SceneDepth;

RenderTarget = NewObject<UTextureRenderTarget2D>(this, UTextureRenderTarget2D::StaticClass());
RenderTarget->RenderTargetFormat = ETextureRenderTargetFormat::RTF_RGBA32f;
RenderTarget->InitCustomFormat(Width, Height, EPixelFormat::PF_FloatRGBA, false);

Data.Encoding = TEXT("32FC1");
Data.Step = Width * 4;
Data.Data.AddUninitialized(Width * Height * 4);
}
else if (CameraType == EROS2CameraType::SEGMENT)
{
SceneCaptureComponent->CaptureSource = ESceneCaptureSource::SCS_FinalColorLDR;
SceneCaptureComponent->ShowFlags.SetPostProcessing(true);

// material reference: /Script/Engine.Material'/RapyutaSimulationPlugins/Materials/PP_Segmentation.PP_Segmentation'
UMaterial* PostProcessMaterial = LoadObject<UMaterial>(nullptr, TEXT("/RapyutaSimulationPlugins/Materials/PP_Segmentation.PP_Segmentation"));

if(PostProcessMaterial){ // check nullptr
SceneCaptureComponent->AddOrUpdateBlendable(PostProcessMaterial);
} else {
UE_LOG(LogTemp, Log, TEXT("No PostProcessMaterial is assigend"));
}

RenderTarget->RenderTargetFormat = ETextureRenderTargetFormat::RTF_RGBA8;
RenderTarget->InitCustomFormat(Width, Height, EPixelFormat::PF_B8G8R8A8, true);

Data.Encoding = TEXT("bgr8");
Data.Step = Width * 3;
Data.Data.AddUninitialized(Width * Height * 3);
}

// Common setup
SceneCaptureComponent->TextureTarget = RenderTarget;
Data.Header.FrameId = FrameId;
Data.Width = Width;
Data.Height = Height;
Data.Data.AddUninitialized(Width * Height * (CameraType == EROS2CameraType::RGB ? 3 : 4));
QueueSize = QueueSize < 1 ? 1 : QueueSize; // QueueSize should be more than 1
Super::PreInitializePublisher(InROS2Node, InTopicName);
}

void URRROS2CameraComponent::SensorUpdate()
{
if (Render)
{
if (Render) {
SceneCaptureComponent->CaptureScene();
CaptureNonBlocking();
}
Expand Down Expand Up @@ -94,18 +119,19 @@ void URRROS2CameraComponent::CaptureNonBlocking()
FIntRect rect(0, 0, renderTargetResource->GetSizeXY().X, renderTargetResource->GetSizeXY().Y);
FReadSurfaceDataFlags flags(RCM_UNorm, CubeFace_MAX);

if (CameraType == EROS2CameraType::RGB)
if (CameraType == EROS2CameraType::RGB || CameraType == EROS2CameraType::SEGMENT)
{
FReadSurfaceContextRGB readSurfaceContext = {renderTargetResource, &(renderRequest->Image), rect, flags};

ENQUEUE_RENDER_COMMAND(SceneDrawCompletion)
(
[readSurfaceContext, this](FRHICommandListImmediate& RHICmdList)
{
RHICmdList.ReadSurfaceData(readSurfaceContext.SrcRenderTarget->GetRenderTargetTexture(),
readSurfaceContext.Rect,
*readSurfaceContext.OutData,
readSurfaceContext.Flags);
RHICmdList.ReadSurfaceData(
readSurfaceContext.SrcRenderTarget->GetRenderTargetTexture(),
readSurfaceContext.Rect,
*readSurfaceContext.OutData,
readSurfaceContext.Flags);
});
}
else if (CameraType == EROS2CameraType::DEPTH)
Expand All @@ -116,10 +142,11 @@ void URRROS2CameraComponent::CaptureNonBlocking()
(
[readSurfaceContext, this](FRHICommandListImmediate& RHICmdList)
{
RHICmdList.ReadSurfaceFloatData(readSurfaceContext.SrcRenderTarget->GetRenderTargetTexture(),
readSurfaceContext.Rect,
*readSurfaceContext.Depth,
readSurfaceContext.Flags);
RHICmdList.ReadSurfaceFloatData(
readSurfaceContext.SrcRenderTarget->GetRenderTargetTexture(),
readSurfaceContext.Rect,
*readSurfaceContext.Depth,
readSurfaceContext.Flags);
});
}

Expand All @@ -140,26 +167,25 @@ void URRROS2CameraComponent::CaptureNonBlocking()

FROSImg URRROS2CameraComponent::GetROS2Data()
{
if (!RenderRequestQueue.IsEmpty())
{
if (!RenderRequestQueue.IsEmpty()) {
// Timestamp
Data.Header.Stamp = URRConversionUtils::FloatToROSStamp(UGameplayStatics::GetTimeSeconds(GetWorld()));
// Peek the next RenderRequest from queue
FRenderRequest* nextRenderRequest = nullptr;
RenderRequestQueue.Peek(nextRenderRequest);
if (nextRenderRequest && nextRenderRequest->RenderFence.IsFenceComplete())
{
if (CameraType == EROS2CameraType::RGB)
if (CameraType == EROS2CameraType::RGB || CameraType == EROS2CameraType::SEGMENT)
{
// Process RGB data
for (int i = 0; i < nextRenderRequest->Image.Num(); i++)
for (int i = 0; i < nextRenderRequest->Image.Num(); i++)
{
Data.Data[i * 3 + 0] = nextRenderRequest->Image[i].B;
Data.Data[i * 3 + 1] = nextRenderRequest->Image[i].G;
Data.Data[i * 3 + 2] = nextRenderRequest->Image[i].R;
}
}
else if (CameraType == EROS2CameraType::DEPTH)
else if (CameraType == EROS2CameraType::DEPTH)
{
// Process Depth data
for (int i = 0; i < nextRenderRequest->Depth.Num(); i++)
Expand All @@ -174,11 +200,12 @@ FROSImg URRROS2CameraComponent::GetROS2Data()
QueueCount--;
delete nextRenderRequest;
}

}
return Data;
}

void URRROS2CameraComponent::SetROS2Msg(UROS2GenericMsg* InMessage)
{
CastChecked<UROS2ImgMsg>(InMessage)->SetMsg(GetROS2Data());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ UENUM(BlueprintType)
enum class EROS2CameraType : uint8
{
RGB UMETA(DisplayName = "RGB"),
DEPTH UMETA(DisplayName = "Depth")
DEPTH UMETA(DisplayName = "Depth"),
SEGMENT UMETA(DisplayName = "Segment")
};

/**
Expand Down Expand Up @@ -115,6 +116,7 @@ class RAPYUTASIMULATIONPLUGINS_API URRROS2CameraComponent : public URRROS2BaseSe
UPROPERTY(EditAnywhere, BlueprintReadWrite)
EROS2CameraType CameraType = EROS2CameraType::RGB;

// Allow to disable rendering (for performance, it still publishes still image)
UPROPERTY(EditAnywhere, BlueprintReadWrite)
bool Render = true;

Expand Down