CARLA
Loading...
Searching...
No Matches
CollisionSensor.cpp
Go to the documentation of this file.
1// Copyright (c) 2026 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
8#include "Carla.h"
15
16ACollisionSensor::ACollisionSensor(const FObjectInitializer& ObjectInitializer)
17 : Super(ObjectInitializer)
18{
19 PrimaryActorTick.bCanEverTick = false;
20}
21
28
30{
31 Super::SetOwner(NewOwner);
32
33 /// @todo Deregister previous owner if there was one.
34
35 if (NewOwner != nullptr)
36 {
37 NewOwner->OnActorHit.AddDynamic(this, &ACollisionSensor::OnCollisionEvent);
38 }
39}
40
42 AActor* Actor,
43 AActor* OtherActor,
44 FVector NormalImpulse,
45 const FHitResult& Hit)
46{
47 if (Actor == nullptr || OtherActor == nullptr)
48 {
49 return;
50 }
51
52 uint64_t CurrentFrame = FCarlaEngine::GetFrameCounter();
53
54 // remove all items from previous frames
56 std::remove_if(
57 CollisionRegistry.begin(),
59 [CurrentFrame](std::tuple<uint64_t, AActor*, AActor*> Item)
60 {
61 return std::get<0>(Item) < CurrentFrame;
62 }),
63 CollisionRegistry.end());
64
65 // check if this collision has been procesed already in this frame
66 for (auto& Collision : CollisionRegistry)
67 {
68 if (std::get<0>(Collision) == CurrentFrame &&
69 std::get<1>(Collision) == Actor &&
70 std::get<2>(Collision) == OtherActor)
71 {
72 return;
73 }
74 }
75
76 const auto& CurrentEpisode = GetEpisode();
77 constexpr float TO_METERS = 1e-2;
78 NormalImpulse *= TO_METERS;
80 *this,
81 CurrentEpisode.SerializeActor(Actor),
82 CurrentEpisode.SerializeActor(OtherActor),
84 (float)NormalImpulse.X,
85 (float)NormalImpulse.Y,
86 (float)NormalImpulse.Z));
87 // record the collision event
88 if (CurrentEpisode.GetRecorder()->IsEnabled()) {
89 CurrentEpisode.GetRecorder()->AddCollision(Actor, OtherActor);
90 }
91
92 CollisionRegistry.emplace_back(CurrentFrame, Actor, OtherActor);
93
94 // ROS2
95#if defined(WITH_ROS2)
97 if (ROS2->IsEnabled())
98 {
99 TRACE_CPUPROFILER_EVENT_SCOPE_STR("ROS2 Send");
101 auto NormalImpulseVector = carla::geom::Vector3D(
102 (float)NormalImpulse.X,
103 (float)NormalImpulse.Y,
104 (float)NormalImpulse.Z);
105 AActor* ParentActor = GetAttachParentActor();
106 if (ParentActor)
107 {
108 FTransform LocalTransformRelativeToParent = GetActorTransform().GetRelativeTransform(ParentActor->GetActorTransform());
109 ROS2->ProcessDataFromCollisionSensor(
110 0, StreamId,
111 LocalTransformRelativeToParent,
112 OtherActor->GetUniqueID(),
113 NormalImpulseVector,
114 this);
115 }
116 else
117 {
118 ROS2->ProcessDataFromCollisionSensor(
119 0, StreamId,
120 GetActorTransform(),
121 OtherActor->GetUniqueID(),
122 NormalImpulseVector,
123 this);
124 }
125 }
126#endif
127}
void SetOwner(AActor *NewOwner) override
std::vector< std::tuple< uint64_t, AActor *, AActor * > > CollisionRegistry
Registry that saves all collisions.
static FActorDefinition GetSensorDefinition()
ACollisionSensor(const FObjectInitializer &ObjectInitializer)
void OnCollisionEvent(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(SensorType &&Self)
Return the FDataStream associated with this sensor.
void SerializeAndSend(SensorT &Sensor, ArgsT &&... Args)
static uint64_t GetFrameCounter()
Definition CarlaEngine.h:73
static FActorDefinition MakeGenericSensorDefinition(const FString &Type, const FString &Id)
static std::shared_ptr< ROS2 > GetInstance()
Definition ROS2.h:61
Serializes a stream endpoint.
A definition of a Carla Actor with all the variation and attributes.