Matplotlib показать только пустой график, как можно решить? - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь построить данные в реальном времени, поступающие из другого узла в ros, используя matplotlib, но всякий раз, когда я запускаю код, он показывает только пустые графики без вывода каких-либо данных на нем. в чем может быть проблема, пожалуйста?

Вот мой код:

import rospy
from datetime import datetime
from std_msgs.msg import Float64
from geometry_msgs.msg import Vector3
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
plt.show()

i = 0
xs = []
ys = []
time = []

#def callback0(msg):

def callback1(msg):
    global i
    time.append(i)
    xs.append(msg.x)
    ys.append(msg.y)

    #plot time vs xs
    ax.plot(time, xs)
    print(len(time), len(xs))
    ax.set_xlim(left= max(0, i-50), right= i+50)
    plt.draw()
    plt.pause(0.5) #graph keep updating each 1 sec
    i += 1


if __name__ == '__main__':

    rospy.init_node('subscriber' ,anonymous=True)
    #rospy.Subscriber('fchatter', Float64, callback0)
    rospy.Subscriber('vchatter', Vector3, callback1)
    rospy.spin()

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Спасибо всем.Я смог решить мою проблему, добавив "block = True" , как упомянуто здесь в этой ссылке Отображение данных ROS в реальном времени Python .

и вот моя организованная версия моего кода: `#! / Usr / bin / env python импорт rospy из datetime импорт datetime из std_msgs.msg import Float64 из geometry_msgs.msg import Vector3

import matplotlib
#matplotlib.use('Agg')
import matplotlib.pyplot as plt

plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)
#plt.show()
#plt.show(block=True)

xs, ys, time = [], [], []
i = 0

def plot():
    #global i
    print(len(xs),len(ys))
    ax.plot(time, xs, 'r')
    ax.set_xlim(left= max(0, i-50), right= i+50)
    plt.draw()

def callback(msg):
    global xs, ys, i
    xs.append(msg.x)
    ys.append(msg.y)
    time.append(i)
    i += 1
    plot()

def listener():
    rospy.init_node('subscriber' ,anonymous=True)
    rospy.Subscriber('vchatter', Vector3, callback)
    #rospy.spin()
    plt.show(block=True)


if __name__ == '__main__':
    listener()`
0 голосов
/ 02 июля 2019

Попробуйте этот код

import rospy
from datetime import datetime
from std_msgs.msg import Float64
from geometry_msgs.msg import Vector3
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)


i = 0
xs = []
ys = []
time = []

#def callback0(msg):

def callback1(msg):
    global i
    time.append(i)
    xs.append(msg.x)
    ys.append(msg.y)

#plot time vs xs
    ax.plot(time, xs)
    print(len(time), len(xs))
    ax.set_xlim(left= max(0, i-50), right= i+50)
    plt.draw()
    plt.pause(0.5) #graph keep updating each 1 sec
    i += 1
    plt.show()


if __name__ == '__main__':
    rospy.init_node('subscriber' ,anonymous=True)
    #rospy.Subscriber('fchatter', Float64, callback0)
    rospy.Subscriber('vchatter', Vector3, callback1)
    rospy.spin()
...