Python Websocket-клиент, получать только самые последние сообщения в очереди

Я запускаю websocket-client на Raspberry Pi для управления сервоприводом, используя данные, отправленные сервером веб-сокета скачкообразного движения. Объем данных, отправляемых через соединение веб-сокета при скачкообразном движении, настолько велик, что происходит большая задержка, когда пи перехватывает самое последнее сообщение, которое только ухудшается по мере того, как оно дольше выполняется.

Как я могу отбросить все старые сообщения в очереди и просто использовать самое последнее при проверке? В настоящее время я делаю это:

ws = create_connection("ws://192.168.1.5:6437")
    while True:
        result = ws.recv()
        resultj = json.loads(result)
        if "hands" in resultj and len(resultj["hands"]) > 0:
                # print resultj["hands"][0]["palmNormal"]
                rotation = math.atan2(resultj["hands"][0]["palmNormal"][0], -resultj["hands"][0]["palmNormal"][1])
                dc = translate(rotation, -1, 1, 5, 20)
                pwm.ChangeDutyCycle(float(dc))

1 ответ

Поскольку служба Leap отправляет данные со скоростью примерно 110 кадров в секунду, у вас есть около 9 мсек для выполнения любой обработки. Если вы превысите это, то вы отстанете. Возможно, самое простое решение - создать искусственную частоту кадров приложения. Для каждого цикла, если вы не достигли времени следующего обновления, вы просто получаете следующее сообщение и отбрасываете его.

ws = create_connection("ws://192.168.1.5:6437")
allowedProcessingTime = .1 #seconds
timeStep = 0 
while True:
    result = ws.recv()
    if time.clock() - timeStep > allowedProcessingTime:
        timeStep = time.clock()
        resultj = json.loads(result)
        if "hands" in resultj and len(resultj["hands"]) > 0:
                # print resultj["hands"][0]["palmNormal"]
                rotation = math.atan2(resultj["hands"][0]["palmNormal"][0], -resultj["hands"][0]["palmNormal"][1])
                dc = translate(rotation, -1, 1, 5, 20)
                pwm.ChangeDutyCycle(float(dc))
        print "processing time = " + str(time.clock() - timeStep) #informational

(Я не запускал эту модификацию вашего кода, поэтому применяются обычные предостережения)

Другие вопросы по тегам