/* * 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 #include #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