CARLA
 
载入中...
搜索中...
未找到
LocalizationUtils.cpp
浏览该文件的文档.
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#include "carla/trafficmanager/LocalizationUtils.h" // 引入定位工具的头文件
8#include "carla/trafficmanager/Constants.h" // 引入常量的头文件
9
10namespace carla {
11namespace traffic_manager {
12
13using constants::Collision::EPSILON; // 使用常量定义的误差值
14
15// 计算偏差的叉积,判断目标位置相对于参考位置的偏差
16float DeviationCrossProduct(const cg::Location &reference_location, // 参考位置
17 const cg::Vector3D &heading_vector, // 前进方向向量
18 const cg::Location &target_location) { // 目标位置
19 cg::Vector3D next_vector = target_location - reference_location; // 计算目标向量
20 next_vector = next_vector.MakeSafeUnitVector(EPSILON); // 将目标向量归一化
21 const float cross_z = heading_vector.x * next_vector.y - heading_vector.y * next_vector.x; // 计算z轴上的叉积
22 return cross_z; // 返回叉积结果
23}
24
25// 计算偏差的点积,判断目标位置与前进方向的对齐程度
26float DeviationDotProduct(const cg::Location &reference_location, // 参考位置
27 const cg::Vector3D &heading_vector, // 前进方向向量
28 const cg::Location &target_location) { // 目标位置
29 cg::Vector3D next_vector = target_location - reference_location; // 计算目标向量
30 next_vector.z = 0.0f; // 忽略z轴分量
31 next_vector = next_vector.MakeSafeUnitVector(EPSILON); // 将目标向量归一化
32 cg::Vector3D heading_vector_flat(heading_vector.x, heading_vector.y, 0); // 创建平面的前进方向向量
33 heading_vector_flat = heading_vector_flat.MakeSafeUnitVector(EPSILON); // 将平面向量归一化
34 float dot_product = cg::Math::Dot(next_vector, heading_vector_flat); // 计算点积
35 dot_product = std::max(0.0f, std::min(dot_product, 1.0f)); // 限制点积在0到1之间
36 return dot_product; // 返回点积结果
37}
38
39// 将一个航点添加到缓冲区并更新经过的车辆信息
40void PushWaypoint(ActorId actor_id, TrackTraffic &track_traffic, // 车辆ID和交通轨迹引用
41 Buffer &buffer, SimpleWaypointPtr &waypoint) { // 缓冲区和航点指针
42 const uint64_t waypoint_id = waypoint->GetId(); // 获取航点ID
43 buffer.push_back(waypoint); // 将航点添加到缓冲区
44 track_traffic.UpdatePassingVehicle(waypoint_id, actor_id); // 更新经过该航点的车辆信息
45}
46
47// 从缓冲区中移除一个航点并更新经过的车辆信息
48void PopWaypoint(ActorId actor_id, TrackTraffic &track_traffic, // 车辆ID和交通轨迹引用
49 Buffer &buffer, bool front_or_back) { // 缓冲区和方向标志(前或后)
50 SimpleWaypointPtr removed_waypoint = front_or_back ? buffer.front() : buffer.back(); // 根据方向选择移除的航点
51 const uint64_t removed_waypoint_id = removed_waypoint->GetId(); // 获取被移除航点的ID
52 if (front_or_back) { // 如果是前方
53 buffer.pop_front(); // 移除前方航点
54 } else { // 如果是后方
55 buffer.pop_back(); // 移除后方航点
56 }
57 track_traffic.RemovePassingVehicle(removed_waypoint_id, actor_id); // 更新经过的车辆信息
58}
59
60// 获取目标航点及其索引
61TargetWPInfo GetTargetWaypoint(const Buffer &waypoint_buffer, const float &target_point_distance) { // 缓冲区和目标距离
62 SimpleWaypointPtr target_waypoint = waypoint_buffer.front(); // 初始化目标航点为缓冲区的第一个航点
63 const SimpleWaypointPtr &buffer_front = waypoint_buffer.front(); // 获取缓冲区的前端航点
64 uint64_t startPosn = static_cast<uint64_t>(std::fabs(target_point_distance * INV_MAP_RESOLUTION)); // 计算起始位置
65 uint64_t index = startPosn; // 初始化索引为起始位置
66
67 // 确定是前向还是后向扫描航点缓冲区的条件
68 if (startPosn < waypoint_buffer.size()) { // 如果起始位置小于缓冲区大小
69 bool mScanForward = false; // 初始化扫描方向标志
70 const float target_point_dist_power = target_point_distance * target_point_distance; // 计算目标距离的平方
71 if (buffer_front->DistanceSquared(target_waypoint) < target_point_dist_power) { // 判断是否需要前向扫描
72 mScanForward = true;
73 }
74
75 // 前向扫描航点
76 if (mScanForward) {
77 for (uint64_t i = startPosn; // 从起始位置开始扫描
78 (i < waypoint_buffer.size()) && (buffer_front->DistanceSquared(target_waypoint) < target_point_dist_power);
79 ++i) {
80 target_waypoint = waypoint_buffer.at(i); // 更新目标航点
81 index = i; // 更新索引
82 }
83 } else { // 后向扫描航点
84 for (uint64_t i = startPosn; // 从起始位置开始扫描
85 (buffer_front->DistanceSquared(target_waypoint) > target_point_dist_power);
86 --i) {
87 target_waypoint = waypoint_buffer.at(i); // 更新目标航点
88 index = i; // 更新索引
89 }
90 }
91 } else { // 如果起始位置超出缓冲区
92 target_waypoint = waypoint_buffer.back(); // 目标航点为缓冲区最后一个航点
93 index = waypoint_buffer.size() - 1; // 索引为缓冲区大小减一
94 }
95 return std::make_pair(target_waypoint, index); // 返回目标航点和索引
96}
97
98} // namespace traffic_manager
99} // namespace carla
Vector3D MakeSafeUnitVector(const float epsilon) const
void UpdatePassingVehicle(uint64_t waypoint_id, ActorId actor_id)
更新、移除和检索经过某一路点车辆的方法
void RemovePassingVehicle(uint64_t waypoint_id, ActorId actor_id)
void PopWaypoint(ActorId actor_id, TrackTraffic &track_traffic, Buffer &buffer, bool front_or_back)
std::deque< std::shared_ptr< SimpleWaypoint > > Buffer
void PushWaypoint(ActorId actor_id, TrackTraffic &track_traffic, Buffer &buffer, SimpleWaypointPtr &waypoint)
float DeviationCrossProduct(const cg::Location &reference_location, const cg::Vector3D &heading_vector, const cg::Location &target_location)
返回车辆朝向向量与指向下一个目标路点方向向量之间的叉积(z分量值)
std::shared_ptr< SimpleWaypoint > SimpleWaypointPtr
TargetWPInfo GetTargetWaypoint(const Buffer &waypoint_buffer, const float &target_point_distance)
carla::ActorId ActorId
参与者的智能指针类型
std::pair< SimpleWaypointPtr, uint64_t > TargetWPInfo
根据目标点距离从路点缓冲区返回路点信息
float DeviationDotProduct(const cg::Location &reference_location, const cg::Vector3D &heading_vector, const cg::Location &target_location)
返回车辆朝向向量与指向下一个目标路点方向向量之间的点积
CARLA模拟器的主命名空间。
Definition Carla.cpp:139