+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include <simgear/debug/logstream.hxx>
#include "Math.hpp"
#include "Ground.hpp"
#include "Rotor.hpp"
-#include STL_IOSTREAM
-#include STL_IOMANIP
+#include <iostream>
+#include <iomanip>
-SG_USING_STD(setprecision);
-#ifdef TEST_DEBUG
#include <stdio.h>
-#endif
#include <string.h>
#include <iostream>
#include <sstream>
-
+using std::setprecision;
+using std::endl;
namespace yasim {
_max_tilt_yaw=0;
_max_tilt_pitch=0;
_max_tilt_roll=0;
+ _downwash_factor=1;
}
Rotor::~Rotor()
if (4>numRotorparts()) return 0; //compile first!
if (j==0)
{
- sprintf(text,"/rotors/%s/cone-deg", _name);
+ snprintf(text, 256, "/rotors/%s/cone-deg", _name);
*f=(_balance1>-1)?( ((Rotorpart*)getRotorpart(0))->getrealAlpha()
+((Rotorpart*)getRotorpart(1*(_number_of_parts>>2)))->getrealAlpha()
+((Rotorpart*)getRotorpart(2*(_number_of_parts>>2)))->getrealAlpha()
else
if (j==1)
{
- sprintf(text,"/rotors/%s/roll-deg", _name);
+ snprintf(text, 256, "/rotors/%s/roll-deg", _name);
_roll = ( ((Rotorpart*)getRotorpart(0))->getrealAlpha()
-((Rotorpart*)getRotorpart(2*(_number_of_parts>>2)))->getrealAlpha()
)/2*(_ccw?-1:1);
else
if (j==2)
{
- sprintf(text,"/rotors/%s/yaw-deg", _name);
+ snprintf(text, 256, "/rotors/%s/yaw-deg", _name);
_yaw=( ((Rotorpart*)getRotorpart(1*(_number_of_parts>>2)))->getrealAlpha()
-((Rotorpart*)getRotorpart(3*(_number_of_parts>>2)))->getrealAlpha()
)/2;
else
if (j==3)
{
- sprintf(text,"/rotors/%s/rpm", _name);
+ snprintf(text, 256, "/rotors/%s/rpm", _name);
*f=(_balance1>-1)?_omega/2/pi*60:0;
}
else
if (j==4)
{
- sprintf(text,"/rotors/%s/tilt/pitch-deg",_name);
+ snprintf(text, 256, "/rotors/%s/tilt/pitch-deg",_name);
*f=_tilt_pitch*180/pi;
}
else if (j==5)
{
- sprintf(text,"/rotors/%s/tilt/roll-deg",_name);
+ snprintf(text, 256, "/rotors/%s/tilt/roll-deg",_name);
*f=_tilt_roll*180/pi;
}
else if (j==6)
{
- sprintf(text,"/rotors/%s/tilt/yaw-deg",_name);
+ snprintf(text, 256, "/rotors/%s/tilt/yaw-deg",_name);
*f=_tilt_yaw*180/pi;
}
else if (j==7)
{
- sprintf(text,"/rotors/%s/balance", _name);
+ snprintf(text, 256, "/rotors/%s/balance", _name);
*f=_balance1;
}
else if (j==8)
{
- sprintf(text,"/rotors/%s/stall",_name);
+ snprintf(text, 256, "/rotors/%s/stall",_name);
*f=getOverallStall();
}
else if (j==9)
{
- sprintf(text,"/rotors/%s/torque",_name);
+ snprintf(text, 256, "/rotors/%s/torque",_name);
*f=-_torque;;
}
else
return 0;
}
int w=j%3;
- sprintf(text,"/rotors/%s/blade[%i]/%s",
+ snprintf(text, 256, "/rotors/%s/blade[%i]/%s",
_name,b,
w==0?"position-deg":(w==1?"flap-deg":"incidence-deg"));
*f=((Rotorpart*)getRotorpart(0))->getPhi()*180/pi
void Rotorgear::setRotorEngineMaxRelTorque(float lval)
{
- SGPropertyNode * node = fgGetNode("/rotors/gear/max-rel-torque", true);
- if (node) node->setDoubleValue(lval);
+ _max_rel_torque=lval;
}
void Rotorgear::setRotorRelTarget(float lval)
{
- SGPropertyNode * node = fgGetNode("/rotors/gear/target-rel-rpm", true);
- if (node) node->setDoubleValue(lval);
+ _target_rel_rpm=lval;
}
void Rotor::setAlpha0(float f)
_rel_len_hinge=value;
}
+void Rotor::setDownwashFactor(float value)
+{
+ _downwash_factor=value;
+}
+
void Rotor::setAlphaoutput(int i, const char *text)
{
strncpy(_alphaoutput[i],text,255);
for(i=0; i<4; i++) _global_ground[i] = global_ground[i];
}
-void Rotor::setParameter(char *parametername, float value)
+void Rotor::setParameter(const char *parametername, float value)
{
#define p(a,b) if (strcmp(parametername,#a)==0) _##a = (value * (b)); else
p(translift_ve,1)
p(rotor_correction_factor,1)
SG_LOG(SG_INPUT, SG_ALERT,
"internal error in parameter set up for rotor: '" <<
- parametername <<"'" << endl);
+ parametername <<"'" << std::endl);
#undef p
}
_cyclicail=-(_mincyclicail+(lval+1)/2*(_maxcyclicail-_mincyclicail));
}
+void Rotor::setRotorBalance(float lval)
+{
+ lval = Math::clamp(lval, -1, 1);
+ _balance2 = lval;
+}
+
void Rotor::getPosition(float* out)
{
int i;
_f_ge=1+_diameter/_ground_effect_altitude*_ground_effect_constant;
// Now calculate translational lift
- float v_vert = Math::dot3(v,_normal);
+ // float v_vert = Math::dot3(v,_normal);
float help[3];
Math::cross3(v,_normal,help);
float v_horiz = Math::mag3(help);
//store the gravity direction
Glue::geodUp(s->pos, _grav_direction);
+ s->velGlobalToLocal(_grav_direction, _grav_direction);
}
void Rotor::findGroundEffectAltitude(Ground * ground_cb,State *s)
//at dist = rotor radius it is assumed to be 1/e * v1 + (1-1/e)* v2
float v = g * v1 + (1-g) * v2;
- Math::mul3(-v,_normal_with_yaw_roll,downwash);
+ Math::mul3(-v*_downwash_factor,_normal_with_yaw_roll,downwash);
//the downwash is calculated in the opposite direction of the normal
}
void Rotor::compile()
{
// Have we already been compiled?
- if(_rotorparts.size() != 0) return;
+ if(! _rotorparts.empty()) return;
//rotor is divided into _number_of_parts parts
//each part is calcualted at _number_of_segments points
* _diameter * _rel_blade_center * _rel_blade_center /(0.5*0.5);
float speed=_rotor_rpm/60*_diameter*_rel_blade_center*pi;
float lentocenter=_diameter*_rel_blade_center*0.5;
- float lentoforceattac=_diameter*_rel_len_hinge*0.5;
+ // float lentoforceattac=_diameter*_rel_len_hinge*0.5;
float zentforce=rotorpartmass*speed*speed/lentocenter;
float pitchaforce=_force_at_pitch_a/_number_of_parts*.453*9.81;
// was pounds of force, now N, devided by _number_of_parts
float relamp=(omega*omega/(2*_delta*Math::sqrt(sqr(omega0*omega0-omega*omega)
+4*_delta*_delta*omega*omega)))*_cyclic_factor;
- float relamp_theoretical=(omega*omega/(2*delta_theoretical*Math::sqrt(sqr(omega0*omega0-omega*omega)
- +4*delta_theoretical*delta_theoretical*omega*omega)))*_cyclic_factor;
+ //float relamp_theoretical=(omega*omega/(2*delta_theoretical*Math::sqrt(sqr(omega0*omega0-omega*omega)
+ // +4*delta_theoretical*delta_theoretical*omega*omega)))*_cyclic_factor;
_phi=Math::acos(_rel_len_hinge);
_phi-=Math::atan(_delta3);
if (!_no_torque)
&(torque[1]),&(lift[1])); //pitch b
rps[0]->calculateAlpha(v_wind,rho_null,0,0,0,
&(torque[3]),&(lift[3])); //pitch 0
- SG_LOG(SG_GENERAL, SG_INFO,
+ SG_LOG(SG_FLIGHT, SG_INFO,
"Rotor: coefficients for airfoil:" << endl << setprecision(6)
<< " drag0: " << _dragcoef0*_number_of_parts/_number_of_blades/_c2
<< " drag1: " << _dragcoef1*_number_of_parts/_number_of_blades/_c2
{
int i;
float omegarel;
- if (!_rotors.size()) return;
+ if (_rotors.empty()) return;
Rotor* r0 = (Rotor*)_rotors.get(0);
omegarel= r0->getOmegaRelNeu();
for(i=0; i<_rotors.size(); i++) {
// check,<if the engine can handle the torque of the rotors.
// If not reduce the torque to the fueselage and change rotational
// speed of the rotors instead
- if (_rotors.size())
+ if (! _rotors.empty())
{
float omegarel,omegan;
Rotor* r0 = (Rotor*)_rotors.get(0);
total_torque+=r->getTorque()*omegan;
}
float max_torque_of_engine=0;
- SGPropertyNode * node=fgGetNode("/rotors/gear", true);
- float target_rel_rpm=(node==0?1:node->getDoubleValue("target-rel-rpm",1));
+ // SGPropertyNode * node=fgGetNode("/rotors/gear", true);
if (_engineon)
{
- float max_rel_torque=(node==0?1:node->getDoubleValue("max-rel-torque",1));
- max_torque_of_engine=_max_power_engine*max_rel_torque;
- float df=target_rel_rpm-omegarel;
+ max_torque_of_engine=_max_power_engine*_max_rel_torque;
+ float df=_target_rel_rpm-omegarel;
df/=_engine_prop_factor;
df = Math::clamp(df, 0, 1);
- max_torque_of_engine = df * _max_power_engine*max_rel_torque;
+ max_torque_of_engine = df * _max_power_engine*_max_rel_torque;
}
total_torque*=-1;
_ddt_omegarel=0;
+
+#if 0
float rel_torque_engine=1;
if (total_torque<=0)
rel_torque_engine=0;
rel_torque_engine=1/max_torque_of_engine*total_torque;
else
rel_torque_engine=0;
+#endif
//add the rotor brake and the gear fritcion
float dt=0.1f;
- if (r0->_rotorparts.size()) dt=((Rotorpart*)r0->_rotorparts.get(0))->getDt();
+ if (! r0->_rotorparts.empty()) dt=((Rotorpart*)r0->_rotorparts.get(0))->getDt();
float rotor_brake_torque;
rotor_brake_torque=_rotorbrake*_max_power_rotor_brake+_rotorgear_friction;
//change the rotation of the rotors
if ((max_torque_of_engine<total_torque) //decreasing rotation
- ||((max_torque_of_engine>total_torque)&&(omegarel<target_rel_rpm))
+ ||((max_torque_of_engine>total_torque)&&(omegarel<_target_rel_rpm))
//increasing rotation due to engine
||(total_torque<0) ) //increasing rotation due to autorotation
{
for(j=0; j<_rotors.size(); j++) {
Rotor* r = (Rotor*)_rotors.get(j);
for(i=0; i<r->_rotorparts.size(); i++) {
- float torque_scalar=0;
+ // float torque_scalar=0;
Rotorpart* rp = (Rotorpart*)r->_rotorparts.get(i);
float torque[3];
rp->getAccelTorque(_ddt_omegarel,torque);
void Rotorgear::compile()
{
- float wgt = 0;
+ // float wgt = 0;
for(int j=0; j<_rotors.size(); j++) {
Rotor* r = (Rotor*)_rotors.get(j);
r->compile();
}
- SGPropertyNode * node = fgGetNode("/rotors/gear/target-rel-rpm", true);
- if (node) node->setDoubleValue(1);
- node =fgGetNode("/rotors/gear/max-rel-torque", true);
- if (node) node->setDoubleValue(1);
}
void Rotorgear::getDownWash(float *pos, float * v_heli, float *downwash)
_ddt_omegarel=0;
_engine_accel_limit=0.05f;
_total_torque_on_engine=0;
+ _target_rel_rpm=1;
+ _max_rel_torque=1;
}
Rotorgear::~Rotorgear()