我创建了一个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
答案 0 :(得分:1)
这样做的好方法是使用rospy.on_shutdown()
。
基本上,实现后,一旦请求节点关闭(如Ctrl + C按下),将调用此函数。在您的情况下,您可以关闭此功能内部的连接,并在完全关闭之前处理您需要的任何内容(最终像reactor.close()
)。
以下是here:
的示例def myhook():
print "shutdown time!"
rospy.on_shutdown(myhook)
答案 1 :(得分: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)