diff --git a/cfg/AdcLandmarksSlamSolver.cfg b/cfg/AdcLandmarksSlamSolver.cfg index 0ac19ce2406345e7ee00848a83175490266f3950..46fcadfd9050b5743d9b833161688c7a4633b624 100755 --- a/cfg/AdcLandmarksSlamSolver.cfg +++ b/cfg/AdcLandmarksSlamSolver.cfg @@ -65,7 +65,7 @@ ceres.add("update_problem_angle", double_t, 0, "An ceres.add("landmarks_map_file", str_t, 0, "Input txt file path", "landmarks.txt") ceres.add("problem_frame_window", int_t, 0, "Max number of frames to add", 30, -1, 120) -flags.add("visualization", bool_t, 0, "Boolean to publish visualization markers", False) +flags.add("publish_visualization", bool_t, 0, "Boolean to publish visualization markers", False) flags.add("load_landmarks", bool_t, 0, "Boolean to load_landmarks from txt file", False) flags.add("landmarks_pos_fixed", bool_t, 0, "Boolean to fix landmarks positions", False) flags.add("search_for_new_landmarks", bool_t, 0, "Boolean to search for new landmarks", False) diff --git a/include/adc_landmarks_slam_solver_alg_node.h b/include/adc_landmarks_slam_solver_alg_node.h index 05b420e2f27f67aca6fc68d6fe5d43f6e9f61cd9..0045a7e4ae9608c0c0bb09eab1a1ab4b0d0d1501 100644 --- a/include/adc_landmarks_slam_solver_alg_node.h +++ b/include/adc_landmarks_slam_solver_alg_node.h @@ -210,6 +210,11 @@ class AdcLandmarksSlamSolverAlgNode : public algorithm_base::IriBaseAlgorithm<Ad */ double mahalanobis_distance(Eigen::Vector2d feature_pos, double feature_r, double feature_th, Eigen::Vector2d landmark_pos); + /** + * \brief Function to publish landmarks markers. + */ + void publish_landmarks_markers(); + /** * \brief config variable * diff --git a/src/adc_landmarks_slam_solver_alg_node.cpp b/src/adc_landmarks_slam_solver_alg_node.cpp index 4d432c11b5021116e981d04240a6a660df27df95..9dc26b348136729e113583913091a005f7c4ffc7 100644 --- a/src/adc_landmarks_slam_solver_alg_node.cpp +++ b/src/adc_landmarks_slam_solver_alg_node.cpp @@ -187,6 +187,8 @@ void AdcLandmarksSlamSolverAlgNode::mainNodeThread(void) { std::cout << "new data" << std::endl; check_landmarks(this->config_.search_for_new_landmarks); + if (this->config_.publish_visualization) + publish_landmarks_markers(); this->new_features_data = false; } @@ -521,6 +523,45 @@ void AdcLandmarksSlamSolverAlgNode::load_landmarks(void) landmarks_file.close(); } +void AdcLandmarksSlamSolverAlgNode::publish_landmarks_markers() +{ + this->landmarks_MarkerArray_msg_.markers.resize(this->landmarks.size()); + std::map<double, Landmark_info>::iterator it = this->landmarks.begin(); + for (unsigned int i = 0; i < this->landmarks_MarkerArray_msg_.markers.size() && it != this->landmarks.end(); i++, ++it) + { + this->landmarks_MarkerArray_msg_.markers[i].header.frame_id = this->config_.global_frame; + this->landmarks_MarkerArray_msg_.markers[i].header.stamp = this->features_stamp; + this->landmarks_MarkerArray_msg_.markers[i].id = i; + this->landmarks_MarkerArray_msg_.markers[i].ns = "landmarks"; + // this->landmarks_MarkerArray_msg_.markers[i].type = visualization_msgs::Marker::TEXT_VIEW_FACING; + this->landmarks_MarkerArray_msg_.markers[i].type = visualization_msgs::Marker::CYLINDER; + this->landmarks_MarkerArray_msg_.markers[i].action = visualization_msgs::Marker::ADD; + // this->landmarks_MarkerArray_msg_.markers[i].lifetime = ros::Duration(0.1); + + this->landmarks_MarkerArray_msg_.markers[i].pose.position.x = it->second.pose(0); + this->landmarks_MarkerArray_msg_.markers[i].pose.position.y = it->second.pose(1); + this->landmarks_MarkerArray_msg_.markers[i].pose.position.z = 0.2; + + this->landmarks_MarkerArray_msg_.markers[i].pose.orientation.x = 0.0; + this->landmarks_MarkerArray_msg_.markers[i].pose.orientation.y = 0.0; + this->landmarks_MarkerArray_msg_.markers[i].pose.orientation.z = 0.0; + this->landmarks_MarkerArray_msg_.markers[i].pose.orientation.w = 1.0; + + this->landmarks_MarkerArray_msg_.markers[i].scale.x = 0.1; + this->landmarks_MarkerArray_msg_.markers[i].scale.y = 0.1; + this->landmarks_MarkerArray_msg_.markers[i].scale.z = 0.4; + + this->landmarks_MarkerArray_msg_.markers[i].color.a = 1.0; + this->landmarks_MarkerArray_msg_.markers[i].color.r = (it->second.detected? 0.0: 1.0); + this->landmarks_MarkerArray_msg_.markers[i].color.g = 1.0; + this->landmarks_MarkerArray_msg_.markers[i].color.b = 1.0; + + // this->landmarks_MarkerArray_msg_.markers[i].text = std::to_string(this->landmarks[i].intensity); + } + if (this->landmarks_MarkerArray_msg_.markers.size() > 0) + this->landmarks_publisher_.publish(this->landmarks_MarkerArray_msg_); +} + /* [subscriber callbacks] */ void AdcLandmarksSlamSolverAlgNode::estimated_pose_callback(const geometry_msgs::PoseWithCovarianceStamped::ConstPtr& msg) {