CARLA
 
载入中...
搜索中...
未找到
ActorFactory.cpp
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//1
4// 这项工作受到 MIT 许可证的条款保护。
5// 请参阅<https://opensource.org/licenses/MIT>以获得副本。
6
8// 包含 "carla/client/detail/ActorFactory.h" 头文件。
9// 通常这个头文件里会定义与 Actor 工厂相关的类、函数等内容,可能用于创建游戏世界(例如 Carla 模拟器中的虚拟世界)里的各种角色(如车辆、行人等),是 carla/client/detail 模块中很重要的一部分。
10#include "carla/Logging.h"// 包含 "carla/Logging.h" 头文件,一般用于实现日志记录相关的功能,比如在程序运行过程中输出各种级别的日志信息(调试、警告、错误等),方便开发人员排查问题以及了解程序运行状态。
11#include "carla/StringUtil.h"// 包含 "carla/StringUtil.h" 头文件,大概率提供了一些字符串处理相关的工具函数,像字符串的分割、拼接、格式化等操作
12#include "carla/client/Actor.h"// 包含 "carla/client/Actor.h" 头文件,Actor 类应该是 Carla 模拟器客户端中表示游戏世界里各种角色实体(比如车辆、行人、交通信号灯等)的基类,定义了这些角色通用的一些属性和行为等基础内容。
13#include "carla/client/LaneInvasionSensor.h"// 包含 "carla/client/LaneInvasionSensor.h" 头文件,推测是用于定义检测车道入侵情况的传感器相关类,可能包含传感
14#include "carla/client/ServerSideSensor.h"// 包含 "carla/client/ServerSideSensor.h" 头文件,从名字来看,应该是与服务器端的传感器相关的类定义所在,可能涉及到服务器端对传感器数据的管理、分发等功能,与客户端的传感器交互等方面有紧密联系。
15#ifdef RSS_ENABLED
16#include "carla/rss/RssSensor.h"
17#endif// 如果定义了 RSS_ENABLED 宏(通常用于条件编译,开启或关闭特定功能模块),则包含 "carla/rss/RssSensor.h" 头文件。
18// 猜测这个头文件里定义的 RssSensor 类和某种基于 RSS(可能是具体某个领域的专业术语缩写,比如在自动驾驶安全相关场景下的一种安全机制)的传感器相关,用于实现相应的检测等功能。
19#include "carla/client/TrafficLight.h"// 包含 "carla/client/TrafficLight.h" 头文件,用于定义交通信号灯相关的类,包含交通信号灯的状态表示(如红灯、绿灯、黄灯等)、控制逻辑以及和游戏世界交互等功能相关的代码。
20#include "carla/client/TrafficSign.h"// 包含 "carla/client/TrafficSign.h" 头文件,里面应该是定义了交通标志相关的类,例如不同类型交通标志(停车标志、限速标志等)的表示、识别以及它们对游戏世界中角色的影响等相关功能代码。
21#include "carla/client/Vehicle.h"// 包含 "carla/client/Vehicle.h" 头文件,用于定义车辆相关的类,包含车辆的属性(如速度、位置、方向等)、操作(如加速、刹车、转向等)以及和其他车辆、交通设施交互等相关的代码内容。
22#include "carla/client/Walker.h"// 包含 "carla/client/Walker.h" 头文件,这里的 Walker 大概率表示行人,这个头文件定义了行人相关的类,比如行人的
23#include "carla/client/WalkerAIController.h"// 包含 "carla/client/WalkerAIController.h" 头文件,从名字看应该是用于控制行人自动行走行为的人工智能控制器相关类的
24#include "carla/client/World.h"// 包含 "carla/client/World.h" 头文件,用于定义游戏世界相关的类,包含整个虚拟世界的状态维护(如所有角色的位置、状态等)、时间推
25#include "carla/client/detail/Client.h"// 包含 "carla/client/detail/Client.h" 头文件,这里的 Client 类可能是与 Carla 模拟器客户端连接、通信等功能相关的
26
27#include <rpc/config.h>// 包含 <rpc/config.h> 头文件,可能是和远程过程调用(RPC)的配置相关,比如设置 RPC 通信的一些参数(端口号、协议等)、启用或禁用某些特性等相关的代码都可能在这个头文件所涉及的模块里定义。
28#include <rpc/rpc_error.h>// 包含 <rpc/rpc_error.h> 头文件,通常用于处理在远程过程调用过程中出现的各种错误情况,定义了错误类型、错误码以及相应的处理函数等
29
30#include <exception>// 包含 <exception> 头文件,用于处理 C++ 程序中的异常情况,提供了基本的异常类以及相关的处理机制,使得代码可以通过抛出和捕获异常来应对运行时出现的意外情况。
31
32namespace carla {// 以下是命名空间 carla 的定义,在 C++ 中命名空间用于避免不同模块或者库之间的命名冲突,将相关的类、函数、变量等都放在同
33namespace client { // 这是 carla 命名空间下的 client 子命名空间,意味着这里面的内容更具体地和 Carla 模拟器客户端相关的功能有关,例如客户端操作世界中的各种对象等功能代码一般会放在这个子命名空间下。
34namespace detail { //这是 client 子命名空间下的 detail 子命名空间,通常用于放置一些内部实现的、不希望外部直接访问的代码细节,比如一些辅助类、私有函数等,起到了信息隐藏和模块化的作用。
35
36 // 无法对 deleter 抛出异常;与 std::unique_ptr 不同,deleter
37 // (std|boost)::shared_ptr 的 deleter 即使受管指针为空也会被调用。
38 // 结构体:GarbageCollector,管理 Actor 的生命周期并处理销毁逻辑。
40 // 操作符重载:自定义 deleter 函数,用于在 shared_ptr 销毁时执行清理操作。
41 void operator()(::carla::client::Actor *ptr) const noexcept {
42 if ((ptr != nullptr) && ptr->IsAlive()) {
43 try {
44 // 销毁 Actor,释放资源
45 ptr->Destroy();
46 delete ptr;
47 } catch (const ::rpc::timeout &timeout) {
48 // 捕捉到超时错误时记录日志
49 log_error(timeout.what());
51 "timeout while trying to garbage collect Actor",
52 ptr->GetDisplayId(),
53 "actor hasn't been removed from the simulation");
54 } catch (const std::exception &e) {
55 // 捕捉到其他标准异常时记录日志并终止程序
57 "exception thrown while trying to garbage collect Actor",
58 ptr->GetDisplayId(),
59 e.what());
60 std::terminate();// 终止程序
61 } catch (...) {
62 // 捕捉到未知异常时记录日志并终止程序
64 "unknown exception thrown while trying to garbage collect an Actor :",
65 ptr->GetDisplayId());
66 std::terminate();
67 }
68 }
69 }
70 };
71
72 // 模板函数:根据传入的 Actor 初始化参数和垃圾回收策略创建 Actor 实例。
73// ActorT 是 Actor 类型的模板参数,init 是 ActorInitializer,gc 是垃圾回收策略。
74 template <typename ActorT>
77 // 启用垃圾回收时,创建并返回一个带有 GarbageCollector 的 shared_ptr
78 return SharedPtr<ActorT>{new ActorT(std::move(init)), GarbageCollector()};
79 }
80 DEBUG_ASSERT(gc == GarbageCollectionPolicy::Disabled);// 确保禁用垃圾回收
81 return SharedPtr<ActorT>{new ActorT(std::move(init))};// 否则直接返回普通的 shared_ptr
82 }
83
84 // ActorFactory 类的成员函数:创建不同类型的 Actor 实例。
85// episode: 当前场景的 EpisodeProxy,代表仿真中的当前环境。
86// description: rpc::Actor,包含 Actor 的描述信息。
87// gc: 垃圾回收策略,决定是否启用垃圾回收。
89 EpisodeProxy episode,
90 rpc::Actor description,
92 // 创建 ActorInitializer 实例,传递给具体 Actor 构造函数
93 auto init = ActorInitializer{description, episode};
94 // 判断传入的 Actor 描述信息,创建对应类型的 Actor 实例
95 if (description.description.id == "sensor.other.lane_invasion") {
96 // 创建车道入侵传感器实例
97 return MakeActorImpl<LaneInvasionSensor>(std::move(init), gc);
98#ifdef RSS_ENABLED
99 } else if (description.description.id == "sensor.other.rss") {
100 return MakeActorImpl<RssSensor>(std::move(init), gc);
101#endif
102 } else if (description.HasAStream()) {
103 // 如果描述信息表示该 Actor 是服务端传感器,创建 ServerSideSensor 实例
104 return MakeActorImpl<ServerSideSensor>(std::move(init), gc);
105 } else if (StringUtil::StartsWith(description.description.id, "vehicle.")) {
106 return MakeActorImpl<Vehicle>(std::move(init), gc);
107 } else if (StringUtil::StartsWith(description.description.id, "walker.")) {
108 return MakeActorImpl<Walker>(std::move(init), gc);
109 } else if (StringUtil::StartsWith(description.description.id, "traffic.traffic_light")) {
110 return MakeActorImpl<TrafficLight>(std::move(init), gc);
111 } else if (StringUtil::StartsWith(description.description.id, "traffic.")) {
112 return MakeActorImpl<TrafficSign>(std::move(init), gc);
113 } else if (description.description.id == "controller.ai.walker") {
114 return MakeActorImpl<WalkerAIController>(std::move(init), gc);
115 }
116 return MakeActorImpl<Actor>(std::move(init), gc);
117 }
118
119} // namespace detail
120} // namespace client
121} // namespace carla
#define DEBUG_ASSERT(predicate)
Definition Debug.h:68
包含LaneInvasionSensor类的声明,这是一个继承自ClientSideSensor的类,用于检测车辆压线。
static bool StartsWith(const Range1T &input, const Range2T &test)
Definition StringUtil.h:30
用于初始化 Actor 类。只有 ActorFactory 可以创建此对象,因此只有 ActorFactory 可以创建 Actor。
表示模拟中的一个行为体(Actor)。
static SharedPtr< Actor > MakeActor(EpisodeProxy episode, rpc::Actor actor_description, GarbageCollectionPolicy garbage_collection_policy)
基于提供的 actor_description 创建一个参与者。episode 必须指向该参与者所在的章节(或者说区域)
bool HasAStream() const
Definition rpc/Actor.h:53
ActorDescription description
Definition rpc/Actor.h:38
static auto MakeActorImpl(ActorInitializer init, GarbageCollectionPolicy gc)
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
static void log_error(Args &&... args)
Definition Logging.h:115
boost::shared_ptr< T > SharedPtr
使用这个SharedPtr(boost::shared_ptr)以保持与boost::python的兼容性, 但未来如果可能的话,我们希望能为std::shared_ptr制作一个Python适配器。
Definition Memory.h:19
static void log_critical(Args &&... args)
Definition Logging.h:130
包含CARLA客户端相关类和函数的命名空间。
void operator()(::carla::client::Actor *ptr) const noexcept