Red de conocimiento informático - Material del sitio web - Cómo utilizar la odometría de Python en ros

Cómo utilizar la odometría de Python en ros

Tipo de información:

1. Torsión - velocidad angular lineal

Comúnmente usado para enviar al tema /cmd_vel, el nodo controlador básico escuchará este tema. para controlar el movimiento del robot

geometry_msgs/Twist

geometry_msgs/Vector3 lineal

float64 x

float64y

float64 msgs/ Vector3 lineal

float64 x

float64 y

float64 z

geometry_msgs/Vector3 angular

float64 x

float64 y

float64 z

linear.x apunta al frente del robot, linear.y apunta al lado izquierdo del robot, y linear.z apunta verticalmente hacia arriba para satisfacer el De acuerdo con los requisitos del sistema de rotación, linear.y y linear.z del robot móvil plano suelen ser 0

angular.z representa la velocidad angular de el robot plano, porque el eje z es el eje de rotación en este momento

Ejemplo:

#! /usr/bin/env python'''Autor: xushangnjlh en gmail dot com

Fecha: 22/05/2017

@package forward_and_back''import rospyfrom geometría_msgs.msg import Twistfrom math import piclass ForwardAndBack(): def __init__(self):

rospy.init_node('forward_and_back', anónimo=False)

rospy.on_shutdown(self.shutdown) # Esto El nodo "forward_and_back" publicará mensajes de tipo Twist en el tema /cmd_vel

#, donde este nodo actúa como un editor.

Este nodo es como un editor

self.cmd_vel = rospy.Publisher('/cmd_vel', Twist, queue_size=5)

# parámetros

rate = 50

r = rospy.Rate(rate)

velocidad_lineal = 0.2

distancia_meta = 5

duración_lineal = distancia_meta/velocidad_lineal

velocidad_angular = 1.0

objetivo_angular = pi

duración_angular = objetivo_angular/velocidad_angular

# adelante-gt; rotar-gt; rotar

for i in range(2):?# Esta es la variante de mensajes, con tipo Twist, sin datos ahora

move_cmd = Twist()

move_cmd.linear.x = velocidad_lineal #

#Debería continuar publicándose

ticks = int(linear_duration*rate) * for t in range(ticks):?publish(move_cmd)

rospy.sleep(1)

move_cmd.angular_speed.z = velocidad_angular

ticks = int(angular_duration*rate) ?for t in range(ticks) :

self.cmd_vel.publish( move_cmd)

r.sleep()

self.cmd_vel.publish(Twist())

rospy.sleep(1)

def apagado(self):

rospy.loginfo(" Deteniendo el robot")

self.cmd_vel.publish (Twist())

rospy.sleep(1)

if __name__=='__main__': ?intenta:

ForwardAndBack() ?excepto:

rospy.loginfo("nodo forward_and_back terminado debido a una excepción")

2. nav_msgs/Odometry - medición del rumbo (covarianza respectiva de posición, velocidad lineal y velocidad angular)

En general, los mensajes Twist publicados en el tema /cmd_vel y escuchados por el robot (por ejemplo, /base_controller n, nodo controlador base) no se pueden convertir con precisión en rutas de movimiento reales del robot porque los errores provienen de errores internos del sensor del robot ( codificador), precisión de la calibración y efectos ambientales (si el suelo es resbaladizo o plano, por lo tanto, podemos usar el tema /cmd_vel como ejemplo); (ya sea que el terreno sea liso o no), por lo tanto, podemos usar la clase de tipo de información Odometría más precisa para obtener la posición del robot (transformación tf de /odom a /base_link).

En el caso de una calibración precisa, el error entre este tipo de información y la posición real del robot es aproximadamente 1 (aunque el error que se muestra en rviz sigue siendo grande).

También incluye

Información del sistema de referencia. Odometry utiliza /odom como ID del marco principal y /base_link como ID del marco secundario, es decir, el sistema de referencia mundial es /odom (normalmente). set es la pose inicial y es fija), el sistema de referencia del movimiento es /base_link (aquí).

(Aún no está claro, lo agregaré más adelante)

Marca de tiempo, para que no solo puedas conocer la trayectoria, sino también el punto de tiempo correspondiente

, y el correspondiente Punto de tiempo

Encabezado

cadena child_frame_id

geometry_msgs/PoseWithCovariance pose

geometry_msgs/TwistWithCovariance twist

# extensión encabezado

uint32seq

marca de tiempo

cadena frame_id

cadena child_frame_id

geometry_msgs/PoseWithCovariance pose

geometry_msgs/Pose pose

geometry_msgs/Posición del punto

float64 x

float64 y

float64z

geometry_msgs/Orientación del cuaternión

float64 x

float64 y

float64 z

float64 w

float64[36] covarianza

geometry_msgs/TwistWithCovariance twist

geometry_msgs/Twisttwist

geometry_msgs/Vector3 lineal

float64 x

float64 y

float64 z

geometry_msgs/Vector3 angular

float64 x

float64 y

p >

float64 z

covarianza float64[36]

Ejemplo:

La ruta de movimiento y la posición del bit se obtienen a través de la odometría interna, que se obtiene a través de la conversión del sistema de coordenadas Monitor tf (/odom y /base_link) #! /usr/bin/env python'''Autor: xushangnjlh en gmail punto com

Fecha: 23/05/2017

@package odometry_forward_and_back'''importar rospyfrom geometría_msgs.msg importar Twist, Point, Quaternionimport tffrom rbx1_nav.tranform_utils import quat_too_angle, normalize_anglefrom math import pi, radianes, copysign, sqrt, powclass Odometry_forward_and_back: ?def __init__(self):

rospy.ini_node('odometry_forward_and_back', anónimo = Falso)

rospy.on_sh

utdown(self.shutdown)

?

self.cmd_vel = rospy.Publisher('/cmd_vel', Twist, queue_size=5)

?

tasa = 20

r = rospy.Rate(tasa)

velocidad_lineal = 0,2

distancia_objetivo = 1,0

angular_speed = 1.0

goal_angle = pi

angular_tolerance = radians(2.5)

# Inicializa el oyente tf y dale algo de tiempo para llenar su buffer

p>

self.tf_listener = tf.TransformListener()