00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <vamos/body/Drivetrain.h>
00022
00023 #include <cassert>
00024
00025
00026
00027
00028 Vamos_Body::
00029 Drivetrain::Drivetrain (Engine* engine,
00030 Clutch* clutch,
00031 Transmission* transmission,
00032 Differential* differential)
00033 : mp_engine (engine),
00034 mp_clutch (clutch),
00035 mp_transmission (transmission),
00036 mp_differential (differential),
00037 m_gas (0.0)
00038 {
00039 }
00040
00041
00042 Vamos_Body::
00043 Drivetrain::~Drivetrain ()
00044 {
00045 delete mp_engine;
00046 delete mp_clutch;
00047 delete mp_transmission;
00048 delete mp_differential;
00049 }
00050
00051
00052 void Vamos_Body::
00053 Drivetrain::input (double gas, double clutch,
00054 double left_wheel_speed, double right_wheel_speed)
00055 {
00056 m_gas = gas;
00057 mp_clutch->position (clutch);
00058
00059 double shaft_speed = mp_differential->
00060 get_driveshaft_speed (left_wheel_speed, right_wheel_speed);
00061 mp_transmission->set_driveshaft_speed (shaft_speed);
00062
00063
00064
00065
00066
00067
00068
00069 }
00070
00071 void Vamos_Body::
00072 Drivetrain::find_forces ()
00073 {
00074
00075
00076 double drag = 0.0;
00077 double torque = 0.0;
00078 if (mp_transmission->gear () != 0)
00079 {
00080
00081
00082 drag = mp_clutch->drag (mp_engine->rotational_speed (),
00083 mp_transmission->clutch_speed ());
00084
00085 if (mp_clutch->engaged ())
00086 {
00087
00088
00089 mp_engine->input (m_gas, 0.0, mp_transmission->clutch_speed (),
00090 true);
00091 torque = mp_transmission->torque (mp_engine->drive_torque ());
00092 }
00093 else
00094 {
00095
00096 torque = mp_transmission->torque (drag);
00097
00098 mp_engine->input (m_gas, drag, 0.0, false);
00099 }
00100 }
00101 else
00102 {
00103
00104 mp_engine->input (m_gas, drag, 0.0, false);
00105 }
00106
00107
00108 mp_differential->find_wheel_torques (torque);
00109 mp_engine->find_forces ();
00110 }
00111
00112
00113 void Vamos_Body::
00114 Drivetrain::propagate (double time)
00115 {
00116 mp_engine->propagate (time);
00117 }
00118
00119 void Vamos_Body::
00120 Drivetrain::rewind ()
00121 {
00122 mp_engine->rewind ();
00123 }
00124
00125 void Vamos_Body::
00126 Drivetrain::reset ()
00127 {
00128 mp_clutch->position (0.0);
00129 mp_transmission->shift (0);
00130 }
00131
00132 double Vamos_Body::
00133 Drivetrain::torque (Vamos_Geometry::Side side) const
00134 {
00135 switch (side)
00136 {
00137 case Vamos_Geometry::LEFT:
00138 return mp_differential->left_wheel_torque ();
00139 break;
00140 case Vamos_Geometry::RIGHT:
00141 return mp_differential->right_wheel_torque ();
00142 break;
00143 default:
00144 assert (false);
00145 }
00146 return 0.0;
00147 }