Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Use rospy subscriber and matplotlib FuncAnimation()

Hello,

I am trying to use a bicycle model with ROS. I used matplotlib animation, FuncAnimation(), to make a bicycle model and move a point given linear velocity and steering angle. Now I want to subscribe to a Twist message and move the point while using FuncAnimation().

I used to rospy.wait_for_message() and it is working. But, as soon as I stop publishing, the point is also stopping.

Please refer to the code.

#!/usr/bin/env python
import rospy
from geometry_msgs.msg import Twist
from matplotlib import pyplot as plt
import numpy as np
from matplotlib import animation
from math import *
rospy.init_node("plot",anonymous=True)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.axis('equal')
t=np.arange(0, 2*np.pi, 2*np.pi/100)
x=50*np.cos(t)
y=50*np.sin(t)
point, = ax.plot([0], [0], 'o')
Q = ax.quiver([0],[0],[0],[0], pivot='mid', color='r', width=0.005)

line, = ax.plot(x,y,color='k')
ax.set_xlim([-150, 150])
ax.set_ylim([-150, 150])

posx = 0
posy = 0
curSpeed = 5
angle =  0
turningspeed = 0
maxspeed = 2
acc = 0.5
dec = 0.1
L = 2.
steeringAngle = 10.
def update_point(n, point,Q):
    flag = 0
    global posx,posy,curSpeed,angle,turningspeed,maxspeed,acc,dec
    pos=rospy.wait_for_message("/cmd_vel",Twist)
    print "thetadot -- ",turningspeed
    print "v -- ",curSpeed
    curSpeed = pos.linear.x
    steeringAngle = pos.angular.z
    steeringAngler = (steeringAngle/180.)*pi
    turningspeed = (curSpeed/L)*tan(steeringAngler)
    angle+=turningspeed
    if(angle>2*pi):
        angle=0
    if(angle<0):
        angle=2*pi
    movex = curSpeed*cos(angle)
    movey = curSpeed*sin(angle)
    posx+=movex
    posy+=movey
    U = np.cos(angle)
    V = np.sin(angle)
    point.set_data(np.array([posx,posy]))
    Q.set_offsets(np.array([posx,posy]))
    Q.set_UVC(U,V)
    print curSpeed
    # point.set_3d_properties(z[n], 'z')
    return point,Q

ani=animation.FuncAnimation(fig, update_point, 100, fargs=(point,Q))

plt.show()

In this scenario how to use callback function that are passed to rospy.Subscriber() to set CurSpeed and angle in above code and run matplotlib animation.

Thanks