2017-09-06 3 views
1

Mon problème est le suivant. J'ai un script en Python qui est exécuté de sorte que le robot effectue différentes actions sans s'arrêter jusqu'à ce que l'exécution s'arrête, mais pour des raisons de sécurité (au cas où le robot deviendrait fou et voudrait nous tuer tous) j'ai besoin d'ajouter cette instruction en utilisant le capteur tactile de sa tête au cas où il est pressé. Je lis un peu sur le module ALTouch avec lequel le module TouchChanged() peut être généré, mais il agit sur tous les capteurs (y compris les mouvements) et pas seulement avec le capteur tactile sur la tête.Arrêter le script Python s'exécutant sur un robot nao touchant sa tête

Toute idée ou documentation connexe sera la bienvenue.

Here's une partie de mon code:

class SoundProcessingModule(object): 

    def __init__(self, app): 

     ttsProxy.say("Touch my head at any moment to stop me") 

     super(SoundProcessingModule, self).__init__() 
     app.start() 
     session = app.session 

     self.audio_service = session.service("ALAudioDevice") 
     self.isProcessingDone = False 
     self.nbOfFramesToProcess = 100 
     self.framesCount=0 
     self.micFront = [] 
     self.module_name = "SoundProcessingModule" 

    def startProcessing(self): 
     self.audio_service.setClientPreferences(self.module_name, 16000, 3, 0) 
     self.audio_service.subscribe(self.module_name) 

     while self.isProcessingDone == False: 
      time.sleep(1) 

     self.audio_service.unsubscribe(self.module_name) 

    def processRemote(self, nbOfChannels, nbOfSamplesByChannel, timeStamp, inputBuffer): 
     #ReadyToDance 
     postureProxy.goToPosture("StandInit", 0.5) 

     self.framesCount = self.framesCount + 1 
     if (self.framesCount <= self.nbOfFramesToProcess): 
      print(self.framesCount) 
      self.micFront=self.convertStr2SignedInt(inputBuffer) 
      rmsMicFront = self.calcRMSLevel(self.micFront) 
      print ("Nivel RMS del microfono frontal = " + str(rmsMicFront)) 
      rmsArray.insert(self.framesCount-1,rmsMicFront) 

      #-40 y -30 
      if promedio >= -40 and promedio <= -30 : 
       #Some dance moves  

      #-29 y -20 
      elif promedio >= -29 and promedio <= -20: 
       #Some dance moves 

      #-19 y -11 
      elif promedio >= -19 and promedio <= -11: 
       #Some dance moves 

     else : 
      self.isProcessingDone=True 
      #Plot RMS signal 
      plt.plot(rmsArray) 
      plt.ylabel('RMS') 
      plt.xlabel('Frames') 
      plt.text(np.argmin(rmsArray), np.min(rmsArray) - 0.1, u'Mínimo', fontsize=10, horizontalalignment='center', 
        verticalalignment='center') 
      plt.text(np.argmax(rmsArray), np.max(rmsArray) + 0.1, u'Máximo', fontsize=10, horizontalalignment='center', 
        verticalalignment='center') 
      print("") 
      print ("El promedio total del sonido es: " + str(np.mean(rmsArray))) 
      print("El maximo total del sonido es: " + str(np.max(rmsArray))) 
      print("El minimo total del sonido es: " + str(np.min(rmsArray))) 
      plt.show() 
      postureProxy.goToPosture("Sit", 1.0) 

    def calcRMSLevel(self,data) : 
     rms = 20 * np.log10(np.sqrt(np.sum(np.power(data,2)/len(data) ))) 
     return rms 

    def convertStr2SignedInt(self, data) : 
     signedData=[] 
     ind=0; 
     for i in range (0,len(data)/2) : 
      signedData.append(data[ind]+data[ind+1]*256) 
      ind=ind+2 

     for i in range (0,len(signedData)) : 
      if signedData[i]>=32768 : 
       signedData[i]=signedData[i]-65536 

     for i in range (0,len(signedData)) : 
      signedData[i]=signedData[i]/32768.0 

     return signedData 


def StiffnessOn(proxy): 
    # We use the "Body" name to signify the collection of all joints 
    pNames = "Body" 
    pStiffnessLists = 1.0 
    pTimeLists = 1.0 
    proxy.stiffnessInterpolation(pNames, pStiffnessLists, pTimeLists) 

if __name__ == "__main__": 
    parser = argparse.ArgumentParser() 
    #Es necesario estar al pendiente de la IP del robot para moficarla 
    parser.add_argument("--ip", type=str, default="nao.local", 
         help="Robot IP address. On robot or Local Naoqi: use '127.0.0.1'.") 
    parser.add_argument("--port", type=int, default=9559, 
         help="Naoqi port number") 

    args = parser.parse_args() 
     # Inicializamos proxys. 
    try: 
     proxy = ALProxy("ALMotion", "nao.local", 9559) 
    except Exception, e: 
     print "Could not create proxy to ALMotion" 
     print "Error was: ", e 

    try: 
     postureProxy = ALProxy("ALRobotPosture", "nao.local", 9559) 
    except Exception, e: 
     print "Could not create proxy to ALRobotPosture" 
     print "Error was: ", e 

    try: 
     ttsProxy = ALProxy("ALTextToSpeech" , "nao.local", 9559) 
    except Exception, e: 
     print "Could not create proxy to ALTextToSpeech" 
     print "Error was: ", e 

    try: 
     memory = ALProxy("ALMemory" , "nao.local", 9559) 
    except Exception, e: 
     print "Could not create proxy to ALMemory" 
     print "Error was: ", e 

    try: 
     connection_url = "tcp://" + args.ip + ":" + str(args.port) 
     app = qi.Application(["SoundProcessingModule", "--qi-url=" + connection_url]) 
    except RuntimeError: 
     print ("Can't connect to Naoqi at ip \"" + args.ip + "\" on port " + str(args.port) +".\n" 
       "Please check your script arguments. Run with -h option for help.") 
     sys.exit(1) 

    MySoundProcessingModule = SoundProcessingModule(app) 
    app.session.registerService("SoundProcessingModule", MySoundProcessingModule) 
    MySoundProcessingModule.startProcessing() 

Les danses du robot en fonction du niveau RMS capturé par le micro avant, mais je dois l'arrêter à tout moment lorsque le capteur de tête (ou tout autre capteur) est touché.

  • FrontTactilTouched
  • MiddleTactilTouched
  • RearTactilTouched

:

Répondre

1

Au lieu de souscrire à TouchChanged, vous pouvez vous abonner à la tête seulement avec les 3 événements (pour les 3 boutons tactiles) Ils seront augmentés avec la valeur 1 lorsque le toucher commence, et 0 lorsque le toucher se termine. Donc, vous voudrez filtrer et arrêter votre danse seulement quand la valeur est 1.