2016-05-16 17 views
3

Ich habe einen ROS-Knoten gemacht, der eine Verbindung mit dem Client herstellt, indem er das verdrehte Protokoll von Python verwendet. Das Programm arbeitet wie erwartet, aber wenn ich versuche, das Programm mit Strg + c zu töten, zeigt es folgende Fehlermeldung:Wie kann man ein Python-Programm (das ROS und das verdrehte Protokoll enthält) sauber löschen, wenn Strg + c gedrückt wird?

[server_send_command_ver3-4] Eskalation SigTerm

ich einen Teil meines Codes enthalten sind, unter :

if __name__ == '__main__': 
    try: 
    #node initialization 
    rospy.init_node('listen', anonymous = True) 

    #publisher to publish message to clientconnection to display connection status on GUI 
    connect = rospy.Publisher("status", String, queue_size = 10) 
    connect.publish(" Lost Connection") 

    #twisted protocol and listen at port 80 
    factory = Factory() 
    factory.protocol = NewFactory 
    factory.clients = [] 
    reactor.listenTCP(80, factory) 
    reactor.run() 

    except rospy.ROSInterruptException: 
    pass 

Antwort

1

Eine gute Möglichkeit, das zu tun wäre rospy.on_shutdown().

Im Grunde wird diese Funktion aufgerufen, sobald der Knoten heruntergefahren wird (wie eine Strg + C drücken). In Ihrem Fall können Sie Ihre Verbindung innerhalb dieser Funktion schließen und alles handhaben, was Sie vor dem vollständigen Herunterfahren benötigen (eventuell so wie reactor.close()).

Hier ist ein Beispiel aus here genommen:

def myhook(): 
    print "shutdown time!" 

rospy.on_shutdown(myhook) 
1

Die rospy bereits implementiert einen Handler für Signale (http://wiki.ros.org/rospy/Overview/Initialization%20and%20Shutdown) und sollte die ctrl + c (SIGINT) ganz gut handhaben.

Sie führen jedoch eine verdrehte Instanz und die reactor.run() ist ein blockierender Aufruf. Das Signal, das Sie senden, schließt den verdrehten Thread nicht. Da vom Programm keine Reaktion erfolgt, eskaliert das Rospy das SIGINT zu einem SIGTERM, um das Schließen des Programms zu erzwingen.

Um in der Lage sein, das Programm zu schließen anmutig können Sie entweder einen Haken an rospy implementieren, um die verdrehte Instanz zu schließen (nicht sicher, ob das funktionieren wird)

rospy.on_shutdown(reactor.stop)

oder die Python-Signal-Bibliothek verwenden zu implementieren ein Handler für die SIGINT, die alle Instanzen in Ihrem Programm (https://docs.python.org/2/library/signal.html)

+0

die rospy Haken funktioniert ordnungsgemäß geschlossen, aber wenn Sie die() entfernen: 'rospy.on_shutdown (reactor.stop)' –

+0

@JaviV Ihnen danken. Bearbeitete die Antwort – GSalazar