假设运动解算时间是离散的,具有最小间隔dt,而控制周期为T,T>dt,两者可能相差一个整数,也可能相差一个分数或者无理数。
需要在循环的过程中找出控制可以介入的时间点,需要求t0+m*dt≈t0+n*T从而确保控制量能在近似于周期的整数倍的dt的整数倍时间点进入运动解算过程。
设T=n*dt,即使n为整数,由于浮点数误差存在,也无法直接使用t/dt是否为整数来判断。
以下代码至少可以保证求出来的近似对齐时间点在求出时间点个数和最大最小值上是正确的,不论n是整数、分数还是无理数。如果有知道详细原理的欢迎交流讨论。
from math import pi
dt=0.03131313131556497
t=0
n=pi
total_dots=14337 # 总共点数
T=dt*n # 周期
t_list=[]
list1=[]
for i in range(total_dots):
t+=dt
t_list.append(round(t,5))
'组合动作start'
j=t/T
k=j-round(j)
print(k)
if abs(k)<0.5/n: # 0.001:
list1.append(t)
'组合动作end'
if (i+1)%n==0:
print('整n',t,'\n')
print('应该找出的点数', int(total_dots/n))
最后算出:应该找出的点数为4563
t_list一共是14337个值,最小0.03131,最大448393636
list1一共是4563个值,最小0.09393939....,最大448.873737....
如果正常一点,设dt=0.01,n=10,计算的结果也是正确的。