// Tire.h - the tire for a wheel. // // Copyright (C) 2001--2013 Sam Varner // // This file is part of Vamos Automotive Simulator. // // Vamos is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Vamos is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Vamos. If not, see . #ifndef _TIRE_H_ #define _TIRE_H_ #include "../geometry/Material.h" #include "../geometry/Three_Vector.h" #include "Particle.h" #include namespace Vamos_Body { /// The frictional properties of the tire. class Tire_Friction { public: //** Constructor Tire_Friction (const std::vector & long_parameters, const std::vector & trans_parameters, const std::vector & align_parameters); // Return the friction vector calculated from the magic formula. // HUB_VELOCITY is the velocity vector of the wheel's reference // frame. PATCH_SPEED is the rearward speed of the contact pacth // with respect to the wheel's frame. Vamos_Geometry::Three_Vector friction_forces (double normal_force, double friction_factor, const Vamos_Geometry::Three_Vector& hub_velocity, double patch_speed, double current_camber); // Return the value of the slide parameter. double slide () const { return m_slide; } // Fill in the longitudinal (sigma) and transverse (alpha) slip ratios. static void slip (double patch_speed, const Vamos_Geometry::Three_Vector& hub_velocity, double* sigma, double* alpha); // Return the slip ratio that gives maximum force. double peak_slip_ratio () const { return m_peak_slip; } // Return the slip angle that gives maximum force. double peak_slip_angle () const { return m_peak_slip_angle; } private: /// The parameters of the longitudinal magic equation. std::vector m_longitudital_parameters; /// The parameters of the transverse magic equation. std::vector m_transverse_parameters; /// The parameters of the magic equation for aligning torque. std::vector m_aligning_parameters; /// The slip that gives the maximum longitudinal force. double m_peak_slip; /// The slip angle that gives the maximum transverse force. double m_peak_slip_angle; /// The slip angle that gives the maximum aligning torque. double m_peak_aligning_angle; /// A parameter that is used to set the volume of the tire squeal sound. double m_slide; }; /// The tire for a wheel. class Tire : public Particle { public: Tire (double radius, double rolling_resistance_1, double rolling_resistance_2, const Tire_Friction& friction, double hardness, double inertia, const Frame* parent = 0); // Called by the wheel to update the tire. void input (const Vamos_Geometry::Three_Vector& velocity, double normal_angular_velocity, const Vamos_Geometry::Three_Vector& normal_force, double camber, double torque, bool is_locked, const Vamos_Geometry::Material& surface_material); void find_forces (); // Advance the tire in time by TIME. void propagate (double time); void rewind (); // Return the radius of the tire double radius () const { return m_radius; } // Return the rotational speed of the tire. double rotational_speed () const { return m_rotational_speed; } // Return the linear speed of the tread. double speed () const { return m_rotational_speed * m_radius; } // Fill in the longitudinal (sigma) and transverse (alpha) slip ratios. void slip (double* sigma, double* alpha) const; double temperature () const { return m_temperature - 273.15; } /// A traction factor that depends on tire temperature and wear. double wear () const { return m_wear; } double grip () const; // Return the linear sliding speed. double slide () const { return m_slide; } // Return the slip ratio that gives maximum force. double peak_slip_ratio () const { return m_tire_friction.peak_slip_ratio (); } // Return the slip angle that gives maximum force. double peak_slip_angle () const { return m_tire_friction.peak_slip_angle (); } // Return the position of the contact patch in the wheel's // coordinate system. Vamos_Geometry::Three_Vector contact_position () const; // Return the normal force on this tire. double normal_force () const { return m_normal_force; } // Set the tire to its initial conditions. void reset (); private: /// Orient the tire's z-axis with the normal force. void orient_frame_with_unit_vector (const Vamos_Geometry:: Three_Vector& normal_unit_vector); /// The radius of the tire. double m_radius; /// Linear rolling resistance on a hard surface. double m_rolling_resistance_1; /// Quadratic rolling resistance on a hard surface. double m_rolling_resistance_2; /// Object for calculating friction. Tire_Friction m_tire_friction; /// The rotational inertia of the tire. double m_inertia; /// The rotational speed of the tire in radians per second. double m_rotational_speed; /// The rotational speed of in the previous time step. double m_last_rotational_speed; /// How fast the tire is sliding. double m_slide; /// How much the tire heats up due to applied forces. double m_hardness; /// The temperature of the tire. double m_temperature; /// How much grip has been lost to tire wear. double m_wear; //* Input paremeters provided by the wheel. /// The velocity of the wheel relative to the road. Vamos_Geometry::Three_Vector m_velocity; /// The angular velocity about the normal to the surface. double m_normal_angular_velocity; /// The force perpendicular to the surface. double m_normal_force; /// The current camber, supplied by the wheel. double m_camber; /// The torque on the wheel due to acceleration or braking. double m_applied_torque; /// True if the brake for this wheel is locked. bool m_is_locked; /// The surface that the tire is currently on. Vamos_Geometry::Material m_surface_material; }; } #endif // not _TIRE_H_