# 7.1 Добавление динамических параметров к вашим собственным узлам

Добавление поддержки динамической реконфигурации к вашим собственным узлам не является сложным и рассматривается как для C++, так и для Python в пошаговых руководствах по [динамической реконфигурации на Ros Wiki](http://wiki.ros.org/dynamic_reconfigure/Tutorials). Здесь мы рассмотрим эти концепции, используя в качестве примера имитатор поддельной батареи

## 7.1.1 Создание .cgf файла

Каждый параметр, которым вы хотите управлять динамически, должен быть указан в поле .cfg для вашего узла. Эти конфигурационные файлы находятся в подкаталоге cfg пакета, содержащего ваш узел. Файл cfg для поддельного симулятора батареи называется **Battery Simulator.cfg** и живет в каталоге **rbx2\_utils/cfg**. Давайте теперь взглянем на этот файл:

```
1 #!/usr/bin/env python
2
3 PACKAGE = "rbx2_utils"
4
5 from dynamic_reconfigure.parameter_generator_catkin import * 6
7 gen = ParameterGenerator()
8
9 gen.add("battery_runtime", int_t, 0, "Battery runtime in seconds", 30, 1, 7200)
10
11 gen.add("new_battery_level", int_t, 0, "New battery level", 100, 0, 100)
12
13 exit(gen.generate(PACKAGE, "battery_simulator", "BatterySimulator"))
```

Как вы можете видеть, файл довольно прост. Сначала мы устанавливаем переменную **package** в пакет, в котором мы находимся. Затем мы импортируем библиотеку catkin dynamic reconfigure generator. Это позволяет нам создать объект **Parameter Generator()** и добавить пару целочисленных параметров. Строка 9 добавляет параметр **battery\_runtime** со значением по умолчанию 60 секунд и диапазоном 1-7200 секунд. Строка 11 добавляет параметр **new\_battery\_level** со значением по умолчанию 100 и диапазоном 0-100. Общая форма функции **add()** выглядит следующим образом:

> gen.add("name", type, level, "description", default, min, max)

Разберём, какие поля мы видим:

* name - имя параметра в котировках Dynamic Reconfigure-201
* type - тип сохраняемого значения, и может быть любым из int\_t, double\_t, str\_t или book\_to
* level - битовая маска, которая позже будет передана в динамический обратный вызов реконфигурации. При вызове обратного вызова все значения уровня для параметров ORed, которые были изменены, объединяются вместе, и результирующее значение передается обратному вызову. Это может быть использовано для организации параметров в группы, такие как те, которые управляют датчиками, которые должны быть выключены или перезапущены при изменении параметра
* description - строка, описывающая параметр
* default - значение по умолчанию
* min - минимальное значение (необязательно и не применяется к типам string и bool)
* max - максимальное значение (необязательно и не применяется к типам string и bool)

Примечание: строка name не может быть значением "i", "state" или "name", как описано в этом выпуске.

Последняя строка файла cfg должна быть написана тщательно:

```
13 exit(gen.generate(PACKAGE, "battery_simulator", "BatterySimulator"))
```

Первая строка внутри кавычек должна совпадать с именем узла, который мы настраиваем, но без расширения файла. Вторая строка внутри кавычек должна быть именем самого файла cfg без указания расширения .cfg.

## 7.1.2 Создание исполняемого файла .cfg

После того, как файл cfg будет создан, он должен быть выполнен с помощью следующих команд:

```
$ roscd rbx2_utils/cfg
$ chmod a+x BatterySimulator.cfg
```

## 7.1.3 Настройка файла CMakeLists.txt

Любой пакет, содержащий динамически настраиваемые узлы, должен иметь несколько строк конфигурации, добавленных к файлу **CMakeLists.txt**.. Эти строки заставляют **catkin\_make** запускать файл cfg, который генерирует необходимый код времени выполнения. Для симулятора батареи.файл cfg, который будет запущен при создании пакета rbx2\_utils, следующие строки должны были бы появиться в списках **CMakeLists.txt**:

```
1 cmake_minimum_required(VERSION 2.8.3)
2
3 project(rbx2_utils)
4
5 find_package(catkin REQUIRED COMPONENTS dynamic_reconfigure)
6
7 generate_dynamic_reconfigure_options(
8 cfg/BatterySimulator.cfg
9 cfg/Pub3DTarget.cfg
10 )
11
12 catkin_package(DEPENDS CATKIN DEPENDS dynamic_reconfigure)
```

Макрос **find\_package()** гарантирует, что мы включим пакет **dynamic\_reconfigure** и все его поддерживающие зависимости. Макрос **generate\_dynamic\_reconfigure\_options()** принимает пути ко всем файлам cfg (относительно каталога пакета), которые мы хотим построить. Здесь мы использовали файл **BatterySimulator.cfg**, который мы уже обсуждали, а также второй файл cfg (**Pub3DTarget.cfg**) , который мы будем использовать для другого узла в последующих главах.

Наконец, мы включаем пакет **dynamic\_reconfigure** в макрос **catkin\_package()**.

## 7.1.4 Сборка пакета

После добавления файла cfg или внесения изменений в существующий файл запустите **catkin\_make** как обычно:

```
$ cd ~/catkin_ws
$ catkin_make
```
