7.3 Добавление поддержки клиента динамической реконфигурации к узлу ROS
В предыдущем разделе мы показали, как добавить динамически настраиваемые параметры в узел симулятора батареи. Для этого мы использовали библиотеку сервера динамической реконфигурации. Запуск узла в качестве сервера динамической реконфигурации позволяет ему принимать запросы на изменение параметров от клиентских узлов, таких как rqt_reconfigure. Однако иногда вы можете захотеть, чтобы один из ваших собственных узлов действовал как клиент и запрашивал изменения параметров в других узлах, или же вы можете захотеть, чтобы узел просто знал, когда параметры другого узла были изменены, и действовал соответственно. Хотя это не так часто, как настройка узла в качестве сервера динамической настройки, давайте быстро рассмотрим, как это можно сделать.
Наш демо-скрипт называется dyna_client.py и может быть найден в каталоге rbx2_utils/nodes. Этот узел подключается к имитатору батареи и устанавливает уровень заряда батареи попеременно между 100 и 0 каждые 10 секунд. Хотя это и не самый полезный пример, он, по крайней мере, иллюстрирует этот процесс. Вот полный сценарий.
Давайте теперь посмотрим на ключевые строки:
Сначала мы импортируем клиентскую библиотеку dynamic configure, а не серверную библиотеку.
Здесь мы создаем клиентское соединение с узлом Battery simulator, устанавливаем тайм-аут на 30 секунд и назначаем функцию обратного вызова, определенную ниже. Обратите внимание, что функция обратного вызова будет вызываться всякий раз, когда параметры узла Battery simulator изменяются, даже другим узлом, таким как rqt_reconfigure. Это позволяет узлу dyna_client отслеживать изменения параметров в узле Battery simulator и при необходимости корректировать свое собственное поведение.
Эта линия устанавливает скорость для нашего основного контура 0,1 Гц или один цикл в 10 секунд
Мы используем переменную заряда, чтобы чередовать уровень заряда батареи от 100 до 0. Затем мы входим в основной цикл и запускаем клиент.функция update_configuration() позволяет установить параметр new_battery_level имитатора батареи равным 100 или 0 в зависимости от значения заряда. Обратите внимание, как имя и значение параметра задаются в виде словаря Python. Если бы мы хотели изменить оба параметра new_battery_level и battery_runtime одновременно, строка обновления выглядела бы так:
Где runtime приобретёт новое значение во время выполнения.
Наконец, давайте рассмотрим функцию обратного вызова клиента:
Функция динамического обратного вызова клиента конфигурирования автоматически получает текущую конфигурацию параметров в качестве аргумента, который мы назвали config выше. Этот аргумент является словарем значений, и мы можем вытащить текущее значение любого параметра по имени. В строке 30 выше мы просто показываем значение параметра new_battery_level в окне терминала.
Чтобы увидеть сценарий в действии, сначала запустите узел имитатора батареи:
Далее запустите узел dyna_client.py:
Если вы контролируете dyna_client.py в окне терминала вы увидите вывод с командой rospy.loginfo() выше каждые 10 секунд, и значение параметра new_battery_level будет чередоваться между 100 и 0. Чтобы убедиться, что имитатор батареи действительно реагирует на новый уровень заряда батареи, откройте другой терминал и проверьте сам уровень заряда батареи, опубликованный в разделе /battery_level:
Здесь вы должны увидеть обратный отсчет уровня заряда батареи, как обычно, начиная с 100, но каждые 10 секунд он будет прыгать либо до 0, либо обратно до 100.
Наконец, вызовите rqt_reconfigure и измените параметр new_battery_level с помощью графического интерфейса. В окне dyna_client.py вы должны видеть выходные данные функции обратного вызова как каждые 10 секунд от ее собственного действия, так и каждый раз, когда вы изменяете значение с помощью rqt_reconfigure.
Last updated