8#include "Engine/Engine.h"
24#include "Engine/StaticMeshActor.h"
34 0.008587261043925865f,
35 0.0008542188930970716f
44 bool AreValid(
const TArray<FActorDefinition> &ActorDefinitions)
46 return AreValid(TEXT(
"Actor Definition"), ActorDefinitions);
52 auto ScopeText = FString::Printf(TEXT(
"[Actor Definition : %s]"), *Definition.
Id);
60 template <
typename T,
typename... ARGS>
74 TCHAR Formatted[4096];
75 FCString::Snprintf(Formatted, UE_ARRAY_COUNT(Formatted), Format, std::forward<ARGS>(Args)...);
78 UE_LOG(LogCarla, Error, TEXT(
"%s"), *Message);
82 GEngine->AddOnScreenDebugMessage(42, 15.0f, FColor::Red, Message);
90 FString
GetDisplayId(
const FString &Type,
size_t Index,
const T &Item)
92 return FString::Printf(TEXT(
"[%s %d : %s]"), *Type, Index, *Item.Id);
95 FString
GetDisplayId(
const FString &Type,
size_t Index,
const FString &Item)
97 return FString::Printf(TEXT(
"[%s %d : %s]"), *Type, Index, *Item);
102 template <
typename T,
typename F>
103 bool ForEach(
const FString &Type,
const TArray<T> &Array, F Validator)
107 for (
const auto &Item : Array)
110 Result &= Validator(Item);
118 template <
typename T>
119 bool AreValid(
const FString &Type,
const TArray<T> &Array)
121 return ForEach(Type, Array, [
this](
const auto &Item)
128 return OnScreenAssert((!Id.IsEmpty() && Id != TEXT(
".")), TEXT(
"Id cannot be empty"));
134 return OnScreenAssert(!Tags.IsEmpty(), TEXT(
"Tags cannot be empty"));
140 return OnScreenAssert(Type < EActorAttributeType::SIZE, TEXT(
"Invalid type"));
155 { return ValueIsValid(Variation.Type, Value); });
177template <
typename... ARGS>
178static FString
JoinStrings(
const FString &Separator, ARGS &&...Args)
180 return FString::Join(TArray<FString>{std::forward<ARGS>(Args)...}, *Separator);
187 FString::FromInt(Color.R),
188 FString::FromInt(Color.G),
189 FString::FromInt(Color.B));
196 FString::SanitizeFloat(TextVector.X),
197 FString::SanitizeFloat(TextVector.Y),
198 FString::SanitizeFloat(TextVector.Z));
214 return Validator.
AreValid(ActorDefinitions);
221template <
typename... TStrs>
224 Def.
Id =
JoinStrings(TEXT(
"."), std::forward<TStrs>(Strings)...).ToLower();
225 Def.
Tags =
JoinStrings(TEXT(
","), std::forward<TStrs>(Strings)...).ToLower();
229 ActorRole.
Id = TEXT(
"role_name");
238 Var.
Id = TEXT(
"ros_name");
249 Var.
Id = TEXT(
"ros_topic_name");
259 TArray<FString> &&RecommendedValues)
261 for (
auto &&ActorVariation : Definition.
Variations)
263 if (ActorVariation.Id ==
"role_name")
265 ActorVariation.RecommendedValues = RecommendedValues;
273 AddRecommendedValuesForActorRoleName(Definition, {TEXT(
"front"), TEXT(
"back"), TEXT(
"left"), TEXT(
"right"), TEXT(
"front_left"), TEXT(
"front_right"), TEXT(
"back_left"), TEXT(
"back_right")});
280 Tick.
Id = TEXT(
"sensor_tick");
292 Friction.
Id = FString(
"friction");
299 FString Extent(
"extent");
300 FString Coordinates[3] = {FString(
"x"), FString(
"y"), FString(
"z")};
302 for (
auto Coordinate : Coordinates)
306 ExtentCoordinate.
Id =
JoinStrings(TEXT(
"_"), Extent, Coordinate);
316 const FString &Category,
340 ShowOnlyTags.
Id = TEXT(
"show_only_tags");
346 ShadowCatcherTags.
Id = TEXT(
"shadow_catcher_tags");
352 ShowOnlyActorIds.
Id = TEXT(
"show_only_actor_ids");
357 Definition.
Variations.Append({ShowOnlyTags, ShadowCatcherTags, ShowOnlyActorIds});
360template <
typename CameraT>
364 const auto &Variations = Description.
Variations;
365 if (Variations.Contains(
"show_only_tags"))
366 Camera->SetShowOnlyTags(L::RetrieveActorAttributeToString(
"show_only_tags", Variations, TEXT(
"")));
367 if (Variations.Contains(
"shadow_catcher_tags"))
368 Camera->SetShadowCatcherTags(L::RetrieveActorAttributeToString(
"shadow_catcher_tags", Variations, TEXT(
"")));
369 if (Variations.Contains(
"show_only_actor_ids"))
370 Camera->SetShowOnlyActorIds(L::RetrieveActorAttributeToString(
"show_only_actor_ids", Variations, TEXT(
"")));
375 const bool bEnableModifyingPostProcessEffects)
386 const bool bEnableModifyingPostProcessEffects,
390 FillIdAndTags(Definition, TEXT(
"sensor"), TEXT(
"camera"), Id);
396 FOV.
Id = TEXT(
"fov");
403 ResX.
Id = TEXT(
"image_size_x");
409 ResY.
Id = TEXT(
"image_size_y");
416 LensCircleFalloff.
Id = TEXT(
"lens_circle_falloff");
422 LensCircleMultiplier.
Id = TEXT(
"lens_circle_multiplier");
428 LensK.
Id = TEXT(
"lens_k");
434 LensKcube.
Id = TEXT(
"lens_kcube");
440 LensXSize.
Id = TEXT(
"lens_x_size");
446 LensYSize.
Id = TEXT(
"lens_y_size");
457 UseRayTracing.
Id = TEXT(
"use_ray_tracing");
469 EnableDLSS.
Id = TEXT(
"enable_dlss");
475 DLSSScreenPercentage.
Id = TEXT(
"dlss_screen_percentage");
486 LensCircleMultiplier,
493 DLSSScreenPercentage});
495 if (bEnableModifyingPostProcessEffects)
498 PostProccess.
Id = TEXT(
"enable_postprocess_effects");
505 post_process_profile.
Id = TEXT(
"post_process_profile");
510 Definition.
Variations.Append({PostProccess, post_process_profile});
521 bool bEnableModifyingPostProcessEffects)
532 bool bEnableModifyingPostProcessEffects,
536 FillIdAndTags(Definition, TEXT(
"sensor"), TEXT(
"camera"), Id + TEXT(
"_fisheye"));
543 CameraModel.
Id = TEXT(
"camera_model");
548 TEXT(
"stereographic"),
551 TEXT(
"orthographic"),
552 TEXT(
"kannala_brandt"),
564 WAL_Fx.
Id = TEXT(
"fx");
570 WAL_Fy.
Id = TEXT(
"fy");
576 WAL_Cx.
Id = TEXT(
"cx");
582 WAL_Cy.
Id = TEXT(
"cy");
590 WAL_Lut.
Id = TEXT(
"lut");
596 WAL_ThetaMaxDeg.
Id = TEXT(
"theta_max_deg");
605 WAL_FaceSize.
Id = TEXT(
"face_size");
640 WAL_FOV.
Id = TEXT(
"fov");
647 FocalLength.
Id = TEXT(
"focal_length");
653 WAL_Perspective.
Id = TEXT(
"perspective");
659 Equirectangular.
Id = TEXT(
"equirectangular");
665 FOVMask.
Id = TEXT(
"fov_mask");
671 FOVFadeSize.
Id = TEXT(
"fov_fade_size");
677 LongitudeOffset.
Id = TEXT(
"longitude_offset");
684 WAL_ResX.
Id = TEXT(
"image_size_x");
690 WAL_ResY.
Id = TEXT(
"image_size_y");
697 WAL_LensCircleFalloff.
Id = TEXT(
"lens_circle_falloff");
703 WAL_LensCircleMultiplier.
Id = TEXT(
"lens_circle_multiplier");
709 WAL_LensK.
Id = TEXT(
"lens_k");
715 WAL_LensKcube.
Id = TEXT(
"lens_kcube");
721 WAL_LensXSize.
Id = TEXT(
"lens_x_size");
727 WAL_LensYSize.
Id = TEXT(
"lens_y_size");
735 WAL_Fx, WAL_Fy, WAL_Cx, WAL_Cy,
736 WAL_Lut, WAL_ThetaMaxDeg, WAL_FaceSize,
746 WAL_LensCircleFalloff,
747 WAL_LensCircleMultiplier,
753 if (bEnableModifyingPostProcessEffects)
756 PostProccess.
Id = TEXT(
"enable_postprocess_effects");
765 WAL_PostProcessProfile.
Id = TEXT(
"post_process_profile");
772 WAL_Gamma.
Id = TEXT(
"gamma");
779 MBIntesity.
Id = TEXT(
"motion_blur_intensity");
785 MBMaxDistortion.
Id = TEXT(
"motion_blur_max_distortion");
791 MBMinObjectScreenSize.
Id = TEXT(
"motion_blur_min_object_screen_size");
798 LensFlareIntensity.
Id = TEXT(
"lens_flare_intensity");
805 BloomIntensity.
Id = TEXT(
"bloom_intensity");
812 ExposureMode.
Id = TEXT(
"exposure_mode");
818 ExposureCompensation.
Id = TEXT(
"exposure_compensation");
825 ShutterSpeed.
Id = TEXT(
"shutter_speed");
832 ISO.
Id = TEXT(
"iso");
839 Aperture.
Id = TEXT(
"fstop");
845 ExposureMinBright.
Id = TEXT(
"exposure_min_bright");
851 ExposureMaxBright.
Id = TEXT(
"exposure_max_bright");
857 ExposureSpeedUp.
Id = TEXT(
"exposure_speed_up");
863 ExposureSpeedDown.
Id = TEXT(
"exposure_speed_down");
870 CalibrationConstant.
Id = TEXT(
"calibration_constant");
877 FocalDistance.
Id = TEXT(
"focal_distance");
884 DepthBlurAmount.
Id = TEXT(
"blur_amount");
891 DepthBlurRadius.
Id = TEXT(
"blur_radius");
897 MaxAperture.
Id = TEXT(
"min_fstop");
903 BladeCount.
Id = TEXT(
"blade_count");
909 FilmSlope.
Id = TEXT(
"slope");
915 FilmToe.
Id = TEXT(
"toe");
921 FilmShoulder.
Id = TEXT(
"shoulder");
927 FilmBlackClip.
Id = TEXT(
"black_clip");
933 FilmWhiteClip.
Id = TEXT(
"white_clip");
940 Temperature.
Id = TEXT(
"temp");
946 Tint.
Id = TEXT(
"tint");
952 ChromaticIntensity.
Id = TEXT(
"chromatic_aberration_intensity");
958 ChromaticOffset.
Id = TEXT(
"chromatic_aberration_offset");
965 ExposureCompensation,
970 WAL_PostProcessProfile,
976 MBMinObjectScreenSize,
1014 FillIdAndTags(Definition, TEXT(
"sensor"), TEXT(
"camera"), TEXT(
"normals"));
1020 FOV.
Id = TEXT(
"fov");
1027 ResX.
Id = TEXT(
"image_size_x");
1033 ResY.
Id = TEXT(
"image_size_y");
1040 LensCircleFalloff.
Id = TEXT(
"lens_circle_falloff");
1046 LensCircleMultiplier.
Id = TEXT(
"lens_circle_multiplier");
1052 LensK.
Id = TEXT(
"lens_k");
1058 LensKcube.
Id = TEXT(
"lens_kcube");
1064 LensXSize.
Id = TEXT(
"lens_x_size");
1070 LensYSize.
Id = TEXT(
"lens_y_size");
1080 UseRayTracing.
Id = TEXT(
"use_ray_tracing");
1089 LensCircleMultiplier,
1101 const bool bEnableModifyingPostProcessEffects)
1112 const bool bEnableModifyingPostProcessEffects,
1116 FillIdAndTags(Definition, TEXT(
"sensor"), TEXT(
"camera"), Id);
1122 FOV.
Id = TEXT(
"fov");
1129 ResX.
Id = TEXT(
"image_size_x");
1135 ResY.
Id = TEXT(
"image_size_y");
1144 UseRayTracing.
Id = TEXT(
"use_ray_tracing");
1151 CameraModelVar.
Id = TEXT(
"camera_model");
1155 TEXT(
"perspective"),
1156 TEXT(
"stereographic"),
1157 TEXT(
"equidistant"),
1159 TEXT(
"orthographic"),
1160 TEXT(
"kannala_brandt"),
1161 TEXT(
"brown_conrady"),
1172 DistortionCoeffs.
Id = TEXT(
"distortion_coeffs");
1179 Lut.
Id = TEXT(
"lut");
1213 ThetaMaxDeg.
Id = TEXT(
"theta_max_deg");
1220 ApertureFstop.
Id = TEXT(
"aperture_fstop");
1226 FocusDistanceM.
Id = TEXT(
"focus_distance_m");
1233 CAShiftR.
Id = TEXT(
"ca_shift_r");
1239 CAShiftB.
Id = TEXT(
"ca_shift_b");
1246 SamplesPerPixel.
Id = TEXT(
"samples_per_pixel");
1252 EnableDenoiser.
Id = TEXT(
"enable_denoiser");
1262 RTExposureMode.
Id = TEXT(
"exposure_mode");
1267 RTExposureCompensation.
Id = TEXT(
"exposure_compensation");
1291 RTExposureCompensation});
1293 if (bEnableModifyingPostProcessEffects)
1296 PostProccess.
Id = TEXT(
"enable_postprocess_effects");
1302 post_process_profile.
Id = TEXT(
"post_process_profile");
1307 Definition.
Variations.Append({PostProccess, post_process_profile});
1328 FillIdAndTags(Definition, TEXT(
"sensor"), TEXT(
"other"), TEXT(
"imu"));
1333 NoiseSeed.
Id = TEXT(
"noise_seed");
1341 StdDevAccelX.
Id = TEXT(
"noise_accel_stddev_x");
1347 StdDevAccelY.
Id = TEXT(
"noise_accel_stddev_y");
1353 StdDevAccelZ.
Id = TEXT(
"noise_accel_stddev_z");
1361 StdDevGyroX.
Id = TEXT(
"noise_gyro_stddev_x");
1367 StdDevGyroY.
Id = TEXT(
"noise_gyro_stddev_y");
1373 StdDevGyroZ.
Id = TEXT(
"noise_gyro_stddev_z");
1381 BiasGyroX.
Id = TEXT(
"noise_gyro_bias_x");
1387 BiasGyroY.
Id = TEXT(
"noise_gyro_bias_y");
1393 BiasGyroZ.
Id = TEXT(
"noise_gyro_bias_z");
1425 FillIdAndTags(Definition, TEXT(
"sensor"), TEXT(
"other"), TEXT(
"radar"));
1429 HorizontalFOV.
Id = TEXT(
"horizontal_fov");
1435 VerticalFOV.
Id = TEXT(
"vertical_fov");
1441 Range.
Id = TEXT(
"range");
1447 PointsPerSecond.
Id = TEXT(
"points_per_second");
1454 NoiseSeed.
Id = TEXT(
"noise_seed");
1483 FillIdAndTags(Definition, TEXT(
"sensor"), TEXT(
"lidar"), Id);
1488 Channels.
Id = TEXT(
"channels");
1493 Range.
Id = TEXT(
"range");
1498 PointsPerSecond.
Id = TEXT(
"points_per_second");
1503 Frequency.
Id = TEXT(
"rotation_frequency");
1508 UpperFOV.
Id = TEXT(
"upper_fov");
1513 LowerFOV.
Id = TEXT(
"lower_fov");
1518 HorizontalFOV.
Id = TEXT(
"horizontal_fov");
1523 AtmospAttenRate.
Id = TEXT(
"atmosphere_attenuation_rate");
1528 NoiseSeed.
Id = TEXT(
"noise_seed");
1534 DropOffGenRate.
Id = TEXT(
"dropoff_general_rate");
1539 DropOffIntensityLimit.
Id = TEXT(
"dropoff_intensity_limit");
1544 DropOffAtZeroIntensity.
Id = TEXT(
"dropoff_zero_intensity");
1549 StdDevLidar.
Id = TEXT(
"noise_stddev");
1553 if (Id ==
"ray_cast")
1564 DropOffIntensityLimit,
1565 DropOffAtZeroIntensity,
1569 else if (Id ==
"hss_lidar")
1572 HorizontalResolution.
Id = TEXT(
"horizontal_resolution");
1592 DropOffIntensityLimit,
1593 DropOffAtZeroIntensity,
1596 HorizontalResolution});
1598 else if (Id ==
"ray_cast_semantic")
1637 FillIdAndTags(Definition, TEXT(
"sensor"), TEXT(
"other"), TEXT(
"vehicle_status"));
1642 TEXT(
"speed_units"),
1656 FillIdAndTags(Definition, TEXT(
"sensor"), TEXT(
"other"), Name);
1661 NoiseSeed.
Id = TEXT(
"noise_seed");
1668 StdDevLat.
Id = TEXT(
"noise_lat_stddev");
1673 BiasLat.
Id = TEXT(
"noise_lat_bias");
1680 StdDevLong.
Id = TEXT(
"noise_lon_stddev");
1685 BiasLong.
Id = TEXT(
"noise_lon_bias");
1692 StdDevAlt.
Id = TEXT(
"noise_alt_stddev");
1697 BiasAlt.
Id = TEXT(
"noise_alt_bias");
1721 {TEXT(
"autopilot"), TEXT(
"scenario"), TEXT(
"ego_vehicle")});
1725 Definition.
Class = Parameters.
Class.LoadSynchronous();
1730 Colors.
Id = TEXT(
"color");
1743 Drivers.
Id = TEXT(
"driver_id");
1754 StickyControl.
Id = TEXT(
"sticky_control");
1758 Definition.
Variations.Emplace(StickyControl);
1761 TerramechanicsAttribute.
Id = TEXT(
"terramechanics");
1765 Definition.
Variations.Emplace(TerramechanicsAttribute);
1771 ROS2AckermannControl.
Id = TEXT(
"ros2_ackermann_control");
1775 Definition.
Variations.Emplace(ROS2AckermannControl);
1780 ROS2AutowareControl.
Id = TEXT(
"ros2_autoware_control");
1784 Definition.
Variations.Emplace(ROS2AutowareControl);
1787 TEXT(
"object_type"),
1798 TEXT(
"special_type"),
1804 TEXT(
"number_of_wheels"),
1816 TEXT(
"has_dynamic_doors"),
1824 Parameters.
HasLights ? TEXT(
"true") : TEXT(
"false")});
1828template <
typename T,
typename Functor>
1830 const TArray<T> &ParameterArray,
1831 TArray<FActorDefinition> &Definitions,
1834 for (
auto &Item : ParameterArray)
1838 Maker(Item,
Success, Definition);
1841 Definitions.Emplace(std::move(Definition));
1847 const TArray<FVehicleParameters> &ParameterArray,
1848 TArray<FActorDefinition> &Definitions)
1859 FillIdAndTags(Definition, TEXT(
"walker"), TEXT(
"pedestrian"), Parameters.
Id);
1862 Definition.
Class = Parameters.
Class.LoadSynchronous();
1868 case EPedestrianGender::Female:
1869 return TEXT(
"female");
1870 case EPedestrianGender::Male:
1871 return TEXT(
"male");
1873 return TEXT(
"other");
1881 case EPedestrianAge::Child:
1882 return TEXT(
"child");
1883 case EPedestrianAge::Teenager:
1884 return TEXT(
"teenager");
1885 case EPedestrianAge::Elderly:
1886 return TEXT(
"elderly");
1888 return TEXT(
"adult");
1895 GetGender(Parameters.
Gender)});
1905 GetAge(Parameters.
Age)});
1908 TEXT(
"can_use_wheelchair"),
1913 TEXT(
"special_type"),
1917 if (Parameters.
Speed.Num() > 0)
1920 Speed.
Id = TEXT(
"speed");
1922 for (
auto &Value : Parameters.
Speed)
1931 IsInvincible.
Id = TEXT(
"is_invincible");
1938 WheelChairVariation.
Id = TEXT(
"use_wheelchair");
1949 Definition.
Variations.Emplace(WheelChairVariation);
1955 const TArray<FPedestrianParameters> &ParameterArray,
1956 TArray<FActorDefinition> &Definitions)
1962 const TArray<FString> &ParameterArray,
1963 TArray<FActorDefinition> &Definitions)
1973 FillIdAndTags(Definition, TEXT(
"static"), TEXT(
"trigger"), Id);
1988 Definition.
Class = AStaticMeshActor::StaticClass();
1989 if (!Parameters.
Mesh.IsNull())
1994 {Parameters.
Mesh.ToSoftObjectPath().ToString()},
2002 case EPropSize::Tiny:
2003 return TEXT(
"tiny");
2004 case EPropSize::Small:
2005 return TEXT(
"small");
2006 case EPropSize::Medium:
2007 return TEXT(
"medium");
2008 case EPropSize::Big:
2010 case EPropSize::Huge:
2011 return TEXT(
"huge");
2013 return TEXT(
"unknown");
2020 GetSize(Parameters.
Size)});
2036 const TArray<FPropParameters> &ParameterArray,
2037 TArray<FActorDefinition> &Definitions)
2052 FString ClassPath = Parameters.
Path;
2053 if (!ClassPath.IsEmpty() && !ClassPath.EndsWith(TEXT(
"_C")))
2055 ClassPath += TEXT(
"_C");
2057 Definition.
Class = LoadClass<AActor>(
nullptr, *ClassPath);
2067 const TArray<FBlueprintParameters> &ParameterArray,
2068 TArray<FActorDefinition> &Definitions)
2074 const FString &Type,
2084 distance.RecommendedValues = {TEXT(
"5.0")};
2085 distance.bRestrictToRecommended =
false;
2088 hitradius.
Id = TEXT(
"hit_radius");
2094 onlydynamics.
Id = TEXT(
"only_dynamics");
2100 debuglinetrace.
Id = TEXT(
"debug_linetrace");
2120 UE_LOG(LogCarla, Error, TEXT(
"ActorAttribute '%s' is not a bool"), *ActorAttribute.
Id);
2123 return ActorAttribute.
Value.ToBool();
2132 UE_LOG(LogCarla, Error, TEXT(
"ActorAttribute '%s' is not an int"), *ActorAttribute.
Id);
2135 return FCString::Atoi(*ActorAttribute.
Value);
2144 UE_LOG(LogCarla, Error, TEXT(
"ActorAttribute '%s' is not a float"), *ActorAttribute.
Id);
2147 return FCString::Atof(*ActorAttribute.
Value);
2156 UE_LOG(LogCarla, Error, TEXT(
"ActorAttribute '%s' is not a string"), *ActorAttribute.
Id);
2159 return ActorAttribute.
Value;
2168 UE_LOG(LogCarla, Error, TEXT(
"ActorAttribute '%s' is not a color"), *ActorAttribute.
Id);
2171 TArray<FString> Channels;
2172 ActorAttribute.
Value.ParseIntoArray(Channels, TEXT(
","),
false);
2173 if (Channels.Num() != 3)
2177 TEXT(
"ActorAttribute '%s': invalid color '%s'"),
2179 *ActorAttribute.
Value);
2182 TArray<uint8> Colors;
2183 for (
auto &Str : Channels)
2185 auto Val = FCString::Atoi(*Str);
2186 if ((Val < 0) || (Val > std::numeric_limits<uint8>::max()))
2190 TEXT(
"ActorAttribute '%s': invalid color '%s'"),
2192 *ActorAttribute.
Value);
2198 Color.R = Colors[0u];
2199 Color.G = Colors[1u];
2200 Color.B = Colors[2u];
2211 UE_LOG(LogCarla, Error, TEXT(
"ActorAttribute '%s' is not a vector"), *ActorAttribute.
Id);
2214 TArray<FString> Values;
2215 ActorAttribute.
Value.ParseIntoArray(Values, TEXT(
","),
false);
2216 if (Values.Num() != 3)
2220 TEXT(
"ActorAttribute '%s': invalid vector '%s' must contain 3 values separated with comma"),
2222 *ActorAttribute.
Value);
2227 NewVector.X = FCString::Atof(*(Values[0]));
2228 NewVector.Y = FCString::Atof(*(Values[1]));
2229 NewVector.Z = FCString::Atof(*(Values[2]));
2235 const TMap<FString, FActorAttribute> &Attributes,
2243 const TMap<FString, FActorAttribute> &Attributes,
2251 const TMap<FString, FActorAttribute> &Attributes,
2259 const TMap<FString, FActorAttribute> &Attributes,
2267 const TMap<FString, FActorAttribute> &Attributes,
2275 const TMap<FString, FActorAttribute> &Attributes,
2288#define CARLA_ABFL_CHECK_ACTOR(ActorPtr) \
2289 if (!IsValid(ActorPtr)) \
2291 UE_LOG(LogCarla, Error, TEXT("Cannot set empty actor!")); \
2295#define CARLA_ABFL_CHECK_ACTOR(ActorPtr) \
2309 if (Description.
Variations.Contains(
"use_ray_tracing"))
2316 if (Description.
Variations.Contains(
"enable_dlss"))
2322 if (Description.
Variations.Contains(
"enable_postprocess_effects"))
2326 Description.
Variations[
"enable_postprocess_effects"],
2330 "post_process_profile",
2341 PostProcessProfileName);
2374 "camera_model", Variations,
"perspective");
2377 if (CameraModelName == TEXT(
"kannala_brandt"))
2378 CameraModelName = TEXT(
"kannala-brandt");
2380 static const FString Lookup[] =
2382 TEXT(
"perspective"),
2383 TEXT(
"stereographic"),
2384 TEXT(
"equidistant"),
2386 TEXT(
"orthographic"),
2387 TEXT(
"kannala-brandt"),
2388 TEXT(
"brown_conrady"),
2393 using I = std::underlying_type_t<ECameraModel>;
2396 sizeof(Lookup) /
sizeof(Lookup[0]) == (I)ECameraModel::MaxEnum,
2397 "CameraModel string lookup size mismatch.");
2399 I CameraModelID = 0;
2401 while (CameraModelID < (I)ECameraModel::MaxEnum && CameraModelName != Lookup[CameraModelID])
2405 CameraModelID != (I)ECameraModel::MaxEnum ?
2411 UE_LOG(LogCarla, Warning, TEXT(
"camera_model=ftheta is only supported by sensor.camera.rt_lens; rendering perspective."));
2425 const float Coefficients[] =
2434 TArrayView<const float>(Coefficients, 4));
2446 TArray<float> Samples;
2448 TArray<FString> Parts;
2450 .ParseIntoArray(Parts, TEXT(
","),
true);
2451 Samples.Reserve(Parts.Num());
2452 for (
const auto &Part : Parts)
2453 Samples.Add(FCString::Atof(*Part));
2456 if (Samples.Num() < 2 || ThetaMaxDeg <= 0.0f)
2458 UE_LOG(LogCarla, Warning,
2459 TEXT(
"%s: camera_model=lut needs a 'lut' with at least two samples and theta_max_deg > 0 (got %d samples, %.2f deg)."),
2460 *Camera->GetName(), Samples.Num(), ThetaMaxDeg);
2464 UE_LOG(LogCarla, Warning,
2465 TEXT(
"%s: camera_model=lut needs an explicit fx; using fx=1 (lut samples in units of the image width)."),
2466 *Camera->GetName());
2469 Camera->
SetLensLUT(Samples, FMath::DegreesToRadians(ThetaMaxDeg));
2481 if (FocalLength != 0.0f)
2498 if (Variations.Contains(
"enable_postprocess_effects"))
2508 "post_process_profile", Variations, TEXT(
""));
2512 Face, PostProcessProfileName);
2515 if (Variations.Contains(
"gamma"))
2545 constexpr float TO_CENTIMETERS = 1e2;
2581 if (Description.
Variations.Contains(
"noise_seed"))
2610 if (Description.
Variations.Contains(
"noise_seed"))
2639 if (Description.
Variations.Contains(
"noise_seed"))
2667 constexpr float TO_CENTIMETERS = 1e2;
2669 if (Description.
Variations.Contains(
"noise_seed"))
2676 Radar->SetSeed(Radar->GetRandomEngine()->GenerateRandomSeed());
2679 Radar->SetHorizontalFOV(
2681 Radar->SetVerticalFOV(
2685 Radar->SetPointsPerSecond(
2706 FillIdAndTags(Definition, TEXT(
"sensor"), TEXT(
"other"), TEXT(
"v2x"));
2711 ChannelId.
Id = TEXT(
"channel_id");
2718 NoiseSeed.
Id = TEXT(
"noise_seed");
2725 Frequency.
Id = TEXT(
"frequency_ghz");
2731 TransmitPower.
Id = TEXT(
"transmit_power");
2737 ReceiverSensitivity.
Id = TEXT(
"receiver_sensitivity");
2743 CombinedAntennaGain.
Id = TEXT(
"combined_antenna_gain");
2749 Scenario.
Id = TEXT(
"scenario");
2756 PLE.
Id = TEXT(
"path_loss_exponent");
2763 FSPL_RefDistance.
Id = TEXT(
"d_ref");
2769 FilterDistance.
Id = TEXT(
"filter_distance");
2775 EtsiFading.
Id = TEXT(
"use_etsi_fading");
2781 CustomFadingStddev.
Id = TEXT(
"custom_fading_stddev");
2787 GenCamMin.
Id = TEXT(
"gen_cam_min");
2793 GenCamMax.
Id = TEXT(
"gen_cam_max");
2799 FixedRate.
Id = TEXT(
"fixed_rate");
2805 PLModel.
Id = TEXT(
"path_loss_model");
2813 StdDevLat.
Id = TEXT(
"noise_lat_stddev");
2818 BiasLat.
Id = TEXT(
"noise_lat_bias");
2825 StdDevLong.
Id = TEXT(
"noise_lon_stddev");
2830 BiasLong.
Id = TEXT(
"noise_lon_bias");
2837 StdDevAlt.
Id = TEXT(
"noise_alt_stddev");
2842 BiasAlt.
Id = TEXT(
"noise_alt_bias");
2849 StdDevHeading.
Id = TEXT(
"noise_head_stddev");
2854 BiasHeading.
Id = TEXT(
"noise_head_bias");
2863 StdDevAccelX.
Id = TEXT(
"noise_accel_stddev_x");
2869 StdDevAccelY.
Id = TEXT(
"noise_accel_stddev_y");
2875 StdDevAccelZ.
Id = TEXT(
"noise_accel_stddev_z");
2882 StdDevYawrate.
Id = TEXT(
"noise_yawrate_stddev");
2887 BiasYawrate.
Id = TEXT(
"noise_yawrate_bias");
2895 StdDevVelX.
Id = TEXT(
"noise_vel_stddev_x");
2904 ReceiverSensitivity,
2906 CombinedAntennaGain,
2947 FillIdAndTags(Definition, TEXT(
"sensor"), TEXT(
"other"), TEXT(
"v2x_custom"));
2952 ChannelId.
Id = TEXT(
"channel_id");
2959 NoiseSeed.
Id = TEXT(
"noise_seed");
2966 TransmitPower.
Id = TEXT(
"transmit_power");
2972 ReceiverSensitivity.
Id = TEXT(
"receiver_sensitivity");
2978 Frequency.
Id = TEXT(
"frequency_ghz");
2984 CombinedAntennaGain.
Id = TEXT(
"combined_antenna_gain");
2990 Scenario.
Id = TEXT(
"scenario");
2997 PLE.
Id = TEXT(
"path_loss_exponent");
3004 FSPL_RefDistance.
Id = TEXT(
"d_ref");
3010 FilterDistance.
Id = TEXT(
"filter_distance");
3016 EtsiFading.
Id = TEXT(
"use_etsi_fading");
3022 CustomFadingStddev.
Id = TEXT(
"custom_fading_stddev");
3028 PLModel.
Id = TEXT(
"path_loss_model");
3038 ReceiverSensitivity,
3040 CombinedAntennaGain,
3059 if (Description.
Variations.Contains(
"noise_seed"))
3139 if (Description.
Variations.Contains(
"noise_seed"))
3185#undef CARLA_ABFL_CHECK_ACTOR
static constexpr float DefaultKannalaBrandtCoefficients[]
static void AddVariationsForTrigger(FActorDefinition &Def)
static void FillIdAndTags(FActorDefinition &Def, TStrs &&...Strings)
============================================================================
static void SetShowOnlyFromDescription(const FActorDescription &Description, CameraT *Camera)
static void AddShowOnlyVariations(FActorDefinition &Definition)
Show-only render mode attributes shared by every scene-capture camera family (pinhole,...
static void AddRecommendedValuesForSensorRoleNames(FActorDefinition &Definition)
#define CARLA_ABFL_CHECK_ACTOR(ActorPtr)
============================================================================
static void AddRecommendedValuesForActorRoleName(FActorDefinition &Definition, TArray< FString > &&RecommendedValues)
static FString VectorToFString(const FVector &TextVector)
static void AddVariationsForSensor(FActorDefinition &Def)
static FString ColorToFString(const FColor &Color)
static void FillActorDefinitionArray(const TArray< T > &ParameterArray, TArray< FActorDefinition > &Definitions, Functor Maker)
static FString JoinStrings(const FString &Separator, ARGS &&...Args)
#define DEBUG_ASSERT(predicate)
EActorAttributeType
List of valid types for actor attributes.
Autoware GNSS sensor ("sensor.other.autoware_gnss"): streams GeoLocation to the client like the regul...
void SetAltitudeDeviation(float Value)
void SetLatitudeDeviation(float Value)
void SetLongitudeBias(float Value)
void SetLatitudeBias(float Value)
void SetLongitudeDeviation(float Value)
void SetAltitudeBias(float Value)
void SetPathLossModel(const EPathLossModel path_loss_model)
void SetPropagationParams(const float TransmitPower, const float ReceiverSensitivity, const float Frequency, const float combined_antenna_gain, const float path_loss_exponent, const float reference_distance_fspl, const float filter_distance, const bool use_etsi_fading, const float custom_fading_stddev)
void SetScenario(EScenario scenario)
Gnss sensor representation The actual position calculation is done one server side.
void SetLatitudeDeviation(float Value)
void SetLongitudeBias(float Value)
void SetLongitudeDeviation(float Value)
void SetAltitudeDeviation(float Value)
void SetAltitudeBias(float Value)
void SetLatitudeBias(float Value)
void SetGyroscopeBias(const FVector &Vec)
void SetAccelerationStandardDeviation(const FVector &Vec)
void SetGyroscopeStandardDeviation(const FVector &Vec)
A ray-cast based Radar sensor.
void SetTargetGamma(float Gamma)
void EnablePostProcessingEffects(bool Enable=true)
void SetFaceSize(int32 Side)
Side length in pixels of the six cube-face render targets.
void SetCameraCoefficients(TArrayView< const float > Coefficients)
void SetRenderPerspective(bool bEnable)
void SetImageSize(int32 Width, int32 Height)
void SetLensLUT(const TArray< float > &Samples, float ThetaMaxRadians)
LUT1D camera model: R(Theta) samples, uniformly spaced over [0, ThetaMaxRadians], monotonically non-d...
void SetRenderEquirectangularLongitudeOffset(float Shift)
void SetFOVFadeSize(float NewFOVFadeSize)
bool GetRenderEquirectangular() const
void SetFOVMaskEnable(bool bEnable)
void SetFocalLength(float NewFocalLength)
TArrayView< USceneCaptureComponent2D_CARLA * > GetCaptureComponents2D()
void SetCameraModel(ECameraModel NewCameraModel)
void SetLensIntrinsics(float Fx, float Fy, float Cx, float Cy)
Explicit intrinsics in normalized viewport units, the same convention as sensor.camera....
void SetFOVAngle(float NewFOV)
bool GetFOVMaskEnable() const
void SetRenderEquirectangular(bool bEnable)
Base class for sensors using a USceneCaptureComponent2D for rendering the scene.
void SetFOVAngle(float FOVAngle)
void SetImageSize(uint32 Width, uint32 Height)
USceneCaptureComponent2D_CARLA * GetCaptureComponent() const
void SetUseRayTracing(bool Enable)
void EnablePostProcessingEffects(bool Enable=true)
void SetDLSSUpscale(bool Enable, float ScreenPercentage)
Render the capture at ScreenPercentage (25-100) of the target resolution and upscale it back with DLS...
URandomEngine * GetRandomEngine()
void SetSeed(int32 InSeed)
void SetFloatShaderParameter(uint8_t ShaderIndex, const FName &ParameterName, float Value)
A sensor that produces data by applying post-process materials (shaders) to a scene capture image.
void SetFloatShaderParameter(uint8_t ShaderIndex, const FName &ParameterName, float Value)
void SetPropagationParams(const float TransmitPower, const float ReceiverSensitivity, const float Frequency, const float combined_antenna_gain, const float path_loss_exponent, const float reference_distance_fspl, const float filter_distance, const bool use_etsi_fading, const float custom_fading_stddev)
void SetGNSSDeviation(const float noise_lat_stddev, const float noise_lon_stddev, const float noise_alt_stddev, const float noise_head_stddev, const float noise_lat_bias, const float noise_lon_bias, const float noise_alt_bias, const float noise_head_bias)
void SetAccelerationStandardDeviation(const FVector &Vec)
void SetPathLossModel(const EPathLossModel path_loss_model)
void SetScenario(EScenario scenario)
void SetYawrateDeviation(const float noise_yawrate_stddev, const float noise_yawrate_bias)
void SetCaServiceParams(const float GenCamMin, const float GenCamMax, const bool FixedRate)
void SetVelDeviation(const float noise_vel_stddev)
Checks validity of FActorDefinition.
bool IsValid(const FActorVariation &Variation)
bool AreTagsValid(const FString &Tags)
FString GetDisplayId(const FString &Type, size_t Index, const T &Item)
bool SingleIsValid(const FActorDefinition &Definition)
Validate ActorDefinition and display messages on error.
bool IsValid(const EActorAttributeType Type)
bool AreValid(const FString &Type, const TArray< T > &Array)
Applies IsValid to each item in Array.
bool AreValid(const TArray< FActorDefinition > &ActorDefinitions)
Iterate all actor definitions and their properties and display messages on error.
bool ValueIsValid(const EActorAttributeType Type, const FString &Value)
bool IsIdValid(const FString &Id)
bool IsValid(const FActorAttribute &Attribute)
bool ForEach(const FString &Type, const TArray< T > &Array, F Validator)
Applies Validator to each item in Array.
bool OnScreenAssert(bool Predicate, const T &Format, ARGS &&...Args) const
If Predicate is false, print an error message.
FScopedStack< FString > Stack
bool IsValid(const FActorDefinition &ActorDefinition)
FString GetDisplayId(const FString &Type, size_t Index, const FString &Item)
A stack to keep track of nested scopes.
auto PushScope(V &&Value)
Push this scope into the stack.
static FActorDefinition MakeWideAngleLensCameraDefinition(const FString &Id, bool bEnableModifyingPostProcessEffects=false)
static void MakePropDefinitions(const TArray< FPropParameters > &ParameterArray, TArray< FActorDefinition > &Definitions)
static bool ActorAttributeToBool(const FActorAttribute &ActorAttribute, bool Default)
============================================================================
static void MakeTriggerDefinition(const FString &Id, bool &Success, FActorDefinition &Definition)
static FActorDefinition MakeIMUDefinition()
static void SetGnss(const FActorDescription &Description, AGnssSensor *Gnss)
static void SetLidar(const FActorDescription &Description, FLidarDescription &Lidar)
static void SetRadar(const FActorDescription &Description, ARadar *Radar)
static int32 RetrieveActorAttributeToInt(const FString &Id, const TMap< FString, FActorAttribute > &Attributes, int32 Default)
static FVector ActorAttributeToVector(const FActorAttribute &ActorAttribute, const FVector &Default)
static FActorDefinition MakeVehicleStatusDefinition()
static float ActorAttributeToFloat(const FActorAttribute &ActorAttribute, float Default)
static FActorDefinition MakeLidarDefinition(const FString &Id)
static FActorDefinition MakeAutowareGnssDefinition()
static FActorDefinition MakeCustomV2XDefinition()
static FActorDefinition MakeGnssDefinition()
static void MakeTriggerDefinitions(const TArray< FString > &ParameterArray, TArray< FActorDefinition > &Definitions)
static void MakeVehicleDefinition(const FVehicleParameters &Parameters, bool &Success, FActorDefinition &Definition)
static void SetV2X(const FActorDescription &Description, AV2XSensor *V2X)
static void MakePropDefinition(const FPropParameters &Parameters, bool &Success, FActorDefinition &Definition)
static FColor ActorAttributeToColor(const FActorAttribute &ActorAttribute, const FColor &Default)
static void SetCamera(const FActorDescription &Description, ASceneCaptureSensor *Camera)
static FActorDefinition MakeCameraDefinition(const FString &Id, bool bEnableModifyingPostProcessEffects=false)
static FActorDefinition MakeRayTracedLensCameraDefinition(const FString &Id, bool bEnableModifyingPostProcessEffects=false)
static FString RetrieveActorAttributeToString(const FString &Id, const TMap< FString, FActorAttribute > &Attributes, const FString &Default)
static FString ActorAttributeToString(const FActorAttribute &ActorAttribute, const FString &Default)
static FColor RetrieveActorAttributeToColor(const FString &Id, const TMap< FString, FActorAttribute > &Attributes, const FColor &Default)
static FActorDefinition MakeNormalsCameraDefinition()
static float RetrieveActorAttributeToFloat(const FString &Id, const TMap< FString, FActorAttribute > &Attributes, float Default)
static void MakeBlueprintDefinitions(const TArray< FBlueprintParameters > &ParameterArray, TArray< FActorDefinition > &Definitions)
static FActorDefinition MakeRadarDefinition()
static void SetAutowareGnss(const FActorDescription &Description, AAutowareGnssSensor *Gnss)
static void MakePedestrianDefinition(const FPedestrianParameters &Parameters, bool &Success, FActorDefinition &Definition)
static bool CheckActorDefinitions(const TArray< FActorDefinition > &ActorDefinitions)
Return whether the list of actor definitions is valid.
static FVector RetrieveActorAttributeToVector(const FString &Id, const TMap< FString, FActorAttribute > &Attributes, const FVector &Default)
static FActorDefinition MakeGenericSensorDefinition(const FString &Type, const FString &Id)
static void SetCustomV2X(const FActorDescription &Description, ACustomV2XSensor *V2X)
static int32 ActorAttributeToInt(const FActorAttribute &ActorAttribute, int32 Default)
static FActorDefinition MakeV2XDefinition()
static FActorDefinition MakeGenericDefinition(const FString &Category, const FString &Type, const FString &Id)
static void MakePedestrianDefinitions(const TArray< FPedestrianParameters > &ParameterArray, TArray< FActorDefinition > &Definitions)
static bool RetrieveActorAttributeToBool(const FString &Id, const TMap< FString, FActorAttribute > &Attributes, bool Default)
static void MakeBlueprintDefinition(const FBlueprintParameters &Parameters, bool &Success, FActorDefinition &Definition)
static bool CheckActorDefinition(const FActorDefinition &ActorDefinitions)
Return whether the actor definition is valid. Prints all the errors found.
static void MakeObstacleDetectorDefinitions(const FString &Type, const FString &Id, FActorDefinition &Definition)
static void SetIMU(const FActorDescription &Description, AInertialMeasurementUnit *IMU)
static void MakeVehicleDefinitions(const TArray< FVehicleParameters > &ParameterArray, TArray< FActorDefinition > &Definitions)
static FString ResolveProfileName(const FString &Requested)
static bool LoadAllPostProcessFromJsonToSceneCapture(USceneCaptureComponent2D *SensorCamera, const FString &FileName)
static int32 GenerateRandomSeed()
Generate a non-deterministic random seed.
An actor attribute, may be an intrinsic (non-modifiable) attribute of the actor or an user-defined ac...
A definition of a Carla Actor with all the variation and attributes.
FString Id
Display ID that identifies the actor.
TArray< FActorVariation > Variations
Variations represent variables the user can modify to generate variations of the actor.
TArray< FActorAttribute > Attributes
Attributes represent non-modifiable properties of the actor that might help the user identifying and ...
FString Tags
A list of comma-separated tags.
TSubclassOf< AActor > Class
Class of the actor to be spawned (Optional).
A description of a Carla Actor with all its variation.
TMap< FString, FActorAttribute > Variations
User selected variations of the actor.
Definition of an actor variation.
TArray< FString > RecommendedValues
bool bRestrictToRecommended
float DropOffAtZeroIntensity
General drop off rate.
float HorizontalFov
Horizontal field of view.
int RandomSeed
Random seed for the noise/dropoff used by this sensor.
float LowerFovLimit
Lower laser angle, counts from horizontal, negative values means under horizontal line.
float Range
Measure distance in centimeters.
float DropOffGenRate
General drop off rate.
uint32 Channels
Number of lasers.
float DropOffIntensityLimit
General drop off rate.
uint32 PointsPerSecond
Points generated by all lasers per second.
float RotationFrequency
Lidar rotation frequency.
float AtmospAttenRate
Attenuation Rate in the atmosphere in m^-1.
float HorizontalResolution
Horizontal resolution of the lidar, in degrees.
float UpperFovLimit
Upper laser angle, counts from horizontal, positive values means above horizontal line.
TSoftClassPtr< ACharacter > Class
TSoftObjectPtr< UStaticMesh > Mesh
TArray< FColor > RecommendedColors
TArray< int32 > SupportedDrivers
List of IDs of the drivers (pedestrians) supported by this vehicle, leave empty if no driver is suppo...
FString BaseType
(OPTIONAL) Use for a base classification of vehicles (car / truck / van / bycicle / motorcycle).
FString ObjectType
(OPTIONAL) Use for custom classification of vehicles.
TSoftClassPtr< ACarlaWheeledVehicle > Class
FString SpecialType
(OPTIONAL) Use for a more in-depth classification of vehicles (electric / emergency / taxi ....