CARLA
 
载入中...
搜索中...
未找到
ActorVariant.h
浏览该文件的文档.
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// 这是一个头文件保护,防止头文件被重复包含
7#pragma once
8// 引入Carla项目中的相关调试头文件
9#include "carla/Debug.h"// 引入Carla项目中的内存相关头文件,可能涉及智能指针等内存管理相关的功能定义
10#include "carla/Memory.h"// 引入Carla客户端中表示游戏世界里的“演员”(如车辆、行人等实体)的头文件
11#include "carla/client/Actor.h"// 引入Carla客户端中与“情节”(可以理解为一段模拟场景的过程)代理相关的头文件,
12// 可能用于和服务器交互、获取或设置情节相关的信息等操作
13#include "carla/client/detail/EpisodeProxy.h" // 引入Carla项目中远程过程调用(RPC)相关的Actor定义,用于网络通信等场景下对Actor的描述等
14#include "carla/rpc/Actor.h"
15// 如果是使用微软的编译器(MSVC),进行一些警告相关的处理
16#ifdef _MSC_VER// 保存当前的警告状态
17#pragma warning(push)// 禁用特定的警告编号4583,可能是和类模板相关的一些编译器警告
18#pragma warning(disable:4583)// 禁用特定的警告编号4582,同样可能是和类模板相关的警告
19#pragma warning(disable:4582)// 引入Boost库的variant2中的variant类型,它可以在一个变量中存储多种不同类型的值
20#include <boost/variant2/variant.hpp>// 恢复之前保存的警告状态
21#pragma warning(pop)// 如果不是微软编译器,直接引入Boost库的variant2中的variant类型
22#else
23#include <boost/variant2/variant.hpp>
24#endif
25// 定义在Carla项目的client命名空间下的detail命名空间中,表明这个类可能是用于一些内部实现细节相关的功能
26namespace carla {
27namespace client {
28namespace detail {
29
30 /// 创建一个执行者, 只在需要的时候实例化.
32 public:
33
35 : _value(actor) {}
36
39
41 _value = actor;
42 return *this;
43 }
44// 重载赋值运算符,接受指向client::Actor的智能指针(SharedPtr),将传入的智能指针赋值给内部的_value变量,
45 // 并返回当前对象的引用,用于链式赋值
47 _value = actor;
48 return *this;
49 }// 获取对应的client::Actor的智能指针,如果内部_value当前存储的是rpc::Actor类型,
50 // 则会调用MakeActor函数进行相应的转换(可能是根据RPC信息创建对应的客户端Actor实例),
51 // 最后返回指向client::Actor的智能指针,这里假设经过处理后_value中存储的是合适的client::Actor类型
52
54 if (_value.index() == 0u) {
55 MakeActor(episode);
56 }
57 DEBUG_ASSERT(_value.index() == 1u);
58 return boost::variant2::get<SharedPtr<client::Actor>>(_value);
59 }
60
61 const rpc::Actor &Serialize() const {
62 return boost::variant2::visit(Visitor(), _value);
63 }
64// 获取Actor的ID,通过先调用Serialize函数获取对应的rpc::Actor,再获取其ID属性
65 ActorId GetId() const {
66 return Serialize().id;
67 }
68// 获取Actor的父ID,同样先调用Serialize函数获取rpc::Actor,再获取其parent_id属性
70 return Serialize().parent_id;
71 }
72// 获取Actor的类型ID,通过先调用Serialize函数获取rpc::Actor,再获取其描述中的类型ID属性
73 const std::string &GetTypeId() const {
74 return Serialize().description.id;
75 }
76
77 bool operator==(ActorVariant rhs) const {
78 return GetId() == rhs.GetId();
79 }
80// 重载不等运算符,基于相等运算符的结果取反来判断两个ActorVariant对象是否不等
81 bool operator!=(ActorVariant rhs) const {
82 return !(*this == rhs);
83 }
84
85 private:// 定义一个访问者结构体(Visitor),用于在访问variant类型的_value时,根据其实际存储的类型进行相应的操作
86
87 struct Visitor {// 如果_value中存储的是rpc::Actor类型,直接返回该rpc::Actor对象
88 const rpc::Actor &operator()(const rpc::Actor &actor) const {
89 return actor;
90 }// 如果_value中存储的是指向client::Actor的智能指针类型,
91 // 则调用该智能指针所指向的client::Actor对象的Serialize函数来返回对应的rpc::Actor对象
93 return actor->Serialize();
94 }
95 };
96// 私有函数,用于将内部_value中存储的rpc::Actor类型转换为对应的client::Actor类型,
97 // 具体实现应该在对应的cpp文件中(这里只有声明),可能会根据传入的EpisodeProxy等信息来创建客户端的Actor实例
98 void MakeActor(EpisodeProxy episode) const;
99// 使用Boost的variant2::variant类型来存储不同形式的Actor,可以是rpc::Actor类型或者是指向client::Actor的智能指针类型,
100 // 并且使用mutable关键字修饰,意味着即使在const成员函数中也可以修改它的值(例如在Get函数中可能会根据情况修改它)
101 mutable boost::variant2::variant<rpc::Actor, SharedPtr<client::Actor>> _value;
102 };
103
104} // namespace detail
105} // namespace client
106} // namespace carla
#define DEBUG_ASSERT(predicate)
Definition Debug.h:68
创建一个执行者, 只在需要的时候实例化.
bool operator==(ActorVariant rhs) const
void MakeActor(EpisodeProxy episode) const
bool operator!=(ActorVariant rhs) const
const rpc::Actor & Serialize() const
ActorVariant(SharedPtr< client::Actor > actor)
boost::variant2::variant< rpc::Actor, SharedPtr< client::Actor > > _value
ActorVariant & operator=(SharedPtr< client::Actor > actor)
ActorVariant & operator=(rpc::Actor actor)
const std::string & GetTypeId() const
SharedPtr< client::Actor > Get(EpisodeProxy episode) const
ActorId parent_id
Definition rpc/Actor.h:35
ActorDescription description
Definition rpc/Actor.h:38
carla::ActorId ActorId
参与者的智能指针类型
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
boost::shared_ptr< T > SharedPtr
使用这个SharedPtr(boost::shared_ptr)以保持与boost::python的兼容性, 但未来如果可能的话,我们希望能为std::shared_ptr制作一个Python适配器。
Definition Memory.h:19
包含CARLA客户端相关类和函数的命名空间。
const rpc::Actor & operator()(const SharedPtr< const client::Actor > &actor) const
const rpc::Actor & operator()(const rpc::Actor &actor) const