27 #include "Msgs/ROS2HitResult.h"
29 #include "Msgs/ROS2Odom.h"
31 #include "Msgs/ROS2Pose.h"
33 #include "Msgs/ROS2Time.h"
45 #include "RRConversionUtils.generated.h"
71 return FVector(InLocation.X, -InLocation.Y, InLocation.Z);
86 return FVector2D(InLocation.X, -InLocation.Y);
100 return 100.f * InROSDistance;
112 return 100.f * InROSSize;
124 return 0.01f * InUESize;
136 return 0.01f * InUESize;
159 const double& InputY,
161 const double& InputZ,
171 OutputX = InputX * 0.01f;
173 OutputY = -InputY * 0.01f;
175 OutputZ = InputZ * 0.01f;
196 FORCEINLINE
static void Vector2DUEToROS(
const double& InputX,
const double& InputY,
double& OutputX,
double& OutputY)
200 OutputX = InputX * 0.01f;
202 OutputY = -InputY * 0.01f;
229 FVector output = Input;
231 output.Y = -output.Y;
233 output.Z = -output.Z;
237 return bDegToRad ? FMath::DegreesToRadians(output) : output;
248 static FRotator
RotatorUEToROS(
const FRotator& Input,
const bool bDegToRad =
true)
252 FRotator output = Input;
254 output.Roll = bDegToRad ? FMath::DegreesToRadians(output.Roll) : output.Roll;
256 output.Pitch = -bDegToRad ? FMath::DegreesToRadians(output.Pitch) : output.Pitch;
258 output.Yaw = -bDegToRad ? FMath::DegreesToRadians(output.Yaw) : output.Yaw;
277 FQuat Output = Input;
281 Output.X = -Output.X;
283 Output.Z = -Output.Z;
302 FTransform Output = Input;
306 Output.SetTranslation(
VectorUEToROS(Input.GetTranslation()));
308 Output.SetRotation(
QuatUEToROS(Input.GetRotation()));
327 FROSOdom Output = Input;
331 Output.Pose.Pose.Position =
VectorUEToROS(Input.Pose.Pose.Position);
333 Output.Pose.Pose.Orientation =
QuatUEToROS(Output.Pose.Pose.Orientation);
337 Output.Twist.Twist.Linear =
VectorUEToROS(Output.Twist.Twist.Linear);
374 FORCEINLINE
static void VectorROSToUE(
const FVector& Input, FVector& Output)
378 Output.Set(Input.X * 100.f, -Input.Y * 100.f, Input.Z * 100.f);
386 const double& InputY,
388 const double& InputZ,
398 OutputX = InputX * 100.f;
400 OutputY = -InputY * 100.f;
402 OutputZ = InputZ * 100.f;
427 Output.Set(Input.X * 100.f, -Input.Y * 100.f);
433 FORCEINLINE
static void Vector2DROSToUE(
const double& InputX,
const double& InputY,
double& OutputX,
double& OutputY)
437 OutputX = InputX * 100.f;
439 OutputY = -InputY * 100.f;
466 FVector output = Input;
468 output.Y = -output.Y;
470 output.Z = -output.Z;
474 return bRadToDeg ? FMath::RadiansToDegrees(output) : output;
485 static FRotator
RotatorROSToUE(
const FRotator& Input,
const bool bRadToDeg =
true)
489 FRotator output = Input;
491 output.Roll = bRadToDeg ? FMath::RadiansToDegrees(output.Roll) : output.Roll;
493 output.Pitch = -bRadToDeg ? FMath::RadiansToDegrees(output.Pitch) : output.Pitch;
495 output.Yaw = -bRadToDeg ? FMath::RadiansToDegrees(output.Yaw) : output.Yaw;
514 FQuat Output = Input;
518 Output.X = -Output.X;
520 Output.Z = -Output.Z;
539 FTransform Output = Input;
543 Output.SetTranslation(
VectorROSToUE(Input.GetTranslation()));
545 Output.SetRotation(
QuatROSToUE(Input.GetRotation()));
578 FROSOdom Output = Input;
582 VectorROSToUE(Input.Pose.Pose.Position, Output.Pose.Pose.Position);
584 Output.Pose.Pose.Orientation =
QuatROSToUE(Output.Pose.Pose.Orientation);
588 Output.Twist.Twist.Linear =
VectorROSToUE(Output.Twist.Twist.Linear);
642 stamp.Sec =
static_cast<int32
>(InTimeSec);
644 stamp.Nanosec = uint32((InTimeSec - stamp.Sec) * 1e+09f);
656 return FloatToROSStamp(UGameplayStatics::GetTimeSeconds(InContextObject->GetWorld()));
666 return InTimeStamp.Sec + InTimeStamp.Nanosec * 1e-09f;
678 if constexpr (TIsArithmetic<T>::Value || TIsIntegral<T>::Value)
682 return FString::FromInt(InValue);
686 else if constexpr (TIsFloatingPoint<T>::Value)
690 return FString::SanitizeFloat(InValue);
698 return FString(InValue);
702 else if constexpr (TIsSame<T, FName>::Value || TIsSame<T, FText>::Value)
706 return InValue.ToString();
710 else if constexpr (TIsSame<T, FString>::Value)
722 UE_LOG_WITH_INFO(LogTemp, Error, TEXT(
"[%s] is not yet supported"), TNameOf<T>::GetName());
734 static FString
ArrayToString(
const TArray<T>& InArray,
const TCHAR* InDelimiter = TEXT(
","))
744 template<
typename T, std::
size_t N>
746 static FString
ArrayToString(
const T (&InArray)[N],
const TCHAR* InDelimiter = TEXT(
","))
750 TArray<FString> strArray;
752 for (
auto i = 0; i < URRCoreUtils::GetArraySize<T, N>(InArray); ++i)
760 return FString::Join(strArray, InDelimiter);
777 FROSHitResult result;
779 result.bBlockingHit = InHit.bBlockingHit;
781 result.bStartPenetrating = InHit.bStartPenetrating;
783 result.ComponentName = InHit.Component->GetName();
785 result.ActorName = InHit.HitObjectHandle.GetName();
787 result.Distance = InHit.Distance;
789 result.ElementIndex = InHit.ElementIndex;
791 result.FaceIndex = InHit.FaceIndex;
793 result.BoneName = InHit.BoneName.ToString();
795 result.Item = InHit.Item;
797 result.MyBoneName = InHit.MyBoneName.ToString();
799 result.MyItem = InHit.MyItem;
801 result.PenetrationDepth = InHit.PenetrationDepth;
803 result.PhysicsMaterialName = InHit.PhysMaterial ==
nullptr ? TEXT(
"") : InHit.PhysMaterial->GetName();
805 result.Time = InHit.Time;
807 result.ImpactNormal = InHit.ImpactNormal;
809 result.ImpactPoint = InHit.ImpactPoint;
811 result.Normal = InHit.Normal;
813 result.Location = InHit.Location;
815 result.TraceStart = InHit.TraceStart;
817 result.TraceEnd = InHit.TraceEnd;