diff --git a/include/publisher_falko.h b/include/publisher_falko.h index e4a965e387773e06fad6bedadb6c9cfdd396a925..b660abe0d27303a86cf965d63af7ba9a0ea5d9d1 100644 --- a/include/publisher_falko.h +++ b/include/publisher_falko.h @@ -51,12 +51,12 @@ class PublisherFalko : public Publisher std_msgs::ColorRGBA marker_color_target_; std_msgs::ColorRGBA marker_color_reference_; - bool extrinsics_; - SensorBasePtr sensor_; - std::string frame_id_, map_frame_id_; + bool extrinsics_; + ProcessorBaseConstPtr processor_; + std::string map_frame_id_; - FrameBasePtr last_frame; - FrameBasePtr KF_old; + FrameBaseConstPtr last_frame; + FrameBaseConstPtr KF_old; ros::Publisher pub_keypoints_; ros::Publisher pub_marker_scene_target_; @@ -64,10 +64,10 @@ class PublisherFalko : public Publisher ros::Publisher pub_marker_associations_; // Reference scene info - std::map<CaptureBasePtr, visualization_msgs::Marker> map_markers_reference_scenes_; + std::map<CaptureBaseConstPtr, visualization_msgs::Marker> map_markers_reference_scenes_; public: - PublisherFalko(const std::string &_unique_name, const ParamsServer &_server, const ProblemPtr _problem); + PublisherFalko(const std::string &_unique_name, const ParamsServer &_server, ProblemConstPtr _problem); WOLF_PUBLISHER_CREATE(PublisherFalko); virtual ~PublisherFalko(){}; @@ -76,26 +76,31 @@ class PublisherFalko : public Publisher void publishDerived() override; - void publishScene(std::vector<falkolib::FALKO> &_keypoints, laserscanutils::LaserScan &_scan, - Eigen::Vector3d &_p_rob, Eigen::Quaterniond &_q_rob, ros::Publisher &_pub_lines, - std_msgs::ColorRGBA _marker_color, int & _id, CaptureBasePtr cap); + void publishScene(const std::vector<falkolib::FALKO> &_keypoints, + const laserscanutils::LaserScan &_scan, + const Eigen::Vector3d &_p_rob, + const Eigen::Quaterniond &_q_rob, + const ros::Publisher &_pub_lines, + std_msgs::ColorRGBA _marker_color, + int _id, + CaptureBaseConstPtr cap); void publishEmpty(); - void publishAssociations(std::vector<std::pair<int, int>> &associations_, CaptureBasePtr &cap_target, - CaptureBasePtr &cap_reference); + void publishAssociations(const std::vector<std::pair<int, int>> &associations_, + CaptureBaseConstPtr cap_target, + CaptureBaseConstPtr cap_reference); - void getKeypointsAndScan(FrameBasePtr &_frame, laserscanutils::LaserScan &_scan, + void getKeypointsAndScan(FrameBaseConstPtr _frame, + laserscanutils::LaserScan &_scan, std::vector<falkolib::FALKO> &_keypoints); void getPosition(Eigen::Vector3d &p, Eigen::Quaterniond &q, VectorComposite current_state); protected: - //Eigen::Quaterniond q_frame_; - //Eigen::Vector3d t_frame_; int id_old_ = 1; - std::map<FrameBasePtr, VectorComposite> map_frame_states; + std::map<FrameBaseConstPtr, VectorComposite> map_frame_states; }; } // namespace wolf diff --git a/include/publisher_laser_map.h b/include/publisher_laser_map.h index 1af60603fbdc5e6d76f042ec00ead531066540af..c018cfb8fa86893f082e182d1ecf9a98603966de 100644 --- a/include/publisher_laser_map.h +++ b/include/publisher_laser_map.h @@ -48,7 +48,7 @@ namespace wolf struct ScanData { - CaptureLaser2dPtr capture_; + CaptureLaser2dConstPtr capture_; laserscanutils::LaserScanParams params_; Eigen::MatrixXf local_points_; pcl::PointCloud<pcl::PointXYZRGB> local_pc_; @@ -78,14 +78,14 @@ class PublisherLaserMap: public Publisher int pc_r_, pc_g_, pc_b_; // std::maps - std::map<FrameBasePtr,std::list<ScanData>> scans_; - std::map<FrameBasePtr,Eigen::Vector3d> current_trajectory_, last_trajectory_occ_, last_trajectory_pc_; + std::map<FrameBaseConstPtr,std::list<ScanData>> scans_; + std::map<FrameBaseConstPtr,Eigen::Vector3d> current_trajectory_, last_trajectory_occ_, last_trajectory_pc_; public: PublisherLaserMap(const std::string& _unique_name, - const ParamsServer& _server, - const ProblemPtr _problem); + const ParamsServer& _server, + ProblemConstPtr _problem); WOLF_PUBLISHER_CREATE(PublisherLaserMap); virtual ~PublisherLaserMap(){}; @@ -94,9 +94,9 @@ class PublisherLaserMap: public Publisher protected: void updateTrajectory(); - bool trajectoryChanged(const std::map<FrameBasePtr,Eigen::Vector3d>& _last_trajectory, - const std::map<FrameBasePtr,Eigen::Vector3d>& _current_trajectory) const; - void storeScan(FrameBasePtr frame, CaptureLaser2dPtr capture); + bool trajectoryChanged(const std::map<FrameBaseConstPtr,Eigen::Vector3d>& _last_trajectory, + const std::map<FrameBaseConstPtr,Eigen::Vector3d>& _current_trajectory) const; + void storeScan(FrameBaseConstPtr frame, CaptureLaser2dConstPtr capture); // occmap void resetOccMap(); diff --git a/include/publisher_odom_icp.h b/include/publisher_odom_icp.h index 1c60816d10d6d4d37b3bd5683c6da02e526b4550..1c129cbbb8eded621214cd5f28437d5a3b631b37 100644 --- a/include/publisher_odom_icp.h +++ b/include/publisher_odom_icp.h @@ -42,14 +42,14 @@ class PublisherOdomIcp: public Publisher { protected: - ProcessorOdomIcpPtr processor_odom_icp_; + ProcessorOdomIcpConstPtr processor_odom_icp_; geometry_msgs::PoseStamped msg_; public: PublisherOdomIcp(const std::string& _unique_name, const ParamsServer& _server, - const ProblemPtr _problem); + ProblemConstPtr _problem); WOLF_PUBLISHER_CREATE(PublisherOdomIcp); virtual ~PublisherOdomIcp(){}; diff --git a/src/publisher_falko.cpp b/src/publisher_falko.cpp index fc33e05a8554f09fae26129a5e52295b6d0ff297..fbe7214132f0076b4b94eafbd184b15cb6fa7e02 100644 --- a/src/publisher_falko.cpp +++ b/src/publisher_falko.cpp @@ -25,8 +25,9 @@ namespace wolf { -PublisherFalko::PublisherFalko(const std::string &_unique_name, const ParamsServer &_server, - const ProblemPtr _problem) +PublisherFalko::PublisherFalko(const std::string &_unique_name, + const ParamsServer &_server, + ProblemConstPtr _problem) : Publisher(_unique_name, _server, _problem) { Eigen::Vector4d marker_color_v; @@ -45,11 +46,10 @@ PublisherFalko::PublisherFalko(const std::string &_unique_name, const ParamsServ max_points_ = getParamWithDefault<int>(_server, prefix_ + "/max_points", 1e3); extrinsics_ = _server.getParam<bool>(prefix_ + "/extrinsics"); - sensor_ = _problem->findSensor(_server.getParam<std::string>(prefix_ + "/sensor")); - // dynamic_ptr_cast(sensor_) - if (!sensor_) - throw std::runtime_error("sensor not found"); - frame_id_ = _server.getParam<std::string>(prefix_ + "/frame_id"); + processor_ = _problem->findProcessor(_server.getParam<std::string>(prefix_ + "/processor_name")); + + if (!processor_) + throw std::runtime_error("processor not found"); } void PublisherFalko::initialize(ros::NodeHandle &nh, const std::string &topic) @@ -79,7 +79,7 @@ void PublisherFalko::publishDerived() if (!KF) return; - auto cap = KF->getCaptureOf(sensor_, "CaptureLaser2d"); + auto cap = KF->getCaptureOf(processor_->getSensor(), "CaptureLaser2d"); if (not cap) return; @@ -89,9 +89,7 @@ void PublisherFalko::publishDerived() // state not ready if (current_state.count('P') == 0 or current_state.count('O') == 0 or not loc_ts.ok()) - { return; - } // 2D robot position and yaw Eigen::Vector3d p = Eigen::Vector3d::Zero(); @@ -110,23 +108,6 @@ void PublisherFalko::publishDerived() if (p(0) == 0 and p(1) == 0) return; - // LOOK FOR REFERENCE SCENE - auto processor_list = sensor_->getProcessorList(); - - ProcessorBasePtr processor_falko; - for (auto processor : processor_list) - { - if (processor->getType() == "ProcessorLoopClosureFalko") - { - processor_falko = processor; - break; - } - } - if (!processor_falko) - return; - - // FactorBasePtrList factor_list; - // KF->getFactorList(factor_list); if (KF == KF_old and KF_old != nullptr) return; @@ -137,10 +118,9 @@ void PublisherFalko::publishDerived() id = 1; - for (const FactorBasePtr &factor : KF->getConstrainedByList()) - if (factor->getProcessor() == processor_falko) + for (auto factor : KF->getConstrainedByList()) + if (factor->getProcessor() == processor_) { - auto ftr = factor->getFeature(); auto frame_other = ftr->getFrame(); @@ -166,31 +146,25 @@ void PublisherFalko::publishDerived() std::cout << "keypoints target: " << keypoints.size() << std::endl; std::cout << "keypoints reference: " << keypoints_other.size() << std::endl; - // std::cout << "scan : " << std::endl; - // for (int i = 0; i < scan.ranges_raw_.size(); i++) - // { - // std::cout << scan.ranges_raw_[i] << ","; - // } - // std::cout << "scan other : " << std::endl; - // for (int i = 0; i < scan_other.ranges_raw_.size(); i++) - // { - // std::cout << scan_other.ranges_raw_[i] << ","; - // } - publishScene(keypoints_other, scan_other, p_other, q_other, pub_marker_scene_reference_, marker_color_reference_, id, cap); // Publish associations between scenes - auto matchings_list = - std::static_pointer_cast<ProcessorLoopClosureFalkoAhtBsc>(processor_falko)->match_list_; + auto processor_aht_bsc = std::dynamic_pointer_cast<const ProcessorLoopClosureFalkoAhtBsc>(processor_); - for (auto match : matchings_list) + if (processor_aht_bsc) { - if (match->capture_target == cap) + auto matchings_list = processor_aht_bsc->getMatchList(); + + for (auto match : matchings_list) { - auto match_falko = std::static_pointer_cast<MatchLoopClosureFalko>(match); - auto associations = match_falko->match_falko_->associations; - publishAssociations(associations, cap, match->capture_reference); + if (match->capture_target == cap) + { + auto match_falko = std::static_pointer_cast<const MatchLoopClosureFalko>(match); + publishAssociations(match_falko->match_falko_->associations, + cap, + match->capture_reference); + } } } } @@ -200,8 +174,9 @@ void PublisherFalko::publishDerived() return; } -void PublisherFalko::publishAssociations(std::vector<std::pair<int, int>> &associations_, CaptureBasePtr &cap_target, - CaptureBasePtr &cap_reference) +void PublisherFalko::publishAssociations(const std::vector<std::pair<int, int>> &associations_, + CaptureBaseConstPtr cap_target, + CaptureBaseConstPtr cap_reference) { std_msgs::ColorRGBA marker_color; @@ -255,11 +230,16 @@ void PublisherFalko::publishAssociations(std::vector<std::pair<int, int>> &assoc pub_marker_associations_.publish(asso_marker); } -void PublisherFalko::publishScene(std::vector<falkolib::FALKO> &_keypoints, laserscanutils::LaserScan &_scan, - Eigen::Vector3d &_p_rob, Eigen::Quaterniond &_q_rob, ros::Publisher &_pub_lines, - std_msgs::ColorRGBA _marker_color, int &_id, CaptureBasePtr cap) +void PublisherFalko::publishScene(const std::vector<falkolib::FALKO> &_keypoints, + const laserscanutils::LaserScan &_scan, + const Eigen::Vector3d &_p_rob, + const Eigen::Quaterniond &_q_rob, + const ros::Publisher &_pub_lines, + std_msgs::ColorRGBA _marker_color, + int _id, + CaptureBaseConstPtr cap) { - auto sensor_laser = std::static_pointer_cast<SensorLaser2d>(sensor_); + auto sensor_laser = std::static_pointer_cast<const SensorLaser2d>(processor_->getSensor()); auto scan_params = sensor_laser->getScanParams(); std::vector<double> angle_discretization; @@ -312,7 +292,7 @@ void PublisherFalko::publishScene(std::vector<falkolib::FALKO> &_keypoints, lase if (_id == 0) { map_markers_reference_scenes_.insert( - std::pair<CaptureBasePtr, visualization_msgs::Marker>(cap, marker_msg_falko_scene)); + std::pair<CaptureBaseConstPtr, visualization_msgs::Marker>(cap, marker_msg_falko_scene)); } // Close the area @@ -351,11 +331,12 @@ void PublisherFalko::publishEmpty() } } -void PublisherFalko::getKeypointsAndScan(FrameBasePtr &_frame, laserscanutils::LaserScan &_scan, +void PublisherFalko::getKeypointsAndScan(FrameBaseConstPtr _frame, + laserscanutils::LaserScan &_scan, std::vector<falkolib::FALKO> &_keypoints) { - auto cap = _frame->getCaptureOf(sensor_, "CaptureLaser2d"); - auto cap_laser = std::dynamic_pointer_cast<CaptureLaser2d>(cap); + auto cap = _frame->getCaptureOf(processor_->getSensor(), "CaptureLaser2d"); + auto cap_laser = std::dynamic_pointer_cast<const CaptureLaser2d>(cap); _scan = cap_laser->getScan(); @@ -363,7 +344,7 @@ void PublisherFalko::getKeypointsAndScan(FrameBasePtr &_frame, laserscanutils::L { if (feat->getType() == "FeatureSceneFalko") { - auto feat_falko = std::static_pointer_cast<FeatureSceneFalkoBsc>(feat); + auto feat_falko = std::static_pointer_cast<const FeatureSceneFalkoBsc>(feat); _keypoints = feat_falko->getScene()->keypoints_list_; } } @@ -372,9 +353,9 @@ void PublisherFalko::getKeypointsAndScan(FrameBasePtr &_frame, laserscanutils::L void PublisherFalko::getPosition(Eigen::Vector3d &p, Eigen::Quaterniond &q, VectorComposite _state) { - p.head(2) = _state['P']; //+ Eigen::Rotation2Dd(_state['O'](0)) * sensor_->getP()->getState().head(2); + p.head(2) = _state['P']; //+ Eigen::Rotation2Dd(_state['O'](0)) * processor_->getSensor()->getP()->getState().head(2); q = Eigen::Quaterniond( - Eigen::AngleAxisd(_state['O'](0) + sensor_->getO()->getState()(0), Eigen::Vector3d::UnitZ())); + Eigen::AngleAxisd(_state['O'](0) + processor_->getSensor()->getO()->getState()(0), Eigen::Vector3d::UnitZ())); } WOLF_REGISTER_PUBLISHER(PublisherFalko) diff --git a/src/publisher_laser_map.cpp b/src/publisher_laser_map.cpp index 39f140d78b059da289cc0efb831677b9079acd69..b699f1f42f1eee61a87d464a4a4de2140faaa424 100644 --- a/src/publisher_laser_map.cpp +++ b/src/publisher_laser_map.cpp @@ -35,8 +35,8 @@ namespace wolf { PublisherLaserMap::PublisherLaserMap(const std::string& _unique_name, - const ParamsServer& _server, - const ProblemPtr _problem) : + const ParamsServer& _server, + ProblemConstPtr _problem) : Publisher(_unique_name, _server, _problem), n_cells_(Eigen::Vector2i::Constant(100)), resized_(false), @@ -135,7 +135,8 @@ void PublisherLaserMap::updateTrajectory() scans_.clear(); // copy new trajectory poses and scans - for (auto frame_pair : problem_->getTrajectory()->getFrameMap()) + auto frame_map = problem_->getTrajectory()->getFrameMap(); + for (auto frame_pair : frame_map) { if (frame_pair.second->isRemoving()) continue; @@ -148,7 +149,7 @@ void PublisherLaserMap::updateTrajectory() auto cap_list = frame_pair.second->getCaptureList(); for (auto cap : cap_list) { - auto cap_laser = std::dynamic_pointer_cast<CaptureLaser2d>(cap); + auto cap_laser = std::dynamic_pointer_cast<const CaptureLaser2d>(cap); if (cap_laser and not cap_laser->isRemoving()) storeScan(frame_pair.second, cap_laser); } @@ -162,11 +163,11 @@ void PublisherLaserMap::updateTrajectory() } } -void PublisherLaserMap::storeScan(FrameBasePtr frame, CaptureLaser2dPtr capture) +void PublisherLaserMap::storeScan(FrameBaseConstPtr frame, CaptureLaser2dConstPtr capture) { ScanData scan_data; scan_data.capture_ = capture; - scan_data.params_ = std::static_pointer_cast<SensorLaser2d>(capture->getSensor())->getScanParams(); + scan_data.params_ = std::static_pointer_cast<const SensorLaser2d>(capture->getSensor())->getScanParams(); // local points Eigen::Vector2d laser_extrinsics_p = capture->getSensor()->getP()->getState(); @@ -210,8 +211,8 @@ void PublisherLaserMap::storeScan(FrameBasePtr frame, CaptureLaser2dPtr capture) scans_.at(frame).push_back(scan_data); } -bool PublisherLaserMap::trajectoryChanged(const std::map<FrameBasePtr,Eigen::Vector3d>& _last_trajectory, - const std::map<FrameBasePtr,Eigen::Vector3d>& _current_trajectory) const +bool PublisherLaserMap::trajectoryChanged(const std::map<FrameBaseConstPtr,Eigen::Vector3d>& _last_trajectory, + const std::map<FrameBaseConstPtr,Eigen::Vector3d>& _current_trajectory) const { // check if trajectory changed enough for (auto frame_pos : _last_trajectory) diff --git a/src/publisher_odom_icp.cpp b/src/publisher_odom_icp.cpp index c9ed4ffb0c6b8af35be2c3ee82b1454227f7b456..eef4c179c0ad711788dff2a7a106ab14bb500716 100644 --- a/src/publisher_odom_icp.cpp +++ b/src/publisher_odom_icp.cpp @@ -32,7 +32,7 @@ namespace wolf PublisherOdomIcp::PublisherOdomIcp(const std::string& _unique_name, const ParamsServer& _server, - const ProblemPtr _problem) : + ProblemConstPtr _problem) : Publisher(_unique_name, _server, _problem), processor_odom_icp_(nullptr) { @@ -45,7 +45,7 @@ PublisherOdomIcp::PublisherOdomIcp(const std::string& _unique_name, { if (proc->getName() == processor_name) { - processor_odom_icp_ = std::dynamic_pointer_cast<ProcessorOdomIcp>(proc); + processor_odom_icp_ = std::dynamic_pointer_cast<const ProcessorOdomIcp>(proc); if (not processor_odom_icp_) throw std::runtime_error("PublisherOdomIcp requires a processor of type 'ProcessorOdomIcp'."); break;