6.3 Контроль температуры сервопривода Dynamixel
Last updated
Last updated
Если вы используете сервоприводы Dynamixel на своем роботе, вы знаете, что они могут нагреваться под нагрузкой. Как перегрев, так и чрезмерные нагрузки могут легко повредить сервопривод, который может стать довольно дорогим, если вы не будете осторожны.
Сервомоторы Dynamixel имеют встроенную защиту от таких отказов, автоматически отключаясь, когда температура, нагрузка или напряжение превышают заранее определенный порог. Пороговые значения устанавливаются непосредственно в микропрограммном обеспечении, поэтому этот уровень контроля повреждений происходит независимо от ROS. Заводские значения по умолчанию для этих порогов, как правило, в порядке. Тем не менее, это неплохая идея, чтобы контролировать температуру сервопривода и нагрузки на уровне ROS. Таким образом, мы можем заранее дать сервомотору или группе сервомоторов отдохнуть, когда им может угрожать опасность перегрева или перегрузки. Кроме того, если сервомотор может быть выключен с помощью встроенного механизма, часто необходимо включить питание всей шины, чтобы восстановить контроль над сервомотором даже после того, как он остынет или больше не будет перегружен.
Для иллюстрации предположим, что ваш робот имеет наклонно-поворотную головку, использующую пару сервоприводов Dynamixel, как мы рассмотрели в главе 12 тома 1. Мы будем использовать файл запуска pi_robot_head_only.launch в каталоге rbx2_bringup / launch, как мы делали при тестировании драйвера arbotix с реальными сервоприводами в предыдущей главе. Этот файл запуска использует драйвер arbotix для подключения к двум сервомоторам AX-12 Dynamixel с аппаратными идентификаторами 1 и 2 и совместными именами head_pan_joint и head_tilt_joint.
Предполагая, что ваши сервоприводы подключены к контроллеру USB2Dynamixel на USB-порту / dev/ttyUSB0, запустите файл запуска с параметром sim, установленным в false:
Если ваш контроллер USB2Dynamixel подключен к другому порту USB, вы можете запустить файл запуска с аргументом port. Например, если ваш контроллер находится на USB-порту / dev/ttyUSB1, используйте команду:
После небольшой задержки вы должны увидеть, что окно rqt_robot_monitor появляется как изображение ниже
Здесь мы видим, что монитор успешно обнаружил наши два головных сервопривода и показывает, что общее состояние каждого из них в порядке. Вы можете дважды щелкнуть по названию сустава, чтобы открыть подробный экран состояния, например тот, который показан ниже для сустава head pan:
Этот экран состояния показывает, что головка лотка по существу центрирована (положение =-0.005), температура составляет безопасные 33 градуса Цельсия, входное напряжение 12В (умноженное на 10 почему-то- но это не 120 вольт!), частота ошибок составляет идеальные 0,0% , а крутящий момент в настоящее время выключен, что означает, что сервопривод расслаблен и может быть повернут вручную.
Драйвер arbotix запрограммирован на публикацию диагностических данных для сервоприводов, которыми он управляет в топике /diagnostics. Затем наш стартовый файл запускает узел diagnostic_aggregator и rqt_robot_monitor, чтобы суммировать состояние каждого сервопривода. Если сервомотор перегреется или перегружен, его состояние превратится в ошибку, и он будет отображаться красным цветом вместо зеленого. Если он становится теплым, но еще не слишком горячим, состояние будет предупреждать с отображением желтого цвета. Драйвер arbotix жестко запрограммирован для присвоения статуса ошибки при любой температуре выше 60℃ и статуса предупреждения при температуре 50℃ и более. Далее в этой главе мы узнаем, как написать собственный diagnostics publisher и как установить пороговые значения по своему усмотрению.
Давайте теперь поближе рассмотрим файл pi_robot_head_only.launch, чтобы увидеть, как выполняются узлы агрегатора и монитора rqt. В нижней части файла запуска вы найдете следующие строки:
Здесь мы запускаем узел diagnostic_aggregator, который загружает конфигурационный файл head_only_diagnostics.yaml, который находится в каталоге rbx2_dynamixels/config. Мы скоро посмотрим этот файл вкратце. Мы также удаляем все оставшиеся параметры диагностического агрегатора, которые могут остаться после предыдущих запусков, используя аргумент clear_params= "true".
Далее мы запускаем узел rqt_robot_monitor, который генерирует графический интерфейс, показанный ранее для визуального просмотра состояния сервопривода.
Файл head_only_diagnostics.yaml определяет, какие анализаторы мы хотим запустить и как должна быть организована информация. Вот как выглядит этот файл:
Мы уже описывали этот самый конфигурационный файл в разделе «Конфигурационный файл анализатора». Если вы считаете, что скорость публикации 1 Гц слишком медленная, вы можете увеличить параметр pub_rate. Седьмая строка указывает, что данные, которые мы хотим суммировать, поступают из диагностических записей, имя которых содержит строку '_joint'. Чтобы понять, почему это работает, нам нужно изучить фактические диагностические сообщения, публикуемые в топике /diagnostics. Давайте перейдем к следующему вопросу.
Ранее мы уже говорили, что драйвер arbotix заботится о публикации диагностических сообщений ROS для нас. Драйвер напрямую связывается с микропрограммным обеспечением сервопривода через последовательный порт, а затем использует API диагностики ROS для публикации данных в разделе /diagnostics
Чтобы просмотреть сообщения, опубликованные в разделе /diagnostics, пока вы подключены к сервомоторам, откройте другой терминал и выполните команду:
Первая часть вывода должна выглядеть примерно так:
Сначала мы видим поля заголовка, а затем начало массива состояния. Символ дефиса ( - ) указывает на начало записи массива. Первый дефис выше указывает на начало первой записи массива состояния. Эта запись имеет индекс массива 0, поэтому эта первая запись будет называться /diagnostics / status[0]. В этом случае запись относится к головному контроллеру, который управляет обоими сервоприводами. Поскольку главный контроллер является программным компонентом, он не имеет положения или температуры, поэтому давайте рассмотрим следующую запись массива
Второй блок выше будет иметь индекс массива 1, так что эта запись будет доступна как /diagnostics / status[1]. В этом случае запись относится к головному суставу. Отступы дефисов под ключевым словом values указывают на записи в массиве ключ-значение для этого диагностического элемента. Таким образом, значение температуры для этого сервопривода будет индексироваться как /diagnostics/status[1].values[1]. Обратите внимание, как мы используем точку (.) для указания подполей элемента массива. Если вы хотите, чтобы эхо просто отражало температуру серво-головки панорамирования, вы можете использовать следующую команду:
Возвращаясь теперь к выводам выше, обратите внимание, что первые несколько полей состояния для соединения головных штифтов являются:
Критическим результатом здесь является значение для подполя level, которое в данном случае равно 0. Напомним, что значение 0 соответствует состоянию диагностики OK. Соответствующие компоненты должны быть идентифицированы по имени, а иногда и по полям hardware_id. Здесь мы видим, что этот элемент массива ссылается на head_pan_joint, но идентификатор оборудования не указан.
Если вы снова выполните команду "rostopic echo / diagnostics | more" и продолжите нажимать пробел, чтобы прокрутить сообщения, вы увидите сообщения о состоянии для каждого сервопривода. В частности, сообщение для сустава наклона головы начинается так:
Таким образом, мы видим, что значение поля name-это просто совместное имя, которое мы назначили каждому сервомотору в нашем конфигурационном файле ArbotiX. Поскольку каждое имя соединения заканчивается строкой "_joint", наш конфигурационный файл анализатора head_only_diagnostics.yaml может использовать эту строку для значения параметра contains, чтобы сообщить агрегатору, что диагностические сообщения, содержащие эту строку в поле их имени, являются теми, которые были заинтересованы.
Пакет rbx2_diagnostics содержит сценарий, который называется monitor_dynamixels.py в поддиректории nodes. Этот узел подписывается на раздел /diagnostics, извлекает сообщения, относящиеся к сервомоторам и отключает сервомоторы, если они оказываются в неисправном состоянии. Затем сценарий отсчитывает таймер, чтобы дать сервомоторам остыть, а затем снова включает их, когда их температура возвращается к нормальной.
Сценарий довольно длинный поэтому давайте сосредоточимся на ключевых строках:
В верхней части скрипта мы импортируем типы диагностических сообщений, которые нам понадобятся, а также службы Relax и Enable из пакета arbotix_msgs:
Список соединений, управляемых узлом arbotix_driver, хранится в параметре ROS /arbotix/joins. На самом деле этот параметр совпадает с параметром joints, который мы определили в нашем конфигурационном файле arbotix. Поэтому мы храним объединенный список (фактически словарь) в переменной self.joints
Мы также читаем параметр minimum_rest_interval (в секундах), чтобы дать сервоприводу время остыть перед повторным включением. Этот параметр можно задать в файле запуска, но мы даем ему значение по умолчанию 60 секунд. Если мы опустим минимальный период охлаждения, то перегрев сервопривода будет отключен ровно на столько, чтобы остыть на один или два градуса, а затем он, вероятно, просто перегреется снова и так далее.
Затем мы инициализируем таймер, чтобы отслеживать, как долго мы отключили сервопривод, а также пару логических флагов, чтобы указать, когда сервоприводы отключены и когда мы отдыхаем. Затем мы вызываем функцию connect_servos () (описанную ниже), которая заботится о подключении к различным темам и службам, связанным с управлением Dynamixels.
Последняя строка выше подписывается на раздел /diagnostics и устанавливает функцию обратного вызова в self.get_diagnostics(), который мы рассмотрим далее:
В первой части функции обратного вызова мы проверяем состояние rest_timer и, если у нас еще осталось немного времени на часах, мы немедленно возвращаемся. В противном случае мы сбрасываем таймер на 0, а флаг resting на False, а затем переходим к следующим строкам:
Функция обратного вызова получает сообщение DiagnosticArray в качестве аргумента msg. Каждый элемент массива представляет собой индивидуальное диагностическое сообщение, поэтому мы хотим перебрать все такие сообщения. Первое, что мы проверяем, - это то, что сильный '_joint' находится в имени сообщения, и если это не так, мы переходим к следующему сообщению, используя оператор continue.
Теперь, когда мы знаем, что имеем дело с совместным сообщением, мы проверяем уровень диагностического статуса. Если состояние указывает на ошибку, то этот сервопривод перегреется, и нам нужно его отключить. Мы могли бы отключить только один сервопривод, но для упрощения сейчас мы отключаем все сервоприводы, когда любой из них перегревается.
Если сервопривод недостаточно горяч для состояния ошибки, но он достаточно теплый для состояния предупреждения, мы выводим предупреждающее сообщение, но не отключаем сервоприводы. Мы также установили пару флагов, чтобы не повторять одно и то же предупреждающее сообщение.
Наконец, если никакие сервоприводы не перегреваются и мы в данный момент не находимся в состоянии покоя, снова включите сервоприводы.
Теперь давайте рассмотрим три функции, которые мы вызывали ранее в скрипте: connect_servos(), disable_serv() и enable_serv().
Функция connect_servos() работает аналогично функции arbotix_relax_all_servos.py, сценарий которого мы рассмотрели в предыдущей главе. В этом случае мы создаем прокси для relax и включаем сервисы для каждого соединения и храним прокси в словаре, индексируемом по имени соединения. Затем мы можем использовать эти службы в функциях disable_servos() и enable_servos().
После того, как мы определили прокси-серверы relax и enable service, можно просто отключить или включить все сервоприводы, перебрав список соединений и вызвав соответствующую службу. Чтобы расслабить и отключить сервопривод, мы вызываем службу enable со значением запроса, установленным в False, и сервопривод расслабится и проигнорирует любые будущие запросы положения. Чтобы повторно включить сервомотор, мы вызываем службу enable со значением запроса True.
Чтобы опробовать этот скрипт, сначала убедитесь, что вы запускаете файл запуска для своих Dynamixels, например pi_robot_head_only.launch, который мы использовали в предыдущем разделе. Затем запустите файл monitor_dynamixels.launch:
Вы должны увидеть следующую серию информационных сообщений:
Теперь вы можете запускать любые другие узлы, такие как отслеживание головы, которые используют сервоприводы. Узел monitor_dynamixels будет контролировать температуру сервопривода, и если какой-либо сервопривод станет слишком горячим, он отключит все сервоприводы до тех пор, пока они не вернутся к безопасной температуре. В то же время другие узлы могут продолжать публиковать сервокоманды, но они будут просто игнорироваться до тех пор, пока Dynamixel не будут повторно включены.