Add bounding box to pedestrians

This commit is contained in:
nsubiron 2019-01-17 16:42:08 +01:00
parent aec58e7357
commit 4235da52a2
6 changed files with 108 additions and 18 deletions

View File

@ -11,6 +11,10 @@
#include "carla/geom/Location.h"
#include "carla/geom/Vector3D.h"
#ifdef LIBCARLA_INCLUDED_FROM_UE4
# include "Carla/Util/BoundingBox.h"
#endif // LIBCARLA_INCLUDED_FROM_UE4
namespace carla {
namespace geom {
@ -39,9 +43,9 @@ namespace geom {
#ifdef LIBCARLA_INCLUDED_FROM_UE4
BoundingBox(const FVector &Origin, const FVector &BoxExtent)
: location(Origin),
extent(1e-2f * BoxExtent.X, 1e-2f * BoxExtent.Y, 1e-2f * BoxExtent.Z) {}
BoundingBox(const FBoundingBox &Box)
: location(Box.Origin),
extent(1e-2f * Box.Extent.X, 1e-2f * Box.Extent.Y, 1e-2f * Box.Extent.Z) {}
#endif // LIBCARLA_INCLUDED_FROM_UE4

View File

@ -76,6 +76,7 @@ void export_actor() {
;
class_<cc::Walker, bases<cc::Actor>, boost::noncopyable, boost::shared_ptr<cc::Walker>>("Walker", no_init)
.add_property("bounding_box", CALL_RETURNING_COPY(cc::Walker, GetBoundingBox))
.def("apply_control", &cc::Walker::ApplyControl, (arg("control")))
.def("get_control", &cc::Walker::GetWalkerControl)
.def(self_ns::str(self_ns::self))

View File

@ -8,6 +8,7 @@
#include "Carla/Server/TheNewCarlaServer.h"
#include "Carla/Sensor/Sensor.h"
#include "Carla/Util/BoundingBoxCalculator.h"
#include "Carla/Util/DebugShapeDrawer.h"
#include "Carla/Util/OpenDrive.h"
#include "Carla/Vehicle/CarlaWheeledVehicle.h"
@ -114,30 +115,17 @@ private:
::AttachActors(Child.GetActor(), Parent.GetActor());
}
carla::geom::BoundingBox GetActorBoundingBox(const AActor &Actor)
{
/// @todo Bounding boxes only available for vehicles.
auto Vehicle = Cast<ACarlaWheeledVehicle>(&Actor);
if (Vehicle != nullptr)
{
FVector Location = Vehicle->GetVehicleBoundingBoxTransform().GetTranslation();
FVector Extent = Vehicle->GetVehicleBoundingBoxExtent();
return {Location, Extent};
}
return {};
}
public:
carla::rpc::Actor SerializeActor(FActorView ActorView)
{
carla::rpc::Actor Actor;
Actor.id = ActorView.GetActorId();
if (ActorView.IsValid())
if (ActorView.IsValid() && !ActorView.GetActor()->IsPendingKill())
{
Actor.parent_id = Episode->GetActorRegistry().Find(ActorView.GetActor()->GetOwner()).GetActorId();
Actor.description = *ActorView.GetActorDescription();
Actor.bounding_box = GetActorBoundingBox(*ActorView.GetActor());
Actor.bounding_box = UBoundingBoxCalculator::GetActorBoundingBox(ActorView.GetActor());
Actor.semantic_tags.reserve(ActorView.GetSemanticTags().Num());
using tag_t = decltype(Actor.semantic_tags)::value_type;
for (auto &&Tag : ActorView.GetSemanticTags())

View File

@ -0,0 +1,23 @@
// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
// de Barcelona (UAB).
//
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
#pragma once
#include "BoundingBox.generated.h"
USTRUCT(BlueprintType)
struct CARLA_API FBoundingBox
{
GENERATED_BODY()
/// Origin of the bounding box relative to its owner.
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FVector Origin = {0.0f, 0.0f, 0.0f};
/// Radii extent of the bounding box.
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FVector Extent = {0.0f, 0.0f, 0.0f};
};

View File

@ -0,0 +1,44 @@
// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
// de Barcelona (UAB).
//
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
#include "Carla.h"
#include "Carla/Util/BoundingBoxCalculator.h"
#include "Carla/Vehicle/CarlaWheeledVehicle.h"
#include "Components/CapsuleComponent.h"
#include "GameFramework/Character.h"
FBoundingBox UBoundingBoxCalculator::GetActorBoundingBox(const AActor *Actor)
{
if (Actor != nullptr)
{
// Vehicle.
auto Vehicle = Cast<ACarlaWheeledVehicle>(Actor);
if (Vehicle != nullptr)
{
FVector Origin = Vehicle->GetVehicleBoundingBoxTransform().GetTranslation();
FVector Extent = Vehicle->GetVehicleBoundingBoxExtent();
return {Origin, Extent};
}
// Walker.
auto Character = Cast<ACharacter>(Actor);
if (Character != nullptr)
{
auto Capsule = Character->GetCapsuleComponent();
if (Capsule != nullptr)
{
const auto Radius = Capsule->GetScaledCapsuleRadius();
const auto HalfHeight = Capsule->GetScaledCapsuleHalfHeight();
// Characters have the pivot point centered.
FVector Origin = {0.0f, 0.0f, 0.0f};
FVector Extent = {Radius, Radius, HalfHeight};
return {Origin, Extent};
}
}
}
return {};
}

View File

@ -0,0 +1,30 @@
// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
// de Barcelona (UAB).
//
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
#pragma once
#include "Carla/Util/BoundingBox.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "BoundingBoxCalculator.generated.h"
class AActor;
UCLASS()
class CARLA_API UBoundingBoxCalculator : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/// Compute the bounding box of the given Carla actor.
///
/// @warning If the actor type is not supported a default initialized bounding
/// box is returned.
UFUNCTION(Category = "Carla Actor", BlueprintCallable)
static FBoundingBox GetActorBoundingBox(const AActor *Actor);
};