定时命令插值的运算法则
以下是插值运算法则的说明。
对于每个致动器,会保存以下数据:
- “sendCommand”是最后一个作为整数的插值命令,会被发送 至致动器,并被初始化为0。
- “lastCommandDouble”是最后计算的命令,为双精度, 以保持下一个计算的精确性。“sendCommand”是距“lastCommandDouble”最近的整数。
- “lastCommandValue”是最后一个定时命令的值,无插值。
- “lastCycleTime”是该致动器最后运行这一运算法则的时间。
- “lastCommandTime”是最后一个命令的确切时间。
针对每一个致动器:
do 寻找下一次定时命令(这些命令受时间控制) 如果没有, 将lastCycleTime设定为当前时间 如果有一个定时命令, diff0 = 当前时间与命令时间之间的时间差 如果命令时间大于当前时间(过去的命令),在这个命令后停止回程。 如果命令时间大于等于当前时间(过去的命令) 使用这个命令,即现在,sendCommand、 lastCommandDouble和lastCommandValue与定时命令的值相等; lastCommandTime等于定时命令, lastCycleTime等于当前命令。 从列表中移除该定时命令。 此外(未来的命令) 如果lastCommandTime介于当前时间和最后循环时间之间 (意为如果最后的命令发生在最后一个循环和这一个循环之间) VarlastTime = lastCommandTime VarlastCommand = lastCommandValue 此外(如果最后的命令先于最后一个循环) VarlastTime = lastCycleTime VarlastCommand = lastCommandDouble diffTime1 = 当前时间与VarlastTime之间的时间 diffTime2 = 新命令时间与VarlastTime之间的时间 VarCommand = ((value of the new command - VarlastCommand)*diffTime1)/diffTime2 + VarlastCommand sendCommand = VarCommand最近的舍入 lastCommandDouble = VarCommand lastCycleTime = 当前时间 loop
注意: |
在完全相同的时间(以ms为单位)发送一个或多个不同值的定时命令 会导致无法预测的结果。 |
---|
第一个例子:
假设DCM循环为每10ms一次。
命令1发送至(10,10):第一个数字是时间, 第二个是值(类似关节和度)。
在t=30ms(或在20-30ms之间)时,DCM收到另一个在(80,40)的命令。
以下是随后几个循环的计算:
- t = 30ms
diffTime1 = 30 - 20 = 10. diffTime2 = 80 - 20 = 60
VarCommand = ((40 -10)*10)/60 + 10 =15
- t = 40ms
diffTime1 = 40 - 30 = 10. diffTime2 = 80 - 30 = 50
VarCommand = ((40 -15)*10)/50 + 15 = 20
- t = 50ms
diffTime1 = 50 - 40 = 10. diffTime2 = 80 - 40 = 40
VarCommand = ((40 -20)*10)/40 + 20 = 25
- t = 60ms
diffTime1 = 60 - 50 = 10. diffTime2 = 80 - 50 = 30
VarCommand = ((40 -25)*10)/30 + 25 = 30
- t = 70ms
diffTime1 = 70 - 60 = 10. diffTime2 = 80 - 60 = 20
VarCommand = ((40 -30)*10)/20 + 30 = 35
- t = 80ms
diffTime1 = 80 - 70 = 10. diffTime2 = 80 - 70 = 10
VarCommand = ((40 -35)*10)/10 + 35 = 40
此后,值就停留在40,供以后的循环使用,直至另一个命令被发送。
第二个例子:
假设DCM循环为每10ms一次。
在t=10ms(或在0和10之间),DCM收到4个针对这个致动器的命令: (15,10)、(25,30)、(45,20)和(65,0)。
以下是下随后几个循环的计算:
- t = 10ms
diffTime1 = 10 - 0 = 10. diffTime2 = 15 - 0 = 15
VarCommand = ((10 -0)*10)/15 + 0 = 6.66
- t = 20ms
diffTime1 = 20 - 15 = 5. diffTime2 = 25 - 15 = 10
VarCommand = ((30 - 10)*5)/10 + 10 = 20
- t = 30ms
diffTime1 = 30 - 25 = 5. diffTime2 = 45 - 25 = 20
VarCommand = ((20 - 30)*5)/20 + 30 = 27.5
- t = 40ms
diffTime1 = 40 - 30 = 10. diffTime2 = 45 - 30 = 15
VarCommand = ((20 - 27.5)*10)/15 + 27.5 = 22.5
- t = 50ms
diffTime1 = 50 - 45 = 5. diffTime2 = 65 - 45 = 20
VarCommand = ((0 - 20)*5)/20 + 20 = 15
- t = 60ms
diffTime1 = 60 - 50 = 10. diffTime2 = 65 - 50 = 15
VarCommand = ((0 - 15)*10)/15 + 15 = 5
- t = 70ms and above
VarCommand = 0