1 Star 0 Fork 0

tectim/engine-sim

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
transmission.cpp 2.36 KB
一键复制 编辑 原始数据 按行查看 历史
#include "../include/transmission.h"
#include "../include/units.h"
#include <cmath>
Transmission::Transmission() {
m_gear = -1;
m_newGear = -1;
m_gearCount = 0;
m_gearRatios = nullptr;
m_maxClutchTorque = units::torque(1000.0, units::ft_lb);
m_rotatingMass = nullptr;
m_vehicle = nullptr;
m_clutchPressure = 0.0;
}
Transmission::~Transmission() {
if (m_gearRatios != nullptr) {
delete[] m_gearRatios;
}
m_gearRatios = nullptr;
}
void Transmission::initialize(const Parameters &params) {
m_gearCount = params.GearCount;
m_maxClutchTorque = params.MaxClutchTorque;
m_gearRatios = new double[params.GearCount];
memcpy(m_gearRatios, params.GearRatios, sizeof(double) * m_gearCount);
}
void Transmission::update(double dt) {
if (m_gear == -1) {
m_clutchConstraint.m_minTorque = 0;
m_clutchConstraint.m_maxTorque = 0;
}
else {
m_clutchConstraint.m_minTorque = -m_maxClutchTorque * m_clutchPressure;
m_clutchConstraint.m_maxTorque = m_maxClutchTorque * m_clutchPressure;
}
}
void Transmission::addToSystem(
atg_scs::RigidBodySystem *system,
atg_scs::RigidBody *rotatingMass,
Vehicle *vehicle,
Engine *engine)
{
m_rotatingMass = rotatingMass;
m_vehicle = vehicle;
m_clutchConstraint.setBody1(&engine->getOutputCrankshaft()->m_body);
m_clutchConstraint.setBody2(m_rotatingMass);
system->addConstraint(&m_clutchConstraint);
}
void Transmission::changeGear(int newGear) {
if (newGear < -1 || newGear >= m_gearCount) return;
else if (newGear != -1) {
const double m_car = m_vehicle->getMass();
const double gear_ratio = m_gearRatios[newGear];
const double diff_ratio = m_vehicle->getDiffRatio();
const double tire_radius = m_vehicle->getTireRadius();
const double f = tire_radius / (diff_ratio * gear_ratio);
const double new_I = m_car * f * f;
const double E_r =
0.5 * m_rotatingMass->I * m_rotatingMass->v_theta * m_rotatingMass->v_theta;
const double new_v_theta = m_rotatingMass->v_theta < 0
? -std::sqrt(E_r * 2 / new_I)
: std::sqrt(E_r * 2 / new_I);
m_rotatingMass->I = new_I;
m_rotatingMass->p_x = m_rotatingMass->p_y = 0;
m_rotatingMass->m = m_car;
m_rotatingMass->v_theta = new_v_theta;
}
m_gear = newGear;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/tectim/engine-sim.git
git@gitee.com:tectim/engine-sim.git
tectim
engine-sim
engine-sim
master

搜索帮助