00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 import rospy
00036
00037 import naoqi
00038 from naoqi_bridge_msgs.msg import HeadTouch, Bumper
00039 from std_msgs.msg import Bool
00040 from naoqi_driver.naoqi_node import NaoqiNode
00041 from naoqi import ( ALModule, ALBroker, ALProxy )
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 class NaoTactile(ALModule):
00058 "Sends callbacks for tactile touch, bumper press and foot contact to ROS"
00059 def __init__(self, moduleName):
00060
00061 from optparse import OptionParser
00062
00063 parser = OptionParser()
00064 parser.add_option("--ip", dest="ip", default="",
00065 help="IP/hostname of broker. Default is system's default IP address.", metavar="IP")
00066 parser.add_option("--port", dest="port", default=0,
00067 help="IP/hostname of broker. Default is automatic port.", metavar="PORT")
00068 parser.add_option("--pip", dest="pip", default="127.0.0.1",
00069 help="IP/hostname of parent broker. Default is 127.0.0.1.", metavar="IP")
00070 parser.add_option("--pport", dest="pport", default=9559,
00071 help="port of parent broker. Default is 9559.", metavar="PORT")
00072
00073 (options, args) = parser.parse_args()
00074 self.ip = options.ip
00075 self.port = int(options.port)
00076 self.pip = options.pip
00077 self.pport = int(options.pport)
00078 self.moduleName = moduleName
00079
00080 self.init_almodule()
00081
00082
00083 rospy.init_node('nao_tactile')
00084
00085
00086 self.tactile = HeadTouch()
00087 self.bumper = Bumper()
00088 self.tactilePub = rospy.Publisher("tactile_touch", HeadTouch, queue_size=10)
00089 self.bumperPub = rospy.Publisher("bumper", Bumper, queue_size=10)
00090
00091 try:
00092 footContact = self.memProxy.getData("footContact", 0)
00093 except RuntimeError:
00094 footContact = None
00095
00096 if footContact is None:
00097 self.hasFootContactKey = False
00098 rospy.loginfo("Foot contact key is not present in ALMemory, will not publish to foot_contact topic.")
00099 else:
00100 self.hasFootContactKey = True
00101 self.footContactPub = rospy.Publisher("foot_contact", Bool, latch=True, queue_size=10)
00102 self.footContactPub.publish(footContact > 0.0)
00103
00104
00105
00106
00107 self.tactileTouchFrontButton = HeadTouch.buttonFront;
00108 self.tactileTouchMiddleButton = HeadTouch.buttonMiddle;
00109 self.tactileTouchRearButton = HeadTouch.buttonRear;
00110 self.bumperRightButton = Bumper.right;
00111 self.bumperLeftButton = Bumper.left;
00112
00113 self.subscribe()
00114
00115 rospy.loginfo("nao_tactile initialized")
00116
00117 def init_almodule(self):
00118
00119 rospy.loginfo("Connecting to NaoQi at %s:%d", self.pip, self.pport)
00120 try:
00121 self.broker = ALBroker("%sBroker" % self.moduleName, self.ip, self.port, self.pip, self.pport)
00122 except RuntimeError,e:
00123 print("Could not connect to NaoQi's main broker")
00124 exit(1)
00125 ALModule.__init__(self, self.moduleName)
00126
00127 self.memProxy = ALProxy("ALMemory",self.pip,self.pport)
00128
00129 if self.memProxy is None:
00130 rospy.logerror("Could not get a proxy to ALMemory on %s:%d", self.pip, self.pport)
00131 exit(1)
00132
00133
00134 def shutdown(self):
00135 self.unsubscribe()
00136
00137
00138
00139
00140
00141
00142
00143 def subscribe(self):
00144 self.memProxy.subscribeToEvent("FrontTactilTouched", self.moduleName, "onTactileChanged")
00145 self.memProxy.subscribeToEvent("MiddleTactilTouched", self.moduleName, "onTactileChanged")
00146 self.memProxy.subscribeToEvent("RearTactilTouched", self.moduleName, "onTactileChanged")
00147 self.memProxy.subscribeToEvent("RightBumperPressed", self.moduleName, "onBumperChanged")
00148 self.memProxy.subscribeToEvent("LeftBumperPressed", self.moduleName, "onBumperChanged")
00149 if self.hasFootContactKey:
00150 self.memProxy.subscribeToEvent("footContactChanged", self.moduleName, "onFootContactChanged")
00151
00152
00153 def unsubscribe(self):
00154 self.memProxy.unsubscribeToEvent("FrontTactilTouched", self.moduleName)
00155 self.memProxy.unsubscribeToEvent("MiddleTactilTouched", self.moduleName)
00156 self.memProxy.unsubscribeToEvent("RearTactilTouched", self.moduleName)
00157 self.memProxy.unsubscribeToEvent("RightBumperPressed", self.moduleName)
00158 self.memProxy.unsubscribeToEvent("LeftBumperPressed", self.moduleName)
00159 if self.hasFootContactKey:
00160 self.memProxy.unsubscribeToEvent("footContactChanged", self.moduleName)
00161
00162
00163 def onTactileChanged(self, strVarName, value, strMessage):
00164 "Called when tactile touch status changes in ALMemory"
00165 if strVarName == "FrontTactilTouched":
00166 self.tactile.button = self.tactileTouchFrontButton
00167 elif strVarName == "MiddleTactilTouched":
00168 self.tactile.button = self.tactileTouchMiddleButton
00169 elif strVarName == "RearTactilTouched":
00170 self.tactile.button = self.tactileTouchRearButton
00171
00172 self.tactile.state = int(value);
00173 self.tactilePub.publish(self.tactile)
00174 rospy.logdebug("tactile touched: name=%s, value=%d, message=%s.", strVarName, value, strMessage);
00175
00176 def onBumperChanged(self, strVarName, value, strMessage):
00177 "Called when bumper status changes in ALMemory"
00178 if strVarName == "RightBumperPressed":
00179 self.bumper.bumper = self.bumperRightButton
00180 elif strVarName == "LeftBumperPressed":
00181 self.bumper.bumper = self.bumperLeftButton
00182
00183 self.bumper.state = int(value);
00184 self.bumperPub.publish(self.bumper)
00185 rospy.logdebug("bumper pressed: name=%s, value=%d, message=%s.", strVarName, value, strMessage);
00186
00187 def onFootContactChanged(self, strVarName, value, strMessage):
00188 "Called when foot contact changes in ALMemory"
00189 self.footContactPub.publish(value > 0.0)
00190
00191 if __name__ == '__main__':
00192 ROSNaoTactileModule = NaoTactile("ROSNaoTactileModule")
00193
00194 rospy.spin()
00195
00196 rospy.loginfo("Stopping nao_tactile ...")
00197 ROSNaoTactileModule.shutdown();
00198 rospy.loginfo("nao_tactile stopped.")
00199 exit(0)