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  // UE: cm, ROS: m
78 
79  template<typename T>
80 
81  static T DistanceROSToUE(const T& InROSDistance)
82 
83  {
84 
85  return 100.f * InROSDistance;
86 
87  }
88 
89 
90 
91  template<typename T>
92 
93  static T SizeROSToUE(const T& InROSSize)
94 
95  {
96 
97  return 100.f * InROSSize;
98 
99  }
100 
101 
102 
103  template<typename T>
104 
105  static T DistanceUEToROS(const T& InUESize)
106 
107  {
108 
109  return 0.01f * InUESize;
110 
111  }
112 
113 
114 
115  template<typename T>
116 
117  static T SizeUEToROS(const T& InUESize)
118 
119  {
120 
121  return 0.01f * InUESize;
122 
123  }
124 
125 
126 
127 
132  static FVector VectorUEToROS(const FVector& Input)
133 
134  {
135 
136  return 0.01f * ConvertHandedness(Input);
137 
138  }
139 
140 
141 
142  FORCEINLINE static void VectorUEToROS(const double& InputX,
143 
144  const double& InputY,
145 
146  const double& InputZ,
147 
148  double& OutputX,
149 
150  double& OutputY,
151 
152  double& OutputZ)
153 
154  {
155 
156  OutputX = InputX * 0.01f;
157 
158  OutputY = -InputY * 0.01f;
159 
160  OutputZ = InputZ * 0.01f;
161 
162  }
163 
164 
165 
183  static FVector RotationUEVectorToROS(const FVector& Input, const bool bDegToRad = true)
184 
185  {
186 
187  FVector output = Input;
188 
189  output.Y = -output.Y;
190 
191  output.Z = -output.Z;
192 
193 
194 
195  return bDegToRad ? FMath::DegreesToRadians(output) : output;
196 
197  }
198 
199 
200 
201 
206  static FRotator RotatorUEToROS(const FRotator& Input, const bool bDegToRad = true)
207 
208  {
209 
210  FRotator output = Input;
211 
212  output.Roll = bDegToRad ? FMath::DegreesToRadians(output.Roll) : output.Roll;
213 
214  output.Pitch = -bDegToRad ? FMath::DegreesToRadians(output.Pitch) : output.Pitch;
215 
216  output.Yaw = -bDegToRad ? FMath::DegreesToRadians(output.Yaw) : output.Yaw;
217 
218 
219 
220  return output;
221 
222  }
223 
224 
225 
226 
231  static FQuat QuatUEToROS(const FQuat& Input)
232 
233  {
234 
235  FQuat Output = Input;
236 
237 
238 
239  Output.X = -Output.X;
240 
241  Output.Z = -Output.Z;
242 
243 
244 
245  return Output;
246 
247  }
248 
249 
250 
251 
256  static FTransform TransformUEToROS(const FTransform& Input)
257 
258  {
259 
260  FTransform Output = Input;
261 
262 
263 
264  Output.SetTranslation(VectorUEToROS(Input.GetTranslation()));
265 
266  Output.SetRotation(QuatUEToROS(Input.GetRotation()));
267 
268 
269 
270  return Output;
271 
272  }
273 
274 
275 
276 
281  static FROSOdom OdomUEToROS(const FROSOdom& Input)
282 
283  {
284 
285  FROSOdom Output = Input;
286 
287 
288 
289  Output.Pose.Pose.Position = VectorUEToROS(Input.Pose.Pose.Position);
290 
291  Output.Pose.Pose.Orientation = QuatUEToROS(Output.Pose.Pose.Orientation);
292 
293 
294 
295  Output.Twist.Twist.Linear = VectorUEToROS(Output.Twist.Twist.Linear);
296 
297  Output.Twist.Twist.Angular = RotationUEVectorToROS(Output.Twist.Twist.Angular);
298 
299 
300 
301  return Output;
302 
303  }
304 
305 
306 
307  // ROS to UE conversion
308 
309  // m -> cm
310 
311  // rad -> degree
312 
313  // Right handed -> Left handed
314 
315 
316 
317 
322  static FVector VectorROSToUE(const FVector& Input)
323 
324  {
325 
326  return 100.f * ConvertHandedness(Input);
327 
328  }
329 
330 
331 
332  FORCEINLINE static void VectorROSToUE(const FVector& Input, FVector& Output)
333 
334  {
335 
336  Output.Set(Input.X * 100.f, -Input.Y * 100.f, Input.Z * 100.f);
337 
338  }
339 
340 
341 
342  FORCEINLINE static void VectorROSToUE(const double& InputX,
343 
344  const double& InputY,
345 
346  const double& InputZ,
347 
348  double& OutputX,
349 
350  double& OutputY,
351 
352  double& OutputZ)
353 
354  {
355 
356  OutputX = InputX * 100.f;
357 
358  OutputY = -InputY * 100.f;
359 
360  OutputZ = InputZ * 100.f;
361 
362  }
363 
364 
365 
383  static FVector RotationROSToUEVector(const FVector& Input, const bool bRadToDeg = true)
384 
385  {
386 
387  FVector output = Input;
388 
389  output.Y = -output.Y;
390 
391  output.Z = -output.Z;
392 
393 
394 
395  return bRadToDeg ? FMath::RadiansToDegrees(output) : output;
396 
397  }
398 
399 
400 
401 
406  static FRotator RotatorROSToUE(const FRotator& Input, const bool bRadToDeg = true)
407 
408  {
409 
410  FRotator output = Input;
411 
412  output.Roll = bRadToDeg ? FMath::RadiansToDegrees(output.Roll) : output.Roll;
413 
414  output.Pitch = -bRadToDeg ? FMath::RadiansToDegrees(output.Pitch) : output.Pitch;
415 
416  output.Yaw = -bRadToDeg ? FMath::RadiansToDegrees(output.Yaw) : output.Yaw;
417 
418 
419 
420  return output;
421 
422  }
423 
424 
425 
426 
431  static FQuat QuatROSToUE(const FQuat& Input)
432 
433  {
434 
435  FQuat Output = Input;
436 
437 
438 
439  Output.X = -Output.X;
440 
441  Output.Z = -Output.Z;
442 
443 
444 
445  return Output;
446 
447  }
448 
449 
450 
451 
456  static FTransform TransformROSToUE(const FTransform& Input)
457 
458  {
459 
460  FTransform Output = Input;
461 
462 
463 
464  Output.SetTranslation(VectorROSToUE(Input.GetTranslation()));
465 
466  Output.SetRotation(QuatROSToUE(Input.GetRotation()));
467 
468 
469 
470  return Output;
471 
472  }
473 
474 
475 
495  static FROSOdom OdomROSToUE(const FROSOdom& Input)
496 
497  {
498 
499  FROSOdom Output = Input;
500 
501 
502 
503  VectorROSToUE(Input.Pose.Pose.Position, Output.Pose.Pose.Position);
504 
505  Output.Pose.Pose.Orientation = QuatROSToUE(Output.Pose.Pose.Orientation);
506 
507 
508 
509  Output.Twist.Twist.Linear = VectorROSToUE(Output.Twist.Twist.Linear);
510 
511  Output.Twist.Twist.Angular = RotationROSToUEVector(Output.Twist.Twist.Angular);
512 
513 
514 
515  return Output;
516 
517  }
518 
519 
520 
538  static FTransform PoseROSToUETransform(const FROSPose& InROSPose)
539 
540  {
541 
542  return FTransform(URRConversionUtils::QuatROSToUE(InROSPose.Orientation),
543 
544  URRConversionUtils::VectorROSToUE(InROSPose.Position));
545 
546  }
547 
548 
549 
550  // time to ROS stamp
551 
552 
557  static FROSTime FloatToROSStamp(const float InTimeSec)
558 
559  {
560 
561  FROSTime stamp;
562 
563  stamp.Sec = static_cast<int32>(InTimeSec);
564 
565  stamp.Nanosec = uint32((InTimeSec - stamp.Sec) * 1e+09f);
566 
567  return stamp;
568 
569  }
570 
571 
572 
573  static FROSTime GetCurrentROS2Time(const UObject* InContextObject)
574 
575  {
576 
577  return FloatToROSStamp(UGameplayStatics::GetTimeSeconds(InContextObject->GetWorld()));
578 
579  }
580 
581 
582 
583  static float ROSStampToFloat(const FROSTime& InTimeStamp)
584 
585  {
586 
587  return InTimeStamp.Sec + InTimeStamp.Nanosec * 1e-09f;
588 
589  }
590 
591 
592 
593  template<typename T>
594 
595  static FString ToString(const T& InValue)
596 
597  {
598 
599  if constexpr (TIsArithmetic<T>::Value || TIsIntegral<T>::Value)
600 
601  {
602 
603  return FString::FromInt(InValue);
604 
605  }
606 
607  else if constexpr (TIsFloatingPoint<T>::Value)
608 
609  {
610 
611  return FString::SanitizeFloat(InValue);
612 
613  }
614 
615  else if constexpr (TIsCharType<T>::Value || TIsCharPointer<T>::Value)
616 
617  {
618 
619  return FString(InValue);
620 
621  }
622 
623  else if constexpr (TIsSame<T, FName>::Value || TIsSame<T, FText>::Value)
624 
625  {
626 
627  return InValue.ToString();
628 
629  }
630 
631  else if constexpr (TIsSame<T, FString>::Value)
632 
633  {
634 
635  return InValue;
636 
637  }
638 
639  else
640 
641  {
642 
643  UE_LOG_WITH_INFO(LogTemp, Error, TEXT("[%s] is not yet supported"), TNameOf<T>::GetName());
644 
645  }
646 
647  return FString();
648 
649  }
650 
651 
652 
653  template<typename T>
654 
655  static FString ArrayToString(const TArray<T>& InArray, const TCHAR* InDelimiter = TEXT(","))
656 
657  {
658 
659  return FString::JoinBy(InArray, InDelimiter, [](const T& InElement) { return URRConversionUtils::ToString(InElement); });
660 
661  }
662 
663 
664 
665  template<typename T, std::size_t N>
666 
667  static FString ArrayToString(const T (&InArray)[N], const TCHAR* InDelimiter = TEXT(","))
668 
669  {
670 
671  TArray<FString> strArray;
672 
673  for (auto i = 0; i < URRCoreUtils::GetArraySize<T, N>(InArray); ++i)
674 
675  {
676 
677  strArray.Add(URRConversionUtils::ToString(InArray[i]));
678 
679  }
680 
681  return FString::Join(strArray, InDelimiter);
682 
683  }
684 
685 
686 
687  // HitResult
688 
689 
694  static FROSHitResult HitResultUEToROS(const FHitResult& InHit)
695 
696  {
697 
698  FROSHitResult result;
699 
700  result.bBlockingHit = InHit.bBlockingHit;
701 
702  result.bStartPenetrating = InHit.bStartPenetrating;
703 
704  result.ComponentName = InHit.Component->GetName();
705 
706  result.ActorName = InHit.HitObjectHandle.GetName();
707 
708  result.Distance = InHit.Distance;
709 
710  result.ElementIndex = InHit.ElementIndex;
711 
712  result.FaceIndex = InHit.FaceIndex;
713 
714  result.BoneName = InHit.BoneName.ToString();
715 
716  result.Item = InHit.Item;
717 
718  result.MyBoneName = InHit.MyBoneName.ToString();
719 
720  result.MyItem = InHit.MyItem;
721 
722  result.PenetrationDepth = InHit.PenetrationDepth;
723 
724  result.PhysicsMaterialName = InHit.PhysMaterial == nullptr ? TEXT("") : InHit.PhysMaterial->GetName();
725 
726  result.Time = InHit.Time;
727 
728  result.ImpactNormal = InHit.ImpactNormal;
729 
730  result.ImpactPoint = InHit.ImpactPoint;
731 
732  result.Normal = InHit.Normal;
733 
734  result.Location = InHit.Location;
735 
736  result.TraceStart = InHit.TraceStart;
737 
738  result.TraceEnd = InHit.TraceEnd;
739 
740 
741 
742  return result;
743 
744  }
745 
746 };
747 
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:206
URRConversionUtils::FloatToROSStamp
static FROSTime FloatToROSStamp(const float InTimeSec)
Definition: RRConversionUtils.h:557
RRTypeUtils.h
UE type related utils.
URRConversionUtils::VectorROSToUE
static FVector VectorROSToUE(const FVector &Input)
Definition: RRConversionUtils.h:322
URRConversionUtils::VectorUEToROS
static FVector VectorUEToROS(const FVector &Input)
Definition: RRConversionUtils.h:132
URRConversionUtils::OdomROSToUE
static FROSOdom OdomROSToUE(const FROSOdom &Input)
Convert Odom from ROS system to UE system.
Definition: RRConversionUtils.h:495
URRConversionUtils::TransformUEToROS
static FTransform TransformUEToROS(const FTransform &Input)
Definition: RRConversionUtils.h:256
URRConversionUtils::QuatUEToROS
static FQuat QuatUEToROS(const FQuat &Input)
Definition: RRConversionUtils.h:231
URRConversionUtils::VectorUEToROS
static FORCEINLINE void VectorUEToROS(const double &InputX, const double &InputY, const double &InputZ, double &OutputX, double &OutputY, double &OutputZ)
Definition: RRConversionUtils.h:142
URRConversionUtils
Definition: RRConversionUtils.h:54
URRConversionUtils::RotatorROSToUE
static FRotator RotatorROSToUE(const FRotator &Input, const bool bRadToDeg=true)
Definition: RRConversionUtils.h:406
URRConversionUtils::ROSStampToFloat
static float ROSStampToFloat(const FROSTime &InTimeStamp)
Definition: RRConversionUtils.h:583
URRConversionUtils::HitResultUEToROS
static FROSHitResult HitResultUEToROS(const FHitResult &InHit)
Definition: RRConversionUtils.h:694
URRConversionUtils::SizeROSToUE
static T SizeROSToUE(const T &InROSSize)
Definition: RRConversionUtils.h:93
URRConversionUtils::TransformROSToUE
static FTransform TransformROSToUE(const FTransform &Input)
Definition: RRConversionUtils.h:456
URRConversionUtils::VectorROSToUE
static FORCEINLINE void VectorROSToUE(const double &InputX, const double &InputY, const double &InputZ, double &OutputX, double &OutputY, double &OutputZ)
Definition: RRConversionUtils.h:342
URRConversionUtils::SizeUEToROS
static T SizeUEToROS(const T &InUESize)
Definition: RRConversionUtils.h:117
URRConversionUtils::PoseROSToUETransform
static FTransform PoseROSToUETransform(const FROSPose &InROSPose)
Convert ROS Pose to UE Transform.
Definition: RRConversionUtils.h:538
URRConversionUtils::QuatROSToUE
static FQuat QuatROSToUE(const FQuat &Input)
Definition: RRConversionUtils.h:431
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:383
URRConversionUtils::VectorROSToUE
static FORCEINLINE void VectorROSToUE(const FVector &Input, FVector &Output)
Definition: RRConversionUtils.h:332
URRConversionUtils::DistanceROSToUE
static T DistanceROSToUE(const T &InROSDistance)
Definition: RRConversionUtils.h:81
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:183
URRConversionUtils::DistanceUEToROS
static T DistanceUEToROS(const T &InUESize)
Definition: RRConversionUtils.h:105
URRConversionUtils::ArrayToString
static FString ArrayToString(const T(&InArray)[N], const TCHAR *InDelimiter=TEXT(","))
Definition: RRConversionUtils.h:667
URRConversionUtils::GetCurrentROS2Time
static FROSTime GetCurrentROS2Time(const UObject *InContextObject)
Definition: RRConversionUtils.h:573
URRConversionUtils::OdomUEToROS
static FROSOdom OdomUEToROS(const FROSOdom &Input)
Definition: RRConversionUtils.h:281
TIsCharPointer
Definition: RRTypeUtils.h:83
URRConversionUtils::ToString
static FString ToString(const T &InValue)
Definition: RRConversionUtils.h:595
RRCoreUtils.h
Core utils.
URRConversionUtils::ArrayToString
static FString ArrayToString(const TArray< T > &InArray, const TCHAR *InDelimiter=TEXT(","))
Definition: RRConversionUtils.h:655