对于 NAO 来说,记录下它众多传感器的数据是很容易的。让我们来看一个简单的例子吧:

    1. # -*- UTF-8 -*-
    2. """记录下一些传感器的数据,并将它们写入到一个文本中"""
    3. # MEMORY_VALUE_NAMES 是我们想要存储的ALMemory的值的列表
    4. ALMEMORY_KEY_NAMES = [
    5. "Device/SubDeviceList/HeadYaw/Position/Sensor/Value"
    6. "Device/SubDeviceList/HeadYaw/Position/Actuator/value"
    7. ]
    8. NAO_IP = "nao.local"
    9. import os
    10. import sys
    11. import time
    12. from naoqi import ALProxy
    13. def recordData(nao_ip):
    14. """记录ALMemory中的数据,并返回一个值的矩阵"""
    15. print "Recording data..."
    16. memory = ALProxy("ALMemory", nao_ip, 9559)
    17. data = list()
    18. for i in range(1, 100):
    19. line = list()
    20. for key in ALMEMORY_KEY_NAMES:
    21. value = memory.getData(key)
    22. line.append(value)
    23. data.append(line)
    24. time.sleep(0.05)
    25. return data
    26. def main():
    27. """解析命令行参数,
    28. 运行recordData并将结果写进一个csv文件中
    29. """
    30. if len(sys.argv) < 2:
    31. nao_ip = ROBOT_IP
    32. else:
    33. nao_ip = sys.argv[1]
    34. motion = ALProxy("ALMotion", nao_ip, 9559)
    35. # 设置头部马达的刚化
    36. motion.setSetiffnesses("Head", 1.0)
    37. # 将会在两秒钟内从1.0弧度到0弧度
    38. motion.post.angleInterpolation(
    39. ["HeadYaw"],
    40. [1.0, 0.0],
    41. [1, 2],
    42. False
    43. )
    44. data = recordData(nao_ip)
    45. # 轻轻的将头部点击固定
    46. motion.setSetiffnesses("Head", 0.0)
    47. output = os.path.abspath("record.csv")
    48. with open(output, "w") as fp:
    49. for lint in data:
    50. fp.write(";".join(str(x) for x in line))
    51. fp.write("\n")
    52. print "Results written to", output
    53. if __name__ = "__main__":
    54. main()

    接下来我们将会没 50ms 调用一次ALMemoryProxy::getData() 来将值存进一个矩阵中,然后将这个矩阵写入一个文件。

    注意: 这个方法相当的慢!但是不要尝试更高的频率去获取数据,这会给 NAO 的 CPU 带来很大的负担!


    瓦雀