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
 
AVehicle * IsAttachedToVehicle () const
 
void SetSensorName (const FString newName)
 
FString GetTopicName ()
 
UTopic * GetROSTopic () const
 
void SetSimulateSensor (bool SimulateSensor)
 
bool CanSimulateSensor () const
 
ASensorModel * GetSensorModel () 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
 
ULogFile * LogFile = 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: