7.3 Скручивание и поворот с помощью ROS
ROS использует тип сообщения Twist (см. Подробности ниже) для публикации команд движения, которые будут использоваться базовым контроллером. Хотя для темы можно использовать практически любое имя, обычно оно называется / cmd_vel, что сокращенно от «скорости команд». Узел базового контроллера подписывается на тему / cmd_vel и преобразует сообщения Twist в сигналы двигателя, которые фактически вращают колеса.
Чтобы увидеть компоненты сообщения Twist, выполните команду:
который даст следующий результат:
Как видите, сообщение Twist состоит из двух вложенных сообщений с типом Vector3, одно для компонентов линейной скорости x, y и z, а другое для компонентов угловой скорости x, y и z. Линейные скорости указаны в метрах в секунду, а угловые скорости - в радианах в секунду. (1 радиан равен приблизительно 57 градусам.)
Для робота с дифференциальным приводом, работающего в двухмерной плоскости (такой как пол), нам нужны только линейный компонент x и угловой компонент z. Это потому, что этот тип робота может двигаться только вперед / назад вдоль своей продольной оси и вращаться только вокруг своей вертикальной оси. Другими словами, линейные компоненты y и z всегда равны нулю (робот не может двигаться вбок или вертикально), а угловые компоненты x и y всегда равны нулю, поскольку робот не может вращаться вокруг этих осей. Всенаправленный робот также будет использовать линейный компонент y, в то время как летающий или подводный робот будет использовать все шесть компонентов.
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 с помощью команды:
В другом терминале вызовите RViz с уже включенным файлом конфигурации с дисплеем Одометрия:
Наконец, откройте еще одно окно терминала и установите робота, движущегося по кругу по часовой стрелке, опубликовав следующее сообщение Twist:
Мы используем параметр -r для постоянной публикации сообщений об ошибке на частоте 10 Гц. Некоторые роботы, такие как TurtleBot, требуют, чтобы команда движения постоянно публиковалась, иначе робот остановится: хорошая функция безопасности. Хотя этот параметр не является обязательным при запуске симулятора ArbotiX, он также не повредит.
Если все работает нормально, результат в RViz должен выглядеть примерно так:
Обратите внимание, что мы установили в поле Keep значение 100 для отображения одометрии, которое указывает, что мы хотим отображать до 100 последних стрелок, прежде чем самая старая из них выпадет. Допуск положения (в метрах) и допуск угла (в радианах) позволяют вам контролировать частоту отображения новой стрелки.
Чтобы убрать стрелки в любой точке, либо нажмите кнопку «Сброс», либо снимите флажок рядом с дисплеем «Одометрия», а затем снова проверьте его. Чтобы полностью отключить стрелки, не устанавливайте флажок.
Чтобы остановить вращение робота, введите Ctrl-C в том же окне терминала, а затем опубликуйте пустое сообщение Twist:
Теперь давайте попробуем второй пример. Сначала очистите стрелки одометрии, нажав кнопку «Сброс» в RViz. Следующая пара команд (разделенных точкой с запятой) будет сначала двигать робота прямо в течение примерно 3 секунд (опция «-1» означает «опубликовать один раз»), а затем продолжать бесконечно по кругу против часовой стрелки:
Чтобы остановить робота, введите Ctrl-C в том же окне терминала и опубликуйте пустое сообщение Twist:
Прежде чем мы попробуем несколько сообщений Twist на реальном роботе, нам нужно обговорить некоторые моменты, говорящие о калибровке.
Last updated
Was this helpful?