簡體   English   中英

ROS 中的持續時間計算和控制 - 此外,為什么即使在按下 Ctrl-C 后該腳本仍會繼續運行?

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

我寫了一些代碼來讓turtlebot轉身。 代碼正在運行。 我想知道的是turtlebot的運行速度以及我如何控制它。 比如如何保證turtlebot在一分鍾內轉5度? 問題的最后一部分。 按下 Ctrl-C 后,turtlebot 停止但腳本繼續運行。 為什么? 我該如何阻止呢?

這篇文章並沒有真正幫助。

瀏覽了這篇文章。這是否意味着下面的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()標志設置為 true。 該標志僅在每個循環結束時檢查,因此如果在 for 循環執行期間按 Ctrl-C,則無法停止腳本,因為不會立即檢查該標志。

手動發出節點關閉信號的方法是使用rospy.signal_shutdown() 為此,在初始化 ROS 節點時需要將disable_signals選項設置為 true(請參閱此處的第 2.3 節)。 請注意,您還必須手動調用正確的關閉例程以確保正確清理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM