1.rospyについてspin()は複数回callback 2を呼び出す.subscrib後の文とcallback関数の実行順序
4315 ワード
#!/usr/bin/env python
import rospy
from bzrobot_msgs.msg import bzr_WheelLinearVels
#from threading import Thread
from time import sleep
class RS232MotorComm():
def callback(self, data):
print '****************************************start callback'
self.flg=0 sleep(0.05)
rospy.loginfo("speed %f %f",data.leftWheelLinearVel, data.rightWheelLinearVel)
self.flg=1
def motor_listener(self):
self.flg=1
rospy.init_node('rs232_motor_comm', anonymous=True)
rospy.Subscriber("control_wheel_linear_vel", bzr_WheelLinearVels, self.callback)
#sleep(1)
r = rospy.Rate(10) # 10hz while self.flg==1:#not rospy.is_shutdown():#True: print'where' r.sleep() #time must enough for callback,or it will out while loop print'after sleep 1s'
if __name__ == '__main__':
motor_controller = RS232MotorComm()
print'the1'
motor_controller.motor_listener()
#rospy.spin()
print'end'
1.rospyについてspin()呼び出し複数回callback
プログラムがない場合rospy.spin()は、上の黄色い部分もない場合、1回のパブリケーションメッセージを購読するとcallbackが複数回呼び出されます.
2.サブスクリプションメッセージを受信すると、ballbackはr.sleep()時間間隔で呼び出されるので、callbackの実行時間はr.sleep()が提供する間隔時間を超えてはならない.例えばcallbackにsleep(1)を設定すると、r.sleep()が消費され、print'after sleep 1 s'が実行され、flg=0となるためwhileループが飛び出し、プログラムが終了する.
rospyの代わりにsleep()を直接使用する.Rateとr.sleep()も、可能です.
3.最良の使用:
while not rospy.is_shutdown(): #True: if self.flg==1: #encoder_list[0]='e':