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 47 of file CollisionSensor.cpp.

48{
49 Super::BeginPlay();
50}

◆ CollsionDataToString()

FString ACollisionSensor::CollsionDataToString ( const CollisionData Data)
private

Definition at line 122 of file CollisionSensor.cpp.

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

182{
183 if (!FileSavePath.IsEmpty())
184 {
185 return;
186 }
187
188 const FString DataLocation = UAgrarsensePaths::GetDataFolder();
189
190 // Default save path
191 FileSavePath = DataLocation + GetActorID_Implementation() + "/";
192
193 if (AVehicle* AttachedVehicle = IsAttachedToVehicle())
194 {
195 // If sensor is attached to vehicle, save data to vehicle folder
196 FileSavePath = DataLocation + AttachedVehicle->GetActorID_Implementation();
197 }
198}
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 200 of file CollisionSensor.cpp.

201{
202 if (IsValid(LogFile))
203 {
204 // File has already been created, return
205 return;
206 }
207
209
210 FLogFileSettings Settings;
213 Settings.QueueLength = MAX_int32;
214 Settings.KeepFileOpen = false;
215 Settings.Timestamp = false;
216 Settings.OverrideFilePath = true;
217 Settings.FilePath = FileSavePath;
218
219 UE_LOG(LogTemp, Warning, TEXT("FileSavePath %s"), *FileSavePath);
220
221 LogFile = NewObject<ULogFile>(ULogFile::StaticClass());
222 if (IsValid(LogFile))
223 {
224 FString Prefix;
225 if (AVehicle* AttachedVehicle = IsAttachedToVehicle())
226 {
227 Prefix = AttachedVehicle->GetActorID_Implementation();
228 }
229 FString FileName = Prefix.IsEmpty() ? TEXT("collision") : Prefix + TEXT("_collision");
230
231 LogFile->Create(FileName, Settings);
232 }
233}
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 52 of file CollisionSensor.cpp.

53{
54 Super::EndPlay(EndPlayReason);
55
56 if (CurrentOwner.Get())
57 {
58 CurrentOwner->OnActorHit.RemoveDynamic(this, &ACollisionSensor::OnActorHit);
59 CurrentOwner.Reset();
60 }
61
63 {
64 PrimitiveComponent->OnComponentHit.RemoveDynamic(this, &ACollisionSensor::OnComponentHit);
65 PrimitiveComponent = nullptr;
66 }
67
69 CollisionMessage.Reset();
70}
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 // Disable this actor's collisions.
20 SetActorEnableCollision(false);
21
22 SetSimulateSensor(SimulateSensor);
23
24 if (CollisionSensorParameters.OwningActor)
25 {
26 CurrentOwner = CollisionSensorParameters.OwningActor;
27 PrimitiveComponent = CollisionSensorParameters.PrimitiveComponent;
28
29 if (CollisionSensorParameters.UseActorCollision && CurrentOwner.Get())
30 {
31 CurrentOwner->OnActorHit.AddDynamic(this, &ACollisionSensor::OnActorHit);
32 }
33 else if (CollisionSensorParameters.PrimitiveComponent)
34 {
35 PrimitiveComponent->OnComponentHit.AddDynamic(this, &ACollisionSensor::OnComponentHit);
36 }
37
38 AttachToActor(CurrentOwner.Get(), FAttachmentTransformRules::KeepWorldTransform);
39 }
40
41 CollisionMessage = MakeShared<ROSMessages::std_msgs::String>();
42
45}
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 97 of file CollisionSensor.cpp.

98{
99 if (!CanSimulateSensor() || !Actor || !OtherActor)
100 {
101 return;
102 }
103
104 NormalImpulse *= 1e-2;
105 if (NormalImpulse.Size() > 200)
106 {
107 CollisionData Collisiondata =
108 {
109 Actor,
110 OtherActor,
111 Actor->GetName(),
112 OtherActor->GetName(),
113 NormalImpulse
114 };
115
116 FString CollisionDataString = CollsionDataToString(Collisiondata);
117 SendCollisionData(CollisionDataString);
118 WriteToLogFile(CollisionDataString);
119 }
120}
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 72 of file CollisionSensor.cpp.

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

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 171 of file CollisionSensor.cpp.

172{
173 UTopic* Topic = GetROSTopic();
174 if (IsROSConnected() && CollisionMessage.IsValid() && Topic)
175 {
176 CollisionMessage->_Data = CollisionDataString;
177 Topic->Publish(CollisionMessage);
178 }
179}
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 156 of file CollisionSensor.cpp.

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

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: