gazebo_ros_interface_plugin.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2016 Geoffrey Hunter <gbmhunter@gmail.com>
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 // MODULE
19 
20 // SYSTEM
21 #include <stdio.h>
22 #include <chrono>
23 #include <cmath>
24 #include <iostream>
25 
26 // 3RD PARTY
27 #include <std_msgs/Header.h>
28 #include <boost/bind.hpp>
29 
30 namespace gazebo {
31 
33  : WorldPlugin(), gz_node_handle_(0), ros_node_handle_(0) {}
34 
36 
37  // Shutdown and delete ROS node handle
38  if (ros_node_handle_) {
40  delete ros_node_handle_;
41  }
42 }
43 
44 void GazeboRosInterfacePlugin::Load(physics::WorldPtr _world,
45  sdf::ElementPtr _sdf) {
46  if (kPrintOnPluginLoad) {
47  gzdbg << __FUNCTION__ << "() called." << std::endl;
48  }
49 
51  world_ = _world;
52 
53  // namespace_.clear();
54 
55  //==============================================//
56  //========== READ IN PARAMS FROM SDF ===========//
57  //==============================================//
58 
59  /*if (_sdf->HasElement("robotNamespace"))
60  namespace_ = _sdf->GetElement("robotNamespace")->Get<std::string>();
61  else
62  gzerr << "Please specify a robotNamespace.\n";
63  gzdbg << "namespace_ = \"" << namespace_ << "\"." << std::endl;*/
64 
65  // Get Gazebo node handle
66  gz_node_handle_ = transport::NodePtr(new transport::Node());
67  // gz_node_handle_->Init(namespace_);
68  gz_node_handle_->Init();
69 
70  // Get ROS node handle
71  // ros_node_handle_ = new ros::NodeHandle(namespace_);
73 
74  // Listen to the update event. This event is broadcast every
75  // simulation iteration.
76  this->updateConnection_ = event::Events::ConnectWorldUpdateBegin(
77  boost::bind(&GazeboRosInterfacePlugin::OnUpdate, this, _1));
78 
79  // ============================================ //
80  // === CONNECT GAZEBO TO ROS MESSAGES SETUP === //
81  // ============================================ //
82 
86 
87  // ============================================ //
88  // === CONNECT ROS TO GAZEBO MESSAGES SETUP === //
89  // ============================================ //
90 
94 
95  // ============================================ //
96  // ===== BROADCAST TRANSFORM MESSAGE SETUP ==== //
97  // ============================================ //
98 
102 }
103 
104 void GazeboRosInterfacePlugin::OnUpdate(const common::UpdateInfo& _info) {
105  // Do nothing
106  // This plugins actions are all executed through message callbacks.
107 }
108 
114 template <typename GazeboMsgT>
118 
123 
126 
132  (ptr->*fp)(msg_ptr, ros_publisher);
133  }
134 };
135 
136 template <typename GazeboMsgT, typename RosMsgT>
138  void (GazeboRosInterfacePlugin::*fp)(
140  GazeboRosInterfacePlugin* ptr, std::string gazeboNamespace,
141  std::string gazeboTopicName, std::string rosTopicName,
142  transport::NodePtr gz_node_handle) {
143  // One map will be created for each Gazebo message type
144  static std::map<std::string, ConnectHelperStorage<GazeboMsgT> > callback_map;
145 
146  // Create ROS publisher
147  ros::Publisher ros_publisher =
148  ros_node_handle_->advertise<RosMsgT>(rosTopicName, 1);
149 
150  auto callback_entry = callback_map.emplace(
151  gazeboTopicName,
152  ConnectHelperStorage<GazeboMsgT>{ptr, fp, ros_publisher});
153 
154  // Check if element was already present
155  if (!callback_entry.second)
156  gzerr << "Tried to add element to map but the gazebo topic name was "
157  "already present in map."
158  << std::endl;
159 
160  // Create subscriber
161  gazebo::transport::SubscriberPtr subscriberPtr;
162  subscriberPtr = gz_node_handle->Subscribe(
164  &callback_entry.first->second);
165 
166  // Save a reference to the subscriber pointer so subscriber
167  // won't be deleted.
168  subscriberPtrs_.push_back(subscriberPtr);
169 }
170 
172  GzConnectGazeboToRosTopicMsgPtr& gz_connect_gazebo_to_ros_topic_msg) {
173  if (kPrintOnMsgCallback) {
174  gzdbg << __FUNCTION__ << "() called." << std::endl;
175  }
176 
177  const std::string gazeboNamespace =
178  ""; // gz_connect_gazebo_to_ros_topic_msg->gazebo_namespace();
179  const std::string gazeboTopicName =
180  gz_connect_gazebo_to_ros_topic_msg->gazebo_topic();
181  const std::string rosTopicName =
182  gz_connect_gazebo_to_ros_topic_msg->ros_topic();
183 
184  gzdbg << "Connecting Gazebo topic \"" << gazeboTopicName
185  << "\" to ROS topic \"" << rosTopicName << "\"." << std::endl;
186 
187  switch (gz_connect_gazebo_to_ros_topic_msg->msgtype()) {
188  case gz_std_msgs::ConnectGazeboToRosTopic::ACTUATORS:
189  ConnectHelper<gz_sensor_msgs::Actuators, mav_msgs::Actuators>(
191  gazeboNamespace, gazeboTopicName, rosTopicName, gz_node_handle_);
192  break;
193  case gz_std_msgs::ConnectGazeboToRosTopic::FLOAT_32:
194  ConnectHelper<gz_std_msgs::Float32, std_msgs::Float32>(
196  gazeboNamespace, gazeboTopicName, rosTopicName, gz_node_handle_);
197  break;
198  case gz_std_msgs::ConnectGazeboToRosTopic::FLUID_PRESSURE:
199  ConnectHelper<gz_sensor_msgs::FluidPressure, sensor_msgs::FluidPressure>(
201  gazeboNamespace, gazeboTopicName, rosTopicName, gz_node_handle_);
202  break;
203  case gz_std_msgs::ConnectGazeboToRosTopic::IMU:
204  ConnectHelper<gz_sensor_msgs::Imu, sensor_msgs::Imu>(
205  &GazeboRosInterfacePlugin::GzImuMsgCallback, this, gazeboNamespace,
206  gazeboTopicName, rosTopicName, gz_node_handle_);
207  break;
208  case gz_std_msgs::ConnectGazeboToRosTopic::JOINT_STATE:
209  ConnectHelper<gz_sensor_msgs::JointState, sensor_msgs::JointState>(
211  gazeboNamespace, gazeboTopicName, rosTopicName, gz_node_handle_);
212  break;
213  case gz_std_msgs::ConnectGazeboToRosTopic::MAGNETIC_FIELD:
214  ConnectHelper<gz_sensor_msgs::MagneticField, sensor_msgs::MagneticField>(
216  gazeboNamespace, gazeboTopicName, rosTopicName, gz_node_handle_);
217  break;
218  case gz_std_msgs::ConnectGazeboToRosTopic::NAV_SAT_FIX:
219  ConnectHelper<gz_sensor_msgs::NavSatFix, sensor_msgs::NavSatFix>(
220  &GazeboRosInterfacePlugin::GzNavSatFixCallback, this, gazeboNamespace,
221  gazeboTopicName, rosTopicName, gz_node_handle_);
222  break;
223  case gz_std_msgs::ConnectGazeboToRosTopic::POSE:
224  ConnectHelper<gazebo::msgs::Pose, geometry_msgs::Pose>(
225  &GazeboRosInterfacePlugin::GzPoseMsgCallback, this, gazeboNamespace,
226  gazeboTopicName, rosTopicName, gz_node_handle_);
227  break;
228  case gz_std_msgs::ConnectGazeboToRosTopic::POSE_WITH_COVARIANCE_STAMPED:
229  ConnectHelper<gz_geometry_msgs::PoseWithCovarianceStamped,
230  geometry_msgs::PoseWithCovarianceStamped>(
232  this, gazeboNamespace, gazeboTopicName, rosTopicName,
234  break;
235  case gz_std_msgs::ConnectGazeboToRosTopic::ODOMETRY:
236  ConnectHelper<gz_geometry_msgs::Odometry, nav_msgs::Odometry>(
238  gazeboNamespace, gazeboTopicName, rosTopicName, gz_node_handle_);
239  break;
240  case gz_std_msgs::ConnectGazeboToRosTopic::TRANSFORM_STAMPED:
241  ConnectHelper<gz_geometry_msgs::TransformStamped,
242  geometry_msgs::TransformStamped>(
244  gazeboNamespace, gazeboTopicName, rosTopicName, gz_node_handle_);
245  break;
246  case gz_std_msgs::ConnectGazeboToRosTopic::TWIST_STAMPED:
247  ConnectHelper<gz_geometry_msgs::TwistStamped,
248  geometry_msgs::TwistStamped>(
250  gazeboNamespace, gazeboTopicName, rosTopicName, gz_node_handle_);
251  break;
252  case gz_std_msgs::ConnectGazeboToRosTopic::VECTOR_3D_STAMPED:
253  ConnectHelper<gz_geometry_msgs::Vector3dStamped,
254  geometry_msgs::PointStamped>(
256  gazeboNamespace, gazeboTopicName, rosTopicName, gz_node_handle_);
257  break;
258  case gz_std_msgs::ConnectGazeboToRosTopic::WIND_SPEED:
259  ConnectHelper<gz_mav_msgs::WindSpeed,
260  rotors_comm::WindSpeed>(
262  gazeboNamespace, gazeboTopicName, rosTopicName, gz_node_handle_);
263  break;
264  case gz_std_msgs::ConnectGazeboToRosTopic::WRENCH_STAMPED:
265  ConnectHelper<gz_geometry_msgs::WrenchStamped,
266  geometry_msgs::WrenchStamped>(
268  gazeboNamespace, gazeboTopicName, rosTopicName, gz_node_handle_);
269  break;
270  default:
271  gzthrow("ConnectGazeboToRosTopic message type with enum val = "
272  << gz_connect_gazebo_to_ros_topic_msg->msgtype()
273  << " is not supported by GazeboRosInterfacePlugin.");
274  }
275 
276  gzdbg << __FUNCTION__ << "() finished." << std::endl;
277 }
278 
280  GzConnectRosToGazeboTopicMsgPtr& gz_connect_ros_to_gazebo_topic_msg) {
281  if (kPrintOnMsgCallback) {
282  gzdbg << __FUNCTION__ << "() called." << std::endl;
283  }
284 
285  static std::vector<ros::Subscriber> ros_subscribers;
286 
287  switch (gz_connect_ros_to_gazebo_topic_msg->msgtype()) {
288  case gz_std_msgs::ConnectRosToGazeboTopic::ACTUATORS: {
289  gazebo::transport::PublisherPtr gz_publisher_ptr =
290  gz_node_handle_->Advertise<gz_sensor_msgs::Actuators>(
291  gz_connect_ros_to_gazebo_topic_msg->gazebo_topic(), 1);
292 
293  // Create ROS subscriber.
294  ros::Subscriber ros_subscriber =
295  ros_node_handle_->subscribe<mav_msgs::Actuators>(
296  gz_connect_ros_to_gazebo_topic_msg->ros_topic(), 1,
298  this, _1, gz_publisher_ptr));
299 
300  // Save reference to the ROS subscriber so callback will continue to be
301  // called.
302  ros_subscribers.push_back(ros_subscriber);
303 
304  break;
305  }
306  case gz_std_msgs::ConnectRosToGazeboTopic::COMMAND_MOTOR_SPEED: {
307  gazebo::transport::PublisherPtr gz_publisher_ptr =
308  gz_node_handle_->Advertise<gz_mav_msgs::CommandMotorSpeed>(
309  gz_connect_ros_to_gazebo_topic_msg->gazebo_topic(), 1);
310 
311  // Create ROS subscriber.
312  ros::Subscriber ros_subscriber =
313  ros_node_handle_->subscribe<mav_msgs::Actuators>(
314  gz_connect_ros_to_gazebo_topic_msg->ros_topic(), 1,
315  boost::bind(
317  this, _1, gz_publisher_ptr));
318 
319  // Save reference to the ROS subscriber so callback will continue to be
320  // called.
321  ros_subscribers.push_back(ros_subscriber);
322 
323  break;
324  }
325  case gz_std_msgs::ConnectRosToGazeboTopic::ROLL_PITCH_YAWRATE_THRUST: {
326  gazebo::transport::PublisherPtr gz_publisher_ptr =
327  gz_node_handle_->Advertise<gz_mav_msgs::RollPitchYawrateThrust>(
328  gz_connect_ros_to_gazebo_topic_msg->gazebo_topic(), 1);
329 
330  // Create ROS subscriber.
331  ros::Subscriber ros_subscriber =
332  ros_node_handle_->subscribe<mav_msgs::RollPitchYawrateThrust>(
333  gz_connect_ros_to_gazebo_topic_msg->ros_topic(), 1,
334  boost::bind(
337  this, _1, gz_publisher_ptr));
338 
339  // Save reference to the ROS subscriber so callback will continue to be
340  // called.
341  ros_subscribers.push_back(ros_subscriber);
342 
343  break;
344  }
345  case gz_std_msgs::ConnectRosToGazeboTopic::WIND_SPEED: {
346  gazebo::transport::PublisherPtr gz_publisher_ptr =
347  gz_node_handle_->Advertise<gz_mav_msgs::WindSpeed>(
348  gz_connect_ros_to_gazebo_topic_msg->gazebo_topic(), 1);
349 
350  // Create ROS subscriber.
351  ros::Subscriber ros_subscriber =
352  ros_node_handle_->subscribe<rotors_comm::WindSpeed>(
353  gz_connect_ros_to_gazebo_topic_msg->ros_topic(), 1,
355  this, _1, gz_publisher_ptr));
356 
357  // Save reference to the ROS subscriber so callback will continue to be
358  // called.
359  ros_subscribers.push_back(ros_subscriber);
360 
361  break;
362  }
363  default: {
364  gzthrow("ConnectRosToGazeboTopic message type with enum val = "
365  << gz_connect_ros_to_gazebo_topic_msg->msgtype()
366  << " is not supported by GazeboRosInterfacePlugin.");
367  }
368  }
369 }
370 
371 //===========================================================================//
372 //==================== HELPER METHODS FOR MSG CONVERSION ====================//
373 //===========================================================================//
374 
376  const gz_std_msgs::Header& gz_header,
377  std_msgs::Header_<std::allocator<void> >* ros_header) {
378  ros_header->stamp.sec = gz_header.stamp().sec();
379  ros_header->stamp.nsec = gz_header.stamp().nsec();
380  ros_header->frame_id = gz_header.frame_id();
381 }
382 
384  const std_msgs::Header_<std::allocator<void> >& ros_header,
385  gz_std_msgs::Header* gz_header) {
386  gz_header->mutable_stamp()->set_sec(ros_header.stamp.sec);
387  gz_header->mutable_stamp()->set_nsec(ros_header.stamp.nsec);
388  gz_header->set_frame_id(ros_header.frame_id);
389 }
390 
391 //===========================================================================//
392 //================ GAZEBO -> ROS MSG CALLBACKS/CONVERTERS ===================//
393 //===========================================================================//
394 
396  GzActuatorsMsgPtr& gz_actuators_msg, ros::Publisher ros_publisher) {
397  // We need to convert the Acutuators message from a Gazebo message to a
398  // ROS message and then publish it to the ROS framework
399 
400  ConvertHeaderGzToRos(gz_actuators_msg->header(), &ros_actuators_msg_.header);
401 
402  ros_actuators_msg_.angular_velocities.resize(
403  gz_actuators_msg->angular_velocities_size());
404  for (int i = 0; i < gz_actuators_msg->angular_velocities_size(); i++) {
405  ros_actuators_msg_.angular_velocities[i] =
406  gz_actuators_msg->angular_velocities(i);
407  }
408 
409  // Publish to ROS.
410  ros_publisher.publish(ros_actuators_msg_);
411 }
412 
414  GzFloat32MsgPtr& gz_float_32_msg, ros::Publisher ros_publisher) {
415  // Convert Gazebo message to ROS message
416  ros_float_32_msg_.data = gz_float_32_msg->data();
417 
418  // Publish to ROS
419  ros_publisher.publish(ros_float_32_msg_);
420 }
421 
423  GzFluidPressureMsgPtr &gz_fluid_pressure_msg,
424  ros::Publisher ros_publisher) {
425  // We need to convert from a Gazebo message to a ROS message,
426  // and then forward the FluidPressure message onto ROS.
427 
428  ConvertHeaderGzToRos(gz_fluid_pressure_msg->header(),
429  &ros_fluid_pressure_msg_.header);
430 
431  ros_fluid_pressure_msg_.fluid_pressure =
432  gz_fluid_pressure_msg->fluid_pressure();
433 
434  ros_fluid_pressure_msg_.variance = gz_fluid_pressure_msg->variance();
435 
436  // Publish to ROS.
437  ros_publisher.publish(ros_fluid_pressure_msg_);
438 }
439 
441  ros::Publisher ros_publisher) {
442  // We need to convert from a Gazebo message to a ROS message,
443  // and then forward the IMU message onto ROS
444 
445  ConvertHeaderGzToRos(gz_imu_msg->header(), &ros_imu_msg_.header);
446 
447  ros_imu_msg_.orientation.x = gz_imu_msg->orientation().x();
448  ros_imu_msg_.orientation.y = gz_imu_msg->orientation().y();
449  ros_imu_msg_.orientation.z = gz_imu_msg->orientation().z();
450  ros_imu_msg_.orientation.w = gz_imu_msg->orientation().w();
451 
452  // Orientation covariance should have 9 elements, and both the Gazebo and ROS
453  // arrays should be the same size!
454  GZ_ASSERT(gz_imu_msg->orientation_covariance_size() == 9,
455  "The Gazebo IMU message does not have 9 orientation covariance "
456  "elements.");
457  GZ_ASSERT(
458  ros_imu_msg_.orientation_covariance.size() == 9,
459  "The ROS IMU message does not have 9 orientation covariance elements.");
460  for (int i = 0; i < gz_imu_msg->orientation_covariance_size(); i++) {
461  ros_imu_msg_.orientation_covariance[i] =
462  gz_imu_msg->orientation_covariance(i);
463  }
464 
465  ros_imu_msg_.angular_velocity.x = gz_imu_msg->angular_velocity().x();
466  ros_imu_msg_.angular_velocity.y = gz_imu_msg->angular_velocity().y();
467  ros_imu_msg_.angular_velocity.z = gz_imu_msg->angular_velocity().z();
468 
469  GZ_ASSERT(gz_imu_msg->angular_velocity_covariance_size() == 9,
470  "The Gazebo IMU message does not have 9 angular velocity "
471  "covariance elements.");
472  GZ_ASSERT(ros_imu_msg_.angular_velocity_covariance.size() == 9,
473  "The ROS IMU message does not have 9 angular velocity covariance "
474  "elements.");
475  for (int i = 0; i < gz_imu_msg->angular_velocity_covariance_size(); i++) {
476  ros_imu_msg_.angular_velocity_covariance[i] =
477  gz_imu_msg->angular_velocity_covariance(i);
478  }
479 
480  ros_imu_msg_.linear_acceleration.x = gz_imu_msg->linear_acceleration().x();
481  ros_imu_msg_.linear_acceleration.y = gz_imu_msg->linear_acceleration().y();
482  ros_imu_msg_.linear_acceleration.z = gz_imu_msg->linear_acceleration().z();
483 
484  GZ_ASSERT(gz_imu_msg->linear_acceleration_covariance_size() == 9,
485  "The Gazebo IMU message does not have 9 linear acceleration "
486  "covariance elements.");
487  GZ_ASSERT(ros_imu_msg_.linear_acceleration_covariance.size() == 9,
488  "The ROS IMU message does not have 9 linear acceleration "
489  "covariance elements.");
490  for (int i = 0; i < gz_imu_msg->linear_acceleration_covariance_size(); i++) {
491  ros_imu_msg_.linear_acceleration_covariance[i] =
492  gz_imu_msg->linear_acceleration_covariance(i);
493  }
494 
495  // Publish to ROS.
496  ros_publisher.publish(ros_imu_msg_);
497 }
498 
500  GzJointStateMsgPtr& gz_joint_state_msg, ros::Publisher ros_publisher) {
501  ConvertHeaderGzToRos(gz_joint_state_msg->header(),
502  &ros_joint_state_msg_.header);
503 
504  ros_joint_state_msg_.name.resize(gz_joint_state_msg->name_size());
505  for (int i = 0; i < gz_joint_state_msg->name_size(); i++) {
506  ros_joint_state_msg_.name[i] = gz_joint_state_msg->name(i);
507  }
508 
509  ros_joint_state_msg_.position.resize(gz_joint_state_msg->position_size());
510  for (int i = 0; i < gz_joint_state_msg->position_size(); i++) {
511  ros_joint_state_msg_.position[i] = gz_joint_state_msg->position(i);
512  }
513 
514  // Publish to ROS.
515  ros_publisher.publish(ros_joint_state_msg_);
516 }
517 
519  GzMagneticFieldMsgPtr& gz_magnetic_field_msg,
520  ros::Publisher ros_publisher) {
521  // We need to convert from a Gazebo message to a ROS message,
522  // and then forward the MagneticField message onto ROS
523 
524  ConvertHeaderGzToRos(gz_magnetic_field_msg->header(),
525  &ros_magnetic_field_msg_.header);
526 
527  ros_magnetic_field_msg_.magnetic_field.x =
528  gz_magnetic_field_msg->magnetic_field().x();
529  ros_magnetic_field_msg_.magnetic_field.y =
530  gz_magnetic_field_msg->magnetic_field().y();
531  ros_magnetic_field_msg_.magnetic_field.z =
532  gz_magnetic_field_msg->magnetic_field().z();
533 
534  // Position covariance should have 9 elements, and both the Gazebo and ROS
535  // arrays should be the same size!
536  GZ_ASSERT(gz_magnetic_field_msg->magnetic_field_covariance_size() == 9,
537  "The Gazebo MagneticField message does not have 9 magnetic field "
538  "covariance elements.");
539  GZ_ASSERT(ros_magnetic_field_msg_.magnetic_field_covariance.size() == 9,
540  "The ROS MagneticField message does not have 9 magnetic field "
541  "covariance elements.");
542  for (int i = 0; i < gz_magnetic_field_msg->magnetic_field_covariance_size();
543  i++) {
544  ros_magnetic_field_msg_.magnetic_field_covariance[i] =
545  gz_magnetic_field_msg->magnetic_field_covariance(i);
546  }
547 
548  // Publish to ROS.
549  ros_publisher.publish(ros_magnetic_field_msg_);
550 }
551 
553  GzNavSatFixPtr& gz_nav_sat_fix_msg, ros::Publisher ros_publisher) {
554  // We need to convert from a Gazebo message to a ROS message, and then forward
555  // the NavSatFix message to ROS.
556 
557  ConvertHeaderGzToRos(gz_nav_sat_fix_msg->header(),
558  &ros_nav_sat_fix_msg_.header);
559 
560  switch (gz_nav_sat_fix_msg->service()) {
561  case gz_sensor_msgs::NavSatFix::SERVICE_GPS:
562  ros_nav_sat_fix_msg_.status.service =
563  sensor_msgs::NavSatStatus::SERVICE_GPS;
564  break;
565  case gz_sensor_msgs::NavSatFix::SERVICE_GLONASS:
566  ros_nav_sat_fix_msg_.status.service =
567  sensor_msgs::NavSatStatus::SERVICE_GLONASS;
568  break;
569  case gz_sensor_msgs::NavSatFix::SERVICE_COMPASS:
570  ros_nav_sat_fix_msg_.status.service =
571  sensor_msgs::NavSatStatus::SERVICE_COMPASS;
572  break;
573  case gz_sensor_msgs::NavSatFix::SERVICE_GALILEO:
574  ros_nav_sat_fix_msg_.status.service =
575  sensor_msgs::NavSatStatus::SERVICE_GALILEO;
576  break;
577  default:
578  gzthrow(
579  "Specific value of enum type gz_sensor_msgs::NavSatFix::Service is "
580  "not yet supported.");
581  }
582 
583  switch (gz_nav_sat_fix_msg->status()) {
584  case gz_sensor_msgs::NavSatFix::STATUS_NO_FIX:
585  ros_nav_sat_fix_msg_.status.status =
586  sensor_msgs::NavSatStatus::STATUS_NO_FIX;
587  break;
588  case gz_sensor_msgs::NavSatFix::STATUS_FIX:
589  ros_nav_sat_fix_msg_.status.status =
590  sensor_msgs::NavSatStatus::STATUS_FIX;
591  break;
592  case gz_sensor_msgs::NavSatFix::STATUS_SBAS_FIX:
593  ros_nav_sat_fix_msg_.status.status =
594  sensor_msgs::NavSatStatus::STATUS_SBAS_FIX;
595  break;
596  case gz_sensor_msgs::NavSatFix::STATUS_GBAS_FIX:
597  ros_nav_sat_fix_msg_.status.status =
598  sensor_msgs::NavSatStatus::STATUS_GBAS_FIX;
599  break;
600  default:
601  gzthrow(
602  "Specific value of enum type gz_sensor_msgs::NavSatFix::Status is "
603  "not yet supported.");
604  }
605 
606  ros_nav_sat_fix_msg_.latitude = gz_nav_sat_fix_msg->latitude();
607  ros_nav_sat_fix_msg_.longitude = gz_nav_sat_fix_msg->longitude();
608  ros_nav_sat_fix_msg_.altitude = gz_nav_sat_fix_msg->altitude();
609 
610  switch (gz_nav_sat_fix_msg->position_covariance_type()) {
611  case gz_sensor_msgs::NavSatFix::COVARIANCE_TYPE_UNKNOWN:
612  ros_nav_sat_fix_msg_.position_covariance_type =
613  sensor_msgs::NavSatFix::COVARIANCE_TYPE_UNKNOWN;
614  break;
615  case gz_sensor_msgs::NavSatFix::COVARIANCE_TYPE_APPROXIMATED:
616  ros_nav_sat_fix_msg_.position_covariance_type =
617  sensor_msgs::NavSatFix::COVARIANCE_TYPE_APPROXIMATED;
618  break;
619  case gz_sensor_msgs::NavSatFix::COVARIANCE_TYPE_DIAGONAL_KNOWN:
620  ros_nav_sat_fix_msg_.position_covariance_type =
621  sensor_msgs::NavSatFix::COVARIANCE_TYPE_DIAGONAL_KNOWN;
622  break;
623  case gz_sensor_msgs::NavSatFix::COVARIANCE_TYPE_KNOWN:
624  ros_nav_sat_fix_msg_.position_covariance_type =
625  sensor_msgs::NavSatFix::COVARIANCE_TYPE_KNOWN;
626  break;
627  default:
628  gzthrow(
629  "Specific value of enum type "
630  "gz_sensor_msgs::NavSatFix::PositionCovarianceType is not yet "
631  "supported.");
632  }
633 
634  // Position covariance should have 9 elements, and both the Gazebo and ROS
635  // arrays should be the same size!
636  GZ_ASSERT(gz_nav_sat_fix_msg->position_covariance_size() == 9,
637  "The Gazebo NavSatFix message does not have 9 position covariance "
638  "elements.");
639  GZ_ASSERT(ros_nav_sat_fix_msg_.position_covariance.size() == 9,
640  "The ROS NavSatFix message does not have 9 position covariance "
641  "elements.");
642  for (int i = 0; i < gz_nav_sat_fix_msg->position_covariance_size(); i++) {
643  ros_nav_sat_fix_msg_.position_covariance[i] =
644  gz_nav_sat_fix_msg->position_covariance(i);
645  }
646 
647  // Publish to ROS.
648  ros_publisher.publish(ros_nav_sat_fix_msg_);
649 }
650 
652  GzOdometryMsgPtr& gz_odometry_msg, ros::Publisher ros_publisher) {
653  // We need to convert from a Gazebo message to a ROS message, and then forward
654  // the Odometry message to ROS.
655 
656  // ============================================ //
657  // =================== HEADER ================= //
658  // ============================================ //
659  ConvertHeaderGzToRos(gz_odometry_msg->header(), &ros_odometry_msg_.header);
660 
661  ros_odometry_msg_.child_frame_id = gz_odometry_msg->child_frame_id();
662 
663  // ============================================ //
664  // ===================== POSE ================= //
665  // ============================================ //
666  ros_odometry_msg_.pose.pose.position.x =
667  gz_odometry_msg->pose().pose().position().x();
668  ros_odometry_msg_.pose.pose.position.y =
669  gz_odometry_msg->pose().pose().position().y();
670  ros_odometry_msg_.pose.pose.position.z =
671  gz_odometry_msg->pose().pose().position().z();
672 
673  ros_odometry_msg_.pose.pose.orientation.w =
674  gz_odometry_msg->pose().pose().orientation().w();
675  ros_odometry_msg_.pose.pose.orientation.x =
676  gz_odometry_msg->pose().pose().orientation().x();
677  ros_odometry_msg_.pose.pose.orientation.y =
678  gz_odometry_msg->pose().pose().orientation().y();
679  ros_odometry_msg_.pose.pose.orientation.z =
680  gz_odometry_msg->pose().pose().orientation().z();
681 
682  for (int i = 0; i < gz_odometry_msg->pose().covariance_size(); i++) {
683  ros_odometry_msg_.pose.covariance[i] =
684  gz_odometry_msg->pose().covariance(i);
685  }
686 
687  // ============================================ //
688  // ===================== TWIST ================ //
689  // ============================================ //
690  ros_odometry_msg_.twist.twist.linear.x =
691  gz_odometry_msg->twist().twist().linear().x();
692  ros_odometry_msg_.twist.twist.linear.y =
693  gz_odometry_msg->twist().twist().linear().y();
694  ros_odometry_msg_.twist.twist.linear.z =
695  gz_odometry_msg->twist().twist().linear().z();
696 
697  ros_odometry_msg_.twist.twist.angular.x =
698  gz_odometry_msg->twist().twist().angular().x();
699  ros_odometry_msg_.twist.twist.angular.y =
700  gz_odometry_msg->twist().twist().angular().y();
701  ros_odometry_msg_.twist.twist.angular.z =
702  gz_odometry_msg->twist().twist().angular().z();
703 
704  for (int i = 0; i < gz_odometry_msg->twist().covariance_size(); i++) {
705  ros_odometry_msg_.twist.covariance[i] =
706  gz_odometry_msg->twist().covariance(i);
707  }
708 
709  // Publish to ROS framework.
710  ros_publisher.publish(ros_odometry_msg_);
711 }
712 
714  ros::Publisher ros_publisher) {
715  ros_pose_msg_.position.x = gz_pose_msg->position().x();
716  ros_pose_msg_.position.y = gz_pose_msg->position().y();
717  ros_pose_msg_.position.z = gz_pose_msg->position().z();
718 
719  ros_pose_msg_.orientation.w = gz_pose_msg->orientation().w();
720  ros_pose_msg_.orientation.x = gz_pose_msg->orientation().x();
721  ros_pose_msg_.orientation.y = gz_pose_msg->orientation().y();
722  ros_pose_msg_.orientation.z = gz_pose_msg->orientation().z();
723 
724  ros_publisher.publish(ros_pose_msg_);
725 }
726 
728  GzPoseWithCovarianceStampedMsgPtr& gz_pose_with_covariance_stamped_msg,
729  ros::Publisher ros_publisher) {
730  // ============================================ //
731  // =================== HEADER ================= //
732  // ============================================ //
733  ConvertHeaderGzToRos(gz_pose_with_covariance_stamped_msg->header(),
735 
736  // ============================================ //
737  // === POSE (both position and orientation) === //
738  // ============================================ //
739  ros_pose_with_covariance_stamped_msg_.pose.pose.position.x =
740  gz_pose_with_covariance_stamped_msg->pose_with_covariance()
741  .pose()
742  .position()
743  .x();
744  ros_pose_with_covariance_stamped_msg_.pose.pose.position.y =
745  gz_pose_with_covariance_stamped_msg->pose_with_covariance()
746  .pose()
747  .position()
748  .y();
749  ros_pose_with_covariance_stamped_msg_.pose.pose.position.z =
750  gz_pose_with_covariance_stamped_msg->pose_with_covariance()
751  .pose()
752  .position()
753  .z();
754 
755  ros_pose_with_covariance_stamped_msg_.pose.pose.orientation.w =
756  gz_pose_with_covariance_stamped_msg->pose_with_covariance()
757  .pose()
758  .orientation()
759  .w();
760  ros_pose_with_covariance_stamped_msg_.pose.pose.orientation.x =
761  gz_pose_with_covariance_stamped_msg->pose_with_covariance()
762  .pose()
763  .orientation()
764  .x();
765  ros_pose_with_covariance_stamped_msg_.pose.pose.orientation.y =
766  gz_pose_with_covariance_stamped_msg->pose_with_covariance()
767  .pose()
768  .orientation()
769  .y();
770  ros_pose_with_covariance_stamped_msg_.pose.pose.orientation.z =
771  gz_pose_with_covariance_stamped_msg->pose_with_covariance()
772  .pose()
773  .orientation()
774  .z();
775 
776  // Covariance should have 36 elements, and both the Gazebo and ROS
777  // arrays should be the same size!
778  GZ_ASSERT(gz_pose_with_covariance_stamped_msg->pose_with_covariance()
779  .covariance_size() == 36,
780  "The Gazebo PoseWithCovarianceStamped message does not have 9 "
781  "position covariance elements.");
782  GZ_ASSERT(ros_pose_with_covariance_stamped_msg_.pose.covariance.size() == 36,
783  "The ROS PoseWithCovarianceStamped message does not have 9 "
784  "position covariance elements.");
785  for (int i = 0;
786  i < gz_pose_with_covariance_stamped_msg->pose_with_covariance()
787  .covariance_size();
788  i++) {
789  ros_pose_with_covariance_stamped_msg_.pose.covariance[i] =
790  gz_pose_with_covariance_stamped_msg->pose_with_covariance().covariance(
791  i);
792  }
793 
795 }
796 
798  GzTransformStampedMsgPtr& gz_transform_stamped_msg,
799  ros::Publisher ros_publisher) {
800  // ============================================ //
801  // =================== HEADER ================= //
802  // ============================================ //
803  ConvertHeaderGzToRos(gz_transform_stamped_msg->header(),
805 
806  // ============================================ //
807  // =========== TRANSFORM, TRANSLATION ========= //
808  // ============================================ //
809  ros_transform_stamped_msg_.transform.translation.x =
810  gz_transform_stamped_msg->transform().translation().x();
811  ros_transform_stamped_msg_.transform.translation.y =
812  gz_transform_stamped_msg->transform().translation().y();
813  ros_transform_stamped_msg_.transform.translation.z =
814  gz_transform_stamped_msg->transform().translation().z();
815 
816  // ============================================ //
817  // ============ TRANSFORM, ROTATION =========== //
818  // ============================================ //
819  ros_transform_stamped_msg_.transform.rotation.w =
820  gz_transform_stamped_msg->transform().rotation().w();
821  ros_transform_stamped_msg_.transform.rotation.x =
822  gz_transform_stamped_msg->transform().rotation().x();
823  ros_transform_stamped_msg_.transform.rotation.y =
824  gz_transform_stamped_msg->transform().rotation().y();
825  ros_transform_stamped_msg_.transform.rotation.z =
826  gz_transform_stamped_msg->transform().rotation().z();
827 
828  ros_publisher.publish(ros_transform_stamped_msg_);
829 }
830 
832  GzTwistStampedMsgPtr& gz_twist_stamped_msg, ros::Publisher ros_publisher) {
833  // ============================================ //
834  // =================== HEADER ================= //
835  // ============================================ //
836  ConvertHeaderGzToRos(gz_twist_stamped_msg->header(),
837  &ros_twist_stamped_msg_.header);
838 
839  // ============================================ //
840  // =================== TWIST ================== //
841  // ============================================ //
842 
843  ros_twist_stamped_msg_.twist.linear.x =
844  gz_twist_stamped_msg->twist().linear().x();
845  ros_twist_stamped_msg_.twist.linear.y =
846  gz_twist_stamped_msg->twist().linear().y();
847  ros_twist_stamped_msg_.twist.linear.z =
848  gz_twist_stamped_msg->twist().linear().z();
849 
850  ros_twist_stamped_msg_.twist.angular.x =
851  gz_twist_stamped_msg->twist().angular().x();
852  ros_twist_stamped_msg_.twist.angular.y =
853  gz_twist_stamped_msg->twist().angular().y();
854  ros_twist_stamped_msg_.twist.angular.z =
855  gz_twist_stamped_msg->twist().angular().z();
856 
857  ros_publisher.publish(ros_twist_stamped_msg_);
858 }
859 
861  GzVector3dStampedMsgPtr& gz_vector_3d_stamped_msg,
862  ros::Publisher ros_publisher) {
863  // ============================================ //
864  // =================== HEADER ================= //
865  // ============================================ //
866  ConvertHeaderGzToRos(gz_vector_3d_stamped_msg->header(),
867  &ros_position_stamped_msg_.header);
868 
869  // ============================================ //
870  // ================== POSITION ================ //
871  // ============================================ //
872 
873  ros_position_stamped_msg_.point.x = gz_vector_3d_stamped_msg->position().x();
874  ros_position_stamped_msg_.point.y = gz_vector_3d_stamped_msg->position().y();
875  ros_position_stamped_msg_.point.z = gz_vector_3d_stamped_msg->position().z();
876 
877  ros_publisher.publish(ros_position_stamped_msg_);
878 }
879 
881  GzWindSpeedMsgPtr& gz_wind_speed_msg,
882  ros::Publisher ros_publisher) {
883  // ============================================ //
884  // =================== HEADER ================= //
885  // ============================================ //
886  ConvertHeaderGzToRos(gz_wind_speed_msg->header(),
887  &ros_wind_speed_msg_.header);
888 
889  // ============================================ //
890  // ================== VELOCITY ================ //
891  // ============================================ //
892  ros_wind_speed_msg_.velocity.x =
893  gz_wind_speed_msg->velocity().x();
894  ros_wind_speed_msg_.velocity.y =
895  gz_wind_speed_msg->velocity().y();
896  ros_wind_speed_msg_.velocity.z =
897  gz_wind_speed_msg->velocity().z();
898  ros_publisher.publish(ros_wind_speed_msg_);
899 }
900 
902  GzWrenchStampedMsgPtr& gz_wrench_stamped_msg,
903  ros::Publisher ros_publisher) {
904  // ============================================ //
905  // =================== HEADER ================= //
906  // ============================================ //
907  ConvertHeaderGzToRos(gz_wrench_stamped_msg->header(),
908  &ros_wrench_stamped_msg_.header);
909 
910  // ============================================ //
911  // =================== FORCE ================== //
912  // ============================================ //
913  ros_wrench_stamped_msg_.wrench.force.x =
914  gz_wrench_stamped_msg->wrench().force().x();
915  ros_wrench_stamped_msg_.wrench.force.y =
916  gz_wrench_stamped_msg->wrench().force().y();
917  ros_wrench_stamped_msg_.wrench.force.z =
918  gz_wrench_stamped_msg->wrench().force().z();
919 
920  // ============================================ //
921  // ==================== TORQUE ================ //
922  // ============================================ //
923  ros_wrench_stamped_msg_.wrench.torque.x =
924  gz_wrench_stamped_msg->wrench().torque().x();
925  ros_wrench_stamped_msg_.wrench.torque.y =
926  gz_wrench_stamped_msg->wrench().torque().y();
927  ros_wrench_stamped_msg_.wrench.torque.z =
928  gz_wrench_stamped_msg->wrench().torque().z();
929 
930  ros_publisher.publish(ros_wrench_stamped_msg_);
931 }
932 
933 //===========================================================================//
934 //================ ROS -> GAZEBO MSG CALLBACKS/CONVERTERS ===================//
935 //===========================================================================//
936 
938  const mav_msgs::ActuatorsConstPtr& ros_actuators_msg_ptr,
939  gazebo::transport::PublisherPtr gz_publisher_ptr) {
940  // Convert ROS message to Gazebo message
941 
942  gz_sensor_msgs::Actuators gz_actuators_msg;
943 
944  ConvertHeaderRosToGz(ros_actuators_msg_ptr->header,
945  gz_actuators_msg.mutable_header());
946 
947  for (int i = 0; i < ros_actuators_msg_ptr->angles.size(); i++) {
948  gz_actuators_msg.add_angles(
949  ros_actuators_msg_ptr->angles[i]);
950  }
951 
952  for (int i = 0; i < ros_actuators_msg_ptr->angular_velocities.size(); i++) {
953  gz_actuators_msg.add_angular_velocities(
954  ros_actuators_msg_ptr->angular_velocities[i]);
955  }
956 
957  for (int i = 0; i < ros_actuators_msg_ptr->normalized.size(); i++) {
958  gz_actuators_msg.add_normalized(
959  ros_actuators_msg_ptr->normalized[i]);
960  }
961 
962  // Publish to Gazebo
963  gz_publisher_ptr->Publish(gz_actuators_msg);
964 }
965 
967  const mav_msgs::ActuatorsConstPtr& ros_actuators_msg_ptr,
968  gazebo::transport::PublisherPtr gz_publisher_ptr) {
969  // Convert ROS message to Gazebo message
970 
971  gz_mav_msgs::CommandMotorSpeed gz_command_motor_speed_msg;
972 
973  for (int i = 0; i < ros_actuators_msg_ptr->angular_velocities.size(); i++) {
974  gz_command_motor_speed_msg.add_motor_speed(
975  ros_actuators_msg_ptr->angular_velocities[i]);
976  }
977 
978  // Publish to Gazebo
979  gz_publisher_ptr->Publish(gz_command_motor_speed_msg);
980 }
981 
983  const mav_msgs::RollPitchYawrateThrustConstPtr&
984  ros_roll_pitch_yawrate_thrust_msg_ptr,
985  gazebo::transport::PublisherPtr gz_publisher_ptr) {
986  // Convert ROS message to Gazebo message
987 
988  gz_mav_msgs::RollPitchYawrateThrust gz_roll_pitch_yawrate_thrust_msg;
989 
990  ConvertHeaderRosToGz(ros_roll_pitch_yawrate_thrust_msg_ptr->header,
991  gz_roll_pitch_yawrate_thrust_msg.mutable_header());
992 
993  gz_roll_pitch_yawrate_thrust_msg.set_roll(
994  ros_roll_pitch_yawrate_thrust_msg_ptr->roll);
995  gz_roll_pitch_yawrate_thrust_msg.set_pitch(
996  ros_roll_pitch_yawrate_thrust_msg_ptr->pitch);
997  gz_roll_pitch_yawrate_thrust_msg.set_yaw_rate(
998  ros_roll_pitch_yawrate_thrust_msg_ptr->yaw_rate);
999 
1000  gz_roll_pitch_yawrate_thrust_msg.mutable_thrust()->set_x(
1001  ros_roll_pitch_yawrate_thrust_msg_ptr->thrust.x);
1002  gz_roll_pitch_yawrate_thrust_msg.mutable_thrust()->set_y(
1003  ros_roll_pitch_yawrate_thrust_msg_ptr->thrust.y);
1004  gz_roll_pitch_yawrate_thrust_msg.mutable_thrust()->set_z(
1005  ros_roll_pitch_yawrate_thrust_msg_ptr->thrust.z);
1006 
1007  // Publish to Gazebo
1008  gz_publisher_ptr->Publish(gz_roll_pitch_yawrate_thrust_msg);
1009 }
1010 
1012  const rotors_comm::WindSpeedConstPtr& ros_wind_speed_msg_ptr,
1013  gazebo::transport::PublisherPtr gz_publisher_ptr) {
1014  // Convert ROS message to Gazebo message
1015 
1016  gz_mav_msgs::WindSpeed gz_wind_speed_msg;
1017 
1018  ConvertHeaderRosToGz(ros_wind_speed_msg_ptr->header,
1019  gz_wind_speed_msg.mutable_header());
1020 
1021  gz_wind_speed_msg.mutable_velocity()->set_x(
1022  ros_wind_speed_msg_ptr->velocity.x);
1023  gz_wind_speed_msg.mutable_velocity()->set_y(
1024  ros_wind_speed_msg_ptr->velocity.y);
1025  gz_wind_speed_msg.mutable_velocity()->set_z(
1026  ros_wind_speed_msg_ptr->velocity.z);
1027 
1028  // Publish to Gazebo
1029  gz_publisher_ptr->Publish(gz_wind_speed_msg);
1030 }
1031 
1033  GzTransformStampedWithFrameIdsMsgPtr& broadcast_transform_msg) {
1034  ros::Time stamp;
1035  stamp.sec = broadcast_transform_msg->header().stamp().sec();
1036  stamp.nsec = broadcast_transform_msg->header().stamp().nsec();
1037 
1038  tf::Quaternion tf_q_W_L(broadcast_transform_msg->transform().rotation().x(),
1039  broadcast_transform_msg->transform().rotation().y(),
1040  broadcast_transform_msg->transform().rotation().z(),
1041  broadcast_transform_msg->transform().rotation().w());
1042 
1043  tf::Vector3 tf_p(broadcast_transform_msg->transform().translation().x(),
1044  broadcast_transform_msg->transform().translation().y(),
1045  broadcast_transform_msg->transform().translation().z());
1046 
1047  tf_ = tf::Transform(tf_q_W_L, tf_p);
1049  tf_, stamp, broadcast_transform_msg->parent_frame_id(),
1050  broadcast_transform_msg->child_frame_id()));
1051 }
1052 
1054 
1055 } // namespace gazebo
void ConvertHeaderGzToRos(const gz_std_msgs::Header &gz_header, std_msgs::Header_< std::allocator< void > > *ros_header)
void GzFloat32MsgCallback(GzFloat32MsgPtr &gz_float_32_msg, ros::Publisher ros_publisher)
void GzWindSpeedMsgCallback(GzWindSpeedMsgPtr &gz_wind_speed_msg, ros::Publisher ros_publisher)
A helper class that provides storage for additional parameters that are inserted into the callback...
void GzTwistStampedMsgCallback(GzTwistStampedMsgPtr &gz_twist_stamped_msg, ros::Publisher ros_publisher)
void GzVector3dStampedMsgCallback(GzVector3dStampedMsgPtr &gz_vector_3d_stamped_msg, ros::Publisher ros_publisher)
void callback(const boost::shared_ptr< GazeboMsgT const > &msg_ptr)
This is what gets passed into the Gazebo Subscribe method as a callback, and hence can only have one ...
void GzOdometryMsgCallback(GzOdometryMsgPtr &gz_odometry_msg, ros::Publisher ros_publisher)
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
static const std::string kConnectRosToGazeboSubtopic
Definition: common.h:57
GZ_REGISTER_WORLD_PLUGIN(GazeboRosInterfacePlugin)
ros::NodeHandle * ros_node_handle_
Handle for the ROS node.
void GzNavSatFixCallback(GzNavSatFixPtr &gz_nav_sat_fix_msg, ros::Publisher ros_publisher)
void GzWrenchStampedMsgCallback(GzWrenchStampedMsgPtr &gz_wrench_stamped_msg, ros::Publisher ros_publisher)
void GzConnectGazeboToRosTopicMsgCallback(GzConnectGazeboToRosTopicMsgPtr &gz_connect_gazebo_to_ros_topic_msg)
void GzTransformStampedMsgCallback(GzTransformStampedMsgPtr &gz_transform_stamped_msg, ros::Publisher ros_publisher)
void GzActuatorsMsgCallback(GzActuatorsMsgPtr &gz_actuators_msg, ros::Publisher ros_publisher)
void RosRollPitchYawrateThrustMsgCallback(const mav_msgs::RollPitchYawrateThrustConstPtr &ros_roll_pitch_yawrate_thrust_msg_ptr, gazebo::transport::PublisherPtr gz_publisher_ptr)
void GzConnectRosToGazeboTopicMsgCallback(GzConnectRosToGazeboTopicMsgPtr &gz_connect_ros_to_gazebo_topic_msg)
Subscribes to the provided ROS topic and publishes on the provided Gazebo topic (all info contained w...
GazeboRosInterfacePlugin * ptr
Pointer to the ROS interface plugin class.
geometry_msgs::WrenchStamped ros_wrench_stamped_msg_
geometry_msgs::PoseWithCovarianceStamped ros_pose_with_covariance_stamped_msg_
void publish(const boost::shared_ptr< M > &message) const
void RosWindSpeedMsgCallback(const rotors_comm::WindSpeedConstPtr &ros_wind_speed_msg_ptr, gazebo::transport::PublisherPtr gz_publisher_ptr)
void ConnectHelper(void(GazeboRosInterfacePlugin::*fp)(const boost::shared_ptr< GazeboMsgT const > &, ros::Publisher), GazeboRosInterfacePlugin *ptr, std::string gazeboNamespace, std::string gazeboTopicName, std::string rosTopicName, transport::NodePtr gz_node_handle)
Provides a way for GzConnectGazeboToRosTopicMsgCallback() to connect a Gazebo subscriber to a ROS pub...
void GzImuMsgCallback(GzImuPtr &gz_imu_msg, ros::Publisher ros_publisher)
void Load(physics::WorldPtr _world, sdf::ElementPtr _sdf)
void sendTransform(const StampedTransform &transform)
static const bool kPrintOnPluginLoad
Definition: common.h:41
void GzMagneticFieldMsgCallback(GzMagneticFieldMsgPtr &gz_magnetic_field_msg, ros::Publisher ros_publisher)
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
geometry_msgs::PointStamped ros_position_stamped_msg_
void GzPoseWithCovarianceStampedMsgCallback(GzPoseWithCovarianceStampedMsgPtr &gz_pose_with_covariance_stamped_msg, ros::Publisher ros_publisher)
geometry_msgs::TwistStamped ros_twist_stamped_msg_
sensor_msgs::MagneticField ros_magnetic_field_msg_
std::vector< gazebo::transport::SubscriberPtr > subscriberPtrs_
ros::Publisher ros_publisher
The ROS publisher that is passed into the modified callback.
geometry_msgs::TransformStamped ros_transform_stamped_msg_
sensor_msgs::FluidPressure ros_fluid_pressure_msg_
physics::WorldPtr world_
Pointer to the world.
void GzPoseMsgCallback(GzPoseMsgPtr &gz_pose_msg, ros::Publisher ros_publisher)
ROS interface plugin for Gazebo.
void GzFluidPressureMsgCallback(GzFluidPressureMsgPtr &gz_fluid_pressure_msg, ros::Publisher ros_publisher)
transport::SubscriberPtr gz_connect_ros_to_gazebo_topic_sub_
event::ConnectionPtr updateConnection_
Pointer to the update event connection.
transport::SubscriberPtr gz_broadcast_transform_sub_
void ConvertHeaderRosToGz(const std_msgs::Header_< std::allocator< void > > &ros_header, gz_std_msgs::Header *gz_header)
static const std::string kConnectGazeboToRosSubtopic
Definition: common.h:56
void OnUpdate(const common::UpdateInfo &)
This gets called by the world update start event.
void GzJointStateMsgCallback(GzJointStateMsgPtr &gz_joint_state_msg, ros::Publisher ros_publisher)
transport::SubscriberPtr gz_connect_gazebo_to_ros_topic_sub_
static const std::string kBroadcastTransformSubtopic
Special-case topic for ROS interface plugin to listen to (if present) and broadcast transforms to the...
Definition: common.h:61
transport::NodePtr gz_node_handle_
Handle for the Gazebo node.
static const bool kPrintOnMsgCallback
Definition: common.h:43
void RosActuatorsMsgCallback(const mav_msgs::ActuatorsConstPtr &ros_actuators_msg_ptr, gazebo::transport::PublisherPtr gz_publisher_ptr)
void RosCommandMotorSpeedMsgCallback(const mav_msgs::ActuatorsConstPtr &ros_command_motor_speed_msg_ptr, gazebo::transport::PublisherPtr gz_publisher_ptr)
void GzBroadcastTransformMsgCallback(GzTransformStampedWithFrameIdsMsgPtr &broadcast_transform_msg)
This is a special-case callback which listens for Gazebo "Transform" messages. Upon receiving one it ...


rotors_gazebo_plugins
Author(s): Fadri Furrer, Michael Burri, Mina Kamel, Janosch Nikolic, Markus Achtelik
autogenerated on Mon Feb 28 2022 23:39:04