From b5fb04cce8b632d6feedcc96886c19c106e0eb0a Mon Sep 17 00:00:00 2001 From: Ivan Grachyov Date: Fri, 12 Nov 2021 20:47:12 +0500 Subject: [PATCH] Reworking vehicle controller --- koptilnya/engine/eng_comf_config.txt | 8 +- koptilnya/engine_remastered/clutch.txt | 12 ++- .../engine_remastered/configs/sample.txt | 4 +- koptilnya/engine_remastered/differential.txt | 33 ++++++++ .../engine_remastered/gearboxes/base.txt | 49 +++++++++++ .../engine_remastered/gearboxes/manual.txt | 83 +++++++++++++++---- koptilnya/engine_remastered/vehicle.txt | 10 ++- 7 files changed, 169 insertions(+), 30 deletions(-) create mode 100644 koptilnya/engine_remastered/differential.txt create mode 100644 koptilnya/engine_remastered/gearboxes/base.txt diff --git a/koptilnya/engine/eng_comf_config.txt b/koptilnya/engine/eng_comf_config.txt index dca0e1f..725475d 100644 --- a/koptilnya/engine/eng_comf_config.txt +++ b/koptilnya/engine/eng_comf_config.txt @@ -1,5 +1,5 @@ config = { - Name = "Jopa", + Name = 'Jopa', Engine = { IdleRPM = 900, MaxRPM = 7000, @@ -35,7 +35,7 @@ config = { MaxTorque = 600 }, Gearbox = { - Type = "AUTO", + Type = 'AUTO', ShiftDuration = 0.2, ShiftSmoothness = 0.3, Ratios = {13.45, 8.12, 5.51, 4.16, 3.36, 2.83}, @@ -61,10 +61,10 @@ config = { FinalDrive = 1 }}, Systems = {{ - Type = "LAUNCH", + Type = 'LAUNCH', RPMLimit = 3500 }, { - Type = "TRACTION", + Type = 'TRACTION', Slip = 1.5 }} } diff --git a/koptilnya/engine_remastered/clutch.txt b/koptilnya/engine_remastered/clutch.txt index b50f024..09ef473 100644 --- a/koptilnya/engine_remastered/clutch.txt +++ b/koptilnya/engine_remastered/clutch.txt @@ -38,11 +38,15 @@ function Clutch:getOutputs() } end -function Clutch:update() - if self._gearbox.type == gearboxTypes.MANUAL then - self.press = wire.ports.Clutch +function Clutch:getPress() + if self._gearbox ~= nil and self._gearbox.type == gearboxTypes.MANUAL then + return wire.ports.Clutch + else + return self.press end +end +function Clutch:update() local someConversionCoeff = 0.10472 local engRPM = self._engine and self._engine.rpm or 0 @@ -51,7 +55,7 @@ function Clutch:update() local gboxRatioNotZero = gboxRatio ~= 0 and 1 or 0 self.slip = ((engRPM - gboxRPM) * someConversionCoeff) * gboxRatioNotZero / 2 - self.targetTorque = math.clamp(self.slip * self.stiffness * (1 - self.press), -self.maxTorque, self.maxTorque) + self.targetTorque = math.clamp(self.slip * self.stiffness * (1 - self:getPress()), -self.maxTorque, self.maxTorque) self.torque = math.lerp(self.damping, self.torque, self.targetTorque) end diff --git a/koptilnya/engine_remastered/configs/sample.txt b/koptilnya/engine_remastered/configs/sample.txt index c7bf1a7..c844f30 100644 --- a/koptilnya/engine_remastered/configs/sample.txt +++ b/koptilnya/engine_remastered/configs/sample.txt @@ -36,11 +36,11 @@ Vehicle:new({ }, Clutch = { Stiffness = 22, - Damping = 0.8, + Damping = 0.5, MaxTorque = 600 }, Gearbox = { - Type = "AUTO", + Type = "MANUAL", ShiftDuration = 0.2, ShiftSmoothness = 0.3, Ratios = {13.45, 8.12, 5.51, 4.16, 3.36, 2.83}, diff --git a/koptilnya/engine_remastered/differential.txt b/koptilnya/engine_remastered/differential.txt new file mode 100644 index 0000000..fb34220 --- /dev/null +++ b/koptilnya/engine_remastered/differential.txt @@ -0,0 +1,33 @@ +-- @include ./wire_component.txt +require('./wire_component.txt') + +Differential = class('Differential', WireComponent) + +function Differential:initialize(config) + self.power = config.Power or 1 + self.coast = config.Coast or 1 + self.preload = config.Preload or 10 + + self.viscousCoeff = config.ViscousCoeff or 0.9 + self.usePowerBias = config.UsePowerBias or 10 + + self.distributionCoeff = config.DistributionCoeff or 1 + self.maxCorrectingTorque = config.MaxCorrectingTorque or 200 + + self.avgRPM = 0 + + self.leftWheel = nil + self.rightWheel = nil +end + +function Differential:getInputs() + local leftWheelName = 'Axle_' + self.order + '_LeftWheel' + local rightWheelName = 'Axle_' + self.order + '_RightWheel' + + local inputs = {} + + inputs[leftWheelName] = 'entity' + inputs[rightWheelName] = 'entity' + + return inputs +end diff --git a/koptilnya/engine_remastered/gearboxes/base.txt b/koptilnya/engine_remastered/gearboxes/base.txt new file mode 100644 index 0000000..ca156e0 --- /dev/null +++ b/koptilnya/engine_remastered/gearboxes/base.txt @@ -0,0 +1,49 @@ +Gearbox = class('Gearbox') + +function Gearbox:initialize(config, clutch, axles) + self.ratios = config.Ratios + self.reverse = config.Reverse + + self.rpm = 0 + self.gear = 0 + self.torque = 0 + + self.axles = axles or {} + self.clutch = clutch + + self:recalcRatio() +end + +function Gearbox:setGear(gear) + if gear >= -1 and gear <= #self.ratios then + self.gear = gear + self:recalcRatio() + end +end + +function Gearbox:recalcRatio() + if self.gear == -1 then + self.ratio = -self.reverse + elseif self.gear == 0 then + self.ratio = 0 + else + self.ratio = self.ratios[self.gear] + end +end + +function Gearbox:update() + if self.clutch ~= nil then + self.torque = self.clutch.torque * self.ratio + end + + local axlesRPM = table.map(self.axles, function(diff) + return diff.avgRPM + end) + + local maxAxlesRPM = math.max(unpack(axlesRPM)) + + self.rpm = maxAxlesRPM * self.ratio +end + +function Gearbox:shift() +end diff --git a/koptilnya/engine_remastered/gearboxes/manual.txt b/koptilnya/engine_remastered/gearboxes/manual.txt index 5ec9dad..1cd65a9 100644 --- a/koptilnya/engine_remastered/gearboxes/manual.txt +++ b/koptilnya/engine_remastered/gearboxes/manual.txt @@ -1,29 +1,76 @@ -ManualGearbox = class('ManualGearbox') +-- @include /koptilnya/libs/watcher.txt +-- @include ./base.txt +require('/koptilnya/libs/watcher.txt') +require('./base.txt') -function ManualGearbox:initialize(config) - self.ratios = config.Ratios - self.reverse = config.Reverse +ManualGearbox = class('ManualGearbox', Gearbox) - self.rpm = 0 - self.torque = 0 - self.gear = 0 +function ManualGearbox:initialize(config, clutch) + Gearbox.initialize(self, config, clutch) - self:recalcRatio() + -- self.ratios = config.Ratios + -- self.reverse = config.Reverse + + -- self.rpm = 0 + -- self.torque = 0 + -- self.gear = 0 + + -- self:recalcRatio() + + -- self.axles = {} + -- self.clutch = nil + + -- self.torque = 0 + + -- self.shiftWatcher = watcher(function() + -- return wire.ports.Upshift - wire.ports.Downshift + -- end, function(val) + -- if val ~= 0 then + -- self:shift(val) + -- end + -- end) +end + +function ManualGearbox:recalcRatio() + if self.gear == -1 then + self.ratio = -self.reverse + elseif self.gear == 0 then + self.ratio = 0 + else + self.ratio = self.ratios[self.gear] + end +end + +function ManualGearbox:getInputs() + return { + Upshift = 'number', + Downshift = 'number' + } +end + +function ManualGearbox:getOutputs() + return { + Gearbox_RPM = 'number', + Gearbox_Torque = 'number' + } +end + +function ManualGearbox:updateOutputs() - self.axles = {} - self.clutch = {} end function ManualGearbox:update() - if self.clutch ~= nil then - self.torque = self.clutch.torque * self.ratio - end + -- if self.clutch ~= nil then + -- self.torque = self.clutch.torque * self.ratio + -- end - local axlesRPM = table.map(self.axles, function(diff) - return diff.avgRPM - end) + -- local axlesRPM = table.map(self.axles, function(diff) + -- return diff.avgRPM + -- end) - local maxAxlesRPM = math.max(unpack(axlesRPM)) + -- local maxAxlesRPM = math.max(unpack(axlesRPM)) - self.rpm = maxAxlesRPM * self.ratio + -- self.rpm = maxAxlesRPM * self.ratio + + -- self.shiftWatcher() end diff --git a/koptilnya/engine_remastered/vehicle.txt b/koptilnya/engine_remastered/vehicle.txt index caa7ccf..56e9f35 100644 --- a/koptilnya/engine_remastered/vehicle.txt +++ b/koptilnya/engine_remastered/vehicle.txt @@ -22,7 +22,13 @@ function Vehicle:initialize(config) self.clutch = Clutch:new(config.Clutch) self.engine = Engine:new(config.Engine, self.clutch) - self.gearbox = GearboxFactory.create(config.Gearbox, self.clutch) + + self.axles = table.map(config.Axles, function(config) + return Differential:new(config) + end) + + self.gearbox = GearboxFactory.create(config.Gearbox, self.clutch, self.axles) + -- self.axles = table.map(config.Axles, function(config) -- return Differential:new(config) -- end) @@ -30,7 +36,7 @@ function Vehicle:initialize(config) -- return SystemsBuilder:create(config) -- end) - self.components = {self.clutch, self.engine} -- , self.gearbox, self.clutch} + self.components = {self.clutch, self.engine, self.gearbox} -- , self.gearbox, self.clutch} -- self.components = table.add(self.components, self.axles) -- self.components = table.add(self.components, self.systems)