CARLA
 
载入中...
搜索中...
未找到
LibCarla/source/carla/rss/RssSensor.cpp
浏览该文件的文档.
1// Copyright (c) 2019-2020 Intel Corporation
2//
3// This work is licensed under the terms of the MIT license.
4// For a copy, see <https://opensource.org/licenses/MIT>.
5
6#include "carla/rss/RssSensor.h" // 包含RssSensor的头文件
7
8#include <ad/map/access/Operation.hpp> // 包含地图操作的头文件
9#include <ad/rss/state/ProperResponse.hpp> // 包含适当响应的状态头文件
10#include <ad/rss/world/Velocity.hpp> // 包含速度的头文件
11#include <exception> // 包含异常处理头文件
12#include <fstream> // 包含文件流头文件
13
14#include "carla/Logging.h" // 包含日志记录的头文件
15#include "carla/client/Map.h" // 包含地图客户端的头文件
16#include "carla/client/Sensor.h" // 包含传感器客户端的头文件
17#include "carla/client/Vehicle.h" // 包含车辆客户端的头文件
18#include "carla/client/detail/Simulator.h" // 包含模拟器的细节头文件
19#include "carla/rss/RssCheck.h" // 包含Rss检查的头文件
20#include "carla/sensor/data/RssResponse.h" // 包含Rss响应数据的头文件
21
22namespace carla {
23namespace client {
24
25std::atomic_uint RssSensor::_global_map_initialization_counter_{0u}; // 全局地图初始化计数器
26
27RssSensor::RssSensor(ActorInitializer init) : Sensor(std::move(init)), _on_tick_register_id(0u), _drop_route(false) {} // 构造函数,初始化传感器
28
29RssSensor::~RssSensor() { // 析构函数
30 if (IsListening()) { // 如果正在监听
31 Stop(); // 停止监听
32 }
33}
34
36 if (IsListening()) { // 如果已经在监听
37 log_error(GetDisplayId(), ": registering of the actor constellation callback has to be done before start listening. Register has no effect."); // 记录错误
38 return; // 返回
39 }
40 _rss_actor_constellation_callback = callback; // 设置回调
41}
42
43void RssSensor::Listen(CallbackFunctionType callback) { // 开始监听
44 if (IsListening()) { // 如果已经在监听
45 log_error(GetDisplayId(), ": already listening"); // 记录错误
46 return; // 返回
47 }
48
49 if (GetParent() == nullptr) { // 如果父级为nullptr
50 throw_exception(std::runtime_error(GetDisplayId() + ": not attached to actor")); // 抛出异常
51 return; // 返回
52 }
53
54 auto vehicle = boost::dynamic_pointer_cast<carla::client::Vehicle>(GetParent()); // 动态转换父级为车辆
55 if (vehicle == nullptr) { // 如果转换失败
56 throw_exception(std::runtime_error(GetDisplayId() + ": parent is not a vehicle")); // 抛出异常
57 return; // 返回
58 }
59
60 float max_steer_angle_deg = 0.f; // 最大转向角度初始化
61 for (auto const &wheel : vehicle->GetPhysicsControl().GetWheels()) { // 遍历车辆轮子
62 max_steer_angle_deg = std::max(max_steer_angle_deg, wheel.max_steer_angle); // 更新最大转向角度
63 }
64 auto max_steering_angle = max_steer_angle_deg * static_cast<float>(M_PI) / 180.0f; // 转换为弧度
65
66 auto map = GetWorld().GetMap(); // 获取地图
67 DEBUG_ASSERT(map != nullptr); // 确保地图不为nullptr
68 std::string const open_drive_content = map->GetOpenDrive(); // 获取OpenDrive内容
69
70 auto mapInitializationResult = ::ad::map::access::initFromOpenDriveContent( // 初始化地图
71 open_drive_content, 0.2, ::ad::map::intersection::IntersectionType::TrafficLight, // 设置参数
72 ::ad::map::landmark::TrafficLightType::LEFT_STRAIGHT_RED_YELLOW_GREEN); // 设置交通灯类型
73
74 if (!mapInitializationResult) { // 如果地图初始化失败
75 log_error(GetDisplayId(), ": Initialization of map failed"); // 记录错误
76 return; // 返回
77 }
78
79 _global_map_initialization_counter_++; // 增加地图初始化计数器
80
81 if (_rss_actor_constellation_callback == nullptr) { // 如果没有回调
82 _rss_check = std::make_shared<::carla::rss::RssCheck>(max_steering_angle); // 创建Rss检查实例
83 } else { // 如果有回调
84 _rss_check = std::make_shared<::carla::rss::RssCheck>(max_steering_angle, _rss_actor_constellation_callback, GetParent()); // 创建Rss检查实例,传入回调
85 }
86
87 auto self = boost::static_pointer_cast<RssSensor>(shared_from_this()); // 获取自身的共享指针
88
89 _last_processed_frame=0u; // 初始化最后处理帧
90 log_debug(GetDisplayId(), ": subscribing to tick event"); // 记录调试信息
91 _on_tick_register_id = GetEpisode().Lock()->RegisterOnTickEvent( // 注册tick事件
92 [ cb = std::move(callback), weak_self = WeakPtr<RssSensor>(self) ](const auto &snapshot) { // Lambda函数处理事件
93 auto self = weak_self.lock(); // 锁定弱指针
94 if (self != nullptr) { // 如果锁定成功
95 self->TickRssSensor(snapshot.GetTimestamp(), cb); // 调用TickRssSensor
96 }
97 });
98}
99
100void RssSensor::Stop() { // 停止监听
101 if (!IsListening()) { // 如果不在监听
102 log_error(GetDisplayId(), ": not listening at all"); // 记录错误
103 return; // 返回
104 }
105
106 log_debug(GetDisplayId(), ": unsubscribing from tick event");// 记录调试信息,表示取消订阅tick事件
107 GetEpisode().Lock()->RemoveOnTickEvent(_on_tick_register_id);// 从事件管理器中移除tick事件的注册ID
108 _on_tick_register_id = 0u;// 重置tick事件的注册ID
109
110 if ( bool(_rss_check) ) {// 检查_rss_check对象是否有效
111 _rss_check->GetLogger()->info("RssSensor stopping");// 记录信息,表示RssSensor正在停止
112 }
113 // 不要移除花括号,因为它们保护了lock_guard
114 {
115 // 确保在删除_rss_check对象时没有正在处理的任务
116 const std::lock_guard<std::mutex> lock(_processing_lock);// 加锁以防止并发访问
117
118 if ( bool(_rss_check) ) {// 检查_rss_check对象是否有效
119 _rss_check->GetLogger()->info("RssSensor delete checker");// 记录信息,表示正在删除检查器
120 }
121 _rss_check.reset();// 重置_rss_check对象,释放资源
122 auto const map_initialization_counter_value = _global_map_initialization_counter_--;// 减少全局地图初始化计数器
123 if (map_initialization_counter_value == 0u) {// 如果计数器变为0
124 // 最后一个停止监听的,清理地图
125 ::ad::map::access::cleanup();// 清理地图资源
126 }
127 }
128}
129
130void RssSensor::SetLogLevel(const uint8_t &log_level) {// 设置日志级别的函数
131 if (!bool(_rss_check)) {// 检查_rss_check对象是否有效
132 log_error(GetDisplayId(), ": not yet listening. SetLogLevel has no effect.");// 记录错误,表示尚未开始监听
133 return;// 直接返回
134 }
135
136 if (log_level < spdlog::level::n_levels) {// 检查日志级别是否在有效范围内
137 _rss_check->SetLogLevel(spdlog::level::level_enum(log_level));// 设置_rss_check的日志级别
138 }
139}
140
141void RssSensor::SetMapLogLevel(const uint8_t &map_log_level) {// 设置地图日志级别的函数
142 if (!bool(_rss_check)) {// 检查_rss_check对象是否有效
143 log_error(GetDisplayId(), ": not yet listening. SetMapLogLevel has no effect.");// 记录错误,表示尚未开始监听
144 return;// 直接返回
145 }
146
147 if (map_log_level < spdlog::level::n_levels) {// 检查地图日志级别是否在有效范围内
148 _rss_check->SetMapLogLevel(spdlog::level::level_enum(map_log_level));// 设置_rss_check的地图日志级别
149 }
150}
151
152const ::ad::rss::world::RssDynamics &RssSensor::GetEgoVehicleDynamics() const {// 获取自车动态的函数
153 static auto default_vehicle_dynamics = rss::RssCheck::GetDefaultVehicleDynamics();// 获取默认的车辆动态
154 if (!bool(_rss_check)) {// 检查_rss_check对象是否有效
155 log_error(GetDisplayId(), ": not yet listening. GetEgoVehicleDynamics has no effect.");// 记录错误,表示尚未开始监听
156 return default_vehicle_dynamics;// 返回默认的车辆动态
157 }
158
159 if (bool(_rss_actor_constellation_callback)) {// 检查是否注册了参与者星座回调
160 log_error(GetDisplayId(), ": Actor constellation callback registered. GetEgoVehicleDynamics has no effect.");// 记录错误,表示回调已注册
161 return default_vehicle_dynamics;// 返回默认的车辆动态
162 }
163
164 return _rss_check->GetDefaultActorConstellationCallbackEgoVehicleDynamics();// 返回自车动态
165}
166
167void RssSensor::SetEgoVehicleDynamics(const ::ad::rss::world::RssDynamics &ego_dynamics) {// 设置自车动态的函数
168 if (!bool(_rss_check)) {// 检查_rss_check对象是否有效
169 log_error(GetDisplayId(), ": not yet listening. SetEgoVehicleDynamics has no effect.");// 记录错误,表示尚未开始监听
170 return;// 直接返回
171 }
172
173 if (bool(_rss_actor_constellation_callback)) {// 检查是否注册了参与者星座回调
174 log_error(GetDisplayId(), ": Actor constellation callback registered. SetEgoVehicleDynamics has no effect.");// 记录错误,表示回调已注册
175 return;// 直接返回
176 }
177
178 _rss_check->SetDefaultActorConstellationCallbackEgoVehicleDynamics(ego_dynamics);// 设置自车动态
179}
180
181const ::ad::rss::world::RssDynamics &RssSensor::GetOtherVehicleDynamics() const {// 获取其他车辆动态的函数
182 static auto default_vehicle_dynamics = rss::RssCheck::GetDefaultVehicleDynamics();// 获取默认的车辆动态
183 if (!bool(_rss_check)) {// 检查_rss_check对象是否有效
184 log_error(GetDisplayId(), ": not yet listening. GetOtherVehicleDynamics has no effect.");// 记录错误,表示尚未开始监听
185 return default_vehicle_dynamics;// 返回默认的车辆动态
186 }
187
188 if (bool(_rss_actor_constellation_callback)) {// 检查是否注册了参与者星座回调
189 log_error(GetDisplayId(), ": Actor constellation callback registered. GetOtherVehicleDynamics has no effect.");// 记录错误,表示回调已注册
190 return default_vehicle_dynamics;// 返回默认的车辆动态
191 }
192
193 return _rss_check->GetDefaultActorConstellationCallbackOtherVehicleDynamics();// 返回其他车辆动态
194}
195
196void RssSensor::SetOtherVehicleDynamics(const ::ad::rss::world::RssDynamics &other_vehicle_dynamics) { // 设置其他车辆动态的函数
197 if (!bool(_rss_check)) {// 检查_rss_check对象是否有效
198 log_error(GetDisplayId(), ": not yet listening. SetOtherVehicleDynamics has no effect.");// 记录错误,表示尚未开始监听
199 return;// 直接返回
200 }
201
202 if (bool(_rss_actor_constellation_callback)) {// 检查是否注册了参与者星座回调
203 log_error(GetDisplayId(), ": Actor constellation callback registered. SetOtherVehicleDynamics has no effect.");// 记录错误,表示回调已注册
204 return;// 直接返回
205 }
206
207 _rss_check->SetDefaultActorConstellationCallbackOtherVehicleDynamics(other_vehicle_dynamics);// 设置其他车辆动态
208}
209
210const ::ad::rss::world::RssDynamics &RssSensor::GetPedestrianDynamics() const {// 获取行人动态的函数
211 static auto default_pedestrian_dynamics = rss::RssCheck::GetDefaultPedestrianDynamics();// 获取默认的行人动态
212 if (!bool(_rss_check)) {// 检查_rss_check对象是否有效
213 log_error(GetDisplayId(), ": not yet listening. GetPedestrianDynamics has no effect.");// 记录错误,表示尚未开始监听
214 return default_pedestrian_dynamics;// 返回默认的行人动态
215 }
216
217 if (bool(_rss_actor_constellation_callback)) {// 如果已注册参与者星座回调
218 log_error(GetDisplayId(), ": Actor constellation callback registered. GetPedestrianDynamics has no effect.");// 记录错误信息:参与者星座回调已注册,GetPedestrianDynamics没有效果
219 return default_pedestrian_dynamics;// 返回默认的行人动态
220 }
221
222 return _rss_check->GetDefaultActorConstellationCallbackPedestrianDynamics();// 返回默认的参与者星座回调行人动态
223}
224
225void RssSensor::SetPedestrianDynamics(const ::ad::rss::world::RssDynamics &pedestrian_dynamics) {// 设置行人动态
226 if (!bool(_rss_check)) {// 如果还没有开始监听
227 log_error(GetDisplayId(), ": not yet listening. SetPedestrianDynamics has no effect."); // 记录错误信息:尚未监听,SetPedestrianDynamics没有效果
228 return;// 返回
229 }
230
231 if (bool(_rss_actor_constellation_callback)) {// 如果已注册参与者星座回调
232 log_error(GetDisplayId(), ": Actor constellation callback registered. SetPedestrianDynamics has no effect.");// 记录错误信息:参与者星座回调已注册,SetPedestrianDynamics没有效果
233 return;// 返回
234 }
235
236 _rss_check->SetDefaultActorConstellationCallbackPedestrianDynamics(pedestrian_dynamics);// 设置默认的参与者星座回调行人动态
237}
238
239const ::carla::rss::RoadBoundariesMode &RssSensor::GetRoadBoundariesMode() const {// 获取道路边界模式
240 if (!bool(_rss_check)) { // 如果还没有开始监听
241 log_error(GetDisplayId(), ": not yet listening. GetRoadBoundariesMode has no effect.");// 记录错误信息:尚未监听,GetRoadBoundariesMode没有效果
242 static auto default_road_boundaries_mode = rss::RssCheck::GetDefaultRoadBoundariesMode();// 获取默认道路边界模式
243 return default_road_boundaries_mode;// 返回默认道路边界模式
244 }
245
246 return _rss_check->GetRoadBoundariesMode();// 返回道路边界模式
247}
248
249void RssSensor::SetRoadBoundariesMode(const ::carla::rss::RoadBoundariesMode &road_boundaries_mode) {// 设置道路边界模式
250 if (!bool(_rss_check)) {// 如果还没有开始监听
251 log_error(GetDisplayId(), ": not yet listening. SetRoadBoundariesMode has no effect.");// 记录错误信息:尚未监听,SetRoadBoundariesMode没有效果
252 return;
253 }
254
255 _rss_check->SetRoadBoundariesMode(road_boundaries_mode);// 返回道路边界模式
256}
257
258void RssSensor::AppendRoutingTarget(const ::carla::geom::Transform &routing_target) {// 添加路由目标
259 if (!bool(_rss_check)) {// 如果还没有开始监听
260 log_error(GetDisplayId(), ": not yet listening. AppendRoutingTarget has no effect.");// 记录错误信息:尚未监听,AppendRoutingTarget没有效果
261 return;// 返回
262 }
263
264 _rss_check->AppendRoutingTarget(routing_target);// 添加路由目标
265}
266
267const std::vector<::carla::geom::Transform> RssSensor::GetRoutingTargets() const {// 获取路由目标
268 if (!bool(_rss_check)) {// 如果还没有开始监听
269 log_error(GetDisplayId(), ": not yet listening. GetRoutingTargets has no effect.");// 记录错误信息:尚未监听,GetRoutingTargets没有效果
270 return std::vector<::carla::geom::Transform>();// 返回空的路由目标向量
271 }
272
273 return _rss_check->GetRoutingTargets();// 返回路由目标
274}
275
276void RssSensor::ResetRoutingTargets() {// 重置路由目标
277 if (!bool(_rss_check)) {// 如果还没有开始监听
278 log_error(GetDisplayId(), ": not yet listening. ResetRoutingTargets has no effect.");// 记录错误信息:尚未监听,ResetRoutingTargets没有效果
279 return;// 返回
280 }
281
282 _rss_check->ResetRoutingTargets();// 重置路由目标
283}
284
285void RssSensor::DropRoute() {// 放弃路由
286 // 不要立即执行,因为这可能会完全破坏计算
287 // 推迟到下一个传感器tick
288 _drop_route = true;// 标记为放弃路由
289}
290
291void RssSensor::TickRssSensor(const client::Timestamp &timestamp, CallbackFunctionType callback) {// 处理Rss传感器的tick
292 if (_processing_lock.try_lock()) {// 尝试锁定处理
293 if (!bool(_rss_check)){// 如果还没有开始监听
294 _processing_lock.unlock();// 解锁处理
295 return;// 返回
296 }
297 if ((timestamp.frame < _last_processed_frame) && ((_last_processed_frame - timestamp.frame) < 0xffffffffu)) {// 如果当前帧小于最后处理的帧
298 _processing_lock.unlock();// 解锁处理
299 _rss_check->GetLogger()->warn("RssSensor[{}] outdated tick dropped, LastProcessed={}", timestamp.frame, _last_processed_frame);// 记录警告:过时的tick被丢弃
300 return;// 返回
301 }
302 _last_processed_frame = timestamp.frame;// 更新最后处理的帧
303 SharedPtr<carla::client::ActorList> actors = GetWorld().GetActors();// 获取世界中的参与者列表
304
305 auto const settings = GetWorld().GetSettings();// 获取世界设置
306 if ( settings.synchronous_mode ) {// 如果是同步模式
307 _rss_check->GetLogger()->info("RssSensor[{}] sync-tick", timestamp.frame);// 记录信息:同步tick
308 TickRssSensorThreadLocked(timestamp, actors, callback);// 处理同步tick
309 }
310 else {// 如果是异步模式
311 // 存储future以防止future的析构函数阻塞等待
312 _rss_check->GetLogger()->info("RssSensor[{}] async-tick", timestamp.frame);// 记录信息:异步tick
313 _tick_future = std::async(&RssSensor::TickRssSensorThreadLocked, this, timestamp, actors, callback);// 异步处理tick
314 }
315 } else {// 如果处理锁定失败
316 if (bool(_rss_check)){// 如果正在监听
317 _rss_check->GetLogger()->info("RssSensor[{}] tick dropped", timestamp.frame);// 记录信息:tick被丢弃
318 }
319 }
320}
321
324 try {
325 // 记录检查开始时的时间(毫秒)
326 double const time_since_epoch_check_start_ms =
327 std::chrono::duration<double, std::milli>(std::chrono::system_clock::now().time_since_epoch()).count();
328
329 // 如果需要丢弃路线
330 if (_drop_route) {
331 _drop_route = false;
332 _rss_check->DropRoute();// 丢弃当前路线
333 }
334
335 // 检查所有参与者与自车的配对,并计算适当的响应
336 ::ad::rss::state::ProperResponse response;// 存储响应
337 ::ad::rss::state::RssStateSnapshot rss_state_snapshot;// RSS状态快照
338 ::ad::rss::situation::SituationSnapshot situation_snapshot;// 情况快照
339 ::ad::rss::world::WorldModel world_model;// 世界模型
340 carla::rss::EgoDynamicsOnRoute ego_dynamics_on_route;// 自车在路线上的动态
341 // 执行RSS检查
342 auto const result = _rss_check->CheckObjects(timestamp, actors, GetParent(), response, rss_state_snapshot,
343 situation_snapshot, world_model, ego_dynamics_on_route);
344
345 // 记录检查结束时的时间(毫秒)
346 double const time_since_epoch_check_end_ms =
347 std::chrono::duration<double, std::milli>(std::chrono::system_clock::now().time_since_epoch()).count();
348 // 计算检查的时间差(毫秒)
349 auto const delta_time_ms = time_since_epoch_check_end_ms - time_since_epoch_check_start_ms;
350 // 记录日志,显示响应和时间差
351 _rss_check->GetLogger()->debug("RssSensor[{}] response: S:{}->E:{} DeltaT:{}", timestamp.frame,
352 time_since_epoch_check_start_ms, time_since_epoch_check_end_ms,
353 delta_time_ms);
354 // 将时间差添加到处理时间列表
355 _rss_check_timings.push_back(delta_time_ms);
356 // 保持处理时间列表的大小不超过10
357 while (_rss_check_timings.size() > 10u) {
358 _rss_check_timings.pop_front();
359 }
360 double agv_time=0.;// 平均时间初始化
361 // 计算平均处理时间
362 for (auto run_time: _rss_check_timings) {
363 agv_time += run_time;
364 }
365 agv_time /= _rss_check_timings.size();// 计算平均时间
366 // 记录平均处理时间的日志
367 _rss_check->GetLogger()->info("RssSensor[{}] runtime {} avg {}", timestamp.frame, delta_time_ms, agv_time);
368 _processing_lock.unlock();// 解锁处理
369
370 // 调用回调函数,传递RSS响应数据
371 callback(MakeShared<sensor::data::RssResponse>(timestamp.frame, timestamp.elapsed_seconds, GetTransform(), result,
372 response, rss_state_snapshot, situation_snapshot, world_model,
373 ego_dynamics_on_route));
374 } catch (const std::exception &e) {
375 // 捕捉到标准异常,记录错误日志
376 _rss_check->GetLogger()->error("RssSensor[{}] tick exception", timestamp.frame);
377 _processing_lock.unlock();// 解锁处理
378 } catch (...) {
379 // 捕捉到未知异常,记录错误日志
380 _rss_check->GetLogger()->error("RssSensor[{}] tick exception", timestamp.frame);
381 _processing_lock.unlock();// 解锁处理
382 }
383}
384
385} // namespace client
386} // namespace carla
#define DEBUG_ASSERT(predicate)
Definition Debug.h:68
用于初始化 Actor 类。只有 ActorFactory 可以创建此对象,因此只有 ActorFactory 可以创建 Actor。
geom::Transform GetTransform() const
返回行为体的当前变换(位置和方向)。
std::size_t _last_processed_frame
用于存储DropRoute()请求的标志,直到下一次传感器滴答时处理,用于控制路由丢弃相关逻辑的标记
std::future< void > _tick_future
互斥锁,用于保护实际的RSS处理过程,防止在处理每帧数据耗时过长等情况下出现并发问题
void ResetRoutingTargets()
重置当前的路由目标 (
std::size_t _on_tick_register_id
the id got when registering for the on tick event
RSS行为体星座(周围物体分布相关)回调函数,用于在相关场景下执行自定义的回调逻辑 bool _drop_route
reqired to store DropRoute() requests until next sensor tick
bool IsListening() const override
返回此Sensor实例当前是否正在监听模拟器中的相关传感器
const ::ad::rss::world::RssDynamics & GetOtherVehicleDynamics() const
返回当前其他车辆所使用的动力学参数(
void SetLogLevel(const uint8_t &log_level)
设置当前的日志级别
void SetEgoVehicleDynamics(const ::ad::rss::world::RssDynamics &ego_dynamics)
设置自车(ego vehicle)将要使用的动力学参数(
std::shared_ptr<::carla::rss::RssCheck > _rss_check
static std::atomic_uint _global_map_initialization_counter_
上一次处理的帧编号,用于记录处理进度等相关情况
void SetPedestrianDynamics(const ::ad::rss::world::RssDynamics &pedestrian_dynamics)
设置行人所使用的动力学参数(
void RegisterActorConstellationCallback(ActorConstellationCallbackFunctionType callback)
为每个待处理的测量中的每个行为体注册一个回调函数,以便决定RSS传感器相对于自我车辆与行为体星座的操作。
std::function<::carla::rss::ActorConstellationResult(carla::SharedPtr<::carla::rss::ActorConstellationData >)> ActorConstellationCallbackFunctionType
void Stop() override
停止监听新的测量数据。
const ::ad::rss::world::RssDynamics & GetPedestrianDynamics() const
返回当前行人所使用的动力学参数(
void TickRssSensor(const client::Timestamp &timestamp, CallbackFunctionType callback)
传感器滴答(tick,可以理解为周期性触发的操作)回调函数,实际执行传感器相关逻辑的函数
void SetOtherVehicleDynamics(const ::ad::rss::world::RssDynamics &other_vehicle_dynamics)
设置其他车辆所使用的动力学参数(
void SetMapLogLevel(const uint8_t &map_log_level)
设置当前的地图日志级别
std::list< double > _rss_check_timings
用于异步滴答线程的未来(future,用于异步获取线程执行结果等操作)对象
const ::ad::rss::world::RssDynamics & GetEgoVehicleDynamics() const
返回当前自车(ego vehicle)所使用的动力学参数(
RssSensor(ActorInitializer init)
构造函数
void AppendRoutingTarget(const ::carla::geom::Transform &routing_target)
向当前路由目标列表追加一个路由目标 (
std::mutex _processing_lock
注册滴答事件(on tick event,周期性触发的事件)时获取的ID,用于标识该注册操作等相关用途
void SetRoadBoundariesMode(const ::carla::rss::RoadBoundariesMode &road_boundaries_mode)
设置当前用于遵守道路边界的模式 (
ActorConstellationCallbackFunctionType _rss_actor_constellation_callback
一些用于调试的时间记录,可能记录RSS检查等操作的耗时情况等,以列表形式存储 / the rss actor constellation callback function
const ::carla::rss::RoadBoundariesMode & GetRoadBoundariesMode() const
const std::vector<::carla::geom::Transform > GetRoutingTargets() const
void Listen(CallbackFunctionType callback) override
注册一个回调函数,每次接收到新的测量数据时都会执行该函数。
void TickRssSensorThreadLocked(const client::Timestamp &timestamp, SharedPtr< carla::client::ActorList > actors, CallbackFunctionType callback)
传感器基类,继承自Actor类。
std::function< void(SharedPtr< sensor::SensorData >)> CallbackFunctionType
回调函数的类型别名,用于接收传感器数据。
std::size_t frame
自模拟器启动以来经过的帧数。
Definition Timestamp.h:37
double elapsed_seconds
模拟自当前情境开始以来经过的秒数。
Definition Timestamp.h:40
SharedPtr< ActorList > GetActors() const
返回一个包含当前世界上所有存在的参与者(actor)的列表。 获取整个模拟世界中所有参与者的集合,便于进行批量操作、统计或者遍历所有实体执行某些通用的操作等。
Definition World.cpp:114
SharedPtr< Map > GetMap() const
返回描述这个世界的地图。 返回的是一个智能指针指向的Map对象,该Map对象包含了模拟世界中的地理信息、道路布局等地图相关的数据结构, 供外部调用者进一步查询和操作地图相关的功能。
Definition World.cpp:24
rpc::EpisodeSettings GetSettings() const
获取当前模拟世界的设置信息,比如时间步长、同步模式等相关的参数配置情况, 返回的rpc::EpisodeSettings对象包含了这些详细的设置内容,供外部查询和可能的修改参考。
Definition World.cpp:52
SharedPtr< Actor > GetParent() const
const std::string & GetDisplayId() const
SharedPtrType Lock() const
与 TryLock 相同,但永远不会返回 nullptr。
::ad::rss::world::RssDynamics GetDefaultVehicleDynamics()
Definition RssCheck.cpp:114
static RoadBoundariesMode GetDefaultRoadBoundariesMode()
Definition RssCheck.h:249
::ad::rss::world::RssDynamics GetDefaultPedestrianDynamics()
Definition RssCheck.cpp:147
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
void throw_exception(const std::exception &e)
Definition Carla.cpp:142
boost::weak_ptr< T > WeakPtr
类似于SharedPtr,但提供对boost::weak_ptr的别名,用于弱引用
Definition Memory.h:22
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_debug(Args &&... args)
Definition Logging.h:71
包含CARLA客户端相关类和函数的命名空间。
struct defining the ego vehicles current dynamics in respect to the current route
Definition RssCheck.h:46