rosinljubljana.h
Go to the documentation of this file.
1 // -*- lsst-c++ -*-
2 /*
3  * This file is part of webost_sim.
4  *
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <https://www.gnu.org/licenses/>.
18  */
19  #include <stdint.h>
20 #include "ros/ros.h"
21 #include <std_msgs/String.h>
22 #include <iostream>
23 #include <signal.h>
24 #include <cmath>
25 #include <time.h>
26 #include <tf/transform_broadcaster.h>
27 #include <camera_info_manager/camera_info_manager.h>
28 #include <tf/transform_listener.h>
29 #include <nav_msgs/Odometry.h>
30 #include <geometry_msgs/PoseWithCovarianceStamped.h>
31 #include <nav_msgs/MapMetaData.h>
32 #include <nav_msgs/GetMap.h>
33 #include <nav_msgs/OccupancyGrid.h>
34 #include <image_transport/image_transport.h>
35 #include <cv_bridge/cv_bridge.h>
36 #include <sensor_msgs/image_encodings.h>
37 #include <sensor_msgs/Imu.h>
38 #include <opencv2/imgproc/imgproc.hpp>
39 #include <sensor_msgs/Image.h>
40 #include <sensor_msgs/LaserScan.h>
41 #include <webots_ros/camera_get_info.h>
42 #include <webots_ros/robot_get_device_list.h>
43 #include <webots_ros/save_image.h>
44 #include <webots_ros/get_int.h>
45 #include <webots_ros/set_int.h>
46 #include <webots_ros/get_string.h>
47 #include <webots_ros/set_float.h>
48 #include <CGAL/Exact_predicates_exact_constructions_kernel.h>
49 #include <CGAL/Simple_polygon_visibility_2.h>
50 #include <CGAL/Arrangement_2.h>
51 #include <CGAL/Arr_segment_traits_2.h>
52 #include <CGAL/Arr_naive_point_location.h>
53 #include <CGAL/Polygon_2.h>
54 #include <istream>
55 #include <CGAL/Triangular_expansion_visibility_2.h>
56 #include <CGAL/squared_distance_2.h>
57 #include <vector>
58 
59 // Define the used kernel and arrangement
60 typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
65 typedef CGAL::Arr_segment_traits_2<Kernel> Traits_2;
66 typedef CGAL::Arrangement_2<Traits_2> Arrangement_2;
70 // Define the used visibility class
71 typedef CGAL::Triangular_expansion_visibility_2<Arrangement_2> TEV;
72 typedef CGAL::Polygon_2<Kernel> Polygon_2;
73 
74 
82 class Obstacle
83 {
84 public:
89  Obstacle (std::string);
90 
96  void setSegments(std::vector<Point_2>);
97 
101  void clearSegments();
102 
104  std::vector<Point_2> points;
105 
107  std::vector<Segment_2> segments;
108 
110  std::string name;
111 };
112 
119 class Field
120 {
121 public:
125  Field(ros::NodeHandle);
126 
133  void addObstacle(std::string, std::vector<Point_2>);
134 
140  void addObstacle(std::string);
141 
148  void modifyObstacle(std::string, std::vector<Point_2>);
149 
155  void deleteObstacle(std::string);
156 
160  void deleteAll();
161 
168  void updateObstacleFromAlvar(std::string, std::vector<int>);
169 
173  void generateOccupancyGrid();
174 
180  void publishOccupancyGrid(ros::NodeHandle n);
181 
182 
184  std::vector<Obstacle> obstacles;
185 
187  std::vector<signed char> data;
188 
190  tf::TransformListener listener;
191 
193  std::stringstream frameAr_pose_markerName;
194 
197  uint32_t mapWidth;
198  uint32_t mapHeight;
199  geometry_msgs::Pose origin;
200 
202  ros::Publisher map_pub;
203 };
204 
205 
212 class Robot
213 {
214 
215 public:
219  Robot();
220 
227  void setName(std::string, ros::NodeHandle nh);
228 
232  void setFrames();
233 
237  void transmitFrames();
238 
245  void setPositionOrientation(tf::Vector3, tf::Quaternion);
246 
252 
253 
259  void EKFOdometryCallback(const nav_msgs::Odometry &msg);
260 
266 
272  void odometryCallback(const nav_msgs::Odometry & msg);
273 
280  void transmitLaserScan(Robot [], int list_length, Field *field);
281 
285  void transmitOdom();
286 
288  ros::Subscriber sub_ekf_odom;
290 
292  std::string name;
293 
295  std::stringstream frameMapName;
296 
298  std::stringstream frameOdomName;
299 
301  std::stringstream frameBase_linkName;
302 
304  std::stringstream LaserScan_publisher_name;
305 
307  std::stringstream odom_publisher_name;
308  std::stringstream pose_alvar_publisher_name;
309 
311  std::stringstream frameAr_pose_markerName;
312 
314  tf::Transform transformMap;
315  tf::Transform transformOdom;
316  tf::Transform transformBase_Link;
317 
319  tf::TransformBroadcaster br;
320  tf::TransformListener listener;
321 
323  ros::Publisher LaserScan_publisher;
324  ros::Publisher odom_publisher;
325  ros::Publisher pose_alvar_publisher;
326 
328  nav_msgs::Odometry odom;
329 
331  geometry_msgs::PoseWithCovarianceStamped pose_alvar;
332 
334  ros::Time time;
335  ros::Time time_2;
336 
338  float vx, vy, angularz;
339  float x, y, fi;
340 };
341 
349 class WebotsRobot: public Robot
350 {
351 public:
352 
357  WebotsRobot();
358 
365  void init(ros::NodeHandle, std::string);
366 
372  void moveCallback(const geometry_msgs::Twist& msg);
373 
379  void subscribeMove(ros::NodeHandle);
380 
386  void gyroCallback(const sensor_msgs::Imu &imu);
387 
394  void transmitLaserScan(WebotsRobot [], int list_length, Field *field);
395 
400  void enableGyro(ros::NodeHandle);
401 
402  void subscribeGyro(ros::NodeHandle);
403 
406 
408  std::string robotNameinWebots;
409 
411  webots_ros::set_float wheelSrv;
412 
414  ros::ServiceClient rightWheelPositionClient;
415  ros::ServiceClient leftWheelPositionClient;
416  ros::ServiceClient rightWheelVelocityClient;
417  ros::ServiceClient leftWheelVelocityClient;
418 
420  std::stringstream cmd_vel_subscriber_name;
421  std::string gyroNameinWebots;
422 
425  float wheelRadius;
426 
428  ros::Subscriber subCmd_vel;
429  ros::Subscriber subGyro;
430 
431 };
432 
438 class Camera
439 {
440 public:
444  Camera();
445 
451  void setName(std::string);
452 
456  void setFrames();
457 
461  void transmitFrames();
462 
469  void setPositionOrientation(tf::Vector3, tf::Quaternion);
470 
472  std::stringstream frameCameraName;
473 
475  tf::Transform transformCamera;
476  tf::TransformBroadcaster br;
477 
479  std::stringstream imagePublisherName;
480  std::stringstream infoPublisherName;
481 
483  std::string name;
484 };
485 
493 class WebotsCamera: public Camera
494 {
495 public:
503  WebotsCamera(ros::NodeHandle, image_transport::ImageTransport, std::string);
504 
510  void enable(ros::NodeHandle);
511 
517  void cameraCallback(const sensor_msgs::Image::ConstPtr &image);
518 
524  void subscribe(ros::NodeHandle);
525 
529  void setCamInfo();
530 
534  void publish();
535 
537  int width;
538  int height;
539 
541  image_transport::Publisher pub;
542 
544  std::vector<float> imageCamera;
545 
547  ros::Publisher pub_info;
548 
551  std::string cameraNameinWebots;
552 
554  sensor_msgs::CameraInfo cam_info;
555 
557  ros::Subscriber subCameraCamera;
558 
559 };
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
WebotsCamera
Definition: rosinljubljana.h:493
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
Camera
Definition: rosinljubljana.h:438
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
Kernel
CGAL::Exact_predicates_exact_constructions_kernel Kernel
Definition: rosinljubljana.h:60
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
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
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::robotNameinWebots
std::string robotNameinWebots
name of robot in webots environment
Definition: rosinljubljana.h:408
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
Traits_2
CGAL::Arr_segment_traits_2< Kernel > Traits_2
Definition: rosinljubljana.h:65
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
Edge_const_iterator
Arrangement_2::Edge_const_iterator Edge_const_iterator
Definition: rosinljubljana.h:69
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
Halfedge_const_handle
Arrangement_2::Halfedge_const_handle Halfedge_const_handle
Definition: rosinljubljana.h:67
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
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