6.5 Создание собственных диагностических сообщений
Узел батареи ноутбука, представленный в предыдущем разделе, также публикует информацию о заряде батареи по теме /laptop_charge. Предполагая, что у вас все еще работает узел батареи ноутбука, вы можете просмотреть сообщения, опубликованные в этой теме, с помощью команды:
Как вы можете видеть на выходе, сообщение включает в себя напряжение, скорость заряда или разряда (в зависимости от знака), уровень заряда, емкость, процент оставшегося заряда, состояние заряда (0 = разрядка, 1 = есть заряд, 2 = полностью заряжен) и наличие или отсутствие его.
То, что мы хотели бы сделать - это превратить процентное значение заряда в диагностический уровень OK, WARN или ERROR и опубликовать его в разделе /diagnostics в качестве стандартного диагностического сообщения ROS. Наш новый сценарий назывался: monitor_laptop_charge.py, подписывается на тему /laptop_charge и преобразует процентную плату в один из трех стандартных уровней состояния диагностики: OK, WARN или ERROR.
Мы будем использовать файл monitor_laptop_charge.launch, чтобы вызвать узел и запустить диагностический агрегатор с соответствующим конфигурационным файлом. Файл запуска выглядит следующим образом:
Строки 2-5 запускают monitor_laptop_charge.py узел и установите предупреждающий уровень заряда батареи на 50% , а уровень ошибки - на 20%. Строки 7-9 вызывают diagnostic_aggregator с конфигурационным файлом power.yaml, найденных в каталоге rbx2_diagnostics/config. Наконец, строка 11 вызывает графический интерфейс rqt_robot_monitor, если он еще не запущен.
Файл power.yaml выглядит следующим образом:
Скорость публикации 1.0 Гц, заданная параметром pub_rate, кажется подходящей для монитора батареи, так как уровень заряда батареи меняется не очень быстро.
Строка 3 указывает на то, что мы будем использовать пространство имен power под пространством имен ~analyzers для хранения агрегированных диагностических данных для питания батареи.
Строка 4 указывает, что мы будем использовать тип плагина Generic Analyzer для анализа этих устройств.
В строке 5 параметр path определяет строку, которая будет использоваться для классификации этих устройств при просмотре в графическом интерфейсе RQT_ROBOT_MONITOR. В этом случае мы хотим, чтобы все наши сервоприводы были перечислены в категории "Power System".
Строка 6 определяет тайм-аут для получения обновления от устройства. Если в течение этого периода времени от устройства не будет получено никаких данных, то устройство будет помечено как "Stale"(устаревшее) в rqt_robot_monitor.
Наконец, в строке 7 мы указываем список строк, которые должны появиться где-то в сообщении диагностического массива, чтобы определить тип устройства, которое мы хотим контролировать.
Чтобы попробовать его, сначала убедитесь, что вы находитесь на ноутбуке, а затем запустите файл laptop_battery.launch, если он еще не запущен:
Затем запустите файл monitor_laptop_charge.launch:
После небольшой задержки вы увидите появившееся окно rqt_robot_monitor, которое должно выглядеть следующим образом:
В категории "Power System"(система питания) у нас есть два сообщения о состоянии: одно для батареи в целом (т. е. ее можно обнаружить) и одно для текущего уровня заряда. Первый статус предоставляется компанией laptop_battery.py узел тогда как второй публикуется нашим новым узлом monitor_laptop_charge.py Давайте теперь взглянем на этот сценарий.
Ссылка на источник: monitor_laptop_charge.py
А теперь давайте разберём всё по частям:
Сначала нам нужно несколько типов сообщений из пакета diagnostics_msgs.
Нам также нужен тип сообщения о состоянии зарядки ноутбука, который определен в пакете linux_hardware.
Здесь мы создаем издателя, чтобы опубликовать заряд ноутбука в виде сообщения диагностического массива в разделе /diagnostics
И здесь мы создаем подписчика для мониторинга темы /laptop_charge. Функция обратного вызова self.pub_diagnostics (объяснено ниже) преобразует заряд ноутбука в диагностическое сообщение ROS.
Мы начинаем функцию обратного вызова, назначенную пользователю темы /laptop_charge. Напомним, что сообщение о состоянии заряда ноутбука содержит поле для оставшегося процентного заряда, поэтому мы извлекаем это значение из переменной msg, которая передается в обратный вызов.
Мы хотим опубликовать процентный заряд в виде сообщения DiagnosticArray, поэтому сначала создадим пустой массив в виде переменной diag_arr. Затем мы даем массиву ту же временную метку, что и штамп входящего сообщения.
Поскольку диагностический массив состоит из отдельных диагностических сообщений о состоянии, мы инициализируем переменную diag_msg соответствующим образом и присваиваем соответствующую метку полю имени.
Напомним, что массив значений в диагностическом сообщении о состоянии хранится в виде пар «ключ-значение», где оба члена пары являются строками. Поэтому здесь мы добавим пару значений ключа (KeyValue), где ключ - это строка "percent_charge", а значение-это фактический процент заряда, преобразованный в строку.
Затем мы устанавливаем значение полей level и message переменной diag_msg в соответствии с пороговыми значениями, заданными в параметрах error_percent и warn_percent.
Наконец, мы добавляем созданное сообщение о состоянии диагностики в массив диагностики и публикуем результат.
Last updated