Взаимодействие с темамиДля взаимодействия и получения информации о темах используется инструмент rostopic, имеющий следующие параметры:
∙ rostopic bw - Отображает ширину полосы данных, используемую темой
∙ rostopic echo - Выводит сообщения на экран
∙ rostopic find - Ищет темы по их типу
∙ rostopic hz - Отображает скорость публикации тем
∙ rostopic info - Выводит информацию об активных темах
∙ rostopic list - Список активных тем
∙ rostopic pub - Публикует данные в тему
∙ rostopic type - Выводит тип темы
Если вы хотите посмотреть больше информаии об этих параметрах, используйте -h:
- Код: Выделить всё • Развернуть
$ rostopic bw -h
Используя параметр pub, мы можем публиковать темы, на которые может подписаться любой узел. Нам нужно лишь опубликовать тему с корректным именем. Используем узел, который необходим для управления. Запустите черепашку /turtlesim, как это делалось в предыдущих уроках. Запустим в новом окне терминала:
- Код: Выделить всё • Развернуть
$ rosrun turtlesim turtle_teleop_key
Мы можем двигать черепашку, используя клавиши со стрелками.
Как черепашка движется во время выполнения turtle_teleop_key?
Если вы хотите увидеть информацию об узлах /teleop_turtle и /turtlesim, мы можем посмотреть на следующий код, который находится в теме, под названием * /turtle1/ cmd_vel [geometry_msgs/Twist] в разделе Publications первого узла. В разделе Subscriptions второго узла есть * /turtle1/cmd_vel [geometry_msgs/Twist]:
- Код: Выделить всё • Развернуть
$ rosnode info /teleop_turtle
Node [/teleop_turtle]
Publications:
* /turtle1/cmd_vel [geometry_msgs/Twist]
...
$ rosnode info /turtlesim
Node [/turtlesim]
...
Subscriptions:
* /turtle1/cmd_vel [geometry_msgs/Twist]
...
Это означает, что первый узел публикует тему, на которую может подписаться второй узел.
turtlesim_node и узел turtle_teleop обмениваются информацией посредством тем ROS. turtle_teleop_key публикует клавиши перемещения в теме, в то время как turtlesim подписан на ту же самую тему для получения клавиш перемещения.
Можно использовать rqt_graph, который показывает выполняющиеся в настоящий момент узлы и темы. rqt_graph создает динамический граф того, что происходит в системе. rqt_graph является частью пакета rqt. Если rqt_graph еще не установлен в системе, выполните:
- Код: Выделить всё • Развернуть
$ sudo apt-get install ros-indigo-rqt
$ sudo apt-get install ros-indigo-rqt-common-plugins
В новом окне Теринала выполним следующую команду:
- Код: Выделить всё • Развернуть
$ rosrun rqt_graph rqt_graph
У вас должно появиться похожее окно:
Если переместить указатель мыши на /turtle1/cmd_vel, то это выделит узлы ROS (здесь - синим и зеленым цветом) и темы (здесь - красным цветом). Как вы можете видеть, /teleop_turtle обменивается информацией с /turtlesim, используя тему /turtle1/cmd_vel.
Используя параметр echo, мы можем посмотреть информацию, отправленную узлом. Выполните следующую команду и используйте клавиши со стрелками, чтобы посмотреть что за данные были отправлены:
- Код: Выделить всё • Развернуть
$ rostopic echo /turtle1/cmd_vel
Вы увидите что-то похожее на следующее:
- Код: Выделить всё • Развернуть
linear:
x: -2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 2.0
---
Вновь вернемся с rqt_graph. В левом верхнем углу нажмите кнопку «Обновить» для отображения нового узла.
Как видно, показанный здесь красным rostopic echo, также теперь подписан на тему turtle1/cmd_vel.
Вы можете посмотреть список тем, на которые подписаны и которые опубликованы, используя следующую строку кода:
- Код: Выделить всё • Развернуть
$ rostopic list
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
Посмотреть тип сообщения, отправленного темой, можно используя следующую команду:
- Код: Выделить всё • Развернуть
$ rostopic type /turtle1/cmd\_vel
geometry_msgs/Twist
Если вам необходимо посмотреть поля сообщения, выполните:
- Код: Выделить всё • Развернуть
$ rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
Это полезные инструменты, потому что, используя эту информацию, мы можем публиковать темы, используя команду rostopic pub [topic] [msg_type] [args]. Наберите в терминале команду:
- Код: Выделить всё • Развернуть
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/
Twist -- ’[3.0, 0.0, 0.0]’ ’[0.0, 0.0, 2]’
Вы увидите черепашку, создающую кривую.
Эта команда отправляет единственное сообщение в turtlesim, в котором содержится информация о том, что необходимо двигаться с линейной скоростью равной 3.0 и угловой скоростью равной 2.0.
Разберем эту команду по частям:
∙ rostopic pub — публикуем сообщение в данной теме
∙ -1 — публиковать только одно сообщение, затем выйти
∙ /turtle1/cmd_vel — имя темы, в которую публиковать
∙ geometry_msgs/Twist — тип сообщения, который использовался при публикации темы
∙ - - — двойное тире сообщает анализатору синтаксиса, что ни один из следующих аргументов не является параметром. Это необходимо в тех случаях, когда в аргумент входит дефис, например в отрицательных числах.
∙ ’[3.0, 0.0, 0.0]’ ’[0.0, 0.0, 2]’ — сообщение geometry_msgs/Twist имеет два вектора: linear и angular, каждый из которых состоит из трех числовых элементов c плавающей точкой. В нашем случае, ’[3.0, 0.0, 0.0]’ становится линейным значением с x=3, y=0, z=0 и ’[0.0, 0.0, 2]’ является угловым значением с x=0, y=0, z=2. Эти аргументы имеют YAML синтаксис.