Agrarsense
Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes | List of all members
ACollisionSensor Class Reference

#include <CollisionSensor.h>

Inheritance diagram for ACollisionSensor:
Inheritance graph
[legend]
Collaboration diagram for ACollisionSensor:
Collaboration graph
[legend]

Public Member Functions

 ACollisionSensor (const FObjectInitializer &ObjectInitializer)
 
void Init (FCollisionSensorParameters CollisionSensorParameters, bool SimulateSensor=true)
 
virtual ESensorTypes GetSensorType () const override
 
- Public Member Functions inherited from ASensor
 ASensor (const FObjectInitializer &ObjectInitializer)
 
FString ExportToJsonFile (const FString &FileName)
 
virtual ESensorTypes GetSensorType () const
 
FString GetSensorIdentifier () const
 
void SetSensorIdentifier (const FString newIdentifier)
 
FString GetSensorName () const
 
virtual FString GetParametersAsString () const
 
AVehicleIsAttachedToVehicle () const
 
void SetSensorName (const FString newName)
 
FString GetTopicName ()
 
UTopic * GetROSTopic () const
 
void SetSimulateSensor (bool SimulateSensor)
 
bool CanSimulateSensor () const
 
ASensorModelGetSensorModel () const
 
void SetSensorModel (ASensorModel *NewSensorModel)
 
FORCEINLINE bool IsROSConnected () const
 
UROSIntegrationGameInstance * GetROSGameInstance () const
 
virtual FString GetActorID_Implementation () const override
 
virtual FString GetActorName_Implementation () const override
 
virtual FString GetActorInformation_Implementation () const override
 
virtual void SetActorName_Implementation (const FString &NewActorName) override
 
virtual void SetActorIDAndName_Implementation (const FString &NewActorName, const FString &NewID) override
 
void SetParentActorPtr (AActor *ParentActorPtr)
 
- Public Member Functions inherited from IActorInformation
FString GetActorID () const
 
FString GetActorName () const
 
FString GetActorInformation () const
 
void SetActorName (const FString &NewActorName)
 
void SetActorIDAndName (const FString &NewActorName, const FString &NewID)
 

Protected Member Functions

virtual void BeginPlay () override
 
virtual void EndPlay (const EEndPlayReason::Type EndPlayReason) override
 
void CreateDataSavePath () override
 
void CreateLogFile () override
 
- Protected Member Functions inherited from ASensor
virtual void BeginPlay () override
 
virtual void EndPlay (const EEndPlayReason::Type EndPlayReason) override
 
FString CreateTimeStampString () const
 
virtual void CreateROSTopic ()
 
virtual void DestroyROSTopic ()
 
virtual void CreateDataSavePath ()
 
bool IsLogFileCreated ()
 
virtual void CreateLogFile ()
 
void WriteToLogFile (const FString &Message)
 

Protected Attributes

FCollisionSensorParameters Parameters
 
- Protected Attributes inherited from ASensor
UTopic * ROSTopic = nullptr
 
bool SendDataToROS = true
 
ULogFileLogFile = nullptr
 
AActor * ParentActor = nullptr
 
FString FileSavePath
 
UROSIntegrationGameInstance * ROSInstance = nullptr
 

Private Member Functions

void SendCollisionData (const FString &CollisionDataString)
 
void OnComponentHit (UPrimitiveComponent *HitComponent, AActor *OtherActor, UPrimitiveComponent *OtherComp, FVector NormalImpulse, const FHitResult &Hit)
 
void OnActorHit (AActor *Actor, AActor *OtherActor, FVector NormalImpulse, const FHitResult &Hit)
 
FString CollsionDataToString (const CollisionData &Data)
 
FString TryGetID (AActor *Actor) const
 

Private Attributes

TWeakObjectPtr< AActor > CurrentOwner
 
UPrimitiveComponent * PrimitiveComponent = nullptr
 
TSharedPtr< ROSMessages::std_msgs::String > CollisionMessage
 

Additional Inherited Members

- Static Public Member Functions inherited from ASensor
static void HideComponentForAllCameras (UPrimitiveComponent *PrimitiveComponent)
 
