gazebo_ros_laser.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2013 Open Source Robotics Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16 */
17 
18 /*
19  * Desc: Ros Laser controller.
20  * Author: Nathan Koenig
21  * Date: 01 Feb 2007
22  */
23 
24 #include <algorithm>
25 #include <string>
26 #include <assert.h>
27 
28 #include <gazebo/physics/World.hh>
29 #include <gazebo/physics/HingeJoint.hh>
30 #include <gazebo/sensors/Sensor.hh>
31 #include <sdf/sdf.hh>
32 #include <sdf/Param.hh>
33 #include <gazebo/common/Exception.hh>
34 #include <gazebo/sensors/RaySensor.hh>
35 #include <gazebo/sensors/SensorTypes.hh>
36 #include <gazebo/transport/transport.hh>
37 
38 #ifdef ENABLE_PROFILER
39 #include <ignition/common/Profiler.hh>
40 #endif
41 
42 #include <tf/tf.h>
43 #include <tf/transform_listener.h>
44 
46 #include <ignition/math/Rand.hh>
47 
48 namespace gazebo
49 {
50 // Register this plugin with the simulator
51 GZ_REGISTER_SENSOR_PLUGIN(GazeboRosLaser)
52 
53 // Constructor
56 {
57 }
58 
60 // Destructor
62 {
63  this->rosnode_->shutdown();
64  delete this->rosnode_;
65 }
66 
68 // Load the controller
69 void GazeboRosLaser::Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf)
70 {
71  // load plugin
72  RayPlugin::Load(_parent, this->sdf);
73  // Get the world name.
74  std::string worldName = _parent->WorldName();
75  this->world_ = physics::get_world(worldName);
76  // save pointers
77  this->sdf = _sdf;
78 
80  this->parent_ray_sensor_ =
81  dynamic_pointer_cast<sensors::RaySensor>(_parent);
82 
83  if (!this->parent_ray_sensor_)
84  gzthrow("GazeboRosLaser controller requires a Ray Sensor as its parent");
85 
86  this->robot_namespace_ = GetRobotNamespace(_parent, _sdf, "Laser");
87 
88  if (!this->sdf->HasElement("frameName"))
89  {
90  ROS_INFO_NAMED("laser", "Laser plugin missing <frameName>, defaults to /world");
91  this->frame_name_ = "/world";
92  }
93  else
94  this->frame_name_ = this->sdf->Get<std::string>("frameName");
95 
96 
97  if (!this->sdf->HasElement("topicName"))
98  {
99  ROS_INFO_NAMED("laser", "Laser plugin missing <topicName>, defaults to /world");
100  this->topic_name_ = "/world";
101  }
102  else
103  this->topic_name_ = this->sdf->Get<std::string>("topicName");
104 
105  this->laser_connect_count_ = 0;
106 
107  // Make sure the ROS node for Gazebo has already been initialized
108  if (!ros::isInitialized())
109  {
110  ROS_FATAL_STREAM_NAMED("laser", "A ROS node for Gazebo has not been initialized, unable to load plugin. "
111  << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)");
112  return;
113  }
114 
115  ROS_INFO_NAMED("laser", "Starting Laser Plugin (ns = %s)", this->robot_namespace_.c_str() );
116  // ros callback queue for processing subscription
117  this->deferred_load_thread_ = boost::thread(
118  boost::bind(&GazeboRosLaser::LoadThread, this));
119 
120 }
121 
123 // Load the controller
125 {
126  this->gazebo_node_ = gazebo::transport::NodePtr(new gazebo::transport::Node());
127  this->gazebo_node_->Init(this->world_name_);
128 
129  this->pmq.startServiceThread();
130 
131  this->rosnode_ = new ros::NodeHandle(this->robot_namespace_);
132 
133  this->tf_prefix_ = tf::getPrefixParam(*this->rosnode_);
134  ROS_INFO_NAMED("laser", "Laser Plugin (ns = %s) <tf_prefix_>, set to \"%s\"",
135  this->robot_namespace_.c_str(), this->tf_prefix_.c_str());
136 
137  // resolve tf prefix
138  this->frame_name_ = tf::resolve(this->tf_prefix_, this->frame_name_);
139 
140  if (this->topic_name_ != "")
141  {
143  ros::AdvertiseOptions::create<sensor_msgs::LaserScan>(
144  this->topic_name_, 1,
145  boost::bind(&GazeboRosLaser::LaserConnect, this),
146  boost::bind(&GazeboRosLaser::LaserDisconnect, this),
147  ros::VoidPtr(), NULL);
148  this->pub_ = this->rosnode_->advertise(ao);
149  this->pub_queue_ = this->pmq.addPub<sensor_msgs::LaserScan>();
150  }
151 
152  // Initialize the controller
153 
154  // sensor generation off by default
155  this->parent_ray_sensor_->SetActive(false);
156 }
157 
159 // Increment count
161 {
162  this->laser_connect_count_++;
163  if (this->laser_connect_count_ == 1)
164  this->laser_scan_sub_ =
165  this->gazebo_node_->Subscribe(this->parent_ray_sensor_->Topic(),
166  &GazeboRosLaser::OnScan, this);
167 }
168 
170 // Decrement count
172 {
173  this->laser_connect_count_--;
174  if (this->laser_connect_count_ == 0)
175  this->laser_scan_sub_.reset();
176 }
177 
179 // Convert new Gazebo message to ROS message and publish it
180 void GazeboRosLaser::OnScan(ConstLaserScanStampedPtr &_msg)
181 {
182 #ifdef ENABLE_PROFILER
183  IGN_PROFILE("GazeboRosLaser::OnScan");
184  IGN_PROFILE_BEGIN("fill ROS message");
185 #endif
186  // We got a new message from the Gazebo sensor. Stuff a
187  // corresponding ROS message and publish it.
188  sensor_msgs::LaserScan laser_msg;
189  laser_msg.header.stamp = ros::Time(_msg->time().sec(), _msg->time().nsec());
190  laser_msg.header.frame_id = this->frame_name_;
191  laser_msg.angle_min = _msg->scan().angle_min();
192  laser_msg.angle_max = _msg->scan().angle_max();
193  laser_msg.angle_increment = _msg->scan().angle_step();
194  laser_msg.time_increment = 0; // instantaneous simulator scan
195  laser_msg.scan_time = 0; // not sure whether this is correct
196  laser_msg.range_min = _msg->scan().range_min();
197  laser_msg.range_max = _msg->scan().range_max();
198  laser_msg.ranges.resize(_msg->scan().ranges_size());
199  std::copy(_msg->scan().ranges().begin(),
200  _msg->scan().ranges().end(),
201  laser_msg.ranges.begin());
202  laser_msg.intensities.resize(_msg->scan().intensities_size());
203  std::copy(_msg->scan().intensities().begin(),
204  _msg->scan().intensities().end(),
205  laser_msg.intensities.begin());
206  this->pub_queue_->push(laser_msg, this->pub_);
207 #ifdef ENABLE_PROFILER
208  IGN_PROFILE_END();
209 #endif
210 }
211 }
gazebo::GazeboRosLaser::LoadThread
void LoadThread()
Definition: gazebo_ros_gpu_laser.cpp:127
PubQueue::push
void push(T &msg, ros::Publisher &pub)
Push a new message onto the queue.
Definition: PubQueue.h:73
boost::shared_ptr
gazebo
gazebo::GazeboRosLaser::LaserDisconnect
void LaserDisconnect()
Definition: gazebo_ros_gpu_laser.cpp:176
gazebo_ros_laser.h
tf::resolve
std::string resolve(const std::string &prefix, const std::string &frame_name)
gazebo::GazeboRosLaser::topic_name_
std::string topic_name_
topic name
Definition: gazebo_ros_gpu_laser.h:74
gazebo::GazeboRosLaser::frame_name_
std::string frame_name_
frame transform name, should match link name
Definition: gazebo_ros_gpu_laser.h:77
ros::NodeHandle::advertise
Publisher advertise(AdvertiseOptions &ops)
ros::AdvertiseOptions
gazebo::GazeboRosLaser::~GazeboRosLaser
~GazeboRosLaser()
Destructor.
Definition: gazebo_ros_gpu_laser.cpp:62
gazebo::GazeboRosLaser::gazebo_node_
gazebo::transport::NodePtr gazebo_node_
Definition: gazebo_ros_gpu_laser.h:90
ROS_INFO_NAMED
#define ROS_INFO_NAMED(name,...)
gazebo::GazeboRosLaser::pmq
PubMultiQueue pmq
prevents blocking
Definition: gazebo_ros_gpu_laser.h:95
ROS_FATAL_STREAM_NAMED
#define ROS_FATAL_STREAM_NAMED(name, args)
tf::getPrefixParam
std::string getPrefixParam(ros::NodeHandle &nh)
gazebo::GazeboRosLaser::pub_queue_
PubQueue< sensor_msgs::LaserScan >::Ptr pub_queue_
Definition: gazebo_ros_gpu_laser.h:71
ros::isInitialized
ROSCPP_DECL bool isInitialized()
gazebo::GazeboRosLaser::GazeboRosLaser
GazeboRosLaser()
Constructor.
Definition: gazebo_ros_gpu_laser.cpp:56
gazebo::GazeboRosLaser::Load
void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf)
Load the plugin.
Definition: gazebo_ros_gpu_laser.cpp:72
PubMultiQueue::addPub
boost::shared_ptr< PubQueue< T > > addPub()
Add a new queue. Call this once for each published topic (or at least each type of publish message).
Definition: PubQueue.h:143
gazebo::GazeboRosLaser::world_
physics::WorldPtr world_
Definition: gazebo_ros_gpu_laser.h:64
gazebo::GazeboRosLaser::parent_ray_sensor_
sensors::GpuRaySensorPtr parent_ray_sensor_
The parent sensor.
Definition: gazebo_ros_gpu_laser.h:66
transform_listener.h
tf.h
PubMultiQueue::startServiceThread
void startServiceThread()
Start a thread to call spin().
Definition: PubQueue.h:181
gazebo::GazeboRosLaser::laser_scan_sub_
gazebo::transport::SubscriberPtr laser_scan_sub_
Definition: gazebo_ros_gpu_laser.h:91
ros::Time
gazebo::GazeboRosLaser::rosnode_
ros::NodeHandle * rosnode_
pointer to ros node
Definition: gazebo_ros_gpu_laser.h:69
gazebo::GazeboRosLaser::robot_namespace_
std::string robot_namespace_
for setting ROS name space
Definition: gazebo_ros_gpu_laser.h:83
gazebo::GazeboRosLaser::LaserConnect
void LaserConnect()
Definition: gazebo_ros_gpu_laser.cpp:165
gazebo::GazeboRosLaser::sdf
sdf::ElementPtr sdf
Definition: gazebo_ros_gpu_laser.h:86
gazebo::GazeboRosLaser::world_name_
std::string world_name_
Definition: gazebo_ros_gpu_laser.h:63
gazebo::GazeboRosLaser::tf_prefix_
std::string tf_prefix_
tf prefix
Definition: gazebo_ros_gpu_laser.h:80
assert.h
ros::NodeHandle::shutdown
void shutdown()
gazebo::GazeboRosLaser::OnScan
void OnScan(ConstLaserScanStampedPtr &_msg)
Definition: gazebo_ros_gpu_laser.cpp:185
gazebo::GetRobotNamespace
std::string GetRobotNamespace(const sensors::SensorPtr &parent, const sdf::ElementPtr &sdf, const char *pInfo=NULL)
Reads the name space tag of a sensor plugin.
Definition: gazebo_ros_utils.h:83
gazebo::GazeboRosLaser::deferred_load_thread_
boost::thread deferred_load_thread_
Definition: gazebo_ros_gpu_laser.h:88
gazebo::GazeboRosLaser::pub_
ros::Publisher pub_
Definition: gazebo_ros_gpu_laser.h:70
GAZEBO_SENSORS_USING_DYNAMIC_POINTER_CAST
#define GAZEBO_SENSORS_USING_DYNAMIC_POINTER_CAST
Definition: gazebo_ros_utils.h:49
ros::NodeHandle
gazebo::GazeboRosLaser::laser_connect_count_
int laser_connect_count_
Keep track of number of connctions.
Definition: gazebo_ros_gpu_laser.h:58


gazebo_plugins
Author(s): John Hsu
autogenerated on Thu Nov 23 2023 03:50:28