pxmlw6n2f/Gazebo_Distributed_TCP/plugins/LiftDragPlugin.hh

140 lines
4.2 KiB
C++
Raw Normal View History

2019-03-28 10:57:49 +08:00
/*
* Copyright (C) 2014 Open Source Robotics Foundation
*
* 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 _GAZEBO_LIFT_DRAG_PLUGIN_HH_
#define _GAZEBO_LIFT_DRAG_PLUGIN_HH_
#include <string>
#include <vector>
#include "gazebo/common/Plugin.hh"
#include "gazebo/physics/physics.hh"
#include "gazebo/transport/TransportTypes.hh"
namespace gazebo
{
/// \brief A plugin that simulates lift and drag.
class GAZEBO_VISIBLE LiftDragPlugin : public ModelPlugin
{
/// \brief Constructor.
public: LiftDragPlugin();
/// \brief Destructor.
public: ~LiftDragPlugin();
// Documentation Inherited.
public: virtual void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf);
/// \brief Callback for World Update events.
protected: virtual void OnUpdate();
/// \brief Connection to World Update events.
protected: event::ConnectionPtr updateConnection;
/// \brief Pointer to world.
protected: physics::WorldPtr world;
/// \brief Pointer to physics engine.
protected: physics::PhysicsEnginePtr physics;
/// \brief Pointer to model containing plugin.
protected: physics::ModelPtr model;
/// \brief Coefficient of Lift / alpha slope.
/// Lift = C_L * q * S
/// where q (dynamic pressure) = 0.5 * rho * v^2
protected: double cla;
/// \brief Coefficient of Drag / alpha slope.
/// Drag = C_D * q * S
/// where q (dynamic pressure) = 0.5 * rho * v^2
protected: double cda;
/// \brief Coefficient of Moment / alpha slope.
/// Moment = C_M * q * S
/// where q (dynamic pressure) = 0.5 * rho * v^2
protected: double cma;
/// \brief angle of attach when airfoil stalls
protected: double alphaStall;
/// \brief Cl-alpha rate after stall
protected: double claStall;
/// \brief Cd-alpha rate after stall
protected: double cdaStall;
/// \brief Cm-alpha rate after stall
protected: double cmaStall;
/// \brief: \TODO: make a stall velocity curve
protected: double velocityStall;
/// \brief air density
/// at 25 deg C it's about 1.1839 kg/m^3
/// At 20 °C and 101.325 kPa, dry air has a density of 1.2041 kg/m3.
protected: double rho;
/// \brief if the shape is aerodynamically radially symmetric about
/// the forward direction. Defaults to false for wing shapes.
/// If set to true, the upward direction is determined by the
/// angle of attack.
protected: bool radialSymmetry;
/// \brief effective planeform surface area
protected: double area;
/// \brief angle of sweep
protected: double sweep;
/// \brief initial angle of attack
protected: double alpha0;
/// \brief angle of attack
protected: double alpha;
/// \brief center of pressure in link local coordinates
protected: math::Vector3 cp;
/// \brief Normally, this is taken as a direction parallel to the chord
/// of the airfoil in zero angle of attack forward flight.
protected: math::Vector3 forward;
/// \brief A vector in the lift/drag plane, perpendicular to the forward
/// vector. Inflow velocity orthogonal to forward and upward vectors
/// is considered flow in the wing sweep direction.
protected: math::Vector3 upward;
/// \brief Smoothed velocity
protected: math::Vector3 velSmooth;
/// \brief Pointer to link currently targeted by mud joint.
protected: physics::LinkPtr link;
/// \brief Pointer to a joint that actuates a control surface for
/// this lifting body
protected: physics::JointPtr controlJoint;
/// \brief how much to change CL per radian of control surface joint
/// value.
protected: double controlJointRadToCL;
/// \brief SDF for this plugin;
protected: sdf::ElementPtr sdf;
};
}
#endif