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 Wiki,rospy.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)。请注意,您还必须手动调用正确的关闭例程以确保正确清理。
我已经写了一些代码让 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 Wiki,rospy.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)。请注意,您还必须手动调用正确的关闭例程以确保正确清理。