11 #include "EngineUtils.h" 20 #include "GameFramework/CharacterMovementComponent.h" 29 #include "Misc/FileHelper.h" 34 #include <carla/Version.h> 84 template <
typename T,
typename Other>
87 return {Array.GetData(), Array.GetData() + Array.Num()};
98 FPimpl(uint16_t RPCPort, uint16_t StreamingPort, uint16_t SecondaryPort)
104 SecondaryServer = std::make_shared<carla::multigpu::Router>(SecondaryPort);
138 # define CARLA_ENSURE_GAME_THREAD() check(IsInGameThread()); 140 # define CARLA_ENSURE_GAME_THREAD() 141 #endif // WITH_EDITOR 143 #define RESPOND_ERROR(str) { \ 144 UE_LOG(LogCarlaServer, Log, TEXT("Responding error: %s"), TEXT(str)); \ 145 return carla::rpc::ResponseError(str); } 147 #define RESPOND_ERROR_FSTRING(fstr) { \ 148 UE_LOG(LogCarlaServer, Log, TEXT("Responding error: %s"), *fstr); \ 149 return carla::rpc::ResponseError(carla::rpc::FromFString(fstr)); } 151 #define REQUIRE_CARLA_EPISODE() \ 152 CARLA_ENSURE_GAME_THREAD(); \ 153 if (Episode == nullptr) { RESPOND_ERROR("episode not ready"); } 156 const FString& FuncName,
157 const FString& ErrorMessage,
158 const FString& ExtraInfo =
"")
160 FString TotalMessage =
"Responding error from function " + FuncName +
": " +
161 ErrorMessage +
". " + ExtraInfo;
162 UE_LOG(LogCarlaServer, Log, TEXT(
"%s"), *TotalMessage);
167 const FString& FuncName,
169 const FString& ExtraInfo =
"")
183 template <
typename FuncT>
188 _server.BindSync(_name, func);
192 _server.BindAsync(_name, func);
206 #define BIND_SYNC(name) auto name = ServerBinder(# name, Server, true) 207 #define BIND_ASYNC(name) auto name = ServerBinder(# name, Server, false) 226 BIND_SYNC(get_traffic_manager_running) << [
this] (uint16_t port) ->
R<std::pair<std::string, uint16_t>>
230 return std::pair<std::string, uint16_t>(it->second, it->first);
232 return std::pair<std::string, uint16_t>(
"",0);
236 BIND_SYNC(add_traffic_manager_running) << [
this] (std::pair<std::string, uint16_t> trafficManagerInfo) ->
R<bool> 238 uint16_t port = trafficManagerInfo.second;
242 std::pair<uint16_t, std::string>(port, trafficManagerInfo.first));
261 return carla::version();
276 BIND_ASYNC(get_available_maps) << [
this]() ->
R<std::vector<std::string>>
279 std::vector<std::string> result;
280 result.reserve(MapNames.Num());
281 for (
const auto &MapName : MapNames)
283 if (MapName.Contains(
"/Sublevels/"))
285 if (MapName.Contains(
"/BaseMap/"))
287 if (MapName.Contains(
"/BaseLargeMap/"))
289 if (MapName.Contains(
"_Tile_"))
292 result.emplace_back(cr::FromFString(MapName));
306 GameInstance->
SetMapLayer(static_cast<int32>(MapLayers));
344 BIND_SYNC(copy_opendrive_to_file) << [
this](
const std::string &opendrive, cr::OpendriveGenerationParameters Params) ->
R<void> 354 BIND_SYNC(apply_color_texture_to_objects) << [
this](
355 const std::vector<std::string> &actors_name,
365 TArray<AActor*> ActorsToPaint;
366 for(
const std::string& actor_name : actors_name)
371 ActorsToPaint.Add(ActorToPaint);
375 if(!ActorsToPaint.Num())
382 for(
AActor* ActorToPaint : ActorsToPaint)
392 BIND_SYNC(apply_float_color_texture_to_objects) << [
this](
393 const std::vector<std::string> &actors_name,
403 TArray<AActor*> ActorsToPaint;
404 for(
const std::string& actor_name : actors_name)
409 ActorsToPaint.Add(ActorToPaint);
413 if(!ActorsToPaint.Num())
420 for(
AActor* ActorToPaint : ActorsToPaint)
430 BIND_SYNC(get_names_of_all_objects) << [
this]() ->
R<std::vector<std::string>>
439 std::vector<std::string> NamesStd;
440 for (
const FString &Name : NamesFString)
442 NamesStd.emplace_back(cr::FromFString(Name));
461 FString MapDir = FullMapPath.RightChop(FullMapPath.Find(
"Content/", ESearchCase::CaseSensitive) + 8);
464 cr::FromFString(MapDir),
465 MakeVectorFromTArray<cg::Transform>(SpawnPoints)};
474 BIND_SYNC(get_navigation_mesh) << [
this]() ->
R<std::vector<uint8_t>>
479 std::vector<uint8_t> Result(FileContents.Num());
480 memcpy(&Result[0], FileContents.GetData(), FileContents.Num());
484 BIND_SYNC(get_required_files) << [
this](std::string folder =
"") ->
R<std::vector<std::string>>
489 if (folder[folder.size() - 1] !=
'/' && folder[folder.size() - 1] !=
'\\') {
496 const auto folderDir = mapDir +
"/" + folder.c_str();
500 TArray<FString> Files;
501 IFileManager::Get().FindFilesRecursive(Files, *folderDir, *(fileName +
".xodr"),
true,
false,
false);
502 IFileManager::Get().FindFilesRecursive(Files, *folderDir, *(fileName +
".bin"),
true,
false,
false);
505 std::vector<std::string> result;
506 for (
auto File : Files) {
507 File.RemoveFromStart(FPaths::ConvertRelativePathToFull(FPaths::ProjectContentDir()));
508 result.emplace_back(TCHAR_TO_UTF8(*File));
513 BIND_SYNC(request_file) << [
this](std::string name) ->
R<std::vector<uint8_t>>
518 FString path(FPaths::ConvertRelativePathToFull(FPaths::ProjectContentDir()));
519 path.Append(name.c_str());
522 TArray<uint8_t> Content;
523 FFileHelper::LoadFileToArray(Content, *path, 0);
524 std::vector<uint8_t> Result(Content.Num());
525 memcpy(&Result[0], Content.GetData(), Content.Num());
536 BIND_SYNC(set_episode_settings) << [
this](
537 const cr::EpisodeSettings &settings) ->
R<uint64_t> 557 BIND_SYNC(get_actor_definitions) << [
this]() ->
R<std::vector<cr::ActorDefinition>>
574 BIND_SYNC(get_all_level_BBs) << [
this](uint8 QueriedTag) ->
R<std::vector<cg::BoundingBox>>
577 TArray<FBoundingBox> Result;
587 for(
auto&
Box : Result)
592 return MakeVectorFromTArray<cg::BoundingBox>(Result);
595 BIND_SYNC(get_environment_objects) << [
this](uint8 QueriedTag) ->
R<std::vector<cr::EnvironmentObject>>
607 for(
auto& Object : Result)
612 return MakeVectorFromTArray<cr::EnvironmentObject>(Result);
615 BIND_SYNC(enable_environment_objects) << [
this](std::vector<uint64_t> EnvObjectIds,
bool Enable) ->
R<void> 624 TSet<uint64> EnvObjectIdsSet;
625 for(uint64 Id : EnvObjectIds)
627 EnvObjectIdsSet.Emplace(Id);
640 if (Weather ==
nullptr)
644 return Weather->GetCurrentWeather();
647 BIND_SYNC(set_weather_parameters) << [
this](
648 const cr::WeatherParameters &weather) ->
R<void> 652 if (Weather ==
nullptr)
656 Weather->ApplyWeather(weather);
663 const std::vector<FCarlaActor::IdType> &ids) ->
R<std::vector<cr::Actor>>
666 std::vector<cr::Actor> Result;
667 Result.reserve(ids.size());
668 for (
auto &&Id : ids)
680 cr::ActorDescription Description,
687 if (Result.Key != EActorSpawnResultStatus::Success)
689 UE_LOG(LogCarla, Error, TEXT(
"Actor not Spawned"));
702 BIND_SYNC(spawn_actor_with_parent) << [
this](
703 cr::ActorDescription Description,
711 if (Result.Key != EActorSpawnResultStatus::Success)
724 if (!ParentCarlaActor)
726 RESPOND_ERROR(
"unable to attach actor: parent actor not found");
758 UE_LOG(LogCarla, Log, TEXT(
"CarlaServer destroy_actor %d"),
ActorId);
772 APlayerController* PController= UGameplayStatics::GetPlayerController(
Episode->GetWorld(), 0);
775 auto result = PController->ConsoleCommand(UTF8_TO_TCHAR(cmd.c_str()),
true);
777 result.Contains(FString(TEXT(
"Command not recognized"))) ||
778 result.Contains(FString(TEXT(
"Error")))
781 return GEngine->Exec(
Episode->GetWorld(), UTF8_TO_TCHAR(cmd.c_str()));
788 bool ForceInPrimary =
false;
793 ForceInPrimary =
true;
798 if (Desc ==
"" || Desc ==
"sensor.other.collision")
800 ForceInPrimary =
true;
806 UE_LOG(LogCarla, Log, TEXT(
"Sensor %d '%s' created in secondary server"), sensor_id, *Desc);
812 UE_LOG(LogCarla, Log, TEXT(
"Sensor %d '%s' created in primary server"), sensor_id, *Desc);
828 "set_actor_location",
830 " Actor Id: " + FString::FromInt(ActorId));
834 Location, ETeleportType::TeleportPhysics);
838 BIND_SYNC(set_actor_transform) << [
this](
847 "set_actor_transform",
849 " Actor Id: " + FString::FromInt(ActorId));
853 Transform, ETeleportType::TeleportPhysics);
869 " Actor Id: " + FString::FromInt(ActorId));
877 Transform.GetForwardVector(), Speed,
false));
883 " Actor Id: " + FString::FromInt(ActorId));
888 BIND_SYNC(set_actor_target_velocity) << [
this](
897 "set_actor_target_velocity",
899 " Actor Id: " + FString::FromInt(ActorId));
906 "set_actor_target_velocity",
908 " Actor Id: " + FString::FromInt(ActorId));
913 BIND_SYNC(set_actor_target_angular_velocity) << [
this](
922 "set_actor_target_angular_velocity",
924 " Actor Id: " + FString::FromInt(ActorId));
931 "set_actor_target_angular_velocity",
933 " Actor Id: " + FString::FromInt(ActorId));
938 BIND_SYNC(enable_actor_constant_velocity) << [
this](
947 "enable_actor_constant_velocity",
949 " Actor Id: " + FString::FromInt(ActorId));
957 "enable_actor_constant_velocity",
959 " Actor Id: " + FString::FromInt(ActorId));
965 BIND_SYNC(disable_actor_constant_velocity) << [
this](
973 "disable_actor_constant_velocity",
975 " Actor Id: " + FString::FromInt(ActorId));
983 "disable_actor_constant_velocity",
985 " Actor Id: " + FString::FromInt(ActorId));
1000 "add_actor_impulse",
1002 " Actor Id: " + FString::FromInt(ActorId));
1010 "add_actor_impulse",
1012 " Actor Id: " + FString::FromInt(ActorId));
1017 BIND_SYNC(add_actor_impulse_at_location) << [
this](
1027 "add_actor_impulse_at_location",
1029 " Actor Id: " + FString::FromInt(ActorId));
1031 FVector UELocation = location.ToCentimeters().ToFVector();
1043 "add_actor_impulse_at_location",
1045 " Actor Id: " + FString::FromInt(ActorId));
1062 " Actor Id: " + FString::FromInt(ActorId));
1065 CarlaActor->
AddActorForce(vector.ToCentimeters().ToFVector());
1071 " Actor Id: " + FString::FromInt(ActorId));
1076 BIND_SYNC(add_actor_force_at_location) << [
this](
1086 "add_actor_force_at_location",
1088 " Actor Id: " + FString::FromInt(ActorId));
1090 FVector UELocation = location.ToCentimeters().ToFVector();
1102 "add_actor_force_at_location",
1104 " Actor Id: " + FString::FromInt(ActorId));
1109 BIND_SYNC(add_actor_angular_impulse) << [
this](
1118 "add_actor_angular_impulse",
1120 " Actor Id: " + FString::FromInt(ActorId));
1127 "add_actor_angular_impulse",
1129 " Actor Id: " + FString::FromInt(ActorId));
1145 " Actor Id: " + FString::FromInt(ActorId));
1154 " Actor Id: " + FString::FromInt(ActorId));
1159 BIND_SYNC(get_physics_control) << [
this](
1167 "get_physics_control",
1169 " Actor Id: " + FString::FromInt(ActorId));
1177 "get_physics_control",
1179 " Actor Id: " + FString::FromInt(ActorId));
1181 return cr::VehiclePhysicsControl(PhysicsControl);
1184 BIND_SYNC(get_vehicle_light_state) << [
this](
1192 "get_vehicle_light_state",
1194 " Actor Id: " + FString::FromInt(ActorId));
1202 "get_vehicle_light_state",
1204 " Actor Id: " + FString::FromInt(ActorId));
1206 return cr::VehicleLightState(LightState);
1209 BIND_SYNC(apply_physics_control) << [
this](
1218 "apply_physics_control",
1220 " Actor Id: " + FString::FromInt(ActorId));
1227 "apply_physics_control",
1229 " Actor Id: " + FString::FromInt(ActorId));
1234 BIND_SYNC(set_vehicle_light_state) << [
this](
1236 cr::VehicleLightState LightState) ->
R<void> 1243 "set_vehicle_light_state",
1245 " Actor Id: " + FString::FromInt(ActorId));
1252 "set_vehicle_light_state",
1254 " Actor Id: " + FString::FromInt(ActorId));
1269 "open_vehicle_door",
1271 " Actor Id: " + FString::FromInt(ActorId));
1278 "open_vehicle_door",
1280 " Actor Id: " + FString::FromInt(ActorId));
1285 BIND_SYNC(close_vehicle_door) << [
this](
1294 "close_vehicle_door",
1296 " Actor Id: " + FString::FromInt(ActorId));
1303 "close_vehicle_door",
1305 " Actor Id: " + FString::FromInt(ActorId));
1310 BIND_SYNC(set_wheel_steer_direction) << [
this](
1319 "set_wheel_steer_direction",
1321 " Actor Id: " + FString::FromInt(ActorId));
1325 static_cast<EVehicleWheelLocation>(WheelLocation), AngleInDeg);
1329 "set_wheel_steer_direction",
1331 " Actor Id: " + FString::FromInt(ActorId));
1336 BIND_SYNC(get_wheel_steer_angle) << [
this](
1344 "get_wheel_steer_angle",
1346 " Actor Id: " + FString::FromInt(ActorId));
1351 static_cast<EVehicleWheelLocation>(WheelLocation), Angle);
1355 "get_wheel_steer_angle",
1357 " Actor Id: " + FString::FromInt(ActorId));
1362 BIND_SYNC(set_actor_simulate_physics) << [
this](
1371 "set_actor_simulate_physics",
1373 " Actor Id: " + FString::FromInt(ActorId));
1380 "set_actor_simulate_physics",
1382 " Actor Id: " + FString::FromInt(ActorId));
1387 BIND_SYNC(set_actor_collisions) << [
this](
1396 "set_actor_collisions",
1398 " Actor Id: " + FString::FromInt(ActorId));
1405 "set_actor_collisions",
1407 " Actor Id: " + FString::FromInt(ActorId));
1422 " Actor Id: " + FString::FromInt(ActorId));
1431 " Actor Id: " + FString::FromInt(ActorId));
1436 BIND_SYNC(set_actor_enable_gravity) << [
this](
1445 "set_actor_enable_gravity",
1447 " Actor Id: " + FString::FromInt(ActorId));
1454 "set_actor_enable_gravity",
1456 " Actor Id: " + FString::FromInt(ActorId));
1463 BIND_SYNC(apply_control_to_vehicle) << [
this](
1465 cr::VehicleControl Control) ->
R<void> 1472 "apply_control_to_vehicle",
1474 " Actor Id: " + FString::FromInt(ActorId));
1481 "apply_control_to_vehicle",
1483 " Actor Id: " + FString::FromInt(ActorId));
1488 BIND_SYNC(apply_ackermann_control_to_vehicle) << [
this](
1490 cr::VehicleAckermannControl Control) ->
R<void> 1497 "apply_ackermann_control_to_vehicle",
1499 " Actor Id: " + FString::FromInt(ActorId));
1506 "apply_ackermann_control_to_vehicle",
1508 " Actor Id: " + FString::FromInt(ActorId));
1513 BIND_SYNC(get_ackermann_controller_settings) << [
this](
1521 "get_ackermann_controller_settings",
1523 " Actor Id: " + FString::FromInt(ActorId));
1531 "get_ackermann_controller_settings",
1533 " Actor Id: " + FString::FromInt(ActorId));
1535 return cr::AckermannControllerSettings(Settings);
1538 BIND_SYNC(apply_ackermann_controller_settings) << [
this](
1540 cr::AckermannControllerSettings AckermannSettings) ->
R<void> 1547 "apply_ackermann_controller_settings",
1549 " Actor Id: " + FString::FromInt(ActorId));
1556 "apply_ackermann_controller_settings",
1558 " Actor Id: " + FString::FromInt(ActorId));
1563 BIND_SYNC(apply_control_to_walker) << [
this](
1565 cr::WalkerControl Control) ->
R<void> 1572 "apply_control_to_walker",
1574 " Actor Id: " + FString::FromInt(ActorId));
1581 "apply_control_to_walker",
1583 " Actor Id: " + FString::FromInt(ActorId));
1588 BIND_SYNC(get_bones_transform) << [
this](
1596 "get_bones_transform",
1598 " Actor Id: " + FString::FromInt(ActorId));
1606 "get_bones_transform",
1608 " Actor Id: " + FString::FromInt(ActorId));
1611 std::vector<carla::rpc::BoneTransformDataOut> BoneData;
1615 Data.
bone_name = std::string(TCHAR_TO_UTF8(*Bone.Get<0>()));
1620 BoneData.push_back(Data);
1625 BIND_SYNC(set_bones_transform) << [
this](
1634 "set_bones_transform",
1636 " Actor Id: " + FString::FromInt(ActorId));
1644 "set_bones_transform",
1646 " Actor Id: " + FString::FromInt(ActorId));
1663 " Actor Id: " + FString::FromInt(ActorId));
1672 " Actor Id: " + FString::FromInt(ActorId));
1678 BIND_SYNC(get_pose_from_animation) << [
this](
1686 "get_pose_from_animation",
1688 " Actor Id: " + FString::FromInt(ActorId));
1695 "get_pose_from_animation",
1697 " Actor Id: " + FString::FromInt(ActorId));
1703 BIND_SYNC(set_actor_autopilot) << [
this](
1712 "set_actor_autopilot",
1714 " Actor Id: " + FString::FromInt(ActorId));
1721 "set_actor_autopilot",
1723 " Actor Id: " + FString::FromInt(ActorId));
1728 BIND_SYNC(show_vehicle_debug_telemetry) << [
this](
1737 "show_vehicle_debug_telemetry",
1739 " Actor Id: " + FString::FromInt(ActorId));
1746 "show_vehicle_debug_telemetry",
1748 " Actor Id: " + FString::FromInt(ActorId));
1755 std::string SimfilePath) ->
R<void> 1764 " Actor Id: " + FString::FromInt(ActorId));
1767 CarlaActor->
EnableCarSim(carla::rpc::ToFString(SimfilePath));
1773 " Actor Id: " + FString::FromInt(ActorId));
1789 " Actor Id: " + FString::FromInt(ActorId));
1798 " Actor Id: " + FString::FromInt(ActorId));
1803 BIND_SYNC(enable_chrono_physics) << [
this](
1805 uint64_t MaxSubsteps,
1806 float MaxSubstepDeltaTime,
1807 std::string VehicleJSON,
1808 std::string PowertrainJSON,
1809 std::string TireJSON,
1810 std::string BaseJSONPath) ->
R<void> 1817 "enable_chrono_physics",
1819 " Actor Id: " + FString::FromInt(ActorId));
1823 MaxSubsteps, MaxSubstepDeltaTime,
1824 cr::ToFString(VehicleJSON),
1825 cr::ToFString(PowertrainJSON),
1826 cr::ToFString(TireJSON),
1827 cr::ToFString(BaseJSONPath));
1831 "enable_chrono_physics",
1833 " Actor Id: " + FString::FromInt(ActorId));
1840 BIND_SYNC(set_traffic_light_state) << [
this](
1849 "set_traffic_light_state",
1851 " Actor Id: " + FString::FromInt(ActorId));
1855 static_cast<ETrafficLightState>(trafficLightState));
1859 "set_traffic_light_state",
1861 " Actor Id: " + FString::FromInt(ActorId));
1866 BIND_SYNC(set_traffic_light_green_time) << [
this](
1875 "set_traffic_light_green_time",
1877 " Actor Id: " + FString::FromInt(ActorId));
1884 "set_traffic_light_green_time",
1886 " Actor Id: " + FString::FromInt(ActorId));
1891 BIND_SYNC(set_traffic_light_yellow_time) << [
this](
1900 "set_traffic_light_yellow_time",
1902 " Actor Id: " + FString::FromInt(ActorId));
1909 "set_traffic_light_yellow_time",
1911 " Actor Id: " + FString::FromInt(ActorId));
1916 BIND_SYNC(set_traffic_light_red_time) << [
this](
1925 "set_traffic_light_red_time",
1927 " Actor Id: " + FString::FromInt(ActorId));
1934 "set_traffic_light_red_time",
1936 " Actor Id: " + FString::FromInt(ActorId));
1941 BIND_SYNC(freeze_traffic_light) << [
this](
1950 "freeze_traffic_light",
1952 " Actor Id: " + FString::FromInt(ActorId));
1959 "freeze_traffic_light",
1961 " Actor Id: " + FString::FromInt(ActorId));
1966 BIND_SYNC(reset_traffic_light_group) << [
this](
1974 "reset_traffic_light_group",
1976 " Actor Id: " + FString::FromInt(ActorId));
1983 "reset_traffic_light_group",
1985 " Actor Id: " + FString::FromInt(ActorId));
1993 for (TActorIterator<ATrafficLightGroup> It(
Episode->GetWorld()); It; ++It)
2000 BIND_SYNC(freeze_all_traffic_lights) << [
this]
2009 auto* TraffiLightManager = GameMode->GetTrafficLightManager();
2010 TraffiLightManager->SetFrozen(frozen);
2032 if (!
Actor->IsPendingKill())
2045 BIND_SYNC(get_group_traffic_lights) << [
this](
2052 RESPOND_ERROR(
"unable to get group traffic lights: actor not found");
2057 return std::vector<cr::ActorId>();
2064 RESPOND_ERROR(
"unable to get group traffic lights: actor is not a traffic light");
2066 std::vector<cr::ActorId> Result;
2067 for (
auto* TLight :
TrafficLight->GetGroupTrafficLights())
2072 Result.push_back(View->GetActorId());
2089 " Actor Id: " + FString::FromInt(ActorId));
2096 " Actor Id: " + FString::FromInt(ActorId));
2106 " Actor Id: " + FString::FromInt(ActorId));
2108 TArray<FBoundingBox> Result;
2109 TArray<uint8> OutTag;
2111 TrafficLight, Result, OutTag,
2113 return MakeVectorFromTArray<cg::BoundingBox>(Result);
2125 "get_gbuffer_token",
2127 " Actor Id: " + FString::FromInt(ActorId));
2132 "get_gbuffer_token",
2134 " Actor Id: " + FString::FromInt(ActorId));
2140 "get_gbuffer_token",
2142 " Actor Id: " + FString::FromInt(ActorId));
2150 return std::vector<unsigned char>(std::begin(Token.data), std::end(Token.data));
2155 return std::vector<unsigned char>(std::begin(Token.data), std::end(Token.data));
2160 return std::vector<unsigned char>(std::begin(Token.data), std::end(Token.data));
2165 return std::vector<unsigned char>(std::begin(Token.data), std::end(Token.data));
2170 return std::vector<unsigned char>(std::begin(Token.data), std::end(Token.data));
2175 return std::vector<unsigned char>(std::begin(Token.data), std::end(Token.data));
2180 return std::vector<unsigned char>(std::begin(Token.data), std::end(Token.data));
2185 return std::vector<unsigned char>(std::begin(Token.data), std::end(Token.data));
2190 return std::vector<unsigned char>(std::begin(Token.data), std::end(Token.data));
2195 return std::vector<unsigned char>(std::begin(Token.data), std::end(Token.data));
2200 return std::vector<unsigned char>(std::begin(Token.data), std::end(Token.data));
2205 return std::vector<unsigned char>(std::begin(Token.data), std::end(Token.data));
2210 return std::vector<unsigned char>(std::begin(Token.data), std::end(Token.data));
2213 UE_LOG(LogCarla, Error, TEXT(
"Requested invalid GBuffer ID %u"), GBufferId);
2233 BIND_SYNC(show_recorder_file_info) << [
this](
2243 BIND_SYNC(show_recorder_collisions) << [
this](
2255 BIND_SYNC(show_recorder_actors_blocked) << [
this](
2283 BIND_SYNC(set_replayer_time_factor) << [
this](
double time_factor) ->
R<void> 2297 BIND_SYNC(set_replayer_ignore_spectator) << [
this](
bool ignore_spectator) ->
R<void> 2313 BIND_SYNC(draw_debug_shape) << [
this](
const cr::DebugShape &shape) ->
R<void> 2316 auto *World =
Episode->GetWorld();
2317 check(World !=
nullptr);
2325 using C = cr::Command;
2329 auto parse_result = [](ActorId id,
const auto &response) {
2330 return response.HasError() ? CR{response.GetError()} : CR{
id};
2333 #define MAKE_RESULT(operation) return parse_result(c.actor, operation); 2336 [=](
auto self,
const C::SpawnActor &c) -> CR {
2337 auto result = c.parent.has_value() ?
2338 spawn_actor_with_parent(
2342 cr::AttachmentType::Rigid) :
2343 spawn_actor(c.description, c.transform);
2344 if (!result.HasError())
2346 ActorId
id = result.Get().id;
2348 [](C::SpawnActor &) {},
2349 [](C::ConsoleCommand &) {},
2350 [id](
auto &s) { s.actor = id; });
2351 for (
auto command : c.do_after)
2353 boost::variant2::visit(set_id, command.command);
2354 boost::variant2::visit(
self, command.command);
2358 return result.GetError();
2360 [=](
auto,
const C::DestroyActor &c) {
MAKE_RESULT(destroy_actor(c.actor)); },
2361 [=](
auto,
const C::ApplyVehicleControl &c) {
MAKE_RESULT(apply_control_to_vehicle(c.actor, c.control)); },
2362 [=](
auto,
const C::ApplyVehicleAckermannControl &c) {
MAKE_RESULT(apply_ackermann_control_to_vehicle(c.actor, c.control)); },
2363 [=](
auto,
const C::ApplyWalkerControl &c) {
MAKE_RESULT(apply_control_to_walker(c.actor, c.control)); },
2364 [=](
auto,
const C::ApplyVehiclePhysicsControl &c) {
MAKE_RESULT(apply_physics_control(c.actor, c.physics_control)); },
2365 [=](
auto,
const C::ApplyTransform &c) {
MAKE_RESULT(set_actor_transform(c.actor, c.transform)); },
2366 [=](
auto,
const C::ApplyTargetVelocity &c) {
MAKE_RESULT(set_actor_target_velocity(c.actor, c.velocity)); },
2367 [=](
auto,
const C::ApplyTargetAngularVelocity &c) {
MAKE_RESULT(set_actor_target_angular_velocity(c.actor, c.angular_velocity)); },
2368 [=](
auto,
const C::ApplyImpulse &c) {
MAKE_RESULT(add_actor_impulse(c.actor, c.impulse)); },
2369 [=](
auto,
const C::ApplyForce &c) {
MAKE_RESULT(add_actor_force(c.actor, c.force)); },
2370 [=](
auto,
const C::ApplyAngularImpulse &c) {
MAKE_RESULT(add_actor_angular_impulse(c.actor, c.impulse)); },
2371 [=](
auto,
const C::ApplyTorque &c) {
MAKE_RESULT(add_actor_torque(c.actor, c.torque)); },
2372 [=](
auto,
const C::SetSimulatePhysics &c) {
MAKE_RESULT(set_actor_simulate_physics(c.actor, c.enabled)); },
2373 [=](
auto,
const C::SetEnableGravity &c) {
MAKE_RESULT(set_actor_enable_gravity(c.actor, c.enabled)); },
2375 [=](
auto,
const C::SetAutopilot &c) {
MAKE_RESULT(set_actor_autopilot(c.actor, c.enabled)); },
2376 [=](
auto,
const C::ShowDebugTelemetry &c) {
MAKE_RESULT(show_vehicle_debug_telemetry(c.actor, c.enabled)); },
2377 [=](
auto,
const C::SetVehicleLightState &c) {
MAKE_RESULT(set_vehicle_light_state(c.actor, c.light_state)); },
2380 [=](
auto,
const C::ApplyWalkerState &c) {
MAKE_RESULT(set_walker_state(c.actor, c.transform, c.speed)); },
2381 [=](
auto,
const C::ConsoleCommand& c) -> CR {
return console_command(c.cmd); },
2382 [=](
auto,
const C::SetTrafficLightState& c) {
MAKE_RESULT(set_traffic_light_state(c.actor, c.traffic_light_state)); },
2383 [=](
auto,
const C::ApplyLocation& c) {
MAKE_RESULT(set_actor_location(c.actor, c.location)); }
2389 const std::vector<cr::Command> &commands,
2392 std::vector<CR> result;
2393 result.reserve(commands.size());
2394 for (
const auto &command : commands)
2396 result.emplace_back(boost::variant2::visit(command_visitor, command.command));
2407 BIND_SYNC(query_lights_state) << [
this](std::string client) ->
R<std::vector<cr::LightState>>
2410 std::vector<cr::LightState> result;
2411 auto *World =
Episode->GetWorld();
2414 result = CarlaLightSubsystem->
GetLights(FString(client.c_str()));
2419 BIND_SYNC(update_lights_state) << [
this]
2420 (std::string client,
const std::vector<cr::LightState>& lights,
bool discard_client) ->
R<void> 2423 auto *World =
Episode->GetWorld();
2426 CarlaLightSubsystem->
SetLights(FString(client.c_str()), lights, discard_client);
2431 BIND_SYNC(update_day_night_cycle) << [
this]
2432 (std::string client,
const bool active) ->
R<void> 2435 auto *World =
Episode->GetWorld();
2448 ->
R<std::pair<bool,cr::LabelledPoint>>
2451 auto *World =
Episode->GetWorld();
2452 constexpr
float meter_to_centimeter = 100.0f;
2461 meter_to_centimeter * SearchDistance, World);
2466 ->
R<std::vector<cr::LabelledPoint>>
2469 auto *World =
Episode->GetWorld();
2470 FVector UEStartLocation = StartLocation;
2471 FVector UEEndLocation = EndLocation;
2477 UEEndLocation = LargeMap->GlobalToLocalLocation(UEEndLocation);
2490 #undef REQUIRE_CARLA_EPISODE 2491 #undef RESPOND_ERROR_FSTRING 2492 #undef RESPOND_ERROR 2493 #undef CARLA_ENSURE_GAME_THREAD 2507 Pimpl = MakeUnique<FPimpl>(RPCPort, StreamingPort, SecondaryPort);
2508 StreamingPort =
Pimpl->StreamingServer.GetLocalEndpoint().port();
2509 SecondaryPort =
Pimpl->SecondaryServer->GetLocalEndpoint().port();
2514 TEXT(
"Initialized CarlaServer: Ports(rpc=%d, streaming=%d, secondary=%d)"),
2518 return Pimpl->BroadcastStream;
2523 check(
Pimpl !=
nullptr);
2524 UE_LOG(LogCarlaServer, Log, TEXT(
"New episode '%s' started"), *Episode.
GetMapName());
2525 Pimpl->Episode = &Episode;
2530 check(
Pimpl !=
nullptr);
2531 Pimpl->Episode =
nullptr;
2536 check(
Pimpl !=
nullptr);
2538 int ThreadsPerServer = std::max(2u, NumberOfWorkerThreads / 3u);
2540 int32_t StreamingThreads;
2541 int32_t SecondaryThreads;
2547 RPCThreads = ThreadsPerServer;
2549 if(!FParse::Value(
FCommandLine::Get(), TEXT(
"-StreamingThreads="), StreamingThreads))
2551 StreamingThreads = ThreadsPerServer;
2553 if(!FParse::Value(
FCommandLine::Get(), TEXT(
"-SecondaryThreads="), SecondaryThreads))
2555 SecondaryThreads = ThreadsPerServer;
2558 UE_LOG(LogCarla, Log, TEXT(
"FCarlaServer AsyncRun %d, RPCThreads %d, StreamingThreads %d, SecondaryThreads %d"),
2559 NumberOfWorkerThreads, RPCThreads, StreamingThreads, SecondaryThreads);
2561 Pimpl->Server.AsyncRun(RPCThreads);
2562 Pimpl->StreamingServer.AsyncRun(StreamingThreads);
2563 Pimpl->SecondaryServer->AsyncRun(SecondaryThreads);
2568 TRACE_CPUPROFILER_EVENT_SCOPE_STR(__FUNCTION__);
2574 (void)
Pimpl->TickCuesReceived.fetch_add(1, std::memory_order_release);
2579 auto k =
Pimpl->TickCuesReceived.fetch_sub(1, std::memory_order_acquire);
2580 bool flag = (k > 0);
2582 (void)
Pimpl->TickCuesReceived.fetch_add(1, std::memory_order_release);
2590 Pimpl->Server.Stop();
2591 Pimpl->SecondaryServer->Stop();
2597 check(
Pimpl !=
nullptr);
2598 return Pimpl->StreamingServer.MakeStream();
2603 return Pimpl->GetSecondaryServer();
2608 return Pimpl->StreamingServer;
carla::streaming::Stream BroadcastStream
FCarlaActor * FindCarlaActor(FCarlaActor::IdType ActorId)
Find a Carla actor by id.
carla::streaming::Server & GetStreamingServer()
virtual ECarlaServerResponse SetVehicleLightState(const FVehicleLightState &)
TArray< FEnvironmentObject > GetEnvironmentObjects(uint8 QueriedTag=0xFF) const
void ApplyTextureToActor(AActor *Actor, UTexture2D *Texture, const carla::rpc::MaterialParameter &TextureParam)
FDataStream OpenStream() const
FCameraGBufferUint8 GBufferF
auto end() const noexcept
std::vector< carla::rpc::LightState > GetLights(FString Client)
FPimpl(uint16_t RPCPort, uint16_t StreamingPort, uint16_t SecondaryPort)
static FString StatusToString(EActorSpawnResultStatus Status)
bool LoadNewOpendriveEpisode(const FString &OpenDriveString, const carla::rpc::OpendriveGenerationParameters &Params)
Load a new map generating the mesh from OpenDRIVE data and start a new episode.
void StopReplayer(bool KeepActors=false)
bool DestroyActor(AActor *Actor)
FCameraGBufferUint8 SceneDepth
virtual ECarlaServerResponse SetWheelSteerDirection(const EVehicleWheelLocation &, float)
AWeather * GetWeather() const
std::string ShowFileCollisions(std::string Name, char Type1, char Type2)
void SetDayNightCycle(const bool active)
void SetMapLayer(int32 MapLayer)
auto operator<<(FuncT func)
carla::streaming::detail::token_type GetToken(carla::streaming::detail::stream_id_type sensor_id)
void ConsiderSpectatorAsEgo(bool _SpectatorAsEgo)
virtual ECarlaServerResponse SetActorEnableGravity(bool bEnabled)
FVector GlobalToLocalLocation(const FVector &InLocation) const
virtual ECarlaServerResponse SetActorCollisions(bool bEnabled)
carla::rpc::ResponseError RespondError(const FString &FuncName, const FString &ErrorMessage, const FString &ExtraInfo="")
virtual ECarlaServerResponse SetBonesTransform(const FWalkerBoneControlIn &)
The game instance contains elements that must be kept alive in between levels.
TMap< FString, FWalkerBoneControlOutData > BoneTransforms
static TArray< uint8 > Load(FString MapName)
Return the Navigation Mesh Binary associated to MapName, or empty if the such file wasn't serialized...
#define MAKE_RESULT(operation)
FCameraGBufferUint8 CustomStencil
FCameraGBufferUint8 SceneStencil
static auto MakeRecursiveOverload(FuncTs &&... fs)
auto begin() const noexcept
carla::rpc::Actor SerializeActor(FCarlaActor *CarlaActor) const
Create a serializable object describing the actor.
void SetReplayerTimeFactor(double TimeFactor)
virtual ECarlaServerResponse DisableActorConstantVelocity()
FDataMultiStream Start(uint16_t RPCPort, uint16_t StreamingPort, uint16_t SecondaryPort)
std::string ShowFileActorsBlocked(std::string Name, double MinTime=30, double MinDistance=10)
std::vector< std::pair< ActorId, VehicleLightState::flag_type > > VehicleLightStateList
TArray< FTransform > GetRecommendedSpawnPoints() const
Return the list of recommended spawn points for vehicles.
#define RESPOND_ERROR_FSTRING(fstr)
std::map< uint16_t, std::string > TrafficManagerInfo
Map of pairs < port , ip > with all the Traffic Managers active in the simulation.
auto GetToken() const
Return the token that allows subscribing to this sensor's stream.
void EnableEnvironmentObjects(const TSet< uint64 > &EnvObjectIds, bool Enable)
static TArray< FString > GetAllMapNames()
FCameraGBufferUint8 GBufferE
virtual ECarlaServerResponse BlendPose(float Blend)
void PutActorToSleep(carla::rpc::ActorId ActorId)
virtual ECarlaServerResponse GetPhysicsControl(FVehiclePhysicsControl &)
virtual ECarlaServerResponse ApplyAckermannControllerSettings(const FAckermannControllerSettings &)
void UnLoadMapLayer(int32 MapLayers)
void OnActorSpawned(const FCarlaActor &CarlaActor)
virtual ECarlaServerResponse ApplyControlToVehicle(const FVehicleControl &, const EVehicleInputPriority &)
AActor * FindActorByName(const FString &ActorName)
UTexture2D * CreateUETexture(const carla::rpc::TextureColor &Texture)
static T Get(carla::rpc::Response< T > &response)
bg::model::box< Point3D > Box
virtual ECarlaServerResponse SetTrafficLightState(const ETrafficLightState &)
static ACarlaGameModeBase * GetGameMode(const UObject *WorldContextObject)
static void GetTrafficLightBoundingBox(const ATrafficLightBase *TrafficLight, TArray< FBoundingBox > &OutBB, TArray< uint8 > &OutTag, uint8 InTagQueried=0xFF)
const FString & GetMapName() const
Return the name of the map loaded in this episode.
std::atomic_size_t TickCuesReceived
static uint64_t GetFrameCounter()
virtual ECarlaServerResponse EnableChronoPhysics(uint64_t, float, const FString &, const FString &, const FString &, const FString &)
void SetActorGlobalLocation(const FVector &Location, ETeleportType Teleport=ETeleportType::TeleportPhysics)
void Draw(const carla::rpc::DebugShape &Shape)
ECarlaServerResponse AddActorImpulse(const FVector &Impulse)
ECarlaServerResponse SetActorTargetAngularVelocity(const FVector &AngularVelocity)
void LoadMapLayer(int32 MapLayers)
void RunSome(uint32 Milliseconds)
const FActorRegistry & GetActorRegistry() const
virtual ECarlaServerResponse CloseVehicleDoor(const EVehicleDoor)
std::string StartRecorder(std::string name, bool AdditionalData)
ECarlaServerResponse AddActorForceAtLocation(const FVector &Force, const FVector &Location)
ECarlaServerResponse AddActorTorque(const FVector &Torque)
static UCarlaGameInstance * GetGameInstance(const UObject *WorldContextObject)
carla::SharedPtr< cc::Actor > Actor
virtual ECarlaServerResponse FreezeTrafficLight(bool)
virtual ECarlaServerResponse EnableActorConstantVelocity(const FVector &)
std::shared_ptr< carla::multigpu::Router > SecondaryServer
An RPC server in which functions can be bind to run synchronously or asynchronously.
virtual ECarlaServerResponse GetPoseFromAnimation()
FCameraGBufferUint8 GBufferD
std::string ReplayFile(std::string Name, double TimeStart, double Duration, uint32_t FollowId, bool ReplaySensors)
TPair< EActorSpawnResultStatus, FCarlaActor * > SpawnActorWithInfo(const FTransform &Transform, FActorDescription thisActorDescription, FCarlaActor::IdType DesiredId=0)
Spawns an actor based on ActorDescription at Transform.
FCameraGBufferUint8 GBufferA
void SetActorState(carla::rpc::ActorState InState)
Response< ActorId > CommandResponse
virtual ECarlaServerResponse ResetTrafficLightGroup()
void SetAttachmentType(carla::rpc::AttachmentType InAttachmentType)
bool LoadNewEpisode(const FString &MapString, bool ResetSettings=true)
Load a new map and start a new episode.
const TArray< FActorDefinition > & GetActorDefinitions() const
Return the list of actor definitions that are available to be spawned this episode.
std::shared_ptr< carla::multigpu::Router > GetSecondaryServer()
virtual ECarlaServerResponse GetBonesTransform(FWalkerBoneControlOut &)
#define RESPOND_ERROR(str)
virtual ECarlaServerResponse ApplyControlToWalker(const FWalkerControl &)
static std::vector< T > MakeVectorFromTArray(const TArray< Other > &Array)
Token token() const
Token associated with this stream.
FCameraGBufferUint8 SceneColor
auto GetId() const
Return the unique id of this episode.
std::shared_ptr< carla::multigpu::Router > GetSecondaryServer()
void SetLights(FString Client, std::vector< carla::rpc::LightState > LightsToSet, bool DiscardClient=false)
void SetReplayerIgnoreHero(bool IgnoreHero)
constexpr size_t milliseconds() const noexcept
virtual ECarlaServerResponse SetLightGreenTime(float)
TArray< FString > GetNamesOfAllActors()
static FString GetXODR(const UWorld *World)
Return the OpenDrive XML associated to MapName, or empty if the file is not found.
FCameraGBufferUint8 CustomDepth
ACarlaRecorder * GetRecorder() const
virtual ECarlaServerResponse SetLightYellowTime(float)
carla::rpc::Server Server
virtual ECarlaServerResponse SetActorDead()
virtual ECarlaServerResponse SetLightRedTime(float)
ALargeMapManager * GetLMManager() const
static auto MakeOverload(FuncTs &&... fs)
Creates an "overloaded callable object" out of one or more callable objects, each callable object wil...
Base class for sensors using a USceneCaptureComponent2D for rendering the scene.
virtual ECarlaServerResponse SetActorAutopilot(bool, bool bKeepState=false)
FString GetActorDescriptionFromStream(carla::streaming::detail::stream_id_type StreamId)
Get the description of the Carla actor (sensor) using specific stream id.
carla::rpc::Server & _server
ECarlaServerResponse SetActorTargetVelocity(const FVector &Velocity)
void SetReplayerIgnoreSpectator(bool IgnoreSpectator)
virtual ECarlaServerResponse OpenVehicleDoor(const EVehicleDoor)
virtual ECarlaServerResponse EnableCarSim(const FString &)
FTransform LocalToGlobalTransform(const FTransform &InTransform) const
TUniquePtr< FPimpl > Pimpl
FString CarlaGetStringError(ECarlaServerResponse Response)
APawn * GetSpectatorPawn() const
void AttachActors(AActor *Child, AActor *Parent, EAttachmentType InAttachmentType=EAttachmentType::Rigid)
Attach Child to Parent.
void AddChildren(IdType ChildId)
virtual ECarlaServerResponse UseCarSimRoad(bool)
static std::pair< bool, carla::rpc::LabelledPoint > ProjectPoint(FVector StartLocation, FVector Direction, float MaxDistance, UWorld *World)
std::string ShowFileInfo(std::string Name, bool bShowAll=false)
static ALargeMapManager * GetLargeMapManager(const UObject *WorldContextObject)
carla::streaming::Server StreamingServer
ECarlaServerResponse AddActorImpulseAtLocation(const FVector &Impulse, const FVector &Location)
TArray< FBoundingBox > GetAllBBsOfLevel(uint8 TagQueried=0xFF) const
FCameraGBufferUint8 GBufferC
FCameraGBufferUint8 Velocity
Base class for the CARLA Game Mode.
virtual ECarlaServerResponse SetActorSimulatePhysics(bool bEnabled)
virtual ECarlaServerResponse GetVehicleLightState(FVehicleLightState &)
const FEpisodeSettings & GetSettings() const
void SetParent(IdType InParentId)
IdType GetActorId() const
virtual ECarlaServerResponse ApplyAckermannControlToVehicle(const FVehicleAckermannControl &, const EVehicleInputPriority &)
ECarlaServerResponse AddActorForce(const FVector &Force)
Texture< sensor::data::Color > TextureColor
virtual ECarlaServerResponse ApplyPhysicsControl(const FVehiclePhysicsControl &)
const FString GetFullMapPath() const
Base class for CARLA wheeled vehicles.
virtual ECarlaServerResponse GetWheelSteerAngle(const EVehicleWheelLocation &, float &)
struct ASceneCaptureSensor::@0 CameraGBuffers
Texture< FloatColor > TextureFloatColor
void AsyncRun(uint32 NumberOfWorkerThreads)
virtual ECarlaServerResponse GetAckermannControllerSettings(FAckermannControllerSettings &)
void SetActorGlobalTransform(const FTransform &Transform, ETeleportType Teleport=ETeleportType::TeleportPhysics)
FCameraGBufferUint8 GBufferB
ECarlaServerResponse AddActorAngularImpulse(const FVector &AngularInpulse)
#define REQUIRE_CARLA_EPISODE()
geom::Transform Transform
FVector LocalToGlobalLocation(const FVector &InLocation) const
constexpr ServerBinder(const char *name, carla::rpc::Server &srv, bool sync)
virtual ECarlaServerResponse ShowVehicleDebugTelemetry(bool)
virtual ECarlaServerResponse SetWalkerState(const FTransform &Transform, carla::rpc::WalkerControl WalkerControl)
ActorType GetActorType() const
A view over an actor and its properties.
FVehicleLightState GetVehicleLightState() const
void ApplySettings(const FEpisodeSettings &Settings)
void SetSynchronousMode(bool is_synchro)
static std::vector< carla::rpc::LabelledPoint > CastRay(FVector StartLocation, FVector EndLocation, UWorld *World)
void NotifyBeginEpisode(UCarlaEpisode &Episode)