LUADOC - Farming Simulator 17

Printable Version

VehicleMotor

Description
Class for vehicle motors
Functions

new

Description
Creating new motor
Definition
new(integer minRpm, integer maxRpm, float maxForwardSpeed, float maxBackwardSpeed, table torqueCurve, float brakeForce, float forwardGearRatio, float backwardGearRatio, float minForwardGearRatio, float maxForwardGearRatio, float minBackwardGearRatio, float maxBackwardGearRatio, integer ptoMotorRpmRatio, float rpmFadeOutRange, float maxTorque, float maxMotorPower)
Arguments
integerminRpmmin rpm
integermaxRpmmax rpm
floatmaxForwardSpeedmax forward speed
floatmaxBackwardSpeedmax backward speed
tabletorqueCurvetorque curve (AnimCurve)
floatbrakeForcebrake force
floatforwardGearRatioforward gear ratio
floatbackwardGearRatiobackward gear ratio
floatminForwardGearRatiomin forward gear ratio
floatmaxForwardGearRatiomax forward gear ratio
floatminBackwardGearRatiomin backward gear ratio
floatmaxBackwardGearRatiomax backward gear ratio
integerptoMotorRpmRatiopto motor rpm ratio
floatrpmFadeOutRangerpm fade out range
floatmaxTorquemax torque
floatmaxMotorPowermax motor power
Return Values
tablemotorInstancemotor instance
Code
35function VehicleMotor:new(vehicle, minRpm, maxRpm, maxForwardSpeed, maxBackwardSpeed, torqueCurve, brakeForce, forwardGearRatio, backwardGearRatio, minForwardGearRatio, maxForwardGearRatio, minBackwardGearRatio, maxBackwardGearRatio, ptoMotorRpmRatio, rpmFadeOutRange, maxTorque, maxMotorPower, minSpeed)
36
37 local self = {};
38 setmetatable(self, VehicleMotor_mt);
39
40 self.vehicle = vehicle;
41 self.minRpm = minRpm;
42 self.maxRpm = maxRpm;
43 self.minSpeed = minSpeed;
44 self.maxForwardSpeed = maxForwardSpeed; -- speed in m/s
45 self.maxBackwardSpeed = maxBackwardSpeed;
46
47 self.maxClutchTorque = 5; -- amount of torque that can be transferred from motor to clutch/wheels [t m s^-2]
48
49 self.torqueCurve = torqueCurve;
50 self.brakeForce = brakeForce;
51
52 self.gear = 0;
53 self.gearRatio = 0;
54
55 self.forwardGearRatios = {forwardGearRatio};
56 self.backwardGearRatios = {backwardGearRatio};
57 self.minForwardGearRatio = minForwardGearRatio;
58 self.maxForwardGearRatio = maxForwardGearRatio;
59 self.minBackwardGearRatio = minBackwardGearRatio;
60 self.maxBackwardGearRatio = maxBackwardGearRatio;
61
62 self.lastRealMotorRpm = 0;
63 self.lastMotorRpm = 0;
64
65 self.rpmFadeOutRange = rpmFadeOutRange;
66 self.rpmLimit = math.huge;
67 self.speedLimit = math.huge; -- Speed limit in km/h
68 self.speedLimitAcc = math.huge;
69
70 -- this is not clamped by minRpm
71 self.nonClampedMotorRpm = 0;
72 self.equalizedMotorRpm = 0;
73 self.clutchRpm = 0;
74 self.motorLoad = 0;
75 self.requiredMotorPower = 0;
76
77 if self.maxForwardSpeed == nil then
78 self.maxForwardSpeed = self:calculatePhysicalMaximumForwardSpeed();
79 end
80 if self.maxBackwardSpeed == nil then
81 self.maxBackwardSpeed = self:calculatePhysicalMaximumBackwardSpeed();
82 end
83
84 self.maxMotorTorque = self.torqueCurve:getMaximum();
85
86 self.ptoMotorRpmRatio = ptoMotorRpmRatio;
87
88 self.maxMotorPower = maxMotorPower;
89
90 self.rotInertia = 0.001; -- Rotational inertia of the motor, mostly defined by the flywheel [t m^2]
91 self.dampingRate = 0.0007; -- Damping rate of the motor if the acceleration pedal is 0 [t m^2 s^-1]
92
93 return self;
94end;

