140 lines
4.2 KiB
C++
140 lines
4.2 KiB
C++
/*
|
|
* 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
|