Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 #include <ace/config.h>
00019 #include <stdio.h>
00020 #include <iostream>
00021 #include <string.h>
00022 using namespace std;
00023 
00024 #include <cv.h>
00025 #include <cvaux.h>
00026 #include <highgui.h>
00027 
00028 
00029 #include <yarp/os/all.h>
00030 #include <yarp/sig/all.h>
00031 
00032 
00033 #include <ros/ros.h>
00034 #include <ros/node_handle.h>
00035 #include "sensor_msgs/Image.h"
00036 #include "sensor_msgs/CameraInfo.h"
00037 #include "sensor_msgs/SetCameraInfo.h"
00038 #include "image_transport/image_transport.h"
00039 #include "cv_bridge/CvBridge.h"
00040 #include <camera_calibration_parsers/parse_ini.h>
00041 
00042 
00043 
00044 
00045 using namespace yarp::os;
00046 using namespace yarp::sig;
00047 using namespace yarp::sig::draw;
00048 using namespace yarp::sig::file;
00049 
00050 class YARPToROSImage {
00051 
00052 public:
00053     string port_name_, output_image_topic_;
00054     
00055     Network yarp_;
00056     
00057     BufferedPort<ImageOf<PixelRgb> > port_;
00058     IplImage *cvImage_;
00059     ImageOf<PixelRgb> *yarpImage;
00060     sensor_msgs::CameraInfo camera_info;
00061     std::string camera_parameters_file;
00062     std::string camera_frame_id;
00063 
00064 
00065     bool setCameraInfo(sensor_msgs::SetCameraInfo::Request &req, sensor_msgs::SetCameraInfo::Response &rsp) {
00066 
00067       camera_info = req.camera_info;
00068       ROS_INFO("New camera info received and accepted");
00069 
00070       if (camera_calibration_parsers::writeCalibrationIni(camera_parameters_file.c_str(), "yarp_to_ros_image", camera_info)) {
00071         ROS_INFO( "Camera information written to the camera parameters file: %s", camera_parameters_file.c_str() );
00072         return true;
00073       }
00074       else {
00075         ROS_ERROR( "Could not write the camera parameters file: %s", camera_parameters_file.c_str() );
00076         return false;
00077       }
00078     }
00079     
00080     
00081     YARPToROSImage(ros::NodeHandle &n) :
00082     n_(n), it_(n_)
00083     {
00084         n_.param("port_name", port_name_, std::string("/yarp_to_ros_image"));
00085         n_.param("output_image_topic", output_image_topic_, std::string("image"));
00086         n_.param("camera_parameters_file", camera_parameters_file, std::string("camera_parameters.txt"));
00087         n_.param("camera_frame_id", camera_frame_id, std::string("/r_eye3"));
00088 
00089         std::string camera_name;
00090         if (camera_calibration_parsers::readCalibrationIni(camera_parameters_file.c_str(), camera_name, camera_info)) {
00091               ROS_INFO("Successfully read camera calibration: \"%s\"  Rerun camera calibrator if it is incorrect.", camera_parameters_file.c_str());
00092         } else {
00093             ROS_ERROR("No camera parameters file found.  Use default file if no other is available. (This process will publish invalid camera calibration data).");
00094         }
00095 
00096         ConstString yarp_port_name_(port_name_.c_str());
00097         yarp_.init();
00098         port_.open(yarp_port_name_);
00099         pub_ = it_.advertiseCamera(output_image_topic_, 1);
00100         set_camera_info = n_.advertiseService("set_camera_info", &YARPToROSImage::setCameraInfo, this);
00101     }
00102   
00103 
00104     ~YARPToROSImage()
00105     {
00106         yarp_.fini();
00107     }
00108     
00109 
00110     
00111     bool spin ()
00112     {
00113         yarpImage = port_.read();
00114         cvImage_ = cvCreateImage(cvSize(yarpImage->width(),yarpImage->height()), 
00115                                  IPL_DEPTH_8U, 3 );
00116         while (n_.ok ())
00117         {     
00118             
00119             yarpImage = port_.read();
00120             ros::Time now = ros::Time::now();
00121 
00122             if (yarpImage==NULL) continue;
00123             
00124             cvCvtColor((IplImage*)yarpImage->getIplImage(), cvImage_, CV_RGB2BGR);
00125             camera_info.header.stamp.sec = now.sec;
00126             camera_info.header.stamp.nsec = now.nsec;
00127             
00128             
00129             
00130             try
00131             {
00132                 sensor_msgs::Image::Ptr pimg = bridge_.cvToImgMsg(cvImage_, "bgr8");
00133                 pimg->header.stamp.sec = now.sec;
00134                 pimg->header.stamp.nsec = now.nsec;
00135                 pimg->header.frame_id = camera_frame_id.c_str();
00136                 pub_.publish(*pimg, camera_info);
00137             }
00138             catch (sensor_msgs::CvBridgeException error)
00139             {
00140                 ROS_ERROR("CvBridgeException error");
00141             }
00142 
00143             ros::spinOnce ();
00144         }
00145         cvReleaseImage(&cvImage_);
00146         return (true);
00147     }
00148     
00149 protected:
00150   ros::NodeHandle n_;
00151   image_transport::ImageTransport it_;
00152   sensor_msgs::CvBridge bridge_;
00153   image_transport::CameraPublisher pub_;
00154   ros::ServiceServer set_camera_info;
00155 
00156 };
00157 
00158 
00159 
00160 int main(int argc, char** argv)
00161 {
00162     ros::init(argc, argv, "yarp_to_ros_image");
00163     ros::NodeHandle n("~");
00164     YARPToROSImage ytri(n);
00165     ytri.spin();
00166     return 0;
00167 }