7.3.1 Пример твист-сообщений

Предположим, мы хотим, чтобы робот двигался прямо со скоростью 0,1 метра в секунду. Это должно потребовать двустороннего сообщения с линейными значениями x = 0,1, y = 0 и z = 0, а угловые значения x = 0, y = 0 и z = 0. Если вы укажете это сообщение в командной строке, часть сообщения будет иметь вид:

'{linear: {x: 0.1, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}'

Обратите внимание на то, как мы разграничиваем под-сообщения с помощью фигурных скобок и отделяем имена компонентов от их значений двоеточием и пробелом (пробел необходим!) Хотя это может показаться много печатанием, таким способом мы редко будем управлять роботом. Как мы увидим позже, сообщения Twist будут отправляться роботу с использованием других узлов ROS.

Чтобы повернуть против часовой стрелки с угловой скоростью 1,0 радиан в секунду, требуемое сообщение Твист будет:

'{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 1.0}}'

Если бы мы объединили эти два сообщения, робот двинулся бы вперед, повернувшись влево. TheresultingTwistmessagewouldbe:

'{linear: {x: 0.1, y: 0, z: 0}, angular: {x: 0, y: 0, z: 1.0}}'

Чем больше угловое значение z по сравнению с линейным значением x, тем сильнее поворот.

7.3.2 Мониторинг движения робота с помощью RViz

Мы будем использовать RViz для визуализации движения робота, когда будем пробовать различные команды Twist и сценарии управления движением. Вспомните из Руководства пользователя RViz, что мы можем использовать тип отображения одометрии, чтобы отслеживать позу (положение и ориентацию) робота в различных точках его пути. Каждая поза робота обозначена большой стрелкой, указывающей в направлении, в котором робот находился в этой точке. Обратите внимание, что эти позы отражают то, что сообщается одометрией робота, которая может отличаться - иногда существенно - от того, как робот позиционируется в реальном мире. Однако, если робот хорошо откалиброван и работает на относительно твердой поверхности, данные одометрии обычно достаточно хороши, чтобы получить приблизительное представление о том, как работает робот. Кроме того, при запуске искусственного робота в симуляторе ArbotiX, где нет физики, соответствие будет точным.

Давайте попробуем пару примеров с использованием симулятора ArbotiX. Сначала запустите поддельный TurtleBot с помощью команды:

$ roslaunch rbx1_bringup fake_turtlebot.launch

В другом терминале вызовите RViz с уже включенным файлом конфигурации с дисплеем Одометрия:

$ rosrun rviz rviz -d `rospack find rbx1_nav`/sim.rviz

Наконец, откройте еще одно окно терминала и установите робота, движущегося по кругу по часовой стрелке, опубликовав следующее сообщение Twist:

$ rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.1, y: 0, z: 0}, angular: {x: 0, y: 0, z: -0.5}}'

Мы используем параметр -r для постоянной публикации сообщений об ошибке на частоте 10 Гц. Некоторые роботы, такие как TurtleBot, требуют, чтобы команда движения постоянно публиковалась, иначе робот остановится: хорошая функция безопасности. Хотя этот параметр не является обязательным при запуске симулятора ArbotiX, он также не повредит.

Если все работает нормально, результат в RViz должен выглядеть примерно так:

Обратите внимание, что мы установили в поле Keep значение 100 для отображения одометрии, которое указывает, что мы хотим отображать до 100 последних стрелок, прежде чем самая старая из них выпадет. Допуск положения (в метрах) и допуск угла (в радианах) позволяют вам контролировать частоту отображения новой стрелки.

Чтобы убрать стрелки в любой точке, либо нажмите кнопку «Сброс», либо снимите флажок рядом с дисплеем «Одометрия», а затем снова проверьте его. Чтобы полностью отключить стрелки, не устанавливайте флажок.

Чтобы остановить вращение робота, введите Ctrl-C в том же окне терминала, а затем опубликуйте пустое сообщение Twist:

$ rostopic pub -1 /cmd_vel geometry_msgs/Twist '{}'

Теперь давайте попробуем второй пример. Сначала очистите стрелки одометрии, нажав кнопку «Сброс» в RViz. Следующая пара команд (разделенных точкой с запятой) будет сначала двигать робота прямо в течение примерно 3 секунд (опция «-1» означает «опубликовать один раз»), а затем продолжать бесконечно по кругу против часовой стрелки:

$ rostopic pub -1 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}'; rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'

Чтобы остановить робота, введите Ctrl-C в том же окне терминала и опубликуйте пустое сообщение Twist:

$ rostopic pub -1 /cmd_vel geometry_msgs/Twist '{}'

Прежде чем мы попробуем несколько сообщений Twist на реальном роботе, нам нужно обговорить некоторые моменты, говорящие о калибровке.

Last updated