anki_vector SDK源码解析(教程)

Posted xjjsk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了anki_vector SDK源码解析(教程)相关的知识,希望对你有一定的参考价值。

一:最近anki vector robot开放了Python SDK,我听到的第一时间就赶快上网查了查,先抛几个官网重要链接吧:
Python编程API手册及环境搭建等:
anki公司github地址及anki_vectorSDK实现源码,用于理解电脑和vector的通信协议,包含教学例程:
一些关于cozmo和vector编程使用的Web工具,可以在浏览器看到机器人看到的图像:
anki编程交流社区:
cozmo在线手册:
cozmo编程SDK源码及教学例程源码:
目前没有相关书籍,anki不是像google一样的一流大厂。笔者从事C++开发,对python编程也是小白级别,对vector编程的学习也全是靠上面这几个链接。
 
  首先,你得拥有一台vector和一台能用于编程的电脑(对操作系统没有要求,这点很不错),使它们处于同一个局域网内(都连着家里的wifi就行)。具体安装python和搭建环境等细节不再展开,在线文档写的已经很详尽了。
 
二:接下来的部分介绍几个简单的官网demo:
  源码目录:vector-python-sdk-master/examples/tutorials/
 1 #01_hello_world.py
 2 
 3 import anki_vector
 4 
 5 def main():
 6   args = anki_vector.util.parse_command_args()
 7   with anki_vector.Robot(args.serial) as robot:
 8     print("Say ‘Hello World‘...")
 9     robot.say_text("Hello World")
10 
11 if __name__ == "__main__":
12   main()

首先,第3行引入anki_vector模块,其实就是一个叫做anki_vector的文件夹,目前所有的程序,只需要引入这个模块就拥有vector的所有控制功能了。

 第6行解析命令行参数,只需要写在这就行了,暂时用不着命令行参数。
第7行将解析后的命令行参数传给Robot类,创建一个Robot对象,取名为robot。
从第8行开始操作robot,就能完成所有对vector机器人的操作了。
例如,第9行让你的机器人说一句“Hello World”,目前不支持中文,但是可以用汉语拼音哈哈哈。
11行和12行,如果这个文件是被别的文件引用,则main只是个普通被调函数,否则就执行main()函数。
其实,每一个程序都是这么写的,你只需要复制上面的代码,将第8、9两行换成你需要实现的逻辑就行,而所有的控制,都可以通过robot对象实现。
当然,引入anki_vector模块就是为了得到robot对象的,除了这个模块,你还可以引入任何其他python库进来玩,甚至可以使用ros、opencv等庞大的库进行人工智能编程。
如果不清楚robot里面支持哪些操作,可以翻阅其他的例程和vector的在线API文档。如果有遇到非常奇怪的Bug,可以到vector社区提出,与其他开发者交流。
 
  其实我感觉anki_vector的接口封装的特别好,就只需要看上面一个例子,再结合API文档,就能玩遍所有功能了。
 
三:所以接下来,我将尝试对SDK进行源码解析,看看其他语言是否也能实现控制功能。
   以下是刚刚下载下来的源码目录:
技术分享图片

anki_vector目录下存放的就是SDK库源码了,这是最重要的,接下来我就阅读这一部分。

examples目录下存放着一些应用例子,就是调用了anki_vector模块的示例程序,包含了上面讲的01_hello_world.py例程,如果还不清楚怎么调用anki_vector,可以多看看这部分。

剩下的都是一些无关紧要的文件,感兴趣可以翻阅一下。

接下来打开anki_vector目录:

技术分享图片

虽然文件很多,但是并不复杂,没有太多的嵌套,就一个平滑的文件列表,里面每一个py文件都实现了vector的一个控制功能(例如:背灯的控制由lights.py实现,照相的控制由camera.py实现),少数py文件用于实现基础功能和最后汇总(例如robot.py用于汇总对vector的控制功能,在调用这个库时只需要创建一个Robot类的对象,其他的操作全由这个对象间接完成)。

最重要的是,这些文件与官网API几乎是一一对应,也就是说,每个文件内都封装了一个功能类。

下面是在线文档中的API,可以与上面的库目录对比着看,对每个API的说明也是对每个文件的说明:

技术分享图片

具体每个类实现了哪些方法,可以点击对应的在线文档API进去看,也可以直接看源码。

浏览了anki_vector库的概貌之后,我们再回到最先讲的hello world程序,看看在那几个调用中,到底发生了什么。

 

四:hello world内部实现

 这个程序里,其实程序里面最不理解的就是这两句:

1 args = anki_vector.util.parse_command_args()
2 with anki_vector.Robot(args.serial) as robot:
3   robot.say_text("Hello World")
4   pass

按照调用次序顺藤摸瓜,从anki_vector模块中找到util模块,再从util模块找到parse_command_args函数的实现,调用的时候是不带参数的:

技术分享图片

 parser是函数参数,在前面的例程中,我们没有传递参数,默认是None。argparse是python的一个常用库,最后发生的就是在87行设置一些默认参数,,88行返回。
再回到hello_world例程中,把返回的args直接传递给Robot的构造函数。
在with ... as ...语句中,创建了一个Robot类型的对象robot,然后隐式调用了Robot类的__enter__函数,在with ... as ...语句结束后会隐式调用__exit__函数。而里面所做的,就是调用connect成员函数和disconnect成员函数,可以简单的认为是与你的vector机器人建立连接和断开连接,connect函数内部代码有点长,但是逻辑很简单,就是初始化所有的功能类对象,这里不再展开:
技术分享图片

然后先看一下say_text函数:

技术分享图片

看完这些后,答题明白了robot.py的作用,这个模块不做具体的工作,只是简单的把其他基础模块的功能集成进来,为外部用户提供一个统一的接口。从这个文件的开头也能看出,它引用了同级目录下的几乎所有模块。

 技术分享图片

 五:功能模块详解

 gRPC

 

----后面会持续更新----
-----未完期待-----
----转载请注明出处(此页面URL)----
anki vector robot SDK python 入门编程教程

以上是关于anki_vector SDK源码解析(教程)的主要内容,如果未能解决你的问题,请参考以下文章

redux教程之源码解析2 combineReducers(分析在注释中)

烈焰遮天 cocos 手游mmo 源码 解析

redux教程之源码解析createStore

Dubbo配置参数源码解析-group

墙裂推荐,Android 开发百大框架源码精编解析

Volley源码解析——从实现角度深入剖析volley