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);
85 return 100.f * InROSDistance;
97 return 100.f * InROSSize;
109 return 0.01f * InUESize;
121 return 0.01f * InUESize;
144 const double& InputY,
146 const double& InputZ,
156 OutputX = InputX * 0.01f;
158 OutputY = -InputY * 0.01f;
160 OutputZ = InputZ * 0.01f;
187 FVector output = Input;
189 output.Y = -output.Y;
191 output.Z = -output.Z;
195 return bDegToRad ? FMath::DegreesToRadians(output) : output;
206 static FRotator
RotatorUEToROS(
const FRotator& Input,
const bool bDegToRad =
true)
210 FRotator output = Input;
212 output.Roll = bDegToRad ? FMath::DegreesToRadians(output.Roll) : output.Roll;
214 output.Pitch = -bDegToRad ? FMath::DegreesToRadians(output.Pitch) : output.Pitch;
216 output.Yaw = -bDegToRad ? FMath::DegreesToRadians(output.Yaw) : output.Yaw;
235 FQuat Output = Input;
239 Output.X = -Output.X;
241 Output.Z = -Output.Z;
260 FTransform Output = Input;
264 Output.SetTranslation(
VectorUEToROS(Input.GetTranslation()));
266 Output.SetRotation(
QuatUEToROS(Input.GetRotation()));
285 FROSOdom Output = Input;
289 Output.Pose.Pose.Position =
VectorUEToROS(Input.Pose.Pose.Position);
291 Output.Pose.Pose.Orientation =
QuatUEToROS(Output.Pose.Pose.Orientation);
295 Output.Twist.Twist.Linear =
VectorUEToROS(Output.Twist.Twist.Linear);
332 FORCEINLINE
static void VectorROSToUE(
const FVector& Input, FVector& Output)
336 Output.Set(Input.X * 100.f, -Input.Y * 100.f, Input.Z * 100.f);
344 const double& InputY,
346 const double& InputZ,
356 OutputX = InputX * 100.f;
358 OutputY = -InputY * 100.f;
360 OutputZ = InputZ * 100.f;
387 FVector output = Input;
389 output.Y = -output.Y;
391 output.Z = -output.Z;
395 return bRadToDeg ? FMath::RadiansToDegrees(output) : output;
406 static FRotator
RotatorROSToUE(
const FRotator& Input,
const bool bRadToDeg =
true)
410 FRotator output = Input;
412 output.Roll = bRadToDeg ? FMath::RadiansToDegrees(output.Roll) : output.Roll;
414 output.Pitch = -bRadToDeg ? FMath::RadiansToDegrees(output.Pitch) : output.Pitch;
416 output.Yaw = -bRadToDeg ? FMath::RadiansToDegrees(output.Yaw) : output.Yaw;
435 FQuat Output = Input;
439 Output.X = -Output.X;
441 Output.Z = -Output.Z;
460 FTransform Output = Input;
464 Output.SetTranslation(
VectorROSToUE(Input.GetTranslation()));
466 Output.SetRotation(
QuatROSToUE(Input.GetRotation()));
499 FROSOdom Output = Input;
503 VectorROSToUE(Input.Pose.Pose.Position, Output.Pose.Pose.Position);
505 Output.Pose.Pose.Orientation =
QuatROSToUE(Output.Pose.Pose.Orientation);
509 Output.Twist.Twist.Linear =
VectorROSToUE(Output.Twist.Twist.Linear);
563 stamp.Sec =
static_cast<int32
>(InTimeSec);
565 stamp.Nanosec = uint32((InTimeSec - stamp.Sec) * 1e+09f);
577 return FloatToROSStamp(UGameplayStatics::GetTimeSeconds(InContextObject->GetWorld()));
587 return InTimeStamp.Sec + InTimeStamp.Nanosec * 1e-09f;
599 if constexpr (TIsArithmetic<T>::Value || TIsIntegral<T>::Value)
603 return FString::FromInt(InValue);
607 else if constexpr (TIsFloatingPoint<T>::Value)
611 return FString::SanitizeFloat(InValue);
619 return FString(InValue);
623 else if constexpr (TIsSame<T, FName>::Value || TIsSame<T, FText>::Value)
627 return InValue.ToString();
631 else if constexpr (TIsSame<T, FString>::Value)
643 UE_LOG_WITH_INFO(LogTemp, Error, TEXT(
"[%s] is not yet supported"), TNameOf<T>::GetName());
655 static FString
ArrayToString(
const TArray<T>& InArray,
const TCHAR* InDelimiter = TEXT(
","))
665 template<
typename T, std::
size_t N>
667 static FString
ArrayToString(
const T (&InArray)[N],
const TCHAR* InDelimiter = TEXT(
","))
671 TArray<FString> strArray;
673 for (
auto i = 0; i < URRCoreUtils::GetArraySize<T, N>(InArray); ++i)
681 return FString::Join(strArray, InDelimiter);
698 FROSHitResult result;
700 result.bBlockingHit = InHit.bBlockingHit;
702 result.bStartPenetrating = InHit.bStartPenetrating;
704 result.ComponentName = InHit.Component->GetName();
706 result.ActorName = InHit.HitObjectHandle.GetName();
708 result.Distance = InHit.Distance;
710 result.ElementIndex = InHit.ElementIndex;
712 result.FaceIndex = InHit.FaceIndex;
714 result.BoneName = InHit.BoneName.ToString();
716 result.Item = InHit.Item;
718 result.MyBoneName = InHit.MyBoneName.ToString();
720 result.MyItem = InHit.MyItem;
722 result.PenetrationDepth = InHit.PenetrationDepth;
724 result.PhysicsMaterialName = InHit.PhysMaterial ==
nullptr ? TEXT(
"") : InHit.PhysMaterial->GetName();
726 result.Time = InHit.Time;
728 result.ImpactNormal = InHit.ImpactNormal;
730 result.ImpactPoint = InHit.ImpactPoint;
732 result.Normal = InHit.Normal;
734 result.Location = InHit.Location;
736 result.TraceStart = InHit.TraceStart;
738 result.TraceEnd = InHit.TraceEnd;