40 Eigen::Vector3d direction =
object->direction.cast<
double>();
41 Eigen::Vector3d odirection(-direction(1), direction(0), 0.0);
42 double half_length =
object->size(0) * 0.5 + expand;
43 double half_width =
object->size(1) * 0.5 + expand;
45 box->
at(0).x = half_length * direction(0) + half_width * odirection(0) +
47 box->
at(0).y = half_length * direction(1) + half_width * odirection(1) +
49 box->
at(1).x = -half_length * direction(0) + half_width * odirection(0) +
51 box->
at(1).y = -half_length * direction(1) + half_width * odirection(1) +
53 box->
at(2).x = -half_length * direction(0) - half_width * odirection(0) +
55 box->
at(2).y = -half_length * direction(1) - half_width * odirection(1) +
57 box->
at(3).x = half_length * direction(0) - half_width * odirection(0) +
59 box->
at(3).y = half_length * direction(1) - half_width * odirection(1) +
64 bool use_world_cloud) {
67 object->radar4d_supplement.cloud;
69 object->radar4d_supplement.cloud_world;
72 AINFO <<
"Failed to compute box, polygon size: " << polygon.
size()
73 <<
" cloud size: " << cloud.
size();
78 Eigen::Vector2d polygon_xy;
79 Eigen::Vector2d projected_polygon_xy;
80 Eigen::Vector3d raw_direction =
object->direction.cast<
double>();
81 Eigen::Vector2d direction = raw_direction.head<2>();
82 Eigen::Vector2d odirection(-direction(1), direction(0));
84 constexpr double kDoubleMax = std::numeric_limits<double>::max();
85 Eigen::Vector2d min_polygon_xy(kDoubleMax, kDoubleMax);
86 Eigen::Vector2d max_polygon_xy(-kDoubleMax, -kDoubleMax);
89 Eigen::Vector2d offset(object->polygon[0].x, object->polygon[0].y);
91 for (
const auto& point :
object->polygon.points()) {
92 polygon_xy << point.x, point.y;
94 projected_polygon_xy(0) = direction.dot(polygon_xy);
95 projected_polygon_xy(1) = odirection.dot(polygon_xy);
96 min_polygon_xy(0) = std::min(min_polygon_xy(0), projected_polygon_xy(0));
97 min_polygon_xy(1) = std::min(min_polygon_xy(1), projected_polygon_xy(1));
98 max_polygon_xy(0) = std::max(max_polygon_xy(0), projected_polygon_xy(0));
99 max_polygon_xy(1) = std::max(max_polygon_xy(1), projected_polygon_xy(1));
104 if (use_world_cloud) {
105 min_z = world_cloud[0].z;
106 max_z = world_cloud[0].z;
107 for (
const auto& point : world_cloud.
points()) {
108 min_z = std::min(min_z, point.z);
109 max_z = std::max(max_z, point.z);
114 for (
const auto& point : cloud.
points()) {
115 min_z = std::min(min_z,
static_cast<double>(point.z));
116 max_z = std::max(max_z,
static_cast<double>(point.z));
121 object->size <<
static_cast<float>(max_polygon_xy(0) - min_polygon_xy(0)),
122 static_cast<float>(max_polygon_xy(1) - min_polygon_xy(1)),
123 static_cast<float>(max_z - min_z);
125 object->size(0) = std::max(object->size(0), 0.01f);
126 object->size(1) = std::max(object->size(1), 0.01f);
127 object->size(2) = std::max(object->size(2), 0.01f);
129 projected_polygon_xy << (min_polygon_xy(0) + max_polygon_xy(0)) * 0.5,
130 (min_polygon_xy(1) + max_polygon_xy(1)) * 0.5;
131 polygon_xy = projected_polygon_xy(0) * direction +
132 projected_polygon_xy(1) * odirection;
133 object->center << polygon_xy(0) + offset(0), polygon_xy(1) + offset(1), min_z;