static TMap< FString, FColor > GetSemanticColors ()
 
static TArray< TWeakObjectPtr< UPrimitiveComponent > > GetComponentsToHide ()
 
- Static Public Member Functions inherited from IActorInformation
static void SetAndValidateActorIDAndName (FString &ActorName, FString &ActorID, TWeakObjectPtr< AActor > Actor)
 
static bool DestroyActorByID (const FString &ID)
 
static AActor * GetActorByID (const FString &ID)
 
template<typename T >
static TArray< T * > GetActorsWithInterface ()
 
static void PrintAllIds ()
 
- Public Attributes inherited from ASensor
FSensorDestroy OnSensorDestroy
 
FString AttachedToComponent
 
FName AttachedToBone
 
- Static Protected Member Functions inherited from ASensor
template<typename InStructType >
static FString StructToString (const InStructType &InStruct)
 
- Static Protected Attributes inherited from ASensor
static FPrimitiveAdded OnPrimitiveAdded
 
static const FName NiagaraPointsInt = "User.PointCount"
 
static const FName NiagaraHitPoints = "User.HitPoints"
 
static const FName NiagaraHitColors = "User.HitColors"
 
static const FName NiagaraPointsFloat = "User.Test"
 

Detailed Description

Collision sensor for vehicles.

Definition at line 65 of file CollisionSensor.h.

Constructor & Destructor Documentation

◆ ACollisionSensor()

ACollisionSensor::ACollisionSensor ( const FObjectInitializer &  ObjectInitializer)

Definition at line 12 of file CollisionSensor.cpp.

12 : Super(ObjectInitializer)
13{
14 PrimaryActorTick.bCanEverTick = false;
15}

Member Function Documentation

◆ BeginPlay()

void ACollisionSensor::BeginPlay ( )
overrideprotectedvirtual

Reimplemented from ASensor.

Definition at line 44 of file CollisionSensor.cpp.

45{
46 Super::BeginPlay();
47}

◆ CollsionDataToString()

FString ACollisionSensor::CollsionDataToString ( const CollisionData Data)
private

Definition at line 119 of file CollisionSensor.cpp.

120{
121 auto Quote = [](FString S)
122 {
123 S.ReplaceInline(TEXT("\""), TEXT("\\\""));
124 return FString::Printf(TEXT("%s"), *S);
125 };
126
127
128 FString ID;
129 FVector Location;
130
131 if (Data.OtherActorPtr)
132 {
133 ID = TryGetID(Data.OtherActorPtr);
134 Location = Data.ActorPtr->GetActorLocation();
135 }
136
137 auto NormalImpulse = Data.NormalImpulse;
138 const FString ImpulseStr = FString::Printf(TEXT("%.2f,%.2f,%.2f"), NormalImpulse.X, NormalImpulse.Y, NormalImpulse.Z);
139 const double ImpulseMag = Data.NormalImpulse.Size();
140 const FString Ts = CreateTimeStampString();
141
142 return FString::Printf(
143 TEXT("actor=%s other_actor=%s other_actor_id=%s other_actor_location=%.2f,%.2f,%.2f impulse_strength=%s impulse_magnitude=%.2f timestamp=%s"),
144 *Quote(Data.Actor),
145 *Quote(Data.OtherActor),
146 *Quote(ID),
147 Location.X, Location.Y, Location.Z,
148 *ImpulseStr,
149 ImpulseMag,
150 *Quote(Ts));
151}
FString TryGetID(AActor *Actor) const
FString CreateTimeStampString() const
Definition: Sensor.cpp:330
AActor * OtherActorPtr
FString OtherActor
FVector NormalImpulse
AActor * ActorPtr

References CollisionData::Actor, CollisionData::ActorPtr, ASensor::CreateTimeStampString(), CollisionData::NormalImpulse, CollisionData::OtherActor, CollisionData::OtherActorPtr, and TryGetID().

Referenced by OnActorHit(), and OnComponentHit().

◆ CreateDataSavePath()

void ACollisionSensor::CreateDataSavePath ( )
overrideprotectedvirtual

