CARLA
 
载入中...
搜索中...
未找到
TrafficManagerRemote.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 <thread>
8// 引入线程库
9
11// 引入 Carla 客户端的模拟器实现细节头文件
12
14// 引入 Carla 的远程交通管理器头文件
15
16namespace carla {
17namespace traffic_manager {
18// 命名空间 carla 和 traffic_manager
19
21 const std::pair<std::string, uint16_t> &_serverTM,
23 : client(_serverTM.first, _serverTM.second),
24 episodeProxyTM(episodeProxy) {
25// 远程交通管理器的构造函数,接收服务器地址对和场景代理对象,初始化成员变量
26
27 Start();
28// 启动远程交通管理器
29}
30
31/// Destructor.
33 Release();
34// 析构函数,释放资源
35}
36
38 _keep_alive = true;
39// 设置存活标志为真
40
41 std::thread _thread = std::thread([this] () {
42// 创建一个新线程
43
44 std::chrono::milliseconds wait_time(TM_TIMEOUT);
45// 设置等待时间
46
47 try {
48 do {
49 std::this_thread::sleep_for(wait_time);
50// 线程睡眠一段时间
51
52 client.HealthCheckRemoteTM();
53// 对远程交通管理器进行健康检查
54
55 /// Until connection active
56 } while (_keep_alive);
57// 当存活标志为真时循环
58 } catch (...) {
59
60 std::string rhost("");
61 uint16_t rport = 0;
62// 初始化远程主机地址和端口
63
64 client.getServerDetails(rhost, rport);
65// 获取服务器详细信息
66
67 std::string strtmserver(rhost + ":" + std::to_string(rport));
68// 构建服务器地址字符串
69
70 /// Create error msg
71 std::string errmsg(
72 "Trying to connect rpc server of traffic manager; "
73 "but the system failed to connect at " + strtmserver);
74// 创建错误消息
75
76 /// TSet the error message
77 if(_keep_alive) {
78 this->episodeProxyTM.Lock()->AddPendingException(errmsg);
79// 如果存活标志为真,将错误消息添加到场景代理的待处理异常中
80 }
81 }
82 _keep_alive = false;
83 _cv.notify_one();
84// 设置存活标志为假,并通知条件变量
85 });
86
87 _thread.detach();
88// 分离线程
89}
90
92 if(_keep_alive) {
93 _keep_alive = false;
94 std::unique_lock<std::mutex> lock(_mutex);
95 std::chrono::milliseconds wait_time(TM_TIMEOUT + 1000);
96 _cv.wait_for(lock, wait_time);
97// 如果存活标志为真,设置存活标志为假,加锁互斥量,等待条件变量一段时间
98 }
99}
100
102 Stop();
103// 释放资源,调用停止函数
104}
105
107 Stop();
108// 停止远程交通管理器
109
110 carla::client::detail::EpisodeProxy episode_proxy = episodeProxyTM.Lock()->GetCurrentEpisode();
111 episodeProxyTM = episode_proxy;
112// 获取当前场景代理,并更新成员变量
113
114 Start();
115// 重新启动远程交通管理器
116}
117
118void TrafficManagerRemote::RegisterVehicles(const std::vector<ActorPtr> &_actor_list) {
119 std::vector<carla::rpc::Actor> actor_list;
120 for (auto &&actor : _actor_list) {
121 actor_list.emplace_back(actor->Serialize());
122// 将输入的车辆列表转换为 rpc 格式的车辆列表
123 }
124 client.RegisterVehicle(actor_list);
125// 通过客户端注册车辆
126}
127
128void TrafficManagerRemote::UnregisterVehicles(const std::vector<ActorPtr> &_actor_list) {
129 std::vector<carla::rpc::Actor> actor_list;
130 for (auto &&actor : _actor_list) {
131 actor_list.emplace_back(actor->Serialize());
132// 将输入的车辆列表转换为 rpc 格式的车辆列表
133 }
134 client.UnregisterVehicle(actor_list);
135// 通过客户端注销车辆
136}
137
138void TrafficManagerRemote::SetPercentageSpeedDifference(const ActorPtr &_actor, const float percentage) {
139 carla::rpc::Actor actor(_actor->Serialize());
140// 将输入的车辆转换为 rpc 格式的车辆
141
142 client.SetPercentageSpeedDifference(actor, percentage);
143// 通过客户端设置车辆的速度差异百分比
144}
145
146void TrafficManagerRemote::SetDesiredSpeed(const ActorPtr &_actor, const float value) {
147 carla::rpc::Actor actor(_actor->Serialize());
148// 将输入的车辆转换为 rpc 格式的车辆
149
150 client.SetDesiredSpeed(actor, value);
151// 通过客户端设置车辆的期望速度
152}
153
155 client.SetGlobalPercentageSpeedDifference(percentage);
156// 通过客户端设置全局速度差异百分比
157}
158
159void TrafficManagerRemote::SetLaneOffset(const ActorPtr &_actor, const float offset) {
160 carla::rpc::Actor actor(_actor->Serialize());
161// 将输入的车辆转换为 rpc 格式的车辆
162
163 client.SetLaneOffset(actor, offset);
164// 通过客户端设置车辆的车道偏移量
165}
166
168 client.SetGlobalLaneOffset(offset);
169// 通过客户端设置全局车道偏移量
170}
171
172void TrafficManagerRemote::SetUpdateVehicleLights(const ActorPtr &_actor, const bool do_update) {
173 carla::rpc::Actor actor(_actor->Serialize());
174// 将输入的车辆转换为 rpc 格式的车辆
175
176 client.SetUpdateVehicleLights(actor, do_update);
177// 通过客户端设置车辆的灯光更新状态
178}
179
180void TrafficManagerRemote::SetCollisionDetection(const ActorPtr &_reference_actor, const ActorPtr &_other_actor, const bool detect_collision) {
181 carla::rpc::Actor reference_actor(_reference_actor->Serialize());
182 carla::rpc::Actor other_actor(_other_actor->Serialize());
183// 将输入的两辆车辆转换为 rpc 格式的车辆
184
185 client.SetCollisionDetection(reference_actor, other_actor, detect_collision);
186// 通过客户端设置两辆车辆之间的碰撞检测状态
187}
188
189void TrafficManagerRemote::SetForceLaneChange(const ActorPtr &_actor, const bool direction) {
190 carla::rpc::Actor actor(_actor->Serialize());
191// 将输入的车辆转换为 rpc 格式的车辆
192
193 client.SetForceLaneChange(actor, direction);
194// 通过客户端设置车辆的强制换道方向
195}
196
197void TrafficManagerRemote::SetAutoLaneChange(const ActorPtr &_actor, const bool enable) {
198 carla::rpc::Actor actor(_actor->Serialize());
199// 将输入的车辆转换为 rpc 格式的车辆
200
201 client.SetAutoLaneChange(actor, enable);
202// 通过客户端设置车辆的自动换道状态
203}
204
205void TrafficManagerRemote::SetDistanceToLeadingVehicle(const ActorPtr &_actor, const float distance) {
206 carla::rpc::Actor actor(_actor->Serialize());
207// 将输入的车辆转换为 rpc 格式的车辆
208
209 client.SetDistanceToLeadingVehicle(actor, distance);
210// 通过客户端设置车辆与前车的距离
211}
212
214 client.SetGlobalDistanceToLeadingVehicle(distance);
215// 通过客户端设置全局与前车的距离
216}
217
218
219void TrafficManagerRemote::SetPercentageIgnoreWalkers(const ActorPtr &_actor, const float percentage) {
220 carla::rpc::Actor actor(_actor->Serialize());
221// 将输入的车辆转换为 rpc 格式的车辆
222
223 client.SetPercentageIgnoreWalkers(actor, percentage);
224// 通过客户端设置车辆忽略行人的百分比
225}
226
227void TrafficManagerRemote::SetPercentageIgnoreVehicles(const ActorPtr &_actor, const float percentage) {
228 carla::rpc::Actor actor(_actor->Serialize());
229// 将输入的车辆转换为 rpc 格式的车辆
230
231 client.SetPercentageIgnoreVehicles(actor, percentage);
232// 通过客户端设置车辆忽略其他车辆的百分比
233}
234
235void TrafficManagerRemote::SetPercentageRunningLight(const ActorPtr &_actor, const float percentage) {
236 carla::rpc::Actor actor(_actor->Serialize());
237// 将输入的车辆转换为 rpc 格式的车辆
238
239 client.SetPercentageRunningLight(actor, percentage);
240// 通过客户端设置车辆运行灯光的百分比
241}
242
243void TrafficManagerRemote::SetPercentageRunningSign(const ActorPtr &_actor, const float percentage) {
244 carla::rpc::Actor actor(_actor->Serialize());
245// 将输入的车辆转换为 rpc 格式的车辆
246
247 client.SetPercentageRunningSign(actor, percentage);
248// 通过客户端设置车辆运行标志的百分比
249}
250
251void TrafficManagerRemote::SetKeepRightPercentage(const ActorPtr &_actor, const float percentage) {
252 carla::rpc::Actor actor(_actor->Serialize());
253// 将输入的车辆转换为 rpc 格式的车辆
254
255 client.SetKeepRightPercentage(actor, percentage);
256// 通过客户端设置车辆靠右行驶的百分比
257}
258
259void TrafficManagerRemote::SetRandomLeftLaneChangePercentage(const ActorPtr &_actor, const float percentage) {
260 carla::rpc::Actor actor(_actor->Serialize());
261// 将输入的车辆转换为 rpc 格式的车辆
262
263 client.SetRandomLeftLaneChangePercentage(actor, percentage);
264// 通过客户端设置车辆随机向左换道的百分比
265}
266
267void TrafficManagerRemote::SetRandomRightLaneChangePercentage(const ActorPtr &_actor, const float percentage) {
268 carla::rpc::Actor actor(_actor->Serialize());
269// 将输入的车辆转换为 rpc 格式的车辆
270
271 client.SetRandomRightLaneChangePercentage(actor, percentage);
272// 通过客户端设置车辆随机向右换道的百分比
273}
274
275void TrafficManagerRemote::SetHybridPhysicsMode(const bool mode_switch) {
276 client.SetHybridPhysicsMode(mode_switch);
277// 通过客户端设置混合物理模式开关
278}
279
281 client.SetHybridPhysicsRadius(radius);
282// 通过客户端设置混合物理模式半径
283}
284
285void TrafficManagerRemote::SetOSMMode(const bool mode_switch) {
286 client.SetOSMMode(mode_switch);
287// 通过客户端设置 OSM 模式开关
288}
289
290void TrafficManagerRemote::SetCustomPath(const ActorPtr &_actor, const Path path, const bool empty_buffer) {
291 carla::rpc::Actor actor(_actor->Serialize());
292// 将输入的车辆转换为 rpc 格式的车辆
293
294 client.SetCustomPath(actor, path, empty_buffer);
295// 通过客户端为车辆设置自定义路径
296}
297
298void TrafficManagerRemote::RemoveUploadPath(const ActorId &actor_id, const bool remove_path) {
299 client.RemoveUploadPath(actor_id, remove_path);
300// 通过客户端移除车辆的上传路径
301}
302
303void TrafficManagerRemote::UpdateUploadPath(const ActorId &actor_id, const Path path) {
304 client.UpdateUploadPath(actor_id, path);
305// 通过客户端更新车辆的上传路径
306}
307
308void TrafficManagerRemote::SetImportedRoute(const ActorPtr &_actor, const Route route, const bool empty_buffer) {
309 carla::rpc::Actor actor(_actor->Serialize());
310// 将输入的车辆转换为 rpc 格式的车辆
311
312 client.SetImportedRoute(actor, route, empty_buffer);
313// 通过客户端为车辆设置导入的路线
314}
315
316void TrafficManagerRemote::RemoveImportedRoute(const ActorId &actor_id, const bool remove_path) {
317 client.RemoveImportedRoute(actor_id, remove_path);
318// 通过客户端移除车辆的导入路线
319}
320
321void TrafficManagerRemote::UpdateImportedRoute(const ActorId &actor_id, const Route route) {
322 client.UpdateImportedRoute(actor_id, route);
323// 通过客户端更新车辆的导入路线
324}
325
327 client.SetRespawnDormantVehicles(mode_switch);
328// 通过客户端设置是否复活休眠车辆
329}
330
331void TrafficManagerRemote::SetBoundariesRespawnDormantVehicles(const float lower_bound, const float upper_bound) {
332 client.SetBoundariesRespawnDormantVehicles(lower_bound, upper_bound);
333// 通过客户端设置复活休眠车辆的边界
334}
335
336void TrafficManagerRemote::SetMaxBoundaries(const float lower, const float upper) {
337 client.SetMaxBoundaries(lower, upper);
338// 通过客户端设置最大边界
339}
340
342 client.ShutDown();
343// 通过客户端关闭远程交通管理器
344}
345
347 client.SetSynchronousMode(mode);
348// 通过客户端设置同步模式开关
349}
350
352 client.SetSynchronousModeTimeOutInMiliSecond(time);
353// 通过客户端设置同步模式超时时间(毫秒)
354}
355
357 return client.GetNextAction(actor_id);
358// 通过客户端获取指定车辆的下一个动作
359}
360
362 return client.GetActionBuffer(actor_id);
363// 通过客户端获取指定车辆的动作缓冲区
364}
365
367 return false;
368// 返回假,表示同步时钟滴答函数未实现
369}
370
372 client.HealthCheckRemoteTM();
373// 通过客户端对远程交通管理器进行健康检查
374}
375
377 return episodeProxyTM;
378// 返回场景代理对象的引用
379}
380
382 client.SetRandomDeviceSeed(seed);
383// 通过客户端设置随机数生成器的种子
384}
385
386} // namespace traffic_manager
387} // namespace carla
SharedPtrType Lock() const
与 TryLock 相同,但永远不会返回 nullptr。
void SetPercentageIgnoreVehicles(const ActorPtr &actor, const float perc)
设置车辆忽略其他车辆碰撞的百分比概率。
carla::client::detail::EpisodeProxy & GetEpisodeProxy()
获取CARLA回合信息。
void SetUpdateVehicleLights(const ActorPtr &actor, const bool do_update)
设置车辆灯光的自动管理功能。
void SetGlobalPercentageSpeedDifference(float const percentage)
设置全局速度相对于限速的百分比减少量。
void RemoveUploadPath(const ActorId &actor_id, const bool remove_path)
移除路径。
carla::client::detail::EpisodeProxy episodeProxyTM
CARLA客户端连接对象。
void SetCollisionDetection(const ActorPtr &reference_actor, const ActorPtr &other_actor, const bool detect_collision)
设置车辆之间的碰撞检测规则。
void SetKeepRightPercentage(const ActorPtr &actor, const float percentage)
设置车辆保持在右侧车道的百分比概率。
void UpdateUploadPath(const ActorId &actor_id, const Path path)
更新已设置的路径。
void SetGlobalLaneOffset(float const offset)
设置全局车道偏移量,相对于车道中心线。
void UnregisterVehicles(const std::vector< ActorPtr > &actor_list)
从交通管理器注销车辆。
std::condition_variable _cv
条件变量,用于线程同步。
void SetHybridPhysicsMode(const bool mode_switch)
设置混合物理模式。
void RemoveImportedRoute(const ActorId &actor_id, const bool remove_path)
移除路线。
void RegisterVehicles(const std::vector< ActorPtr > &actor_list)
注册车辆到交通管理器。
void SetCustomPath(const ActorPtr &actor, const Path path, const bool empty_buffer)
设置自定义路径。
void SetDesiredSpeed(const ActorPtr &actor, const float value)
设置车辆的精确期望速度。
void SetLaneOffset(const ActorPtr &actor, const float offset)
设置车辆相对于车道中心线的偏移量。
void SetOSMMode(const bool mode_switch)
设置Open Street Map(OSM)模式。
void SetRandomDeviceSeed(const uint64_t seed)
设置随机化种子。
void UpdateImportedRoute(const ActorId &actor_id, const Route route)
更新已设置的路线。
void SetGlobalDistanceToLeadingVehicle(const float distance)
设置全局前车距离。
void SetRandomRightLaneChangePercentage(const ActorPtr &actor, const float percentage)
设置车辆随机进行右车道变换的百分比概率。
std::mutex _mutex
互斥锁,用于保护共享资源。
void SetRespawnDormantVehicles(const bool mode_switch)
设置自动重生休眠车辆的模式。
void SetAutoLaneChange(const ActorPtr &actor, const bool enable)
启用/禁用车辆的自动换道功能。
void SetBoundariesRespawnDormantVehicles(const float lower_bound, const float upper_bound)
设置休眠车辆重生的边界。
void SetImportedRoute(const ActorPtr &actor, const Route route, const bool empty_buffer)
设置自定义路线。
void SetPercentageIgnoreWalkers(const ActorPtr &actor, const float perc)
设置车辆忽略行人碰撞的百分比概率。
Action GetNextAction(const ActorId &actor_id)
获取车辆的下一个动作。
void SetPercentageRunningLight(const ActorPtr &actor, const float perc)
设置车辆无视交通信号灯的概率百分比。
void SetSynchronousModeTimeOutInMiliSecond(double time)
设置同步执行模式的Tick超时时间(毫秒)。
ActionBuffer GetActionBuffer(const ActorId &actor_id)
获取车辆的动作缓冲区。
void SetRandomLeftLaneChangePercentage(const ActorPtr &actor, const float percentage)
设置车辆随机进行左车道变换的百分比概率。
void SetPercentageSpeedDifference(const ActorPtr &actor, const float percentage)
设置车辆相对于限速的速度差异百分比。
TrafficManagerRemote(const std::pair< std::string, uint16_t > &_serverTM, carla::client::detail::EpisodeProxy &episodeProxy)
构造函数,存储远程服务器的位置信息。
void SetDistanceToLeadingVehicle(const ActorPtr &actor, const float distance)
设置车辆与前车应保持的距离。
void HealthCheckRemoteTM()
检查服务器是否存活。
void SetPercentageRunningSign(const ActorPtr &actor, const float perc)
设置车辆无视交通标志的概率百分比。
virtual void ShutDown()
关闭交通管理器。
void SetSynchronousMode(bool mode)
切换交通管理器为同步执行模式。
void SetForceLaneChange(const ActorPtr &actor, const bool direction)
强制车辆进行换道。
void SetHybridPhysicsRadius(const float radius)
设置混合物理模式的半径。
void SetMaxBoundaries(const float lower, const float upper)
设置最大的重生边界。
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
参与者的智能指针类型
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
包含CARLA客户端相关类和函数的命名空间。