CARLA
 
载入中...
搜索中...
未找到
WalkerAIController.cpp
浏览该文件的文档.
1// Copyright (c) 2019 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
8//包含头文件
9#include "carla/client/WalkerAIController.h" // 引入 WalkerAIController 类的头文件,用于控制虚拟行人AI行为
10
11#include "carla/client/detail/Simulator.h" // 引入 Simulator 类的头文件,用于访问 Carla 仿真环境的模拟器功能
12#include "carla/client/detail/WalkerNavigation.h" // 引入 WalkerNavigation 类的头文件,用于虚拟行人的导航系统
13
14namespace carla {
15namespace client {
16
17 // 构造函数: 初始化 WalkerAIController 对象,并将初始化参数传递给父类 Actor。
18 // 该控制器用于管理 AI 行人行为,并与导航系统交互。
21
22 // 方法 Start: 启动控制器时调用,注册该 AI 控制器到模拟环境,并将行人添加到导航系统中。
23 // 在 Recast & Detour 导航系统中为行人创建路径,并禁用物理与碰撞计算。
25 // 注册 AI 控制器以启用模拟中的控制功能
26 GetEpisode().Lock()->RegisterAIController(*this);
27
28 // 获取当前控制的行人对象(如果存在)
29 auto walker = GetParent();
30 //GetParent()获取控制器控制的行人对象
31 if (walker != nullptr) {
32 // 获取当前模拟环境的导航系统
33 auto nav = GetEpisode().Lock()->GetNavigation();
34 //GetEpisode().Lock()获取当前模拟环境(Episode)的锁,确保线程安全。
35 if (nav != nullptr) {
36 // 将行人添加到导航系统中,提供行人 ID 和当前位置
37 nav->AddWalker(walker->GetId(), walker->GetLocation());
38 // 禁用行人的物理模拟与碰撞计算
39 GetEpisode().Lock()->SetActorSimulatePhysics(*walker, false);
40 GetEpisode().Lock()->SetActorCollisions(*walker, false);
41 }
42 }
43 }
44
45 // 方法 Stop: 停止控制器的工作,取消注册并从导航系统中移除行人。
46 // 此方法用于关闭控制器,解除对行人对象的管理。
48 // 取消注册该 AI 控制器
49 GetEpisode().Lock()->UnregisterAIController(*this);
50
51 // 获取当前控制的行人对象(如果存在)
52 auto walker = GetParent();
53 if (walker != nullptr) {
54 // 获取当前模拟环境的导航系统
55 auto nav = GetEpisode().Lock()->GetNavigation();
56 if (nav != nullptr) {
57 // 从导航系统中移除该行人
58 nav->RemoveWalker(walker->GetId());
59 }
60 }
61 }
62
63 // 方法 GetRandomLocation: 获取一个随机的导航位置,供 AI 行人使用。
64 // 返回值是一个可选的地点(如果导航系统可用),通常用于设置行人的随机目标位置。
65 boost::optional<geom::Location> WalkerAIController::GetRandomLocation() {
66 //GetRandomLocation()方法返回一个随机的位置,通常用于让AI行人随机选择一个目标位置。
67 auto nav = GetEpisode().Lock()->GetNavigation(); // 获取当前模拟环境的导航系统
68 if (nav != nullptr) {
69 // 从导航系统中获取一个随机的可行走位置
70 return nav->GetRandomLocation();
71 }
72 return {};
73 }
74
75 // 方法 GoToLocation: 使 AI 行人朝着指定的目标位置前进。
76 // 行人将根据导航系统规划的路径向目标位置移动。
78 // 获取当前模拟环境的导航系统
79 auto nav = GetEpisode().Lock()->GetNavigation();
80 if (nav != nullptr) {
81 // 获取控制的行人对象
82 auto walker = GetParent();
83 if (walker != nullptr) {
84 // 请求导航系统为该行人设置目标位置
85 if (!nav->SetWalkerTarget(walker->GetId(), destination)) {
86 // 如果设置目标失败,输出警告日志
87 log_warning("NAV: Failed to set request to go to ", destination.x, destination.y, destination.z);
88 }
89 } else {
90 log_warning("NAV: Failed to set request to go to ", destination.x, destination.y, destination.z, "(parent does not exist)");
91 }
92 }
93 }
94
95 // 方法 SetMaxSpeed: 设置行人的最大速度,控制行人移动的速度限制。
96 // 行人速度的最大值将影响其在导航中的运动表现。
97 void WalkerAIController::SetMaxSpeed(const float max_speed) {
98 // 获取当前模拟环境的导航系统
99 auto nav = GetEpisode().Lock()->GetNavigation();
100 if (nav != nullptr) {
101 // 获取控制的行人对象
102 auto walker = GetParent();
103 if (walker != nullptr) {
104 // 设置行人的最大速度,如果设置失败,输出警告日志
105 if (!nav->SetWalkerMaxSpeed(walker->GetId(), max_speed)) {
106 log_warning("NAV: failed to set max speed");
107 }
108 } else {
109 log_warning("NAV: failed to set max speed (parent does not exist)");
110 //// 如果设置失败,则输出警告日志
111 }
112 }
113 }
114
115} // namespace client
116} // namespace carla
用于初始化 Actor 类。只有 ActorFactory 可以创建此对象,因此只有 ActorFactory 可以创建 Actor。
表示模拟中的一个行为体(Actor)。
void SetMaxSpeed(const float max_speed)
boost::optional< geom::Location > GetRandomLocation()
void GoToLocation(const carla::geom::Location &destination)
WalkerAIController(ActorInitializer init)
SharedPtr< Actor > GetParent() const
SharedPtrType Lock() const
与 TryLock 相同,但永远不会返回 nullptr。
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
static void log_warning(Args &&... args)
Definition Logging.h:101
包含CARLA客户端相关类和函数的命名空间。