Я запускаю новое программное обеспечение для управления роботом для нашей роботизированной системы, которое должно считывать значения с нескольких независимых датчиков и соответствующим образом управлять двигателями.
Программное обеспечение будет работать на компьютере i5 с PREEMPT_RT Ubuntu. Каждое сенсорное устройство поставляется с SDK, который я хочу запустить в отдельном потоке. Как только они получают новые значения от своих датчиков (может быть до 50 удвоений от одного датчика одновременно), они должны обновить эти значения в превосходящем потоке управления. Частота обновления зависит от датчика, но будет такой же высокой, как 1 кГц. Как только «главный датчик» получил новые значения и отправил их в поток управления, поток основного датчика должен запустить цикл управления в потоке управления (с неблокирующим вызовом). Затем управляющий поток должен вычислить новые значения для двигателей с сохраненными в данный момент значениями датчиков и передать их на двигатели. Основной датчик, который запускает контур управления, также получает новые данные с частотой 1 кГц, поэтому часто необходимо выполнять поток управления.
Теперь я не уверен, как подойти к этому. Как вы думаете, функциональность потоков из C ++ 11 уже может решить эту проблему? Или я должен использовать что-то вроде pthreads или boost?
Основными требованиями являются сверхнизкая задержка (~ 10 мкс) для отправки данных (до 50 удвоений) из одного потока в другой и возможность запуска функции (неблокирующей) в другом потоке.
Как только потоки датчика отправляют текущие данные в поток управления, они должны продолжить мониторинг аппаратного обеспечения, чтобы проверить новые значения датчика и извлечь их. Некоторые из потоков датчиков выполняют дополнительные вычисления и фильтруют данные датчика, поэтому я хочу, чтобы они выполнялись в дополнительных потоках, а затем использовали преимущества четырехъядерного процессора.