Creates data save path for this sensor. Can be overriden if needed.

Reimplemented from ASensor.

Definition at line 178 of file CollisionSensor.cpp.

179{
180 if (!FileSavePath.IsEmpty())
181 {
182 return;
183 }
184
185 const FString DataLocation = UAgrarsensePaths::GetDataFolder();
186
187 // Default save path
188 FileSavePath = DataLocation + GetActorID_Implementation() + "/";
189
190 if (AVehicle* AttachedVehicle = IsAttachedToVehicle())
191 {
192 // If sensor is attached to vehicle, save data to vehicle folder
193 FileSavePath = DataLocation + AttachedVehicle->GetActorID_Implementation();
194 }
195}
AVehicle * IsAttachedToVehicle() const
Definition: Sensor.cpp:159
virtual FString GetActorID_Implementation() const override
Definition: Sensor.h:216
FString FileSavePath
Definition: Sensor.h:372
static FString GetDataFolder()

References ASensor::FileSavePath, ASensor::GetActorID_Implementation(), UAgrarsensePaths::GetDataFolder(), and ASensor::IsAttachedToVehicle().

Referenced by CreateLogFile().

◆ CreateLogFile()

void ACollisionSensor::CreateLogFile ( )
overrideprotectedvirtual

Create Text file for this sensor if it has not been created already. Text file will be created to ROOT/Data/Run/Logs directory. Filename will be SensorName_ID_UnixTimestamp.txt Can be overriden by individual sensor if needed.

Reimplemented from ASensor.

Definition at line 197 of file CollisionSensor.cpp.

198{
199 if (IsValid(LogFile))
200 {
201 // File has already been created, return
202 return;
203 }
204
206
207 FLogFileSettings Settings;
210 Settings.QueueLength = MAX_int32;
211 Settings.KeepFileOpen = false;
212 Settings.Timestamp = false;
213 Settings.OverrideFilePath = true;
214 Settings.FilePath = FileSavePath;
215
216 UE_LOG(LogTemp, Warning, TEXT("FileSavePath %s"), *FileSavePath);
217
218 LogFile = NewObject<ULogFile>(ULogFile::StaticClass());
219 if (IsValid(LogFile))
220 {
221 FString Prefix;
222 if (AVehicle* AttachedVehicle = IsAttachedToVehicle())
223 {
224 Prefix = AttachedVehicle->GetActorID_Implementation();
225 }
226 FString FileName = Prefix.IsEmpty() ? TEXT("collision") : Prefix + TEXT("_collision");
227
228 LogFile->Create(FileName, Settings);
229 }
230}
void CreateDataSavePath() override
ULogFile * LogFile
Definition: Sensor.h:367
void Create(const FString &FileNameWithoutExtension, FLogFileSettings Settings)
Definition: LogFile.cpp:40
bool KeepFileOpen
Definition: LogFile.h:42
bool Timestamp
Definition: LogFile.h:39
FString FilePath
Definition: LogFile.h:54
FFileWriteOptions FileWriteOptions
Definition: LogFile.h:45
int32 QueueLength
Definition: LogFile.h:48
bool OverrideFilePath
Definition: LogFile.h:51
FFileCreationOptions FileCreationOptions
Definition: LogFile.h:36

References ULogFile::Create(), CreateDataSavePath(), FLogFileSettings::FileCreationOptions, FLogFileSettings::FilePath, ASensor::FileSavePath, FLogFileSettings::FileWriteOptions, ASensor::IsAttachedToVehicle(), FLogFileSettings::KeepFileOpen, ASensor::LogFile, FLogFileSettings::OverrideFilePath, Overwrite, Queue, FLogFileSettings::QueueLength, and FLogFileSettings::Timestamp.

Referenced by Init().

◆ EndPlay()

void ACollisionSensor::EndPlay ( const EEndPlayReason::Type  EndPlayReason)
overrideprotectedvirtual

Reimplemented from ASensor.

Definition at line 49 of file CollisionSensor.cpp.

