Данные о положении робота
При движения робота, основываясь на данных о скорости вращения колес, и IMU датчика, робот с некоторым приближением может рассчитать свое положение. В робототехнике расчет положения робота по угловым скоростям вращения колес, называется Одометрия.
Системная плата робота, рассчитывает положение робота, и публикует данные в топик /odom. Линейные значения пройденного расстояния рассчитываются на основе данных о скорости вращения колес, а угловые - на основе датчикаIMU.
Давайте посмотрим на это данные. Сначала определим тип этого сообщения:
rostopic info /odom
Type: nav_msgs/Odometry
Publishers:
* /stm_serial_node (http://192.168.0.145:45869/)
Subscribers: None
Мы видим, что тип сообщения nav_msgs/Odometry. Посмотрим на его структуру:
rosmsg show nav_msgs/Odometry
std_msgs/Header header
uint32 seq
time stamp
string frame_id
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/Pose pose
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
float64[36] covariance
geometry_msgs/TwistWithCovariance twist
geometry_msgs/Twist twist
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/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;covariancepositionэто переменные расположения робота в осях XYZ, где Z это высота;orientationДля определения ориентации (углов) объектов в трехмерном пространстве, в робототехнике использует систему кватеринионов. Далее мы приведем примеры, как эти комплексные значения можно перевести в более привычные углы Эйлера;
3. Блок geometry_msgs/TwistWithCovariance twist содержит текущую скорость линейную и угловую.
Давайте для эксперимента заставим робота двигаться по кругу (задание предыдущего урока) и посмотрим как меняются данные одометрии.
Сначала запустим программу, которая заставит робота двигаться по окружности.
python3 lesson3/cmd_vel1_publisher.py
Во втором терминале посмотрим данные о перемещении робота:
rostopic echo /odom
header:
seq: 43
stamp:
secs: 1542200780
nsecs: 909679937
frame_id: "odom"
child_frame_id: "base_footprint"
pose:
pose:
position:
x: -0.000347826076904
y: 0.0
z: 0.0
orientation:
x: 0.0
y: 0.0
z: -0.00277777435258
w: 0.999996125698
covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
twist:
twist:
linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
Мы увидим изменения положения робота, его координат и углов.