Skip to content

Commit 449a03b

Browse files
veqccKhalilSelyan
authored and
KhalilSelyan
committed
feat(tier4_autoware_utils): faster sin and cos (#7120)
* feat(tier4_autoware_utils): faster sin and cos Signed-off-by: veqcc <ryuta.kambe@tier4.jp>
1 parent 03c2259 commit 449a03b

File tree

3 files changed

+37
-0
lines changed

3 files changed

+37
-0
lines changed

common/tier4_autoware_utils/include/tier4_autoware_utils/math/trigonometry.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,17 @@
1515
#ifndef TIER4_AUTOWARE_UTILS__MATH__TRIGONOMETRY_HPP_
1616
#define TIER4_AUTOWARE_UTILS__MATH__TRIGONOMETRY_HPP_
1717

18+
#include <utility>
19+
1820
namespace tier4_autoware_utils
1921
{
2022

2123
float sin(float radian);
2224

2325
float cos(float radian);
2426

27+
std::pair<float, float> sin_and_cos(float radian);
28+
2529
} // namespace tier4_autoware_utils
2630

2731
#endif // TIER4_AUTOWARE_UTILS__MATH__TRIGONOMETRY_HPP_

common/tier4_autoware_utils/src/math/trigonometry.cpp

+23
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,27 @@ float cos(float radian)
4949
return sin(radian + static_cast<float>(tier4_autoware_utils::pi) / 2.f);
5050
}
5151

52+
std::pair<float, float> sin_and_cos(float radian)
53+
{
54+
constexpr float tmp =
55+
(180.f / static_cast<float>(tier4_autoware_utils::pi)) * (discrete_arcs_num_360 / 360.f);
56+
const float degree = radian * tmp;
57+
size_t idx =
58+
(static_cast<int>(std::round(degree)) % discrete_arcs_num_360 + discrete_arcs_num_360) %
59+
discrete_arcs_num_360;
60+
61+
if (idx < discrete_arcs_num_90) {
62+
return {g_sin_table[idx], g_sin_table[discrete_arcs_num_90 - idx]};
63+
} else if (discrete_arcs_num_90 <= idx && idx < 2 * discrete_arcs_num_90) {
64+
idx = 2 * discrete_arcs_num_90 - idx;
65+
return {g_sin_table[idx], -g_sin_table[discrete_arcs_num_90 - idx]};
66+
} else if (2 * discrete_arcs_num_90 <= idx && idx < 3 * discrete_arcs_num_90) {
67+
idx = idx - 2 * discrete_arcs_num_90;
68+
return {-g_sin_table[idx], -g_sin_table[discrete_arcs_num_90 - idx]};
69+
} else { // 3 * discrete_arcs_num_90 <= idx && idx < 4 * discrete_arcs_num_90
70+
idx = 4 * discrete_arcs_num_90 - idx;
71+
return {-g_sin_table[idx], g_sin_table[discrete_arcs_num_90 - idx]};
72+
}
73+
}
74+
5275
} // namespace tier4_autoware_utils

common/tier4_autoware_utils/test/src/math/test_trigonometry.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,13 @@ TEST(trigonometry, cos)
4040
tier4_autoware_utils::cos(x * static_cast<float>(i))) < 10e-5);
4141
}
4242
}
43+
44+
TEST(trigonometry, sin_and_cos)
45+
{
46+
float x = 4.f * tier4_autoware_utils::pi / 128.f;
47+
for (int i = 0; i < 128; i++) {
48+
const auto sin_and_cos = tier4_autoware_utils::sin_and_cos(x * static_cast<float>(i));
49+
EXPECT_TRUE(std::abs(std::sin(x * static_cast<float>(i)) - sin_and_cos.first) < 10e-7);
50+
EXPECT_TRUE(std::abs(std::cos(x * static_cast<float>(i)) - sin_and_cos.second) < 10e-7);
51+
}
52+
}

0 commit comments

Comments
 (0)