4

我已经制作了一个 ROS 节点,它使用 python 的扭曲协议与客户端建立连接。该程序按预期工作,但是当我尝试使用 Ctrl+c 终止该程序时,它显示以下错误消息:

[server_send_command_ver3-4] 升级到 SIGTERM

我在下面包含了我的一部分代码:

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
4

2 回答 2

3

一个很好的方法是使用rospy.on_shutdown().

基本上,在实现时,一旦请求关闭节点(如 Ctrl + C 按下),就会调用此函数。在您的情况下,您可以在此函数中关闭您的连接并在完全关闭之前处理您需要的任何内容(最终类似reactor.close())。

这是取自此处的示例:

def myhook():
  print "shutdown time!"

rospy.on_shutdown(myhook)
于 2016-05-16T19:18:41.077 回答
1

rospy 已经实现了信号处理程序(http://wiki.ros.org/rospy/Overview/Initialization%20and%20Shutdown)并且应该可以很好地处理 ctrl+c (SIGINT)。

但是,您正在运行一个扭曲的实例,并且reactor.run()是一个阻塞调用。您发送的信号没有关闭扭曲的线程。由于程序没有做出任何反应,rospy 将 SIGINT 升级为 SIGTERM 以强制程序关闭。

为了能够优雅地关闭你的程序,你可以在 rospy 上实现一个钩子来关闭扭曲的实例(不确定这是否可行)

rospy.on_shutdown(reactor.stop)

或使用 python 信号库为 SIGINT 实现一个处理程序,优雅地关闭程序中的所有实例(https://docs.python.org/2/library/signal.html

于 2016-05-16T19:19:30.913 回答