•  erix@x-plane.com / star_atlas@foxmail.com
首航苍穹
www.aericaps.org
  • 首 页
  • 民航摄影
  • 飞行研究所
    • 飞行教程
    • 开发教程
  • 资源库
    • 国内机场收集库
    • OrthoChina
    • 原创作品
  • 个人日记
    • 个人日记
    • 时效性文章
  • 定制开发教学
  • 关于我们
    • 星图地景开发组
    • 社区贡献
    • 联系我们
    • 声明
  • 许愿池
【开发】原创Lua变速箱 - 思路剖析 关闭 返回上一级  
首页 / 日记 / 【开发】原创Lua变速箱 - 思路剖析

【开发】Lua自动变速箱机制 - 思路剖析
+ 查看更多

发布于:2022-10-22 10:05

    2022/10/22


 

 

屎山代码,零基础,但能跑

代码没啥可显摆的了,能力未到;但自认为工作原理与还原思路值得分享一下

但注意,不要直接复制代码,因为其中剪掉了很多段,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 与每次松油门的时候,介入。离合即判别点

 

 

 

这就是关于这辆车,变速箱部分的大致开发思路

 

如有更好的点子,欢迎探讨

 

车辆外观及数据等元素的使用已得到通用汽车授权,日后将免费发布

 

 

 

==完==

 

 

 

点击这里取消回复。

Submit


高亮文章

  • 【教程】FF350 冷舱启动 &...
  • 【地景】ZBAD北京大兴国际机场...
  • 【地景】ZBNY北京南苑机场(3...
  • 【教程】在真实卫星图上飞行(下)...
  • 【教程】Reshade-超级渲染...
  • 【重新上架】星图谱写指南:X-P...
  • 【地景】ZSOF合肥新桥国际机场
  • 【日志】提问的智慧-飞行模拟器
  • 【地景】六部作—YLHI豪勋爵岛...
  • 星图地景2019年度回顾:感谢一...
  • 【地景】ZYCC长春龙嘉国际机场
访客地图

博客更新日志

免责声明  友情链接  服务条款
----------------------

Sitemap 站点地图


友情链接
 
分享到:

Copyright © 2017-2023  首航苍穹 www.aericaps.org   All Rights Reserved.

  • 首 页
  • 民航摄影
  • 飞行研究所
    • 飞行教程
    • 开发教程
  • 资源库
    • 国内机场收集库
    • OrthoChina
    • 原创作品
  • 个人日记
    • 个人日记
    • 时效性文章
  • 定制开发教学
  • 关于我们
    • 星图地景开发组
    • 社区贡献
    • 联系我们
    • 声明
  • 许愿池