1

I am using rospy to get data of my robot's position and plot this in real time.

This is what I have:

 self.plot_pose()

 def plot_pose(self):
     plt.plot(self.pose[0], self.pose[1], 'o', color='green')
     plt.plot([self.pose[0], self.pose[0] - 0.5*np.cos(self.pose[2])],
              [self.pose[1], self.pose[1] + 0.5*np.sin(self.pose[2])],
              'k-', color='red', lw=2)

     plt.show(block=False)
     plt.pause(0.0001)

Unfortunately this doesn't erase the plot but overlays everything. So I tried using

plt.clf()
plt.cla()

the first one gives me deprecation error and the second one gives me a blank plot for some reason. I am using python2.7 and rospy library.

Any suggestions on how to update the plot would be greatly appreciated.

1 Answer 1

1

This is the same as usual with animations. Try to avoid creating new plots every interation and instead update the old one.

self.point, = plt.plot([],[], 'o', color='green')
self.line, =  plt.plot([],[], ls="-", color='red', lw=2)
plt.show(block=False)
self.plot_pose()

def plot_pose(self):
    self.point.set_data(self.pose[0], self.pose[1])
    self.line.set_data([self.pose[0], self.pose[0] - 0.5*np.cos(self.pose[2])],
                       [self.pose[1], self.pose[1] + 0.5*np.sin(self.pose[2])])

    plt.pause(0.0001)

You may need to adjust the limits of the plot (plt.xlim(), plt.ylim()) if the points are outside of it.

Sign up to request clarification or add additional context in comments.

4 Comments

wow, this didn't work until I realized that there should be a comma after self.point, and self.line, and it worked. I do get a warning saying: MatplotlibDeprecationWarning: Using default event loop until function specific to this GUI is implemented warnings.warn(str, mplDeprecation). Some say I can use plt.draw() before plt.pause(0.0001) but didn't work. How do I avoid this warning?
The warning tells you what you are doing: You are using the event loop to plot. In this scenario you cannot avoid the warning. A more robust method would of course be to use FuncAnimation. There are enough quetions about that around, if you decide to use it.
FuncAnimation seems a bit complicated so I think I'm gonna stick with what I have. Thank you!
FuncAnimation is not complicated. It might even be more intuitive. This question has the two options compared. Or this one.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.