pose_estimation_node.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016, Lukas Pfeifhofer <lukas.pfeifhofer@devlabs.pro>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  * this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  * this list of conditions and the following disclaimer in the documentation
13  * and/or other materials provided with the distribution.
14  *
15  * 3. Neither the name of the copyright holder nor the names of its contributors
16  * may be used to endorse or promote products derived from this software without
17  * specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include "pose_estimation_node.h"
33 
34 int main(int argc, char **argv) {
35  ros::init(argc, argv, "arPoseEstimation");
37  PoseEstimationNode poseEstimationNode(n);
38  ros::spin();
39  return 0;
40 }
41 
43  // Register dynamic_reconfigure callback
44  configCallbackFnct_ = boost::bind(&PoseEstimationNode::configCallback, this, _1, _2);
46 
47  // Advert marker publisher
48  pub_markers_ = n_.advertise<marker_msgs::MarkerDetection>("markers", 10);
49 
50  // Subscribe to FiducialDetection.msg topic
52 }
53 
55 
56 void PoseEstimationNode::fiducialDetectionCallback(const marker_msgs::FiducialDetection::ConstPtr &msg) {
57 
58  // Convert camera matrix msg to cv::Mat
59  float camera_matrix_data[9];
60  for(int i = 0; i < 9; i++)
61  camera_matrix_data[i] = msg->camera_k[i];
62  cv::Mat camera_k = cv::Mat(3, 3, CV_32F, camera_matrix_data);
63 
64  float distortion_coefficients_data[5];
65  for(int i = 0; i < 5; i++)
66  distortion_coefficients_data[i] = msg->camera_d[i];
67  cv::Mat camera_d = cv::Mat(1, 5, CV_32F, distortion_coefficients_data);
68 
69 
70  std::vector<MarkerFiducials> markers;
71  for (auto &fiducial:msg->fiducial) {
72  MarkerFiducials marker(fiducial.ids, fiducial.ids_confidence);
73 
74  for (auto &object_point:fiducial.object_points)
75  marker.object_points.push_back(cv::Point3f(object_point.x, object_point.y, object_point.z));
76 
77  for (auto &image_point:fiducial.image_points)
78  marker.image_points.push_back(cv::Point2f(image_point.x, image_point.y));
79 
80  markers.push_back(marker);
81  }
82 
83  // Do pose estimation
84  std::vector<MarkerPose> markerPoses;
85  base_.estimatePose(markers, camera_k, camera_d, markerPoses);
86 
87  // Publish ros messages
88  publishMarkers(msg->header, markerPoses);
89 }
90 
91 static tf::StampedTransform markerPoseToStampedTransform(MarkerPose &markerPose, const std_msgs::Header &header) {
92  cv::Mat m = markerPose.rt_matrix;
93 
94  tf::Vector3 tv(
95  m.at<float>(0, 3),
96  m.at<float>(1, 3),
97  m.at<float>(2, 3)
98  );
99 
100  tf::Matrix3x3 rm(
101  m.at<float>(0, 0), m.at<float>(0, 1), m.at<float>(0, 2),
102  m.at<float>(1, 0), m.at<float>(1, 1), m.at<float>(1, 2),
103  m.at<float>(2, 0), m.at<float>(2, 1), m.at<float>(2, 2)
104  );
105 
106  char markerLabel[64];
107  if (markerPose.ids.size() > 0) {
108  sprintf(markerLabel, "t%i", markerPose.ids[0]);
109  } else {
110  sprintf(markerLabel, "t?");
111  }
112  return tf::StampedTransform(tf::Transform(rm, tv), ros::Time::now(), header.frame_id, markerLabel);
113 }
114 
115 void PoseEstimationNode::publishMarkers(const std_msgs::Header &header, std::vector<MarkerPose> &markerPoses) {
116  marker_msgs::MarkerDetection msg;
117 
118  msg.header = header;
119  msg.distance_min = 0; //TODO
120  msg.distance_max = 8; //TODO
121  msg.distance_max_id = 5; //TODO
122  msg.view_direction.x = 0; //TODO
123  msg.view_direction.y = 0; //TODO
124  msg.view_direction.z = 0; //TODO
125  msg.view_direction.w = 1; //TODO
126  msg.fov_horizontal = 6; //TODO
127  msg.fov_vertical = 0; //TODO
128 
129  msg.markers = marker_msgs::MarkerDetection::_markers_type();
130 
131  for (auto &markerPose:markerPoses) {
132  tf::StampedTransform stf = markerPoseToStampedTransform(markerPose, header);
133 
134  // Send transform
137 
138  // Push marker into MarkerDetection message
139  marker_msgs::Marker marker;
140 
141  marker.ids = markerPose.ids;
142  marker.ids_confidence = markerPose.ids_confidence;
143  tf::poseTFToMsg(stf, marker.pose);
144 
145  msg.markers.push_back(marker);
146  }
147 
148  // Publish MarkerDetection message
150  pub_markers_.publish(msg);
151 }
152 
153 void PoseEstimationNode::configCallback(tuw_marker_pose_estimation::MarkerPoseEstimationConfig &config, uint32_t level) {
154  base_.getParameters().setPoseEstimatorType(config.pose_estimation_type);
155  base_.getParameters().setPublishTf(config.publish_tf);
156  base_.getParameters().setPublishMarkers(config.publish_markers);
158 }
ros::Publisher pub_markers_
int main(int argc, char **argv)
void publish(const boost::shared_ptr< M > &message) const
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
cv::Mat rt_matrix
Definition: marker_pose.h:44
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
void fiducialDetectionCallback(const marker_msgs::FiducialDetection::ConstPtr &msg)
std::vector< int > ids
Definition: marker_pose.h:41
PoseEstimationParameters & getParameters()
ROSCPP_DECL void spin(Spinner &spinner)
void publishMarkers(const std_msgs::Header &header, std::vector< MarkerPose > &markerPoses)
static tf::StampedTransform markerPoseToStampedTransform(MarkerPose &markerPose, const std_msgs::Header &header)
dynamic_reconfigure::Server< tuw_marker_pose_estimation::MarkerPoseEstimationConfig > configServer_
void sendTransform(const StampedTransform &transform)
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
dynamic_reconfigure::Server< tuw_marker_pose_estimation::MarkerPoseEstimationConfig >::CallbackType configCallbackFnct_
void estimatePose(std::vector< MarkerFiducials > &markers, cv::Mat &camera_k, cv::Mat &camera_d, std::vector< MarkerPose > &markerPoses)
ros::Subscriber fiducialDetectionSubscriber_
std::vector< cv::Point3f > object_points
static void poseTFToMsg(const Pose &bt, geometry_msgs::Pose &msg)
PoseEstimationBase base_
static Time now()
PoseEstimationNode(ros::NodeHandle &n)
std::vector< cv::Point2f > image_points
tf::TransformBroadcaster transformBroadcaster_
void configCallback(tuw_marker_pose_estimation::MarkerPoseEstimationConfig &config, uint32_t level)


tuw_marker_pose_estimation
Author(s): Lukas Pfeifhofer
autogenerated on Mon Jun 10 2019 15:42:13