26 namespace perception {
33 template <
typename Type>
35 const Eigen::Matrix<Type, 2, 1> &point2,
36 const Eigen::Matrix<Type, 2, 1> &point3) {
37 return (point2.x() - point1.x()) * (point3.y() - point1.y()) -
38 (point3.x() - point1.x()) * (point2.y() - point1.y());
45 template <
typename Po
intT>
48 const PointT &point3) {
49 return (point2.x - point1.x) * (point3.y - point1.y) -
50 (point3.x - point1.x) * (point2.y - point1.y);
55 template <
typename Po
intT>
58 typename PointT::Type dist = (pt1.x - pt2.x) * (pt1.x - pt2.x);
59 dist += (pt1.y - pt2.y) * (pt1.y - pt2.y);
60 dist += (pt1.z - pt2.z) * (pt1.z - pt2.z);
61 return static_cast<typename PointT::Type
>(sqrt(dist));
66 template <
typename Po
intT>
69 typename PointT::Type dist = (pt1.x - pt2.x) * (pt1.x - pt2.x);
70 dist += (pt1.y - pt2.y) * (pt1.y - pt2.y);
71 return static_cast<typename PointT::Type
>(sqrt(dist));
79 const Eigen::Matrix<T, 3, 1> &v2) {
80 T v1_len =
static_cast<T
>(sqrt((v1.head(2).cwiseProduct(v1.head(2))).sum()));
81 T v2_len =
static_cast<T
>(sqrt((v2.head(2).cwiseProduct(v2.head(2))).sum()));
82 if (v1_len < std::numeric_limits<T>::epsilon() ||
83 v2_len < std::numeric_limits<T>::epsilon()) {
86 T cos_theta = (v1.head(2).cwiseProduct(v2.head(2))).sum() / (v1_len * v2_len);
94 const Eigen::Matrix<T, 3, 1> &v2) {
95 T v1_len =
static_cast<T
>(sqrt((v1.head(2).cwiseProduct(v1.head(2))).sum()));
96 T v2_len =
static_cast<T
>(sqrt((v2.head(2).cwiseProduct(v2.head(2))).sum()));
97 if (v1_len < std::numeric_limits<T>::epsilon() ||
98 v2_len < std::numeric_limits<T>::epsilon()) {
102 (v1.head(2).cwiseProduct(v2.head(2))).sum() / (v1_len * v2_len);
103 const T sin_theta = (v1(0) * v2(1) - v1(1) * v2(0)) / (v1_len * v2_len);
104 T theta = std::acos(cos_theta);
105 if (sin_theta < 0.0) {
114 template <
typename T>
116 const Eigen::Matrix<T, 3, 1> &v1,
const Eigen::Matrix<T, 3, 1> &v2) {
117 T v1_len =
static_cast<T
>(sqrt((v1.head(2).cwiseProduct(v1.head(2))).sum()));
118 T v2_len =
static_cast<T
>(sqrt((v2.head(2).cwiseProduct(v2.head(2))).sum()));
119 if (v1_len < std::numeric_limits<T>::epsilon() ||
120 v2_len < std::numeric_limits<T>::epsilon()) {
121 return Eigen::Matrix<T, 3, 3>::Zero(3, 3);
125 (v1.head(2).cwiseProduct(v2.head(2))).sum() / (v1_len * v2_len);
126 const T sin_theta = (v1(0) * v2(1) - v1(1) * v2(0)) / (v1_len * v2_len);
128 Eigen::Matrix<T, 3, 3> rot_mat;
129 rot_mat << cos_theta, sin_theta, 0, -sin_theta, cos_theta, 0, 0, 0, 1;
135 template <
typename T>
137 const Eigen::Matrix<T, 3, 1> &projected_vector,
138 const Eigen::Matrix<T, 3, 1> &project_vector) {
139 if (projected_vector.head(2).norm() < std::numeric_limits<T>::epsilon() ||
140 project_vector.head(2).norm() < std::numeric_limits<T>::epsilon()) {
141 return Eigen::Matrix<T, 3, 1>::Zero(3, 1);
143 Eigen::Matrix<T, 3, 1> project_dir = project_vector;
144 project_dir(2) = 0.0;
145 project_dir.normalize();
147 const T projected_vector_project_dir_inner_product =
148 projected_vector(0) * project_dir(0) +
149 projected_vector(1) * project_dir(1);
150 const T projected_vector_project_dir_angle_cos =
151 projected_vector_project_dir_inner_product /
152 (projected_vector.head(2).norm() * project_dir.head(2).norm());
153 const T projected_vector_norm_on_project_dir =
154 projected_vector.head(2).norm() * projected_vector_project_dir_angle_cos;
155 return project_dir * projected_vector_norm_on_project_dir;
160 template <
typename Po
intT>
162 typename PointT::Type *h_angle_in_degree,
163 typename PointT::Type *v_angle_in_degree,
164 typename PointT::Type *dist) {
165 using T =
typename PointT::Type;
166 const T radian_to_degree = 180.0 / M_PI;
171 (*dist) =
static_cast<T
>(sqrt(x * x + y * y + z * z));
172 T dist_xy =
static_cast<T
>(sqrt(x * x + y * y));
174 (*h_angle_in_degree) = std::acos(x / dist_xy) * radian_to_degree;
176 (*h_angle_in_degree) =
static_cast<T
>(360.0) - (*h_angle_in_degree);
179 (*v_angle_in_degree) = std::acos(dist_xy / (*dist)) * radian_to_degree;
181 (*v_angle_in_degree) = -(*v_angle_in_degree);
Eigen::Matrix< T, 3, 3 > CalculateRotationMat2DXY(const Eigen::Matrix< T, 3, 1 > &v1, const Eigen::Matrix< T, 3, 1 > &v2)
Definition: basic.h:115
T CalculateTheta2DXY(const Eigen::Matrix< T, 3, 1 > &v1, const Eigen::Matrix< T, 3, 1 > &v2)
Definition: basic.h:93
Eigen::Matrix< T, 3, 1 > Calculate2DXYProjectVector(const Eigen::Matrix< T, 3, 1 > &projected_vector, const Eigen::Matrix< T, 3, 1 > &project_vector)
Definition: basic.h:136
Type CrossProduct(const Eigen::Matrix< Type, 2, 1 > &point1, const Eigen::Matrix< Type, 2, 1 > &point2, const Eigen::Matrix< Type, 2, 1 > &point3)
Definition: basic.h:34
void ConvertCartesiantoPolarCoordinate(const PointT &xyz, typename PointT::Type *h_angle_in_degree, typename PointT::Type *v_angle_in_degree, typename PointT::Type *dist)
Definition: basic.h:161
T CalculateCosTheta2DXY(const Eigen::Matrix< T, 3, 1 > &v1, const Eigen::Matrix< T, 3, 1 > &v2)
Definition: basic.h:78
PointT::Type CalculateEuclidenDist2DXY(const PointT &pt1, const PointT &pt2)
Definition: basic.h:67
PointT::Type CalculateEuclidenDist(const PointT &pt1, const PointT &pt2)
Definition: basic.h:56