/*----------------------------------------------------------------------------*/ /* Copyright (c) 2016-2018 FIRST. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ /*----------------------------------------------------------------------------*/ #include "rangefinder.h" #include #include #include #include #ifdef _WIN32 // Ensure that Winsock2.h is included before Windows.h, which can get // pulled in by anybody (e.g., Boost). #include #endif GZ_REGISTER_MODEL_PLUGIN(Rangefinder) void Rangefinder::Load(gazebo::physics::ModelPtr model, sdf::ElementPtr sdf) { this->model = model; // Parse SDF properties sensor = std::dynamic_pointer_cast( gazebo::sensors::get_sensor(sdf->Get("sensor"))); if (sdf->HasElement("topic")) { topic = sdf->Get("topic"); } else { topic = "~/" + sdf->GetAttribute("name")->GetAsString(); } gzmsg << "Initializing rangefinder: " << topic << " sensor=" << sensor->Name() << std::endl; // Connect to Gazebo transport for messaging std::string scoped_name = model->GetWorld()->Name() + "::" + model->GetScopedName(); boost::replace_all(scoped_name, "::", "/"); node = gazebo::transport::NodePtr(new gazebo::transport::Node()); node->Init(scoped_name); pub = node->Advertise(topic); // Connect to the world update event. // This will trigger the Update function every Gazebo iteration updateConn = gazebo::event::Events::ConnectWorldUpdateBegin( boost::bind(&Rangefinder::Update, this, _1)); } void Rangefinder::Update(const gazebo::common::UpdateInfo& info) { gazebo::msgs::Float64 msg; msg.set_data(sensor->Range()); pub->Publish(msg); }