3 #include <jsk_topic_tools/rosparam_utils.h>
12 DiagnosticNodelet::onInit();
13 pub_ = advertiseCamera(*pnh_,
"image", 1);
15 dynamic_reconfigure::Server<jsk_perception::VirtualCameraMonoConfig>::CallbackType
f =
17 srv_ = boost::make_shared<dynamic_reconfigure::Server<jsk_perception::VirtualCameraMonoConfig> >(*pnh_);
20 pnh_->param(
"frame_id",
trans_.
frame_id_, std::string(
"/elevator_inside_panel"));
24 std::vector<double> initial_pos, initial_rot;
25 if (jsk_topic_tools::readVectorParameter(*pnh_,
"initial_pos", initial_pos)) {
26 trans_.
setOrigin(tf::Vector3(initial_pos[0], initial_pos[1], initial_pos[2]));
31 if (jsk_topic_tools::readVectorParameter(*pnh_,
"initial_rot", initial_rot)) {
41 geometry_msgs::Point32 pt;
42 pt.x=0, pt.y=1, pt.z=0;
poly_.polygon.points.push_back(pt);
43 pt.x=0, pt.y=-1, pt.z=0;
poly_.polygon.points.push_back(pt);
44 pt.x=0, pt.y=-1, pt.z=-1;
poly_.polygon.points.push_back(pt);
45 pt.x=0, pt.y=1, pt.z=-1;
poly_.polygon.points.push_back(pt);
56 boost::mutex::scoped_lock(mutex_);
57 switch (
config.interpolation_method) {
74 ROS_ERROR(
"Invalid interpolation method: %d",
config.interpolation_method);
81 ROS_INFO(
"Subscribing to image topic");
85 jsk_topic_tools::warnNoRemap(names);
90 ROS_INFO(
"Unsubscibing from image topic");
95 const sensor_msgs::CameraInfoConstPtr& info_msg)
97 vital_checker_->poke();
102 image = cv_ptr->image;
105 ROS_ERROR(
"[virtual_camera_mono] Failed to convert image");
116 cv::Mat outimage = image.clone();
118 ROS_DEBUG(
"publish image and transform.");
119 sensor_msgs::CameraInfo virtual_info = *
info_msg;
120 cv_ptr->image = outimage;
121 sensor_msgs::Image::Ptr
img_msg = cv_ptr->toImageMsg();
139 tf->transform.translation.y,
140 tf->transform.translation.z));
142 tf->transform.rotation.z,
tf->transform.rotation.w));
152 std::vector<tf::Point> target_poly, target_poly_translated;
153 for(std::vector<geometry_msgs::Point32>::iterator pit=poly.polygon.points.begin(); pit != poly.polygon.points.end(); pit++) {
154 geometry_msgs::PointStamped
point, cpoint, vpoint;
155 point.point.x = pit->x,
point.point.y = pit->y,
point.point.z = pit->z;
156 point.header = poly.header;
160 tf::Vector3 vpt_vec = trans.
inverse() * tf::Vector3(vpoint.point.x, vpoint.point.y, vpoint.point.z);
163 target_poly.push_back(
tf::Point(cpoint.point.x, cpoint.point.y, cpoint.point.z));
164 target_poly_translated.push_back(
tf::Point(vpt_vec.x(),vpt_vec.y(),vpt_vec.z()));
168 cv::Point2f src_pnt[4], dst_pnt[4];
169 for(
int i = 0;
i < 4;
i++) {
170 cv::Point3d xyz(target_poly[
i].
x(),target_poly[
i].y(),target_poly[
i].z());
171 cv::Point3d xyz_trans(target_poly_translated[
i].
x(),
172 target_poly_translated[
i].y(),
173 target_poly_translated[
i].z());
174 cv::Point2d uv,uv_trans;
176 src_pnt[
i] = cv::Point (uv.x, uv.y);
178 dst_pnt[
i] = cv::Point (uv_trans.x, uv_trans.y);
181 cv::Mat map_matrix = cv::getPerspectiveTransform (src_pnt, dst_pnt);
185 ROS_WARN_THROTTLE(10,
"[virtual_camera_mono] failed to transform image: %s", e.what());