From e2de173e25be2be471a6e6290b071979b682031a Mon Sep 17 00:00:00 2001 From: Ivan Grachyov Date: Mon, 24 Jan 2022 20:28:12 +0500 Subject: [PATCH] pushing some shit --- koptilnya/.idea/.gitignore | 5 ++ koptilnya/.idea/koptilnya.iml | 12 ++++ koptilnya/.idea/modules.xml | 8 +++ koptilnya/.idea/vcs.xml | 6 ++ koptilnya/better_steering/config/sample.txt | 30 +++----- koptilnya/better_steering/slave.txt | 69 ++++++++----------- koptilnya/better_steering/steering.txt | 42 +++++------ koptilnya/better_steering/steering_axle.txt | 69 +++++++++++++++++++ koptilnya/engine_remastered/configs/sx240.txt | 3 +- koptilnya/input_system/configs/sample.txt | 5 ++ 10 files changed, 166 insertions(+), 83 deletions(-) create mode 100644 koptilnya/.idea/.gitignore create mode 100644 koptilnya/.idea/koptilnya.iml create mode 100644 koptilnya/.idea/modules.xml create mode 100644 koptilnya/.idea/vcs.xml create mode 100644 koptilnya/better_steering/steering_axle.txt diff --git a/koptilnya/.idea/.gitignore b/koptilnya/.idea/.gitignore new file mode 100644 index 0000000..b58b603 --- /dev/null +++ b/koptilnya/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/koptilnya/.idea/koptilnya.iml b/koptilnya/.idea/koptilnya.iml new file mode 100644 index 0000000..0c8867d --- /dev/null +++ b/koptilnya/.idea/koptilnya.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/koptilnya/.idea/modules.xml b/koptilnya/.idea/modules.xml new file mode 100644 index 0000000..22e25db --- /dev/null +++ b/koptilnya/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/koptilnya/.idea/vcs.xml b/koptilnya/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/koptilnya/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/koptilnya/better_steering/config/sample.txt b/koptilnya/better_steering/config/sample.txt index 0831ccc..f88cba4 100644 --- a/koptilnya/better_steering/config/sample.txt +++ b/koptilnya/better_steering/config/sample.txt @@ -6,37 +6,23 @@ require('/koptilnya/better_steering/steering.txt') Steering:new({ Sensitivity = 0.04, - Slaves = {{ + PowerSteer = 0.5, + Axles = {{ Lock = 30, Camber = -2, - Caster = 5, + Caster = 8, Ackermann = 15.43, Toe = 0, - Offset = 180 + LeftOffset = 180, + RightOffset = 180 }, { - Lock = 30, - Camber = -2, - Caster = 5, - Ackermann = 15.43, - Toe = 0, - Offset = 180, - IsRight = true - }, { - Lock = 1, + Lock = 0, Camber = -2, Caster = 0, Ackermann = 0, Toe = 0, - Offset = 180, - Direction = -1 - }, { - Lock = 1, - Camber = -2, - Caster = 0, - Ackermann = 0, - Toe = 0, - Offset = 180, - IsRight = true, + LeftOffset = 180, + RightOffset = 180, Direction = -1 }} }) diff --git a/koptilnya/better_steering/slave.txt b/koptilnya/better_steering/slave.txt index 846ab17..f219ebc 100644 --- a/koptilnya/better_steering/slave.txt +++ b/koptilnya/better_steering/slave.txt @@ -1,7 +1,9 @@ -- @include /koptilnya/libs/wire_component.txt -- @include /koptilnya/libs/constants.txt +-- @include /koptilnya/libs/entity.txt require('/koptilnya/libs/wire_component.txt') require('/koptilnya/libs/constants.txt') +require('/koptilnya/libs/entity.txt') Slave = class('Slave', WireComponent) @@ -19,26 +21,19 @@ function Slave:initialize(options) self.order = options.Order or 0 - self.entity = nil - self.wheel = nil + self.entity = options.Slave + self.wheel = options.Wheel self.base = options.Base or nil self.steer = 0 self.steeringAngle = 0 self.lateralVel = 0 + self.baseLngVel = 0 self.lateralForce = 0 self.selfAligningTorque = 0 self.correctingAngle = 0 end -function Slave:getInputs() - local inputs = {} - inputs['SL_' .. self.order] = 'entity' - inputs['W_' .. self.order] = 'entity' - - return inputs -end - function Slave:getOutputs() local outputs = {} @@ -46,6 +41,8 @@ function Slave:getOutputs() outputs['SL_' .. self.order .. '_SelfAligningTq'] = 'number' outputs['SL_' .. self.order .. '_CorrectingAngle'] = 'number' outputs['W_' .. self.order .. '_LateralVel'] = 'number' + outputs['SL_' .. self.order .. '_SteeringAngle'] = 'number' + outputs['SL_' .. self.order .. '_BaseLngVel'] = 'number' return outputs end @@ -55,42 +52,24 @@ function Slave:updateOutputs() wire.ports['SL_' .. self.order .. '_SelfAligningTq'] = self.selfAligningTorque wire.ports['SL_' .. self.order .. '_CorrectingAngle'] = self.correctingAngle wire.ports['W_' .. self.order .. '_LateralVel'] = self.lateralVel + wire.ports['SL_' .. self.order .. '_SteeringAngle'] = self.steeringAngle + wire.ports['SL_' .. self.order .. '_BaseLngVel'] = self.baseLngVel end function Slave:update() - self.entity = wire.ports['SL_' .. self.order] - self.wheel = wire.ports['W_' .. self.order] - if isValid(self.entity) and isValid(self.base) and isValid(self.wheel) then - local wheelMass = self.wheel:getMass() - local wheelInertia = self.wheel:getInertia():getLength() - local wheelRadius = self.wheel:getModelRadius() / UNITS_PER_METER - local wheelFriction = self.wheel:getFriction() - local lateralVel = self.wheel:worldToLocal(self.wheel:getVelocity() + self.wheel:getPos())[2] - - self.lateralVel = lateralVel - - if math.abs(self.steer) > 0 then - self.correctingAngle = 0 - else - self.lateralForce = wheelFriction * wheelMass * lateralVel / TICK_INTERVAL / - UNITS_PER_METER - self.selfAligningTorque = self.lateralForce * wheelRadius * 2 - self.correctingAngle = self.selfAligningTorque / wheelInertia * TICK_INTERVAL - end - - if self.isRight then - self.correctingAngle = self.correctingAngle * -1 - end - - self.correctingAngle = 0 - if not self.entity:isFrozen() and not self.entity:isPlayerHolding() then self.entity:setFrozen(1) end - local inc = self.steer * self.lock * self.direction - self.steeringAngle = math.clamp(self.steeringAngle + inc + self.correctingAngle, -self.lock, self.lock) + local wheelMass = self.wheel:getMass() + local wheelInertia = self.wheel:getInertia():getLength() + local wheelRadius = self.wheel:getModelRadius() / UNITS_PER_METER + local wheelFriction = self.wheel:getFriction() + local wheelLocalVel = getLocalVelocity(self.wheel) + local baseLocalVel = getLocalVelocity(self.base) + local lateralVel = wheelLocalVel[2] + local baseLngVel = baseLocalVel[1] local camber = self.isRight and -self.camber or self.camber local steerRatio = self.lock ~= 0 and self.steeringAngle / self.lock or 0 @@ -104,11 +83,23 @@ function Slave:update() ackermann = self.isRight and steerRatio * self.ackermann or -steerRatio * self.ackermann end + self.lateralForce = wheelFriction * wheelMass * lateralVel / UNITS_PER_METER + self.selfAligningTorque = self.lateralForce * wheelRadius + + self.correctingAngle = self.selfAligningTorque / wheelInertia * math.sin(math.rad(math.abs(self.caster * 2))) * + math.sign(baseLngVel) * (self.isRight and -1 or 1) + + local inc = self.steer * self.lock * self.direction * math.cos(math.rad(math.abs(self.caster * 2))) + self.steeringAngle = math.clamp(self.steeringAngle + inc + self.correctingAngle, -self.lock, self.lock) + -- Dividing ackermann by 2 because ackermann angle is difference between wheels angle -- So if we don't divide it by 2, the result angle will be 2 times more than expected - local angle = Angle(0, self.offset + self.steeringAngle + toe + ackermann / 2, camber - caster) + local angle = Angle(0, self.offset + self.steeringAngle + toe + ackermann / 2, camber + caster) local localizedAngle = self.base:localToWorldAngles(angle) self.entity:setAngles(localizedAngle) + + self.lateralVel = lateralVel + self.baseLngVel = baseLngVel end end diff --git a/koptilnya/better_steering/steering.txt b/koptilnya/better_steering/steering.txt index 112368f..fd682d6 100644 --- a/koptilnya/better_steering/steering.txt +++ b/koptilnya/better_steering/steering.txt @@ -1,22 +1,22 @@ -- @include /koptilnya/libs/wire_component.txt --- @include ./slave.txt +-- @include ./steering_axle.txt -- @include /koptilnya/libs/table.txt require('/koptilnya/libs/wire_component.txt') -require('./slave.txt') +require('./steering_axle.txt') require('/koptilnya/libs/table.txt') Steering = class('Steering', WireComponent) function Steering:initialize(options) options = options or {} - self.slaves = {} + self.axles = {} self.steer = 0 self.sensitivity = options.Sensitivity or 1 - for key, slave in ipairs(options.Slaves) do - slave.Order = key - slave.Base = wire.ports.Base - table.insert(self.slaves, Slave:new(slave)) + for key, axle in ipairs(options.Axles) do + axle.Order = key + axle.Base = wire.ports.Base + table.insert(self.axles, SteeringAxle:new(axle)) end self:_adjustPorts() @@ -33,9 +33,9 @@ function Steering:_adjustPorts() inputs = table.merge(inputs, self:getInputs()) outputs = table.merge(outputs, self:getOutputs()) - for _, slave in ipairs(self.slaves) do - inputs = table.merge(inputs, slave:getInputs()) - outputs = table.merge(outputs, slave:getOutputs()) + for _, axle in ipairs(self.axles) do + inputs = table.merge(inputs, axle:getInputs()) + outputs = table.merge(outputs, axle:getOutputs()) end wire.adjustPorts(inputs, outputs) @@ -55,15 +55,15 @@ function Steering:getOutputs() end function Steering:updateOutputs() - local totalSteeringAngle = table.reduce(self.slaves, function(steer, slave) - return steer + slave.direction * slave.steeringAngle / (slave.lock ~= 0 and slave.lock or 1) - end, 0) + -- local totalSteeringAngle = table.reduce(self.slaves, function(steer, slave) + -- return steer + slave.direction * slave.steeringAngle / (slave.lock ~= 0 and slave.lock or 1) + -- end, 0) - local steerableSlaves = table.filter(self.slaves, function(slave) - return slave.lock ~= 0 - end) + -- local steerableSlaves = table.filter(self.slaves, function(slave) + -- return slave.lock ~= 0 + -- end) - wire.ports.Steer = totalSteeringAngle / #steerableSlaves + -- wire.ports.Steer = totalSteeringAngle / #steerableSlaves end function Steering:update() @@ -71,9 +71,9 @@ function Steering:update() self:updateOutputs() - for _, slave in ipairs(self.slaves) do - slave.steer = self.steer - slave:update() - slave:updateOutputs() + for _, axle in ipairs(self.axles) do + axle.steer = self.steer + axle:update() + axle:updateOutputs() end end diff --git a/koptilnya/better_steering/steering_axle.txt b/koptilnya/better_steering/steering_axle.txt new file mode 100644 index 0000000..7f43432 --- /dev/null +++ b/koptilnya/better_steering/steering_axle.txt @@ -0,0 +1,69 @@ +-- @include /koptilnya/libs/wire_component.txt +-- @include /koptilnya/libs/constants.txt +-- @include /koptilnya/libs/entity.txt +-- @include ./slave.txt +require('/koptilnya/libs/wire_component.txt') +require('/koptilnya/libs/constants.txt') +require('/koptilnya/libs/entity.txt') +require('./slave.txt') + +SteeringAxle = class('SteeringAxle', WireComponent) + +function SteeringAxle:createSlave(options, isRight) + local config = { + Lock = options.Lock, + Camber = options.Camber, + Caster = options.Caster, + Ackermann = options.Ackermann, + Toe = options.Toe, + Direction = options.Direction, + IsRight = isRight, + Slave = wire.ports[self._prefix .. (isRight and '_RightSlave' or '_LeftSlave')], + Wheel = wire.ports[self._prefix .. (isRight and '_RightWheel' or '_LeftWheel')], + Offset = isRight and options.RightOffset or options.LeftOffset, + Prefix = self._prefix .. (isRight and '_RightWheel' or '_LeftWheel'), + Base = wire.ports.Base + } + + return Slave:new(config) +end + +function SteeringAxle:initialize(options) + options = options or {} + + self.steer = 0 + self._prefix = 'Axle' .. options.Order + + self.leftSlave = self:createSlave(options, false) + self.rightSlave = self:createSlave(options, true) +end + +function SteeringAxle:getInputs() + local inputs = {} + + inputs[self._prefix .. '_LeftSlave'] = 'entity' + inputs[self._prefix .. '_RightSlave'] = 'entity' + inputs[self._prefix .. '_LeftWheel'] = 'entity' + inputs[self._prefix .. '_RightWheel'] = 'entity' + + return inputs +end + +function SteeringAxle:getOutputs() + local outputs = {} + + table.merge(outputs, self.leftSlave:getOutputs()) + table.merge(outputs, self.rightSlave:getOutputs()) + + return outputs +end + +function SteeringAxle:updateOutputs() + self.leftSlave:updateOutputs() + self.rightSlave:updateOutputs() +end + +function SteeringAxle:update() + self.leftSlave:update() + self.rightSlave:update() +end \ No newline at end of file diff --git a/koptilnya/engine_remastered/configs/sx240.txt b/koptilnya/engine_remastered/configs/sx240.txt index aaae9aa..1dbad92 100644 --- a/koptilnya/engine_remastered/configs/sx240.txt +++ b/koptilnya/engine_remastered/configs/sx240.txt @@ -26,7 +26,8 @@ Vehicle:new({ Clutch = {Stiffness = 20, Damping = 0.5, MaxTorque = 400}, Gearbox = {Type = 'MANUAL', ShiftDuration = 0.2, ShiftSmoothness = 0.3, Ratios = {3.321, 1.902, 1.308, 1, 0.838}, Reverse = 3.382}, Axles = { - {Power = 0.96, Coast = 0.96, Preload = 10, UsePowerBias = 10, ViscousCoeff = 0.96, Axle = Vector(1, 0, 0), DistributionCoeff = 1, FinalDrive = 3.9} + {Power = 0.96, Coast = 0.96, Preload = 10, UsePowerBias = 10, ViscousCoeff = 0.96, Axle = Vector(1, 0, 0), DistributionCoeff = 0.8, FinalDrive = 3.9}, + {Power = 0.96, Coast = 0.96, Preload = 10, UsePowerBias = 10, ViscousCoeff = 0.96, Axle = Vector(1, 0, 0), DistributionCoeff = 1.2, FinalDrive = 3.9}, }, Systems = {{Type = 'LAUNCH', Limit = 3500}, {Type = 'TRACTION', Limit = 1.5}} }) diff --git a/koptilnya/input_system/configs/sample.txt b/koptilnya/input_system/configs/sample.txt index c36a5da..8fc6217 100644 --- a/koptilnya/input_system/configs/sample.txt +++ b/koptilnya/input_system/configs/sample.txt @@ -15,6 +15,11 @@ Axles = { Gravity = 0.15, Sensitivity = 0.25 }, + Brakes = { + Positive = KEY.S, + Gravity = 0.15, + Sensitivity = 0.25 + }, Shifter = { Positive = MOUSE.LEFT, Negative = MOUSE.RIGHT,