Apollo  6.0
Open source self driving car software
visualization_manager.h
Go to the documentation of this file.
1 /******************************************************************************
2  * Copyright 2017 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  *****************************************************************************/
16 
21 #pragma once
22 
23 #include <atomic>
24 #include <list>
25 #include <map>
26 #include <string>
27 #include <thread>
28 #include <utility>
29 #include <vector>
30 
33 
34 namespace apollo {
35 namespace localization {
36 namespace msf {
37 
38 struct LidarVisFrame {
40  unsigned int frame_id;
42  double timestamp;
45 };
46 
48  double timestamp = 0.0;
49  double x = 0;
50  double y = 0;
51  double z = 0;
52 
53  double qx = 0.0;
54  double qy = 0.0;
55  double qz = 0.0;
56  double qw = 0.0;
57 
58  double std_x = 0;
59  double std_y = 0;
60  double std_z = 0;
61 
62  LocalizationMsg interpolate(const double scale,
63  const LocalizationMsg &loc_msg) {
64  LocalizationMsg res;
65  res.x = this->x * (1 - scale) + loc_msg.x * scale;
66  res.y = this->y * (1 - scale) + loc_msg.y * scale;
67  res.z = this->z * (1 - scale) + loc_msg.z * scale;
68 
69  Eigen::Quaterniond quatd1(this->qw, this->qx, this->qy, this->qz);
70  Eigen::Quaterniond quatd2(loc_msg.qw, loc_msg.qx, loc_msg.qy, loc_msg.qz);
71  Eigen::Quaterniond res_quatd = quatd1.slerp(scale, quatd2);
72  res.qx = res_quatd.x();
73  res.qy = res_quatd.y();
74  res.qz = res_quatd.z();
75  res.qw = res_quatd.w();
76 
77  res.std_x = this->std_x * (1 - scale) + loc_msg.std_x * scale;
78  res.std_y = this->std_y * (1 - scale) + loc_msg.std_y * scale;
79  res.std_z = this->std_z * (1 - scale) + loc_msg.std_z * scale;
80 
81  return res;
82  }
83 };
84 
85 template <class MessageType>
87  public:
88  typedef
89  typename std::list<std::pair<double, MessageType>>::iterator ListIterator;
90 
91  public:
92  explicit MessageBuffer(int capacity);
93  ~MessageBuffer();
94 
95  bool PushNewMessage(const double timestamp, const MessageType &msg);
96  bool PopOldestMessage(MessageType *msg);
97  bool GetMessageBefore(const double timestamp, MessageType *msg);
98  bool GetMessage(const double timestamp, MessageType *msg);
99 
100  void Clear();
101 
102  void SetCapacity(const unsigned int capacity);
103  void GetAllMessages(std::list<std::pair<double, MessageType>> *msg_list);
104 
105  bool IsEmpty();
106  unsigned int BufferSize();
107 
108  protected:
109  std::map<double, ListIterator> msg_map_;
110  std::list<std::pair<double, MessageType>> msg_list_;
111 
112  protected:
113  pthread_mutex_t buffer_mutex_;
114  unsigned int capacity_;
115 };
116 
117 template <class MessageType>
118 class IntepolationMessageBuffer : public MessageBuffer<MessageType> {
119  public:
120  typedef
121  typename std::list<std::pair<double, MessageType>>::iterator ListIterator;
122 
123  public:
124  explicit IntepolationMessageBuffer(int capacity);
126 
127  bool QueryMessage(const double timestamp, MessageType *msg,
128  double timeout_s = 0.01);
129 
130  private:
131  bool WaitMessageBufferOk(const double timestamp,
132  std::map<double, ListIterator> *msg_map,
133  std::list<std::pair<double, MessageType>> *msg_list,
134  double timeout_ms);
135 };
136 
138  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
139  std::string map_folder;
140  std::string map_visual_folder;
147 };
148 
150 #define LOC_INFO_NUM 3
151 
152  public:
153  VisualizationManager();
154  ~VisualizationManager();
155 
157  static VisualizationManager visual_manage;
158  return visual_manage;
159  }
160 
161  bool Init(const std::string &map_folder, const std::string &map_visual_folder,
162  const Eigen::Affine3d &velodyne_extrinsic,
163  const VisualMapParam &map_param);
164  bool Init(const VisualizationManagerParams &params);
165 
166  void AddLidarFrame(const LidarVisFrame &lidar_frame);
167  void AddGNSSLocMessage(const LocalizationMsg &gnss_loc_msg);
168  void AddLidarLocMessage(const LocalizationMsg &lidar_loc_msg);
169  void AddFusionLocMessage(const LocalizationMsg &fusion_loc_msg);
170  void StartVisualization();
171  void StopVisualization();
172 
173  private:
174  void DoVisualize();
175  bool GetZoneIdFromMapFolder(const std::string &map_folder,
176  const unsigned int resolution_id, int *zone_id);
177 
178  private:
179  VisualizationEngine visual_engine_;
180  // Visualization Thread
181  std::thread visual_thread_;
182  std::atomic<bool> stop_visualization_;
183 
184  MessageBuffer<LidarVisFrame> lidar_frame_buffer_;
185  IntepolationMessageBuffer<LocalizationMsg> gnss_loc_info_buffer_;
186  IntepolationMessageBuffer<LocalizationMsg> lidar_loc_info_buffer_;
187  IntepolationMessageBuffer<LocalizationMsg> fusion_loc_info_buffer_;
188 };
189 
190 } // namespace msf
191 } // namespace localization
192 } // namespace apollo
double std_x
Definition: visualization_manager.h:58
unsigned int gnss_loc_info_buffer_capacity
Definition: visualization_manager.h:144
std::list< std::pair< double, MessageType > > msg_list_
Definition: visualization_manager.h:110
unsigned int lidar_loc_info_buffer_capacity
Definition: visualization_manager.h:145
std::list< std::pair< double, MessageType > >::iterator ListIterator
Definition: visualization_manager.h:89
unsigned int capacity_
Definition: visualization_manager.h:114
pthread_mutex_t buffer_mutex_
Definition: visualization_manager.h:113
double x
Definition: visualization_manager.h:49
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
unsigned int fusion_loc_info_buffer_capacity
Definition: visualization_manager.h:146
Definition: visualization_manager.h:137
std::string map_visual_folder
Definition: visualization_manager.h:140
unsigned int frame_id
The frame index.
Definition: visualization_manager.h:40
::apollo::common::EigenVector3dVec pt3ds
The 3D point cloud in this frame.
Definition: visualization_manager.h:44
std::map< double, ListIterator > msg_map_
Definition: visualization_manager.h:109
Definition: visualization_manager.h:149
Definition: visualization_manager.h:47
double std_y
Definition: visualization_manager.h:59
double qy
Definition: visualization_manager.h:54
double z
Definition: visualization_manager.h:51
The data structure to store parameters of a map.
Definition: visualization_engine.h:99
Eigen::Affine3d velodyne_extrinsic
Definition: visualization_manager.h:141
LocalizationMsg interpolate(const double scale, const LocalizationMsg &loc_msg)
Definition: visualization_manager.h:62
double qw
Definition: visualization_manager.h:56
EigenVector< Eigen::Vector3d > EigenVector3dVec
Definition: eigen_defs.h:38
Definition: visualization_manager.h:38
double std_z
Definition: visualization_manager.h:60
double qz
Definition: visualization_manager.h:55
bool Init(const char *binary_name)
double y
Definition: visualization_manager.h:50
std::list< std::pair< double, MessageType > >::iterator ListIterator
Definition: visualization_manager.h:121
Definition: visualization_manager.h:86
VisualMapParam map_param
Definition: visualization_manager.h:142
The engine to draw all elements for visualization.
Definition: visualization_engine.h:163
The engine for localization visualization.
double timestamp
The time stamp.
Definition: visualization_manager.h:42
double qx
Definition: visualization_manager.h:53
static VisualizationManager & GetInstance()
Definition: visualization_manager.h:156
unsigned int lidar_frame_buffer_capacity
Definition: visualization_manager.h:143
Definition: visualization_manager.h:118
MessageType
Definition: v2x_object.h:49
Eigen::Affine3d Affine3d
Definition: base_map_fwd.h:34
EIGEN_MAKE_ALIGNED_OPERATOR_NEW std::string map_folder
Definition: visualization_manager.h:139