NAOqi Sensors - Overview | API
See also
The ALTouch module generates the event TouchChanged() whenever the robot is touched.
The event TouchChanged() gives you a list of AL::ALValue with a body part and a boolean for the touch status.
For example:
The aim of these sensors is to determine whether the robot is touched. It’s a bistable behavior, an event is raised when for example the head is touched with the value True then an other one when the head is not touch anymore with the value False.
For the button [tactile, bumper, chest ...], the value is read in the ALMemory and if the status changed, an event is raised. For body parts that do not have capacitive sensors, touch is detected by a difference between joint angle commands and sensor.
The example below is a NAOqi Python module that reacts to touch events.
# -*- encoding: UTF-8 -*-
""" Say `My {Body_part} is touched` when receiving a touch event
"""
import sys
import time
from naoqi import ALProxy
from naoqi import ALBroker
from naoqi import ALModule
import argparse
# Global variable to store the ReactToTouch module instance
ReactToTouch = None
memory = None
class ReactToTouch(ALModule):
""" A simple module able to react
to touch events.
"""
def __init__(self, name):
ALModule.__init__(self, name)
# No need for IP and port here because
# we have our Python broker connected to NAOqi broker
# Create a proxy to ALTextToSpeech for later use
self.tts = ALProxy("ALTextToSpeech")
# Subscribe to TouchChanged event:
global memory
memory = ALProxy("ALMemory")
memory.subscribeToEvent("TouchChanged",
"ReactToTouch",
"onTouched")
def onTouched(self, strVarName, value):
""" This will be called each time a touch
is detected.
"""
# Unsubscribe to the event when talking,
# to avoid repetitions
memory.unsubscribeToEvent("TouchChanged",
"ReactToTouch")
touched_bodies = []
for p in value:
if p[1]:
touched_bodies.append(p[0])
self.say(touched_bodies)
# Subscribe again to the event
memory.subscribeToEvent("TouchChanged",
"ReactToTouch",
"onTouched")
def say(self, bodies):
if (bodies == []):
return
sentence = "My " + bodies[0]
for b in bodies[1:]:
sentence = sentence + " and my " + b
if (len(bodies) > 1):
sentence = sentence + " are"
else:
sentence = sentence + " is"
sentence = sentence + " touched."
self.tts.say(sentence)
def main(ip, port):
""" Main entry point
"""
# We need this broker to be able to construct
# NAOqi modules and subscribe to other modules
# The broker must stay alive until the program exists
myBroker = ALBroker("myBroker",
"0.0.0.0", # listen to anyone
0, # find a free port and use it
ip, # parent broker IP
port) # parent broker port
global ReactToTouch
ReactToTouch = ReactToTouch("ReactToTouch")
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print
print "Interrupted by user, shutting down"
myBroker.shutdown()
sys.exit(0)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--ip", type=str, default="127.0.0.1",
help="Robot ip address")
parser.add_argument("--port", type=int, default=9559,
help="Robot port number")
args = parser.parse_args()
main(args.ip, args.port)