Merge branch 'master' into manishthani/no_rendering_mode
This commit is contained in:
commit
847117245a
|
@ -22,6 +22,7 @@
|
||||||
* Fixed BP_MultipleFloor, tweaked offset in BaseFloor to adjust meshes between them
|
* Fixed BP_MultipleFloor, tweaked offset in BaseFloor to adjust meshes between them
|
||||||
* New traffic signs assets: one-way, no-turn, more speed limits, do not enter, arrow floors, Michigan left, and lane end
|
* New traffic signs assets: one-way, no-turn, more speed limits, do not enter, arrow floors, Michigan left, and lane end
|
||||||
* Expose traffic sign's trigger volumes on Python API
|
* Expose traffic sign's trigger volumes on Python API
|
||||||
|
* Updated the Python API to enable the user to acquire a traffic light's pole index and all traffic lights in it's group
|
||||||
|
|
||||||
## CARLA 0.9.3
|
## CARLA 0.9.3
|
||||||
|
|
||||||
|
|
|
@ -127,6 +127,8 @@
|
||||||
- `get_elapsed_time()`
|
- `get_elapsed_time()`
|
||||||
- `freeze(True)`
|
- `freeze(True)`
|
||||||
- `is_frozen()`
|
- `is_frozen()`
|
||||||
|
- `get_pole_index()`
|
||||||
|
- `get_group_traffic_lights()`
|
||||||
|
|
||||||
## `carla.Sensor(carla.Actor)`
|
## `carla.Sensor(carla.Actor)`
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
// For a copy, see <https://opensource.org/licenses/MIT>.
|
// For a copy, see <https://opensource.org/licenses/MIT>.
|
||||||
|
|
||||||
#include "carla/client/TrafficLight.h"
|
#include "carla/client/TrafficLight.h"
|
||||||
|
|
||||||
#include "carla/client/detail/Simulator.h"
|
#include "carla/client/detail/Simulator.h"
|
||||||
|
#include "carla/client/ActorList.h"
|
||||||
|
|
||||||
namespace carla {
|
namespace carla {
|
||||||
namespace client {
|
namespace client {
|
||||||
|
@ -55,5 +55,20 @@ namespace client {
|
||||||
return GetEpisode().Lock()->GetActorDynamicState(*this).state.traffic_light_data.time_is_frozen;
|
return GetEpisode().Lock()->GetActorDynamicState(*this).state.traffic_light_data.time_is_frozen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t TrafficLight::GetPoleIndex()
|
||||||
|
{
|
||||||
|
return GetEpisode().Lock()->GetActorDynamicState(*this).state.traffic_light_data.pole_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<SharedPtr<TrafficLight>> TrafficLight::GetGroupTrafficLights() {
|
||||||
|
std::vector<SharedPtr<TrafficLight>> result;
|
||||||
|
auto ids = GetEpisode().Lock()->GetGroupTrafficLights(*this);
|
||||||
|
for (auto id : ids) {
|
||||||
|
SharedPtr<Actor> actor = GetWorld().GetActors()->Find(id);
|
||||||
|
result.push_back(boost::static_pointer_cast<TrafficLight>(actor));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace client
|
} // namespace client
|
||||||
} // namespace carla
|
} // namespace carla
|
||||||
|
|
|
@ -52,6 +52,13 @@ namespace client {
|
||||||
/// @note This function does not call the simulator, it returns the data
|
/// @note This function does not call the simulator, it returns the data
|
||||||
/// received in the last tick.
|
/// received in the last tick.
|
||||||
bool IsFrozen() const;
|
bool IsFrozen() const;
|
||||||
|
|
||||||
|
uint32_t GetPoleIndex();
|
||||||
|
|
||||||
|
/// Return all traffic lights in the group this one belongs to.
|
||||||
|
///
|
||||||
|
/// @note This function calls the simulator
|
||||||
|
std::vector<SharedPtr<TrafficLight>> GetGroupTrafficLights();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace client
|
} // namespace client
|
||||||
|
|
|
@ -247,6 +247,11 @@ namespace detail {
|
||||||
_pimpl->AsyncCall("add_actor_impulse", actor, vector);
|
_pimpl->AsyncCall("add_actor_impulse", actor, vector);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<rpc::actor_id_type> Client::GetGroupTrafficLights(const rpc::Actor &trafficLight) {
|
||||||
|
using return_t = std::vector<rpc::actor_id_type>;
|
||||||
|
return _pimpl->CallAndWait<return_t>("get_group_traffic_lights", trafficLight);
|
||||||
|
}
|
||||||
|
|
||||||
void Client::SubscribeToStream(
|
void Client::SubscribeToStream(
|
||||||
const streaming::Token &token,
|
const streaming::Token &token,
|
||||||
std::function<void(Buffer)> callback) {
|
std::function<void(Buffer)> callback) {
|
||||||
|
|
|
@ -164,6 +164,8 @@ namespace detail {
|
||||||
|
|
||||||
void DrawDebugShape(const rpc::DebugShape &shape);
|
void DrawDebugShape(const rpc::DebugShape &shape);
|
||||||
|
|
||||||
|
std::vector<rpc::actor_id_type> GetGroupTrafficLights(const rpc::Actor &trafficLight);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
class Pimpl;
|
class Pimpl;
|
||||||
|
|
|
@ -266,6 +266,10 @@ namespace detail {
|
||||||
_client.FreezeTrafficLight(trafficLight.Serialize(), freeze);
|
_client.FreezeTrafficLight(trafficLight.Serialize(), freeze);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<rpc::actor_id_type> GetGroupTrafficLights(TrafficLight &trafficLight) {
|
||||||
|
return _client.GetGroupTrafficLights(trafficLight.Serialize());
|
||||||
|
}
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
/// @name Debug
|
/// @name Debug
|
||||||
|
|
|
@ -99,6 +99,7 @@ namespace detail {
|
||||||
float red_time;
|
float red_time;
|
||||||
float elapsed_time;
|
float elapsed_time;
|
||||||
bool time_is_frozen;
|
bool time_is_frozen;
|
||||||
|
uint32_t pole_index;
|
||||||
};
|
};
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
|
@ -33,6 +33,16 @@ static auto GetSemanticTags(const carla::client::Actor &self) {
|
||||||
return boost::python::list(iter);
|
return boost::python::list(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static auto GetGroupTrafficLights(carla::client::TrafficLight &self) {
|
||||||
|
namespace py = boost::python;
|
||||||
|
auto values = self.GetGroupTrafficLights();
|
||||||
|
py::list result;
|
||||||
|
for (auto value : values) {
|
||||||
|
result.append(value);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void export_actor() {
|
void export_actor() {
|
||||||
using namespace boost::python;
|
using namespace boost::python;
|
||||||
namespace cc = carla::client;
|
namespace cc = carla::client;
|
||||||
|
@ -123,6 +133,8 @@ void export_actor() {
|
||||||
.def("get_elapsed_time", &cc::TrafficLight::GetElapsedTime)
|
.def("get_elapsed_time", &cc::TrafficLight::GetElapsedTime)
|
||||||
.def("freeze", &cc::TrafficLight::Freeze, (arg("freeze")))
|
.def("freeze", &cc::TrafficLight::Freeze, (arg("freeze")))
|
||||||
.def("is_frozen", &cc::TrafficLight::IsFrozen)
|
.def("is_frozen", &cc::TrafficLight::IsFrozen)
|
||||||
|
.def("get_pole_index", &cc::TrafficLight::GetPoleIndex)
|
||||||
|
.def("get_group_traffic_lights", &GetGroupTrafficLights)
|
||||||
.def(self_ns::str(self_ns::self))
|
.def(self_ns::str(self_ns::self))
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,6 +71,7 @@ static auto AWorldObserver_GetActorState(const FActorView &View, const FActorReg
|
||||||
state.traffic_light_data.red_time = TrafficLight->GetRedTime();
|
state.traffic_light_data.red_time = TrafficLight->GetRedTime();
|
||||||
state.traffic_light_data.elapsed_time = TrafficLight->GetElapsedTime();
|
state.traffic_light_data.elapsed_time = TrafficLight->GetElapsedTime();
|
||||||
state.traffic_light_data.time_is_frozen = TrafficLight->GetTimeIsFrozen();
|
state.traffic_light_data.time_is_frozen = TrafficLight->GetTimeIsFrozen();
|
||||||
|
state.traffic_light_data.pole_index = TrafficLight->GetPoleIndex();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -589,6 +589,32 @@ void FTheNewCarlaServer::FPimpl::BindActions()
|
||||||
return R<void>::Success();
|
return R<void>::Success();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Server.BindSync("get_group_traffic_lights", [this](
|
||||||
|
const cr::Actor Actor) -> R<std::vector<cr::actor_id_type>>
|
||||||
|
{
|
||||||
|
REQUIRE_CARLA_EPISODE();
|
||||||
|
auto ActorView = Episode->GetActorRegistry().Find(Actor.id);
|
||||||
|
if (!ActorView.IsValid() || ActorView.GetActor()->IsPendingKill())
|
||||||
|
{
|
||||||
|
RESPOND_ERROR("unable to get group traffic lights: actor not found");
|
||||||
|
}
|
||||||
|
auto TrafficLight = Cast<ATrafficLightBase>(ActorView.GetActor());
|
||||||
|
if (TrafficLight == nullptr)
|
||||||
|
{
|
||||||
|
RESPOND_ERROR("unable to get group traffic lights: actor is not a traffic light");
|
||||||
|
}
|
||||||
|
std::vector<cr::actor_id_type> Result;
|
||||||
|
for (auto TLight : TrafficLight->GetGroupTrafficLights())
|
||||||
|
{
|
||||||
|
auto View = Episode->FindActor(TLight);
|
||||||
|
if (View.IsValid())
|
||||||
|
{
|
||||||
|
Result.push_back(View.GetActorId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Result;
|
||||||
|
});
|
||||||
|
|
||||||
Server.BindSync("draw_debug_shape", [this](const cr::DebugShape &shape) -> R<void>
|
Server.BindSync("draw_debug_shape", [this](const cr::DebugShape &shape) -> R<void>
|
||||||
{
|
{
|
||||||
REQUIRE_CARLA_EPISODE();
|
REQUIRE_CARLA_EPISODE();
|
||||||
|
|
|
@ -79,6 +79,11 @@ void ATrafficLightBase::Tick(float DeltaSeconds)
|
||||||
|
|
||||||
if (ElapsedTime > ChangeTime)
|
if (ElapsedTime > ChangeTime)
|
||||||
{
|
{
|
||||||
|
// Freeze if part of a group and about to turn red
|
||||||
|
if (GroupTrafficLights.Num() > 0 && State == ETrafficLightState::Yellow)
|
||||||
|
{
|
||||||
|
SetTimeIsFrozen(true);
|
||||||
|
}
|
||||||
SwitchTrafficLightState();
|
SwitchTrafficLightState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -98,7 +103,6 @@ void ATrafficLightBase::PostEditChangeProperty(FPropertyChangedEvent &Event)
|
||||||
|
|
||||||
void ATrafficLightBase::SetTrafficLightState(const ETrafficLightState InState)
|
void ATrafficLightBase::SetTrafficLightState(const ETrafficLightState InState)
|
||||||
{
|
{
|
||||||
NumChanges++;
|
|
||||||
ElapsedTime = 0.0f;
|
ElapsedTime = 0.0f;
|
||||||
State = InState;
|
State = InState;
|
||||||
SetTrafficSignState(ToTrafficSignState(State));
|
SetTrafficSignState(ToTrafficSignState(State));
|
||||||
|
@ -197,7 +201,6 @@ void ATrafficLightBase::SetTimeIsFrozen(bool InTimeIsFrozen)
|
||||||
TimeIsFrozen = InTimeIsFrozen;
|
TimeIsFrozen = InTimeIsFrozen;
|
||||||
if (!TimeIsFrozen)
|
if (!TimeIsFrozen)
|
||||||
{
|
{
|
||||||
NumChanges = 0;
|
|
||||||
ElapsedTime = 0.0f;
|
ElapsedTime = 0.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -207,7 +210,22 @@ bool ATrafficLightBase::GetTimeIsFrozen() const
|
||||||
return TimeIsFrozen;
|
return TimeIsFrozen;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ATrafficLightBase::GetNumChanges() const
|
void ATrafficLightBase::SetPoleIndex(int InPoleIndex)
|
||||||
{
|
{
|
||||||
return NumChanges;
|
PoleIndex = InPoleIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ATrafficLightBase::GetPoleIndex() const
|
||||||
|
{
|
||||||
|
return PoleIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
TArray<ATrafficLightBase *> ATrafficLightBase::GetGroupTrafficLights() const
|
||||||
|
{
|
||||||
|
return GroupTrafficLights;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ATrafficLightBase::SetGroupTrafficLights(TArray<ATrafficLightBase *> InGroupTrafficLights)
|
||||||
|
{
|
||||||
|
GroupTrafficLights = InGroupTrafficLights;
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,7 +82,16 @@ public:
|
||||||
bool GetTimeIsFrozen() const;
|
bool GetTimeIsFrozen() const;
|
||||||
|
|
||||||
UFUNCTION(Category = "Traffic Light", BlueprintCallable)
|
UFUNCTION(Category = "Traffic Light", BlueprintCallable)
|
||||||
int GetNumChanges() const;
|
void SetPoleIndex(int InPoleIndex);
|
||||||
|
|
||||||
|
UFUNCTION(Category = "Traffic Light", BlueprintCallable)
|
||||||
|
int GetPoleIndex() const;
|
||||||
|
|
||||||
|
UFUNCTION(Category = "Traffic Light", BlueprintCallable)
|
||||||
|
TArray<ATrafficLightBase *> GetGroupTrafficLights() const;
|
||||||
|
|
||||||
|
UFUNCTION(Category = "Traffic Light", BlueprintCallable)
|
||||||
|
void SetGroupTrafficLights(TArray<ATrafficLightBase *> InGroupTrafficLights);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -113,5 +122,8 @@ private:
|
||||||
bool TimeIsFrozen = false;
|
bool TimeIsFrozen = false;
|
||||||
|
|
||||||
UPROPERTY(Category = "Traffic Light", VisibleAnywhere)
|
UPROPERTY(Category = "Traffic Light", VisibleAnywhere)
|
||||||
int NumChanges = 0;
|
int PoleIndex = 0;
|
||||||
|
|
||||||
|
UPROPERTY(Category = "Traffic Light", VisibleAnywhere)
|
||||||
|
TArray<ATrafficLightBase *> GroupTrafficLights;
|
||||||
};
|
};
|
||||||
|
|
|
@ -218,7 +218,7 @@ void ACarlaWheeledVehicle::ApplyVehiclePhysicsControl(const FVehiclePhysicsContr
|
||||||
Vehicle4W->SteeringCurve.EditorCurveData = PhysicsControl.SteeringCurve;
|
Vehicle4W->SteeringCurve.EditorCurveData = PhysicsControl.SteeringCurve;
|
||||||
|
|
||||||
// Wheels Setup
|
// Wheels Setup
|
||||||
for (uint32 i = 0; i < PhysicsControl.Wheels.Num(); ++i)
|
for (int32 i = 0; i < PhysicsControl.Wheels.Num(); ++i)
|
||||||
{
|
{
|
||||||
Vehicle4W->Wheels[i]->DampingRate = PhysicsControl.Wheels[i].DampingRate;
|
Vehicle4W->Wheels[i]->DampingRate = PhysicsControl.Wheels[i].DampingRate;
|
||||||
Vehicle4W->Wheels[i]->SteerAngle = PhysicsControl.Wheels[i].SteerAngle;
|
Vehicle4W->Wheels[i]->SteerAngle = PhysicsControl.Wheels[i].SteerAngle;
|
||||||
|
|
|
@ -17,4 +17,4 @@
|
||||||
0.9.1: 1IZDzNQNVL67h8UlGyKuGegLH612Ifd7H
|
0.9.1: 1IZDzNQNVL67h8UlGyKuGegLH612Ifd7H
|
||||||
0.9.2: 1RKRGB22U5t80q4zwYXBJvxQXhzNjaaDf
|
0.9.2: 1RKRGB22U5t80q4zwYXBJvxQXhzNjaaDf
|
||||||
0.9.3: 1jJlStNHpey62CrMkWVfmtQcJGO7PaD0R
|
0.9.3: 1jJlStNHpey62CrMkWVfmtQcJGO7PaD0R
|
||||||
Latest: 1Rr30x4BDCDLM7QfAFsQYhduy6De976qQ
|
Latest: 1LA1dLOozATCaJryqT7U_nOBR_nPVnBC8
|
||||||
|
|
Loading…
Reference in New Issue