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':