- Содержание
- Привет
- Запустим всё для управления
- Программы - узлы
- Каналы передачи данных - топики
- RQT Graph
- Запуск
- Master
- Чему научились?
- Вопросики
Итак, мы уже касались вопроса программ в ROS. Не раз запускали Gazebo и Rviz, но теперь пара раз и навсегда определиться с понятиями узел и топик.
А делать мы это будем путём выяснения, как работает teleop управление и как задаются команды управления!
Давай запустим симулятор и включим телеуправление с клавиатуры. Конечно, когда запустили, надо немного покататься! Естественно, чтобы убедиться в работоспособности, а не только, чтобы развлечься =)
roslaunch super_robot_package turtlebot3_world.launch
# Следующая команда в отдельном терминале
roslaunch super_robot_package turtlebot3_teleop_key.launchИтого, мы имеем симулятор (Gazebo) и управление с клавиатуры:
Шикарно, начнём!
Уже говорили, что программы и скрипты в ROS называются узлами (nodes). Это всё, что надо знать про определение =)
Что интереснее, как с ними взаимодействовать?
Для начала, надо понять, что при запуске робота запускается сразу несколько узлов, а значит нам нужен способ посмотреть весь список запущенных узлов.
В любой работе относительно узлов нам поможет утилита rosnode:
rosnode listВ выводе видим:
/gazebo
/gazebo_gui
/rosout
/turtlebot3_teleop_keyboardПрямо сейчас запущено всего 4 узла, пройдёмся, что это за узлы:
gazebo- сервер симуляции, по сути, делает все вычисления физики симулятора;gazebo_gui- графический интерфейс (GUI) для симулятора, если помнишь, его можно отключить;rosout- это узел, который стартует всегда в системе ROS, он обрабатывает вывод из других узлов (консольный вывод);turtlebot3_teleop_keyboard- наш узел управления с клавиатуры.
Вроде несложно, так?
Тогда, чтобы разобраться с тем, как работает управление с клавиатуры, нам надо глубже копнуть в информацию об узле управления, для этого есть команда info:
rosnode info /turtlebot3_teleop_keyboardВывод
--------------------------------------------------------------------------------
Node [/turtlebot3_teleop_keyboard]
Publications:
* /cmd_vel [geometry_msgs/Twist]
* /rosout [rosgraph_msgs/Log]
Subscriptions:
* /clock [rosgraph_msgs/Clock]Разберём-с, узел управления с клавиатуры имеет "Publications" и "Subscriptions". Что-то публикуется и на что-то он подписывается. Вот тут мы начинаем пересекаться с понятием топика. Пойдёём разберёмся с ними!
Давай взглянем на то, как организовано общение между узлами в ROS:
Есть ещё такая gif-ка:
В ROS каждый узел выполняет свою задачу, но они не могут работать без коммуникации между собой. Так вот топики - это один из способов общения между узлами. Как видно на картинке, узлы могут публиковать в топики (Publication - отправлять через него данные) и подписываться на топики (Subscription - получать через него данные).
Ну, а в нашем примере, teleop подписывается на /clock, а публикует в /cmd_vel и /rosout.
Если /clock и /rosout - это сервисные топики, то /cmd_vel, полагаем, отправляет интересную информацию!
Давай проанализируем топики в системе с помощью утилиты rostopic и команды list:
rostopic listВот видим в выводе много разных топиков и в частности:
...
/clock
/cmd_vel
...Ну, просто получить список полезно, но мы также можем и получить информацию о конкретном топике командой info:
rostopic info /cmd_velВывод:
Type: geometry_msgs/Twist
Publishers:
* /turtlebot3_teleop_keyboard (http://alexey-home-pc:34797/)
Subscribers:
* /gazebo (http://alexey-home-pc:34455/)Вот так мы можем видеть, что узел публикации подтвердился, /turtlebot3_teleop_keyboard, а ещё мы увидели, кто подписался на топик, /gazebo - симулятор!
Давай теперь сами подпишемся на топик и посмотрим, какая информация ходит через него?
rostopic echo /cmd_velИ у нас непрерывно покатился вывод:
...
linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
...А вот это уже интересно, давай попробуем поуправлять в терминале телеуправления и параллельно смотреть на вывод из подписки /cmd_vel:
Смотри, значения меняются! Значит, через этот топик передаётся информация о команде на движение. Если более конкретно, то через linear/x поле передаётся желаемая линейная скорость, а через angular/z - команда на скорость поворота.
! Таким образом, топик - это канал передачи потоковой информации (так как передаем непрерывно). Данные внутри передаются с определённой структурой, которая регламентирована типом сообщения у топика. Это видно и на картинке, а в нашем случае
/cmd_velимеет тип "geometry_msgs/Twist". О каждом типе можно почитать в справке или через командуrosmsg show geometry_msgs/Twist.
Для аналогии можно привести конвеерную ленту, через которые передаются коробки конкретной формы и размера. информацию о коробке позволяет получить утилита rosmsg.
💪 Посмотри, из каких подтипов состоит сообщение
geometry_msgs/Twist(geometry_msgs/Vector3). Найди информацию об этом типе в справке и вrosmsg.
А каким образом определить частоту передачи этого потока? Ведь в поток публикуется с каким-то периодом, мы же все знаем про дискретные системы. Попробуй разобраться самостоятельно:
💪 Определи команду у
rostopic, которая позволяет вывести частоту публикации в топик.
Вот так мы в общих чертах познакомились с узлами и топиками, но это были цветочки, а теперь будут ягодки!
Это всё хорошо, но погодите, нам каждый раз, когда хотим посмотреть как и куда направляется информация, надо по каждому топику и узлу выводить информацию?
Отличный вопрос, конечно же нет! Для этого сделана удобная утилита rqt_graph, которая показывает, как и через что связаны узлы, проверим:
rqt_graphИ видим:
Убедись,что настроено меню сверху вот так, иначе много лишних топиков показывается:
Сейчас у нас немного информации между узлами передается, но в сложных системах такие диаграммы позволяют найти ситуации очепяток и других проблем, которые не дают системе нормально работать.
Вот такой простой и удобный инструмент!
Мы уже увидели, что узел teleop передает информацию через топик /cmd_vel, даже посмотрели эти сообщения, определили тип, описание.
Да мы даже запускали уже сколько узлов, но пора разобраться раз и навсегда, как делается запуск узлов!
Итак, запуск в консоли делается командой rosrun с аргументами имя пакета и имя узла. Например, для запуска turtlebot3_teleop_key из пакета turtlebot3_teleop делается командой:
rosrun turtlebot3_teleop turtlebot3_teleop_keyАналогично, запуск из launch той же команды делается определением:
<node pkg="turtlebot3_teleop" type="turtlebot3_teleop_key" name="turtlebot3_teleop_keyboard">
</node>Ещё раз разберём семантику атрибутов тэга <node>:
pkg- название пакета, из которого запускаем,type- название узла, который в пакете надо запустить,name- как узел будет называться в системе,args- аргументы узла (здесь не представлены).
Отлично, как запускать какие-то узлы мы узнали, но давай подумаем с практической точки зрения. Если у сообщений через топики есть конкретный тип, а значит и формат, то мы можем использовать любой узел, который сможет публиковать сообщения с тем же типом в топик.
В таком случае мы можем заменить узел управления на другой, более удобный.
Посмотрим на этот узел телеуправления.
Попробуем установить его через apt:
sudo apt install ros-noetic-teleop-twist-keyboardА теперь отключим наш исходный узел телеуправления и запустим новый!
rosrun teleop_twist_keyboard teleop_twist_keyboard.pyИ, поехали! Обрати внимание, кнопки для управления другие.
Отлично, мы опробовали запуск через rosrun, а теперь попробуем сделать запуск с указанием предельных значений через launch. Создадим файл turtlebot3_teleop_new.launch и в нём пропишем запуск нового узла с параметризацией, как задано на странице GitHub:
<launch>
<node pkg="teleop_twist_keyboard" type="teleop_twist_keyboard.py" name="turtlebot3_teleop_keyboard" output="screen">
<param name="speed" value="0.4" />
<param name="turn" value="0.7" />
</node>
</launch>Про параметры узла мы ещё не говорили, но уже сейчас хочется настроить управление для более удобного контроля робота. Поэтому, настраивай конфигурацию под себя и поехали дальше!
Последнее, что нам нужно узнать сегодня про узлы - это из маааленькая специфика работы. Зовётся эта маленькая, но очень важная специфика - мастер.
Закрой все узлы и попробуй запустить новый узел управления:
rosrun teleop_twist_keyboard teleop_twist_keyboard.pyИли rviz, или rosnode list.
Все они говорят о следующих ошибках:
Unable to register with master node [http://localhost:11311]: master may not be running yet.ERROR: Unable to communicate with master!Could not contact ROS master at [http://localhost:11311], retrying...
Все сообщают о том, что мастер не запущен! Да кто же этот ваш мастер?
Всё просто, посмотри на эту схему:
В части топиков и узлов, мастер выступает как хранитель информации. Когда узел публикует информацию, он сообщает, какой тип сообщений топика и как зовется топик для публикации мастеру. Аналогично при подписке узел запрашивает у мастера информацию по топику, есть ли топик с таким именем, какой у него тип (проверяет соответсвие) и т.д.
Вот так мастер стоит между подпиской и публикацией, чтобы организовать правильно все каналы связи!
Почему тогда всё работает, если сначала запустить launch через roslaunch? Roslaunch - это хитрая утилита, которая запускает мастера, если он ещё не запущен. Вот так, без каких-либо вопрсов =)
Можно ещё в логе старта увидеть строку "auto-starting new master"
А что же делать, если надо запустить один только узел без roslaunch? Тут тоже всё просто, надо сначала запустить roscore! Попробуй сначала стартануть roscore, а потом запускать узлы, что запускали ранее! Видишь, всё работает!
! Итого, мастер существует, пока запущен
roscoreили пока работает первыйroslaunch, который его запускает.
- Получилось запустить новый узел телеуправления
- Освоен новый инструмент визуализации
rqt_graph
- Что такое rosmaster? Зачем он нужен? Почему без него не стартуют узлы?
- Почему при запуске launch не нужно стартовать roscore?
- Какая команда
rostopicотвечает за определение частоты публикации в топик?






