7 #include <std_msgs/String.h>
8 #include <ros/console.h>
9 #include <opencv2/opencv.hpp>
10 #include <opencv2/highgui/highgui.hpp>
12 #include <boost/timer/timer.hpp>
15 #include <std_msgs/Int64.h>
16 #include <std_msgs/Int8.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>
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;
72 sensor_msgs::CameraInfo ci;
74 image_geometry::PinholeCameraModel cam_model;
75 Mat calibViewBGR, topViewBGR;
76 Point2d gPointRes[4], physicalCorners[4];
77 Point3d transformedPointsRes[4];
78 bool lastProjectionIsValid;
81 float ComputeError(
const vector<OptimizorParam> &d);
82 float ComputeError(
const vector<float> &d);
83 float ComputeAvgError(vector<Point2f> realClicked,
84 vector<Point2f> rvizClicked);
86 vector<OptimizorParam> initialParameters;
89 float diagnalAngleView;
90 float ballExtraDistance;
93 inline void handleHeadingData(
const robotcontrol::RobotHeadingConstPtr& msg)
100 double lastAvalibleTF;
101 Point3d cameraLocation, cameraOrintation;
102 Point3d opticalLocation, opticalAngle;
103 Point2d outerCornetrsUndistortedImg[4];
104 Point outerCornetrsRawImg[4];
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;
115 m_tf(ros::Duration(3)) , topViewMarker(
116 "/vision/testPoints"), egoCPoints(&topViewMarker,
117 "/ego_floor"), egoGPoints(&topViewMarker,
"/ego_floor"), topImg_pub(
118 "/vision/topImg"), unDistortedImg_pub(
119 "/vision/unDistortedImg"), 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,
132 mmap_pub = nodeHandle.advertise<nav_msgs::OccupancyGrid>(
"/vision/mmap",
135 reset_time_pub = nodeHandle.advertise<std_msgs::Empty>(
"/reset_time",
137 reset_clock_pub = nodeHandle.advertise<std_msgs::Empty>(
"/reset_clock",
139 pcl_pub = nodeHandle.advertise<sensor_msgs::PointCloud2>(
"/vision/pcl",
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);
152 heading_sub_robotstate = nodeHandle.subscribe(
153 "/robotmodel/robot_heading", 1,
154 &CameraProjections::handleHeadingData,
this);
158 inline Point2d unroateCameraYaw(Point2d _realPoint)
161 RotateAroundPoint(_realPoint, -Radian2Degree(cameraOrintation.z), res);
165 inline double getHeading()
167 if (abs(Radian2Degree(headingOffset)) > 50)
169 ROS_WARN(
"Flip prevented!");
172 return CorrectAngleRadian360(headingData.heading + headingOffset);
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);
188 bool GetOnImageCordinate(
const vector<Point2f> &contour,
189 vector<Point> &resCountour);
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);
205 bool Init(
bool _dummy);
For pixel projections.
Definition: CameraProjections.hpp:50
A class for publish mat objects.
Definition: MatPublisher.hpp:40
For Inverse Perspective Mapping.
Definition: IPM.hpp:20
For undistortion.
Definition: DistortionModel.hpp:17