NimbRo ROS Soccer Package
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
CameraProjections.hpp
1 //CameraRealConvert.hpp
2 // Created on: Apr 22, 2015
3 // Author: Hafez Farazi <farazi@ais.uni-bonn.de>
4 #pragma once
5 
6 #include <ros/ros.h>
7 #include <std_msgs/String.h>
8 #include <ros/console.h>
9 #include <opencv2/opencv.hpp>
10 #include <opencv2/highgui/highgui.hpp>
11 #include <sstream>
12 #include <boost/timer/timer.hpp>
13 #include <inttypes.h>
14 #include <time.h>
15 #include <std_msgs/Int64.h>
16 #include <std_msgs/Int8.h>
17 #include <string.h>
18 #include <image_transport/image_transport.h>
19 #include <image_geometry/pinhole_camera_model.h>
20 #include <tf/transform_listener.h>
21 #include <sensor_msgs/image_encodings.h>
22 #include <sensor_msgs/distortion_models.h>
23 #include <sensor_msgs/image_encodings.h>
24 #include <config_server/parameter.h>
25 #include <std_srvs/Empty.h>
26 #include <boost/format.hpp>
27 #include <visualization_msgs/Marker.h>
28 #include <vis_utils/marker_manager.h>
29 #include <nav_msgs/OccupancyGrid.h>
30 #include <vision_module/Tools/General.hpp>
31 #include <vision_module/Tools/Parameters.hpp>
32 #include <vision_module/Tools/MatPublisher.hpp>
33 #include <vision_module/Projections/IPM.hpp>
34 #include <vision_module/Projections/DistortionModel.hpp>
35 #include <vision_module/Tools/LineSegment.hpp>
36 #include <pcl/point_cloud.h>
37 #include <pcl_conversions/pcl_conversions.h>
38 #include <sensor_msgs/PointCloud2.h>
39 #include <vision_module/Tools/HillOptimizer.hpp>
40 #include <vision_module/Tools/SimplexOptimizer.hpp>
41 #include <robotcontrol/RobotHeading.h>
42 #include <tf_tools/tf_filtered_listener.h>
43 
44 using namespace cv;
51 {
52 private:
53  vector<Point2f> realCoordinateVector;
54  robotcontrol::RobotHeading headingData;
55  ros::Subscriber heading_sub_robotstate;
56  ros::NodeHandle nodeHandle;
58  vis_utils::MarkerManager topViewMarker;
59  Mat realHomoFor, realHomoBack;
60  Point2d _upRightPoint;
61  Point2d _upRightPointt;
62  Point2d _downRightPoint;
63  Point2d _downLeftPoint;
64  nav_msgs::OccupancyGrid mmap;
65  ros::Publisher mmap_pub;
66  ros::Publisher reset_time_pub;
67  ros::Publisher reset_clock_pub;
68  vis_utils::GenMarker egoCPoints;
69  vis_utils::GenMarker egoGPoints;
70  MatPublisher topImg_pub;
71  MatPublisher unDistortedImg_pub;
72  sensor_msgs::CameraInfo ci;
73 // MatPublisher calibImg_pub;
74  image_geometry::PinholeCameraModel cam_model;
75  Mat calibViewBGR, topViewBGR;
76  Point2d gPointRes[4], physicalCorners[4];
77  Point3d transformedPointsRes[4];
78  bool lastProjectionIsValid;
79  ros::Time lastTime;
80  bool dummy;
81  float ComputeError(const vector<OptimizorParam> &d);
82  float ComputeError(const vector<float> &d);
83  float ComputeAvgError(vector<Point2f> realClicked,
84  vector<Point2f> rvizClicked);
85  bool calibrating;
86  vector<OptimizorParam> initialParameters;
87  SimplexOptimizer<CameraProjections> simplexoptimizer;
89  float diagnalAngleView;
90  float ballExtraDistance;
91  IPM ipm;
92 
93  inline void handleHeadingData(const robotcontrol::RobotHeadingConstPtr& msg) //in radian
94  {
95  headingData = *msg;
96  }
97 
98 public:
99  double headingOffset; //in radian
100  double lastAvalibleTF; //in radian
101  Point3d cameraLocation, cameraOrintation;
102  Point3d opticalLocation, opticalAngle;
103  Point2d outerCornetrsUndistortedImg[4];
104  Point outerCornetrsRawImg[4];
105  DistortionModel distorionModel;
106  ros::Subscriber checkboxSub;
107  vis_utils::MarkerManager kinCalibMarker;
108  vis_utils::GenMarker kinCalibRvizPoints;
109  vis_utils::GenMarker kinCalibResPoints;
110  vis_utils::GenMarker kinCalibRobotLoc;
111  ros::Publisher pcl_pub;
112  sensor_msgs::PointCloud2 output;
113 
114  inline CameraProjections() :
115  m_tf(ros::Duration(3)) /*to cache data for 3 second before*/, topViewMarker(
116  "/vision/testPoints"), egoCPoints(&topViewMarker,
117  "/ego_floor"), egoGPoints(&topViewMarker, "/ego_floor"), topImg_pub(
118  "/vision/topImg"), unDistortedImg_pub(
119  "/vision/unDistortedImg"), /*calibImg_pub("/vision/calibImg"),*/lastProjectionIsValid(
120  false), lastTime(ros::Time::now()), dummy(false), calibrating(
121  false), simplexoptimizer(*this,
122  &CameraProjections::ComputeError), hilloptimizer(*this,
123  &CameraProjections::ComputeError), diagnalAngleView(
124  params.camera->diagonalAngleView()), ballExtraDistance(0), ipm(
125  diagnalAngleView), headingOffset(0), lastAvalibleTF(0), kinCalibMarker(
126  "/vision/kinCalib"), kinCalibRvizPoints(&kinCalibMarker,
127  "/loc_field"), kinCalibResPoints(&kinCalibMarker,
128  "/loc_field"), kinCalibRobotLoc(&kinCalibMarker,
129  "/loc_field")
130  {
131 
132  mmap_pub = nodeHandle.advertise<nav_msgs::OccupancyGrid>("/vision/mmap",
133  10);
134 
135  reset_time_pub = nodeHandle.advertise<std_msgs::Empty>("/reset_time",
136  10);
137  reset_clock_pub = nodeHandle.advertise<std_msgs::Empty>("/reset_clock",
138  10);
139  pcl_pub = nodeHandle.advertise<sensor_msgs::PointCloud2>("/vision/pcl",
140  1);
141 
142  m_tf.setFutureIgnoreRatio(0.5);
143  std::vector<std::string> intrestingTFFrames;
144  intrestingTFFrames.push_back("ego_floor");
145  intrestingTFFrames.push_back("ego_rot");
146  intrestingTFFrames.push_back("trunk_link");
147  intrestingTFFrames.push_back("neck_link");
148  intrestingTFFrames.push_back("head_link");
149  intrestingTFFrames.push_back("camera_optical");
150  m_tf.start(intrestingTFFrames);
151 
152  heading_sub_robotstate = nodeHandle.subscribe(
153  "/robotmodel/robot_heading", 1,
154  &CameraProjections::handleHeadingData, this);
155  }
156 
157  //To find out the point in real coordinate with respect to camera
158  inline Point2d unroateCameraYaw(Point2d _realPoint)
159  {
160  Point2d res;
161  RotateAroundPoint(_realPoint, -Radian2Degree(cameraOrintation.z), res);
162  return res;
163  }
164 
165  inline double getHeading() //In Radian
166  {
167  if (abs(Radian2Degree(headingOffset)) > 50)
168  {
169  ROS_WARN("Flip prevented!");
170  headingOffset = 0;
171  }
172  return CorrectAngleRadian360(headingData.heading + headingOffset);
173  }
174  virtual inline ~CameraProjections()
175  {
176 
177  }
178  vector<Point2f> RotateTowardHeading(const vector<Point2f> &in);
179  Point2d RotateTowardHeading(const Point2d &in);
180  Point2f RotateTowardHeading(const Point2f &in);
181  vector<LineSegment> RotateTowardHeading(const vector<LineSegment> &in);
182  void CalcFullRealCordinate();
183  bool CalculateProjection();
184  bool Update(ros::Time capTime);
185  void Publish(Mat &guiRawImg, bool shouldPublish);
186  void Calibrate();
187 
188  bool GetOnImageCordinate(const vector<Point2f> &contour,
189  vector<Point> &resCountour);
190 
191  bool GetOnRealCordinate(const vector<Point> &contour,
192  vector<Point2f> &resCountour);
193  bool GetOnImageCordinate(const vector<LineSegment> &inLine,
194  vector<LineSegment> &resLines);
195  bool GetOnRealCordinate(const vector<LineSegment> &inLine,
196  vector<LineSegment> &resLines);
197  bool GetOnRealCordinate_FromUndistorted(const vector<Point2f> &contour,
198  vector<Point2f> &resCountour);
199  bool GetOnRealCordinate_FromUndistorted_Single(
200  Point2f &pointIn, Point2f &resPoint);
201  bool GetOnRealCordinate_single(const Point &pointIn, Point2f &resPoint);
202  bool GetOnImageCordinate_slow(const Point2f &pointIn, Point &resPoint);
203  Point2f convertToBallProjection(Point2f _in);
204 
205  bool Init(bool _dummy);
206 
207 };
For pixel projections.
Definition: CameraProjections.hpp:50
A class for publish mat objects.
Definition: MatPublisher.hpp:40
A class similar to tf::TransformListener, only with the ability to filter tf messages.
Definition: tf_filtered_listener.h:31
For Inverse Perspective Mapping.
Definition: IPM.hpp:20
For undistortion.
Definition: DistortionModel.hpp:17