CARLA
 
载入中...
搜索中...
未找到
TrafficManagerServer.h
浏览该文件的文档.
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 * @file
8 * @brief 包含CARLA交通管理相关的头文件和定义
9 *
10 * 此文件通过#pragma once指令防止头文件被重复包含,并引入了多个CARLA项目中的关键头文件。
11 * 这些头文件涉及异常处理、客户端参与者(Actor)管理、RPC服务器通信以及交通管理模块的基础定义和常量。
12 */
13#pragma once
14 /**
15 * @brief 包含标准库中的向量容器
16 */
17#include <vector>
18 /**
19 * @brief 引入CARLA项目中的异常处理类
20 *
21 * 用于处理CARLA项目中可能出现的各种异常情况。
22 */
23#include "carla/Exception.h"
24 /**
25 * @brief 引入CARLA客户端中的参与者(Actor)管理相关类
26 *
27 * 参与者(Actor)是CARLA仿真环境中的基础元素,可以代表车辆、行人、传感器等。
28 */
29#include "carla/client/Actor.h"
30 /**
31 * @brief 引入CARLA客户端内部使用的参与者(Actor)变体类型
32 *
33 * 这是一个实现细节,用于在客户端内部灵活处理不同类型的参与者。
34 */
36 /**
37 * @brief 引入CARLA RPC服务器相关类
38 *
39 * 用于与CARLA服务器进行远程过程调用(RPC)通信。
40 */
41#include "carla/rpc/Server.h"
42 /**
43 * @brief 引入CARLA交通管理模块中的常量定义
44 *
45 * 包含交通管理模块中使用的一些常量,如速度限制、时间间隔等。
46 */
48 /**
49 * @brief 引入CARLA交通管理基础类
50 *
51 * 这是交通管理模块的核心类之一,提供了交通管理的基本功能。
52 */
54 /**
55 * @namespace carla::traffic_manager
56 * @brief carla命名空间中用于管理交通流的子命名空间。
57 */
58namespace carla {
59namespace traffic_manager {
60 /**
61 * @typedef ActorPtr
62 * @brief 定义一个智能指针类型,用于指向carla::client::Actor类型的对象。
63 */
65/**
66 * @typedef Path
67 * @brief 定义一个路径类型,使用std::vector存储cg::Location对象,表示一系列地理位置。
68 */
69using Path = std::vector<cg::Location>;
70/**
71 * @typedef Route
72 * @brief 定义一个路线类型,使用std::vector存储uint8_t类型的数据,表示一系列路线信息。
73 */
74using Route = std::vector<uint8_t>;
75
76using namespace constants::Networking;
77/**
78 * @class TrafficManagerServer
79 * @brief 交通管理服务器类,负责处理远程交通管理器的请求并应用更改到本地实例。
80 */
82public:
83
84 TrafficManagerServer(const TrafficManagerServer &) = default;/// @brief 默认拷贝构造函数
85 TrafficManagerServer(TrafficManagerServer &&) = default;/// @brief 默认移动构造函数
86
87 TrafficManagerServer &operator=(const TrafficManagerServer &) = default;/// @brief 默认拷贝赋值运算符
88 TrafficManagerServer &operator=(TrafficManagerServer &&) = default;/// @brief 默认移动赋值运算符
89
90 /**
91 * @brief 构造函数,初始化交通管理服务器实例。
92 *
93 * @param RPCPort 引用传递的RPC端口号,用于创建服务器实例并监听远程交通管理器的请求。
94 * @param tm 指向TrafficManagerBase类型的指针,用于通过远程交通管理器应用更改到本地实例。
95 */
97 uint16_t &RPCPort,///< 引用传递的RPC端口号
98 carla::traffic_manager::TrafficManagerBase* tm)///< 指向TrafficManagerBase的指针
99 : _RPCPort(RPCPort) {
100
101 uint16_t counter = 0;
102 while(counter < MIN_TRY_COUNT) {
103 try {
104
105 /// @brief 创建服务器实例
106 server = new ::rpc::server(RPCPort);
107
108 } catch(std::exception) {
109 using namespace std::chrono_literals;
110 /// @brief 捕获异常后,更新端口号并重试创建服务器实例
111 /// 在每次重试前,线程将休眠500毫秒
112 std::this_thread::sleep_for(500ms);
113 }
114
115 /// @brief 如果服务器实例创建成功
116 if(server != nullptr) {
117 break;
118 }
119 counter ++;
120 }
121
122 /// 如果服务器仍未创建,则抛出运行时异常
123 if(server == nullptr) {
124 /// @throw std::runtime_error 如果系统因绑定错误而无法创建RPC服务器,则抛出运行时异常
125 carla::throw_exception(std::runtime_error(
126 "trying to create rpc server for traffic manager; "
127 "but the system failed to create because of bind error."));
128 } else {
129 /// 如果服务器创建成功,我们将一个lambda函数绑定到名称"register_vehicle"
130 server->bind("register_vehicle", [=](std :: vector <carla::rpc::Actor> _actor_list) {
131 std::vector<ActorPtr> actor_list;
132 for (auto &&actor : _actor_list) {
133 /// 将rpc::Actor转换为ActorPtr,并添加到actor_list中
134 actor_list.emplace_back(carla::client::detail::ActorVariant(actor).Get(tm->GetEpisodeProxy()));
135 }/// 在交通管理器中注册车辆
136 tm->RegisterVehicles(actor_list);
137 });
138
139
140 /// 绑定一个lambda函数到名称"unregister_vehicle"
141 server->bind("unregister_vehicle", [=](std :: vector <carla::rpc::Actor> _actor_list) {
142 std::vector<ActorPtr> actor_list;
143 for (auto &&actor : _actor_list) {
144 /// 将rpc::Actor转换为ActorPtr,并添加到actor_list中
145 actor_list.emplace_back(carla::client::detail::ActorVariant(actor).Get(tm->GetEpisodeProxy()));
146 } /// 在交通管理器中注销车辆
147 tm->UnregisterVehicles(actor_list);
148 });
149
150 /// 设置车辆相对于限速的速度降低百分比的方法
151 /// 如果小于0,则表示百分比增加
152 server->bind("set_percentage_speed_difference", [=](carla::rpc::Actor actor, const float percentage) {
153 /// 设置车辆的百分比速度差异
155 });
156
157 /// 设置从中心线偏移的车道位移的方法
158 /// 正值表示向右偏移,负值表示向左偏移
159 server->bind("set_lane_offset", [=](carla::rpc::Actor actor, const float offset) {
160 /// 设置车辆的车道偏移量
162 });
163
164 /// 设置车辆的精确期望速度的方法
165 server->bind("set_desired_speed", [=](carla::rpc::Actor actor, const float value) {
166 /// 设置车辆的期望速度
168 });
169
170 /// 设置车辆灯光自动管理的方法
171 server->bind("update_vehicle_lights", [=](carla::rpc::Actor actor, const bool do_update) {
172 /// 设置是否更新车辆灯光
174 });
175
176 /// 设置全局相对于限速的速度降低百分比的方法
177 /// 如果小于0,则表示百分比增加
178 /// @param percentage 速度降低的百分比(负值表示增加)
179 server->bind("set_global_percentage_speed_difference", [=](const float percentage) {
180 /// 调用交通管理器的SetGlobalPercentageSpeedDifference方法来设置全局速度差异百分比
182 });
183
184 /// 设置全局从中心线偏移的车道位移的方法
185 /// 正值表示向右偏移,负值表示向左偏移
186 /// @param offset 车道偏移量
187 server->bind("set_global_lane_offset", [=](const float offset) {
188 /// 调用交通管理器的SetGlobalLaneOffset方法来设置全局车道偏移量
189 tm->SetGlobalLaneOffset(offset);
190 });
191
192
193 /// 设置车辆间碰撞检测规则的方法
194 /// @param reference_actor 参考车辆(用于检测碰撞的基准车辆)
195 /// @param other_actor 另一车辆(与参考车辆进行碰撞检测的车辆)
196 /// @param detect_collision 是否检测碰撞(true表示检测,false表示不检测)
197 server->bind("set_collision_detection", [=](const carla::rpc::Actor &reference_actor, const carla::rpc::Actor &other_actor, const bool detect_collision) {
198 /// 将rpc::Actor转换为ActorPtr类型
199 const auto reference = carla::client::detail::ActorVariant(reference_actor).Get(tm->GetEpisodeProxy());
200 const auto other = carla::client::detail::ActorVariant(other_actor).Get(tm->GetEpisodeProxy());
201 /// 调用交通管理器的SetCollisionDetection方法来设置碰撞检测规则
202 tm->SetCollisionDetection(reference, other, detect_collision);
203 });
204
205 /// 强制车辆换道的方法
206 /// @param actor 需要强制换道的车辆
207 /// @param direction 换道方向(true表示向左,false表示向右)
208 server->bind("set_force_lane_change", [=](carla::rpc::Actor actor, const bool direction) {
209 /// 将rpc::Actor转换为ActorPtr类型,并调用交通管理器的SetForceLaneChange方法来强制车辆换道
211 });
212
213 /// 启用/禁用车辆的自动换道功能
214 /// @param actor 需要设置自动换道功能的车辆
215 /// @param enable 是否启用自动换道(true表示启用,false表示禁用)
216 server->bind("set_auto_lane_change", [=](carla::rpc::Actor actor, const bool enable) {
217 /// 将rpc::Actor转换为ActorPtr类型,并调用交通管理器的SetAutoLaneChange方法来启用或禁用自动换道功能
219 });
220
221 /// 设置车辆应保持与前车距离的方法
222 /// @param actor 需要设置距离的车辆
223 /// @param distance 应保持的距离
224 server->bind("set_distance_to_leading_vehicle", [=](carla::rpc::Actor actor, const float distance) {
225 /// 将rpc::Actor转换为ActorPtr类型,并调用交通管理器的SetDistanceToLeadingVehicle方法来设置与前车的距离
227 });
228
229 /// 设置全局车辆应保持与前车距离的方法
230 /// @param distance 全局应保持的距离
231 server->bind("set_global_distance_to_leading_vehicle", [=]( const float distance) {
232 /// 调用交通管理器的SetGlobalDistanceToLeadingVehicle方法来设置全局与前车的距离
234 });
235
236 /// 设置交通灯运行概率的方法
237 /// @param actor CARLA中的Actor对象
238 /// @param percentage 交通灯运行的概率(百分比)
239 server->bind("set_percentage_running_light", [=](carla::rpc::Actor actor, const float percentage) {
241 });
242
243 /// 设置交通标志运行概率的方法
244 /// @param actor CARLA中的Actor对象
245 /// @param percentage 交通标志运行的概率(百分比)
246 server->bind("set_percentage_running_sign", [=](carla::rpc::Actor actor, const float percentage) {
248 });
249 /// 设置忽略行人碰撞概率的方法
250 /// @param actor CARLA中的Actor对象
251 /// @param percentage 忽略行人碰撞的概率(百分比)
252 server->bind("set_percentage_ignore_walkers", [=](carla::rpc::Actor actor, const float percentage) {
254 });
255
256 /// 设置忽略车辆碰撞概率的方法
257 /// @param actor CARLA中的Actor对象
258 /// @param percentage 忽略车辆碰撞的概率(百分比)
259 server->bind("set_percentage_ignore_vehicles", [=](carla::rpc::Actor actor, const float percentage) {
261 });
262
263 /// 设置保持在右侧车道行驶概率的方法
264 /// @param actor CARLA中的Actor对象
265 /// @param percentage 保持在右侧车道行驶的概率(百分比)
266 server->bind("set_percentage_keep_right_rule", [=](carla::rpc::Actor actor, const float percentage) {
268 });
269
270 /// 设置随机进行左车道变换概率的方法
271 /// @param actor CARLA中的Actor对象
272 /// @param percentage 随机进行左车道变换的概率(百分比)
273 server->bind("set_percentage_random_left_lanechange", [=](carla::rpc::Actor actor, const float percentage) {
275 });
276
277 /// 设置随机进行右车道变换概率的方法
278 /// @param actor CARLA中的Actor对象
279 /// @param percentage 随机进行右车道变换的概率(百分比)
280 server->bind("set_percentage_random_right_lanechange", [=](carla::rpc::Actor actor, const float percentage) {
282 });
283
284 /// 设置混合物理模式的方法
285 /// @param mode_switch 是否开启混合物理模式
286 server->bind("set_hybrid_physics_mode", [=](const bool mode_switch) {
287 tm->SetHybridPhysicsMode(mode_switch);
288 });
289
290 /// 设置混合物理半径的方法
291 /// @param radius 混合物理的半径
292 server->bind("set_hybrid_physics_radius", [=](const float radius) {
293 tm->SetHybridPhysicsRadius(radius);
294 });
295
296 /// 设置OSM(OpenStreetMap)模式的方法
297 /// @param mode_switch 是否开启OSM模式
298 server->bind("set_osm_mode", [=](const bool mode_switch) {
299 tm->SetOSMMode(mode_switch);
300 });
301
302 /// 设置自定义路径的方法
303 /// @param actor CARLA中的Actor对象
304 /// @param path 自定义的路径
305 /// @param empty_buffer 是否清空缓冲区
306 server->bind("set_path", [=](carla::rpc::Actor actor, const Path path, const bool empty_buffer) {
307 tm->SetCustomPath(carla::client::detail::ActorVariant(actor).Get(tm->GetEpisodeProxy()), path, empty_buffer);
308 });
309
310 /// 移除指定的一系列点的方法
311 /// @param server 用于绑定方法的服务器对象
312 /// @param actor_id 需要移除路径的Actor的ID
313 /// @param remove_path 一个布尔值,指示是否移除路径
314 server->bind("remove_custom_path", [=](const ActorId actor_id, const bool remove_path) {
315 tm->RemoveUploadPath(actor_id, remove_path);
316 });
317
318 /// 更新已经设置的一系列点的方法
319 /// @param server 用于绑定方法的服务器对象
320 /// @param actor_id 需要更新路径的Actor的ID
321 /// @param path 新的路径数据
322 server->bind("update_custom_path", [=](const ActorId actor_id, const Path path) {
323 tm->UpdateUploadPath(actor_id, path);
324 });
325
326 /// 设置我们自己的导入路线的方法
327 /// @param server 用于绑定方法的服务器对象
328 /// @param actor 包含路线信息的Actor对象
329 /// @param route 需要设置的路线数据
330 /// @param empty_buffer 一个布尔值,指示是否清空缓冲区
331 server->bind("set_imported_route", [=](carla::rpc::Actor actor, const Route route, const bool empty_buffer) {
332 tm->SetImportedRoute(carla::client::detail::ActorVariant(actor).Get(tm->GetEpisodeProxy()), route, empty_buffer);
333 });
334
335 /// 移除指定路线的方法
336 /// @param server 用于绑定方法的服务器对象
337 /// @param actor_id 需要移除路线的Actor的ID
338 /// @param remove_path 一个布尔值,指示是否移除路径
339 server->bind("remove_imported_route", [=](const ActorId actor_id, const bool remove_path) {
340 tm->RemoveImportedRoute(actor_id, remove_path);
341 });
342
343 /// 更新已经设置的路线的方法
344 /// @param server 用于绑定方法的服务器对象
345 /// @param actor_id 需要更新路线的Actor的ID
346 /// @param route 新的路线数据
347 server->bind("update_imported_route", [=](const ActorId actor_id, const Route route) {
348 tm->UpdateImportedRoute(actor_id, route);
349 });
350
351 /// 设置重生休眠车辆模式的方法。
352 /// @param server 用于绑定方法的服务器对象。
353 /// @param mode_switch 一个布尔值,指示是否开启重生休眠车辆模式
354 server->bind("set_respawn_dormant_vehicles", [=](const bool mode_switch) {
355 tm->SetRespawnDormantVehicles(mode_switch);
356 });
357
358 /// 设置重生休眠车辆的边界范围的方法
359 /// @param server 用于绑定方法的服务器对象
360 /// @param lower_bound 重生休眠车辆的下边界值
361 /// @param upper_bound 重生休眠车辆的上边界值
362 server->bind("set_boundaries_respawn_dormant_vehicles", [=](const float lower_bound, const float upper_bound) {
363 tm->SetBoundariesRespawnDormantVehicles(lower_bound, upper_bound);
364 });
365
366 /// 获取车辆下一个动作的方法
367 /// @param actor_id 需要获取动作的车辆Actor的ID
368 server->bind("get_next_action", [=](const ActorId actor_id) {
369 tm->GetNextAction(actor_id);
370 });
371
372 /// 获取车辆动作缓冲区的方法
373 /// @param actor_id 需要获取动作缓冲区的车辆Actor的ID
374 server->bind("get_all_actions", [=](const ActorId actor_id) {
375 tm->GetActionBuffer(actor_id);
376 });
377 /// 关闭服务器的方法
378 server->bind("shut_down", [=]() {
379 tm->Release();
380 });
381
382 /// 设置同步模式的方法
383 /// @param mode 一个布尔值,指示是否开启同步模式
384 server->bind("set_synchronous_mode", [=](const bool mode) {
385 tm->SetSynchronousMode(mode);
386 });
387
388 /// 设置同步执行时的超时时间(以毫秒为单位)
389 /// @param time 同步模式的超时时间,单位为毫秒
390 server->bind("set_synchronous_mode_timeout_in_milisecond", [=](const double time) {
392 });
393
394 /// 设置随机化种子的方法
395 /// @param seed 用于随机化过程的种子值
396 server->bind("set_random_device_seed", [=](const uint64_t seed) {
397 tm->SetRandomDeviceSeed(seed);
398 });
399
400 /// 提供同步时钟的方法
401 /// @return 一个布尔值,指示同步时钟是否成功
402 server->bind("synchronous_tick", [=]() -> bool {
403 return tm->SynchronousTick();
404 });
405
406 /// 检查服务器是否正在运行的方法
407 server->bind("health_check_remote_TM", [=](){});
408
409 /// 以异步模式运行交通管理器服务器,以响应任何用户客户端的请求
410 server->async_run();
411 }
412
413 }
414 /**
415 * @brief 析构函数,释放交通管理器服务器资源
416 */
418 if(server) {
419 server->stop();
420 delete server;
421 server = nullptr;
422 }
423 }
424 /**
425 * @brief 获取交通管理器服务器的RPC端口号
426 * @return RPC端口号
427 */
428 uint16_t port() const {
429 return _RPCPort;
430 }
431
432private:
433
434 /// 交通管理器服务器的RPC端口号
435 uint16_t _RPCPort;
436
437 /// 服务器实例指针
438 ::rpc::server *server = nullptr;
439
440};
441
442} // namespace traffic_manager
443} // namespace carla
创建一个执行者, 只在需要的时候实例化.
SharedPtr< client::Actor > Get(EpisodeProxy episode) const
virtual void SetRandomDeviceSeed(const uint64_t seed)=0
设置随机化种子。
virtual void SetRandomLeftLaneChangePercentage(const ActorPtr &actor, const float percentage)=0
设置随机左变道的百分比。
virtual void SetBoundariesRespawnDormantVehicles(const float lower_bound, const float upper_bound)=0
设置重生车辆的范围。
virtual void SetPercentageIgnoreWalkers(const ActorPtr &actor, const float perc)=0
设置车辆忽略行人的碰撞概率。
virtual void SetPercentageRunningSign(const ActorPtr &actor, const float perc)=0
设置车辆无视交通标志的概率。
virtual void SetPercentageSpeedDifference(const ActorPtr &actor, const float percentage)=0
设置车辆相对于限速的速度百分比降低。 如果小于0,则表示百分比增加。
virtual carla::client::detail::EpisodeProxy & GetEpisodeProxy()=0
获取CARLA场景信息代理。
virtual void Release()=0
释放交通管理器。
virtual void UpdateImportedRoute(const ActorId &actor_id, const Route route)=0
更新已设置的路线。
virtual bool SynchronousTick()=0
提供同步Tick。
virtual void SetGlobalLaneOffset(float const offset)=0
设置全局相对于中心线的车道偏移量。 正值表示向右偏移,负值表示向左偏移。
virtual void SetAutoLaneChange(const ActorPtr &actor, const bool enable)=0
启用/禁用车辆的自动换道。
virtual void SetCollisionDetection(const ActorPtr &reference_actor, const ActorPtr &other_actor, const bool detect_collision)=0
设置车辆之间的碰撞检测规则。
virtual void RegisterVehicles(const std::vector< ActorPtr > &actor_list)=0
此方法向交通管理器注册车辆。
virtual void SetOSMMode(const bool mode_switch)=0
设置Open Street Map模式。
virtual void SetPercentageIgnoreVehicles(const ActorPtr &actor, const float perc)=0
设置车辆忽略其他车辆的碰撞概率。
virtual Action GetNextAction(const ActorId &actor_id)=0
获取车辆的下一个动作。
virtual void SetHybridPhysicsRadius(const float radius)=0
设置混合物理半径。
virtual void SetForceLaneChange(const ActorPtr &actor, const bool direction)=0
强制车辆换道。
virtual void SetKeepRightPercentage(const ActorPtr &actor, const float percentage)=0
设置保持在右车道的百分比。
virtual void SetSynchronousMode(bool mode)=0
将交通管理器切换到同步执行模式。
virtual ActionBuffer GetActionBuffer(const ActorId &actor_id)=0
获取车辆的动作缓冲区。
virtual void SetLaneOffset(const ActorPtr &actor, const float offset)=0
设置车辆相对于中心线的车道偏移量。 正值表示向右偏移,负值表示向左偏移。
virtual void SetRandomRightLaneChangePercentage(const ActorPtr &actor, const float percentage)=0
设置随机右变道的百分比。
virtual void SetSynchronousModeTimeOutInMiliSecond(double time)=0
设置同步执行模式的Tick超时时间。
virtual void SetRespawnDormantVehicles(const bool mode_switch)=0
设置休眠车辆的自动重生。
virtual void RemoveImportedRoute(const ActorId &actor_id, const bool remove_path)=0
移除路线。
virtual void SetHybridPhysicsMode(const bool mode_switch)=0
设置混合物理模式。
virtual void SetCustomPath(const ActorPtr &actor, const Path path, const bool empty_buffer)=0
设置自定义导入路径。
virtual void RemoveUploadPath(const ActorId &actor_id, const bool remove_path)=0
移除路径。
virtual void SetDesiredSpeed(const ActorPtr &actor, const float value)=0
设置车辆的精确期望速度。
virtual void SetUpdateVehicleLights(const ActorPtr &actor, const bool do_update)=0
设置车辆灯光的自动管理。
virtual void SetPercentageRunningLight(const ActorPtr &actor, const float perc)=0
设置车辆闯红灯的概率。
virtual void UnregisterVehicles(const std::vector< ActorPtr > &actor_list)=0
此方法从交通管理器注销车辆。
virtual void SetDistanceToLeadingVehicle(const ActorPtr &actor, const float distance)=0
设置车辆与前车应保持的距离。
virtual void SetGlobalDistanceToLeadingVehicle(const float dist)=0
设置全局前车距离。
virtual void UpdateUploadPath(const ActorId &actor_id, const Path path)=0
更新已设置的路径。
virtual void SetImportedRoute(const ActorPtr &actor, const Route route, const bool empty_buffer)=0
设置自定义导入路线。
virtual void SetGlobalPercentageSpeedDifference(float const percentage)=0
设置全局相对于限速的速度百分比降低。 如果小于0,则表示百分比增加。
交通管理服务器类,负责处理远程交通管理器的请求并应用更改到本地实例。
uint16_t _RPCPort
交通管理器服务器的RPC端口号
uint16_t port() const
获取交通管理器服务器的RPC端口号
~TrafficManagerServer()
析构函数,释放交通管理器服务器资源
TrafficManagerServer & operator=(TrafficManagerServer &&)=default
默认拷贝赋值运算符
TrafficManagerServer & operator=(const TrafficManagerServer &)=default
默认移动构造函数
::rpc::server * server
服务器实例指针
TrafficManagerServer(uint16_t &RPCPort, carla::traffic_manager::TrafficManagerBase *tm)
默认移动赋值运算符
TrafficManagerServer(const TrafficManagerServer &)=default
TrafficManagerServer(TrafficManagerServer &&)=default
默认拷贝构造函数
carla::SharedPtr< cc::Actor > ActorPtr
使用别名简化代码中的命名
std::vector< uint8_t > Route
路线类型,由一系列地理位置组成
std::vector< cg::Location > Path
参与者的唯一标识符类型
carla::ActorId ActorId
参与者的智能指针类型
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
void throw_exception(const std::exception &e)
Definition Carla.cpp:142
boost::shared_ptr< T > SharedPtr
使用这个SharedPtr(boost::shared_ptr)以保持与boost::python的兼容性, 但未来如果可能的话,我们希望能为std::shared_ptr制作一个Python适配器。
Definition Memory.h:19