7.7 Мы Уже Там? Подойдя на расстояние с одометра
Когда мы просим нашего робота двигаться или вращаться с определенной скоростью, как мы узнаем, что он действительно выполняет то, что мы просили? Например, если мы опубликуем сообщение Twist для перемещения робота вперед со скоростью 0,2 м / с, как мы узнаем, что робот на самом деле не движется со скоростью 0,18 м / с? На самом деле, как мы узнаем, что оба колеса движутся с одинаковой скоростью?
Как мы объясняли ранее в этой главе, базовый узел контроллера робота использует одометрию и ПИД-управление, чтобы превратить запросы движения в реальные скорости. Точность и надежность этого процесса зависит от внутренних датчиков робота, точности процедуры калибровки и условий окружающей среды. (Например, некоторые поверхности могут позволить колесам слегка скользить, что может испортить отображение между счетчиками энкодера и пройденным расстоянием.)
Внутренняя одометрия робота может быть дополнена внешними измерениями положения и / или ориентации робота. Например, можно использовать настенные визуальные маркеры, такие как проверочные символы, вместе с пакетами ROS ar_pose, ar_kinect или ar_track_alvar, чтобы обеспечить довольно точную локализацию робота в комнате. Аналогичный метод использует сопоставление визуальных функций без необходимости использования искусственных маркеров (ccny_rgbd_tools, rgbdslam, RTABMap), а еще один пакет (laser_scan_matcher) использует сопоставление лазерного сканирования. Наружные роботы часто используют GPS для оценки положения в дополнение к другим формам одометрии.
Для целей этой книги мы будем использовать термин «одометрия» для обозначения данных о внутреннем положении. Однако, независимо от того, как измеряется одометрия, ROS предоставляет тип сообщения для хранения информации; а именно nav_msgs / Одометрия. Сокращенное определение типа сообщения Одометрия показано ниже:
Здесь мы видим, что сообщение Odometry состоит из заголовка, строки, идентифицирующей child_frame_id, и двух вложенных сообщений, одно для PoseWithCovariance и одно для TwistWithCovariance.
Чтобы увидеть расширенную версию определения, выполните команду:
который должен дать следующий результат:
Под-сообщение PoseWithCovariance записывает положение и ориентацию робота, в то время как компонент TwistWithCovariance дает нам линейную и угловую скорости, которые мы уже видели. И предложение, и его применение могут быть дополнены ковариационной матрицей, которая измеряет неопределенность в различных измерениях.
Заголовок и child_frame_id определяют системы отсчета, которые мы используем для измерения расстояний и углов. Он также предоставляет временную метку для каждого сообщения, поэтому мы знаем не только, где мы находимся, но и когда. По соглашению, измерения одометрии в ROS используют / odom в качестве идентификатора родительского кадра и / base_link (или / base_footprint) в качестве идентификатора дочернего кадра. В то время как фрейм / base_link соответствует реальной физической части робота, фрейм / odom определяется сдвигами и поворотами, инкапсулированными в данные одометрии. Эти преобразования перемещают робота относительно фрейма / odom. Если мы отобразим модель робота в RViz и установим фиксированную рамку в / odom, позиция робота будет отражать то, где робот «думает», относительно ее начальной позиции.
Last updated