OMPL Plannification
Path planning with OMPL
laserscan_to_pointcloud.cpp
1 // ROS
2 #include <ros/ros.h>
3 
4 // ROS LaserScan tools
5 #include <laser_geometry/laser_geometry.h>
6 
7 // ROS messages
8 #include <geometry_msgs/Pose.h>
9 #include <message_filters/subscriber.h>
10 #include <nav_msgs/Odometry.h>
11 #include <sensor_msgs/LaserScan.h>
12 #include <sensor_msgs/PointCloud.h>
13 #include <std_msgs/ColorRGBA.h>
14 #include <std_msgs/Bool.h>
15 #include <visualization_msgs/MarkerArray.h>
16 
17 // ROS services
18 #include <std_srvs/Empty.h>
19 
20 // ROS tf
21 #include <tf/message_filter.h>
22 #include <tf/transform_listener.h>
23 
24 // Octomap
25 #include <octomap/octomap.h>
26 #include <octomap_msgs/conversions.h>
27 //#include <octomap_msgs/OctomapBinary.h>
28 #include <octomap_msgs/GetOctomap.h>
29 typedef octomap_msgs::GetOctomap OctomapSrv;
30 //#include <laser_octomap/BoundingBoxQuery.h>
31 //typedef laser_octomap::BoundingBoxQuery BBXSrv;
32 #include <octomap_ros/conversions.h>
33 
34 #include <signal.h>
35 
36 
37 void stopNode(int sig)
38 {
39  ros::shutdown();
40  exit(0);
41 }
42 
45 {
46  public:
47  // Constructor and destructor
49 // virtual ~LaserScanToPointCloud();
50 
51  // Callbacks
52  void laserScanCallback(const sensor_msgs::LaserScanConstPtr& scan);
53 
54  private:
55 
56  // ROS
57  ros::NodeHandle node_hand_;
58  ros::Subscriber laser_scan_sub_;
59  ros::Publisher pc_pub_;
60 
61  //TF
62  tf::TransformListener listener_;
63 
64  //PC
65  laser_geometry::LaserProjection projector_;
66 };
67 
70  //=======================================================================
71  // Subscribers
72  //=======================================================================
73  //Mission Flag (feedback)
74  laser_scan_sub_ = node_hand_.subscribe("/scan", 2, &LaserScanToPointCloud::laserScanCallback, this);
75 
76  //=======================================================================
77  // Publishers
78  //=======================================================================
79  pc_pub_ = node_hand_.advertise<sensor_msgs::PointCloud2>("pc_from_scan", 2, true);
80 // // Waiting for mission flag
81 // ros::Rate loop_rate(10);
82 // if(!mission_flag_available_)
83 // ROS_WARN("Waiting for mission_flag");
84 // while (ros::ok() && !mission_flag_available_)
85 // {
86 // ros::spinOnce();
87 // loop_rate.sleep();
88 // }
89 // //Navigation data (feedback)
90 // odomSub_ = node_hand_.subscribe("/pose_ekf_slam/odometry", 1, &LaserScanToPointCloud::odomCallback, this);
91 // nav_sts_available_ = false;
92 // while (ros::ok() && !nav_sts_available_)
93 // {
94 // ros::spinOnce();
95 // loop_rate.sleep();
96 // }
97 }
98 
99 void LaserScanToPointCloud::laserScanCallback(const sensor_msgs::LaserScanConstPtr &scan){
100  if(!listener_.waitForTransform(
101  scan->header.frame_id,
102  "/odom",
103  scan->header.stamp + ros::Duration().fromSec(scan->ranges.size()*scan->time_increment),
104  ros::Duration(1.0))){
105  return;
106  }
107 
108  sensor_msgs::PointCloud2 cloud;
109  projector_.transformLaserScanToPointCloud("/base_link",*scan,
110  cloud,listener_);
111 
112  // Do something with cloud.
113  pc_pub_.publish(cloud);
114 }
115 
117 int main(int argc, char** argv){
118 
119  //=======================================================================
120  // Override SIGINT handler
121  //=======================================================================
122  signal(SIGINT, stopNode);
123 
124  // Init ROS node
125  ros::init(argc, argv, "laserscan_to_pointcloud");
126  ros::NodeHandle private_nh("~");
127 
128  // Constructor
129  LaserScanToPointCloud laserscan_to_pc;
130 
131  // Spin
132  ros::spin();
133 
134  // Exit main function without errors
135  return 0;
136 }
CLASS DEFINITION ===========================================================.
LaserScanToPointCloud()
Constructor and destructor =================================================.