CARLA
 
载入中...
搜索中...
未找到
Simulator.cpp
浏览该文件的文档.
1// Copyright (c) 2017 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
8
9#include "carla/Debug.h"
10#include "carla/Exception.h"
11#include "carla/Logging.h"
15#include "carla/client/Map.h"
16#include "carla/client/Sensor.h"
23
24#include <exception>
25#include <thread>
26
27using namespace std::string_literals;
28
29namespace carla {
30namespace client {
31namespace detail {
32
33 // ===========================================================================
34 // -- 静态局部方法 ------------------------------------------------------------
35 // ===========================================================================
36
38 const auto vc = client.GetClientVersion();
39 const auto vs = client.GetServerVersion();
40 if (vc != vs) {
42 "Version mismatch detected: You are trying to connect to a simulator",
43 "that might be incompatible with this API");
44 log_warning("Client API version =", vc);
45 log_warning("Simulator API version =", vs);
46 }
47 }
48
49 static bool SynchronizeFrame(uint64_t frame, const Episode &episode, time_duration timeout) {
50 bool result = true;//初始化结果为true,表示默认同步成功
51 auto start = std::chrono::system_clock::now();//获取当前时间点作为开始时间
52 while (frame > episode.GetState()->GetTimestamp().frame) {//当当前帧大于episode中的状态时,循环等待
53 std::this_thread::yield();//放弃当前线程的剩余时间片,允许其他线程运行
54 auto end = std::chrono::system_clock::now();//获取当前时间点作为结束时间
55 auto diff = std::chrono::duration_cast<std::chrono::milliseconds>(end-start);//计算从开始到结束的时间差,并转换为毫秒
56 if(timeout.to_chrono() < diff) {//如果已经超过了指定的超时时间,则设置结果为false并退出循环
57 result = false;
58 break;
59 }
60 }
61 if(result) {//如果成功同步,则调用TrafficManager的Tick方法
63 }
64
65 return result;//返回同步结果
66 }
67
68 // ===========================================================================
69 // -- 构造函数 ----------------------------------------------------------------
70 // ===========================================================================
71
72 Simulator::Simulator(//Simulator类的构造函数定义
73 const std::string &host,//连接到CARLA服务器的主机名或IP地址
74 const uint16_t port,//与CARLA服务器通信的端口号
75 const size_t worker_threads,//用于处理通信的工作线程的数量
76 const bool enable_garbage_collection)//是否启用垃圾回收
77 : LIBCARLA_INITIALIZE_LIFETIME_PROFILER("SimulatorClient("s + host + ":" + std::to_string(port) + ")"),//初始化性能分析器
78 _client(host, port, worker_threads),//初始化与CARLA服务器的连接
79 _light_manager(new LightManager()),//动态分配LightManager对象
80 _gc_policy(enable_garbage_collection ?//根据参数设置垃圾回收攻略
82 //构造函数完成对象的初始化,所有工作都在初始化列表中完成
83
84 // ===========================================================================
85 // -- 加载新的场景 -------------------------------------------------------------
86 // ===========================================================================
87
88 EpisodeProxy Simulator::LoadEpisode(std::string map_name, bool reset_settings, rpc::MapLayer map_layers) {
89 const auto id = GetCurrentEpisode().GetId();
90 _client.LoadEpisode(std::move(map_name), reset_settings, map_layers);
91
92 // 修复在切换地图时无法加载导航信息的漏洞:https://github.com/OpenHUTB/carla/commit/9e94feb3a52e6f5ba01d8a0e579e5cd3c008a507
93 // 以前,加载新地图时,旧地图的导航信息会被保留。
94 // 这是因为 Episode 对象未被替换。这会导致意外行为,例如,行人会生成在地图上不合适的位置。
95 assert(_episode.use_count() == 1);
96 // 删除指向_episode的指针,以便为正确的地图加载导航信息
97 _episode.reset(); // 释放 _episode 资源并转换为空 shared_ptr 对象
98 GetReadyCurrentEpisode(); // 访问当前的(新的)场景
99
100 // 我们正在等待服务器重新加载地图片段的50毫秒。
101 // 如果此时没有检测到事件的变化,将再次尝试“number_of_attempts”次。
102 // TODO 这个时间是完全任意的,所以我们需要改进这个管线,使其不依赖于这个时间,
103 // 因为这个超时可能导致客户端在以同步模式加载地图时以不同的初始节拍恢复模拟。
104 // 尝试的次数 = 最大连接服务端的超时时间(单位毫秒) / 每次尝试连接的时间间隔(50毫秒)
105 size_t number_of_attempts = _client.GetTimeout().milliseconds() / 50u;
106
107 for (auto i = 0u; i < number_of_attempts; ++i) {
108 using namespace std::literals::chrono_literals; // 使用chrono中的有序常量集合
110 _client.SendTickCue(); // 如果是同步模式,则客户端向服务端发送节拍信号
111
112 _episode->WaitForState(50ms); // 每次等待50毫秒
113 auto episode = GetCurrentEpisode(); // 获取当前的场景
114
115 // 如果当前(等待之后)的场景和进入函数时的场景不一样,表示已经切换到新的场景,则返回当前场景
116 if (episode.GetId() != id) {
117 return episode;
118 }
119 }
120 // 如果尝试“number_of_attempts”次后仍然没有切换到新的场景,则报错
121 throw_exception(std::runtime_error("failed to connect to newly created map"));
122 }
123
125 std::string opendrive,
126 const rpc::OpendriveGenerationParameters & params, bool reset_settings) {
127 // The "OpenDriveMap" is an ".umap" located in:
128 // "carla/Unreal/CarlaUE4/Content/Carla/Maps/"
129 // It will load the last sended OpenDRIVE by client's "LoadOpenDriveEpisode()"
130 constexpr auto custom_opendrive_map = "OpenDriveMap";
131 _client.CopyOpenDriveToServer(std::move(opendrive), params);
132 return LoadEpisode(custom_opendrive_map, reset_settings);
133 }
134
135 // ===========================================================================
136 // -- 访问当前场景 ------------------------------------------------------------
137 // ===========================================================================
138
139 void Simulator::GetReadyCurrentEpisode() {//在Simulator类中定义一个成员函数GetReadyCurrentEpisode
140 if (_episode == nullptr) {//检查当前是否已有一个_episode实例存在
141 ValidateVersions(_client);//如果没有,则首先验证客户端的版本兼容性
142 _episode = std::make_shared<Episode>(_client, std::weak_ptr<Simulator>(shared_from_this()));//创建一个新的_episode实例,使用智能指针管理内存
143 _episode->Listen();//开始监听_episode相关事件或状态变化
144 if (!GetEpisodeSettings().synchronous_mode) {//检查当前_episode的设置是否为非同步模式
145 WaitForTick(_client.GetTimeout());//使用客户端设置的超时时间作为等待时长
146 }
147 _light_manager->SetEpisode(WeakEpisodeProxy{shared_from_this()});//将当前_episode的弱引用设置为灯光管理器
148 }
149 }
152 return EpisodeProxy{shared_from_this()};
153 }
154
156 if (!_cached_map) {
157 return true;
158 }
159 if (map_info.name != _cached_map->GetName() ||
160 _open_drive_file.size() != _cached_map->GetOpenDrive().size()) {
161 return true;
162 }
163 return false;
164 }
165
167 DEBUG_ASSERT(_episode != nullptr);
168 if (!_cached_map || _episode->HasMapChangedSinceLastCall()) {
169 rpc::MapInfo map_info = _client.GetMapInfo();
170 std::string map_name;
171 std::string map_base_path;
172 bool fill_base_string = false;
173 for (int i = map_info.name.size() - 1; i >= 0; --i) {
174 if (fill_base_string == false && map_info.name[i] != '/') {
175 map_name += map_info.name[i];
176 } else {
177 map_base_path += map_info.name[i];
178 fill_base_string = true;
179 }
180 }
181 std::reverse(map_name.begin(), map_name.end());
182 std::reverse(map_base_path.begin(), map_base_path.end());
183 std::string XODRFolder = map_base_path + "/OpenDrive/" + map_name + ".xodr";
184 if (FileTransfer::FileExists(XODRFolder) == false) _client.GetRequiredFiles();
186 _cached_map = MakeShared<Map>(map_info, _open_drive_file);
187 }
188
189 return _cached_map;
190 }
191
192 // ===========================================================================
193 // -- 所需要的文件 ------------------------------------------------------------
194 // ===========================================================================
195
196
197 bool Simulator::SetFilesBaseFolder(const std::string &path) {
198 return _client.SetFilesBaseFolder(path);
199 }
200
201 std::vector<std::string> Simulator::GetRequiredFiles(const std::string &folder, const bool download) const {
202 return _client.GetRequiredFiles(folder, download);
203 }
204
205 void Simulator::RequestFile(const std::string &name) const {
206 _client.RequestFile(name);
207 }
208
209 std::vector<uint8_t> Simulator::GetCacheFile(const std::string &name, const bool request_otherwise) const {
210 return _client.GetCacheFile(name, request_otherwise);
211 }
212
213 // ===========================================================================
214 // -- 节拍 -------------------------------------------------------------------
215 // ===========================================================================
216
218 DEBUG_ASSERT(_episode != nullptr);
219
220 // 发出行人导航节拍
222
223 auto result = _episode->WaitForState(timeout);
224 if (!result.has_value()) {
226 }
227 return *result;
228 }
229
230 uint64_t Simulator::Tick(time_duration timeout) {
231 DEBUG_ASSERT(_episode != nullptr);
232
233 // 发出行人导航节拍
235
236 // 发送节拍命令
237 const auto frame = _client.SendTickCue();
238
239 // 等待,直到收到新的场景
240 bool result = SynchronizeFrame(frame, *_episode, timeout);
241 if (!result) {
243 }
244 return frame;
245 }
246
247 // ===========================================================================
248 // -- 在场景中访问全局对象 -----------------------------------------------------
249 // ===========================================================================
250 // 获取蓝图库对象
252 // 获取 Actor 定义的列表
253 auto defs = _client.GetActorDefinitions();
254 // 返回一个智能指针,指向 BlueprintLibrary 对象,构造时传入定义的列表
255 return MakeShared<BlueprintLibrary>(std::move(defs));
256 }
257 // 获取车辆灯光状态列表
261 // 获取观众对象
263 // 调用 _client 的 GetSpectator 方法获取 Spectator(观众)对象
265 }
266
267 // 设置仿真(Episode)配置
269 // 检查同步模式下是否没有设置固定的时间增量
270 if (settings.synchronous_mode && !settings.fixed_delta_seconds) {
272 "synchronous mode enabled with variable delta seconds. It is highly "
273 "recommended to set 'fixed_delta_seconds' when running on synchronous mode.");
274 }
275 // 检查同步模式和子步进模式同时启用的情况下,子步数是否合理
276 else if (settings.synchronous_mode && settings.substepping) {
277 // 最大物理子步数 必须在[1,16]范围之内
278 if(settings.max_substeps < 1 || settings.max_substeps > 16) {
280 "synchronous mode and substepping are enabled but the number of substeps is not valid. "
281 "Please be aware that this value needs to be in the range [1-16].");
282 }
283 // 检查每个子步增量与最大子步数的乘积是否小于等于固定的时间增量
284 double n_substeps = settings.fixed_delta_seconds.get() / settings.max_substep_delta_time;
285
286 if (n_substeps > static_cast<double>(settings.max_substeps)) {
288 "synchronous mode and substepping are enabled but the values for the simulation are not valid. "
289 "The values should fulfil fixed_delta_seconds <= max_substep_delta_time * max_substeps. "
290 "Be very careful about that, the time deltas are not guaranteed.");
291 }
292 }
293 // 调用 _client 的 SetEpisodeSettings 方法,设置仿真环境的配置
294 const auto frame = _client.SetEpisodeSettings(settings);
295 // 同步当前帧与目标帧
296 using namespace std::literals::chrono_literals;
297 SynchronizeFrame(frame, *_episode, 1s);
298
299 return frame;
300 }
301
302 // ===========================================================================
303 // -- AI ---------------------------------------------------------------------
304 // ===========================================================================
305
306 std::shared_ptr<WalkerNavigation> Simulator::GetNavigation() {
307 DEBUG_ASSERT(_episode != nullptr);// 确保_episode不为空
308 auto nav = _episode->CreateNavigationIfMissing();// 获取导航实例,如果没有,则创建一个
309 return nav;
310 }
311
312 // 行人导航的节拍
314 DEBUG_ASSERT(_episode != nullptr);
315 auto nav = _episode->CreateNavigationIfMissing();
316 nav->Tick(_episode);// 调用导航实例的Tick方法,传递_episode作为参数
317 }
318
320 auto walker = controller.GetParent();
321 if (walker == nullptr) { // 获取AI控制器所控制的行人对象
322 throw_exception(std::runtime_error(controller.GetDisplayId() + ": not attached to walker"));
323 return;
324 }
325 DEBUG_ASSERT(_episode != nullptr);// 确保_episode不为空
326 auto nav = _episode->CreateNavigationIfMissing();// 获取导航实例,如果没有则创建
327 nav->RegisterWalker(walker->GetId(), controller.GetId());// 注册该控制器和对应的行人ID到导航系统
328 }
329
331 auto walker = controller.GetParent();
332 if (walker == nullptr) {// 如果行人对象为空,则抛出异常
333 throw_exception(std::runtime_error(controller.GetDisplayId() + ": not attached to walker"));
334 return;
335 }
336 DEBUG_ASSERT(_episode != nullptr);
337 auto nav = _episode->CreateNavigationIfMissing();// 获取导航实例,如果没有则创建
338 nav->UnregisterWalker(walker->GetId(), controller.GetId());// 从导航系统注销该控制器和对应的行人ID
339 }
340
341 boost::optional<geom::Location> Simulator::GetRandomLocationFromNavigation() {
342 DEBUG_ASSERT(_episode != nullptr);
343 auto nav = _episode->CreateNavigationIfMissing();
344 return nav->GetRandomLocation();// 从导航中获取一个随机位置
345 }
346
348 DEBUG_ASSERT(_episode != nullptr);
349 auto nav = _episode->CreateNavigationIfMissing();
350 nav->SetPedestriansCrossFactor(percentage);// 设置行人穿越系数
351 }
352
353 void Simulator::SetPedestriansSeed(unsigned int seed) {
354 DEBUG_ASSERT(_episode != nullptr);
355 auto nav = _episode->CreateNavigationIfMissing();
356 nav->SetPedestriansSeed(seed);// 设置行人种子值,用于随机生成行人的位置等
357 }
358
359 // ===========================================================================
360 // -- 参与者的一般操作 --------------------------------------------------------
361 // ===========================================================================
362
363 // 生成参与者
365 const ActorBlueprint &blueprint,
366 const geom::Transform &transform,
367 Actor *parent,
368 rpc::AttachmentType attachment_type,
370 const std::string& socket_name) {
371 rpc::Actor actor;
372 // 如果指定了父Actor,则调用带父Actor的SpawnActor方法
373 if (parent != nullptr) {
375 blueprint.MakeActorDescription(),
376 transform,
377 parent->GetId(),
378 attachment_type,
379 socket_name);
380 } else {
381 // 否则,调用不带父Actor的SpawnActor方法
382 actor = _client.SpawnActor(
383 blueprint.MakeActorDescription(),
384 transform);
385 }
386 // 确保_episode不为空
387 DEBUG_ASSERT(_episode != nullptr);
388 // 将生成的Actor注册到当前Episode中
389 _episode->RegisterActor(actor);
390 // 如果垃圾回收策略是继承,则使用当前Episode的垃圾回收策略,否则使用传入的gc策略
391 const auto gca = (gc == GarbageCollectionPolicy::Inherit ? _gc_policy : gc);
392 // 使用工厂方法创建Actor对象并返回
393 auto result = ActorFactory::MakeActor(GetCurrentEpisode(), actor, gca);
394 // 记录日志,显示生成Actor的ID和是否启用了垃圾回收
395 log_debug(
396 result->GetDisplayId(),
397 "created",
398 gca == GarbageCollectionPolicy::Enabled ? "with" : "without",
399 "garbage collection");
400 return result;
401 }
402
403// DestroyActor函数用于销毁一个给定的Actor。
404// 它会从客户端销毁Actor并清除Actor的持久状态,确保该Actor无法再访问客户端。
406 bool success = true;
407 success = _client.DestroyActor(actor.GetId());
408 if (success) {
409 // Remove it's persistent state so it cannot access the client anymore.
410 actor.GetEpisode().Clear();
411 log_debug(actor.GetDisplayId(), "destroyed.");
412 } else {
413 log_debug("failed to destroy", actor.GetDisplayId());
414 }
415 return success;
416 }
417
418 // ===========================================================================
419 // -- 传感器的操作 ------------------------------------------------------------
420 // ===========================================================================
421
422 // Simulator 类的一个成员函数,用于订阅传感器的数据
424 const Sensor &sensor, //引用传递,表示要订阅的传感器对象
425 std::function<void(SharedPtr<sensor::SensorData>)> callback) {
426 DEBUG_ASSERT(_episode != nullptr);
429 [cb=std::move(callback), ep=WeakEpisodeProxy{shared_from_this()}](auto buffer) {
430 auto data = sensor::Deserializer::Deserialize(std::move(buffer));
431 data->_episode = ep.TryLock();
432 cb(std::move(data));
433 });
434 }
435 // 取消订阅传感器的数据
438 // 如果将来我们需要单独取消订阅每个 gbuffer,则应该在这里完成。
439 }
440 // 为ROS启用传感器数据
444 // 为ROS禁用传感器数据
448 // 检查传感器是否为ROS启用
452 // 订阅GBuffer(一种图形缓冲区)数据
454 Actor &actor,
455 uint32_t gbuffer_id,
456 std::function<void(SharedPtr<sensor::SensorData>)> callback) {
457 _client.SubscribeToGBuffer(actor.GetId(), gbuffer_id,
458 [cb=std::move(callback), ep=WeakEpisodeProxy{shared_from_this()}](auto buffer) {
459 auto data = sensor::Deserializer::Deserialize(std::move(buffer));
460 data->_episode = ep.TryLock();
461 cb(std::move(data));
462 });
463 }
464 // 取消订阅GBuffer数据
465 void Simulator::UnSubscribeFromGBuffer(Actor &actor, uint32_t gbuffer_id) {
466 _client.UnSubscribeFromGBuffer(actor.GetId(), gbuffer_id);
467 }
468
469 // 冻结或解冻所有交通信号灯
471 _client.FreezeAllTrafficLights(frozen);// 传递冻结状态给客户端
472 }
473 // 向传感器发送消息
474 void Simulator::Send(const Sensor &sensor, std::string message) {
475 _client.Send(sensor.GetId(), message);
476 }
477
478 // =========================================================================
479 /// -- 纹理更新操作
480 // =========================================================================
481
482// 应用颜色纹理到一组对象上,使用TextureColor类型
484 const std::vector<std::string> &objects_name, // 对象名称的列表
485 const rpc::MaterialParameter& parameter,// 材质参数
486 const rpc::TextureColor& Texture) {// 颜色纹理
487 _client.ApplyColorTextureToObjects(objects_name, parameter, Texture);
488 }
489 // 应用颜色纹理到一组对象上,使用TextureFloatColor类型
491 const std::vector<std::string> &objects_name,
492 const rpc::MaterialParameter& parameter,
493 const rpc::TextureFloatColor& Texture) {
494 _client.ApplyColorTextureToObjects(objects_name, parameter, Texture);
495 }
496 // 获取场景中所有对象的名称列表
497 std::vector<std::string> Simulator::GetNamesOfAllObjects() const {
499 }
500
501} // namespace detail
502} // namespace client
503} // namespace carla
auto end() const noexcept
#define DEBUG_ASSERT(predicate)
Definition Debug.h:68
#define LIBCARLA_INITIALIZE_LIFETIME_PROFILER(display_name)
包含生成参与者所需的所有必要信息。
rpc::ActorDescription MakeActorDescription() const
表示模拟中的一个行为体(Actor)。
static bool FileExists(std::string file)
传感器基类,继承自Actor类。
表示客户端操作超时的异常类。
static SharedPtr< Actor > MakeActor(EpisodeProxy episode, rpc::Actor actor_description, GarbageCollectionPolicy garbage_collection_policy)
基于提供的 actor_description 创建一个参与者。episode 必须指向该参与者所在的章节(或者说区域)
SharedPtr< Actor > GetParent() const
const rpc::Actor & GetActorDescription() const
const std::string & GetDisplayId() const
提供与 CARLA 模拟器的 rpc 和流媒体服务器的通信。
const std::string GetEndpoint() const
bool IsEnabledForROS(const streaming::Token &token)
void DisableForROS(const streaming::Token &token)
bool SetFilesBaseFolder(const std::string &path)
void RequestFile(const std::string &name) const
void Send(rpc::ActorId ActorId, std::string message)
void UnSubscribeFromGBuffer(rpc::ActorId ActorId, uint32_t GBufferId)
void UnSubscribeFromStream(const streaming::Token &token)
rpc::VehicleLightStateList GetVehiclesLightStates()
返回第一个元素表示交通工具ID,第二个元素表示信号灯状态的键值对
std::vector< std::string > GetRequiredFiles(const std::string &folder="", const bool download=true) const
void LoadEpisode(std::string map_name, bool reset_settings=true, rpc::MapLayer map_layer=rpc::MapLayer::All)
uint64_t SetEpisodeSettings(const rpc::EpisodeSettings &settings)
rpc::Actor SpawnActorWithParent(const rpc::ActorDescription &description, const geom::Transform &transform, rpc::ActorId parent, rpc::AttachmentType attachment_type, const std::string &socket_name="")
void SubscribeToStream(const streaming::Token &token, std::function< void(Buffer)> callback)
std::vector< std::string > GetNamesOfAllObjects() const
void CopyOpenDriveToServer(std::string opendrive, const rpc::OpendriveGenerationParameters &params)
bool DestroyActor(rpc::ActorId actor)
std::vector< uint8_t > GetCacheFile(const std::string &name, const bool request_otherwise=true) const
void EnableForROS(const streaming::Token &token)
std::vector< rpc::ActorDefinition > GetActorDefinitions()
void SubscribeToGBuffer(rpc::ActorId ActorId, uint32_t GBufferId, std::function< void(Buffer)> callback)
void ApplyColorTextureToObjects(const std::vector< std::string > &objects_name, const rpc::MaterialParameter &parameter, const rpc::TextureColor &Texture)
rpc::EpisodeSettings GetEpisodeSettings()
rpc::Actor SpawnActor(const rpc::ActorDescription &description, const geom::Transform &transform)
持有当前剧集及当前剧集状态
Definition Episode.h:35
std::shared_ptr< const EpisodeState > GetState() const
Definition Episode.h:48
WorldSnapshot WaitForTick(time_duration timeout)
std::shared_ptr< Episode > _episode
Definition Simulator.h:903
bool ShouldUpdateMap(rpc::MapInfo &map_info)
void DisableForROS(const Sensor &sensor)
void RequestFile(const std::string &name) const
void EnableForROS(const Sensor &sensor)
void RegisterAIController(const WalkerAIController &controller)
SharedPtr< LightManager > _light_manager
Definition Simulator.h:900
SharedPtr< Actor > SpawnActor(const ActorBlueprint &blueprint, const geom::Transform &transform, Actor *parent=nullptr, rpc::AttachmentType attachment_type=rpc::AttachmentType::Rigid, GarbageCollectionPolicy gc=GarbageCollectionPolicy::Inherit, const std::string &socket_name="")
在模拟中生成一个参与者
std::vector< std::string > GetRequiredFiles(const std::string &folder="", const bool download=true) const
SharedPtr< Actor > MakeActor(rpc::Actor actor_description, GarbageCollectionPolicy gc=GarbageCollectionPolicy::Disabled)
根据现有参与者的描述创建一个参与者实例。请注意,这不会生成参与者。
Definition Simulator.h:381
bool IsEnabledForROS(const Sensor &sensor)
SharedPtr< BlueprintLibrary > GetBlueprintLibrary()
Simulator(const std::string &host, uint16_t port, size_t worker_threads=0u, bool enable_garbage_collection=false)
Definition Simulator.cpp:72
const GarbageCollectionPolicy _gc_policy
Definition Simulator.h:906
rpc::VehicleLightStateList GetVehiclesLightStates()
返回一个列表,其中第一个元素是车辆 ID,第二个元素是灯光状态
void UnSubscribeFromGBuffer(Actor &sensor, uint32_t gbuffer_id)
void SubscribeToSensor(const Sensor &sensor, std::function< void(SharedPtr< sensor::SensorData >)> callback)
void UnregisterAIController(const WalkerAIController &controller)
std::vector< uint8_t > GetCacheFile(const std::string &name, const bool request_otherwise) const
void ApplyColorTextureToObjects(const std::vector< std::string > &objects_name, const rpc::MaterialParameter &parameter, const rpc::TextureColor &Texture)
– 纹理更新操作
std::shared_ptr< WalkerNavigation > GetNavigation()
bool SetFilesBaseFolder(const std::string &path)
SharedPtr< Actor > GetSpectator()
EpisodeProxy LoadOpenDriveEpisode(std::string opendrive, const rpc::OpendriveGenerationParameters &params, bool reset_settings=true)
void SetPedestriansCrossFactor(float percentage)
void FreezeAllTrafficLights(bool frozen)
uint64_t SetEpisodeSettings(const rpc::EpisodeSettings &settings)
void UnSubscribeFromSensor(Actor &sensor)
EpisodeProxy LoadEpisode(std::string map_name, bool reset_settings=true, rpc::MapLayer map_layers=rpc::MapLayer::All)
Definition Simulator.cpp:88
uint64_t Tick(time_duration timeout)
void SubscribeToGBuffer(Actor &sensor, uint32_t gbuffer_id, std::function< void(SharedPtr< sensor::SensorData >)> callback)
std::vector< std::string > GetNamesOfAllObjects() const
SharedPtr< Map > GetCurrentMap()
rpc::EpisodeSettings GetEpisodeSettings()
Definition Simulator.h:267
bool DestroyActor(Actor &actor)
销毁指定的演员
void SetPedestriansSeed(unsigned int seed)
boost::optional< geom::Location > GetRandomLocationFromNavigation()
void Send(const Sensor &sensor, std::string message)
streaming::Token GetStreamToken() const
Definition rpc/Actor.h:59
std::string name
Definition MapInfo.h:21
Positive time duration up to milliseconds resolution.
Definition Time.h:19
static time_duration milliseconds(size_t timeout)
Definition Time.h:26
constexpr auto to_chrono() const
Definition Time.h:52
static void Tick()
执行TrafficManager的Tick操作,通常用于周期性地更新状态
static void ValidateVersions(Client &client)
Definition Simulator.cpp:37
EpisodeProxyImpl< EpisodeProxyPointerType::Weak > WeakEpisodeProxy
static bool SynchronizeFrame(uint64_t frame, const Episode &episode, time_duration timeout)
Definition Simulator.cpp:49
std::vector< std::pair< ActorId, VehicleLightState::flag_type > > VehicleLightStateList
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
void throw_exception(const std::exception &e)
Definition Carla.cpp:142
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
static void log_debug(Args &&... args)
Definition Logging.h:71
包含CARLA客户端相关类和函数的命名空间。
Seting for map generation from opendrive without additional geometry