Go to the documentation of this file.00001 import re
00002 from threading import Thread
00003 import rospy
00004 import rostopic
00005 from BAL.Handlers.keepAliveHandler import KeepAliveHandler
00006 from BAL.Header.Requests.PublishRequest import PublishRequest
00007 from BAL.Header.Requests.servoRequest import ServoRequest
00008 from BAL.Header.Response.ParamBuildResponse import SERVO
00009
00010 __author__ = 'tom1231'
00011 from rospy import Publisher, Subscriber
00012 from std_msgs.msg import Float32
00013 from BAL.Interfaces.Device import Device
00014
00015
00016 class RiCServo(Device):
00017
00018 def __init__(self, params, servoNum, output):
00019 Device.__init__(self, params.getServoName(servoNum), output)
00020 self._servoNum = servoNum
00021 self._pub = Publisher('%s/Position' % self._name, Float32, queue_size=params.getServoPublishHz(servoNum))
00022 Subscriber('%s/command' % self._name, Float32, self.servoCallBack)
00023
00024 self._haveRightToPublish = False
00025
00026 def publish(self, data):
00027 msg = Float32()
00028 msg.data = data
00029 self._pub.publish(msg)
00030
00031 def servoCallBack(self, recv):
00032 Thread(target=self.sendMsg, args=(recv,)).start()
00033
00034
00035 def getType(self): return SERVO
00036
00037 def sendMsg(self, recv):
00038 position = recv.data
00039 msg = ServoRequest(self._servoNum, position)
00040 self._output.write(msg.dataTosend())
00041
00042 def checkForSubscribers(self):
00043 try:
00044 subCheck = re.search('Subscribers:.*', rostopic.get_info_text(self._pub.name)).group(0).split(': ')[1]
00045
00046 if not self._haveRightToPublish and subCheck == '':
00047 self._output.write(PublishRequest(SERVO, self._servoNum, True).dataTosend())
00048 self._haveRightToPublish = True
00049
00050 elif self._haveRightToPublish and subCheck == 'None':
00051 self._output.write(PublishRequest(SERVO, self._servoNum, False).dataTosend())
00052 self._haveRightToPublish = False
00053 except: pass