setLowBrakeForce

Description
Set low brake force
Definition
setLowBrakeForce(float lowBrakeForceScale, float lowBrakeForceSpeedLimit)
Arguments
floatlowBrakeForceScalelow brake force scale
floatlowBrakeForceSpeedLimitlow brake force speed limit
Code
100function VehicleMotor:setLowBrakeForce(lowBrakeForceScale, lowBrakeForceSpeedLimit)
101 self.lowBrakeForceScale = lowBrakeForceScale;
102 self.lowBrakeForceSpeedLimit = lowBrakeForceSpeedLimit;
103end;

getMaxClutchTorque

Description
Returns max clutch torque
Definition
getMaxClutchTorque()
Return Values
floatmaxClutchTorquemax clutch torque
Code
108function VehicleMotor:getMaxClutchTorque()
109 return self.maxClutchTorque;
110end

getRotInertia

Description
Returns rotation inertia
Definition
getRotInertia()
Return Values
floatrotInertiarotation inertia
Code
115function VehicleMotor:getRotInertia()
116 return self.rotInertia;
117end

setRotInertia

Description
Sets rotation inertia
Definition
setRotInertia(float rotInertia)
Arguments
floatrotInertiarotation inertia
Code
122function VehicleMotor:setRotInertia(rotInertia)
123 self.rotInertia = rotInertia;
124end

getDampingRate

Description
Returns damping rate
Definition
getDampingRate()
Return Values
floatdampingRatedamping rate
Code
129function VehicleMotor:getDampingRate()
130 return self.dampingRate;
131end

setDampingRate

Description
Sets damping rate
Definition
setDampingRate(float dampingRate)
Arguments
floatdampingRatenew damping rate
Code
136function VehicleMotor:setDampingRate(dampingRate)
137 self.dampingRate = dampingRate;
138end

getMaxTorque

Description
Returns max torque
Definition
getMaxTorque()
Return Values
floatmaxMotorTorquemax motor torque
Code
143function VehicleMotor:getMaxTorque()
144 return self.maxMotorTorque;
145end

getBrakeForce

Description
Returns brake force
Definition
getBrakeForce()
Return Values
floatbrakeForcebrake force
Code
150function VehicleMotor:getBrakeForce()
151 return self.brakeForce;
152end

getMinRpm

Description
Returns min rpm
Definition
getMinRpm()
Return Values
integerminRpmmin rpm
Code
157function VehicleMotor:getMinRpm()
158 return self.minRpm;
159end

getMaxRpm

Description
Returns max rpm
Definition
getMaxRpm()
Return Values
integermaxRpmmax rpm
Code
164function VehicleMotor:getMaxRpm()
165 return self.maxRpm;
166end

getLastMotorRpm

Description
Returns last motor rpm damped
Definition
getLastMotorRpm()
Return Values
integerlastMotorRpmlast motor rpm
Code
171function VehicleMotor:getLastMotorRpm()
172 return self.lastMotorRpm;
173end

getLastRealMotorRpm

Description
Returns last motor rpm real
Definition
getLastRealMotorRpm()
Return Values
integerlastMotorRpmlast motor rpm
Code
178function VehicleMotor:getLastRealMotorRpm()
179 return self.lastRealMotorRpm;
180end

setLastRpm

Description
Sets last motor rpm
Definition
setLastRpm(integer lastRpm)
Arguments
integerlastRpmnew last motor rpm
Code
185function VehicleMotor:setLastRpm(lastRpm)
186 self.lastRealMotorRpm = lastRpm;
187
188 self.lastMotorRpm = self.lastMotorRpm * 0.95 + self.lastRealMotorRpm * 0.05;
189end

getMotorLoad

Description
Returns motor load
Definition
getMotorLoad()
Return Values
floatmotorLoadmotor load
Code
194function VehicleMotor:getMotorLoad()
195 return self.motorLoad;
196end

