This tutorial explains how to run the ALLandMarkDetection module using Python. We use the first approach described above (i.e., we regularly check the ALMemory’s result variable). Information about the detected landmarks is printed in your output window. You can find the tutorial source in examples/python/vision_landMarkDetection.py in your SDK directory.
Getting a proxy to ALLandMarkDetection ¶
After some initialization steps, we first instantiate a proxy to the ALLandMarkDetection module, and we subscribe to it.
# This test demonstrates how to use the ALLandMarkDetection module. # - We first instantiate a proxy to the ALLandMarkDetection module # Note that this module should be loaded on the robot's NAOqi. # The module output its results in ALMemory in a variable # called "LandmarkDetected" # - We then read this AlMemory value and check whether we get # interesting things. import time from naoqi import ALProxy # Replace this with your robot's IP address IP = "10.0.252.91" PORT = 9559 # Create a proxy to ALLandMarkDetection try: landMarkProxy = ALProxy("ALLandMarkDetection", IP, PORT) except Exception, e: print "Error when creating landmark detection proxy:" print str(e) exit(1) # Subscribe to the ALLandMarkDetection proxy # This means that the module will write in ALMemory with # the given period below period = 500 landMarkProxy.subscribe("Test_LandMark", period, 0.0 )
Reading the result in the ALMemory variable ¶
Now we need to get a proxy to ALMemory and periodically check the ALLandMarkDetection output variable.
# ALMemory variable where the ALLandMarkdetection module # outputs its results memValue = "LandmarkDetected" # Create a proxy to ALMemory try: memoryProxy = ALProxy("ALMemory", IP, PORT) except Exception, e: print "Error when creating memory proxy:" print str(e) exit(1) print "Creating landmark detection proxy" # A simple loop that reads the memValue and checks # whether landmarks are detected. for i in range(0, 20): time.sleep(0.5) val = memoryProxy.getData(memValue, 0) print "" print "\*****" print "" # Check whether we got a valid output: a list with two fields. if(val and isinstance(val, list) and len(val) >= 2): # We detected landmarks ! # For each mark, we can read its shape info and ID. # First Field = TimeStamp. timeStamp = val # Second Field = array of Mark_Info's. markInfoArray = val try: # Browse the markInfoArray to get info on each detected mark. for markInfo in markInfoArray: # First Field = Shape info. markShapeInfo = markInfo # Second Field = Extra info (i.e., mark ID). markExtraInfo = markInfo # Print Mark information. print "mark ID: %d" % (markExtraInfo) print " alpha %.3f - beta %.3f" % (markShapeInfo, markShapeInfo) print " width %.3f - height %.3f" % (markShapeInfo, markShapeInfo) except Exception, e: print "Landmarks detected, but it seems getData is invalid. ALValue =" print val print "Error msg %s" % (str(e)) else: print "Error with getData. ALValue = %s" % (str(val)) # Unsubscribe from the module. landMarkProxy.unsubscribe("Test_LandMark") print "Test terminated successfully."
Here is what you get when you execute this script. We get different results as we occult or present new landmarks to the robot.
\***** mark ID: 130 alpha 0.081 - beta -0.001 width 0.049 - height 0.049 \***** mark ID: 150 alpha 0.062 - beta -0.030 width 0.032 - height 0.032 mark ID: 130 alpha 0.076 - beta 0.014 width 0.049 - height 0.049 \***** mark ID: 134 alpha 0.059 - beta -0.013 width 0.032 - height 0.032 mark ID: 130 alpha 0.074 - beta 0.031 width 0.048 - height 0.048