rosinljubljana_objects.cpp
Go to the documentation of this file.
2 #define TIME_STEP 32
3 
4 Obstacle::Obstacle(std::string obstacleName)
5 {
6  name = obstacleName;
7 
8 };
9 
10 void Obstacle::setSegments(std::vector<Point_2> points_)
11 {
12 
13  segments.clear();
14  for(int index; index < points_.size()-1; ++index) {
15  segments.emplace_back(points_.at(index), points_.at(index+1));
16  };
17 
18  points = points_;
19 
20 
21 };
22 
24 {
25 
26  segments.clear();
27  points.clear();
28 
29 };
30 
31 Field::Field(ros::NodeHandle n){
32  map_pub = n.advertise<nav_msgs::OccupancyGrid>("map", 1, true);
33 };
34 
35 void Field::addObstacle(std::string name, std::vector<Point_2> points)
36 {
37  obstacles.push_back(Obstacle(name));
38  obstacles.back().setSegments(points);
39 };
40 
41 void Field::addObstacle(std::string name) {
42  obstacles.push_back(Obstacle(name));
43 }
44 
45 void Field::modifyObstacle(std::string name, std::vector<Point_2> points)
46 {
47  for(std::vector<Obstacle>::iterator it = obstacles.begin(); it != obstacles.end(); ++it) {
48  if ((*it).name == name){
49  (*it).clearSegments();
50  (*it).setSegments(points);
51  };
52  };
53 };
54 
55 void Field::deleteObstacle(std::string name)
56 {
57  for (int index = 0; index <= obstacles.size(); ++index){
58  if (obstacles.at(index).name == name){
59  obstacles.erase(obstacles.begin() + index);
60  };
61  };
62 };
63 
65 {
66  obstacles.clear();
67 };
68 
69 void Field::updateObstacleFromAlvar(std::string name, std::vector<int> alvar_nums)
70 {
71  tf::StampedTransform transform;
72  std::vector<Point_2> points;
73 
74  for(std::vector<int>::iterator it = alvar_nums.begin(); it != alvar_nums.end(); ++it) {
75  try{
76  frameAr_pose_markerName.str(std::string());
77  frameAr_pose_markerName << "ar_marker_" << std::to_string(*it);
78  listener.waitForTransform("map", frameAr_pose_markerName.str(), ros::Time::now(),
79  ros::Duration(10.0));
80  listener.lookupTransform("map" ,frameAr_pose_markerName.str(),
81  ros::Time(0), transform);
82  points.push_back(Point_2(transform.getOrigin().x(), transform.getOrigin().y()));
83  }
84  catch (tf::TransformException &ex) {
85  ROS_ERROR("%s",ex.what());
86  };
87  };
88 
89  for(std::vector<Obstacle>::iterator it = obstacles.begin(); it != obstacles.end(); ++it) {
90  if ((*it).name == name){
91  (*it).clearSegments();
92  (*it).setSegments(points);
93  };
94  };
95 };
96 
98 {
99  data.resize(mapWidth*mapHeight, 0);
100 
101  for(std::vector<Obstacle>::iterator it_obstacles = obstacles.begin(); it_obstacles != obstacles.end(); ++it_obstacles) {
102  for(std::vector<Segment_2>::iterator it_segments = (*it_obstacles).segments.begin(); it_segments != (*it_obstacles).segments.end(); ++ it_segments){
103 
104  Point_2 p1 = (*it_segments).source();
105  Point_2 p2 = (*it_segments).target();
106  int x1 = (int)(CGAL::to_double(p1.x())/mapResolution + mapWidth/2);
107  int x2 = (int)(CGAL::to_double(p2.x())/mapResolution + mapWidth/2);
108  int y1 = (int)(CGAL::to_double(p1.y())/mapResolution + mapHeight/2);
109  int y2 = (int)(CGAL::to_double(p2.y())/mapResolution + mapHeight/2);
110 
111  float dx = std::abs(x2 - x1);
112  float dy = std::abs(y2 - y1);
113 
114  if (dx > dy) {
115  if (x1 < x2) {
116  float j = float(y1);
117  float m = float((y2 - y1)/dx);
118  for (int i = x1; i < x2; i++) {
119  data.at(int(j) * mapWidth + i) = 100;
120  data.at(int(j+1) * mapWidth + i) = 100;
121  j = j + m;
122  };
123  }
124  else{
125  float j = float(y2);
126  float m = float((y1 - y2)/dx);
127  for (int i = x2; i < x1; i++) {
128  data.at(int(j) * mapWidth + i) = 100;
129  data.at(int(j+1) * mapWidth + i) = 100;
130  j = j + m;
131  };
132  }
133  }
134  else {
135  if (y1 < y2) {
136  float j = float(x1);
137  float m = float((x2 - x1)/dy);
138  for (int i = y1; i < y2; i++) {
139  data.at(int(j) + i*mapWidth) = 100;
140  data.at(int(j) + i*mapWidth+1) = 100;
141  j = j + m;
142  };
143  }
144  else{
145  float j = float(x2);
146  float m = float((x1 - x2)/dy);
147  for (int i = y2; i < y1; i++) {
148  data.at(int(j) + i*mapWidth) = 100;
149  data.at(int(j) + i*mapWidth + 1) = 100;
150  j = j + m;
151  };
152  };
153  };
154  };
155  };
156 }
157 
158 void Field::publishOccupancyGrid(ros::NodeHandle n)
159 {
160 
161  nav_msgs::OccupancyGrid grid;
162 
163  grid.header.frame_id = "map";
164 
165  nav_msgs::MapMetaData mapData;
166 
167  mapData.map_load_time = ros::Time::now();
168  mapData.resolution = mapResolution;
169  mapData.width = mapWidth;
170  mapData.height = mapHeight;
171 
172  geometry_msgs::Pose origin;
173  origin.position.x = -mapResolution*(float)mapWidth/2.;
174  origin.position.y = -mapResolution*(float)mapHeight/2.;
175  mapData.origin = origin;
176 
177  grid.info = mapData;
178  grid.data = data;
179 
180  map_pub.publish(grid);
181 }
182 
183 // Constructor for robot Class
185  name = "robot";
186 
187  x = 0.;
188  y = 0.;
189  fi = 0.;
190  vx=0.0;
191  vy=0.0;
192  angularz=0.0;
193  time = ros::Time::now();
194 }
195 
196 
197 void Robot::setName(std::string robotName, ros::NodeHandle nh){
198  name = robotName;
199  frameAr_pose_markerName<<"ar_marker_"<<name;
200 
201  LaserScan_publisher_name << "robot_" << name << "/LaserScan";
202 
203  LaserScan_publisher = nh.advertise<sensor_msgs::LaserScan>(LaserScan_publisher_name.str(), 10);
204 
205  odom_publisher_name << "robot_" << name << "/odom";
206 
207  odom_publisher = nh.advertise<nav_msgs::Odometry>(odom_publisher_name.str(), 50);
208 
209  pose_alvar_publisher_name << "robot_" << name << "/pose_alvar";
210 
211  pose_alvar_publisher = nh.advertise<geometry_msgs::PoseWithCovarianceStamped>(pose_alvar_publisher_name.str(), 50);
212 
213  robot_ekf_odom_subscriber_name << "robot_" << name << "/ekf_odom";
215 
216 
217 }
218 
220  // Method to intialise robot frames
221  transformMap.setOrigin(tf::Vector3(0.0, 0.0, 0.0));
222  tf::Quaternion qMap;
223  qMap.setRPY(0, 0, 0);
224  transformMap.setRotation(qMap);
225 
226  frameMapName << "robot_" << name << "/map";
227 
228  transformOdom.setOrigin(tf::Vector3(0.0, 0.0, 0.0));
229  tf::Quaternion qOdom;
230  qOdom.setRPY(0, 0, 0);
231  transformOdom.setRotation(qOdom);
232 
233  frameOdomName << "robot_" << name << "/odom";
234 
235  transformBase_Link.setOrigin(tf::Vector3(0.0, 0.0, 0.0));
236  tf::Quaternion qBase_link;
237  qBase_link.setRPY(0, 0, 0);
238  transformBase_Link.setRotation(qBase_link);
239 
240  frameBase_linkName << "robot_" << name << "/base_link";
241 }
242 
243 void Robot::setPositionOrientation(tf::Vector3 position, tf::Quaternion orientation)
244 {
245  // Method to set position of robot frame
246  transformBase_Link.setOrigin(position);
247  transformBase_Link.setRotation(orientation);
248 
249 }
250 
252 {
253  tf::StampedTransform transform;
254 
255  try{
256 
257  ros::Time lastCommonTime;
258  std::string* error_string;
259  listener.getLatestCommonTime("map", frameAr_pose_markerName.str(),
260  lastCommonTime, error_string);
261 
262  if (lastCommonTime != time)
263  {
264  listener.lookupTransform("map" ,frameAr_pose_markerName.str(),
265  ros::Time(0), transform);
266 
267  ros::Duration dt = ros::Time::now() - lastCommonTime;
268 
269  transformBase_Link.setOrigin(tf::Vector3(transform.getOrigin().x()+vx*dt.toSec(), transform.getOrigin().y()+vy*dt.toSec(), 0.0));
270  time = lastCommonTime;
271 
272  double roll, pitch, yaw;
273  tf::Matrix3x3(transform.getRotation()).getRPY(roll, pitch, yaw);
274 
275  tf::Quaternion qBase_link;
276  qBase_link.setRPY(0, 0, yaw+angularz*dt.toSec());
277  transformBase_Link.setRotation(qBase_link);
278 
279  pose_alvar.header.stamp = time;
280  pose_alvar.header.frame_id = frameOdomName.str();
281 
282  //set the position
283  pose_alvar.pose.pose.position.x = transform.getOrigin().x();
284  pose_alvar.pose.pose.position.y = transform.getOrigin().y();
285  pose_alvar.pose.pose.position.z = 0.0;
286  pose_alvar.pose.pose.orientation = tf::createQuaternionMsgFromYaw(yaw);
287 
288  pose_alvar.pose.covariance[0] = 0.0001;
289  pose_alvar.pose.covariance[7] = 0.0001;
290  pose_alvar.pose.covariance[14] = 0.0001;
291  pose_alvar.pose.covariance[21] = 0.0001;
292  pose_alvar.pose.covariance[28] = 0.0001;
293  pose_alvar.pose.covariance[35] = 0.0001;
294 
295  //publish the message
297  }
298  }
299  catch (tf::TransformException &ex) {
300  //ROS_ERROR("%s",ex.what());
301  //ros::Duration(1.0).sleep();
302  }
303 }
304 
306 {
307  tf::StampedTransform transform;
308 
309  try{
310 
311  ros::Time lastCommonTime;
312  std::string* error_string;
313  listener.getLatestCommonTime("map", frameAr_pose_markerName.str(),
314  lastCommonTime, error_string);
315 
316  if (lastCommonTime != time)
317  {
318  listener.lookupTransform("map" ,frameAr_pose_markerName.str(),
319  ros::Time(0), transform);
320 
321  ros::Duration dt = ros::Time::now() - lastCommonTime;
322 
323  transformBase_Link.setOrigin(tf::Vector3(transform.getOrigin().x()+vx*dt.toSec(), transform.getOrigin().y()+vy*dt.toSec(), 0.0));
324 
325  time = lastCommonTime;
326  double roll, pitch, yaw;
327  tf::Matrix3x3(transform.getRotation()).getRPY(roll, pitch, yaw);
328 
329  tf::Quaternion qBase_link;
330  qBase_link.setRPY(0, 0, yaw+angularz*dt.toSec());
331  transformBase_Link.setRotation(qBase_link);
332 
333  x = transform.getOrigin().x();
334  y = transform.getOrigin().y();
335 
336  fi = yaw;
337  }
338  }
339  catch (tf::TransformException &ex) {
340  ROS_ERROR("%s",ex.what());
341  //ros::Duration(1.0).sleep();
342  }
343 }
344 
345 void Robot::EKFOdometryCallback(const nav_msgs::Odometry & msg)
346 {
347 
348  tf::Quaternion qBase_link;
349 
350 
351  tf::Quaternion q(
352  msg.pose.pose.orientation.x,
353  msg.pose.pose.orientation.y,
354  msg.pose.pose.orientation.z,
355  msg.pose.pose.orientation.w);
356  tf::Matrix3x3 m(q);
357  double roll, pitch, yaw;
358  m.getRPY(roll, pitch, yaw);
359 
360  fi = yaw;
361  x = msg.pose.pose.position.x;
362  y = msg.pose.pose.position.y;
363 
364  qBase_link.setRPY(0, 0, yaw);
365  transformBase_Link.setRotation(qBase_link);
366 
367  transformBase_Link.setOrigin(tf::Vector3(x, y, 0.0));
368 
369  this->transmitFrames();
370 }
371 
372 void Robot::odometryCallback(const nav_msgs::Odometry & msg)
373 {
374 
375  ros::Duration dt = ros::Time::now() - time_2;
376  time_2 = ros::Time::now();
377 
378  tf::Quaternion qBase_link;
379 
380  double vx_beagle = msg.twist.twist.linear.x;
381  double vy_beagle = msg.twist.twist.linear.y;
382 
383  double angularz = msg.twist.twist.angular.z;
384  fi = fi+angularz*dt.toSec();
385 
386  tf::Quaternion q(
387  msg.pose.pose.orientation.x,
388  msg.pose.pose.orientation.y,
389  msg.pose.pose.orientation.z,
390  msg.pose.pose.orientation.w);
391  tf::Matrix3x3 m(q);
392  double roll, pitch, yaw;
393  m.getRPY(roll, pitch, yaw);
394 
395  double v = vx_beagle/cos(yaw);
396 
397  vx = v*cos(fi);
398  vy = v*sin(fi);
399 
400  qBase_link.setRPY(0, 0, fi);
401  transformBase_Link.setRotation(qBase_link);
402 
403  x = x + vx*dt.toSec();
404  y = y + vy*dt.toSec();
405 
406  transformBase_Link.setOrigin(tf::Vector3(x, y, 0.0));
407 
408 }
409 
411 {
412  odom.header.stamp = time;
413  odom.header.frame_id = frameOdomName.str();
414 
415  //set the position
416  odom.pose.pose.position.x = x;
417  odom.pose.pose.position.y = y;
418  odom.pose.pose.position.z = 0.0;
419  odom.pose.pose.orientation = tf::createQuaternionMsgFromYaw(fi);
420 
421  //set the velocity
422  odom.child_frame_id = frameBase_linkName.str();
423  odom.twist.twist.linear.x = vx;
424  odom.twist.twist.linear.y = vy;
425  odom.twist.twist.angular.z = angularz;
426 
427  //publish the message
428  odom_publisher.publish(odom);
429 }
430 
431 void Robot::transmitLaserScan(Robot robotek_list[], int list_length, Field *field)
432 {
433  std::vector<Segment_2> segments;
434  for(std::vector<Obstacle>::iterator it_obstacles = field->obstacles.begin(); it_obstacles != field->obstacles.end(); ++it_obstacles) {
435  for(std::vector<Segment_2>::iterator it_segments = (*it_obstacles).segments.begin(); it_segments != (*it_obstacles).segments.end(); ++ it_segments){
436  segments.push_back(*it_segments);
437  }
438  }
439  std::vector<Obstacle>::iterator it_obstacle_first = field->obstacles.begin();
440  Point_2 *points = &((*it_obstacle_first).points[0]);
441  Polygon_2 pgn(points, points+(*it_obstacle_first).points.size()-1);
442  for (int i = 0; i<list_length; i++){
443  if (robotek_list[i].name != name){
444 
445  Point_2 h1(robotek_list[i].x+0.1*std::cos(3.14159/4. + fi), robotek_list[i].y + 0.1*std::sin(3.1415926/4. + fi));
446  Point_2 h2(robotek_list[i].x+0.1*std::cos(3.14159*3./4. + fi), robotek_list[i].y + 0.1*std::sin(3.1415926*3./4. + fi));
447  Point_2 h3(robotek_list[i].x+0.1*std::cos(3.14159*5./4. + fi), robotek_list[i].y + 0.1*std::sin(3.1415926*5./4. + fi));
448  Point_2 h4(robotek_list[i].x+0.1*std::cos(3.14159*7./4. + fi), robotek_list[i].y + 0.1*std::sin(3.1415926*7./4. + fi));
449 
450  segments.push_back(Segment_2(h1, h2));
451  segments.push_back(Segment_2(h2, h3));
452  segments.push_back(Segment_2(h3, h4));
453  segments.push_back(Segment_2(h4, h1));
454  }
455  }
456  Arrangement_2 env;
457  CGAL::insert(env,segments.begin(),segments.end());
458  Point_2 query_point(x, y);
459 
460  Arrangement_2::Face_const_handle * face;
461  CGAL::Arr_naive_point_location<Arrangement_2> pl(env);
462  CGAL::Arr_point_location_result<Arrangement_2>::Type obj = pl.locate(query_point);
463 
464  // The query point locates in the interior of a face
465  face = boost::get<Arrangement_2::Face_const_handle> (&obj);
466 
467  CGAL::Bounded_side bside = pgn.bounded_side(query_point);
468  if (bside == CGAL::ON_BOUNDED_SIDE) {
469 
470  Arrangement_2 output_arr;
471  TEV tev(env);
472  Face_handle fh = tev.compute_visibility(query_point, *face, output_arr);
473 
474  Arrangement_2::Ccb_halfedge_circulator curr = fh->outer_ccb();
475 
476  sensor_msgs::LaserScan LaserScan_msg;
477 
478  LaserScan_msg.header.stamp = ros::Time::now();
479  LaserScan_msg.header.frame_id = frameBase_linkName.str();;
480 
481  LaserScan_msg.angle_min = 0.;
482  LaserScan_msg.angle_max = 2*3.1415926;
483 
484  LaserScan_msg.angle_increment = 3.1415926/40.;
485  LaserScan_msg.time_increment = 0.001;
486 
487  LaserScan_msg.scan_time = 0.1;
488 
489  LaserScan_msg.range_min = 0.01;
490  LaserScan_msg.range_max = 4.0;
491  int size = (int)((LaserScan_msg.angle_max - LaserScan_msg.angle_min)/LaserScan_msg.angle_increment+2);
492  LaserScan_msg.ranges.resize(size);
493 
494  float ray_angle = LaserScan_msg.angle_increment;
495  int index = 0;
496  while (ray_angle <= LaserScan_msg.angle_max){
497  Ray_2 ray(query_point, Vector_2(std::cos(fi+ray_angle), std::sin(fi+ray_angle)));
498 
499  auto result = CGAL::intersection(ray, Segment_2(curr->source()->point(), curr->target()->point()));
500  if(result){
501  Point_2* p = boost::get<Point_2>(&*result);
502  double distance = std::pow(CGAL::to_double(squared_distance(query_point, *p)), 0.5);
503  LaserScan_msg.ranges.at(index) = distance;
504  }
505 
506  while (++curr != fh->outer_ccb()){
507 
508  auto result = CGAL::intersection(ray, Segment_2(curr->source()->point(), curr->target()->point()));
509  if(result){
510  Point_2* p = boost::get<Point_2>(&*result);
511  double distance = std::pow(CGAL::to_double(squared_distance(query_point, *p)), 0.5);
512  LaserScan_msg.ranges.at(index) = distance;
513  }
514  }
515  index++;
516 
517  ray_angle+=LaserScan_msg.angle_increment;
518  }
519  LaserScan_publisher.publish(LaserScan_msg);
520  }
521 }
522 
524  // Method to transmit robo frames
525  ros::Time transmit_time = ros::Time::now();
526  br.sendTransform(tf::StampedTransform(transformMap, transmit_time, "map", frameMapName.str()));
527  br.sendTransform(tf::StampedTransform(transformOdom, transmit_time, frameMapName.str(), frameOdomName.str()));
528  br.sendTransform(tf::StampedTransform(transformBase_Link, transmit_time, frameOdomName.str(), frameBase_linkName.str()));
529 
530 }
531 
533  wheelDistance = 0.1;
534  wheelRadius = 0.015;
535 };
536 
537 // Constructor for webots robot
538 void WebotsRobot::init(ros::NodeHandle nh, std::string controllerName)
539 {
540  cmd_vel_subscriber_name << "robot_" << name << "/cmd_vel";
541 
542  controllerNameinWebots = controllerName;
543  gyroNameinWebots = "gyro";
544 
545  wheelSrv.request.value = INFINITY;
546 
547  // Setting wheels to velocity control
549  nh.serviceClient<webots_ros::set_float>(controllerNameinWebots + "/wheel1/set_position");
552  nh.serviceClient<webots_ros::set_float>(controllerNameinWebots + "/wheel2/set_position");
555  nh.serviceClient<webots_ros::set_float>(controllerNameinWebots + "/wheel1/set_velocity");
557  nh.serviceClient<webots_ros::set_float>(controllerNameinWebots + "/wheel2/set_velocity");
558 
559  wheelSrv.request.value = 0.;
561  wheelSrv.request.value = 0.;
563 }
564 
565 void WebotsRobot::moveCallback(const geometry_msgs::Twist& msg){
566  // Callback method for subsrciber
567 
568  float vel = msg.linear.x;
569  float rotation = msg.angular.z;
570 
571  float wheel_right = (vel*2./wheelDistance - rotation)*wheelDistance/(4.*3.14159265*wheelRadius);
572  float wheel_left = vel/(3.14159265*wheelRadius) - wheel_right;
573 
574  wheelSrv.request.value = -wheel_right*5.;
576  wheelSrv.request.value = -wheel_left*5.;
578 }
579 
580 void WebotsRobot::transmitLaserScan(WebotsRobot robotek_list[], int list_length, Field *field)
581 {
582  std::vector<Segment_2> segments;
583  for(std::vector<Obstacle>::iterator it_obstacles = field->obstacles.begin(); it_obstacles != field->obstacles.end(); ++it_obstacles) {
584  for(std::vector<Segment_2>::iterator it_segments = (*it_obstacles).segments.begin(); it_segments != (*it_obstacles).segments.end(); ++ it_segments){
585  segments.push_back(*it_segments);
586  }
587  }
588  std::vector<Obstacle>::iterator it_obstacle_first = field->obstacles.begin();
589  Point_2 *points = &((*it_obstacle_first).points[0]);
590  Polygon_2 pgn(points, points+(*it_obstacle_first).points.size()-1);
591  for (int i = 0; i<list_length; i++){
592  if (robotek_list[i].name != name){
593 
594  Point_2 h1(robotek_list[i].x+0.1*std::cos(3.14159/4. + fi), robotek_list[i].y + 0.1*std::sin(3.1415926/4. + fi));
595  Point_2 h2(robotek_list[i].x+0.1*std::cos(3.14159*3./4. + fi), robotek_list[i].y + 0.1*std::sin(3.1415926*3./4. + fi));
596  Point_2 h3(robotek_list[i].x+0.1*std::cos(3.14159*5./4. + fi), robotek_list[i].y + 0.1*std::sin(3.1415926*5./4. + fi));
597  Point_2 h4(robotek_list[i].x+0.1*std::cos(3.14159*7./4. + fi), robotek_list[i].y + 0.1*std::sin(3.1415926*7./4. + fi));
598 
599  segments.push_back(Segment_2(h1, h2));
600  segments.push_back(Segment_2(h2, h3));
601  segments.push_back(Segment_2(h3, h4));
602  segments.push_back(Segment_2(h4, h1));
603  }
604  }
605  Arrangement_2 env;
606  CGAL::insert(env,segments.begin(),segments.end());
607  Point_2 query_point(x, y);
608 
609  Arrangement_2::Face_const_handle * face;
610  CGAL::Arr_naive_point_location<Arrangement_2> pl(env);
611  CGAL::Arr_point_location_result<Arrangement_2>::Type obj = pl.locate(query_point);
612 
613  // The query point locates in the interior of a face
614  face = boost::get<Arrangement_2::Face_const_handle> (&obj);
615 
616  CGAL::Bounded_side bside = pgn.bounded_side(query_point);
617  if (bside == CGAL::ON_BOUNDED_SIDE) {
618 
619  Arrangement_2 output_arr;
620  TEV tev(env);
621  Face_handle fh = tev.compute_visibility(query_point, *face, output_arr);
622 
623  Arrangement_2::Ccb_halfedge_circulator curr = fh->outer_ccb();
624 
625  sensor_msgs::LaserScan LaserScan_msg;
626 
627  LaserScan_msg.header.stamp = ros::Time::now();
628  LaserScan_msg.header.frame_id = frameBase_linkName.str();;
629 
630  LaserScan_msg.angle_min = 0.;
631  LaserScan_msg.angle_max = 2*3.1415926;
632 
633  LaserScan_msg.angle_increment = 3.1415926/40.;
634  LaserScan_msg.time_increment = 0.001;
635 
636  LaserScan_msg.scan_time = 0.1;
637 
638  LaserScan_msg.range_min = 0.01;
639  LaserScan_msg.range_max = 4.0;
640  int size = (int)((LaserScan_msg.angle_max - LaserScan_msg.angle_min)/LaserScan_msg.angle_increment+2);
641  LaserScan_msg.ranges.resize(size);
642 
643  float ray_angle = LaserScan_msg.angle_increment;
644  int index = 0;
645  while (ray_angle <= LaserScan_msg.angle_max){
646  Ray_2 ray(query_point, Vector_2(std::cos(fi+ray_angle), std::sin(fi+ray_angle)));
647 
648  auto result = CGAL::intersection(ray, Segment_2(curr->source()->point(), curr->target()->point()));
649  if(result){
650  Point_2* p = boost::get<Point_2>(&*result);
651  double distance = std::pow(CGAL::to_double(squared_distance(query_point, *p)), 0.5);
652  LaserScan_msg.ranges.at(index) = distance;
653  }
654 
655  while (++curr != fh->outer_ccb()){
656 
657  auto result = CGAL::intersection(ray, Segment_2(curr->source()->point(), curr->target()->point()));
658  if(result){
659  Point_2* p = boost::get<Point_2>(&*result);
660  double distance = std::pow(CGAL::to_double(squared_distance(query_point, *p)), 0.5);
661  LaserScan_msg.ranges.at(index) = distance;
662  }
663  }
664  index++;
665 
666  ray_angle+=LaserScan_msg.angle_increment;
667  }
668  LaserScan_publisher.publish(LaserScan_msg);
669  }
670 }
671 
672 void WebotsRobot::subscribeMove(ros::NodeHandle nh){
673  // subscriber to twist topic
674  subCmd_vel = nh.subscribe(cmd_vel_subscriber_name.str(), 1, &WebotsRobot::moveCallback, this);
675 }
676 
677 void WebotsRobot::enableGyro(ros::NodeHandle nh){
678  // Method to enable camera in simulator
679  ros::ServiceClient enableGyroClient =
680  nh.serviceClient<webots_ros::set_int>(controllerNameinWebots + '/' + gyroNameinWebots + "/enable");
681  webots_ros::set_int enableGyroSrv;
682 
683  enableGyroSrv.request.value = 2 * TIME_STEP;
684  if (enableGyroClient.call(enableGyroSrv) && enableGyroSrv.response.success) {
685  ROS_INFO("Gyro enabled with sampling period %d.", enableGyroSrv.request.value);}
686 }
687 
688 void WebotsRobot::gyroCallback(const sensor_msgs::Imu &imu){
689  // publihses odometry from gyro
690 
691 }
692 
693 void WebotsRobot::subscribeGyro(ros::NodeHandle nh){
694  // Method to subscribe to camera in webots ssimulator
695  subGyro = nh.subscribe(controllerNameinWebots + '/' + gyroNameinWebots + "/values", 1, &WebotsRobot::gyroCallback, this);
696  while (subGyro.getNumPublishers() == 0) {
697  }
698 }
699 
701  name = "camera";
702 }
703 
704 
705 void Camera::setPositionOrientation(tf::Vector3 position, tf::Quaternion orientation)
706 {
707  // Set poseition and orientation fo webots camera
708  transformCamera.setOrigin(position);
709  transformCamera.setRotation(orientation);
710 
711 }
712 
714 {
715  // Set frames of camera
716  transformCamera.setOrigin(tf::Vector3(0.0, 0.0, 2.0));
717  tf::Quaternion qCamera(0.0, 0.0, 0.0, 1.0);
718  qCamera.setRPY(3.14159, 0, 0);
719  transformCamera.setRotation(qCamera);
720  frameCameraName << name << "_link";
721 }
722 
724 {
725  // Transmit frames
726  br.sendTransform(tf::StampedTransform(transformCamera, ros::Time::now(), "map", frameCameraName.str()));
727 }
728 
729 void Camera::setName(std::string cameraName){
730  // set name of camera
731  name = cameraName;
732 
733  imagePublisherName << cameraName << "/image_raw";
734  infoPublisherName << cameraName << "/camera_info";
735 }
736 
737 WebotsCamera::WebotsCamera(ros::NodeHandle nh, image_transport::ImageTransport imgt, std::string controllerName)
738 {
739 
740  // Constructor of webots camera
741  std::string imagePublisherName_ = imagePublisherName.str();
742  pub = imgt.advertise("/camera/image_raw", 1);
743  pub_info = nh.advertise<sensor_msgs::CameraInfo>("/camera/camera_info", 100);
744  controllerNameinWebots = controllerName;
745 
746  ros::ServiceClient deviceListClient = nh.serviceClient<webots_ros::robot_get_device_list>(controllerNameinWebots + "/robot/get_device_list");
747  std::vector<std::string> deviceList;
748  webots_ros::robot_get_device_list deviceListSrv;
749 
750  if (deviceListClient.call(deviceListSrv)) {
751  deviceList = deviceListSrv.response.list;
752  ROS_INFO("The controller has %lu devices availables:", deviceList.size());
753  for (unsigned int i = 0; i < deviceList.size(); i++)
754  ROS_INFO("Device [%d]: %s.", i, deviceList[i].c_str());
755  } else
756  ROS_ERROR("Failed to call service deviceList.");
757 
758  cameraNameinWebots = deviceList[0];
759 
760  ros::ServiceClient cameraGetInfoClient =
761  nh.serviceClient<webots_ros::camera_get_info>(controllerNameinWebots + '/' + cameraNameinWebots + "/get_info");
762 
763  webots_ros::camera_get_info cameraGetInfoSrv;
764  if (cameraGetInfoClient.call(cameraGetInfoSrv)) {
765  width = cameraGetInfoSrv.response.width;
766  height = cameraGetInfoSrv.response.height;
767  ROS_INFO("Camera size is %d x %d.", width, height);
768  } else
769  ROS_ERROR("Failed to call service range_finder_get_info.");
770 }
771 
773  // Method to set camera parameters
774 
775  cam_info.header.stamp = ros::Time::now();
776  cam_info.header.frame_id = "camera_link";
777  cam_info.distortion_model = "plumb_bob";
778  cam_info.height = height;
779  cam_info.width = width;
780  cam_info.D.resize(5);
781  std::fill (cam_info.D.begin(),cam_info.D.end(),0.0);
782 
783  cam_info.K.at(0) = 1104;
784  cam_info.K.at(1) = 1.0;
785  cam_info.K.at(2) = 640.5;
786  cam_info.K.at(3) = 0.0;
787  cam_info.K.at(4) = 1104;
788  cam_info.K.at(5) = 480.5;
789  cam_info.K.at(6) = 0.0;
790  cam_info.K.at(7) = 0.0;
791  cam_info.K.at(8) = 1.0;
792 
793  cam_info.D.at(0) = 1104;
794  cam_info.D.at(0) = 0.0;
795  cam_info.D.at(0) = 640.5;
796  cam_info.D.at(0) = 0.0;
797  cam_info.D.at(0) = 0.0;
798  cam_info.D.at(0) = 1104;
799  cam_info.D.at(0) = 480.5;
800  cam_info.D.at(0) = 0.0;
801  cam_info.D.at(0) = 0.0;
802  cam_info.D.at(0) = 0.0;
803  cam_info.D.at(0) = 1.0;
804  cam_info.D.at(0) = 0.0;
805 }
806 
807 void WebotsCamera::cameraCallback(const sensor_msgs::Image::ConstPtr &image){
808  // Callback method for subscriber
809 
810  int size = image->width * image->height;
811  imageCamera.resize(size);
812 
813  const float *depth_data = reinterpret_cast<const float *>(&image->data[0]);
814  for (int i = 0; i < size; ++i)
815  imageCamera[i] = depth_data[i];
816 }
817 
818 void WebotsCamera::enable(ros::NodeHandle nh){
819  // Method to enable camera in simulator
820  ros::ServiceClient enableCameraClient =
821  nh.serviceClient<webots_ros::set_int>(controllerNameinWebots + '/' + cameraNameinWebots + "/enable");
822  webots_ros::set_int enableCameraSrv;
823 
824  enableCameraSrv.request.value = 2 * TIME_STEP;
825  if (enableCameraClient.call(enableCameraSrv) && enableCameraSrv.response.success) {
826  ROS_INFO("Camera enabled with sampling period %d.", enableCameraSrv.request.value);}
827 
828 }
829 
830 void WebotsCamera::subscribe(ros::NodeHandle nh){
831  // Method to subscribe to camera in webots ssimulator
832  subCameraCamera = nh.subscribe(controllerNameinWebots + '/' + cameraNameinWebots + "/image", 1, &WebotsCamera::cameraCallback, this);
833  while (subCameraCamera.getNumPublishers() == 0) {
834  }
835 }
836 
838  // Method to publish camera from webots in different topic
839  cv::Mat image(height, width, CV_32FC1);
840  memcpy(image.data,imageCamera.data(),imageCamera.size()*sizeof(float));
841 
842  sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgra8", image).toImageMsg();
843  msg->header.frame_id = frameCameraName.str();
844  msg->header.stamp = ros::Time::now();
845  cam_info.header.stamp = ros::Time::now();
846  cam_info.header.frame_id = frameCameraName.str();
847  pub_info.publish(cam_info);
848  pub.publish(msg);
849 }
Robot::transmitFrames
void transmitFrames()
Definition: rosinljubljana_objects.cpp:523
Camera::transformCamera
tf::Transform transformCamera
Transform and Broadcaster of camera frame.
Definition: rosinljubljana.h:475
Field::mapHeight
uint32_t mapHeight
Definition: rosinljubljana.h:198
Robot::frameBase_linkName
std::stringstream frameBase_linkName
Name of base_link frame.
Definition: rosinljubljana.h:301
WebotsCamera::cameraCallback
void cameraCallback(const sensor_msgs::Image::ConstPtr &image)
Definition: rosinljubljana_objects.cpp:807
Field::modifyObstacle
void modifyObstacle(std::string, std::vector< Point_2 >)
Definition: rosinljubljana_objects.cpp:45
Obstacle::setSegments
void setSegments(std::vector< Point_2 >)
Definition: rosinljubljana_objects.cpp:10
Robot::pose_alvar_publisher_name
std::stringstream pose_alvar_publisher_name
Definition: rosinljubljana.h:308
WebotsRobot::moveCallback
void moveCallback(const geometry_msgs::Twist &msg)
Definition: rosinljubljana_objects.cpp:565
WebotsCamera::subCameraCamera
ros::Subscriber subCameraCamera
subscriber for camera image from webots
Definition: rosinljubljana.h:557
Field::generateOccupancyGrid
void generateOccupancyGrid()
Definition: rosinljubljana_objects.cpp:97
Robot::transformOdom
tf::Transform transformOdom
Definition: rosinljubljana.h:315
Robot::frameAr_pose_markerName
std::stringstream frameAr_pose_markerName
Name of alvar marker frame.
Definition: rosinljubljana.h:311
Camera::setName
void setName(std::string)
Definition: rosinljubljana_objects.cpp:729
WebotsRobot::controllerNameinWebots
std::string controllerNameinWebots
name of controller in webots environment
Definition: rosinljubljana.h:405
Robot::updatePositionOrientation
void updatePositionOrientation()
Definition: rosinljubljana_objects.cpp:305
Arrangement_2
CGAL::Arrangement_2< Traits_2 > Arrangement_2
Definition: rosinljubljana.h:66
WebotsRobot::subscribeGyro
void subscribeGyro(ros::NodeHandle)
Definition: rosinljubljana_objects.cpp:693
Robot::setFrames
void setFrames()
Definition: rosinljubljana_objects.cpp:219
Camera::setPositionOrientation
void setPositionOrientation(tf::Vector3, tf::Quaternion)
Definition: rosinljubljana_objects.cpp:705
Robot::pose_alvar
geometry_msgs::PoseWithCovarianceStamped pose_alvar
Vaifable for storing pose from alvar.
Definition: rosinljubljana.h:331
Field::Field
Field(ros::NodeHandle)
Definition: rosinljubljana_objects.cpp:31
Obstacle::segments
std::vector< Segment_2 > segments
segments variable for storing segments
Definition: rosinljubljana.h:107
Field::mapResolution
float mapResolution
several map Parameters
Definition: rosinljubljana.h:196
WebotsRobot::subGyro
ros::Subscriber subGyro
Definition: rosinljubljana.h:429
Camera::name
std::string name
Name of camera.
Definition: rosinljubljana.h:483
WebotsCamera::imageCamera
std::vector< float > imageCamera
Vector for obtaining image from camera.
Definition: rosinljubljana.h:544
WebotsCamera::pub_info
ros::Publisher pub_info
Publisher for camera info.
Definition: rosinljubljana.h:547
Robot::vx
float vx
variables for storing position, veloctiy parameters
Definition: rosinljubljana.h:338
Robot::frameMapName
std::stringstream frameMapName
Name of map frame.
Definition: rosinljubljana.h:295
Camera::Camera
Camera()
Definition: rosinljubljana_objects.cpp:700
WebotsRobot::rightWheelVelocityClient
ros::ServiceClient rightWheelVelocityClient
Definition: rosinljubljana.h:416
WebotsRobot::gyroNameinWebots
std::string gyroNameinWebots
Definition: rosinljubljana.h:421
Camera::br
tf::TransformBroadcaster br
Definition: rosinljubljana.h:476
Robot::LaserScan_publisher_name
std::stringstream LaserScan_publisher_name
Name of LaserScan publisher.
Definition: rosinljubljana.h:304
Camera::imagePublisherName
std::stringstream imagePublisherName
Names of publishers.
Definition: rosinljubljana.h:479
Robot::EKFOdometryCallback
void EKFOdometryCallback(const nav_msgs::Odometry &msg)
Definition: rosinljubljana_objects.cpp:345
Robot::vy
float vy
Definition: rosinljubljana.h:338
Robot::odom_publisher_name
std::stringstream odom_publisher_name
Name of odometry publisher.
Definition: rosinljubljana.h:307
roll
float roll
Definition: mobile_robot/src/robot.cpp:52
Robot::listener
tf::TransformListener listener
Definition: rosinljubljana.h:320
Field::deleteAll
void deleteAll()
Definition: rosinljubljana_objects.cpp:64
Field::publishOccupancyGrid
void publishOccupancyGrid(ros::NodeHandle n)
Definition: rosinljubljana_objects.cpp:158
Obstacle::clearSegments
void clearSegments()
Definition: rosinljubljana_objects.cpp:23
Robot::name
std::string name
Number of robot.
Definition: rosinljubljana.h:292
Robot::frameOdomName
std::stringstream frameOdomName
Name of odom frame.
Definition: rosinljubljana.h:298
WebotsRobot::gyroCallback
void gyroCallback(const sensor_msgs::Imu &imu)
Definition: rosinljubljana_objects.cpp:688
Field::origin
geometry_msgs::Pose origin
Definition: rosinljubljana.h:199
Camera::frameCameraName
std::stringstream frameCameraName
Name of camera frame.
Definition: rosinljubljana.h:472
Field::deleteObstacle
void deleteObstacle(std::string)
Definition: rosinljubljana_objects.cpp:55
Robot::transmitLaserScan
void transmitLaserScan(Robot[], int list_length, Field *field)
Definition: rosinljubljana_objects.cpp:431
Robot::angularz
float angularz
Definition: rosinljubljana.h:338
WebotsCamera::cameraNameinWebots
std::string cameraNameinWebots
Definition: rosinljubljana.h:551
Field::frameAr_pose_markerName
std::stringstream frameAr_pose_markerName
variable for storing alvar marker name
Definition: rosinljubljana.h:193
Robot::pose_alvar_publisher
ros::Publisher pose_alvar_publisher
Definition: rosinljubljana.h:325
Robot::LaserScan_publisher
ros::Publisher LaserScan_publisher
Publishers of LaserScan msg and Odometry msg.
Definition: rosinljubljana.h:323
WebotsRobot
Definition: rosinljubljana.h:349
Ray_2
Kernel::Ray_2 Ray_2
Definition: rosinljubljana.h:64
Camera::infoPublisherName
std::stringstream infoPublisherName
Definition: rosinljubljana.h:480
Field::updateObstacleFromAlvar
void updateObstacleFromAlvar(std::string, std::vector< int >)
Definition: rosinljubljana_objects.cpp:69
WebotsRobot::cmd_vel_subscriber_name
std::stringstream cmd_vel_subscriber_name
name of topic for cmd_vel
Definition: rosinljubljana.h:420
yaw
float yaw
Definition: mobile_robot/src/robot.cpp:50
Robot::odometryCallback
void odometryCallback(const nav_msgs::Odometry &msg)
Definition: rosinljubljana_objects.cpp:372
Polygon_2
CGAL::Polygon_2< Kernel > Polygon_2
Definition: rosinljubljana.h:72
WebotsRobot::leftWheelPositionClient
ros::ServiceClient leftWheelPositionClient
Definition: rosinljubljana.h:415
WebotsRobot::enableGyro
void enableGyro(ros::NodeHandle)
Definition: rosinljubljana_objects.cpp:677
Robot::br
tf::TransformBroadcaster br
Broadcaster and listener of robot transforms.
Definition: rosinljubljana.h:319
Field::map_pub
ros::Publisher map_pub
Occupancy grid publisher.
Definition: rosinljubljana.h:202
Robot::fi
float fi
Definition: rosinljubljana.h:339
WebotsRobot::leftWheelVelocityClient
ros::ServiceClient leftWheelVelocityClient
Definition: rosinljubljana.h:417
WebotsRobot::wheelRadius
float wheelRadius
Definition: rosinljubljana.h:425
Obstacle
Definition: rosinljubljana.h:82
TEV
CGAL::Triangular_expansion_visibility_2< Arrangement_2 > TEV
Definition: rosinljubljana.h:71
Robot::odom
nav_msgs::Odometry odom
Variable for storing Odometry msg.
Definition: rosinljubljana.h:328
WebotsRobot::transmitLaserScan
void transmitLaserScan(WebotsRobot[], int list_length, Field *field)
Definition: rosinljubljana_objects.cpp:580
Robot::time_2
ros::Time time_2
Definition: rosinljubljana.h:335
WebotsCamera::publish
void publish()
Definition: rosinljubljana_objects.cpp:837
WebotsCamera::WebotsCamera
WebotsCamera(ros::NodeHandle, image_transport::ImageTransport, std::string)
Definition: rosinljubljana_objects.cpp:737
Robot::y
float y
Definition: rosinljubljana.h:339
WebotsRobot::wheelSrv
webots_ros::set_float wheelSrv
variable for interfacing with webots
Definition: rosinljubljana.h:411
Obstacle::Obstacle
Obstacle(std::string)
Definition: rosinljubljana_objects.cpp:4
Robot
Definition: rosinljubljana.h:212
Field::mapWidth
uint32_t mapWidth
Definition: rosinljubljana.h:197
Robot::transformBase_Link
tf::Transform transformBase_Link
Definition: rosinljubljana.h:316
WebotsRobot::subscribeMove
void subscribeMove(ros::NodeHandle)
Definition: rosinljubljana_objects.cpp:672
Robot::transmitOdom
void transmitOdom()
Definition: rosinljubljana_objects.cpp:410
Obstacle::points
std::vector< Point_2 > points
points variable for storing points
Definition: rosinljubljana.h:104
Field::data
std::vector< signed char > data
data variable for storing occupancy grid
Definition: rosinljubljana.h:187
Robot::transmitPoseFromAlvarPoseMsg
void transmitPoseFromAlvarPoseMsg()
Definition: rosinljubljana_objects.cpp:251
Camera::transmitFrames
void transmitFrames()
Definition: rosinljubljana_objects.cpp:723
WebotsCamera::controllerNameinWebots
std::string controllerNameinWebots
Names of controller and camera in webots.
Definition: rosinljubljana.h:550
Robot::setPositionOrientation
void setPositionOrientation(tf::Vector3, tf::Quaternion)
Definition: rosinljubljana_objects.cpp:243
WebotsCamera::subscribe
void subscribe(ros::NodeHandle)
Definition: rosinljubljana_objects.cpp:830
WebotsCamera::pub
image_transport::Publisher pub
Publisher for image.
Definition: rosinljubljana.h:541
Robot::sub_ekf_odom
ros::Subscriber sub_ekf_odom
subscriber for robot odometry from ekf_odom
Definition: rosinljubljana.h:288
rosinljubljana.h
Robot::odom_publisher
ros::Publisher odom_publisher
Definition: rosinljubljana.h:324
WebotsRobot::WebotsRobot
WebotsRobot()
Definition: rosinljubljana_objects.cpp:532
Vector_2
Kernel::Vector_2 Vector_2
Definition: rosinljubljana.h:62
Field::obstacles
std::vector< Obstacle > obstacles
obstacles variable for storing obstacles
Definition: rosinljubljana.h:184
WebotsCamera::enable
void enable(ros::NodeHandle)
Definition: rosinljubljana_objects.cpp:818
WebotsRobot::subCmd_vel
ros::Subscriber subCmd_vel
Subscriber for cmd_vel topic.
Definition: rosinljubljana.h:428
Robot::transformMap
tf::Transform transformMap
Variables for transforms of frames.
Definition: rosinljubljana.h:314
Field::listener
tf::TransformListener listener
listener variable listening to alvar marker transforms
Definition: rosinljubljana.h:190
pitch
float pitch
Definition: mobile_robot/src/robot.cpp:51
Segment_2
Kernel::Segment_2 Segment_2
Definition: rosinljubljana.h:63
WebotsCamera::height
int height
Definition: rosinljubljana.h:538
Face_handle
Arrangement_2::Face_handle Face_handle
Definition: rosinljubljana.h:68
Field::addObstacle
void addObstacle(std::string, std::vector< Point_2 >)
Definition: rosinljubljana_objects.cpp:35
WebotsRobot::init
void init(ros::NodeHandle, std::string)
Definition: rosinljubljana_objects.cpp:538
WebotsCamera::width
int width
Parameters of camera.
Definition: rosinljubljana.h:537
WebotsRobot::wheelDistance
float wheelDistance
Robot physical parameters.
Definition: rosinljubljana.h:424
Robot::time
ros::Time time
Variables for determening time difference.
Definition: rosinljubljana.h:334
Camera::setFrames
void setFrames()
Definition: rosinljubljana_objects.cpp:713
Field
Definition: rosinljubljana.h:119
Robot::x
float x
Definition: rosinljubljana.h:339
Obstacle::name
std::string name
name variable for storing name
Definition: rosinljubljana.h:110
WebotsCamera::setCamInfo
void setCamInfo()
Definition: rosinljubljana_objects.cpp:772
TIME_STEP
#define TIME_STEP
Definition: rosinljubljana_objects.cpp:2
WebotsCamera::cam_info
sensor_msgs::CameraInfo cam_info
variable for storing camera info
Definition: rosinljubljana.h:554
Point_2
Kernel::Point_2 Point_2
Definition: rosinljubljana.h:61
Robot::setName
void setName(std::string, ros::NodeHandle nh)
Definition: rosinljubljana_objects.cpp:197
WebotsRobot::rightWheelPositionClient
ros::ServiceClient rightWheelPositionClient
service clients for individual wheels of robot
Definition: rosinljubljana.h:414
Robot::robot_ekf_odom_subscriber_name
std::stringstream robot_ekf_odom_subscriber_name
Definition: rosinljubljana.h:289
Robot::Robot
Robot()
Definition: rosinljubljana_objects.cpp:184


rosinljubljana
Author(s): Igor Banfi
autogenerated on Mon Feb 24 2020 12:32:36