Python语言和语言选择

在明确了要创建行为的目标和特性后,就要选择开发语言。Python语言较容易但较慢。C++语言较难但比较快。通过Python语言可以轻松地创建动态对象,而C++语言则要求经过编译。Python体系结构是双重的。

Python bridge

“Python bridge”是一个嵌入式Python解释器,解释来自Choregraphe或其它任何模块的脚本。

方法 说明
std::string eval ( std::string pToEval ) 在Python解释器里进行字符串求值

// C++ sample #include "alpythonbridgeproxy.h" // all module created with module generator can include this ALPythonBridgeProxy proxy(getParentBroker()); proxy.eval("print 'hello_in_python_interpreter'")

执行Python脚本的方法

执行Python脚本的方法有三种:

  1. 在嵌入式Python解释器里本地执行:

    - 要求Python解释器来进行脚本求值(eval)

    #include "alpythonbridgeproxy.h"

    ALPtr<ALPythonBridgeProxy> proxy = ALPtr<ALPythonBridgeProxy>(new ALPythonBridgeProxy); // in initialization

    proxy->eval(std::string(myScript));

  1. 本地加载至NAOqi的启动:

    - 将Python脚本添加至“$AL_DIR/modules/lib/autoload.ini”

    [python]

    myPythonModule.py

  1. 从机器人或桌面手动远程执行:

    python.exe myPythonScript.py

  1. 从机器人自动远程执行:

    - 将Python脚本添加至“$AL_DIR/modules/lib/autoload.ini”

    [remote]

    myPythonScript.py

Python脚本会监听“0.0.0.0”(即所有有效地址),并在“127.0.0.1”上连接至NAOqi。

Python包装器(wrapper)

Python代理程序的API (extern\python\aldebaran\naoqi.py):

方法 说明
ALBroker(string name, string IP,int port, string parentIP, int parentPort) 创建一个Python代理程序

Python模块的API (extern\python\aldebaran\naoqi.py):

方法 说明
ALModule(string name) 创建一个Python模块
exit() 删除一个模块
BIND_PYTHON(string ModuleName, string methodName) 在API里添加一个函数
string getName() 获取模块名称
dataChanged(string pDataName, param, string message) 订阅数据改变时,调用“dataChanged”方法

Python代理的API (extern\python\aldebaran\naoqi.py):

方法 说明
ALProxy(string module) “连接”至一个模块(对本地模块没有作用)
methodName(param) “methodName”是任何模块的API函数调用的methodName
post.methodName(param) “methodName”是在另一个线程里的任何模块API函数调用的methodName

通过Python包装器,可以在任何C++模块进行并行、顺序及基于事件的调用。

#python sample #in the sample we run it from external python interpreter #but we can also only evaluate it with python bridge import os import sys import time import naoqi from naoqi import ALBroker from naoqi import ALModule from naoqi import ALProxy # call C++ method try: memProxy = ALProxy("ALMemory","127.0.0.1",9559) memProxy.insertData("MyVariable","myVariableValue",0) except RuntimeError,e: print "error insert data" exit(1)

使用外部Python解释器进行开发会快于PythonBridge,但是慢于本地PythonBridge。

如果C++函数符合包装器的形式,那么这些函数就可以通过Python语言调用:

  • 使用模块生成器生成C++语言模块(详情请参见 SDK
  • 使用“BIND_METHOD”模块函数来绑定方法(将其添加至API)
  • 在一个代理程序里加载模块(例如在“autoload.ini”里)

创建一个Python模块

用Python语言创建模块,模块就可以订阅ALMemory的数据,并在数据改变时定义回调。

""" with sample of python documentation """ import os import sys import time import naoqi from naoqi import ALBroker from naoqi import ALModule from naoqi import ALProxy # create python module # Python documentation will apear on web browser documentation class myModule(ALModule): """python class myModule test auto documentation""" def pythondatachanged(self, strVarName, value, strMessage): """callback when data change""" print value broker = ALBroker("pythonBroker","127.0.0.1",9999,"127.0.0.1",9559) # call method try: pythonModule = myModule("pythonModule") # don't forget to have the same module name and instance name proxy = ALProxy("ALMemory") prox.raiseMicroEvent("val",0) prox.subscribeToMicroEvent("val","pythonModule", "", "pythondatachanged") prox.raiseMicroEvent("val",1) except Exception,e: print "error behavior" print e exit(1) # add a loop here or program will exit before callback





Copyright © 2010 Aldebaran-Robotics - 版权所有