CARLA
 
载入中...
搜索中...
未找到
TrafficManagerLocal.cpp
浏览该文件的文档.
1// Copyright (c) 2020 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
7#include <algorithm>
8
9#include "carla/Logging.h"
10
12
14// 定义在carla命名空间下的traffic_manager命名空间
15namespace carla {
16namespace traffic_manager {
17//引入constants::FrameMemory命名空间内的所有元素
18using namespace constants::FrameMemory;
19// TrafficManagerLocal 类负责管理交通系统中的交通控制,包括车道、交通信号灯等。
20// 通过多线程和同步/异步操作模式与模拟器交互,管理车辆的行为和流量。
21
23 std::vector<float> longitudinal_PID_parameters,// 在高速公路场景下纵向PID控制的参数列表
24 std::vector<float> longitudinal_highway_PID_parameters,//在普通道路场景下横向PID控制的参数列表
25 std::vector<float> lateral_PID_parameters,//在普通道路场景下横向PID控制的参数列表
26 std::vector<float> lateral_highway_PID_parameters,。//在高速公路场景下横向PID控制的参数列表
27 float perc_difference_from_limit,//控制车辆行驶速度相对速度限制
28 cc::detail::EpisodeProxy &episode_proxy,//用于与模拟器中的某个情节进行交互,获取相关信息
29 uint16_t &RPCportTM)//用于网络通信等相关操作
30//处理车辆定位相关逻辑
31 : longitudinal_PID_parameters(longitudinal_PID_parameters),
32 longitudinal_highway_PID_parameters(longitudinal_highway_PID_parameters),
33 lateral_PID_parameters(lateral_PID_parameters),
34 lateral_highway_PID_parameters(lateral_highway_PID_parameters),
35
36 episode_proxy(episode_proxy),
37 world(cc::World(episode_proxy)),
38// 初始化各个阶段对象,负责不同的交通管理任务
39 localization_stage(LocalizationStage(vehicle_id_list,
40 buffer_map,
41 simulation_state,
42 track_traffic,
43 local_map,
44 parameters,
45 marked_for_removal,
46 localization_frame,
47 random_device)),
48//用于处理车辆碰撞检测、避免碰撞等相关逻辑
49 collision_stage(CollisionStage(vehicle_id_list,
50 simulation_state,
51 buffer_map,
52 track_traffic,
53 parameters,
54 collision_frame,
55 random_device)),
56//用于处理车辆与交通信号灯交互相关逻辑
57 traffic_light_stage(TrafficLightStage(vehicle_id_list,
58 simulation_state,
59 buffer_map,
60 parameters,
61 world,
62 tl_frame,
63 random_device)),
64//根据车辆各种状态信息制定运动计划
65 motion_plan_stage(MotionPlanStage(vehicle_id_list,
66 simulation_state,
67 parameters,
68 buffer_map,
69 track_traffic,
70 longitudinal_PID_parameters,
71 longitudinal_highway_PID_parameters,
72 lateral_PID_parameters,
73 lateral_highway_PID_parameters,
74 localization_frame,
75 collision_frame,
76 tl_frame,
77 world,
78 control_frame,
79 random_device,
80 local_map)),
81//用于控制车辆灯光状态
82 vehicle_light_stage(VehicleLightStage(vehicle_id_list,
83 buffer_map,
84 parameters,
85 world,
86 control_frame)),
87//处理车道选择等更复杂的交通管理逻辑
88 alsm(ALSM(registered_vehicles,
89 buffer_map,
90 track_traffic,
91 marked_for_removal,
92 parameters,
93 world,
94 local_map,
95 simulation_state,
96 localization_stage,
97 collision_stage,
98 traffic_light_stage,
99 motion_plan_stage,
100 vehicle_light_stage)),
101//用于网络通信
102 server(TrafficManagerServer(RPCportTM, static_cast<carla::traffic_manager::TrafficManagerBase *>(this))) {
103//统一调整车辆相对速度限制的行驶速度
104 parameters.SetGlobalPercentageSpeedDifference(perc_difference_from_limit);
105//表示尚未有效注册等情况
107 // 设置本地地图
109 // 启动交通管理器
110 Start();
111}
112//模拟器交互关闭交通管理器
114 // 销毁交通管理器
115 episode_proxy.Lock()->DestroyTrafficManager(server.port());
116 Release();
117}
118// 设置本地地图
120 const carla::SharedPtr<const cc::Map> world_map = world.GetMap();//获取世界地图的共享指针
121 local_map = std::make_shared<InMemoryMap>(world_map);
122 // 获取缓存的地图文件
123 auto files = episode_proxy.Lock()->GetRequiredFiles("TM");
124 if (!files.empty()) {
125 auto content = episode_proxy.Lock()->GetCacheFile(files[0], true);
126 if (content.size() != 0) {
127 local_map->Load(content);
128 } else {
129 log_warning("No InMemoryMap cache found. Setting up local map. This may take a while...");
130 local_map->SetUp();
131 }
132 } else {
133 log_warning("No InMemoryMap cache found. Setting up local map. This may take a while...");
134 local_map->SetUp();
135 }
136}
137// 启动交通管理器的工作线程
139 run_traffic_manger.store(true);
140 worker_thread = std::make_unique<std::thread>(&TrafficManagerLocal::Run, this);
141}
142// 启动交通管理器的工作线程
144
147 tl_frame.reserve(INITIAL_SIZE);
150//// 记录上一帧的序号,初始化为0,用于后续判断是否重复处理同一帧等情况
151 size_t last_frame = 0;
152 while (run_traffic_manger.load()) {
153
154 bool synchronous_mode = parameters.GetSynchronousMode();
155 bool hybrid_physics_mode = parameters.GetHybridPhysicsMode();
156 parameters.SetMaxBoundaries(20.0f, episode_proxy.Lock()->GetEpisodeSettings().actor_active_distance);
157
158 if (synchronous_mode) { // 在同步模式下,等待外部触发以启动循环
159 std::unique_lock<std::mutex> lock(step_execution_mutex);
160 step_begin_trigger.wait(lock, [this]() {return step_begin.load() || !run_traffic_manger.load();});
161 step_begin.store(false);
162 }
163
164 // 如果在异步混合模式下,经过的时间小于0.05秒,则跳过速度更新
165 if (!synchronous_mode && hybrid_physics_mode) {
166 TimePoint current_instance = chr::system_clock::now();
167 chr::duration<float> elapsed_time = current_instance - previous_update_instance;
168 chr::duration<float> time_to_wait = chr::duration<float>(HYBRID_MODE_DT) - elapsed_time;
169 if (time_to_wait > chr::duration<float>(0.0f)) {
170 std::this_thread::sleep_for(time_to_wait);
171 }
172 previous_update_instance = current_instance;
173 }
174
175 // 停止TM处理同一帧多次
176 if (!synchronous_mode) {
178 if (timestamp.frame == last_frame) {
179 continue;
180 }
181 last_frame = timestamp.frame;
182 }
183
184 std::unique_lock<std::mutex> registration_lock(registration_mutex);
185 // 更新模拟状态、角色生命周期并执行必要的清理
186 alsm.Update();
187
188 // 基于已注册车辆数量变化的阶段间通信帧重新分配
189 int current_registered_vehicles_state = registered_vehicles.GetState();
190 unsigned long number_of_vehicles = vehicle_id_list.size();
191 if (registered_vehicles_state != current_registered_vehicles_state || number_of_vehicles != registered_vehicles.Size()) {
193 number_of_vehicles = vehicle_id_list.size();
194
195 // 根据需要,请预留更多空间
196 uint64_t growth_factor = static_cast<uint64_t>(static_cast<float>(number_of_vehicles) * INV_GROWTH_STEP_SIZE);
197 uint64_t new_frame_capacity = INITIAL_SIZE + GROWTH_STEP_SIZE * growth_factor;
198 if (new_frame_capacity > current_reserved_capacity) {
199 localization_frame.reserve(new_frame_capacity);
200 collision_frame.reserve(new_frame_capacity);
201 tl_frame.reserve(new_frame_capacity);
202 control_frame.reserve(new_frame_capacity);
203 }
204
206 }
207
208 // 重置当前周期的帧
209 localization_frame.clear();
210 localization_frame.resize(number_of_vehicles);
211 collision_frame.clear();
212 collision_frame.resize(number_of_vehicles);
213 tl_frame.clear();
214 tl_frame.resize(number_of_vehicles);
215 control_frame.clear();
216 // 为每辆车预留两个帧:一个用于ApplyVehicleControl命令
217 // 以及一个用于可选的 SetVehicleLightState 命令
218 control_frame.reserve(2 * number_of_vehicles);
219 // 调整大小以容纳至少所有 ApplyVehicleControl 命令
220 // 这将在运动规划阶段插入
221 control_frame.resize(number_of_vehicles);
222
223 // 运行核心操作阶段
224 for (unsigned long index = 0u; index < vehicle_id_list.size(); ++index) {
226 }
227 for (unsigned long index = 0u; index < vehicle_id_list.size(); ++index) {
228 collision_stage.Update(index);
229 }
232 for (unsigned long index = 0u; index < vehicle_id_list.size(); ++index) {
236 }
237
238 registration_lock.unlock();
239
240 // 将当前周期的批处理命令发送给模拟器
241 if (synchronous_mode) {
242 episode_proxy.Lock()->ApplyBatchSync(control_frame, false);
243 step_end.store(true);
244 step_end_trigger.notify_one();
245 } else {
246 if (control_frame.size() > 0){
247 episode_proxy.Lock()->ApplyBatchSync(control_frame, false);
248 }
249 }
250 }
251}
252// 在同步模式下执行单步操作
255 step_begin.store(true);
256 step_begin_trigger.notify_one();
257
258 std::unique_lock<std::mutex> lock(step_execution_mutex);
259 step_end_trigger.wait(lock, [this]() { return step_end.load(); });
260 step_end.store(false);
261 }
262 return true;
263}
264
266// 停止交通管理器的工作线程并清理资源
267 run_traffic_manger.store(false);// 停止交通管理器运行
269 step_begin_trigger.notify_one();
270 }
271 // 如果工作线程存在且可连接,等待线程结束
272 if (worker_thread) {
273 if (worker_thread->joinable()) {
274 worker_thread->join(); // 等待工作线程完成
275 }
276 worker_thread.release();// 释放工作线程资源
277 }
278 // 清除所有车辆ID和注册车辆的状态
279 vehicle_id_list.clear(); // 清空车辆ID列表
280 registered_vehicles.Clear(); // 清除所有已注册的车辆
281 registered_vehicles_state = -1; // 重置注册的车辆状态
282 track_traffic.Clear();// 清除交通跟踪数据
283 // 重置模拟相关的状态数据
284 previous_update_instance = chr::system_clock::now();// 更新上次更新时间
285 current_reserved_capacity = 0u; // 重置保留的容量
286 // 清理各个阶段的数据
287 simulation_state.Reset();// 重置模拟状态
288 localization_stage.Reset(); // 重置定位阶段
289 collision_stage.Reset(); // 重置碰撞检测阶段
290 traffic_light_stage.Reset(); // 重置交通灯阶段
291 motion_plan_stage.Reset(); // 重置运动规划阶段
292 // 清空缓存数据
293 buffer_map.clear();
294 localization_frame.clear();
295 collision_frame.clear();
296 tl_frame.clear();
297 control_frame.clear();
298 // 恢复状态变量
299 run_traffic_manger.store(true); // 恢复交通管理器的运行状态
300 step_begin.store(false);// 重置步开始标志
301 step_end.store(false); // 重置步结束标志
302}
303}
304
305void TrafficManagerLocal::Release() {
306
307 Stop();
308
309 local_map.reset();// 释放本地图资源
310}
311
312void TrafficManagerLocal::Reset() { // 释放并重置资源
313 Release();
314 episode_proxy = episode_proxy.Lock()->GetCurrentEpisode();// 获取当前的剧集
315 world = cc::World(episode_proxy);// 创建新的世界对象
316 SetupLocalMap(); // 设置本地图
317 Start(); // 启动交通管理器
318}
319
320void TrafficManagerLocal::RegisterVehicles(const std::vector<ActorPtr> &vehicle_list) { // 注册新车辆到交通管理器
321 std::lock_guard<std::mutex> registration_lock(registration_mutex);// 锁定注册互斥量,避免并发问题
322 registered_vehicles.Insert(vehicle_list); // 将车辆添加到已注册列表
323}
324
325void TrafficManagerLocal::UnregisterVehicles(const std::vector<ActorPtr> &actor_list) { // 注销车辆并移除其ID
326 std::lock_guard<std::mutex> registration_lock(registration_mutex);// 锁定注册互斥量
327 std::vector<ActorId> actor_id_list;// 存储人物ID
328 for (auto &actor : actor_list) {
329 alsm.RemoveActor(actor->GetId(), true); // 从系统中移除每个人物
330 }
331}
332
333void TrafficManagerLocal::SetPercentageSpeedDifference(const ActorPtr &actor, const float percentage) { // 设置车辆与默认速度的差异百分比
334 parameters.SetPercentageSpeedDifference(actor, percentage);
335}
336
337void TrafficManagerLocal::SetGlobalPercentageSpeedDifference(const float percentage) {// 设置全局速度差异百分比
338 parameters.SetGlobalPercentageSpeedDifference(percentage);
339}
340
341void TrafficManagerLocal::SetLaneOffset(const ActorPtr &actor, const float offset) { // 设置车辆在车道中的偏移
342 parameters.SetLaneOffset(actor, offset);
343}
344
345void TrafficManagerLocal::SetGlobalLaneOffset(const float offset) // 设置全局车道偏移{ parameters.SetGlobalLaneOffset(offset);
346}
347
348void TrafficManagerLocal::SetDesiredSpeed(const ActorPtr &actor, const float value) {// 设置车辆期望的行驶速度
349 parameters.SetDesiredSpeed(actor, value);
350}
351
352/// 设置车辆灯光自动管理的方法
353void TrafficManagerLocal::SetUpdateVehicleLights(const ActorPtr &actor, const bool do_update) {
354 parameters.SetUpdateVehicleLights(actor, do_update);
355}
356// 设置车辆与其他车辆的碰撞检测
357void TrafficManagerLocal::SetCollisionDetection(const ActorPtr &reference_actor, const ActorPtr &other_actor, const bool detect_collision) {
358 parameters.SetCollisionDetection(reference_actor, other_actor, detect_collision);
359}
360// 强制车辆变道
361void TrafficManagerLocal::SetForceLaneChange(const ActorPtr &actor, const bool direction) {
362 parameters.SetForceLaneChange(actor, direction);
363}
364// 设置自动变道开关
365void TrafficManagerLocal::SetAutoLaneChange(const ActorPtr &actor, const bool enable) {
366 parameters.SetAutoLaneChange(actor, enable);
367}
368// 设置车辆与前车的距离
369void TrafficManagerLocal::SetDistanceToLeadingVehicle(const ActorPtr &actor, const float distance) {
370 parameters.SetDistanceToLeadingVehicle(actor, distance);
371}
372// 设置全局车辆与前车的距离
373void TrafficManagerLocal::SetGlobalDistanceToLeadingVehicle(const float distance) {
374 parameters.SetGlobalDistanceToLeadingVehicle(distance);
375}
376// 设置忽略行人的百分比
377void TrafficManagerLocal::SetPercentageIgnoreWalkers(const ActorPtr &actor, const float perc) {
378 parameters.SetPercentageIgnoreWalkers(actor, perc);
379}
380// 设置忽略其他车辆的百分比
381void TrafficManagerLocal::SetPercentageIgnoreVehicles(const ActorPtr &actor, const float perc) {
382 parameters.SetPercentageIgnoreVehicles(actor, perc);
383}
384// 设置车辆在绿灯时通过的百分比
385void TrafficManagerLocal::SetPercentageRunningLight(const ActorPtr &actor, const float perc) {
386 parameters.SetPercentageRunningLight(actor, perc);
387}
388// 设置车辆在红灯时的行为
389void TrafficManagerLocal::SetPercentageRunningSign(const ActorPtr &actor, const float perc) {
390 parameters.SetPercentageRunningSign(actor, perc);
391}
392// 设置车辆右侧行驶的百分比
393void TrafficManagerLocal::SetKeepRightPercentage(const ActorPtr &actor, const float percentage) {
394 parameters.SetKeepRightPercentage(actor, percentage);
395}
396// 设置车辆随机变道的百分比
397void TrafficManagerLocal::SetRandomLeftLaneChangePercentage(const ActorPtr &actor, const float percentage) {
398 parameters.SetRandomLeftLaneChangePercentage(actor, percentage);
399}
400// 设置车辆随机变道的百分比(右侧变道)
401void TrafficManagerLocal::SetRandomRightLaneChangePercentage(const ActorPtr &actor, const float percentage) {
402 parameters.SetRandomRightLaneChangePercentage(actor, percentage);
403}
404// 开关混合物理模式
405void TrafficManagerLocal::SetHybridPhysicsMode(const bool mode_switch) {
406 parameters.SetHybridPhysicsMode(mode_switch);
407}
408// 设置混合物理模式下的半径
409void TrafficManagerLocal::SetHybridPhysicsRadius(const float radius) {
410 parameters.SetHybridPhysicsRadius(radius);
411}
412// 设置是否启用OSM模式(Open Street Map)
413void TrafficManagerLocal::SetOSMMode(const bool mode_switch) {
414 parameters.SetOSMMode(mode_switch);
415}
416// 设置自定义路径给车辆
417void TrafficManagerLocal::SetCustomPath(const ActorPtr &actor, const Path path, const bool empty_buffer) {
418 parameters.SetCustomPath(actor, path, empty_buffer);
419}
420// 移除上传路径
421void TrafficManagerLocal::RemoveUploadPath(const ActorId &actor_id, const bool remove_path) {
422 parameters.RemoveUploadPath(actor_id, remove_path);
423}
424// 更新上传路径
425void TrafficManagerLocal::UpdateUploadPath(const ActorId &actor_id, const Path path) {
426 parameters.UpdateUploadPath(actor_id, path);
427}
428// 设置导入的路线
429void TrafficManagerLocal::SetImportedRoute(const ActorPtr &actor, const Route route, const bool empty_buffer) {
430 parameters.SetImportedRoute(actor, route, empty_buffer);
431}
432// 移除导入的路线
433void TrafficManagerLocal::RemoveImportedRoute(const ActorId &actor_id, const bool remove_path) {
434 parameters.RemoveImportedRoute(actor_id, remove_path);
435}
436// 更新导入的路线
437void TrafficManagerLocal::UpdateImportedRoute(const ActorId &actor_id, const Route route) {
438 parameters.UpdateImportedRoute(actor_id, route);
439}
440// 设置是否重生休眠车辆
441void TrafficManagerLocal::SetRespawnDormantVehicles(const bool mode_switch) {
442 parameters.SetRespawnDormantVehicles(mode_switch);
443}
444// 设置重生休眠车辆的边界
445void TrafficManagerLocal::SetBoundariesRespawnDormantVehicles(const float lower_bound, const float upper_bound) {
446 parameters.SetBoundariesRespawnDormantVehicles(lower_bound, upper_bound);
447}
448// 设置最大边界
449void TrafficManagerLocal::SetMaxBoundaries(const float lower, const float upper) {
450 parameters.SetMaxBoundaries(lower, upper);
451}
452// 获取车辆的下一动作
453Action TrafficManagerLocal::GetNextAction(const ActorId &actor_id) {
454 return localization_stage.ComputeNextAction(actor_id);
455}// 获取车辆的动作缓冲区
456
457ActionBuffer TrafficManagerLocal::GetActionBuffer(const ActorId &actor_id) {
458 return localization_stage.ComputeActionBuffer(actor_id);
459}
460
461bool TrafficManagerLocal::CheckAllFrozen(TLGroup tl_to_freeze) {
462 for (auto &elem : tl_to_freeze) {
463 if (!elem->IsFrozen() || elem->GetState() != TLS::Red) {
464 return false;
465 }
466 }
467 return true;
468}
469
470void TrafficManagerLocal::SetSynchronousMode(bool mode) {
471 const bool previous_mode = parameters.GetSynchronousMode();
472 parameters.SetSynchronousMode(mode);
473 if (previous_mode && !mode) {
474 step_begin.store(true);
475 step_begin_trigger.notify_one();
476 }
477}
478
479void TrafficManagerLocal::SetSynchronousModeTimeOutInMiliSecond(double time) {
480 parameters.SetSynchronousModeTimeOutInMiliSecond(time);
481}
482
483carla::client::detail::EpisodeProxy &TrafficManagerLocal::GetEpisodeProxy() {
484 return episode_proxy;
485}
486
487std::vector<ActorId> TrafficManagerLocal::GetRegisteredVehiclesIDs() {
488 return registered_vehicles.GetIDList();
489}
490
491void TrafficManagerLocal::SetRandomDeviceSeed(const uint64_t _seed) {
492 seed = _seed;
493 random_device = RandomGenerator(seed);
494 world.ResetAllTrafficLights();
495}
496
497} // namespace traffic_manager
498} // namespace carla
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld * World
std::size_t frame
自模拟器启动以来经过的帧数。
Definition Timestamp.h:37
const Timestamp & GetTimestamp() const
WorldSnapshot GetSnapshot() const
返回当前世界的快照。 快照(Snapshot)包含了模拟世界在某一时刻的整体状态信息,例如所有参与者的位置、状态,天气情况等, 可以用于记录、对比不同时刻的世界状态或者进行一些基于特定时刻状态的分析和操...
Definition World.cpp:102
SharedPtr< Map > GetMap() const
返回描述这个世界的地图。 返回的是一个智能指针指向的Map对象,该Map对象包含了模拟世界中的地理信息、道路布局等地图相关的数据结构, 供外部调用者进一步查询和操作地图相关的功能。
Definition World.cpp:24
SharedPtrType Lock() const
与 TryLock 相同,但永远不会返回 nullptr。
该类具有检测与附近演员潜在碰撞的功能。
void Update(const unsigned long index) override
更新方法。
void Reset() override
重置方法。
此类功能是维护车辆前方的路径点以供跟随。 该类还负责管理车道变更决策并适当地修改路径轨迹。
void Update(const unsigned long index) override
更新方法。
void Update(const unsigned long index)
更新方法。
void SetMaxBoundaries(const float lower, const float upper)
设置重生休眠车辆时的边界限制的方法
bool GetSynchronousMode() const
获取同步模式的方法
void SetGlobalPercentageSpeedDifference(float const percentage)
设置全局相对于速度限制的速度降低百分比 如果小于0,则表示速度增加百分比
bool GetHybridPhysicsMode() const
获取混合物理模式的方法
void Update(const unsigned long index) override
更新方法。
int registered_vehicles_state
用于跟踪注册参与者状态变化的计数器
LocalizationStage localization_stage
表示交通管理器核心操作的各种阶段 这些阶段包括定位、碰撞避免、交通灯响应、运动规划和车辆灯光控制等
std::mutex step_execution_mutex
用于同步执行进度的互斥锁 std::mutex用于保护共享资源,确保同一时间只有一个线程可以访问
TimePoint previous_update_instance
在异步模式下用于计算时间差(dt)的时间实例 使用TimePoint类型表示一个具体的时间点,用于与上一个更新时间点进行比较,以计算时间差
AtomicActorSet registered_vehicles
注册到交通管理器的所有参与者集合。
std::unique_ptr< std::thread > worker_thread
用于顺序执行子组件的单个工作线程 使用std::unique_ptr<std::thread>管理线程的生命周期,确保线程在不再需要时能够被正确销毁
void SetupLocalMap()
设置内存中的地图 此方法用于初始化或设置TrafficManagerLocal所使用的内存地图
void Start()
启动交通管理器 此方法用于启动TrafficManagerLocal,开始其管理交通的功能
std::condition_variable step_begin_trigger
用于同步执行进度的条件变量 std::condition_variable用于线程间的同步,当一个线程需要等待某个条件成立时,可以阻塞在该条件变量上,直到另一个线程通知条件已成立
ControlFrame control_frame
存储运动规划阶段输出数据的数组 用于存储运动规划阶段产生的控制指令
Parameters parameters
参数化对象 包含交通管理器运行所需的各种配置参数
std::vector< ActorId > vehicle_id_list
当前更新周期中注册到交通管理器的车辆列表 使用ActorId类型存储车辆的唯一标识符
BufferMap buffer_map
存储所有车辆路径点的缓冲区结构映射 使用BufferMap类型(可能是自定义的映射类型)来存储每个车辆的路径点缓冲区
TrackTraffic track_traffic
用于跟踪交通车辆路径的对象 TrackTraffic对象可能包含有关交通车辆当前位置和预期路径的信息
CollisionFrame collision_frame
存储碰撞避免阶段输出数据的数组 用于存储碰撞避免阶段产生的数据
void Run()
启动线程以顺序运行交通管理器 此方法将创建一个新线程(如果尚未创建),并在该线程中顺序运行交通管理器的逻辑
TLFrame tl_frame
存储交通灯响应阶段输出数据的数组 用于存储交通灯响应阶段产生的数据
TrafficManagerLocal(std::vector< float > longitudinal_PID_parameters, std::vector< float > longitudinal_highway_PID_parameters, std::vector< float > lateral_PID_parameters, std::vector< float > lateral_highway_PID_parameters, float perc_decrease_from_limit, cc::detail::EpisodeProxy &episode_proxy, uint16_t &RPCportTM)
私有构造函数,用于单例生命周期管理
uint64_t current_reserved_capacity
用于跟踪当前为帧保留的数组空间的变量 这是一个无符号64位整数,用于记录为各个帧数组预留的空间大小
LocalizationFrame localization_frame
存储定位阶段输出数据的数组 用于存储定位阶段产生的数据
ALSM alsm
自动驾驶局部路径规划模块(ALSM) ALSM可能是一个用于生成局部路径规划算法的模块或对象
LocalMapPtr local_map
指向本地地图缓存的指针 使用智能指针管理InMemoryMap对象,用于存储和访问地图数据
carla::client::detail::EpisodeProxy episode_proxy
CARLA 客户端连接对象。
virtual ~TrafficManagerLocal()
析构函数 虚拟析构函数,用于确保派生类能够正确地被销毁
std::atomic< bool > run_traffic_manger
用于打开/关闭交通管理器的开关 这是一个原子布尔变量,用于线程安全地控制交通管理器的运行状态
void Release()
释放交通管理器 此方法用于释放TrafficManagerLocal所占用的资源,例如线程、内存等
SimulationState simulation_state
包含模拟中所有参与者当前状态的类型 用于表示模拟中所有参与者的状态信息
void Stop()
停止交通管理器 此方法用于停止TrafficManagerLocal的运行,并可能进行必要的清理工作
std::atomic< bool > step_begin
用于标记步骤开始和结束的标志 使用std::atomic<bool>确保跨线程的原子操作,避免数据竞争
std::mutex registration_mutex
防止在帧数组重新分配期间注册车辆的互斥锁 用于保护车辆注册操作,确保在帧数组重新分配时不会有新的车辆被注册
交通管理服务器类,负责处理远程交通管理器的请求并应用更改到本地实例。
VehicleLightStage类负责根据车辆当前的状态和周围环境来开启或关闭车辆的灯光
void Update(const unsigned long index) override
更新方法。
包含客户端相关类和定义的命名空间。
Definition AtomicList.h:17
carla::SharedPtr< cc::Actor > ActorPtr
使用别名简化代码中的命名
std::vector< uint8_t > Route
路线类型,由一系列地理位置组成
std::vector< cg::Location > Path
参与者的唯一标识符类型
std::vector< Action > ActionBuffer
动作缓冲区类型别名。
std::pair< RoadOption, WaypointPtr > Action
动作类型别名。
carla::ActorId ActorId
参与者的智能指针类型
chr::time_point< chr::system_clock, chr::nanoseconds > TimePoint
时间点类型,使用系统时钟和纳秒精度
std::vector< carla::SharedPtr< carla::client::TrafficLight > > TLGroup
交通灯组类型,使用CARLA的智能指针管理交通灯对象的集合
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
static void log_warning(Args &&... args)
Definition Logging.h:101
boost::shared_ptr< T > SharedPtr
使用这个SharedPtr(boost::shared_ptr)以保持与boost::python的兼容性, 但未来如果可能的话,我们希望能为std::shared_ptr制作一个Python适配器。
Definition Memory.h:19