[英]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 Wiki , rospy.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.