Agrarsense
CollisionSensor.h
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#pragma once
7
8#include "CoreMinimal.h"
11
12#include "ROSIntegration/Public/std_msgs/String.h"
13
14#include "CollisionSensor.generated.h"
15
17{
18 AActor* ActorPtr = nullptr;
19 AActor* OtherActorPtr = nullptr;
20
21 FString Actor;
22 FString OtherActor;
24
25 FString ToString()
26 {
27 FString X = FString::SanitizeFloat(NormalImpulse.X);
28 FString Y = FString::SanitizeFloat(NormalImpulse.Y);
29 FString Z = FString::SanitizeFloat(NormalImpulse.Z);
30 return FString::Printf(TEXT("%s, %s, %s, %s, %s"), *Actor, *OtherActor, *X, *Y, *Z);
31 }
32
34 {
35 return FString::Printf(TEXT("Actor %s collided with %s with impulse of %s"), *Actor, *OtherActor, *NormalImpulse.ToString());
36 }
37
38 FString ToLogString() const
39 {
40 auto Quote = [](FString S)
41 {
42 S.ReplaceInline(TEXT("\""), TEXT("\\\""));
43 return FString::Printf(TEXT("\"%s\""), *S);
44 };
45
46 const FString ImpulseStr = FString::Printf(TEXT("%.2f,%.2f,%.2f"),
48 const double ImpulseMag = NormalImpulse.Size();
49 const FString Ts = FDateTime::UtcNow().ToIso8601();
50
51 return FString::Printf(
52 TEXT("actor=%s other_actor=%s impulse_strength=\"%s\" impulse_magnitude=%.2f ts=%s"),
53 *Quote(Actor),
54 *Quote(OtherActor),
55 *ImpulseStr,
56 ImpulseMag,
57 *Quote(Ts));
58 }
59};
60
64UCLASS()
65class AGRARSENSE_API ACollisionSensor : public ASensor
66{
67 GENERATED_BODY()
68
69public:
70
71 ACollisionSensor(const FObjectInitializer& ObjectInitializer);
72
78 UFUNCTION(BlueprintCallable)
79 void Init(FCollisionSensorParameters CollisionSensorParameters, bool SimulateSensor = true);
80
85 virtual ESensorTypes GetSensorType() const override
86 {
88 }
89
90protected:
91
92 virtual void BeginPlay() override;
93
94 virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
95
96 void CreateDataSavePath() override;
97
98 void CreateLogFile() override;
99
101
102private:
103
104 void SendCollisionData(const FString& CollisionDataString);
105
106 UFUNCTION()
107 void OnComponentHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);
108
109 UFUNCTION()
110 void OnActorHit(AActor* Actor, AActor* OtherActor, FVector NormalImpulse, const FHitResult& Hit);
111
112 FString CollsionDataToString(const CollisionData& Data);
113
114 FString TryGetID(AActor* Actor) const;
115
116 UPROPERTY()
117 TWeakObjectPtr<AActor> CurrentOwner;
118
119 UPROPERTY()
120 UPrimitiveComponent* PrimitiveComponent = nullptr;
121
122 TSharedPtr<ROSMessages::std_msgs::String> CollisionMessage;
123};
ESensorTypes
Definition: SensorTypes.h:15
virtual ESensorTypes GetSensorType() const override
FCollisionSensorParameters Parameters
Definition: Sensor.h:45
AActor * OtherActorPtr
FString ToStringHumanReadable()
FString OtherActor
FString ToLogString() const
FVector NormalImpulse
AActor * ActorPtr
FString ToString()