CARLA
 
载入中...
搜索中...
未找到
geom/Transform.h
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// 变换类
5//
6// This work is licensed under the terms of the MIT license.
7// For a copy, see <https://opensource.org/licenses/MIT>.
8
9#pragma once
10
11#include "carla/MsgPack.h" // 引入MsgPack库,用于序列化和反序列化
12#include "carla/geom/Location.h" // 引入Location类,表示位置
13#include "carla/geom/Math.h" // 引入数学工具库
14#include "carla/geom/Rotation.h" // 引入Rotation类,表示旋转
15
16#ifdef LIBCARLA_INCLUDED_FROM_UE4
17#include <compiler/enable-ue4-macros.h>// 用于处理UE4的宏定义
18#include "Math/Transform.h" // 引入UE4的Transform类
20#endif // LIBCARLA_INCLUDED_FROM_UE4
21
22namespace carla {
23namespace geom {
24
25 // 变换类,用于表示位置和旋转相关的变换操作,包含了位置信息和旋转信息等相关功能
26 class Transform {
27 public:
28
29 // =========================================================================
30 // -- 公开数据成员 ----------------------------------------------------------
31 // =========================================================================
32
33 // 表示位置信息,存储了在三维空间中的坐标位置
35 // 表示旋转信息,用于描述物体在空间中的旋转状态
37
38 // 使用MsgPack来定义如何对这个类中的数据成员(location和rotation)进行序列化和反序列化操作
40
41 // =========================================================================
42 // -- 构造函数 --------------------------------------------------------------
43 // =========================================================================
44
45 // 默认构造函数,使用编译器默认生成的行为,对数据成员进行默认初始化
46 Transform() = default;
47
48 // 构造函数,使用给定的位置信息初始化变换对象,旋转部分初始化为默认值(通常是无旋转的初始状态)
49 Transform(const Location &in_location)
50 : location(in_location),
51 rotation() {}
52
53 // 构造函数,使用给定的位置信息和旋转信息来初始化变换对象
54 Transform(const Location &in_location, const Rotation &in_rotation)
55 : location(in_location),
56 rotation(in_rotation) {}
57
58 // =========================================================================
59 // -- 其他方法 --------------------------------------------------------------
60 // =========================================================================
61
62 // 获取变换后的前向向量(基于当前的旋转信息计算得到),该向量表示物体在当前旋转状态下的正前方方向
66
67 // 获取变换后的右向向量(基于当前的旋转信息计算得到),该向量表示物体在当前旋转状态下的右侧方向
69 return rotation.GetRightVector();
70 }
71
72 // 获取变换后的上向向量(基于当前的旋转信息计算得到),该向量表示物体在当前旋转状态下的上方方向
74 return rotation.GetUpVector();
75 }
76
77 /// 将此变换应用于 @a in_point(先平移然后旋转)。
78 /// 具体操作是先根据当前的旋转信息对输入点进行旋转操作,然后再根据当前的位置信息进行平移操作,最终将结果赋值回输入点
79 void TransformPoint(Vector3D &in_point) const {
80 auto out_point = in_point;
81 rotation.RotateVector(out_point); // 先旋转
82 out_point += location; // 再平移
83 in_point = out_point;
84 }
85
86 /// 将此转换应用于 @a in_vector(仅旋转)。
87 /// 即只根据当前的旋转信息对输入向量进行旋转操作,然后将旋转后的结果赋值回输入向量
88 void TransformVector(Vector3D &in_vector) const {
89 auto out_vector = in_vector;
90 rotation.RotateVector(out_vector); // 先旋转
91 in_vector = out_vector;
92 }
93
94 /// 将此变换的逆运算应用于 @a in_point
95 /// 操作顺序为先进行位置上的逆平移(减去位置信息),然后再根据旋转的逆操作对向量进行旋转,最终将结果赋值回输入点
96 void InverseTransformPoint(Vector3D &in_point) const {
97 auto out_point = in_point;
98 out_point -= location; // 先逆变换
99 rotation.InverseRotateVector(out_point); // 再逆旋转
100 in_point = out_point;
101 }
102
103 /// 计算变换的 4 矩阵形式
104 /// 通过当前的旋转角度(偏航、俯仰、翻滚)以及位置信息,按照特定的数学变换规则计算出一个 4x4 的变换矩阵,用于更通用的线性变换操作表示
105 std::array<float, 16> GetMatrix() const {
106 const float yaw = rotation.yaw;
107 const float cy = std::cos(Math::ToRadians(yaw));
108 const float sy = std::sin(Math::ToRadians(yaw));
109
110 const float roll = rotation.roll;
111 const float cr = std::cos(Math::ToRadians(roll));
112 const float sr = std::sin(Math::ToRadians(roll));
113
114 const float pitch = rotation.pitch;
115 const float cp = std::cos(Math::ToRadians(pitch));
116 const float sp = std::sin(Math::ToRadians(pitch));
117
118 std::array<float, 16> transform = {
119 cp * cy, cy * sp * sr - sy * cr, -cy * sp * cr - sy * sr, location.x,
120 cp * sy, sy * sp * sr + cy * cr, -sy * sp * cr + cy * sr, location.y,
121 sp, -cp * sr, cp * cr, location.z,
122 0.0, 0.0, 0.0, 1.0};
123
124 return transform;
125 }
126
127 /// 计算逆变换的 4 矩阵形式
128 /// 首先通过逆变换操作(InverseTransformPoint)得到一个用于逆变换的位置偏移向量,然后结合当前的旋转角度信息,按照特定数学规则计算出逆变换对应的 4x4 矩阵
129 std::array<float, 16> GetInverseMatrix() const {
130 const float yaw = rotation.yaw; // 提取旋转对象中的偏航角(yaw),并将其从度转换为弧度
131 const float cy = std::cos(Math::ToRadians(yaw)); // 计算偏航角的余弦值
132 const float sy = std::sin(Math::ToRadians(yaw)); // 计算偏航角的正弦值
133 // 提取旋转对象中的翻滚角(roll),并将其从度转换为弧度
134 const float roll = rotation.roll;
135 const float cr = std::cos(Math::ToRadians(roll)); // 计算翻滚角的余弦值
136 const float sr = std::sin(Math::ToRadians(roll)); // 计算翻滚角的正弦值
137 // 提取旋转对象中的俯仰角(pitch),并将其从度转换为弧度
138 const float pitch = rotation.pitch;
139 const float cp = std::cos(Math::ToRadians(pitch)); // 计算俯仰角的余弦值
140 const float sp = std::sin(Math::ToRadians(pitch)); // 计算俯仰角的正弦值
141 // 创建一个3D向量,并初始化为0,用于后续的逆变换点计算
142 Vector3D a = {0.0f, 0.0f, 0.0f};
143 InverseTransformPoint(a); // 调用逆变换点函数,传入向量a,并更新向量a的值
144
145 std::array<float, 16> transform = { // 以下为3x3旋转矩阵和位移向量组成的4x4矩阵
146 cp * cy, cp * sy, sp, a.x,
147 cy * sp * sr - sy * cr, sy * sp * sr + cy * cr, -cp * sr, a.y,
148 -cy * sp * cr - sy * sr, -sy * sp * cr + cy * sr, cp * cr, a.z,
149 0.0f, 0.0f, 0.0f, 1.0}; // 最后一列,代表位移和齐次坐标
150
151 return transform; // 返回计算得到的逆变换矩阵
152 }
153
154 // =========================================================================
155 // -- 比较运算符 ------------------------------------------------------------
156 // =========================================================================
157
158 // 比较是否相等(分别比较平移类和旋转类是否相等)
159 // 通过比较位置信息和旋转信息是否分别相等来判断两个变换对象是否相等
160 bool operator==(const Transform &rhs) const {
161 return (location == rhs.location) && (rotation == rhs.rotation);
162 }
163
164 // 判断两个变换对象是否不相等,通过对相等运算符取反来实现
165 bool operator!=(const Transform &rhs) const {
166 return!(*this == rhs);
167 }
168
169 // =========================================================================
170 // -- Conversions to UE4 types ---------------------------------------------
171 // =========================================================================
172
173#ifdef LIBCARLA_INCLUDED_FROM_UE4
174 // 从UE4的FTransform类型构造当前的Transform对象,提取其中的位置信息和旋转信息进行初始化
175 Transform(const FTransform &transform)
176 : Transform(Location(transform.GetLocation()), Rotation(transform.Rotator())) {}
177
178 // 类型转换运算符,将当前的Transform对象转换为UE4的FTransform类型,按照一定的规则构建对应的UE4变换对象(设置旋转、位置以及缩放信息)
179 operator FTransform() const {
180 const FVector scale{1.0f, 1.0f, 1.0f};
181 return FTransform{FRotator(rotation), FVector(location), scale};
182 }
183
184#endif // LIBCARLA_INCLUDED_FROM_UE4
185 };
186
187} // namespace geom
188} // namespace carla
static constexpr T ToRadians(T deg)
Definition Math.h:47
Vector3D GetUpVector() const
Definition Rotation.h:74
Vector3D GetRightVector() const
Definition Rotation.h:69
void InverseRotateVector(Vector3D &in_point) const
Definition Rotation.h:124
void RotateVector(Vector3D &in_point) const
Definition Rotation.h:80
Vector3D GetForwardVector() const
Definition Rotation.h:64
std::array< float, 16 > GetMatrix() const
计算变换的 4 矩阵形式 通过当前的旋转角度(偏航、俯仰、翻滚)以及位置信息,按照特定的数学变换规则计算出一个 4x4 的变换矩阵,用于更通用的线性变换操作表示
MSGPACK_DEFINE_ARRAY(location, rotation)
void TransformVector(Vector3D &in_vector) const
将此转换应用于 in_vector(仅旋转)。 即只根据当前的旋转信息对输入向量进行旋转操作,然后将旋转后的结果赋值回输入向量
void TransformPoint(Vector3D &in_point) const
将此变换应用于 in_point(先平移然后旋转)。 具体操作是先根据当前的旋转信息对输入点进行旋转操作,然后再根据当前的位置信息进行平移操作,最终将结果赋值回输入点
Vector3D GetUpVector() const
std::array< float, 16 > GetInverseMatrix() const
计算逆变换的 4 矩阵形式 首先通过逆变换操作(InverseTransformPoint)得到一个用于逆变换的位置偏移向量,然后结合当前的旋转角度信息,按照特定数学规则计算出逆变换对应的 4x4 矩阵
void InverseTransformPoint(Vector3D &in_point) const
将此变换的逆运算应用于 in_point 操作顺序为先进行位置上的逆平移(减去位置信息),然后再根据旋转的逆操作对向量进行旋转,最终将结果赋值回输入点
Transform(const Location &in_location, const Rotation &in_rotation)
Transform(const FTransform &transform)
bool operator!=(const Transform &rhs) const
bool operator==(const Transform &rhs) const
Transform(const Location &in_location)
Vector3D GetRightVector() const
Vector3D GetForwardVector() const
Carlaе·عܵռ
CARLA模拟器的主命名空间。
Definition Carla.cpp:139