You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

144 lines
5.4 KiB

/*
* Copyright 2015 Fadri Furrer, ASL, ETH Zurich, Switzerland
* Copyright 2015 Michael Burri, ASL, ETH Zurich, Switzerland
* Copyright 2015 Mina Kamel, ASL, ETH Zurich, Switzerland
* Copyright 2015 Janosch Nikolic, ASL, ETH Zurich, Switzerland
* Copyright 2015 Markus Achtelik, ASL, ETH Zurich, Switzerland
* Copyright 2016 Anton Matosov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ROTORS_GAZEBO_PLUGINS_GAZEBO_WIND_PLUGIN_H
#define ROTORS_GAZEBO_PLUGINS_GAZEBO_WIND_PLUGIN_H
#include <string>
#include <random>
#include <gazebo/common/common.hh>
#include <gazebo/common/Plugin.hh>
#include <gazebo/gazebo.hh>
#include <gazebo/physics/physics.hh>
#include "Wind.pb.h"
namespace gazebo {
// Default values
static const std::string kDefaultNamespace = "";
static const std::string kDefaultFrameId = "world";
static constexpr double kDefaultWindVelocityMean = 0.0;
static constexpr double kDefaultWindVelocityMax = 100.0;
static constexpr double kDefaultWindVelocityVariance = 0.0;
static constexpr double kDefaultWindGustVelocityMean = 0.0;
static constexpr double kDefaultWindGustVelocityMax = 10.0;
static constexpr double kDefaultWindGustVelocityVariance = 0.0;
static constexpr double kDefaultWindGustStart = 10.0;
static constexpr double kDefaultWindGustDuration = 0.0;
static const ignition::math::Vector3d kDefaultWindDirectionMean = ignition::math::Vector3d(1, 0, 0);
static const ignition::math::Vector3d kDefaultWindGustDirectionMean = ignition::math::Vector3d(0, 1, 0);
static constexpr double kDefaultWindDirectionVariance = 0.0;
static constexpr double kDefaultWindGustDirectionVariance = 0.0;
static constexpr double kDefaultWindRampStart = 0.;
static constexpr double kDefaultWindRampDuration = 0.;
static const ignition::math::Vector3d kDefaultRampedWindVector = ignition::math::Vector3d(0, 0, 0);
/// \brief This gazebo plugin simulates wind acting on a model.
class GazeboWindPlugin : public WorldPlugin {
public:
GazeboWindPlugin()
: WorldPlugin(),
namespace_(kDefaultNamespace),
wind_pub_topic_("world_wind"),
wind_velocity_mean_(kDefaultWindVelocityMean),
wind_velocity_max_(kDefaultWindVelocityMax),
wind_velocity_variance_(kDefaultWindVelocityVariance),
wind_gust_velocity_mean_(kDefaultWindGustVelocityMean),
wind_gust_velocity_max_(kDefaultWindGustVelocityMax),
wind_gust_velocity_variance_(kDefaultWindGustVelocityVariance),
wind_direction_mean_(kDefaultWindDirectionMean),
wind_direction_variance_(kDefaultWindDirectionVariance),
wind_gust_direction_mean_(kDefaultWindGustDirectionMean),
wind_gust_direction_variance_(kDefaultWindGustDirectionVariance),
ramped_wind_vector(kDefaultRampedWindVector),
frame_id_(kDefaultFrameId),
pub_interval_(0.5),
node_handle_(NULL) {}
virtual ~GazeboWindPlugin();
protected:
/// \brief Load the plugin.
/// \param[in] _model Pointer to the model that loaded this plugin.
/// \param[in] _sdf SDF element that describes the plugin.
void Load(physics::WorldPtr world, sdf::ElementPtr sdf);
/// \brief Called when the world is updated.
/// \param[in] _info Update timing information.
void OnUpdate(const common::UpdateInfo& /*_info*/);
private:
/// \brief Pointer to the update event connection.
event::ConnectionPtr update_connection_;
physics::WorldPtr world_;
std::string namespace_;
std::string frame_id_;
std::string wind_pub_topic_;
double wind_velocity_mean_;
double wind_velocity_max_;
double wind_velocity_variance_;
double wind_gust_velocity_mean_;
double wind_gust_velocity_max_;
double wind_gust_velocity_variance_;
double pub_interval_;
std::default_random_engine wind_velocity_generator_;
std::normal_distribution<double> wind_velocity_distribution_;
std::default_random_engine wind_gust_velocity_generator_;
std::normal_distribution<double> wind_gust_velocity_distribution_;
ignition::math::Vector3d wind_direction_mean_;
ignition::math::Vector3d wind_gust_direction_mean_;
double wind_direction_variance_;
double wind_gust_direction_variance_;
std::default_random_engine wind_direction_generator_;
std::normal_distribution<double> wind_direction_distribution_X_;
std::normal_distribution<double> wind_direction_distribution_Y_;
std::normal_distribution<double> wind_direction_distribution_Z_;
std::default_random_engine wind_gust_direction_generator_;
std::normal_distribution<double> wind_gust_direction_distribution_X_;
std::normal_distribution<double> wind_gust_direction_distribution_Y_;
std::normal_distribution<double> wind_gust_direction_distribution_Z_;
common::Time wind_gust_end_;
common::Time wind_gust_start_;
common::Time last_time_;
ignition::math::Vector3d ramped_wind_vector;
common::Time wind_ramp_start_;
common::Time wind_ramp_duration_;
transport::NodePtr node_handle_;
transport::PublisherPtr wind_pub_;
physics_msgs::msgs::Wind wind_msg;
};
}
#endif // ROTORS_GAZEBO_PLUGINS_GAZEBO_WIND_PLUGIN_H