提升小等待值(<10ms)下asyncio.sleep()的性能问题咨询
异步协程控制步进电机的定时精度优化问题
我用树莓派通过python-osc服务器控制步进电机,在异步进程里用await asyncio.sleep(wait_in_s)生成触发信号。测试发现频率高于100Hz时,非阻塞的asyncio.sleep()比阻塞的time.sleep()性能差很多,会出现离散步现象。
实测对比图
asyncio.sleep():指令等待时间与实测等待时间对比

time.sleep():指令等待时间与实测等待时间对比

核心疑问
有没有性能更优的异步协程可用?或者有没有办法以异步方式使用time.sleep()函数?
限制条件
因为需要计数脉冲以让步进电机停在特定角度,还要进行速度升降,所以无法使用硬件PWM控制器。
asyncio.sleep()测试代码
import time import asyncio import numpy as np from matplotlib import pyplot as plt async def main(frequency): time_last = time.time() x_end = 3 sleep_meas = 0 await asyncio.sleep(1 / (frequency)) await asyncio.sleep(1 / (frequency)) await asyncio.sleep(1 / (frequency)) sleep_meas = time.time() - time_last print(f"{frequency}: {1/(sleep_meas/x_end)}") return 1/(sleep_meas/x_end) f = np.geomspace(10, 5000, 1000) f_meas = [] for freq in f: f_meas.append(asyncio.run(main(freq))) fig, ax = plt.subplots() ax.plot(f, f_meas) ax.set_xlabel("commanded frequency") ax.set_ylabel("measured frequency") plt.savefig("test3.png") plt.show()
内容的提问来源于stack exchange,提问作者flo42
相关产品推荐
相关产品推荐

