| 249 | } |
| 250 | |
| 251 | void LoopClosure::updateGlobalMap() { |
| 252 | for (auto point_landmark_map : global_map_->getMapPoints()) { |
| 253 | uint64_t landmark_id = point_landmark_map.first; |
| 254 | Landmark point_landmark = point_landmark_map.second; |
| 255 | |
| 256 | Eigen::Vector3d point_3d = Eigen::Vector3d::Zero(); |
| 257 | Eigen::Vector3d color = Eigen::Vector3d::Zero(); |
| 258 | double quality = 0.0; |
| 259 | uint64_t total_observations = 0; |
| 260 | for (auto kf_observation : point_landmark.keyframe_observations_) { |
| 261 | uint64_t kf_id = kf_observation.first; |
| 262 | Observation obs = kf_observation.second; |
| 263 | Eigen::Vector3d local_pos = obs.local_pos_; |
| 264 | double kf_quality = obs.quality_; |
| 265 | |
| 266 | // Converting to global coordinates |
| 267 | if (kfMapper_.find(kf_id) == kfMapper_.end()) { |
| 268 | LOG(WARNING) << "Keyframe not found"; |
| 269 | continue; |
| 270 | } |
| 271 | |
| 272 | Keyframe* kf = kfMapper_.find(kf_id)->second; |
| 273 | Eigen::Matrix3d R_kf_w; |
| 274 | Eigen::Vector3d T_kf_w; |
| 275 | kf->getPose(T_kf_w, R_kf_w); |
| 276 | |
| 277 | Eigen::Vector3d global_pos = R_kf_w * local_pos + T_kf_w; |
| 278 | point_3d = point_3d + global_pos * kf_quality; |
| 279 | color = color + obs.color_ * kf_quality; |
| 280 | quality = quality + kf_quality; |
| 281 | total_observations += 1; |
| 282 | } |
| 283 | |
| 284 | point_3d = point_3d / quality; |
| 285 | color = color / quality; |
| 286 | quality = quality / total_observations; |
| 287 | |
| 288 | global_map_->updateLandmark(landmark_id, point_3d, quality, color); |
| 289 | } |
| 290 | } |
| 291 | |
| 292 | // void LoopClosure::updatePrimiteEstimatorTrajectory(const nav_msgs::OdometryConstPtr& pose_msg) { |
| 293 | // geometry_msgs::PoseStamped pose_stamped; |
nothing calls this directly
no test coverage detected