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脚本的方法有三种:
- 在嵌入式Python解释器里本地执行:
- 要求Python解释器来进行脚本求值(eval)
#include "alpythonbridgeproxy.h"
ALPtr<ALPythonBridgeProxy> proxy = ALPtr<ALPythonBridgeProxy>(new ALPythonBridgeProxy); // in initialization
proxy->eval(std::string(myScript));
- 本地加载至NAOqi的启动:
- 将Python脚本添加至“$AL_DIR/modules/lib/autoload.ini”
[python]
myPythonModule.py
- 从机器人或桌面手动远程执行:
python.exe myPythonScript.py
- 从机器人自动远程执行:
- 将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