RapyutaSimulationPlugins
RRConversionUtils.h
Go to the documentation of this file.
1 
21 #pragma once
22 
23 
24 
25 // rclUE
26 
27 #include "Msgs/ROS2HitResult.h"
28 
29 #include "Msgs/ROS2Odom.h"
30 
31 #include "Msgs/ROS2Pose.h"
32 
33 #include "Msgs/ROS2Time.h"
34 
35 
36 
37 // RapyutaSimulationPlugins
38 
39 #include "Core/RRCoreUtils.h"
40 
41 #include "Core/RRTypeUtils.h"
42 
43 
44 
45 #include "RRConversionUtils.generated.h"
46 
47 
48 
49 
54 class URRConversionUtils : public UBlueprintFunctionLibrary
55 
56 {
57 
58 
59 
60 public:
61 
62 
67  static FVector ConvertHandedness(const FVector& InLocation)
68 
69  {
70 
71  return FVector(InLocation.X, -InLocation.Y, InLocation.Z);
72 
73  }
74 
75 
76 
77 
82  static FVector2D ConvertHandedness2D(const FVector2D& InLocation)
83 
84  {
85 
86  return FVector2D(InLocation.X, -InLocation.Y);
87 
88  }
89 
90 
91 
92  // UE: cm, ROS: m
93 
94  template<typename T>
95 
96  static T DistanceROSToUE(const T& InROSDistance)
97 
98  {
99 
100  return 100.f * InROSDistance;
101 
102  }
103 
104 
105 
106  template<typename T>
107 
108  static T SizeROSToUE(const T& InROSSize)
109 
110  {
111 
112  return 100.f * InROSSize;
113 
114  }
115 
116 
117 
118  template<typename T>
119 
120  static T DistanceUEToROS(const T& InUESize)
121 
122  {
123 
124  return 0.01f * InUESize;
125 
126  }
127 
128 
129 
130  template<typename T>
131 
132  static T SizeUEToROS(const T& InUESize)
133 
134  {
135 
136  return 0.01f * InUESize;
137 
138  }
139 
140 
141 
142 
147  static FVector VectorUEToROS(const FVector& Input)
148 
149  {
150 
151  return 0.01f * ConvertHandedness(Input);
152 
153  }
154 
155 
156 
157  FORCEINLINE static void VectorUEToROS(const double& InputX,
158 
159  const double& InputY,
160 
161  const double& InputZ,
162 
163  double& OutputX,
164 
165  double& OutputY,
166 
167  double& OutputZ)
168 
169  {
170 
171  OutputX = InputX * 0.01f;
172 
173  OutputY = -InputY * 0.01f;
174 
175  OutputZ = InputZ * 0.01f;
176 
177  }
178 
179 
180 
181 
186  static FVector2D Vector2DUEToROS(const FVector2D& Input)
187 
188  {
189 
190  return 0.01f * ConvertHandedness2D(Input);
191 
192  }
193 
194 
195 
196  FORCEINLINE static void Vector2DUEToROS(const double& InputX, const double& InputY, double& OutputX, double& OutputY)
197 
198  {
199 
200  OutputX = InputX * 0.01f;
201 
202  OutputY = -InputY * 0.01f;
203 
204  }
205 
206 
207 
225  static FVector RotationUEVectorToROS(const FVector& Input, const bool bDegToRad = true)
226 
227  {
228 
229  FVector output = Input;
230 
231  output.Y = -output.Y;
232 
233  output.Z = -output.Z;
234 
235 
236 
237  return bDegToRad ? FMath::DegreesToRadians(output) : output;
238 
239  }
240 
241 
242 
243 
248  static FRotator RotatorUEToROS(const FRotator& Input, const bool bDegToRad = true)
249 
250  {
251 
252  FRotator output = Input;
253 
254  output.Roll = bDegToRad ? FMath::DegreesToRadians(output.Roll) : output.Roll;
255 
256  output.Pitch = -bDegToRad ? FMath::DegreesToRadians(output.Pitch) : output.Pitch;
257 
258  output.Yaw = -bDegToRad ? FMath::DegreesToRadians(output.Yaw) : output.Yaw;
259 
260 
261 
262  return output;
263 
264  }
265 
266 
267 
268 
273  static FQuat QuatUEToROS(const FQuat& Input)
274 
275  {
276 
277  FQuat Output = Input;
278 
279 
280 
281  Output.X = -Output.X;
282 
283  Output.Z = -Output.Z;
284 
285 
286 
287  return Output;
288 
289  }
290 
291 
292 
293 
298  static FTransform TransformUEToROS(const FTransform& Input)
299 
300  {
301 
302  FTransform Output = Input;
303 
304 
305 
306  Output.SetTranslation(VectorUEToROS(Input.GetTranslation()));
307 
308  Output.SetRotation(QuatUEToROS(Input.GetRotation()));
309 
310 
311 
312  return Output;
313 
314  }
315 
316 
317 
318 
323  static FROSOdom OdomUEToROS(const FROSOdom& Input)
324 
325  {
326 
327  FROSOdom Output = Input;
328 
329 
330 
331  Output.Pose.Pose.Position = VectorUEToROS(Input.Pose.Pose.Position);
332 
333  Output.Pose.Pose.Orientation = QuatUEToROS(Output.Pose.Pose.Orientation);
334 
335 
336 
337  Output.Twist.Twist.Linear = VectorUEToROS(Output.Twist.Twist.Linear);
338 
339  Output.Twist.Twist.Angular = RotationUEVectorToROS(Output.Twist.Twist.Angular);
340 
341 
342 
343  return Output;
344 
345  }
346 
347 
348 
349  // ROS to UE conversion
350 
351  // m -> cm
352 
353  // rad -> degree
354 
355  // Right handed -> Left handed
356 
357 
358 
359 
364  static FVector VectorROSToUE(const FVector& Input)
365 
366  {
367 
368  return 100.f * ConvertHandedness(Input);
369 
370  }
371 
372 
373 
374  FORCEINLINE static void VectorROSToUE(const FVector& Input, FVector& Output)
375 
376  {
377 
378  Output.Set(Input.X * 100.f, -Input.Y * 100.f, Input.Z * 100.f);
379 
380  }
381 
382 
383 
384  FORCEINLINE static void VectorROSToUE(const double& InputX,
385 
386  const double& InputY,
387 
388  const double& InputZ,
389 
390  double& OutputX,
391 
392  double& OutputY,
393 
394  double& OutputZ)
395 
396  {
397 
398  OutputX = InputX * 100.f;
399 
400  OutputY = -InputY * 100.f;
401 
402  OutputZ = InputZ * 100.f;
403 
404  }
405 
406 
407 
408 
413  static FVector2D Vector2DROSToUE(const FVector2D& Input)
414 
415  {
416 
417  return 100.f * ConvertHandedness2D(Input);
418 
419  }
420 
421 
422 
423  FORCEINLINE static void Vector2DROSToUE(const FVector2D& Input, FVector2D& Output)
424 
425  {
426 
427  Output.Set(Input.X * 100.f, -Input.Y * 100.f);
428 
429  }
430 
431 
432 
433  FORCEINLINE static void Vector2DROSToUE(const double& InputX, const double& InputY, double& OutputX, double& OutputY)
434 
435  {
436 
437  OutputX = InputX * 100.f;
438 
439  OutputY = -InputY * 100.f;
440 
441  }
442 
443 
444 
462  static FVector RotationROSToUEVector(const FVector& Input, const bool bRadToDeg = true)
463 
464  {
465 
466  FVector output = Input;
467 
468  output.Y = -output.Y;
469 
470  output.Z = -output.Z;
471 
472 
473 
474  return bRadToDeg ? FMath::RadiansToDegrees(output) : output;
475 
476  }
477 
478 
479 
480 
485  static FRotator RotatorROSToUE(const FRotator& Input, const bool bRadToDeg = true)
486 
487  {
488 
489  FRotator output = Input;
490 
491  output.Roll = bRadToDeg ? FMath::RadiansToDegrees(output.Roll) : output.Roll;
492 
493  output.Pitch = -bRadToDeg ? FMath::RadiansToDegrees(output.Pitch) : output.Pitch;
494 
495  output.Yaw = -bRadToDeg ? FMath::RadiansToDegrees(output.Yaw) : output.Yaw;
496 
497 
498 
499  return output;
500 
501  }
502 
503 
504 
505 
510  static FQuat QuatROSToUE(const FQuat& Input)
511 
512  {
513 
514  FQuat Output = Input;
515 
516 
517 
518  Output.X = -Output.X;
519 
520  Output.Z = -Output.Z;
521 
522 
523 
524  return Output;
525 
526  }
527 
528 
529 
530 
535  static FTransform TransformROSToUE(const FTransform& Input)
536 
537  {
538 
539  FTransform Output = Input;
540 
541 
542 
543  Output.SetTranslation(VectorROSToUE(Input.GetTranslation()));
544 
545  Output.SetRotation(QuatROSToUE(Input.GetRotation()));
546 
547 
548 
549  return Output;
550 
551  }
552 
553 
554 
574  static FROSOdom OdomROSToUE(const FROSOdom& Input)
575 
576  {
577 
578  FROSOdom Output = Input;
579 
580 
581 
582  VectorROSToUE(Input.Pose.Pose.Position, Output.Pose.Pose.Position);
583 
584  Output.Pose.Pose.Orientation = QuatROSToUE(Output.Pose.Pose.Orientation);
585 
586 
587 
588  Output.Twist.Twist.Linear = VectorROSToUE(Output.Twist.Twist.Linear);
589 
590  Output.Twist.Twist.Angular = RotationROSToUEVector(Output.Twist.Twist.Angular);
591 
592 
593 
594  return Output;
595 
596  }
597 
598 
599 
617  static FTransform PoseROSToUETransform(const FROSPose& InROSPose)
618 
619  {
620 
621  return FTransform(URRConversionUtils::QuatROSToUE(InROSPose.Orientation),
622 
623  URRConversionUtils::VectorROSToUE(InROSPose.Position));
624 
625  }
626 
627 
628 
629  // time to ROS stamp
630 
631 
636  static FROSTime FloatToROSStamp(const float InTimeSec)
637 
638  {
639 
640  FROSTime stamp;
641 
642  stamp.Sec = static_cast<int32>(InTimeSec);
643 
644  stamp.Nanosec = uint32((InTimeSec - stamp.Sec) * 1e+09f);
645 
646  return stamp;
647 
648  }
649 
650 
651 
652  static FROSTime GetCurrentROS2Time(const UObject* InContextObject)
653 
654  {
655 
656  return FloatToROSStamp(UGameplayStatics::GetTimeSeconds(InContextObject->GetWorld()));
657 
658  }
659 
660 
661 
662  static float ROSStampToFloat(const FROSTime& InTimeStamp)
663 
664  {
665 
666  return InTimeStamp.Sec + InTimeStamp.Nanosec * 1e-09f;
667 
668  }
669 
670 
671 
672  template<typename T>
673 
674  static FString ToString(const T& InValue)
675 
676  {
677 
678  if constexpr (TIsArithmetic<T>::Value || TIsIntegral<T>::Value)
679 
680  {
681 
682  return FString::FromInt(InValue);
683 
684  }
685 
686  else if constexpr (TIsFloatingPoint<T>::Value)
687 
688  {
689 
690  return FString::SanitizeFloat(InValue);
691 
692  }
693 
694  else if constexpr (TIsCharType<T>::Value || TIsCharPointer<T>::Value)
695 
696  {
697 
698  return FString(InValue);
699 
700  }
701 
702  else if constexpr (TIsSame<T, FName>::Value || TIsSame<T, FText>::Value)
703 
704  {
705 
706  return InValue.ToString();
707 
708  }
709 
710  else if constexpr (TIsSame<T, FString>::Value)
711 
712  {
713 
714  return InValue;
715 
716  }
717 
718  else
719 
720  {
721 
722  UE_LOG_WITH_INFO(LogTemp, Error, TEXT("[%s] is not yet supported"), TNameOf<T>::GetName());
723 
724  }
725 
726  return FString();
727 
728  }
729 
730 
731 
732  template<typename T>
733 
734  static FString ArrayToString(const TArray<T>& InArray, const TCHAR* InDelimiter = TEXT(","))
735 
736  {
737 
738  return FString::JoinBy(InArray, InDelimiter, [](const T& InElement) { return URRConversionUtils::ToString(InElement); });
739 
740  }
741 
742 
743 
744  template<typename T, std::size_t N>
745 
746  static FString ArrayToString(const T (&InArray)[N], const TCHAR* InDelimiter = TEXT(","))
747 
748  {
749 
750  TArray<FString> strArray;
751 
752  for (auto i = 0; i < URRCoreUtils::GetArraySize<T, N>(InArray); ++i)
753 
754  {
755 
756  strArray.Add(URRConversionUtils::ToString(InArray[i]));
757 
758  }
759 
760  return FString::Join(strArray, InDelimiter);
761 
762  }
763 
764 
765 
766  // HitResult
767 
768 
773  static FROSHitResult HitResultUEToROS(const FHitResult& InHit)
774 
775  {
776 
777  FROSHitResult result;
778 
779  result.bBlockingHit = InHit.bBlockingHit;
780 
781  result.bStartPenetrating = InHit.bStartPenetrating;
782 
783  result.ComponentName = InHit.Component->GetName();
784 
785  result.ActorName = InHit.HitObjectHandle.GetName();
786 
787  result.Distance = InHit.Distance;
788 
789  result.ElementIndex = InHit.ElementIndex;
790 
791  result.FaceIndex = InHit.FaceIndex;
792 
793  result.BoneName = InHit.BoneName.ToString();
794 
795  result.Item = InHit.Item;
796 
797  result.MyBoneName = InHit.MyBoneName.ToString();
798 
799  result.MyItem = InHit.MyItem;
800 
801  result.PenetrationDepth = InHit.PenetrationDepth;
802 
803  result.PhysicsMaterialName = InHit.PhysMaterial == nullptr ? TEXT("") : InHit.PhysMaterial->GetName();
804 
805  result.Time = InHit.Time;
806 
807  result.ImpactNormal = InHit.ImpactNormal;
808 
809  result.ImpactPoint = InHit.ImpactPoint;
810 
811  result.Normal = InHit.Normal;
812 
813  result.Location = InHit.Location;
814 
815  result.TraceStart = InHit.TraceStart;
816 
817  result.TraceEnd = InHit.TraceEnd;
818 
819 
820 
821  return result;
822 
823  }
824 
825 };
826 
URRConversionUtils::ConvertHandedness
static FVector ConvertHandedness(const FVector &InLocation)
Definition: RRConversionUtils.h:67
URRConversionUtils::RotatorUEToROS
static FRotator RotatorUEToROS(const FRotator &Input, const bool bDegToRad=true)
Definition: RRConversionUtils.h:248
URRConversionUtils::FloatToROSStamp
static FROSTime FloatToROSStamp(const float InTimeSec)
Definition: RRConversionUtils.h:636
URRConversionUtils::Vector2DROSToUE
static FORCEINLINE void Vector2DROSToUE(const double &InputX, const double &InputY, double &OutputX, double &OutputY)
Definition: RRConversionUtils.h:433
RRTypeUtils.h
UE type related utils.
URRConversionUtils::VectorROSToUE
static FVector VectorROSToUE(const FVector &Input)
Definition: RRConversionUtils.h:364
URRConversionUtils::VectorUEToROS
static FVector VectorUEToROS(const FVector &Input)
Definition: RRConversionUtils.h:147
URRConversionUtils::OdomROSToUE
static FROSOdom OdomROSToUE(const FROSOdom &Input)
Convert Odom from ROS system to UE system.
Definition: RRConversionUtils.h:574
URRConversionUtils::TransformUEToROS
static FTransform TransformUEToROS(const FTransform &Input)
Definition: RRConversionUtils.h:298
URRConversionUtils::QuatUEToROS
static FQuat QuatUEToROS(const FQuat &Input)
Definition: RRConversionUtils.h:273
URRConversionUtils::VectorUEToROS
static FORCEINLINE void VectorUEToROS(const double &InputX, const double &InputY, const double &InputZ, double &OutputX, double &OutputY, double &OutputZ)
Definition: RRConversionUtils.h:157
URRConversionUtils
Definition: RRConversionUtils.h:54
URRConversionUtils::RotatorROSToUE
static FRotator RotatorROSToUE(const FRotator &Input, const bool bRadToDeg=true)
Definition: RRConversionUtils.h:485
URRConversionUtils::Vector2DROSToUE
static FORCEINLINE void Vector2DROSToUE(const FVector2D &Input, FVector2D &Output)
Definition: RRConversionUtils.h:423
URRConversionUtils::ROSStampToFloat
static float ROSStampToFloat(const FROSTime &InTimeStamp)
Definition: RRConversionUtils.h:662
URRConversionUtils::ConvertHandedness2D
static FVector2D ConvertHandedness2D(const FVector2D &InLocation)
Definition: RRConversionUtils.h:82
URRConversionUtils::HitResultUEToROS
static FROSHitResult HitResultUEToROS(const FHitResult &InHit)
Definition: RRConversionUtils.h:773
URRConversionUtils::SizeROSToUE
static T SizeROSToUE(const T &InROSSize)
Definition: RRConversionUtils.h:108
URRConversionUtils::TransformROSToUE
static FTransform TransformROSToUE(const FTransform &Input)
Definition: RRConversionUtils.h:535
URRConversionUtils::VectorROSToUE
static FORCEINLINE void VectorROSToUE(const double &InputX, const double &InputY, const double &InputZ, double &OutputX, double &OutputY, double &OutputZ)
Definition: RRConversionUtils.h:384
URRConversionUtils::Vector2DUEToROS
static FVector2D Vector2DUEToROS(const FVector2D &Input)
Definition: RRConversionUtils.h:186
URRConversionUtils::SizeUEToROS
static T SizeUEToROS(const T &InUESize)
Definition: RRConversionUtils.h:132
URRConversionUtils::PoseROSToUETransform
static FTransform PoseROSToUETransform(const FROSPose &InROSPose)
Convert ROS Pose to UE Transform.
Definition: RRConversionUtils.h:617
URRConversionUtils::QuatROSToUE
static FQuat QuatROSToUE(const FQuat &Input)
Definition: RRConversionUtils.h:510
URRConversionUtils::RotationROSToUEVector
static FVector RotationROSToUEVector(const FVector &Input, const bool bRadToDeg=true)
Convert ROS Rotation Euler (rad) to UE Vector with optional Rad->Deg conversion.
Definition: RRConversionUtils.h:462
URRConversionUtils::VectorROSToUE
static FORCEINLINE void VectorROSToUE(const FVector &Input, FVector &Output)
Definition: RRConversionUtils.h:374
URRConversionUtils::DistanceROSToUE
static T DistanceROSToUE(const T &InROSDistance)
Definition: RRConversionUtils.h:96
URRConversionUtils::RotationUEVectorToROS
static FVector RotationUEVectorToROS(const FVector &Input, const bool bDegToRad=true)
Convert UE Rotation to ROS Vector with optional Deg->Rad conversion.
Definition: RRConversionUtils.h:225
URRConversionUtils::Vector2DUEToROS
static FORCEINLINE void Vector2DUEToROS(const double &InputX, const double &InputY, double &OutputX, double &OutputY)
Definition: RRConversionUtils.h:196
URRConversionUtils::DistanceUEToROS
static T DistanceUEToROS(const T &InUESize)
Definition: RRConversionUtils.h:120
URRConversionUtils::ArrayToString
static FString ArrayToString(const T(&InArray)[N], const TCHAR *InDelimiter=TEXT(","))
Definition: RRConversionUtils.h:746
URRConversionUtils::Vector2DROSToUE
static FVector2D Vector2DROSToUE(const FVector2D &Input)
Definition: RRConversionUtils.h:413
URRConversionUtils::GetCurrentROS2Time
static FROSTime GetCurrentROS2Time(const UObject *InContextObject)
Definition: RRConversionUtils.h:652
URRConversionUtils::OdomUEToROS
static FROSOdom OdomUEToROS(const FROSOdom &Input)
Definition: RRConversionUtils.h:323
TIsCharPointer
Definition: RRTypeUtils.h:83
URRConversionUtils::ToString
static FString ToString(const T &InValue)
Definition: RRConversionUtils.h:674
RRCoreUtils.h
Core utils.
URRConversionUtils::ArrayToString
static FString ArrayToString(const TArray< T > &InArray, const TCHAR *InDelimiter=TEXT(","))
Definition: RRConversionUtils.h:734