21#include "modules/perception/multi_sensor_fusion/proto/pbf_gatekeeper_config.pb.h"
38 std::string config_file =
43 AERROR <<
"Read config failed: " << config_file;
64 bool invisible_in_lidar = !(track->IsLidarVisible());
65 bool invisible_in_radar = !(track->IsRadarVisible());
66 bool invisible_in_camera = !(track->IsCameraVisible());
67 if (invisible_in_lidar && invisible_in_radar &&
69 auto sensor_obj = track->GetFusedObject();
70 if (sensor_obj !=
nullptr && sensor_obj->GetBaseObject()->sub_type !=
75 time_t rawtime =
static_cast<time_t
>(track->GetFusedObject()->GetTimestamp());
79 localtime_r(&rawtime, &timeinfo);
80 bool is_night = (timeinfo.tm_hour >= 23);
81 if (!LidarAbleToPublish(track) && !RadarAbleToPublish(track, is_night) &&
82 !CameraAbleToPublish(track, is_night)) {
86 track->AddTrackedTimes();
88 track->GetTrackedTimes() <=
95bool PbfGatekeeper::LidarAbleToPublish(
const TrackPtr &track) {
96 bool visible_in_lidar = track->IsLidarVisible();
103bool PbfGatekeeper::RadarAbleToPublish(
const TrackPtr &track,
bool is_night) {
108 bool visible_in_radar = track->IsRadarVisible();
110 if (!visible_in_radar || radar_object ==
nullptr) {
114 if (radar_object->GetSensorId() ==
"radar_front") {
115 if (radar_object->GetBaseObject()->radar_supplement.range >
117 radar_object->GetBaseObject()->radar_supplement.angle <
119 auto base_obj = track->GetFusedObject()->GetBaseObject();
120 double heading_v = std::abs(base_obj->velocity.dot(base_obj->direction));
121 auto set_velocity_to_zero = [heading_v, track]() {
122 if (heading_v < 0.3) {
123 track->GetFusedObject()->GetBaseObject()->velocity.setZero();
127 double toic_p = track->GetToicProb();
130 set_velocity_to_zero();
136 double v_slope = 1.0;
137 auto heading_v_decision = [](
double x,
double c,
double k) {
139 return 0.5 + 0.5 * x * k / std::sqrt(1 + x * x * k * k);
141 auto fuse_two_probabilities = [](
double p1,
double p2) {
142 double p = (p1 * p2) / (2 * p1 * p2 + 1 - p1 - p2);
143 p = std::min(1.0 - std::numeric_limits<float>::epsilon(), p);
147 double min_toic_p = 0.2;
148 toic_p = std::max(min_toic_p, toic_p);
149 double v_p = heading_v_decision(heading_v, v_ct, v_slope);
150 double p = fuse_two_probabilities(toic_p, v_p);
152 set_velocity_to_zero();
157 }
else if (radar_object->GetSensorId() ==
"radar_rear") {
160 << radar_object->GetBaseObject()->radar_supplement.range
161 <<
" track_id: " << track->GetTrackId()
162 <<
" exist_prob: " << track->GetExistenceProb();
163 if (radar_object->GetBaseObject()->radar_supplement.range >
165 (radar_object->GetBaseObject()->velocity.norm() > 4.0 ||
174bool PbfGatekeeper::CameraAbleToPublish(
const TrackPtr &track,
bool is_night) {
175 bool visible_in_camera = track->IsCameraVisible();
177 auto iter = camera_objects.find(
"front_6mm");
178 auto iter_narrow = camera_objects.find(
"front_12mm");
179 iter = iter != camera_objects.end() ? iter : iter_narrow;
180 if (camera_objects.find(
"camera_rear") != camera_objects.end()) {
181 iter = camera_objects.find(
"camera_rear");
182 }
else if (camera_objects.find(
"camera_front") != camera_objects.end()) {
183 iter = camera_objects.find(
"camera_front");
187 iter != camera_objects.end() && params_.
use_camera_3d && !is_night) {
190 camera_object->GetBaseObject()->camera_supplement.local_center.norm();
192 if ((camera_object->GetBaseObject()->sub_type ==
195 double exist_prob = track->GetExistenceProb();
197 static int cnt_cam = 1;
198 AINFO <<
"publish camera only object : cnt = " << cnt_cam;
#define PERCEPTION_REGISTER_GATEKEEPER(name)
bool Init(const GatekeeperInitOptions &options) override
Initialize
bool AbleToPublish(const TrackPtr &track) override
whether able to publish
bool GetProtoFromFile(const std::string &file_name, google::protobuf::Message *message)
Parses the content of the file specified by the file_name as a representation of protobufs,...
std::string GetAbsolutePath(const std::string &prefix, const std::string &relative_path)
Get absolute path by concatenating prefix and relative_path.
std::shared_ptr< const SensorObject > SensorObjectConstPtr
std::shared_ptr< Track > TrackPtr
std::map< std::string, SensorObjectPtr > SensorId2ObjectMap
std::string GetConfigFile(const std::string &config_path, const std::string &config_file)
optional double existence_threshold
optional int32 pub_track_time_thresh
optional double invisible_period_threshold
optional double min_camera_publish_distance
optional double min_radar_confident_distance
optional bool publish_if_has_lidar
optional bool use_camera_3d
optional bool publish_if_has_camera
optional bool use_track_time_pub_strategy
optional double max_radar_confident_angle
optional bool publish_if_has_radar
optional double toic_threshold
optional double radar_existence_threshold
bool use_track_time_pub_strategy
double invisible_period_threshold
bool publish_if_has_lidar
double min_radar_confident_distance
double min_camera_publish_distance
bool publish_if_has_radar
bool publish_if_has_camera
int pub_track_time_thresh
double existence_threshold
double max_radar_confident_angle
double radar_existence_threshold