30namespace localization {
41 AERROR <<
"InitParams failed.";
46 AERROR <<
"InitIO failed.";
55bool OnlineVisualizerComponent::InitConfig() {
56 map_folder_ = FLAGS_map_dir +
"/" + FLAGS_local_map_name;
57 map_visual_folder_ = FLAGS_map_visual_dir;
58 lidar_extrinsic_file_ = FLAGS_lidar_extrinsics_file;
60 lidar_local_topic_ = FLAGS_localization_lidar_topic;
61 gnss_local_topic_ = FLAGS_localization_gnss_topic;
62 fusion_local_topic_ = FLAGS_localization_topic;
63 ndt_local_topic_ = FLAGS_localization_ndt_topic;
65 Eigen::Affine3d velodyne_extrinsic;
69 AERROR <<
"Load lidar extrinsic failed." << std::endl;
72 std::cout <<
"Load lidar extrinsic succeed." << std::endl;
74 pyramid_map::BaseMapConfig map_config;
75 std::string config_file = map_folder_ +
"/config.xml";
76 map_config.map_version_ =
"lossy_map";
77 success = map_config.Load(config_file);
79 AERROR <<
"Load map config failed." << std::endl;
82 std::cout <<
"Load map config succeed." << std::endl;
84 VisualMapParam map_param;
85 map_param.set(map_config.map_resolutions_, map_config.map_node_size_x_,
86 map_config.map_node_size_y_, map_config.map_range_.GetMinX(),
87 map_config.map_range_.GetMinY(),
88 map_config.map_range_.GetMaxX(),
89 map_config.map_range_.GetMaxY());
91 map_folder_, map_visual_folder_, velodyne_extrinsic, map_param);
98bool OnlineVisualizerComponent::InitIO() {
100 std::function<void(
const std::shared_ptr<LocalizationEstimate> &)>
102 std::bind(&OnlineVisualizerComponent::OnLidarLocalization,
this,
103 std::placeholders::_1);
104 lidar_local_listener_ = this->
node_->CreateReader<LocalizationEstimate>(
105 lidar_local_topic_, lidar_local_call);
108 std::function<void(
const std::shared_ptr<LocalizationEstimate> &)>
110 std::bind(&OnlineVisualizerComponent::OnGNSSLocalization,
this,
111 std::placeholders::_1);
112 gnss_local_listener_ = this->
node_->CreateReader<LocalizationEstimate>(
113 gnss_local_topic_, gnss_local_call);
116 std::function<void(
const std::shared_ptr<LocalizationEstimate> &)>
118 std::bind(&OnlineVisualizerComponent::OnFusionLocalization,
this,
119 std::placeholders::_1);
120 fusion_local_listener_ = this->
node_->CreateReader<LocalizationEstimate>(
121 fusion_local_topic_, fusion_local_call);
124 std::function<void(
const std::shared_ptr<LocalizationEstimate> &)>
126 std::bind(&OnlineVisualizerComponent::OnLidarLocalization,
this,
127 std::placeholders::_1);
128 lidar_local_listener_ = this->
node_->CreateReader<LocalizationEstimate>(
129 ndt_local_topic_, ndt_local_call);
135 const std::shared_ptr<drivers::PointCloud> &msg) {
139 std::vector<unsigned char> intensities;
140 ParsePointCloudMessage(msg, &lidar_vis_frame.
pt3ds, &intensities);
142 static unsigned int id = 1;
150void OnlineVisualizerComponent::OnLidarLocalization(
151 const std::shared_ptr<LocalizationEstimate> &msg) {
154 lidar_loc_msg.
timestamp = msg->measurement_time();
155 lidar_loc_msg.
x = msg->pose().position().x();
156 lidar_loc_msg.
y = msg->pose().position().y();
157 lidar_loc_msg.
z = msg->pose().position().z();
159 lidar_loc_msg.
qx = msg->pose().orientation().qx();
160 lidar_loc_msg.
qy = msg->pose().orientation().qy();
161 lidar_loc_msg.
qz = msg->pose().orientation().qz();
162 lidar_loc_msg.
qw = msg->pose().orientation().qw();
164 if (msg->has_uncertainty() &&
165 !std::isnan(msg->uncertainty().position_std_dev().x()) &&
166 !std::isnan(msg->uncertainty().position_std_dev().y()) &&
167 msg->uncertainty().position_std_dev().x() > 0 &&
168 msg->uncertainty().position_std_dev().y() > 0) {
169 lidar_loc_msg.
std_x = msg->uncertainty().position_std_dev().x();
170 lidar_loc_msg.
std_y = msg->uncertainty().position_std_dev().y();
171 lidar_loc_msg.
std_z = msg->uncertainty().position_std_dev().z();
177void OnlineVisualizerComponent::OnGNSSLocalization(
178 const std::shared_ptr<LocalizationEstimate> &msg) {
179 LocalizationMsg gnss_loc_msg;
181 gnss_loc_msg.timestamp = msg->measurement_time();
182 gnss_loc_msg.x = msg->pose().position().x();
183 gnss_loc_msg.y = msg->pose().position().y();
184 gnss_loc_msg.z = msg->pose().position().z();
186 gnss_loc_msg.qx = msg->pose().orientation().qx();
187 gnss_loc_msg.qy = msg->pose().orientation().qy();
188 gnss_loc_msg.qz = msg->pose().orientation().qz();
189 gnss_loc_msg.qw = msg->pose().orientation().qw();
191 if (msg->has_uncertainty() &&
192 !std::isnan(msg->uncertainty().position_std_dev().x()) &&
193 !std::isnan(msg->uncertainty().position_std_dev().y()) &&
194 msg->uncertainty().position_std_dev().x() > 0 &&
195 msg->uncertainty().position_std_dev().y() > 0) {
196 gnss_loc_msg.std_x = msg->uncertainty().position_std_dev().x();
197 gnss_loc_msg.std_y = msg->uncertainty().position_std_dev().y();
198 gnss_loc_msg.std_z = msg->uncertainty().position_std_dev().z();
204void OnlineVisualizerComponent::OnFusionLocalization(
205 const std::shared_ptr<LocalizationEstimate> &msg) {
206 LocalizationMsg fusion_loc_msg;
208 fusion_loc_msg.timestamp = msg->measurement_time();
209 fusion_loc_msg.x = msg->pose().position().x();
210 fusion_loc_msg.y = msg->pose().position().y();
211 fusion_loc_msg.z = msg->pose().position().z();
213 fusion_loc_msg.qx = msg->pose().orientation().qx();
214 fusion_loc_msg.qy = msg->pose().orientation().qy();
215 fusion_loc_msg.qz = msg->pose().orientation().qz();
216 fusion_loc_msg.qw = msg->pose().orientation().qw();
218 if (msg->has_uncertainty() &&
219 !std::isnan(msg->uncertainty().position_std_dev().x()) &&
220 !std::isnan(msg->uncertainty().position_std_dev().y()) &&
221 msg->uncertainty().position_std_dev().x() > 0 &&
222 msg->uncertainty().position_std_dev().y() > 0) {
223 fusion_loc_msg.std_x = msg->uncertainty().position_std_dev().x();
224 fusion_loc_msg.std_y = msg->uncertainty().position_std_dev().y();
225 fusion_loc_msg.std_z = msg->uncertainty().position_std_dev().z();
231void OnlineVisualizerComponent::ParsePointCloudMessage(
232 const std::shared_ptr<drivers::PointCloud> &msg,
234 std::vector<unsigned char> *intensities) {
235 CHECK_NOTNULL(pt3ds);
236 CHECK_NOTNULL(intensities);
238 if (msg->height() > 1 && msg->width() > 1) {
239 for (
unsigned int i = 0; i < msg->height(); ++i) {
240 for (
unsigned int j = 0; j < msg->width(); ++j) {
241 Eigen::Vector3d pt3d;
242 pt3d[0] =
static_cast<double>(msg->point(i * msg->width() + j).x());
243 pt3d[1] =
static_cast<double>(msg->point(i * msg->width() + j).y());
244 pt3d[2] =
static_cast<double>(msg->point(i * msg->width() + j).z());
245 if (!std::isnan(pt3d[0])) {
246 unsigned char intensity =
static_cast<unsigned char>(
247 msg->point(i * msg->width() + j).intensity());
248 pt3ds->push_back(pt3d);
249 intensities->push_back(intensity);
254 AINFO <<
"Receiving un-organized-point-cloud, width " << msg->width()
255 <<
" height " << msg->height() <<
"size " << msg->point_size();
256 for (
int i = 0; i < msg->point_size(); ++i) {
257 Eigen::Vector3d pt3d;
258 pt3d[0] =
static_cast<double>(msg->point(i).x());
259 pt3d[1] =
static_cast<double>(msg->point(i).y());
260 pt3d[2] =
static_cast<double>(msg->point(i).z());
261 if (!std::isnan(pt3d[0])) {
262 unsigned char intensity =
263 static_cast<unsigned char>(msg->point(i).intensity());
264 pt3ds->push_back(pt3d);
265 intensities->push_back(intensity);
std::shared_ptr< Node > node_
Cyber has builtin time type Time.
double ToSecond() const
convert time to second.
bool Proc(const std::shared_ptr< drivers::PointCloud > &msg) override
bool Init() override
module initialization function
~OnlineVisualizerComponent()
OnlineVisualizerComponent()
void StartVisualization()
void AddLidarLocMessage(const LocalizationMsg &lidar_loc_msg)
void AddFusionLocMessage(const LocalizationMsg &fusion_loc_msg)
static VisualizationManager & GetInstance()
void AddLidarFrame(const LidarVisFrame &lidar_frame)
bool Init(const std::string &map_folder, const std::string &map_visual_folder, const Eigen::Affine3d &velodyne_extrinsic, const VisualMapParam &map_param)
void AddGNSSLocMessage(const LocalizationMsg &gnss_loc_msg)
The gflags used by localization module
EigenVector< Eigen::Vector3d > EigenVector3dVec
bool LoadExtrinsic(const std::string &file_path, Eigen::Affine3d *extrinsic)
Load the velodyne extrinsic from a YAML file.
Contains a number of helper functions related to quaternions.
unsigned int frame_id
The frame index.
::apollo::common::EigenVector3dVec pt3ds
The 3D point cloud in this frame.
double timestamp
The time stamp.
The utilities of velodyne.