43 auto Controller = Cast<AWheeledVehicleAIController>(
Vehicle->GetController());
44 if (Controller !=
nullptr)
47 state.vehicle_data.traffic_light_state =
static_cast<TLS
>(Controller->GetTrafficLightState());
48 state.vehicle_data.speed_limit = Controller->GetSpeedLimit();
52 state.vehicle_data.has_traffic_light =
true;
56 state.vehicle_data.traffic_light_id = TrafficLightView->
GetActorId();
60 state.vehicle_data.has_traffic_light =
false;
65 state.vehicle_data.has_traffic_light =
false;
70 state.vehicle_data.failure_state =
Vehicle->GetFailureState();
76 auto Walker = Cast<APawn>(View.
GetActor());
77 auto Controller = Walker !=
nullptr ? Cast<AWalkerController>(Walker->GetController()) :
nullptr;
78 if (Controller !=
nullptr)
88 auto* TrafficLightComponent =
93 if(TrafficLightComponent ==
nullptr)
96 state.traffic_light_data.sign_id[0] =
'\0';
97 state.traffic_light_data.state =
static_cast<TLS
>(
TrafficLight->GetTrafficLightState());
98 state.traffic_light_data.green_time =
TrafficLight->GetGreenTime();
99 state.traffic_light_data.yellow_time =
TrafficLight->GetYellowTime();
100 state.traffic_light_data.red_time =
TrafficLight->GetRedTime();
101 state.traffic_light_data.elapsed_time =
TrafficLight->GetElapsedTime();
102 state.traffic_light_data.time_is_frozen =
TrafficLight->GetTimeIsFrozen();
103 state.traffic_light_data.pole_index =
TrafficLight->GetPoleIndex();
117 static bool bLoggedMissingController =
false;
118 if (!bLoggedMissingController)
120 bLoggedMissingController =
true;
121 UE_LOG(LogCarla, Warning, TEXT(
"TrafficLightComponent doesn't have any Controller assigned (logged once; affected lights stream zeroed state)"));
126 static bool bLoggedMissingGroup =
false;
127 if (!bLoggedMissingGroup)
129 bLoggedMissingGroup =
true;
130 UE_LOG(LogCarla, Warning, TEXT(
"TrafficLightComponent doesn't have any Group assigned (logged once; affected lights stream zeroed state)"));
135 const FString fstring_sign_id = TrafficLightComponent->GetSignId();
136 const std::string sign_id = carla::rpc::FromFString(fstring_sign_id);
137 constexpr size_t max_size =
sizeof(state.traffic_light_data.sign_id);
138 size_t sign_id_length = sign_id.length();
139 if(max_size < sign_id_length)
141 UE_LOG(LogCarla, Warning, TEXT(
"The max size of a signal id is 32. %s (%d)"), *fstring_sign_id, sign_id.length());
142 sign_id_length = max_size;
144 std::memset(state.traffic_light_data.sign_id,
'\0', max_size);
145 std::memcpy(state.traffic_light_data.sign_id, sign_id.c_str(), sign_id_length);
146 state.traffic_light_data.state =
static_cast<TLS
>(TrafficLightComponent->GetLightState());
147 state.traffic_light_data.green_time = Controller->
GetGreenTime();
148 state.traffic_light_data.yellow_time = Controller->
GetYellowTime();
149 state.traffic_light_data.red_time = Controller->
GetRedTime();
150 state.traffic_light_data.elapsed_time = Controller->
GetElapsedTime();
151 state.traffic_light_data.time_is_frozen = Group->
IsFrozen();
152 state.traffic_light_data.pole_index =
TrafficLight->GetPoleIndex();
159 auto TrafficSign = Cast<ATrafficSignBase>(View.
GetActor());
160 if (TrafficSign !=
nullptr)
162 USignComponent* TrafficSignComponent =
163 Cast<USignComponent>(TrafficSign->FindComponentByClass<USignComponent>());
165 if(TrafficSignComponent)
167 const FString fstring_sign_id = TrafficSignComponent->GetSignId();
168 const std::string sign_id = carla::rpc::FromFString(fstring_sign_id);
169 constexpr size_t max_size =
sizeof(state.traffic_sign_data.sign_id);
170 size_t sign_id_length = sign_id.length();
171 if(max_size < sign_id_length)
173 UE_LOG(LogCarla, Warning, TEXT(
"The max size of a signal id is 32. %s (%d)"), *fstring_sign_id, sign_id.length());
174 sign_id_length = max_size;
176 std::memset(state.traffic_light_data.sign_id,
'\0', max_size);
177 std::memcpy(state.traffic_sign_data.sign_id, sign_id.c_str(), sign_id_length);
195 state.vehicle_data.traffic_light_state = TLS::Green;
196 state.vehicle_data.speed_limit = ActorData->
SpeedLimit;
197 state.vehicle_data.has_traffic_light =
false;
221 static bool bLoggedMissingGroup =
false;
222 if (!bLoggedMissingGroup)
224 bLoggedMissingGroup =
true;
225 UE_LOG(LogCarla, Warning, TEXT(
"TrafficLight doesn't have any Group assigned (logged once; affected lights stream zeroed state)"));
230 const FString fstring_sign_id = ActorData->
SignId;
231 const std::string sign_id = carla::rpc::FromFString(fstring_sign_id);
232 constexpr size_t max_size =
sizeof(state.traffic_light_data.sign_id);
233 size_t sign_id_length = sign_id.length();
234 if(max_size < sign_id_length)
236 UE_LOG(LogCarla, Warning, TEXT(
"The max size of a signal id is 32. %s (%d)"), *fstring_sign_id, sign_id.length());
237 sign_id_length = max_size;
239 std::memset(state.traffic_light_data.sign_id,
'\0', max_size);
240 std::memcpy(state.traffic_light_data.sign_id, sign_id.c_str(), sign_id_length);
241 state.traffic_light_data.state =
static_cast<TLS
>(Controller->GetCurrentState().State);
242 state.traffic_light_data.green_time = Controller->GetGreenTime();
243 state.traffic_light_data.yellow_time = Controller->GetYellowTime();
244 state.traffic_light_data.red_time = Controller->GetRedTime();
245 state.traffic_light_data.elapsed_time = Controller->GetElapsedTime();
246 state.traffic_light_data.time_is_frozen = Group->
IsFrozen();
247 state.traffic_light_data.pole_index = ActorData->
PoleIndex;
254 const FString fstring_sign_id = ActorData->
SignId;
255 const std::string sign_id = carla::rpc::FromFString(fstring_sign_id);
256 constexpr size_t max_size =
sizeof(state.traffic_sign_data.sign_id);
257 size_t sign_id_length = sign_id.length();
258 if(max_size < sign_id_length)
260 UE_LOG(LogCarla, Warning, TEXT(
"The max size of a signal id is 32. %s (%d)"), *fstring_sign_id, sign_id.length());
261 sign_id_length = max_size;
263 std::memset(state.traffic_light_data.sign_id,
'\0', max_size);
264 std::memcpy(state.traffic_sign_data.sign_id, sign_id.c_str(), sign_id_length);
308 bool PendingLightUpdates)
310 TRACE_CPUPROFILER_EVENT_SCOPE_STR(__FUNCTION__);
318 auto total_size =
sizeof(Serializer::Header) +
sizeof(ActorDynamicState) * Registry.
Num();
319 auto current_size = 0;
321 buffer.reset(total_size);
322 auto write_data = [¤t_size, &buffer](
const auto &data)
324 auto begin = buffer.begin() + current_size;
325 std::memcpy(begin, &data,
sizeof(data));
326 current_size +=
sizeof(data);
329 constexpr float TO_METERS = 1e-2;
332 Serializer::Header header;
333 header.episode_id = Episode.
GetId();
334 header.platform_timestamp = FPlatformTime::Seconds();
335 header.delta_seconds = DeltaSeconds;
337 FIntVector MapOriginInMeters = MapOrigin / 100;
340 uint8_t simulation_state = (SimulationState::MapChange * MapChange);
341 simulation_state |= (SimulationState::PendingLightUpdate * PendingLightUpdates);
343 header.simulation_state =
static_cast<SimulationState
>(simulation_state);
348 for (
auto& It : Registry)
353 FTransform ActorTransform;
354 FVector Velocity(0.0f);
364 Velocity = TO_METERS * ActorData->
Velocity;
377 if (Actor ==
nullptr)
402 ActorDynamicState info = {
415 buffer.resize(current_size);
417 check(buffer.size() == current_size);
419 return std::move(buffer);