32 EigenVector<Eigen::Vector3d>* vertices) {
35 Eigen::Vector3d center = obj->center;
36 Eigen::Vector2d dir = obj->direction.head(2).cast<
double>();
38 Eigen::Vector2d orth_dir(-dir.y(), dir.x());
39 Eigen::Vector2d delta_x = dir * obj->size(0) * 0.5;
40 Eigen::Vector2d delta_y = orth_dir * obj->size(1) * 0.5;
43 center.z() -= obj->size(2) * 0.5;
44 (*vertices)[0] = center, (*vertices)[0].head(2) += (-delta_x - delta_y);
45 (*vertices)[1] = center, (*vertices)[1].head(2) += (-delta_x + delta_y);
46 (*vertices)[2] = center, (*vertices)[2].head(2) += (delta_x + delta_y);
47 (*vertices)[3] = center, (*vertices)[3].head(2) += (delta_x - delta_y);
49 (*vertices)[4] = (*vertices)[0], (*vertices)[4].z() += obj->size(2);
50 (*vertices)[5] = (*vertices)[1], (*vertices)[5].z() += obj->size(2);
51 (*vertices)[6] = (*vertices)[2], (*vertices)[6].z() += obj->size(2);
52 (*vertices)[7] = (*vertices)[3], (*vertices)[7].z() += obj->size(2);
56 const Eigen::Matrix4d& world2camera_pose,
58 Eigen::Vector2d* pt2d) {
59 Eigen::Vector4d local_pt =
static_cast<Eigen::Matrix<double, 4, 1, 0, 4, 1>
>(
60 world2camera_pose * Eigen::Vector4d(pt3d(0), pt3d(1), pt3d(2), 1));
61 if (local_pt[2] > 0) {
63 (camera_model->Project(Eigen::Vector3f(
64 static_cast<float>(local_pt[0]),
static_cast<float>(local_pt[1]),
65 static_cast<float>(local_pt[2]))))
89 const Eigen::Affine3d& camera_sensor2world_pose,
90 double camera_ts,
double camera_max_dist,
91 bool motion_compensation,
bool all_in) {
92 constexpr float kFloatEpsilon = std::numeric_limits<float>::epsilon();
93 float in_view_ratio = 0.0f;
94 Eigen::Matrix4d world2sensor_pose =
95 camera_sensor2world_pose.matrix().inverse();
96 if (!world2sensor_pose.allFinite()) {
99 double width =
static_cast<double>(camera_model->get_width());
100 double height =
static_cast<double>(camera_model->get_height());
103 camera_ts - sensor_object->GetBaseObject()->latest_tracked_time;
104 Eigen::Vector3f offset =
105 sensor_object->GetBaseObject()->velocity *
static_cast<float>(time_diff);
106 if (!motion_compensation) {
111 sensor_object->GetBaseObject()->lidar_supplement.cloud_world;
112 Eigen::Vector3d center = sensor_object->GetBaseObject()->center;
113 Eigen::Vector2d center2d;
114 if (!
Pt3dToCamera2d(center, world2sensor_pose, camera_model, ¢er2d)) {
115 return in_view_ratio;
117 double obj_length = sensor_object->GetBaseObject()->size(0);
118 double obj_width = sensor_object->GetBaseObject()->size(1);
119 double obj_height = sensor_object->GetBaseObject()->size(2);
120 if (cloud.size() > 0) {
122 int point_num =
static_cast<int>(cloud.size());
123 int in_view_point_num = 0;
124 for (
int i = 0; i < point_num; ++i) {
125 const auto& pt = cloud.at(i);
126 Eigen::Vector3d pt3d(pt.x + offset[0], pt.y + offset[1],
128 Eigen::Vector2d pt2d;
129 bool flag =
Pt3dToCamera2d(pt3d, world2sensor_pose, camera_model, &pt2d);
134 in_view_ratio =
static_cast<float>(in_view_point_num / point_num);
136 in_view_ratio = (in_view_point_num == point_num) ? 1.0 : 0.0;
141 EigenVector<Eigen::Vector3d> box3d_vs(8);
143 EigenVector<Eigen::Vector2f> box2d_vs;
144 box2d_vs.reserve(box3d_vs.size());
145 for (
const auto& box3d_v : box3d_vs) {
146 Eigen::Vector2d pt2d;
148 world2sensor_pose, camera_model, &pt2d);
150 return in_view_ratio;
152 box2d_vs.push_back(pt2d.cast<
float>());
154 Eigen::Vector2d top_left;
155 Eigen::Vector2d bottom_right;
156 top_left.setConstant(std::numeric_limits<double>::max());
157 bottom_right = -top_left;
158 for (
const auto& box2d_v : box2d_vs) {
159 top_left = top_left.cwiseMin(box2d_v.cast<
double>());
160 bottom_right = bottom_right.cwiseMax(box2d_v.cast<
double>());
162 Eigen::Vector2d box_size = bottom_right - top_left;
163 Eigen::Vector2d bound_top_left =
164 top_left.cwiseMax(Eigen::Vector2d(0.0, 0.0));
165 Eigen::Vector2d bound_bottom_right =
166 bottom_right.cwiseMin(Eigen::Vector2d(width, height));
167 Eigen::Vector2d bound_box_size = bound_bottom_right - bound_top_left;
168 if ((bound_box_size.array() > 0.0).all()) {
170 static_cast<float>(bound_box_size.prod() / box_size.prod());
175 in_view_ratio = std::abs(1.0 - in_view_ratio) <= 1e-6 ? 1.0 : 0.0;
178 if (!((center2d.array() > 0.0).all())) {
180 }
else if (center2d.x() > width || center2d.y() > height) {
189 const double max_dist = camera_max_dist;
191 const double dist_slope = 0.25;
192 auto sigmoid_like_fun = [max_dist, dist_slope](
double obj_dist) {
193 double x = obj_dist - max_dist;
194 return 0.5 - 0.5 * x * dist_slope /
195 std::sqrt(1 + x * x * dist_slope * dist_slope);
197 Eigen::Vector4d center3d_local = world2sensor_pose * center.homogeneous();
198 double dist_to_camera = center3d_local.z();
199 return static_cast<float>(in_view_ratio * sigmoid_like_fun(dist_to_camera));