Играйте с параметрами ROS2 с помощью Python

робот

Всем привет, я милая рыбка. Веб-сайт Yuxiang ROS почти готов, и я скоро встречусь с вами~

В этом разделе Сяоюй расскажет вам, как с помощью Python превратить цикл таймера написания романов в узле Ли Си в параметр, который можно динамически изменять.

1. Написание кода

Откройте vscode, откройте li4.py и сосредоточьтесь на следующей строке кода.

class Li4Node(Node)

Эта строка программы сообщает нам, что Li4Node наследуется от rclpy.node.Node. Так Ли Си получил способность, связанную с параметрами:

имя функции описывать
declare_parameter объявить и инициализировать параметр
declare_parameters объявить и инициализировать кучу параметров
get_parameter Получить параметр по имени параметра
get_parameters Получить несколько параметров по нескольким именам параметров
set_parameters Установить значение набора параметров
больше функций docs.ROS2.org/latest/API/…

Чтобы завершить модификацию параметров скорости записи Li Si, нам нужно сделать два шага, объявив параметры и получив параметры

1.1 Объявление параметров

Исправлять__init__функции, добавьте следующую строку кода в конце

# 声明参数,参数名字,默认值
self.declare_parameter("write_timer_period",5

1.2 Получить и установить параметры

Здесь мы делаем это в функции обратного вызова таймера и обновляем ее каждый раз, когда заканчиваем писать роман.

Исправлятьtimer_callbackфункцию, добавьте две строки кода внизу

# 回调之后更新回调周期
timer_period = self.get_parameter('write_timer_period').get_parameter_value().integer_value
# 更新回调周期
self.timer.timer_period_ns = timer_period * (1000*1000*1000)

Полный код выглядит следующим образом:

    def timer_callback(self):        
        msg = String()        
        msg.data = '第%d回:潋滟湖 %d 次偶遇胡艳娘' % (self.i,self.i)        
        self.write.publish(msg)  #将小说内容发布出去        
        self.get_logger().info('李四:我发布了艳娘传奇:"%s"' % msg.data)    
        #打印一下发布的数据,供我们看        
        self.i += 1 #章节编号+1
        
        # 回调之后更新回调周期        
        timer_period = self.get_parameter('write_timer_period').get_parameter_value().integer_value        
        # 更新回调周期        
        self.timer.timer_period_ns = timer_period * (1000*1000*1000)

Чтобы немного объяснить, новые две строки кода используются для получения текущего значения параметра через имя параметра и преобразования его в целочисленные данные.

Другая строка используется для обновления периода обратного вызова (для этого вы можете изменить переменную-член таймера timer_period_ns)

2. Тест

2.1 Компилятор

colcon build --packages-select village_li

2.2 Четыре узла багажа

ros2 run village_li  li4_node

图片

2.3 Используйте тест командной строки ros2 param

2.3.1 Просмотр списка параметров

ros2 param list

图片

2.3.2 Просмотр описания

ros2 param describe /wang2 novel_price

图片

2.3.3 Получить значение параметра

ros2 param get /wang2 novel_price

图片

2.3.4 Установите значение параметра для увеличения цены

Установите здесь значение 1, чтобы Ли Си могла написать главу за одну секунду.

ros2 param set li4 write_timer_period 1

图片

Некоторые друзья сказали, как я узнаю, стал ли Ли Си быстрее, здесь Сяоюй расскажет об очень хорошем инструменте командной строки :tropical_drink:ros2 topic hz <topic-name>

ros2 topic hz /sexy_girl

Эта команда позволяет нам увидеть информацию о частоте темы.

Сравнивая скорость до и после настройки, она явно ускорена.

Небольшая мысль, мы установили период 5, почему курс здесь 0,200, а позже мы меняем период на 1, почему курс продолжает расти?

图片

3. Резюме

Используя Python для работы с параметрами в этом разделе, я считаю, что вы, такой же милый, как Сяоюй, освоили метод использования параметров в узлах Python. В следующем разделе Xiaoyu расскажет вам об использовании параметров в узлах C++.

References

[1]Узел — документация по rclpy 0.6.1 (ros2.org):docs.ROS2.org/latest/API/…