@@ -12,6 +12,10 @@ ArucoDetectorNode::ArucoDetectorNode(const rclcpp::NodeOptions& options)
1212 detect_board_ = this ->declare_parameter <bool >(" detect_board" );
1313 visualize_ = this ->declare_parameter <bool >(" visualize" );
1414 log_markers_ = this ->declare_parameter <bool >(" log_markers" );
15+ publish_detections_ =
16+ this ->declare_parameter <bool >(" publish_detections" , true );
17+ publish_landmarks_ =
18+ this ->declare_parameter <bool >(" publish_landmarks" , true );
1519
1620 this ->declare_parameter <float >(" aruco.marker_size" );
1721 this ->declare_parameter <std::string>(" aruco.dictionary" );
@@ -46,6 +50,9 @@ ArucoDetectorNode::ArucoDetectorNode(const rclcpp::NodeOptions& options)
4650 std::string board_pose_topic =
4751 this ->declare_parameter <std::string>(" pubs.board_pose" );
4852
53+ std::string landmarks_topic =
54+ this ->declare_parameter <std::string>(" pubs.landmarks" );
55+
4956 marker_image_pub_ = this ->create_publisher <sensor_msgs::msg::Image>(
5057 aruco_image_topic, qos_sensor_data);
5158
@@ -55,6 +62,9 @@ ArucoDetectorNode::ArucoDetectorNode(const rclcpp::NodeOptions& options)
5562 board_pose_pub_ = this ->create_publisher <geometry_msgs::msg::PoseStamped>(
5663 board_pose_topic, qos_sensor_data);
5764
65+ landmark_pub_ = this ->create_publisher <vortex_msgs::msg::LandmarkArray>(
66+ landmarks_topic, qos_sensor_data);
67+
5868 std::string logger_service_name =
5969 this ->declare_parameter <std::string>(" logger_service_name" );
6070
@@ -154,6 +164,7 @@ void ArucoDetectorNode::imageCallback(
154164 }
155165 cv::Mat input_image;
156166 cv::Mat input_image_gray;
167+ vortex_msgs::msg::LandmarkArray landmark_array;
157168 try {
158169 auto cv_ptr =
159170 cv_bridge::toCvCopy (msg, sensor_msgs::image_encodings::BGR8);
@@ -201,6 +212,20 @@ void ArucoDetectorNode::imageCallback(
201212 msg->header );
202213 board_pose_pub_->publish (pose_msg);
203214
215+ vortex_msgs::msg::Landmark board_landmark;
216+ board_landmark.header = msg->header ;
217+ board_landmark.type = vortex_msgs::msg::Landmark::ARUCO_BOARD;
218+ board_landmark.subtype =
219+ vortex_msgs::msg::Landmark::ARUCO_BOARD_CAMERA;
220+
221+ geometry_msgs::msg::PoseWithCovariance board_pose_cov;
222+ board_pose_cov.pose = pose_msg.pose ;
223+ std::fill (board_pose_cov.covariance .begin (),
224+ board_pose_cov.covariance .end (), 0.0 );
225+ board_landmark.pose = board_pose_cov;
226+
227+ landmark_array.landmarks .push_back (board_landmark);
228+
204229 if (visualize_) {
205230 float length =
206231 cv::norm (board_->objPoints [0 ][0 ] - board_->objPoints [0 ][1 ]);
@@ -221,9 +246,8 @@ void ArucoDetectorNode::imageCallback(
221246 geometry_msgs::msg::PoseArray pose_array;
222247
223248 for (size_t i = 0 ; i < marker_ids.size (); i++) {
249+ int id = marker_ids[i];
224250 if (log_markers_) {
225- int id = marker_ids[i];
226-
227251 // id 0 is blacklisted, too many false positives
228252 if (id == 0 ) {
229253 continue ;
@@ -233,17 +257,32 @@ void ArucoDetectorNode::imageCallback(
233257 log_marker_ids (id, time);
234258 }
235259
236- cv::Vec3d rvec = rvecs[i];
237- cv::Vec3d tvec = tvecs[i];
238- tf2::Quaternion quat = rvec_to_quat (rvec);
260+ const cv::Vec3d& rvec = rvecs[i];
261+ const cv::Vec3d& tvec = tvecs[i];
262+ const tf2::Quaternion quat = rvec_to_quat (rvec);
239263
240264 auto pose_msg = cv_pose_to_ros_pose_stamped (tvec, quat, msg->header );
241265 pose_array.poses .push_back (pose_msg.pose );
266+
267+ vortex_msgs::msg::Landmark landmark;
268+ landmark.header = msg->header ;
269+ landmark.type = vortex_msgs::msg::Landmark::ARUCO_MARKER;
270+ landmark.subtype = static_cast <uint16_t >(id);
271+ geometry_msgs::msg::PoseWithCovariance pose_cov;
272+ pose_cov.pose = pose_msg.pose ;
273+ std::fill (pose_cov.covariance .begin (), pose_cov.covariance .end (), 0.0 );
274+ landmark.pose = pose_cov;
275+ landmark_array.landmarks .push_back (landmark);
242276 }
243277
244278 pose_array.header = msg->header ;
245- marker_pose_pub_->publish (pose_array);
246-
279+ landmark_array.header = msg->header ;
280+ if (publish_detections_) {
281+ marker_pose_pub_->publish (pose_array);
282+ }
283+ if (publish_landmarks_ && !landmark_array.landmarks .empty ()) {
284+ landmark_pub_->publish (landmark_array);
285+ }
247286 if (visualize_) {
248287 cv::aruco::drawDetectedMarkers (input_image, marker_corners, marker_ids);
249288 cv::aruco::drawDetectedMarkers (input_image, rejected_candidates,
0 commit comments