getEqualizedMotorRpm

Description
Returns equalized motor rpm
Definition
getEqualizedMotorRpm()
Return Values
integerequalizedMotorRpmequalized motor rpm
Code
201function VehicleMotor:getEqualizedMotorRpm()
202 return self.equalizedMotorRpm;
203end

setEqualizedMotorRpm

Description
Sets equalized motor rpm
Definition
setEqualizedMotorRpm(integer equalizedMotorRpm)
Arguments
integerequalizedMotorRpmequalized motor rpm
Code
208function VehicleMotor:setEqualizedMotorRpm(rpm)
209 self.equalizedMotorRpm = rpm;
210 self:setLastRpm(rpm);
211end

getPtoMotorRpmRatio

Description
Returns pto motor rpm ratio
Definition
getPtoMotorRpmRatio()
Return Values
floatptoMotorRpmRatiopto motor rpm ratio
Code
216function VehicleMotor:getPtoMotorRpmRatio()
217 return self.ptoMotorRpmRatio;
218end

getNonClampedMotorRpm

Description
Returns non clamped motor rpm
Definition
getNonClampedMotorRpm()
Return Values
integernonClampedMotorRpmnon clamped motor rpm
Code
223function VehicleMotor:getNonClampedMotorRpm()
224 return self.nonClampedMotorRpm;
225end

getClutchRpm

Description
Returns clutch rpm
Definition
getClutchRpm()
Return Values
integerclutchRpmclutch rpm
Code
230function VehicleMotor:getClutchRpm()
231 return self.clutchRpm;
232end

getTorqueCurve

Description
Returns torque curve
Definition
getTorqueCurve()
Return Values
tabletorqueCurvetorque curve
Code
237function VehicleMotor:getTorqueCurve()
238 return self.torqueCurve;
239end

getTorque

Description
Returns torque
Definition
getTorque(float acceleration, boolean limitRpm)
Arguments
floataccelerationacceleration
booleanlimitRpmlimit rpm
Return Values
floattorquetorque
floatbrakePedalbrake pedal
Code
247function VehicleMotor:getTorque(acceleration, limitRpm)
248 -- Note: the torque curve is undefined outside the min/max rpm range. Clamping makes the curve flat at the outside range
249 local torque = self.torqueCurve:get(Utils.clamp(self.nonClampedMotorRpm, self.minRpm, self.maxRpm));
250 local brakePedal = 0;
251
252 if limitRpm then
253 local maxRpm = self:getCurMaxRpm();
254
255 local rpmFadeOutRange = self.rpmFadeOutRange*self:getGearRatio();
256
257 local fadeStartRpm = maxRpm - rpmFadeOutRange;
258 if self.nonClampedMotorRpm > fadeStartRpm then
259 if self.nonClampedMotorRpm > maxRpm then
260 brakePedal = math.min((self.nonClampedMotorRpm-maxRpm)/rpmFadeOutRange, 1);
261 torque = 0;
262 else
263 torque = torque * math.max((fadeStartRpm-self.nonClampedMotorRpm)/rpmFadeOutRange, 0);
264 end;
265 end;
266 end
267 torque = torque * math.abs(acceleration);
268
269 local neededPtoTorque = PowerConsumer.getTotalConsumedPtoTorque(self.vehicle);
270 if neededPtoTorque > 0 then
271 torque = math.max(torque - neededPtoTorque/self.ptoMotorRpmRatio, torque*0.1);
272 end
273
274 return torque, brakePedal;
275end;

getMaximumForwardSpeed

Description
Returns maximum forward speed
Definition
getMaximumForwardSpeed()
Return Values
floatmaxForwardSpeedmaximum forward speed
Code
280function VehicleMotor:getMaximumForwardSpeed()
281 return self.maxForwardSpeed;
282end

getMaximumBackwardSpeed

Description
Returns maximum backward speed
Definition
getMaximumBackwardSpeed()
Return Values
floatmaxBackwardSpeedmaximum backward speed
Code
287function VehicleMotor:getMaximumBackwardSpeed()
288 return self.maxBackwardSpeed;
289end

