CARLA
 
载入中...
搜索中...
未找到
VehicleLightStage.cpp
浏览该文件的文档.
1
4
6
7namespace carla {
8namespace traffic_manager {
9
10using namespace constants::VehicleLight;
11
12// VehicleLightStage构造函数
14 const std::vector<ActorId> &vehicle_id_list, // 车辆ID列表
15 const BufferMap &buffer_map, // 缓冲区映射
16 const Parameters &parameters, // 参数设置
17 const cc::World &world, // 世界模型
18 ControlFrame& control_frame) // 控制帧
19 : vehicle_id_list(vehicle_id_list), // 初始化车辆ID列表
20 buffer_map(buffer_map), // 初始化缓冲区映射
21 parameters(parameters), // 初始化参数
22 world(world), // 初始化世界模型
23 control_frame(control_frame) {} // 初始化控制帧
24
25// 更新世界信息
26void VehicleLightStage::UpdateWorldInfo() {
27 // 一次性获取全局天气和所有车辆的灯光状态
28 all_light_states = world.GetVehiclesLightStates(); // 获取所有车辆灯光状态
29 weather = world.GetWeather(); // 获取当前天气
30}
31
32// 更新车辆状态
33void VehicleLightStage::Update(const unsigned long index) {
34 ActorId actor_id = vehicle_id_list.at(index); // 根据索引获取车辆ID
35
36 if (!parameters.GetUpdateVehicleLights(actor_id))
37 return; // 如果该车辆未设置为自动更新灯光状态,则返回
38
39 rpc::VehicleLightState::flag_type light_states = uint32_t(-1); // 初始化灯光状态
40 bool brake_lights = false; // 刹车灯状态
41 bool left_turn_indicator = false; // 左转指示灯状态
42 bool right_turn_indicator = false; // 右转指示灯状态
43 bool position = false; // 位置灯状态
44 bool low_beam = false; // 近光灯状态
45 bool high_beam = false; // 高光灯状态
46 bool fog_lights = false; // 雾灯状态
47
48 // 查找当前车辆的灯光状态
49 for (auto&& vls : all_light_states) {
50 if (vls.first == actor_id) { // 如果车辆ID匹配
51 light_states = vls.second; // 获取灯光状态
52 break; // 找到后退出循环
53 }
54 }
55
56 // 通过检查临近的路点来判断车辆是否转向
57 const Buffer& waypoint_buffer = buffer_map.at(actor_id); // 获取车辆的路点缓冲区
58 cg::Location front_location = waypoint_buffer.front()->GetLocation(); // 获取车辆前方位置
59
60 for (const SimpleWaypointPtr& waypoint : waypoint_buffer) { // 遍历路点
61 if (waypoint->CheckJunction()) { // 检查是否在交叉口
62 RoadOption target_ro = waypoint->GetRoadOption(); // 获取目标道路选项
63 if (target_ro == RoadOption::Left) left_turn_indicator = true; // 如果是左转,设置左转指示灯
64 else if (target_ro == RoadOption::Right) right_turn_indicator = true; // 如果是右转,设置右转指示灯
65 break; // 找到后退出循环
66 }
67 // 如果前方位置与路点距离超过最大检查距离,退出循环
68 if (cg::Math::DistanceSquared(front_location, waypoint->GetLocation()) > MAX_DISTANCE_LIGHT_CHECK) {
69 break;
70 }
71 }
72
73 // 确定刹车灯状态
74 for (size_t cc = 0; cc < control_frame.size(); cc++) { // 遍历控制帧
75 if (auto* maybe_ctrl = boost::variant2::get_if<carla::rpc::Command::ApplyVehicleControl>(&control_frame[cc].command)) {
76 carla::rpc::Command::ApplyVehicleControl& ctrl = *maybe_ctrl; // 获取控制命令
77 if (ctrl.actor == actor_id) { // 如果控制命令的车辆ID匹配
78 brake_lights = (ctrl.control.brake > 0.5); // 如果刹车值大于0.5,表示硬刹车,设置刹车灯
79 break; // 找到后退出循环
80 }
81 }
82 }
83
84 // 确定位置灯、雾灯和光束状态
85
86 // 在日落到黎明之间开启光束和位置灯
87 if (weather.sun_altitude_angle < SUN_ALTITUDE_DEGREES_BEFORE_DAWN || // 如果太阳高度角小于黎明前的阈值
88 weather.sun_altitude_angle > SUN_ALTITUDE_DEGREES_AFTER_SUNSET) // 或者大于日落后的阈值
89 {
90 position = true; // 开启位置灯
91 low_beam = true; // 开启近光灯
92 }
93 else if (weather.sun_altitude_angle < SUN_ALTITUDE_DEGREES_JUST_AFTER_DAWN || // 如果太阳高度角小于黎明后刚过的阈值
94 weather.sun_altitude_angle > SUN_ALTITUDE_DEGREES_JUST_BEFORE_SUNSET) // 或者大于日落前刚过的阈值
95 {
96 position = true; // 开启位置灯
97 }
98
99 // 在大雨天气下开启灯光
100 if (weather.precipitation > HEAVY_PRECIPITATION_THRESHOLD) { // 如果降水量超过大雨阈值
101 position = true; // 开启位置灯
102 low_beam = true; // 开启近光灯
103 }
104
105 // 开启雾灯
106 if (weather.fog_density > FOG_DENSITY_THRESHOLD) { // 如果雾密度超过雾灯阈值
107 position = true; // 开启位置灯
108 low_beam = true; // 开启近光灯
109 fog_lights = true; // 开启雾灯
110 }
111
112 // 确定新的车辆灯光状态
113 rpc::VehicleLightState::flag_type new_light_states = light_states; // 初始化新的灯光状态为当前状态
114
115 if (brake_lights) // 如果刹车灯开启
116 new_light_states |= rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::Brake); // 设置刹车灯状态
117 else
118 new_light_states &= ~rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::Brake); // 关闭刹车灯状态
119
120 if (left_turn_indicator) // 如果左转指示灯开启
121 new_light_states |= rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::LeftBlinker); // 设置左转指示灯状态
122 else
123 new_light_states &= ~rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::LeftBlinker); // 关闭左转指示灯状态
124
125 if (right_turn_indicator) // 如果右转指示灯开启
126 new_light_states |= rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::RightBlinker); // 设置右转指示灯状态
127 else
128 new_light_states &= ~rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::RightBlinker); // 关闭右转指示灯状态
129
130 if (position) // 如果位置灯开启
131 new_light_states |= rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::Position); // 设置位置灯状态
132 else
133 new_light_states &= ~rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::Position); // 关闭位置灯状态
134
135 if (low_beam) // 如果近光灯开启
136 new_light_states |= rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::LowBeam); // 设置近光灯状态
137 else
138 new_light_states &= ~rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::LowBeam); // 关闭近光灯状态
139
140 if (high_beam) // 如果远光灯开启
141 new_light_states |= rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::HighBeam); // 设置远光灯状态
142 else
143 new_light_states &= ~rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::HighBeam); // 关闭远光灯状态
144
145 if (fog_lights) // 如果雾灯开启
146 new_light_states |= rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::Fog); // 设置雾灯状态
147 else
148 new_light_states &= ~rpc::VehicleLightState::flag_type(rpc::VehicleLightState::LightState::Fog); // 关闭雾灯状态
149
150 // 如果灯光状态发生变化,更新车辆灯光状态
151 if (new_light_states != light_states) // 检查新的灯光状态是否与当前状态不同
152 control_frame.push_back(carla::rpc::Command::SetVehicleLightState(actor_id, new_light_states)); // 更新灯光状态命令
153
154 void VehicleLightStage::RemoveActor(const ActorId) { // 移除车辆的函数(尚未实现)
155 }
156
157
158 void VehicleLightStage::Reset() { // 重置车辆灯光状态的函数(尚未实现)
159 }
160
161} // namespace traffic_manager
162} // namespace carla
rpc::VehicleLightStateList GetVehiclesLightStates() const
返回一个元素对列表, 其中第一个元素是车辆ID,第二个元素是灯光状态.
Definition World.cpp:40
VehicleLightStage(const std::vector< ActorId > &vehicle_id_list, const BufferMap &buffer_map, const Parameters &parameters, const cc::World &world, ControlFrame &control_frame)
包含客户端相关类和定义的命名空间。
Definition AtomicList.h:17
uint32_t ActorId
Definition ActorId.h:20
std::vector< carla::rpc::Command > ControlFrame
std::deque< std::shared_ptr< SimpleWaypoint > > Buffer
std::unordered_map< carla::ActorId, Buffer > BufferMap
CARLA模拟器的主命名空间。
Definition Carla.cpp:139