Agrarsense
CollisionSensor.cpp
Go to the documentation of this file.
1// Copyright (c) 2023 FrostBit Software Lab at the Lapland University of Applied Sciences
2//
3// This work is licensed under the terms of the MIT license.
4// For a copy, see <https://opensource.org/licenses/MIT>.
5
6#include "CollisionSensor.h"
7#include "Collision.h"
8
11
12ACollisionSensor::ACollisionSensor(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
13{
14 PrimaryActorTick.bCanEverTick = false;
15}
16
17void ACollisionSensor::Init(AActor* NewOwner, bool SimulateSensor)
18{
19 SetSimulateSensor(SimulateSensor);
20
21 if (NewOwner)
22 {
23 NewOwner->OnActorHit.AddDynamic(this, &ACollisionSensor::OnCollisionEvent);
24 CurrentOwner = NewOwner;
25 }
26 CollisionMessage = MakeShared<ROSMessages::std_msgs::String>();
27
30}
31
33{
34 Super::BeginPlay();
35}
36
37void ACollisionSensor::EndPlay(const EEndPlayReason::Type EndPlayReason)
38{
39 Super::EndPlay(EndPlayReason);
40
41 if (CurrentOwner.IsValid())
42 {
43 CurrentOwner->OnActorHit.RemoveDynamic(this, &ACollisionSensor::OnCollisionEvent);
44 }
45
46 CurrentOwner.Reset();
47 CollisionMessage.Reset();
48}
49
50void ACollisionSensor::OnCollisionEvent(AActor* Actor, AActor* OtherActor, FVector NormalImpulse, const FHitResult& Hit)
51{
52 if (!CanSimulateSensor() || !Actor || !OtherActor)
53 {
54 return;
55 }
56
57 NormalImpulse *= 1e-2;
58 if (NormalImpulse.Size() > 200)
59 {
60 CollisionData Collisiondata =
61 {
62 Actor->GetName(),
63 OtherActor->GetName(),
64 NormalImpulse
65 };
66
67 SendCollisionData(Collisiondata.ToString());
68
69 FString MsgHumanReadable = Collisiondata.ToStringHumanReadable();
70 WriteToLogFile(MsgHumanReadable); // Log to separate file
71 SimulatorLog::Log(MsgHumanReadable); // Log to ROS info topic and Simulator log file
72 }
73}
74
75void ACollisionSensor::SendCollisionData(const FString& CollisionDataString)
76{
77 UTopic* Topic = GetROSTopic();
78 if (IsROSConnected() && CollisionMessage.IsValid() && Topic)
79 {
80 CollisionMessage->_Data = CollisionDataString;
81 Topic->Publish(CollisionMessage);
82 }
83}
84
86{
87 if (!FileSavePath.IsEmpty())
88 {
89 return;
90 }
91
92 const FString DataLocation = UAgrarsensePaths::GetDataFolder();
93
94 // Default save path
95 FileSavePath = DataLocation + GetActorID_Implementation() + "/";
96
97 if (AVehicle* AttachedVehicle = IsAttachedToVehicle())
98 {
99 // If sensor is attached to vehicle, save data to vehicle folder
100 FileSavePath = DataLocation + AttachedVehicle->GetActorID_Implementation();
101 }
102}
103
105{
106 if (IsValid(LogFile))
107 {
108 // File has already been created, return
109 return;
110 }
111
113
114 FLogFileSettings Settings;
117 Settings.QueueLength = MAX_int32;
118 Settings.KeepFileOpen = false;
119 Settings.Timestamp = false;
120 Settings.OverrideFilePath = true;
121 Settings.FilePath = FileSavePath;
122
123 UE_LOG(LogTemp, Warning, TEXT("FileSavePath %s"), *FileSavePath);
124
125 LogFile = NewObject<ULogFile>(ULogFile::StaticClass());
126 if (IsValid(LogFile))
127 {
128 FString Prefix;
129 if (AVehicle* AttachedVehicle = IsAttachedToVehicle())
130 {
131 Prefix = AttachedVehicle->GetActorID_Implementation();
132 }
133 FString FileName = Prefix.IsEmpty() ? TEXT("collision") : Prefix + TEXT("_collision");
134
135 LogFile->Create(FileName, Settings);
136 }
137}
void SendCollisionData(const FString &CollisionDataString)
TSharedPtr< ROSMessages::std_msgs::String > CollisionMessage
void Init(AActor *NewOwner, bool SimulateSensor=true)
ACollisionSensor(const FObjectInitializer &ObjectInitializer)
virtual void BeginPlay() override
void OnCollisionEvent(AActor *Actor, AActor *OtherActor, FVector NormalImpulse, const FHitResult &Hit)
void CreateLogFile() override
void CreateDataSavePath() override
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override
TWeakObjectPtr< AActor > CurrentOwner
bool CanSimulateSensor() const
Definition: Sensor.h:170
void SetSimulateSensor(bool SimulateSensor)
Definition: Sensor.h:160
UTopic * GetROSTopic() const
Definition: Sensor.h:150
AVehicle * IsAttachedToVehicle() const
Definition: Sensor.cpp:152
ULogFile * LogFile
Definition: Sensor.h:367
virtual FString GetActorID_Implementation() const override
Definition: Sensor.h:216
FString FileSavePath
Definition: Sensor.h:372
void WriteToLogFile(const FString &Message)
Definition: Sensor.cpp:294
FORCEINLINE bool IsROSConnected() const
Definition: Sensor.h:201
virtual void CreateROSTopic()
Definition: Sensor.cpp:190
static void Log(const FString &Message, bool LogToTextFile=true, bool LogToROS=true)
static FString GetDataFolder()
void Create(const FString &FileNameWithoutExtension, FLogFileSettings Settings)
Definition: LogFile.cpp:40
FString ToStringHumanReadable()
FString ToString()
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