calculatePhysicalMaximumForwardSpeed

Description
Returns physical maximum forward speed
Definition
calculatePhysicalMaximumForwardSpeed()
Return Values
floatphysicalMaxForwardSpeedphysical maximum forward speed
Code
294function VehicleMotor:calculatePhysicalMaximumForwardSpeed()
295 return VehicleMotor.calculatePhysicalMaximumSpeed(self.minForwardGearRatio, self.forwardGearRatios, self.maxRpm)
296end

calculatePhysicalMaximumBackwardSpeed

Description
Returns physical maximum backward speed
Definition
calculatePhysicalMaximumBackwardSpeed()
Return Values
floatphysicalMaxBackwardSpeedphysical maximum backward speed
Code
301function VehicleMotor:calculatePhysicalMaximumBackwardSpeed()
302 return VehicleMotor.calculatePhysicalMaximumSpeed(self.minBackwardGearRatio, self.backwardGearRatios, self.maxRpm)
303end

calculatePhysicalMaximumSpeed

Description
Returns physical maximum speed
Definition
calculatePhysicalMaximumSpeed(float minGearRatio, table gearRatios, integer maxRpm)
Arguments
floatminGearRatiomin gear ratio
tablegearRatiosgear ratios
integermaxRpmmax rpm
Return Values
floatphysicalMaxSpeedphysical maximum speed
Code
311function VehicleMotor.calculatePhysicalMaximumSpeed(minGearRatio, gearRatios, maxRpm)
312 local minRatio;
313 if minGearRatio ~= nil then
314 minRatio = minGearRatio
315 else
316 minRatio = math.huge;
317 for _, ratio in pairs(gearRatios) do
318 minRatio = math.min(minRatio, ratio);
319 end
320 end
321 return maxRpm * math.pi / (30 * minRatio);
322end

updateMotorRpm

Description
Update motor rpm
Definition
updateMotorRpm(float dt)
Arguments
floatdttime since last call in ms
Code
327function VehicleMotor:updateMotorRpm(dt)
328 local vehicle = self.vehicle;
329 if next(vehicle.differentials) ~= nil and vehicle.motorizedNode ~= nil then
330 self.nonClampedMotorRpm, self.clutchRpm, self.motorLoad = getMotorRotationSpeed(vehicle.motorizedNode)
331 self.nonClampedMotorRpm = self.nonClampedMotorRpm * 30 / math.pi;
332 self.clutchRpm = self.clutchRpm * 30 / math.pi;
333
334 self.requiredMotorPower = math.huge;
335
336 else
337 local gearRatio = self:getGearRatio();
338 if vehicle.isServer then
339 self.nonClampedMotorRpm = math.max(WheelsUtil.computeRpmFromWheels(vehicle) * gearRatio, 0);
340 else
341 self.nonClampedMotorRpm = math.max(WheelsUtil.computeRpmFromSpeed(vehicle) * gearRatio, 0);
342 end
343 self.clutchRpm = self.nonClampedMotorRpm;
344 end
345 self:setLastRpm(math.max(self.nonClampedMotorRpm, self.minRpm));
346
347 -- the clamped motor rpm always is higher-equal than the required rpm by the pto
348 --local ptoRpm = math.min(PowerConsumer.getMaxPtoRpm(self.vehicle)*self.ptoMotorRpmRatio, self.maxRpm);
349 -- smoothing for raise/fall of ptoRpm
350 if self.lastPtoRpm == nil then
351 self.lastPtoRpm = self.minRpm;
352 end;
353 local ptoRpm = PowerConsumer.getMaxPtoRpm(self.vehicle)*self.ptoMotorRpmRatio;
354 if ptoRpm > self.lastPtoRpm then
355 self.lastPtoRpm = math.min(ptoRpm, self.lastPtoRpm + self.maxRpm*dt/2000);
356 elseif ptoRpm < self.lastPtoRpm then
357 self.lastPtoRpm = math.max(self.minRpm, self.lastPtoRpm - self.maxRpm*dt/1000);
358 end;
359 local ptoRpm = math.min(self.lastPtoRpm, self.maxRpm);
360 self:setLastRpm(math.max(self.lastMotorRpm, ptoRpm));
361
362 self.equalizedMotorRpm = self.minRpm + ( (math.max(self.nonClampedMotorRpm, (self.lastPtoRpm-self.minRpm))/self.maxRpm) * (self.maxRpm-self.minRpm) );
363end;

