Apollo 11.0
自动驾驶开放平台
conti_ars_tracker.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2018 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
17
18#include "modules/perception/radar_detection/proto/tracker_config.pb.h"
19
20#include "cyber/common/file.h"
21#include "cyber/common/log.h"
23
24namespace apollo {
25namespace perception {
26namespace radar {
27
28double ContiArsTracker::s_tracking_time_win_ = 0.06;
29
31 : BaseTracker(), matcher_(nullptr), track_manager_(nullptr) {
32 name_ = "ContiArsTracker";
33}
34
36 if (track_manager_ != nullptr) {
37 delete track_manager_;
38 }
39}
40
42 std::string config_file =
43 GetConfigFile(options.config_path, options.config_file);
44
45 TrackerConfig config;
46 ACHECK(cyber::common::GetProtoFromFile(config_file, &config));
47
48 s_tracking_time_win_ = config.tracking_time_window();
49
50 std::string chosen_filter = config.chosen_filter();
51 RadarTrack::SetChosenFilter(chosen_filter);
52
53 int tracked_times_threshold = config.tracked_times_threshold();
54 RadarTrack::SetTrackedTimesThreshold(tracked_times_threshold);
55
56 bool use_filter = config.use_filter();
57 RadarTrack::SetUseFilter(use_filter);
58
59 // Or use register class instead.
60 MatcherInitOptions matcher_init_options;
61 auto matcher_param = config.matcher_param();
62 matcher_init_options.config_path = matcher_param.config_path();
63 matcher_init_options.config_file = matcher_param.config_file();
64 BaseMatcher *matcher =
65 BaseMatcherRegisterer::GetInstanceByName(matcher_param.name());
66 CHECK_NOTNULL(matcher);
67 matcher_.reset(matcher);
68 ACHECK(matcher_->Init(matcher_init_options))
69 << "Failed to init radar preprocessor.";
70
71 track_manager_ = new RadarTrackManager();
72 ACHECK(track_manager_ != nullptr)
73 << "Failed to get RadarTrackManager instance.";
74 return true;
75}
76
77bool ContiArsTracker::Track(const base::Frame &detected_frame,
78 const TrackerOptions &options,
79 base::FramePtr tracked_frame) {
80 TrackObjects(detected_frame);
81 CollectTrackedFrame(tracked_frame);
82 return true;
83}
84
85void ContiArsTracker::TrackObjects(const base::Frame &radar_frame) {
86 std::vector<TrackObjectPair> assignments;
87 std::vector<size_t> unassigned_tracks;
88 std::vector<size_t> unassigned_objects;
89 TrackObjectMatcherOptions matcher_options;
90 const auto &radar_tracks = track_manager_->GetTracks();
91 matcher_->Match(radar_tracks, radar_frame, matcher_options, &assignments,
92 &unassigned_tracks, &unassigned_objects);
93 UpdateAssignedTracks(radar_frame, assignments);
94 UpdateUnassignedTracks(radar_frame, unassigned_tracks);
95 DeleteLostTracks();
96 CreateNewTracks(radar_frame, unassigned_objects);
97}
98
99void ContiArsTracker::UpdateAssignedTracks(
100 const base::Frame &radar_frame, std::vector<TrackObjectPair> assignments) {
101 auto &radar_tracks = track_manager_->mutable_tracks();
102 for (size_t i = 0; i < assignments.size(); ++i) {
103 radar_tracks[assignments[i].first]->UpdataObsRadar(
104 radar_frame.objects[assignments[i].second], radar_frame.timestamp);
105 }
106}
107
108void ContiArsTracker::UpdateUnassignedTracks(
109 const base::Frame &radar_frame,
110 const std::vector<size_t> &unassigned_tracks) {
111 double timestamp = radar_frame.timestamp;
112 auto &radar_tracks = track_manager_->mutable_tracks();
113 for (size_t i = 0; i < unassigned_tracks.size(); ++i) {
114 if (radar_tracks[unassigned_tracks[i]]->GetObs() != nullptr) {
115 double radar_time = radar_tracks[unassigned_tracks[i]]->GetTimestamp();
116 double time_diff = fabs(timestamp - radar_time);
117 if (time_diff > s_tracking_time_win_) {
118 radar_tracks[unassigned_tracks[i]]->SetDead();
119 }
120 } else {
121 radar_tracks[unassigned_tracks[i]]->SetDead();
122 }
123 }
124}
125
126void ContiArsTracker::DeleteLostTracks() { track_manager_->RemoveLostTracks(); }
127
128void ContiArsTracker::CreateNewTracks(
129 const base::Frame &radar_frame,
130 const std::vector<size_t> &unassigned_objects) {
131 for (size_t i = 0; i < unassigned_objects.size(); ++i) {
132 RadarTrackPtr radar_track;
133 radar_track.reset(new RadarTrack(radar_frame.objects[unassigned_objects[i]],
134 radar_frame.timestamp));
135 track_manager_->AddTrack(radar_track);
136 }
137}
138
139void ContiArsTracker::CollectTrackedFrame(base::FramePtr tracked_frame) {
140 if (tracked_frame == nullptr) {
141 AERROR << "tracked_frame is nullptr";
142 return;
143 }
144 auto &objects = tracked_frame->objects;
145 const auto &radar_tracks = track_manager_->GetTracks();
146 for (size_t i = 0; i < radar_tracks.size(); ++i) {
147 if (radar_tracks[i]->ConfirmTrack()) {
148 base::ObjectPtr object = base::ObjectPtr(new base::Object());
149 const base::ObjectPtr &track_object = radar_tracks[i]->GetObs();
150 *object = *track_object;
151 object->tracking_time = radar_tracks[i]->GetTrackingTime();
152 object->track_id = radar_tracks[i]->GetObsId();
153 object->latest_tracked_time = radar_tracks[i]->GetTimestamp();
154 objects.push_back(object);
155 }
156 }
157}
158
160
161} // namespace radar
162} // namespace perception
163} // namespace apollo
bool Init(const TrackerInitOptions &options) override
Init ContiArsTracker config
bool Track(const base::Frame &detected_frame, const TrackerOptions &options, base::FramePtr tracked_frame) override
Tracking objects.
std::vector< RadarTrackPtr > & mutable_tracks()
Get tracked targets, which can modify data.
int RemoveLostTracks()
Remove already lost targets.
const std::vector< RadarTrackPtr > & GetTracks() const
Get the Tracks object
void AddTrack(const RadarTrackPtr &track)
Add radar tracked object.
static void SetChosenFilter(const std::string &chosen_filter)
Set the Chosen Filter object
static void SetUseFilter(bool use_filter)
Set the Use Filter object
static void SetTrackedTimesThreshold(const int &threshold)
Set the Tracked Times Threshold object
#define ACHECK(cond)
Definition log.h:80
#define AERROR
Definition log.h:44
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,...
Definition file.cc:132
std::shared_ptr< Object > ObjectPtr
Definition object.h:127
std::shared_ptr< Frame > FramePtr
Definition frame.h:60
std::shared_ptr< RadarTrack > RadarTrackPtr
std::string GetConfigFile(const std::string &config_path, const std::string &config_file)
Definition util.cc:80
class register implement
Definition arena_queue.h:37
#define PERCEPTION_REGISTER_TRACKER(name)
std::vector< std::shared_ptr< Object > > objects
Definition frame.h:48
optional perception::PluginParam matcher_param