9#include "CoreMinimal.h"
21 : Super(ObjectInitializer)
23 PrimaryActorTick.bCanEverTick =
true;
35 Super::SetOwner(NewOwner);
60 UE_LOG(LogCarla, Log, TEXT(
"ACollisionSensor::SetOwner New owner is not valid or you are destroying collision sensor") );
65 Super::PrePhysTick(DeltaSeconds);
73 [CurrentFrame](std::tuple<uint64_t, AActor*, AActor*> Item)
75 return std::get<0>(Item) < CurrentFrame;
83 FVector NormalImpulse,
84 const FHitResult &Hit)
88 UE_LOG(LogCarla, Error, TEXT(
"ACollisionSensor::OnActorCollisionEvent Error with collided actor; Not valid.\n Collider actor %s"),
89 *(
Actor->GetName()) );
95 UE_LOG(LogCarla, Error, TEXT(
"ACollisionSensor::OnActorCollisionEvent Error with collider actor; Not valid.\n Collided actor %s"),
96 *(OtherActor->GetName()) );
105 if (std::get<0>(
Collision) == CurrentFrame &&
114 constexpr float TO_METERS = 1e-2;
115 NormalImpulse *= TO_METERS;
118 CurrentEpisode.SerializeActor(
Actor),
119 CurrentEpisode.SerializeActor(OtherActor),
121 (
float)NormalImpulse.X,
122 (
float)NormalImpulse.Y,
123 (
float)NormalImpulse.Z));
126 if (CurrentEpisode.GetRecorder()->IsEnabled()){
127 CurrentEpisode.GetRecorder()->AddCollision(
Actor, OtherActor);
133#if defined(WITH_ROS2)
135 if (ROS2->IsEnabled())
137 TRACE_CPUPROFILER_EVENT_SCOPE_STR(
"ROS2 Send");
139 AActor* ParentActor = GetAttachParentActor();
142 FTransform LocalTransformRelativeToParent = GetActorTransform().GetRelativeTransform(ParentActor->GetActorTransform());
143 ROS2->ProcessDataFromCollisionSensor(0, StreamId, LocalTransformRelativeToParent, OtherActor->GetUniqueID(),
carla::geom::Vector3D{NormalImpulse.X, NormalImpulse.Y, NormalImpulse.Z},
this);
147 ROS2->ProcessDataFromCollisionSensor(0, StreamId, GetActorTransform(), OtherActor->GetUniqueID(),
carla::geom::Vector3D{NormalImpulse.X, NormalImpulse.Y, NormalImpulse.Z},
this);
156 FVector NormalImpulse,
157 const FHitResult &Hit)
166 FVector NormalImpulse,
167 const FHitResult& Hit)
UE_LOG(LogCarla, Log, TEXT("UActorDispatcher::Destroying actor: '%s' %x"), *Id, Actor)
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld Actor
static bool IsValid(const ACarlaWheeledVehicle *Vehicle)
Base class for CARLA wheeled vehicles.
void SetOwner(AActor *NewOwner) override
virtual void PrePhysTick(float DeltaSeconds) override
std::vector< std::tuple< uint64_t, AActor *, AActor * > > CollisionRegistry
保存所有碰撞的注册表。 用于避免每帧发送多次相同的碰撞,因为碰撞传感器使用 PhysX 子步节拍信号。有助于传感器的使用和流过载。
static FActorDefinition GetSensorDefinition()
ACollisionSensor(const FObjectInitializer &ObjectInitializer)
void OnCollisionEvent(AActor *Actor, AActor *OtherActor, FVector NormalImpulse, const FHitResult &Hit)
void OnComponentCollisionEvent(UPrimitiveComponent *HitComp, AActor *OtherActor, UPrimitiveComponent *OtherComp, FVector NormalImpulse, const FHitResult &Hit)
void OnActorCollisionEvent(AActor *Actor, AActor *OtherActor, FVector NormalImpulse, const FHitResult &Hit)
auto GetToken() const
Return the token that allows subscribing to this sensor's stream.
FAsyncDataStream GetDataStream(const SensorT &Self)
Return the FDataStream associated with this sensor.
const UCarlaEpisode & GetEpisode() const
void SerializeAndSend(SensorT &Sensor, ArgsT &&... Args)
static uint64_t GetFrameCounter()
static FActorDefinition MakeGenericSensorDefinition(const FString &Type, const FString &Id)
创建一个通用的传感器参与者定义。
static std::shared_ptr< ROS2 > GetInstance()
静态断言,用于确保token_data结构体的大小与Token::data的大小相同。
const auto & get_stream_id() const
获取流ID的引用。