Как иметь fig.canvas.draw () в функции обратного вызова ROS? - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь сделать визуализацию сообщения в ros, но я не могу добавить fig.canvas.draw () в обратный вызов.Моей целью был постоянно обновляемый график.Но каждый раз, когда я пытаюсь это сделать, я получаю сообщение об ошибке «основной поток не в основном цикле».Как мне это решить?

#! /usr/bin/env python
import rospy
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random



from sensor_msgs.msg import LaserScan

x = np.linspace(0, 2* np.pi, 100)
y=np.random.random_integers(1, 100, 100)

plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)
line1, = ax.plot(x, y, 'b-')

def callback(scan):
    distance_list = scan.ranges
    print(distance_list)
    print("scan angle min", scan.angle_min)
    print("scan angle incr", scan.angle_increment)
    print("scan angle max", scan.angle_max)
    line1.set_ydata(distance_list)
    fig.canvas.draw()

rospy.init_node('lidar_visual_node')
sub = rospy.Subscriber('\scan', LaserScan, callback)

rospy.spin()

1 Ответ

0 голосов
/ 06 декабря 2018

Проблема здесь в том, что обратный вызов выполняется в отдельном потоке и не имеет доступа к fig в основном потоке.Объект, содержащий обратный вызов и требуемые переменные, может решить эту проблему, введя постоянство.

class Visualiser:
 def __init__(self):
    x = np.linspace(0, 2* np.pi, 100)
    y = np.random.random_integers(1, 100, 100)
    plt.ion()
    self.fig = plt.figure()
    ax = self.fig.add_subplot(111)
    self.line1, = ax.plot(x, y, 'b-')

 def scanner_callback(self, scan):
    distance_list = scan.ranges
    print(distance_list)
    print("scan angle min", scan.angle_min)
    print("scan angle incr", scan.angle_increment)
    print("scan angle max", scan.angle_max)
    self.line1.set_ydata(distance_list)
    self.fig.canvas.draw()


rospy.init_node('lidar_visual_node')
vis = Visualiser()
sub = rospy.Subscriber('\scan', LaserScan, vis.scanner_callback)
rospy.spin()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...