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 p>
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 p>
float64[36] covarianza
geometry_msgs/TwistWithCovariance twist
geometry_msgs/Twisttwist
geometry_msgs/Vector3 lineal
float64 x p>
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)
? p>
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()