Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Положение робота

Что вы узнаете в этом разделе:

  • Что такое одометрия и зачем она нужна
  • Какие датчики используются для определения положения робота
  • Структуру сообщения nav_msgs/msg/Odometry
  • Как получить данные о текущем положении и ориентации робота
  • Как интерпретировать данные одометрии из топика /odom

Оценка положения робота (в английской литературе — Localization) — это одна из ключевых проблем в робототехнике. Существует несколько методов, которые можно разделить на две большие группы: методы, основанные на относительных измерениях (одометрия), и методы, основанные на абсолютных измерениях (например система GPS).

Одометрия

Одометрия робота — это процесс оценки изменения положения робота во времени относительно некоторой начальной точки. По сути, это ответ на вопросы: "Где я нахожусь?", "Куда и как далеко я переместился?" и "Куда я повернут?".

Робот делает это, непрерывно отслеживая и интегрируя (суммируя) данные о своем движении. Основной источник этих данных — датчики движения:

  • Энкодеры на колесах: измеряют, скорость каждого колеса.
  • IMU (инерциальный измерительный модуль) : содержит гироскоп (для измерения угловой скорости поворота) и акселерометр (для измерения ускорения). Также некоторые модули содержат магнитометр.

Собрав данные, например, о том, что "левое колесо повернулось на 10 оборотов, а правое на 9.5 оборотов", робот с помощью математической модели вычисляет, что он:

  1. Проехал примерно 3 метра.
  2. Повернул направо на 15 градусов.
  3. И теперь находится в новой точке с новыми координатами (X, Y, Θ).

Важный нюанс: Одометрия — это именно оценка положения, а не его точное измерение. Она подвержена накоплению ошибок, особенно при поворотах робота.

Системная плата робота turtlebro, имеет необходимую программу для расчета положение робота. Данные о положении робота публикуются в топик /odom. Формируются они на основе энкодеров, установленных на моторах, и IMU датчика, расположенного в центре робота под лидаром.

Давайте посмотрим на это данные. Сначала определим тип этого сообщения:

ros2 topic info /odom
===

Type: nav_msgs/msg/Odometry
Publisher count: 1
Subscription count: 0

Сообщение nav_msgs/msg/Odometry

Для данных одометрии в ROS существует стандартное сообщение. Большинство роботов использует именно этот тип сообщений, что позволяет унифицировать подходы по работе с данными между роботами разных производителей.

Мы видим, что тип сообщения nav_msgs/msg/Odometry. Посмотрим на его структуру:

ros2 interface show nav_msgs/msg/Odometry
====

# Includes the frame id of the pose parent.
std_msgs/Header header
	builtin_interfaces/Time stamp
		int32 sec
		uint32 nanosec
	string frame_id

# Frame id the pose points to. The twist is in this coordinate frame.
string child_frame_id

# Estimated pose that is typically relative to a fixed world frame.
geometry_msgs/PoseWithCovariance pose
	Pose pose
		Point position
			float64 x
			float64 y
			float64 z
		Quaternion orientation
			float64 x 0
			float64 y 0
			float64 z 0
			float64 w 1
	float64[36] covariance

# Estimated linear and angular velocity relative to child_frame_id.
geometry_msgs/TwistWithCovariance twist
	Twist twist
		Vector3  linear
			float64 x
			float64 y
			float64 z
		Vector3  angular
			float64 x
			float64 y
			float64 z
	float64[36] covariance

Довольно серьезный набор данных:

  1. Блок std_msgs/Header header содержит стандартный набор параметров, который очень часто используется в системных сообщениях, который содержит время создания сообщения и объект, относительно которого создано сообщение;

  2. Блок geometry_msgs/PoseWithCovariance pose содержит данные о положении робота в пространстве. Сообщение содержит данные: geometry_msgs/Point position; geometry_msgs/Quaternion orientation; covariance

  • position это переменные расположения робота в осях XYZ, где Z это высота;
  • orientation — для определения ориентации (углов) объектов в трехмерном пространстве в робототехнике используется система кватернионов. Далее мы приведем примеры, как эти комплексные значения можно перевести в более привычные углы Эйлера;
  1. Блок geometry_msgs/TwistWithCovariance twist содержит текущую линейную и угловую скорость.

Получение данных Одометрии

Выполним команду получения данных из топика

ros2 topic echo /odom

С полученными данными работать не очень удобно, мы не видим "основных" данных, а видим только "хвост" сообщения с данными ковариации. Добавим параметр --flow-style или --no-arr чтобы сократить вывод.

ros2 topic echo /odom --no-arr
===
---
header:
  stamp:
    sec: 1756898569
    nanosec: 769793908
  frame_id: odom
child_frame_id: base_footprint
pose:
  pose:
    position:
      x: 0.0
      y: 0.0
      z: 0.0
    orientation:
      x: 0.0
      y: -0.0
      z: -0.28215259313583374
      w: -0.9593695402145386
  covariance: '<array type: double[36]>'
twist:
  twist:
    linear:
      x: 0.0
      y: 0.0
      z: 0.0
    angular:
      x: 0.002222222276031971
      y: 0.0
      z: 0.0
  covariance: '<array type: double[36]>'

Из сообщения видно, что положение текущее положение робота

pose:
  pose:
    position:
      x: 0.0
      y: 0.0
      z: 0.0

А ориентация робота

pose:
  pose:
    orientation:
      x: 0.0
      y: -0.0
      z: -0.28215259313583374
      w: -0.9593695402145386

Пока мы не можем управлять колесами, но мы можем взять робота в руки и покрутить. Данные о его ориентации будут меняться.