2016-04-30 4 views
3

nicht veröffentlichen Ich verwende ROS und Python und ich habe diesen Code geschrieben. Dieser Code soll ein ROS-Thema namens "map" (kommt von hector_slam mit LIDAR) abonnieren und in eine Variable namens "mapdata" speichern, die später verwendet wird. Ich möchte nur sicherstellen, dass es korrekt importiert wird, indem Sie es als ein anderes ROS-Thema namens "Mapprob" veröffentlichen. Der Code kompiliert und läuft gut, aber nichts ist in 'Mapprob' veröffentlicht. Ich habe sichergestellt, dass "map" "OccupancyGrid" Nachrichten veröffentlicht und wir wollen die OccupancyGrid.data extrahieren, um als 'mapdata' zu verwenden.Kann ein abonniertes Thema in Rospy

Jede Hilfe wird geschätzt.

Danke,

CDS

#!/usr/bin/env python 

import rospy 
import sys 
import time 
import os 
from nav_msgs.msg import OccupancyGrid 
from nav_msgs.msg import MapMetaData 
from std_msgs.msg import String 
from std_msgs.msg import Float64 
from std_msgs.msg import Int8MultiArray 

def callback(OccupancyGrid): 
# mapdata = Int8MultiArray() 
    mapdata.data = OccupancyGrid.data 

def talker(): 
    global mapdata 
    mapdata = Int8MultiArray() 
    pub = rospy.Publisher('mapprob', Int8MultiArray, queue_size=10) 
    rospy.init_node('talker', anonymous=True) 
    rospy.Subscriber("map", OccupancyGrid, callback) 
# mapdata.data = OccupancyGrid.data 
    rospy.loginfo(mapdata) 
    pub.publish(mapdata) 
    rospy.spin() 


if __name__ == '__main__': 
    try: 
     talker() 
    except rospy.ROSInterruptException: 
     pass 

Antwort

0

rospy.spin() wird nicht zurück, bis der Knoten Abschaltung wurde, entweder durch einen Anruf an ros :: shutdown() oder ein Ctrl- C. Dies bedeutet, dass Ihr pub.publish(mapdata) Befehl nie ausgeführt wird, sobald Sie drehen() erreicht ist.

gibt es eine C++ Lösung dafür, die Verwendung von ros::spinonce() usually in a while(ros::ok()) loop, und tun, was auch immer Sie wollen nach dem Erwerben der Nachricht. Leider für Python-Benutzer, the equivalent of spinonce() in python dosen't exist. so, entweder

  • Verwendung Fäden für die Spinnerei
  • Ihren Code zu C++ konvertieren (beste Alternative, da der Code nicht so schwer ist).
0

der Code unten scheint

#!/usr/bin/env python 

import rospy 
import sys 
import time 
import os 
from nav_msgs.msg import OccupancyGrid 
from nav_msgs.msg import MapMetaData 
from std_msgs.msg import String 
from std_msgs.msg import Float64 
from std_msgs.msg import Int8MultiArray 

def callback(OccupancyGrid): 
    mapdata.data = OccupancyGrid.data 
    pub = rospy.Publisher('mapprob', Int8MultiArray, queue_size=10) 
    pub.publish(mapdata) 



def somethingCool(): 
    global mapdata 
    mapdata = Int8MultiArray() 
    rospy.init_node('test_name', anonymous=False) 
    rospy.Subscriber("map", OccupancyGrid, callback) 
    rospy.loginfo(mapdata) 
    rospy.spin() 


if __name__ == '__main__': 
    try: 
     somethingCool() 
    except rospy.ROSInterruptException: 
     pass 
0

Das Problem ist Du mapdata als globale Variable deklariert, so dass jedes Mal, wenn Sie im Begriff sind, es zu veröffentlichen, um den Standardwert Initialisierung zurückgesetzt wird (dh mapdata = Int8MultiArray()) .

Sie können Ihren Knoten als Klasse definieren und haben mapdata als Instanzvariable, siehe dieses answer für ein Beispiel.

Ich hoffe, es hilft.

Verwandte Themen