CARLA
 
载入中...
搜索中...
未找到
VehicleLightStage.cpp
浏览该文件的文档.
1
4
6
7namespace carla {
8namespace traffic_manager {
9
10using namespace constants::VehicleLight;
11
13 const std::vector<ActorId> &vehicle_id_list,
14 const BufferMap &buffer_map,
15 const Parameters &parameters,
16 const cc::World &world,
17 ControlFrame& control_frame)
18 : vehicle_id_list(vehicle_id_list),
19 buffer_map(buffer_map),
20 parameters(parameters),
21 world(world),
22 control_frame(control_frame) {}
23
25 // Get the global weather and all the vehicle light states at once
28}
29
30void VehicleLightStage::Update(const unsigned long index) {
31 ActorId actor_id = vehicle_id_list.at(index);
32
34 return; // this vehicle is not set to have automatic lights update
35
36 rpc::VehicleLightState::flag_type light_states = uint32_t(-1);
37 bool brake_lights = false;
38 bool left_turn_indicator = false;
39 bool right_turn_indicator = false;
40 bool position = false;
41 bool low_beam = false;
42 bool high_beam = false;
43 bool fog_lights = false;
44
45 // search the current light state of the vehicle
46 for (auto&& vls : all_light_states) {
47 if (vls.first == actor_id) {
48 light_states = vls.second;
49 break;
50 }
51 }
52
53 // Determine if the vehicle is truning left or right by checking the close waypoints
54
55 const Buffer& waypoint_buffer = buffer_map.at(actor_id);
56 cg::Location front_location = waypoint_buffer.front()->GetLocation();
57
58 for (const SimpleWaypointPtr& waypoint : waypoint_buffer) {
59 if (waypoint->CheckJunction()) {
60 RoadOption target_ro = waypoint->GetRoadOption();
61 if (target_ro == RoadOption::Left) left_turn_indicator = true;
62 else if (target_ro == RoadOption::Right) right_turn_indicator = true;
63 break;
64 }
65 if (cg::Math::DistanceSquared(front_location, waypoint->GetLocation()) > MAX_DISTANCE_LIGHT_CHECK) {
66 break;
67 }
68 }
69
70 // Determine brake light state
71 for (size_t cc = 0; cc < control_frame.size(); cc++) {
72 if (auto* maybe_ctrl = boost::variant2::get_if<carla::rpc::Command::ApplyVehicleControl>(&control_frame[cc].command)) {
74 if (ctrl.actor == actor_id) {
75 brake_lights = (ctrl.control.brake > 0.5); // hard braking, avoid blinking for throttle control
76 break;
77 }
78 }
79 }
80
81 // Determine position, fog and beams
82
83 // Turn on beams & positions from sunset to dawn
86 {
87 position = true;
88 low_beam = true;
89 }
92 {
93 position = true;
94 }
95 // Turn on lights under heavy rain
97 position = true;
98 low_beam = true;
99 }
100 // Turn on fog lights
102 position = true;
103 low_beam = true;
104 fog_lights = true;
105 }
106
107 // Determine the new vehicle light state
108 rpc::VehicleLightState::flag_type new_light_states = light_states;
109 if (brake_lights)
111 else
112 new_light_states &= ~rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::Brake);
113
114 if (left_turn_indicator)
116 else
117 new_light_states &= ~rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::LeftBlinker);
118
119 if (right_turn_indicator)
121 else
122 new_light_states &= ~rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::RightBlinker);
123
124 if (position)
126 else
127 new_light_states &= ~rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::Position);
128
129 if (low_beam)
131 else
132 new_light_states &= ~rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::LowBeam);
133
134 if (high_beam)
136 else
137 new_light_states &= ~rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::HighBeam);
138
139 if (fog_lights)
141 else
142 new_light_states &= ~rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::Fog);
143
144 // Update the vehicle light state if it has changed
145 if (new_light_states != light_states)
146 control_frame.push_back(carla::rpc::Command::SetVehicleLightState(actor_id, new_light_states));
147}
148
151
154
155} // namespace traffic_manager
156} // namespace carla
rpc::WeatherParameters GetWeather() const
Retrieve the weather parameters currently active in the world.
Definition World.cpp:86
rpc::VehicleLightStateList GetVehiclesLightStates() const
Returns a list of pairs where the firts element is the vehicle ID and the second one is the light sta...
Definition World.cpp:40
bool GetUpdateVehicleLights(const ActorId &actor_id) const
Method to get if the vehicle lights should be updates automatically
rpc::VehicleLightStateList all_light_states
All vehicle light states
void RemoveActor(const ActorId actor_id) override
rpc::WeatherParameters weather
Current weather parameters
VehicleLightStage(const std::vector< ActorId > &vehicle_id_list, const BufferMap &buffer_map, const Parameters &parameters, const cc::World &world, ControlFrame &control_frame)
const std::vector< ActorId > & vehicle_id_list
void Update(const unsigned long index) override
static const float SUN_ALTITUDE_DEGREES_JUST_BEFORE_SUNSET
Definition Constants.h:139
std::vector< carla::rpc::Command > ControlFrame
std::deque< std::shared_ptr< SimpleWaypoint > > Buffer
std::shared_ptr< SimpleWaypoint > SimpleWaypointPtr
std::unordered_map< carla::ActorId, Buffer > BufferMap
This file contains definitions of common data structures used in traffic manager.
Definition Carla.cpp:133