SoftBank Robotics documentation What's new in NAOqi 2.8?

ALLandMarkDetection Tutorial

NAOqi Vision - Overview | API | Tutorial


Introduction

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[0]
  # Second Field = array of Mark_Info's.
  markInfoArray = val[1]

  try:
    # Browse the markInfoArray to get info on each detected mark.
    for markInfo in markInfoArray:
      # First Field = Shape info.
      markShapeInfo = markInfo[0]
      # Second Field = Extra info (i.e., mark ID).
      markExtraInfo = markInfo[1]
      # Print Mark information.
      print "mark  ID: %d" % (markExtraInfo[0])
      print "  alpha %.3f - beta %.3f" % (markShapeInfo[1], markShapeInfo[2])
      print "  width %.3f - height %.3f" % (markShapeInfo[3], markShapeInfo[4])
      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."

Results

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