ROS Resources: Documentation | Support | Discussion Forum | Service Status | Q&A

Why i cannot move the turtlebot using the odometry?

i was using the below code and i am not able to move the turtlebot3.What could be the reason?
#!/usr/bin/env python

import math
from math import sin, cos, pi

import rospy
import tf
from nav_msgs.msg import Odometry
from geometry_msgs.msg import Point, Pose, Quaternion, Twist, Vector3


odom_pub = rospy.Publisher(“odom”, Odometry, queue_size=50)
odom_broadcaster = tf.TransformBroadcaster()

x = 0.0
y = 0.0
th = 0.0

vx = 0.1
vy = -0.1
vth = 0.1

current_time =
last_time =

r = rospy.Rate(1.0)
while not rospy.is_shutdown():
current_time =

# compute odometry in a typical way given the velocities of the robot
dt = (current_time - last_time).to_sec()
delta_x = (vx * cos(th) - vy * sin(th)) * dt
delta_y = (vx * sin(th) + vy * cos(th)) * dt
delta_th = vth * dt

x += delta_x
y += delta_y
th += delta_th

# since all odometry is 6DOF we'll need a quaternion created from yaw
odom_quat = tf.transformations.quaternion_from_euler(0, 0, th)

# first, we'll publish the transform over tf
    (x, y, 0.),

# next, we'll publish the odometry message over ROS
odom = Odometry()
odom.header.stamp = current_time
odom.header.frame_id = "odom"

# set the position
odom.pose.pose = Pose(Point(x, y, 0.), Quaternion(*odom_quat))

# set the velocity
odom.child_frame_id = "base_link"
odom.twist.twist = Twist(Vector3(vx, vy, 0), Vector3(0, 0, vth))

# publish the message

last_time = current_time

Odometry is what reads from the motors. You want to “write” to them, so you want to publish to a topic that the motor driver uses as input. In many cases that is cmd_vel or some other topic of the geometry_msgs/Twist type:

cmd_vel_pub = rospy.Publisher(“cmd_vel”, Twist, queue_size=50)

(with some other changes accordingly).

By the way, questions like this are better asked on