ROS 中的持续时间计算和控制 - 此外,为什么这个脚本在按下 Ctrl-C 后仍保持 运行?

Duration calculation and control in ROS - furthermore why does this script keep running even after pressing Ctrl-C?

我已经写了一些代码让 turtlebot 转身。该代码正在运行。我想知道的是 turtlebot 有多快 运行 以及我如何控制它。例如,如何确保小乌龟在一分钟内转动 5 度? 问题的最后一部分。按 Ctrl-C 后,turtlebot 停止,但脚本保持 运行。为什么?我该如何阻止它?

this post 没有什么帮助。

经历了 this post 。这是否意味着下面的 while 循环每秒运行 5 次而不管值如何我放入 for 循环?或者这是否意味着 ROS 尽最大努力确保循环每秒运行 5 次以达到我机器的最佳能力? 非常感谢。

# 5 HZ
angle = 5
r = rospy.Rate(5);
while not rospy.is_shutdown():
    # code to turn
    for x in range(0,100):
        rospy.loginfo("turn")
        turn_cmd.angular.z = radians(angle) 
        new_angle = (angle + new_angle) % 360
        self.cmd_vel.publish(turn_cmd)
        r.sleep()
     # code to pause  
    for x in range(0,100):
        rospy.loginfo("stop")
        turn_cmd.angular.z = radians(0)
        self.cmd_vel.publish(turn_cmd)

        r.sleep()

def shutdown(self):
    # stop turtlebot
    rospy.loginfo("Stop turning")
    self.cmd_vel.publish(Twist())
    rospy.sleep(1)

根据ROS Wikirospy.Rate便利class通过考虑循环的执行时间,尽最大努力将循环运行维持在指定的频率自上次成功以来 r.sleep()。这意味着在您的情况下:只要循环内的代码执行时间不超过 1/5 秒,rospy.Rate 将确保循环以 5Hz 运行。

关于按Ctrl-C时脚本不停止的问题: 使用 rospy 时,KeyboardInterrupt 的处理方式与普通 Python 脚本的处理方式不同。 rospy 捕获 KeyboardInterrupt 信号以将 rospy.is_shutdown() 标志设置为真。此标志仅在每个循环结束时检查,因此如果在 for-loop 执行期间按 Ctrl-C,则脚本无法停止,因为不会立即检查标志。

发出节点关闭信号的手动方法是使用 rospy.signal_shutdown()。为此,在初始化 ROS 节点时需要将 disable_signals 选项设置为 true(参见第 2.3 节 here)。请注意,您还必须手动调用正确的关闭例程以确保正确清理。