ROS中的持续时间计算和控制此外,为什么即使按下CtrlC,该脚本仍保持运行?

2024-04-25 16:32:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经写了一些代码来让turtlebot掉头。代码正在运行。我想知道的是turtlebot跑得有多快以及我如何控制它。例如,我如何确保turtlebot在一分钟内旋转5度? 问题的最后部分。按下Ctrl-C后,turtlebot停止,但脚本仍在运行。为什么?我怎样才能阻止它

this post没有真正的帮助

通过了this post。这是否意味着下面的while循环每秒运行5次,而不管我在中为循环输入的值是多少?或者,这是否意味着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)

Tags: 代码selfcmdsleepthispostpublishturn
1条回答
网友
1楼 · 发布于 2024-04-25 16:32:21

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

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

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

相关问题 更多 >