126 pthread_mutex_unlock(&buffer_mutex_);
130template <
class MessageType>
132 pthread_mutex_lock(&buffer_mutex_);
135 pthread_mutex_unlock(&buffer_mutex_);
138template <
class MessageType>
140 capacity_ = capacity;
143template <
class MessageType>
145 std::list<std::pair<double, MessageType>> *msg_list) {
146 pthread_mutex_lock(&buffer_mutex_);
148 std::copy(msg_list_.begin(), msg_list_.end(), std::back_inserter(*msg_list));
149 pthread_mutex_unlock(&buffer_mutex_);
152template <
class MessageType>
155 pthread_mutex_lock(&buffer_mutex_);
156 flag = msg_list_.empty();
157 pthread_mutex_unlock(&buffer_mutex_);
161template <
class MessageType>
163 unsigned int size = 0;
164 pthread_mutex_lock(&buffer_mutex_);
165 size =
static_cast<unsigned int>(msg_list_.size());
166 pthread_mutex_unlock(&buffer_mutex_);
172template <
class MessageType>
176template <
class MessageType>
179template <
class MessageType>
181 const double timestamp, MessageType *msg,
double timeout_s) {
182 std::map<double, ListIterator> msg_map_tem;
183 std::list<std::pair<double, MessageType>> msg_list_tem;
185 if (!WaitMessageBufferOk(timestamp, &msg_map_tem, &msg_list_tem,
190 auto found_iter = msg_map_tem.find(timestamp);
191 if (found_iter != msg_map_tem.end()) {
192 *msg = found_iter->second->second;
197 if (begin_iter->first > timestamp) {
203 for (
ListIterator iter = msg_list_tem.end(); iter != msg_list_tem.begin();) {
205 if (iter->first > timestamp) {
210 double delta_time = after_iter->first - before_iter->first;
214 if (std::abs(delta_time) < 1e-9) {
215 AERROR <<
"Delta_time is too small.";
218 double scale = (timestamp - before_iter->first) / delta_time;
219 *msg = before_iter->second.interpolate(scale, after_iter->second);
220 msg->timestamp = timestamp;
227template <
class MessageType>
229 const double timestamp, std::map<double, ListIterator> *msg_map,
230 std::list<std::pair<double, MessageType>> *msg_list,
double timeout_ms) {
231 boost::posix_time::ptime start_time =
232 boost::posix_time::microsec_clock::local_time();
233 pthread_mutex_lock(&(this->buffer_mutex_));
235 std::copy(this->msg_list_.begin(), this->msg_list_.end(),
236 std::back_inserter(*msg_list));
237 *msg_map = this->msg_map_;
238 pthread_mutex_unlock(&(this->buffer_mutex_));
240 if (msg_list->empty()) {
241 AERROR <<
"The queried buffer is empty.";
245 ListIterator last_iter = msg_list->end();
248 if (last_iter->first < timestamp && timeout_ms < 5000) {
252 while (last_iter->first < timestamp) {
253 AINFO <<
"Waiting new message!";
254 std::this_thread::sleep_for(std::chrono::milliseconds(5));
255 pthread_mutex_lock(&(this->buffer_mutex_));
257 std::copy(this->msg_list_.begin(), this->msg_list_.end(),
258 std::back_inserter(*msg_list));
259 *msg_map = this->msg_map_;
260 pthread_mutex_unlock(&(this->buffer_mutex_));
261 last_iter = msg_list->end();
264 boost::posix_time::ptime end_time =
265 boost::posix_time::microsec_clock::local_time();
266 boost::posix_time::time_duration during_time = end_time - start_time;
268 if (during_time.total_milliseconds() >= timeout_ms) {
269 AERROR <<
"Waiting time is out";
280 stop_visualization_(false),
281 lidar_frame_buffer_(10),
282 gnss_loc_info_buffer_(20),
283 lidar_loc_info_buffer_(40),
284 fusion_loc_info_buffer_(400) {}
287 if (!(stop_visualization_.load())) {
288 stop_visualization_ =
true;
289 visual_thread_.join();
294 const std::string &map_visual_folder,
295 const Eigen::Affine3d &velodyne_extrinsic,
297 AINFO <<
"Get zone id.";
298 unsigned int resolution_id = 0;
301 bool success = GetZoneIdFromMapFolder(map_folder, resolution_id, &zone_id);
303 AERROR <<
"Get zone id failed.";
306 AINFO <<
"Get zone id succeed.";
308 AINFO <<
"Init visualization engine.";
309 success = visual_engine_.
Init(map_folder, map_visual_folder, map_param,
310 resolution_id, zone_id, velodyne_extrinsic,
313 AERROR <<
"Visualization engine init failed.";
316 AINFO <<
"Visualization engine init succeed.";
334 AINFO <<
"AddLidarFrame.";
336 AINFO <<
"id." << id;
337 lidar_frame_buffer_.PushNewMessage(lidar_frame.
timestamp, lidar_frame);
343 AINFO <<
"AddGNSSLocMessage.";
344 gnss_loc_info_buffer_.PushNewMessage(gnss_loc_msg.
timestamp, gnss_loc_msg);
349 AINFO <<
"AddLidarLocMessage.";
350 lidar_loc_info_buffer_.PushNewMessage(lidar_loc_msg.
timestamp, lidar_loc_msg);
355 AINFO <<
"AddFusionLocMessage.";
356 fusion_loc_info_buffer_.PushNewMessage(fusion_loc_msg.
timestamp,
361 visual_thread_ = std::thread(&VisualizationManager::DoVisualize,
this);
365 stop_visualization_ =
true;
366 visual_thread_.join();
369void VisualizationManager::DoVisualize() {
370 while (!(stop_visualization_.load())) {
371 std::this_thread::sleep_for(std::chrono::milliseconds(10));
373 if (lidar_frame_buffer_.BufferSize() > 5) {
375 bool pop_success = lidar_frame_buffer_.PopOldestMessage(&lidar_frame);
382 bool lidar_query_success = lidar_loc_info_buffer_.QueryMessage(
387 bool fusion_query_success = fusion_loc_info_buffer_.QueryMessage(
390 if (!lidar_query_success && !fusion_query_success) {
394 LocalizatonInfo lidar_loc_info;
395 LocalizatonInfo fusion_loc_info;
396 LocalizatonInfo gnss_loc_info;
398 if (lidar_query_success) {
399 Eigen::Translation3d trans(
400 Eigen::Vector3d(lidar_loc.x, lidar_loc.y, lidar_loc.z));
401 Eigen::Quaterniond quat(lidar_loc.qw, lidar_loc.qx, lidar_loc.qy,
404 const Eigen::Vector3d lidar_std(lidar_loc.std_x, lidar_loc.std_y,
407 lidar_loc_info.set(trans, quat, lidar_std,
"Lidar.",
411 if (fusion_query_success) {
412 Eigen::Translation3d trans(
413 Eigen::Vector3d(fusion_loc.x, fusion_loc.y, fusion_loc.z));
414 Eigen::Quaterniond quat(fusion_loc.qw, fusion_loc.qx, fusion_loc.qy,
417 const Eigen::Vector3d fusion_std(fusion_loc.std_x, fusion_loc.std_y,
420 fusion_loc_info.set(trans, quat, fusion_std,
"Fusion.",
425 bool success = gnss_loc_info_buffer_.GetMessageBefore(
428 Eigen::Translation3d trans(
429 Eigen::Vector3d(gnss_loc.x, gnss_loc.y, gnss_loc.z));
431 const Eigen::Vector3d gnss_std(gnss_loc.std_x, gnss_loc.std_y,
434 gnss_loc_info.set(trans, gnss_std,
"GNSS.", lidar_frame.
timestamp,
439 lidar_loc_info, fusion_loc_info, gnss_loc_info};
440 visual_engine_.
Visualize(std::move(loc_infos), lidar_frame.
pt3ds);
445bool VisualizationManager::GetZoneIdFromMapFolder(
446 const std::string &map_folder,
const unsigned int resolution_id,
449 snprintf(buf,
sizeof(buf),
"/%03u", resolution_id);
450 std::string folder_north = map_folder +
"/map" + buf +
"/north";
451 std::string folder_south = map_folder +
"/map" + buf +
"/south";
452 boost::filesystem::directory_iterator directory_end;
453 boost::filesystem::directory_iterator iter_north(folder_north);
454 if (iter_north == directory_end) {
455 boost::filesystem::directory_iterator iter_south(folder_south);
456 if (iter_south == directory_end) {
459 std::string zone_id_full_path = (*iter_south).path().string();
460 std::size_t pos = zone_id_full_path.find_last_of(
"/");
461 std::string zone_id_str =
462 zone_id_full_path.substr(pos + 1, zone_id_full_path.length());
464 *zone_id = -(std::stoi(zone_id_str));
465 AINFO <<
"Find zone id: " << *zone_id;
469 std::string zone_id_full_path = (*iter_north).path().string();
470 std::size_t pos = zone_id_full_path.find_last_of(
"/");
471 std::string zone_id_str =
472 zone_id_full_path.substr(pos + 1, zone_id_full_path.length());
474 *zone_id = (std::stoi(zone_id_str));
475 AINFO <<
"Find zone id: " << *zone_id;