50{
51 Super::EndPlay(EndPlayReason);
52
53 if (CurrentOwner.Get())
54 {
55 CurrentOwner->OnActorHit.RemoveDynamic(this, &ACollisionSensor::OnActorHit);
56 CurrentOwner.Reset();
57 }
58
60 {
61 PrimitiveComponent->OnComponentHit.RemoveDynamic(this, &ACollisionSensor::OnComponentHit);
62 PrimitiveComponent = nullptr;
63 }
64
66 CollisionMessage.Reset();
67}
void OnComponentHit(UPrimitiveComponent *HitComponent, AActor *OtherActor, UPrimitiveComponent *OtherComp, FVector NormalImpulse, const FHitResult &Hit)
UPrimitiveComponent * PrimitiveComponent
TSharedPtr< ROSMessages::std_msgs::String > CollisionMessage
FCollisionSensorParameters Parameters
void OnActorHit(AActor *Actor, AActor *OtherActor, FVector NormalImpulse, const FHitResult &Hit)
TWeakObjectPtr< AActor > CurrentOwner

References CollisionMessage, CurrentOwner, OnActorHit(), OnComponentHit(), Parameters, PrimitiveComponent, and FCollisionSensorParameters::Reset().

◆ GetSensorType()

virtual ESensorTypes ACollisionSensor::GetSensorType ( ) const
inlineoverridevirtual

Get type of the sensor

Returns
Sensor's type

Reimplemented from ASensor.

Definition at line 85 of file CollisionSensor.h.

86 {
88 }

References Collision.

◆ Init()

void ACollisionSensor::Init ( FCollisionSensorParameters  CollisionSensorParameters,
bool  SimulateSensor = true 
)

Initialize collision sensor.

Parameters
NewOwnerThe new owner actor to be set.
SimulateSensorWhether to simulate the sensor (default is true).

Definition at line 17 of file CollisionSensor.cpp.

18{
19 SetSimulateSensor(SimulateSensor);
20
21 if (CollisionSensorParameters.OwningActor)
22 {
23 CurrentOwner = CollisionSensorParameters.OwningActor;
24 PrimitiveComponent = CollisionSensorParameters.PrimitiveComponent;
25
26 if (CollisionSensorParameters.UseActorCollision && CurrentOwner.Get())
27 {
28 CurrentOwner->OnActorHit.AddDynamic(this, &ACollisionSensor::OnActorHit);
29 }
30 else if (CollisionSensorParameters.PrimitiveComponent)
31 {
32 PrimitiveComponent->OnComponentHit.AddDynamic(this, &ACollisionSensor::OnComponentHit);
33 }
34
35 AttachToActor(CurrentOwner.Get(), FAttachmentTransformRules::KeepWorldTransform);
36 }
37
38 CollisionMessage = MakeShared<ROSMessages::std_msgs::String>();
39
42}
void CreateLogFile() override
void SetSimulateSensor(bool SimulateSensor)
Definition: Sensor.h:160
virtual void CreateROSTopic()
Definition: Sensor.cpp:197
UPrimitiveComponent * PrimitiveComponent

References CollisionMessage, CreateLogFile(), ASensor::CreateROSTopic(), CurrentOwner, OnActorHit(), OnComponentHit(), FCollisionSensorParameters::OwningActor, PrimitiveComponent, FCollisionSensorParameters::PrimitiveComponent, ASensor::SetSimulateSensor(), and FCollisionSensorParameters::UseActorCollision.

Referenced by USensorFactory::SpawnCollisionSensor().

◆ OnActorHit()

void ACollisionSensor::OnActorHit ( AActor *  Actor,
AActor *  OtherActor,
FVector  NormalImpulse,
const FHitResult &  Hit 
)
private

Definition at line 94 of file CollisionSensor.cpp.

