emc_system
visualize.cpp
Go to the documentation of this file.
1 #include <emc/io.h>
2 
3 #include "opencv2/imgproc.hpp"
4 #include <opencv2/highgui.hpp>
5 #include <ros/rate.h>
6 
7 #include <string>
8 
9 double resolution = 0.01;
10 cv::Point2d canvas_center;
11 
12 const bool draw_robot = false;
13 double robotRadius = 0.21; // HERO radius [m]
14 
15 // ----------------------------------------------------------------------------------------------------
16 
17 cv::Point2d worldToCanvas(double x, double y)
18 {
19  return cv::Point2d(-y / resolution, -x / resolution) + canvas_center;
20 }
21 
22 // ----------------------------------------------------------------------------------------------------
23 
24 int main(int argc, char **argv)
25 {
26  std::string robot_name = "hero";
27  if (argc > 1)
28  robot_name=argv[1];
29 
30  emc::IO io(robot_name);
31 
32  ros::Rate r(30);
33  while(io.ok())
34  {
35  cv::Mat canvas(500, 500, CV_8UC3, cv::Scalar(50, 50, 50));
36  canvas_center = cv::Point2d(canvas.rows / 2, canvas.cols / 2);
37 
38  cv::Scalar robot_color(0, 0, 255);
39 
40  // scaling of the head and LRF (which should be drawn inside the circumference of the robot)
41  const double scaling = 1.0;
42 
43  if (draw_robot) {
45  std::vector<std::pair<double, double> > robot_head_points;
47  std::vector<std::pair<double, double> > eye_pupil_points;
48 
49  robot_points.push_back(std::pair<double, double>(0.0,0.0));
50  robot_head_points.push_back(std::pair<double, double>( 0.08*scaling, -0.16*scaling));
51  robot_head_points.push_back(std::pair<double, double>( 0.08*scaling, 0.16*scaling));
52  robot_head_points.push_back(std::pair<double, double>(-0.08*scaling, 0.16*scaling));
53  robot_head_points.push_back(std::pair<double, double>(-0.08*scaling, -0.16*scaling));
54  eye_points.push_back(std::pair<double, double>( 0.0*scaling, 0.07*scaling));
55  eye_points.push_back(std::pair<double, double>( 0.0*scaling, -0.07*scaling));
56  eye_pupil_points.push_back(std::pair<double, double>( 0.025*scaling, 0.07*scaling));
57  eye_pupil_points.push_back(std::pair<double, double>( 0.025*scaling, -0.07*scaling));
58 
59  cv::Point2d pRobot = worldToCanvas(robot_points[0].first, robot_points[0].second);
60  cv::circle(canvas, pRobot, robotRadius/resolution, robot_color, 2);
61 
62  for(unsigned int i = 0; i < robot_head_points.size(); ++i)
63  {
64  unsigned int j = (i + 1) % robot_head_points.size();
65  cv::Point2d p1 = worldToCanvas(robot_head_points[i].first, robot_head_points[i].second);
66  cv::Point2d p2 = worldToCanvas(robot_head_points[j].first, robot_head_points[j].second);
67  cv::line(canvas, p1, p2, robot_color, 2);
68  }
69  for(unsigned int i = 0; i < eye_points.size(); ++i)
70  {
71  cv::Point2d pEye = worldToCanvas(eye_points[i].first, eye_points[i].second);
72  cv::circle(canvas, pEye, scaling*4, robot_color, 2);
73  }
74  for(unsigned int i = 0; i < eye_pupil_points.size(); ++i)
75  {
76  cv::Point2d pEyePupil = worldToCanvas(eye_pupil_points[i].first, eye_pupil_points[i].second);
77  cv::circle(canvas, pEyePupil, scaling*1.5, robot_color, 2);
78  }
79  }
80 
81  // Dot to indicate LRF position
82  cv::Point2d pLRF = worldToCanvas(0.15*scaling, 0.0*scaling);
83  if (!draw_robot) pLRF = worldToCanvas(0.0*scaling, 0.0*scaling);
84  cv::circle(canvas, pLRF, scaling*2, robot_color, 2);
85 
86  emc::LaserData scan;
87  if (!io.readLaserData(scan))
88  continue;
89 
90  double a = scan.angle_min;
91  for(unsigned int i = 0; i < scan.ranges.size(); ++i)
92  {
93  double x = cos(a) * scan.ranges[i];
94  double y = sin(a) * scan.ranges[i];
95 
96  cv::Point2d p = worldToCanvas(x, y);
97  if (p.x >= 0 && p.y >= 0 && p.x < canvas.cols && p.y < canvas.rows)
98  canvas.at<cv::Vec3b>(p) = cv::Vec3b(0, 255, 0);
99 
100  a += scan.angle_increment;
101  }
102 
103  cv::imshow("Laser Vizualization", canvas);
104  cv::waitKey(3);
105 
106  r.sleep();
107  }
108 
109  return 0;
110 }
emc::LaserData::angle_increment
double angle_increment
Definition: data.h:20
emc::IO::readLaserData
bool readLaserData(LaserData &scan)
Receive new laser data if available.
Definition: io.cpp:34
std::string
std::pair
std::vector
std::vector::size
T size(T... args)
emc::LaserData::angle_min
double angle_min
Definition: data.h:18
robotRadius
double robotRadius
Definition: visualize.cpp:13
main
int main(int argc, char **argv)
Definition: visualize.cpp:24
std::vector::push_back
T push_back(T... args)
emc::LaserData
Definition: data.h:14
worldToCanvas
cv::Point2d worldToCanvas(double x, double y)
Definition: visualize.cpp:17
emc::IO
Definition: io.h:18
draw_robot
const bool draw_robot
Definition: visualize.cpp:12
canvas_center
cv::Point2d canvas_center
Definition: visualize.cpp:10
resolution
double resolution
Definition: visualize.cpp:9
emc::IO::ok
bool ok()
Check connection to the robot.
Definition: io.cpp:119
io.h
emc::LaserData::ranges
std::vector< float > ranges
Definition: data.h:22
string