CARLA
 
载入中...
搜索中...
未找到
TrackTraffic.cpp
浏览该文件的文档.
1
3
5
6namespace carla {
7namespace traffic_manager {
8// 使用命名空间中的常量
11// TrackTraffic类的构造函数
13
15 const std::vector<SimpleWaypointPtr> waypoints) {
16// 删除指定参与者的现有信息
17 DeleteActor(actor_id);
18
19 std::unordered_set<GeoGridId> current_grids;
20 // Step through waypoints and update grid list for actor and actor list for grids.
21 for (auto &waypoint : waypoints) {
22 // 更新经过的车辆信息
23 UpdatePassingVehicle(waypoint->GetId(), actor_id);
24// 获取路点的地理网格 ID
25 GeoGridId ggid = waypoint->GetGeodesicGridId();
26 // 将网格 ID 插入当前网格集合
27 current_grids.insert(ggid);
28// 如果网格到参与者的映射中存在该网格 ID
29 if (grid_to_actors.find(ggid) != grid_to_actors.end()) {
30 // 获取对应网格的参与者集合
31 ActorIdSet &actor_ids = grid_to_actors.at(ggid);
32 // 如果参与者 ID 不在集合中,插入参与者 ID
33 if (actor_ids.find(actor_id) == actor_ids.end()) {
34 actor_ids.insert(actor_id);
35 }
36 } else {
37 // 如果映射中不存在该网格 ID,创建新的映射关系
38 grid_to_actors.insert({ggid, {actor_id}});
39 }
40 }
41// 将参与者 ID 和当前网格集合插入参与者到网格的映射中
42 actor_to_grids.insert({actor_id, current_grids});
43}
44
45void TrackTraffic::UpdateGridPosition(const ActorId actor_id, const Buffer &buffer) {
46 // 如果缓冲区不为空
47 if (!buffer.empty()) {
48
49 // Clear current actor from all grids containing itself.
50 if (actor_to_grids.find(actor_id) != actor_to_grids.end()) {
51 std::unordered_set<GeoGridId> &current_grids = actor_to_grids.at(actor_id);
52 // 遍历当前参与者所在的网格集合
53 for (auto &grid_id : current_grids) {
54 // 如果网格到参与者的映射中存在该网格 ID
55 if (grid_to_actors.find(grid_id) != grid_to_actors.end()) {
56 // 获取对应网格的参与者集合
57 ActorIdSet &actor_ids = grid_to_actors.at(grid_id);
58 // 从集合中删除该参与者 ID
59 actor_ids.erase(actor_id);
60 }
61 }
62// 从参与者到网格的映射中删除该参与者
63 actor_to_grids.erase(actor_id);
64 }
65
66 // Step through buffer and update grid list for actor and actor list for grids.
67 std::unordered_set<GeoGridId> current_grids;
68 uint64_t buffer_size = buffer.size();
69 // 遍历缓冲区中的路点
70 for (uint64_t i = 0u; i <= buffer_size - 1u; ++i) {
71 auto waypoint = buffer.at(i);
72 GeoGridId ggid = waypoint->GetGeodesicGridId();
73 current_grids.insert(ggid);
74 // Add grid entry if not present.
75 if (grid_to_actors.find(ggid) == grid_to_actors.end()) {
76 grid_to_actors.insert({ggid, {}});
77 }
78// 获取对应网格的参与者集合
79 ActorIdSet &actor_ids = grid_to_actors.at(ggid);
80 // 如果参与者 ID 不在集合中,插入参与者 ID
81 if (actor_ids.find(actor_id) == actor_ids.end()) {
82 actor_ids.insert(actor_id);
83 }
84 }
85// 将参与者 ID 和当前网格集合插入参与者到网格的映射中
86 actor_to_grids.insert({actor_id, current_grids});
87 }
88}
89
90
91bool TrackTraffic::IsGeoGridFree(const GeoGridId geogrid_id) const {
92 if (grid_to_actors.find(geogrid_id) != grid_to_actors.end()) {
93 return grid_to_actors.at(geogrid_id).empty();
94 }
95 return true;
96}
97
98void TrackTraffic::AddTakenGrid(const GeoGridId geogrid_id, const ActorId actor_id) {
99 // 如果网格到参与者的映射中不存在该网格 ID
100 if (grid_to_actors.find(geogrid_id) == grid_to_actors.end()) {
101 // 创建新的映射关系(网格 ID 到包含该演员 ID 的集合)
102 grid_to_actors.insert({geogrid_id, {actor_id}});
103 }
104}
105
106
108 hero_location = _location;
109}
110
114
116 ActorIdSet actor_id_set;
117// 如果参与者在参与者到网格的映射中
118 if (actor_to_grids.find(actor_id) != actor_to_grids.end()) {
119 const std::unordered_set<GeoGridId> &grid_ids = actor_to_grids.at(actor_id);
120 // 遍历参与者所在的网格集合
121 for (auto &grid_id : grid_ids) {
122 // 如果网格到参与者的映射中存在该网格 ID
123 if (grid_to_actors.find(grid_id) != grid_to_actors.end()) {
124 // 获取对应网格的参与者集合
125 const ActorIdSet &actor_ids = grid_to_actors.at(grid_id);
126 // 将集合中的参与者 ID 插入结果集合
127 actor_id_set.insert(actor_ids.begin(), actor_ids.end());
128 }
129 }
130 }
131
132 return actor_id_set;
133}
134
136 // 如果参与者在参与者到网格的映射中
137 if (actor_to_grids.find(actor_id) != actor_to_grids.end()) {
138 std::unordered_set<GeoGridId> &grid_ids = actor_to_grids.at(actor_id);
139 // 遍历参与者所在的网格集合
140 for (auto &grid_id : grid_ids) {
141 // 如果网格到参与者的映射中存在该网格 ID
142 if (grid_to_actors.find(grid_id) != grid_to_actors.end()) {
143 // 获取对应网格的参与者集合
144 ActorIdSet &actor_ids = grid_to_actors.at(grid_id);
145 // 从集合中删除该参与者 ID
146 actor_ids.erase(actor_id);
147 }
148 }
149 // 从参与者到网格的映射中删除该参与者
150 actor_to_grids.erase(actor_id);
151 }
152// 如果参与者在路点占用的映射中
153 if (waypoint_occupied.find(actor_id) != waypoint_occupied.end()) {
154 WaypointIdSet waypoint_id_set = waypoint_occupied.at(actor_id);
155 // 遍历参与者占用的路点 ID 集合
156 for (const uint64_t &waypoint_id : waypoint_id_set) {
157 // 移除经过的车辆
158 RemovePassingVehicle(waypoint_id, actor_id);
159 }
160 }
161}
162
163void TrackTraffic::UpdatePassingVehicle(uint64_t waypoint_id, ActorId actor_id) {
164 // 如果路点重叠追踪器中存在该路点 ID
165 if (waypoint_overlap_tracker.find(waypoint_id) != waypoint_overlap_tracker.end()) {
166 // 获取对应路点的参与者集合
167 ActorIdSet &actor_id_set = waypoint_overlap_tracker.at(waypoint_id);
168 // 如果参与者 ID 不在集合中,插入参与者 ID
169 if (actor_id_set.find(actor_id) == actor_id_set.end()) {
170 actor_id_set.insert(actor_id);
171 }
172 } else {
173 // 如果路点重叠追踪器中不存在该路点 ID,创建新的映射关系
174 waypoint_overlap_tracker.insert({waypoint_id, {actor_id}});
175 }
176// 如果参与者在路点占用的映射中
177 if (waypoint_occupied.find(actor_id) != waypoint_occupied.end()) {
178 // 获取对应参与者的路点 ID 集合
179 WaypointIdSet &waypoint_id_set = waypoint_occupied.at(actor_id);
180 // 如果路点 ID 不在集合中,插入路点 ID
181 if (waypoint_id_set.find(waypoint_id) == waypoint_id_set.end()) {
182 waypoint_id_set.insert(waypoint_id);
183 }
184 } else {
185 // 如果参与者不在路点占用的映射中,创建新的映射关系
186 waypoint_occupied.insert({actor_id, {waypoint_id}});
187 }
188}
189
190void TrackTraffic::RemovePassingVehicle(uint64_t waypoint_id, ActorId actor_id) {
191 // 如果路点重叠追踪器中存在该路点 ID
192 if (waypoint_overlap_tracker.find(waypoint_id) != waypoint_overlap_tracker.end()) {
193 ActorIdSet &actor_id_set = waypoint_overlap_tracker.at(waypoint_id);
194 actor_id_set.erase(actor_id);
195// 如果集合为空,从路点重叠追踪器中删除该路点 ID
196 if (actor_id_set.size() == 0) {
197 waypoint_overlap_tracker.erase(waypoint_id);
198 }
199 }
200// 如果参与者在路点占用的映射中
201 if (waypoint_occupied.find(actor_id) != waypoint_occupied.end()) {
202 WaypointIdSet &waypoint_id_set = waypoint_occupied.at(actor_id);
203 waypoint_id_set.erase(waypoint_id);
204// 如果集合为空,从参与者占用的映射中删除该参与者 ID
205 if (waypoint_id_set.size() == 0) {
206 waypoint_occupied.erase(actor_id);
207 }
208 }
209}
210
211ActorIdSet TrackTraffic::GetPassingVehicles(uint64_t waypoint_id) const {
212
213 if (waypoint_overlap_tracker.find(waypoint_id) != waypoint_overlap_tracker.end()) {
214 return waypoint_overlap_tracker.at(waypoint_id);
215 } else {
216 return ActorIdSet();
217 }
218}
219// 清空所有数据结构
222 waypoint_occupied.clear();
223 actor_to_grids.clear();
224 grid_to_actors.clear();
225}
226
227} // namespace traffic_manager
228} // namespace carla
void UpdatePassingVehicle(uint64_t waypoint_id, ActorId actor_id)
更新、移除和检索经过某一路点车辆的方法
std::unordered_map< ActorId, std::unordered_set< GeoGridId > > actor_to_grids
参与者路径所占据的测地线网格
void UpdateGridPosition(const ActorId actor_id, const Buffer &buffer)
ActorIdSet GetPassingVehicles(uint64_t waypoint_id) const
cg::Location hero_location
当前英雄位置
ActorIdSet GetOverlappingVehicles(ActorId actor_id) const
bool IsGeoGridFree(const GeoGridId geogrid_id) const
std::unordered_set< uint64_t > WaypointIdSet
用于跟踪车辆所占用航点的结构
void UpdateUnregisteredGridPosition(const ActorId actor_id, const std::vector< SimpleWaypointPtr > waypoints)
void RemovePassingVehicle(uint64_t waypoint_id, ActorId actor_id)
void DeleteActor(ActorId actor_id)
从跟踪中删除参与者数据的方法
WaypointOccupancyMap waypoint_occupied
void AddTakenGrid(const GeoGridId geogrid_id, const ActorId actor_id)
void SetHeroLocation(const cg::Location location)
std::unordered_map< GeoGridId, ActorIdSet > grid_to_actors
参与者当前经过的网格
std::deque< std::shared_ptr< SimpleWaypoint > > Buffer
carla::ActorId ActorId
参与者的智能指针类型
std::unordered_set< ActorId > ActorIdSet
CARLA模拟器的主命名空间。
Definition Carla.cpp:139