getBestGearRatio

Description
Returns best gear ratio
Definition
getBestGearRatio(float wheelSpeedRpm, float minRatio, float maxRatio, float accSafeMotorRpm, float requiredMotorPower, float requiredMotorRpm)
Arguments
floatwheelSpeedRpmwheel speed rpm
floatminRatiomin ratio
floatmaxRatiomax ratio
floataccSafeMotorRpmacc save motor rpm
floatrequiredMotorPowerthe required motor power [kW] (can be bigger than what the motor can actually achieve)
floatrequiredMotorRpmfixed motor rpm to be used (if not 0)
Return Values
floatbestGearRatiobest gear ratio
Code
375function VehicleMotor:getBestGearRatio(wheelSpeedRpm, minRatio, maxRatio, accSafeMotorRpm, requiredMotorPower, requiredMotorRpm)
376
377 if requiredMotorRpm ~= 0 then
378 local gearRatio = math.max(requiredMotorRpm-accSafeMotorRpm, requiredMotorRpm*0.8) / math.max(wheelSpeedRpm, 0.001);
379 gearRatio = Utils.clamp(gearRatio, minRatio, maxRatio);
380 return gearRatio;
381 end
382
383 -- Use a minimum wheel rpm to avoid that gearRatio is ignored
384 wheelSpeedRpm = math.max(wheelSpeedRpm, 0.0001);
385
386 local bestMotorPower = 0;
387 local bestGearRatio = minRatio;
388 --local bestRPM = 0;
389 -- TODO make this more efficient
390 for gearRatio = minRatio, maxRatio, 0.5 do
391 local motorRpm = wheelSpeedRpm * gearRatio;
392 if motorRpm > self.maxRpm - accSafeMotorRpm then
393 break;
394 end
395 local motorPower = self.torqueCurve:get(math.max(motorRpm, self.minRpm)) * motorRpm *math.pi/30;
396 if motorPower > bestMotorPower then
397 bestMotorPower = motorPower;
398 bestGearRatio = gearRatio;
399 --bestRPM = motorRpm;
400 end
401
402 if motorPower >= requiredMotorPower then
403 break;
404 end
405 end
406 --print(string.format("Selected best gear: %f, %.2fkW rpm %.2f wheel %.2f", bestGearRatio, bestMotorPower, bestRPM, wheelSpeedRpm,));
407
408 return bestGearRatio;
409end

getBestGear

Description
Returns best gear
Definition
getBestGear(float acceleration, float wheelSpeedRpm, float accSafeMotorRpm, float requiredMotorPower, float requiredMotorRpm)
Arguments
floataccelerationacceleration
floatwheelSpeedRpmwheel speed rpm
floataccSafeMotorRpmacc save motor rpm
floatrequiredMotorPowerrequired wheel torque
floatrequiredMotorRpmrequired motor rpm
Return Values
floatbestGearbest gear
floatgearRatiogear ratio
Code
420function VehicleMotor:getBestGear(acceleration, wheelSpeedRpm, accSafeMotorRpm, requiredMotorPower, requiredMotorRpm)
421 if math.abs(acceleration) < 0.001 then
422 acceleration = 1;
423 if wheelSpeedRpm < 0 then
424 acceleration = -1;
425 end
426 end
427 if acceleration > 0 then
428 if self.minForwardGearRatio ~= nil then
429 local wheelSpeedRpm = math.max(wheelSpeedRpm, 0);
430 local bestGearRatio = self:getBestGearRatio(wheelSpeedRpm, self.minForwardGearRatio, self.maxForwardGearRatio, accSafeMotorRpm, requiredMotorPower, requiredMotorRpm);
431 return 1, bestGearRatio;
432 else
433 return 1, self.forwardGearRatios[1];
434 end
435 else
436 if self.minBackwardGearRatio ~= nil then
437 local wheelSpeedRpm = math.max(-wheelSpeedRpm, 0)
438 local bestGearRatio = self:getBestGearRatio(wheelSpeedRpm, self.minBackwardGearRatio, self.maxBackwardGearRatio, accSafeMotorRpm, requiredMotorPower, requiredMotorRpm);
439 return -1, -bestGearRatio;
440 else
441 return -1, -self.backwardGearRatios[1];
442 end
443 end
444end

