NAO机器人学习小计
最近参与的一个项目是实现安卓以及ios设备对nao机器人的操控。
思路很简单,搞清楚nao机器人的通信接口,然后无非就是通过通信协议完成操纵就行了。
因此开发流程主要是:
选定通信协议,暂定socket。
开发nao端服务程序,接受来自客户端的消息,操纵nao完成动作。
开发客户端程序,发送特定指令以完成操控。
现在对于nao机器人的环境搭建还不是非常明确,先从接口入手。企业导师给的资料都是脚本语言级别的编程,不符合要求。因此找来naoqi documents,苦心钻研。
NAO APIs
nao的接口全部以AL开头,全部继承自ALModule
,它被包含在<alcommon/almodule.h>
中。
下面是ALModule的主要接口。
ALModule APIs
namespace : AL
#include <alcommon/almodule.h>
任务调度
ALModule::isRunning()
bool ALModule::isRunning(const int& id);
确定被一个‘post’创建的方法是否还在运行。(注:post可能类似于一个线程池管理员,方法的编号可能类似于线程号)。params: id - 被post所返回的函数的编号return: true表示该方法正在被执行,false表示该方法没有被执行。
ALModule::wait()
bool ALModule::wait(const int& id, const int& timeour);
等待编号为id的方法执行完毕。params: id - 被post所返回的函数的编号 timeout - ms为单位,表示return: true表示该方法正在被执行,false表示该方法没有被执行。
ALModule::stop()
void ALModule::stop(const int& id);
根据id停止相应方法。比较提倡模块开发人员实现这个接口,当模块内包含长时间执行的方法,而又希望允许用户打断。params: id - 被post返回的方法的编号return:
ALModule::exit()
void ALModule::exit();
将这个模块从父经纪人(parent broker)中注销。一旦这个方法被调用,这个模块将不再可用。开发人员应该在希望执行彻底的关机任务时重写这个方法。——warning:不建议在核心模块(例如 ALMemory 或者 ALMotion)中存在别的模块或者方法正在调用它们时使用。
Bound Methods - Introspection
(↑不太理解,字面翻译是:绑定的方法-反思)
ALModule::getBrokerName()
std::string ALModule::getBrokerName();
获取父经纪人的名称return: 父经纪人的名称。
ALModule::getMethodList()
std::vectore<std::string> ALModule::getMethodList();
获取当前模块的方法名称列表。return: 包含方法名称的向量。
ALModule::getMethodHelp()
AL::ALValue ALModule::getMethodHelp(const std::string& methodName);
获取一个方法的描述文档。params: methodName - 方法的名称return: 一个包含了方法的描述内容的结构体注:AL::ALValue [ std::string methodName, [ parameter, ... ] std::string returnName, std::string returnDescription]parameter:[ std::string parameterName, std::string parameterDescription]
ALModule::getModuleHelp()
AL::ALValue ALModule::getModuleHelp();
获取当前模块的描述。return: 一个包含模块描述的结构体。注:AL::ALValue[ std::string moduleDescription, [ moduleExample, ... ]]moduleExample:[ std::string language, std::string example]
ALModule::getUsage()
std::string ALModule::stop(const std::string& methodName);
根据函数名称返回该函数的用法。params: methodName - 函数名称。return: 总结了该函数用法的字符串。
ALModule::ping()
bool ALModule::ping();
单纯为了测试连接的ping。永远返回truereturn: true
ALModule::version()
std::string ALModule::version();
返回模块的版本return: 模块的版本信息字符串。
以上接口将作为公共接口存在于所有模块中。
由于我们的项目以通信为主,因此我们优先关注通信模块ALConnectionManagerProxy
ALConnectionManager APIs
namespace : AL
#include <alproxies/alconnectionmanagerproxy.h>
连接管理模块继承自ALModule API
。它也有自有的下列方法:
ALConnectionManagerProxy::state()ALConnectionManagerProxy::services()ALConnectionManagerProxy::technologies()ALConnectionManagerProxy::service()ALConnectionManagerProxy::connect()ALConnectionManagerProxy::disconnect()ALConnectionManagerProxy::forget()ALConnectionManagerProxy::setServiceConfiguration()ALConnectionManagerProxy::setServiceInput()ALConnectionManagerProxy::scan()ALConnectionManagerProxy::enableTethering()ALConnectionManagerProxy::disableTethering()ALConnectionManagerProxy::getTetheringEnable()ALConnectionManagerProxy::tetheringName()ALConnectionManagerProxy::tetheringPassphrase()ALConnectionManagerProxy::countries()ALConnectionManagerProxy::country()ALConnectionManagerProxy::setCountry()ALConnectionManagerProxy::interfaces()
(未完)