95{
96 if (!CanSimulateSensor() || !Actor || !OtherActor)
97 {
98 return;
99 }
100
101 NormalImpulse *= 1e-2;
102 if (NormalImpulse.Size() > 200)
103 {
104 CollisionData Collisiondata =
105 {
106 Actor,
107 OtherActor,
108 Actor->GetName(),
109 OtherActor->GetName(),
110 NormalImpulse
111 };
112
113 FString CollisionDataString = CollsionDataToString(Collisiondata);
114 SendCollisionData(CollisionDataString);
115 WriteToLogFile(CollisionDataString);
116 }
117}
void SendCollisionData(const FString &CollisionDataString)
FString CollsionDataToString(const CollisionData &Data)
bool CanSimulateSensor() const
Definition: Sensor.h:170
void WriteToLogFile(const FString &Message)
Definition: Sensor.cpp:302

References ASensor::CanSimulateSensor(), CollsionDataToString(), SendCollisionData(), and ASensor::WriteToLogFile().

Referenced by EndPlay(), and Init().

◆ OnComponentHit()

void ACollisionSensor::OnComponentHit ( UPrimitiveComponent *  HitComponent,
AActor *  OtherActor,
UPrimitiveComponent *  OtherComp,
FVector  NormalImpulse,
const FHitResult &  Hit 
)
private

Definition at line 69 of file CollisionSensor.cpp.

70{
71 if (!CanSimulateSensor() || !OtherActor || !CurrentOwner.Get())
72 {
73 return;
74 }
75
76 NormalImpulse *= 1e-2;
77 if (NormalImpulse.Size() > 0.3f)
78 {
79 CollisionData Collisiondata =
80 {
81 CurrentOwner.Get(),
82 OtherActor,
83 CurrentOwner->GetName(),
84 OtherActor->GetName(),
85 NormalImpulse
86 };
87
88 FString CollisionDataString = CollsionDataToString(Collisiondata);
89 SendCollisionData(CollisionDataString);
90 WriteToLogFile(CollisionDataString);
91 }
92}

References ASensor::CanSimulateSensor(), CollsionDataToString(), CurrentOwner, SendCollisionData(), and ASensor::WriteToLogFile().

Referenced by EndPlay(), and Init().

◆ SendCollisionData()

void ACollisionSensor::SendCollisionData ( const FString &  CollisionDataString)
private

Definition at line 168 of file CollisionSensor.cpp.

169{
170 UTopic* Topic = GetROSTopic();
171 if (IsROSConnected() && CollisionMessage.IsValid() && Topic)
172 {
173 CollisionMessage->_Data = CollisionDataString;
174 Topic->Publish(CollisionMessage);
175 }
176}
UTopic * GetROSTopic() const
Definition: Sensor.h:150
FORCEINLINE bool IsROSConnected() const
Definition: Sensor.h:201

References CollisionMessage, ASensor::GetROSTopic(), and ASensor::IsROSConnected().

Referenced by OnActorHit(), and OnComponentHit().

◆ TryGetID()

FString ACollisionSensor::TryGetID ( AActor *  Actor) const
private

Definition at line 153 of file CollisionSensor.cpp.

154{
155 FString ID;
156
157 if (Actor && Actor->GetClass()->ImplementsInterface(UActorInformation::StaticClass()))
158 {
159 if (Actor->Implements<UActorInformation>())
160 {
161 ID = IActorInformation::Execute_GetActorID(Actor);
162 }
163 }
164
165 return ID;
166}

Referenced by CollsionDataToString().

Member Data Documentation

◆ CollisionMessage

TSharedPtr<ROSMessages::std_msgs::String> ACollisionSensor::CollisionMessage
private

Definition at line 122 of file CollisionSensor.h.

Referenced by EndPlay(), Init(), and SendCollisionData().

◆ CurrentOwner

TWeakObjectPtr<AActor> ACollisionSensor::CurrentOwner
private

Definition at line 117 of file CollisionSensor.h.

Referenced by EndPlay(), Init(), and OnComponentHit().

◆ Parameters

FCollisionSensorParameters ACollisionSensor::Parameters
protected

Definition at line 100 of file CollisionSensor.h.

Referenced by EndPlay().

◆ PrimitiveComponent

UPrimitiveComponent* ACollisionSensor::PrimitiveComponent = nullptr
private

Definition at line 120 of file CollisionSensor.h.

Referenced by EndPlay(), and Init().


The documentation for this class was generated from the following files: