【开发】Lua自动变速箱机制 - 思路剖析+ 查看更多
屎山代码,零基础,但能跑
代码没啥可显摆的了,能力未到;但自认为工作原理与还原思路值得分享一下
但注意,不要直接复制代码,因为其中剪掉了很多段,if end数量很可能对不上
变速箱有D/M两种模式,共6档
用户可以主动切换,而变速箱行为被动适应
D档需要去主动适配用户行。如下图所示
-用户行为:油门到底弹射起步,速度过100后稍松油门
-变速箱反应:1档5500转到头后 进3档冲超高速,油门变小后按顺序进4,5档,而后按车速降档

下图展示的是M档,需要用户绑定键盘按键(或通过点击挡杆+/-)来切换档位
M档没有用户行为适配,因为本身用户使用M档的意图就是全权操控车辆

我先用白话说一下我的编写思路,平台限制与解决方法
首先,变速箱本身不能根据车速适配,不然无法对用户行为(急加速/急刹车/轻油门)作出反应
其次,X-Plane中的扭矩Dataref为只读,也无法通过检测扭矩和压力来作为判断标准
最后,联系到真实车辆变速箱,我们需要三个关键点:
1- 用户现在在做什么?
2- 怎么预判用户行为?
3- 我的预判是否合理?
而你写的Lua,将会将这三点连成一条线,对不同情况进行合理还原
综上所述,我们的首要目标就是检测用户行为。
我们的Lua,作为一个被动执行模板,需要有X-Plane Output出来的数据
比如我们已知车速为80,油门深度0.5,但这又能说明什么?
因此我们需要一个组件,至少能让我们鉴往知来
这个历史数据,鉴往,就可以通过目前已知的一种途径:Timer,去实现
在开始制作变速箱前,我们首先需要把油门刹车线性化
去还原真实车辆操控时,踏板能够回弹的行为,而不是用推力加减,F1/F2来操控
所以我们有:
function Brake_Timer()
Brake_Linear_Ratio = Brake_Linear_Ratio + SIM_PERIOD
end
function Throttle_Timer()
Throttle_Linear_Ratio = Throttle_Linear_Ratio + SIM_PERIOD
end
这两句,Define出来两个和SIM_PERIOD帧率联动的计时器
以后所有所用到的计时器,都基于 + SIM_PERIOD而来
而后,我们有如下代码来引入回弹这个行为
具体操作是说,
当检测到phase == 0油门被按下的那一刻,开始按SIM_PERIOD跑计时器
而油门的深度将被绑定到计时器的输出上,也就是说 油门按的时间越长,深度越大
当油门被松开的那一刻,离合器(换挡判断窗口)介入一次,停止计时器并将数值归零
同时,在油门松开的那一刻,Idling Timer开始计时,其功能会在后面的代码中呈现
function Avalanche_linear_throttle_handler(phase, duration)
if phase == 0 and is_timer_scheduled(Throttle_Timer) == false
then run_at_interval(Throttle_Timer, SIM_PERIOD)
run_at_interval(Starter_Timer, SIM_PERIOD)
elseif phase == 2 and is_timer_scheduled(Throttle_Timer) == true
then stop_timer(Throttle_Timer)
stop_timer(Starter_Timer)
Throttle_Linear_Ratio = 0
throttle = 0
end
-------Additional Function
if phase == 0 and is_timer_scheduled(Throttle_RPM_Timer_UP) == false
then run_at_interval(Throttle_RPM_Timer_UP, SIM_PERIOD)
stop_timer(Throttle_RPM_Timer_Down)
stop_timer(Idling_Timer)
Idling_Time = 0
elseif phase == 2
then stop_timer(Throttle_RPM_Timer_UP)
AvalancheCMD_clutch:once()
run_at_interval(Throttle_RPM_Timer_Down, SIM_PERIOD)
run_at_interval(Idling_Timer, SIM_PERIOD)
end
end
而后就是我们第一块核心,定义换挡顺序
必须按这种格式写,没有捷径
大概意思就是,当升档机制 phase == 0 激活时,如果1档,变2,如果2档,进3,以此类推
降档反之亦然,如果6档就变5,5变4,4变3…
而 Avalanche_gear_selection() 这个 function,定义了RPM转速的合理范围和计算机制
因为涉及到一个800RPM的怠速,所以复杂了不少
具体意思是,
怠速RPM = 800 + 合理上下浮动值
差动齿轮比 = 3.42 ,常数,写出来为了日后通用化(套模板)方便改
油门输入 = 用户输入 + 怠速油门(能实现D档怠速溜车)
如果RPM_Calc结果 > 5500,那就锁在 5500,然后停止计时器
如果结果小于0,那就锁在0,倒车我们通过档位而不是RPM实现。
如果RPM下行计时器值 > RPM上行,则停止计时器
这是整个变速箱机制最核心的一段,也是我最自豪的一个想法
正是有了这个点子,才实现了P/N档轰油门不走,且RPM和档位一直挂钩这操作
在下一段中详细解释。
--Gear Number -1, 0, 1, 2, 3, 4, 5, 6 Registration
function Avalanche_gear_up_handler(phase, duration)
if phase == 0 then
if Gear_Number == 1 then
Gear_Number = 2
elseif Gear_Number == 2 then
Gear_Number = 3
elseif Gear_Number == 3 then
Gear_Number = 4
elseif Gear_Number == 4 then
Gear_Number = 5
elseif Gear_Number == 5 then
Gear_Number = 6
end
end
end
function Avalanche_gear_down_handler(phase, duration)
if phase == 0 then
if Gear_Number == 6 then
Gear_Number = 5
elseif Gear_Number == 5 then
Gear_Number = 4
elseif Gear_Number == 4 then
Gear_Number = 3
elseif Gear_Number == 3 then
Gear_Number = 2
elseif Gear_Number == 2 then
Gear_Number = 1
end
end
end
function Avalanche_gear_selection()
Gear_Lever_Show = 1
Idle_RPM = 800 + RPM_Randomizer
Current_Diff_Ratio = 3.42
throttle = Throttle_Gain + Throttle_Linear_Ratio
if Throttle_RPM_Timer_Calc >= 5500 then Throttle_RPM_Timer_Calc = 5500 stop_timer(Throttle_RPM_Timer_UP) end
if Throttle_RPM_Timer_Calc <= 0 then Throttle_RPM_Timer_Calc = 0 end
if Throttle_RPM_Timer_Down_Value/2 > Throttle_RPM_Timer_UP_Value then
stop_timer(Throttle_RPM_Timer_Down)
end
--if over limit, treat as released
if Throttle_RPM_Timer_Result >= 5470 then
stop_timer(Throttle_RPM_Timer_UP)
run_at_interval(Throttle_RPM_Timer_Down, SIM_PERIOD)
run_at_interval(Idling_Timer, SIM_PERIOD)
AvalancheCMD_clutch:once()
end
--TO BE CONT.--
所以,这个上下行到底在干什么?
我们需要知道一个前提:你的WSAD没有深度,只能通过按压时间模拟油门
但时间是正向流动的啊,你不能让一个计时器倒回去,因为输出值只读,而乘 -1 越来越大
诶,当我们慌不择路的时候,这个乘 -1 也是条歪路
这时候我们就掏出两个计时器
你随便正向吧,两个正向计时器互相减,只要时间够长,总能归零不是?
所以回到我们之前这个问题,
我油门轰到5000转了 怎么掉下去?
这就是我所说的,RPM守恒定律
你指针经过的路,不会凭空多出来,也不会凭空少一段
所谓RPM上行,就是 只要你给油门一个输入,那就算上行,计时器就开始工作
RPM下行,就是你松开油门之后,只要没有输入,那就算下行,另一个计时器开始工作
我怠速800,踩到5000转,这个过程中一直是上行计时器在工作
下行计时器睡觉
真正松开油门了,上行计时器可以休息了,下行计时器开始计时,用它自己的值继续
根据RPM守恒定律,只要没人从外部鼓捣数据,这两个计时器总会相等的
哪怕你5000转落到中途再来一脚,因为你输入力度是一样的,路程始终也一样
而我 下行/2 > 上行 的意思也很简单,单纯就是让下行始终高上行一倍
所以回落速度比上升速度慢一倍
而你只要停掉上行,下行立马介入
上下行之间的差值,乘以一个常数,就是RPM。常数大小决定了转速升降速度
有朋友问了,我轰油门到红线之后怎么能让他一直呆在5500不掉下来?
这不就是我上一段,结果 > 5500 就锁在5500且停掉计时器的原理嘛
上行停了之后,转速掉下来的同时下行也会介入
而你掉到5500以下,功能恢复,如果继续踩油门,那就一直吊在5500了呗
这就是P/N档轰油门的一个思路
而下面,是D档自动变速的思路
有一个前提条件,不知道大家是否还记得:离合只在松开油门后介入一次
所有油门输入均被当成100%地板油,和欧卡2键盘操作同理
先自己看一下:
--Logic
if gear_D == 1 then
if Gear_Number == 1 and Throttle_RPM_Timer_Calc > 5400 then
if Throttle_Linear_Ratio > 4 then Gear_Number = 2 Throttle_Linear_Ratio = 0
else Gear_Number = math.ceil(Gear_Number + 0.1)
AvalancheCMD_clutch:once()
end
--VERY AGRESSIVE STRATEGY
elseif Gear_Number == 2 and Throttle_RPM_Timer_Calc > 5400 then
if Throttle_Linear_Ratio > 6 then Gear_Number = 3 Throttle_Linear_Ratio = 0
else Gear_Number = math.ceil(Gear_Number + 0.1)
AvalancheCMD_clutch:once()
end
elseif Gear_Number == 3 and Throttle_RPM_Timer_Calc > 5400 then
Gear_Number = math.ceil(Gear_Number + 0.1)
AvalancheCMD_clutch:once()
elseif Gear_Number == 4 and Throttle_RPM_Timer_Calc > 5400 then
Gear_Number = math.ceil(Gear_Number + 0.1)
AvalancheCMD_clutch:once()
elseif Gear_Number == 5 and Throttle_RPM_Timer_Calc > 5400 then
Gear_Number = math.ceil(Gear_Number + 0.1)
AvalancheCMD_clutch:once()
end
end
if speed_matched > 157 then throttle = 0 end --universal speed limiter
if Gear_Number == 6 and Throttle_RPM_Timer_Calc < 700 then
Gear_Number = math.floor(Gear_Number - 0.1)
AvalancheCMD_clutch:once()
elseif Gear_Number == 5 and Throttle_RPM_Timer_Calc < 700 then
Gear_Number = math.floor(Gear_Number - 0.1)
AvalancheCMD_clutch:once()
elseif Gear_Number == 4 and Throttle_RPM_Timer_Calc < 700 then
Gear_Number = math.floor(Gear_Number - 0.1)
AvalancheCMD_clutch:once()
elseif Gear_Number == 3 and Throttle_RPM_Timer_Calc < 700 then
Gear_Number = math.floor(Gear_Number - 0.1)
AvalancheCMD_clutch:once()
elseif Gear_Number == 2 and Throttle_RPM_Timer_Calc < 700 then
Gear_Number = math.floor(Gear_Number - 0.1)
AvalancheCMD_clutch:once()
end
if Gear_Number >= 5 and Throttle_Linear_Ratio > 3 then
Gear_Number = 4 end --downgrader
我这一段,写的是极端条件
主要针对弹射起步和减档情况
Throttle_Linear_Ratio是油门按压时长,可以简单理解为 用户想要干某件事的欲望
时长越高,说明想法越强烈,变化也就需要更激进
前面分出来的两小段,一个是说 如果1档,然后一直按过4秒,转速都到5400了(5500红线)
这期间 要么用户松油门 要么5500自动升档,不管怎样都给他送到2档去,并清零按压时间
在2档的时候,如果超过6秒(高档加速会更慢),那就给他送到3档
而3档本身就可以冲到极速(GM电子限速98mph,157kph)
我也加了电子限速( if 速度 > 157, then 油门 = 0)
所以3档转速本身也上不到那么高
其他的都是在打模板,用math.ceil + 0.1这种方法进1档
这样就不会出现因为线程问题一次上两个档的情况。
而所有档位,当转速小于700的时候,自动用math.floor - 0.1的方法降一档
如果不够,再降,直到1档800转怠速,离合直接全部介入。
我这里用到的速度,不是地速,而是由RPM,变速箱齿轮比,轮胎大小这一系列东西计算出来的
这样才能模拟弹射起步、急刹车时速度表飘忽不定的特性
所以,我们就要计算这个RPM到底是怎么来的
看下面:
--DEFAULT SIZE: 285/50/R20
Current_Tire_Width = 285
Current_Tire_Profile = 50
Current_Rim_Size = 20 --DO NOT CHANGE UNLESS CHANGE CAR MODEL
Current_Tire_Diameter = (Current_Tire_Width * (Current_Tire_Profile / 100) + (Current_Rim_Size / 39.37))/100
Current_Tire_Perimeter = Current_Tire_Diameter * math.pi
Gear_RPM_Standarized = speed * Current_Gear_Ratio / Current_Diff_Ratio * Current_Tire_Perimeter * 60
Gear_RPM_Standarized_Saved = speed * Clutch_From_Ratio / Current_Diff_Ratio * Current_Tire_Perimeter * 60 --For Smooth Transition (Clutch)
speed_matched = (0.86 * math.pi * 9.5493) * tire_rps * 60 * (1 + Gear_Number/18) / 1000
-- DO NOT INLUDE IDELING RPM (800), USED FOR CALCULATION PURPOSE, NOT VISUAL DISPLAY
--[[
Without Override, 285/50R20 Tire = 794mm, Gear ratios
= 4.03, 2.36, 1.53, 1.15, 0.85, 0.67, R = 3.06
Therefore, SPD @ 5500 MAX RPM
= 60 (1), 102 (2), 157 (3), 209 (4), 283 (5), 359 (6) KPH
= 16.67, 28.33, 43.61, 58.06, 78.61, 99.72 MPS (XP SI-Unit)
RPM AFTER Shift
= 5500 (1), 3221 (2), 3566 (3), 4065 (4), 4134 (5), 4335 (6)
--RPM Calculation (Regulator)
Sample:
SPD = RPM / Gear Ratio / Diff Ratio * 60 * Tire Diameter * π
SPD = 5500 / 3.42 / 4.03 * 60 * 0.794 * π (Gear 1 SPD @ 5500 RPM)
RPM = SPD * Gear Ratio / Diff Ratio * 60 * Tire Diameter * π
--]]
if Gear_Number == -1 then Current_Gear_Ratio = Gear_R_Rat
elseif Gear_Number == 0 then Current_Gear_Ratio = Gear_N_Rat
elseif Gear_Number == 1 then Current_Gear_Ratio = Gear_1_Rat
elseif Gear_Number == 2 then Current_Gear_Ratio = Gear_2_Rat
elseif Gear_Number == 3 then Current_Gear_Ratio = Gear_3_Rat
elseif Gear_Number == 4 then Current_Gear_Ratio = Gear_4_Rat
elseif Gear_Number == 5 then Current_Gear_Ratio = Gear_5_Rat
elseif Gear_Number == 6 then Current_Gear_Ratio = Gear_6_Rat
end
Gear_P_Rat = 0
Gear_R_Rat = 3.06
Gear_N_Rat = 0
Gear_1_Rat = 4.03
Gear_2_Rat = 2.36
Gear_3_Rat = 1.53
Gear_4_Rat = 1.15
Gear_5_Rat = 0.86
Gear_6_Rat = 0.67
没什么可说的,都是算式,直接代入数字就出结果
日后如果用在别的车上,改一下轮胎尺寸、变速箱齿轮比、差动齿轮比这些就能用
速度也会跟着调整,已经推演过了。
下面,最后一部分,D档正常操作时的推荐机制,分为三大板块
分别通过当前RPM,当前档位和油门(与滑行)时长来判别用户想干啥
function Avalanche_Trans_Pressure_Recommendation()
Target_RPM = 2500
Throttle_Timer_Diff = Throttle_RPM_Timer_UP_Value - Throttle_RPM_Timer_Down_Value/2
if gear_D == 1 then
if Throttle_Linear_Ratio > 3 then
if Throttle_RPM_Timer_Calc > 2000 then
if Gear_Number >= 4 then
Recommendation_1 = math.abs(Throttle_RPM_Timer_Calc - 2000)/6000 --0-0.6 UP SHIFT
elseif Gear_Number > 0 and Gear_Number <= 3 then
Recommendation_1 = math.abs(Throttle_RPM_Timer_Calc - 2000)/3000 --0-1.5 UP SHIFT
end
elseif Throttle_RPM_Timer_Calc < 2000 then
if Gear_Number >= 4 then
Recommendation_1 = math.abs(Throttle_RPM_Timer_Calc - 2000)/-3000 --(-0.85)-0 DOWN SHIFT
elseif Gear_Number > 0 and Gear_Number <= 3 then
Recommendation_1 = math.abs(Throttle_RPM_Timer_Calc - 2000)/-6000 --(-0.34)-0 DOWN SHIFT
end
end
elseif
Throttle_Linear_Ratio > 5 then
Recommendation_1 = 0
end
if Throttle_Linear_Ratio > 8 then Recommendation_2 = 3
elseif Throttle_Linear_Ratio > 4 and Throttle_Linear_Ratio <= 8 then Recommendation_2 = 2
elseif Throttle_Linear_Ratio > 1.5 and Throttle_Linear_Ratio <= 4 then Recommendation_2 = 1
else Recommendation_2 = 0
end
if Gear_Number == 1 then
if 1 + Recommendation_1 * Recommendation_2 >= 1 and 1 + Recommendation_1 * Recommendation_2 < 2 then Recommendation_3 = 0
elseif 1 + Recommendation_1 * Recommendation_2 >= 2 and 1 + Recommendation_1 * Recommendation_2 < 3 then Recommendation_3 = 0
elseif 1 + Recommendation_1 * Recommendation_2 >= 3 and 1 + Recommendation_1 * Recommendation_2 < 4 then Recommendation_3 = -0.2
elseif 1 + Recommendation_1 * Recommendation_2 >= 4 and 1 + Recommendation_1 * Recommendation_2 < 5 then Recommendation_3 = -0.5
elseif 1 + Recommendation_1 * Recommendation_2 >= 5 and 1 + Recommendation_1 * Recommendation_2 < 6 then Recommendation_3 = -1
elseif 1 + Recommendation_1 * Recommendation_2 >= 6 and 1 + Recommendation_1 * Recommendation_2 < 7 then Recommendation_3 = -2
end
elseif Gear_Number == 2 then
if 2 + Recommendation_1 * Recommendation_2 >= 1 and 2 + Recommendation_1 * Recommendation_2 < 2 then Recommendation_3 = 0.2
elseif 2 + Recommendation_1 * Recommendation_2 >= 2 and 2 + Recommendation_1 * Recommendation_2 < 3 then Recommendation_3 = 0
elseif 2 + Recommendation_1 * Recommendation_2 >= 3 and 2 + Recommendation_1 * Recommendation_2 < 4 then Recommendation_3 = 0
elseif 2 + Recommendation_1 * Recommendation_2 >= 4 and 2 + Recommendation_1 * Recommendation_2 < 5 then Recommendation_3 = -0.3
elseif 2 + Recommendation_1 * Recommendation_2 >= 5 and 2 + Recommendation_1 * Recommendation_2 < 6 then Recommendation_3 = -0.8
elseif 2 + Recommendation_1 * Recommendation_2 >= 6 and 2 + Recommendation_1 * Recommendation_2 < 7 then Recommendation_3 = -1.2
end
elseif Gear_Number == 3 then
if 3 + Recommendation_1 * Recommendation_2 >= 1 and 3 + Recommendation_1 * Recommendation_2 < 2 then Recommendation_3 = 0.5
elseif 3 + Recommendation_1 * Recommendation_2 >= 2 and 3 + Recommendation_1 * Recommendation_2 < 3 then Recommendation_3 = 0.2
elseif 3 + Recommendation_1 * Recommendation_2 >= 3 and 3 + Recommendation_1 * Recommendation_2 < 4 then Recommendation_3 = 0
elseif 3 + Recommendation_1 * Recommendation_2 >= 4 and 3 + Recommendation_1 * Recommendation_2 < 5 then Recommendation_3 = -0.2
elseif 3 + Recommendation_1 * Recommendation_2 >= 5 and 3 + Recommendation_1 * Recommendation_2 < 6 then Recommendation_3 = -0.4
elseif 3 + Recommendation_1 * Recommendation_2 >= 6 and 3 + Recommendation_1 * Recommendation_2 < 7 then Recommendation_3 = -0.6
end
elseif Gear_Number == 4 then
if 4 + Recommendation_1 * Recommendation_2 >= 1 and 4 + Recommendation_1 * Recommendation_2 < 2 then Recommendation_3 = 1
elseif 4 + Recommendation_1 * Recommendation_2 >= 2 and 4 + Recommendation_1 * Recommendation_2 < 3 then Recommendation_3 = 0.2
elseif 4 + Recommendation_1 * Recommendation_2 >= 3 and 4 + Recommendation_1 * Recommendation_2 < 4 then Recommendation_3 = 0
elseif 4 + Recommendation_1 * Recommendation_2 >= 4 and 4 + Recommendation_1 * Recommendation_2 < 5 then Recommendation_3 = 0
elseif 4 + Recommendation_1 * Recommendation_2 >= 5 and 4 + Recommendation_1 * Recommendation_2 < 6 then Recommendation_3 = -0.1
elseif 4 + Recommendation_1 * Recommendation_2 >= 6 and 4 + Recommendation_1 * Recommendation_2 < 7 then Recommendation_3 = -0.2
end
elseif Gear_Number == 5 then
if 5 + Recommendation_1 * Recommendation_2 >= 1 and 5 + Recommendation_1 * Recommendation_2 < 2 then Recommendation_3 = 1.5
elseif 5 + Recommendation_1 * Recommendation_2 >= 2 and 5 + Recommendation_1 * Recommendation_2 < 3 then Recommendation_3 = 1
elseif 5 + Recommendation_1 * Recommendation_2 >= 3 and 5 + Recommendation_1 * Recommendation_2 < 4 then Recommendation_3 = 0.5
elseif 5 + Recommendation_1 * Recommendation_2 >= 4 and 5 + Recommendation_1 * Recommendation_2 < 5 then Recommendation_3 = 0.1
elseif 5 + Recommendation_1 * Recommendation_2 >= 5 and 5 + Recommendation_1 * Recommendation_2 < 6 then Recommendation_3 = 0
elseif 5 + Recommendation_1 * Recommendation_2 >= 6 and 5 + Recommendation_1 * Recommendation_2 < 7 then Recommendation_3 = -0.1
end
elseif Gear_Number == 6 then
if 6 + Recommendation_1 * Recommendation_2 >= 1 and 6 + Recommendation_1 * Recommendation_2 < 2 then Recommendation_3 = 2
elseif 6 + Recommendation_1 * Recommendation_2 >= 2 and 6 + Recommendation_1 * Recommendation_2 < 3 then Recommendation_3 = 1.3
elseif 6 + Recommendation_1 * Recommendation_2 >= 3 and 6 + Recommendation_1 * Recommendation_2 < 4 then Recommendation_3 = 0.4
elseif 6 + Recommendation_1 * Recommendation_2 >= 4 and 6 + Recommendation_1 * Recommendation_2 < 5 then Recommendation_3 = 0.1
elseif 6 + Recommendation_1 * Recommendation_2 >= 5 and 6 + Recommendation_1 * Recommendation_2 < 6 then Recommendation_3 = 0
elseif 6 + Recommendation_1 * Recommendation_2 >= 6 and 6 + Recommendation_1 * Recommendation_2 < 7 then Recommendation_3 = 0
end
end
if Idling_Time > 1 and Gear_Number <= 2 and speed > 8
then Gear_Number = 3
Idling_Time = 0
elseif Idling_Time > 1.5 and Gear_Number <= 3 and speed > 14 --if over 50kph, not in 5th and gliding for 1.5+ sec
then Gear_Number = 4
Idling_Time = 0
elseif Idling_Time > 1.5 and Gear_Number == 4 and speed > 17 --if over 70kph, not in 5th and gliding for 1.5+ sec
then Gear_Number = 5
Idling_Time = 0
elseif Idling_Time > 2 and Gear_Number <= 5 and speed > 23
then Gear_Number = 6 --if over 100kph, not in overdrive and gliding for 3+ sec
else Gear_Number = Gear_Number --when input, resume to the original gear
end
if Idling_Time > 1 and Gear_Number == 1 and speed > 5
then Gear_Number = 2
end
if Idling_Time > 1 and Gear_Number == 2 and speed > 10
then Gear_Number = 3
end
Recommendation_Final = (Recommendation_1 * Recommendation_2 + Recommendation_3)
end
end
function Avalanche_EQ_RPM_handler(phase, duration)
Throttle_RPM_Timer_Down_Value = 0
Throttle_RPM_Timer_UP_Value = 0
end
function Avalanche_clutch_handler(phase, duration)
if gear_D == 1 then
if phase == 0
then
if Gear_Number == 1 then --Do this when Clutch engaged to save data instead of being wiped when changing gear (saver)
Clutch_From_Ratio = Gear_1_Rat
elseif Gear_Number == 2 then
Clutch_From_Ratio = Gear_2_Rat
elseif Gear_Number == 3 then
Clutch_From_Ratio = Gear_3_Rat
elseif Gear_Number == 4 then
Clutch_From_Ratio = Gear_4_Rat
elseif Gear_Number == 5 then
Clutch_From_Ratio = Gear_5_Rat
elseif Gear_Number == 6 then
Clutch_From_Ratio = Gear_6_Rat
end
Clutch = 1
Gear_Number_Final = math.floor(Gear_Number + Recommendation_Final + 0.5)
Gear_Number = Gear_Number_Final
if Recommendation_Final > 0 then
Clutch_RPM_Steps = (Clutch_From - (Clutch_From * Clutch_To_Ratio / Clutch_From_Ratio))* -1 --Finish within 0.5s, decreasing, Before-AFT
Clutch_Extent = 0
run_at_interval(Clutch_Timer, 0.1)
elseif Recommendation_Final < 0 then
Clutch_RPM_Steps = (Clutch_From * Clutch_To_Ratio / Clutch_From_Ratio) - Clutch_From --Finish within 0.5s but increasing RPM, AFT-Before
run_at_interval(Clutch_Timer, 0.1)
--else Clutch_RPM_Steps = 0
end
else Clutch = 0
end
end
end
确实非常乱,但主体思路有这几点:
1. 按压时长越长,反应越激进,趋势指数增长,且直接决定换挡方向(+/-)
2. 档位越高,降档倾向越强;只要油门超过一定时长,直接减档
3. 而档位越低,升档倾向越强,但具体取决于松油门滑行(RPM下行)的时长
4. 低档位时,如油门时间过长,按之前提到的1进2,2进3程序执行
5. 不管哪个档位,溜车超过一定时间,跳进高档。但取决于车速与换挡后 > 700 RPM是否还成立
6. 离合只在RPM > 5400, RPM < 700 与每次松油门的时候,介入。离合即判别点
这就是关于这辆车,变速箱部分的大致开发思路
如有更好的点子,欢迎探讨
车辆外观及数据等元素的使用已得到通用汽车授权,日后将免费发布
==完==