updateGear

Description
Update gear
Definition
updateGear(float acceleration)
Arguments
floataccelerationacceleration
Code
449function VehicleMotor:updateGear(acceleration, dt)
450 local requiredMotorPower = math.huge;
451 if (acceleration >= 0) == (self.gearRatio >= 0) then
452 requiredMotorPower = self.requiredMotorPower;
453 end
454 local requiredMotorRpm = PowerConsumer.getMaxPtoRpm(self.vehicle)*self.ptoMotorRpmRatio;
455 -- 1) safe rpm for acceleration is 10% of the motor max rpm, so it will take at least 10 frames (=0.16s) until a vehicle has fully accelerated
456 -- 2) replaced lastSpeedReal with clutchRPM/gearRatio => better acceleration when using high values for differentials and steeringAngle is at max/min
457 local wheelSpeedRpm;
458 if math.abs(self.gearRatio) < 0.001 then
459 wheelSpeedRpm = self.vehicle.lastSpeedReal*self.vehicle.movingDirection * 30000/ math.pi;
460 else
461 wheelSpeedRpm = (self.clutchRpm/self.gearRatio);
462 end
463 self.gear, self.gearRatio = self:getBestGear(acceleration, wheelSpeedRpm, self.maxRpm*0.1, requiredMotorPower, requiredMotorRpm);
464
465 if acceleration >= 0 then
466 self.speedLimitAcc = self.maxForwardSpeed * 3.6 * acceleration;
467 else
468 self.speedLimitAcc = -self.maxBackwardSpeed * 3.6 * acceleration;
469 end
470end

getGearRatio

Description
Returns gear ratio
Definition
getGearRatio()
Return Values
floatgearRatiogear ratio
Code
475function VehicleMotor:getGearRatio()
476 return self.gearRatio;
477end;

getCurMaxRpm

Description
Returns current max rpm
Definition
getCurMaxRpm()
Return Values
integermaxRpmcurrent max rpm
Code
482function VehicleMotor:getCurMaxRpm()
483 local maxRpm = self.maxRpm;
484
485 local gearRatio = self:getGearRatio();
486 if gearRatio ~= 0 then
487 --local speedLimit = self.speedLimit * 0.277778;
488 local speedLimit = math.min(self.speedLimit, math.max(self.speedLimitAcc, self.vehicle.lastSpeedReal*3600)) * 0.277778;
489 if gearRatio > 0 then
490 speedLimit = math.min(speedLimit, self.maxForwardSpeed);
491 else
492 speedLimit = math.min(speedLimit, self.maxBackwardSpeed);
493 end
494
495 maxRpm = math.min(maxRpm, speedLimit * 30 / math.pi * math.abs(gearRatio));
496 end
497
498 maxRpm = math.min(maxRpm, self.rpmLimit);
499 return maxRpm;
500end;

setSpeedLimit

Description
Sets speed limit
Definition
setSpeedLimit(float limit)
Arguments
floatlimitnew limit
Code
505function VehicleMotor:setSpeedLimit(limit)
506 self.speedLimit = math.max(limit, self.minSpeed);
507end

setRpmLimit

Description
Sets rpm limit
Definition
setRpmLimit(float limit)
Arguments
floatlimitnew limit
Code
512function VehicleMotor:setRpmLimit(rpmLimit)
513 self.rpmLimit = rpmLimit;
514end;