Положение робота
Что вы узнаете в этом разделе:
- Что такое одометрия и зачем она нужна
- Какие датчики используются для определения положения робота
- Структуру сообщения
nav_msgs/msg/Odometry - Как получить данные о текущем положении и ориентации робота
- Как интерпретировать данные одометрии из топика
/odom
Оценка положения робота (в английской литературе — Localization) — это одна из ключевых проблем в робототехнике. Существует несколько методов, которые можно разделить на две большие группы: методы, основанные на относительных измерениях (одометрия), и методы, основанные на абсолютных измерениях (например система GPS).
Одометрия
Одометрия робота — это процесс оценки изменения положения робота во времени относительно некоторой начальной точки. По сути, это ответ на вопросы: "Где я нахожусь?", "Куда и как далеко я переместился?" и "Куда я повернут?".
Робот делает это, непрерывно отслеживая и интегрируя (суммируя) данные о своем движении. Основной источник этих данных — датчики движения:
- Энкодеры на колесах: измеряют, скорость каждого колеса.
- IMU (инерциальный измерительный модуль) : содержит гироскоп (для измерения угловой скорости поворота) и акселерометр (для измерения ускорения). Также некоторые модули содержат магнитометр.
Собрав данные, например, о том, что "левое колесо повернулось на 10 оборотов, а правое на 9.5 оборотов", робот с помощью математической модели вычисляет, что он:
- Проехал примерно 3 метра.
- Повернул направо на 15 градусов.
- И теперь находится в новой точке с новыми координатами (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
Довольно серьезный набор данных:
-
Блок
std_msgs/Header headerсодержит стандартный набор параметров, который очень часто используется в системных сообщениях, который содержит время создания сообщения и объект, относительно которого создано сообщение; -
Блок
geometry_msgs/PoseWithCovariance poseсодержит данные о положении робота в пространстве. Сообщение содержит данные:geometry_msgs/Point position;geometry_msgs/Quaternion orientation;covariance
positionэто переменные расположения робота в осях XYZ, где Z это высота;orientation— для определения ориентации (углов) объектов в трехмерном пространстве в робототехнике используется система кватернионов. Далее мы приведем примеры, как эти комплексные значения можно перевести в более привычные углы Эйлера;
- Блок
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
Пока мы не можем управлять колесами, но мы можем взять робота в руки и покрутить. Данные о его ориентации будут меняться.