一:最近anki vector robot开放了Python SDK,我听到的第一时间就赶快上网查了查,先抛几个官网重要链接吧:
Python编程API手册及环境搭建等:
anki公司github地址及anki_vectorSDK实现源码,用于理解电脑和vector的通信协议,包含教学例程:
一些关于cozmo和vector编程使用的Web工具,可以在浏览器看到机器人看到的图像:
anki编程交流社区:
cozmo在线手册:
cozmo编程SDK源码及教学例程源码:
new:DDL官方SDK教学视频:(40分钟)(2020年新出的)
目前没有相关书籍,anki不是像google一样的一流大厂。笔者从事C++开发,对python编程也是小白级别,对vector编程的学习也全是靠上面这几个链接。
 
  首先,你得拥有一台vector和一台能用于编程的电脑(对操作系统没有要求,这点很不错),使它们处于同一个局域网内(都连着家里的wifi就行)。具体安装python和搭建环境等细节不再展开,在线文档写的已经很详尽了。
 转载请注明出处:https://www.cnblogs.com/xjjsk/p/10159946.html
二:接下来的部分介绍几个简单的官网demo:
  源码目录:vector-python-sdk-master/examples/tutorials/
 #01_hello_world.py

 import anki_vector

 def main():
  args = anki_vector.util.parse_command_args()
  with anki_vector.Robot(args.serial) as robot:
    print("Say 'Hello World'...")
    robot.say_text("Hello World") if __name__ == "__main__":
  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文档,就能玩遍所有功能了。

anki_vector.Robot(args.serial),这一句是创建一个robot对象,并连接到你的小V,每个程序开头一般都少不了这一行。而Robot这个对象的创建也是具有很多参数的,在这个例子中它只带了一个参数,其他的参数都使用默认参数。下面列出了这个重要的构造函数的所有参数及默认值:
class Robot:
  def __init__(self,
    serial: str = None,#矢量序号。机器人的序号(ex. 00e20100)位于向量的底面,或从Vector的调试屏幕访问。用于确定要加载哪个向量配置。
    ip: str = None,#Vector的ip地址。(可选)
    config: dict = None,#自定义的dict,覆盖Vector配置中的值。(可选)
    default_logging: bool = True,#记录日志
    behavior_activation_timeout: int = 10,#连接超时时间。
    cache_animation_list: bool = True,#获取启动时可用的动画列表。
    enable_face_detection: bool = False,#相册开关。
    enable_camera_feed: bool = False,#相机开关
    enable_audio_feed: bool = False,#音频开关
    enable_custom_object_detection: bool = False,#自定义对象检测开关
    enable_nav_map_feed: bool = None,#导航地图开关
    show_viewer: bool = False,#相机画面开关
    show_3d_viewer: bool = False,#3D画面开关
    requires_behavior_control: bool = True):#是否控制小V的行为系统
    pass

可以有选择的填入,普通情况下只需要小V的编号serial就行了。

三:所以接下来,我将尝试对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内部实现

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

 args = anki_vector.util.parse_command_args()
with anki_vector.Robot(args.serial) as robot:
  robot.say_text("Hello World")
  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函数:创建一个protobuf定义的协议结构体对象,然后填充内容,然后使用gRPC发送给小V。gRPC是基于protobuf和http2.0的一种通用的RPC,使用它可以方便的生成服务端和客户端代码,由此也可以看出小V内部使用的是gRPC服务端。

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

 

 五:功能模块详解

回头仔细看看anki_vector目录,里面除了python源文件,还包含了三个目录,一个是messaging,一个是opengl,一个是configure。
打开messaging,一看里面的文件后缀就知道,这是在使用gRPC,google开源的通信框架,基于google protobuf实现,是一种高效率的、使用非常便捷的、被广泛使用的通信方法,应该是用于电脑和vector的所有通信。虽然文件多,但是其实编码时只需要编写proto后缀的文件,用这些文件说明协议和RPC规则,编写完proto文件后,运行google提供的工具,就能生成两个同名的py文件。例如编写了*.proto,运行工具就会生成*_pb2.py和*_pb2_grpc.py两个文件,然后在源码中使用这两个生成的文件就行。而且用的是protobuf的第2版本,已经有第3版本了。
opengl目录更不用说了,调用了openGL,应该是用于处理和渲染vector看到的图像,或者输入一些图像给vector。
configure目录内只有一个__main__.py,用于配置自己的vector的信息,使电脑有权限能够连接特定vector。

了解完这些,对SDK源码已经有全局的了解。之后将调出几个具体的功能讲一下,所有功能的实现流程都大致相同。

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

anki_vector SDK源码解析(教程)的更多相关文章

  1. Mybatis源码解析1—— JDBC

    在之前的文章中,我为大家介绍了 Mybatis 的详细用法,算是基础教程. 详细链接:Mybatis 基础教程 言归正传,只懂基础可不行,接下来将给大家带来高阶的源码解析教程,从浅入深,通过源码解析, ...

  2. Ocelot简易教程(七)之配置文件数据库存储插件源码解析

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9852711.html 上篇文章给大家分享了如何集成我写的一个Ocelot扩展插件把Ocelot的配置存储 ...

  3. jQuery2.x源码解析(构建篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 笔者阅读了园友艾伦 Aaron的系列博客< ...

  4. EventBus源码解析 源码阅读记录

    EventBus源码阅读记录 repo地址: greenrobot/EventBus EventBus的构造 双重加锁的单例. static volatile EventBus defaultInst ...

  5. 【Android】EventBus 源码解析

    EventBus 源码解析 本文为 Android 开源项目实现原理解析 中 EventBus 部分项目地址:EventBus,分析的版本:ccc2771,Demo 地址:EventBus Demo分 ...

  6. Android 热修复Nuwa的原理及Gradle插件源码解析

    现在,热修复的具体实现方案开源的也有很多,原理也大同小异,本篇文章以Nuwa为例,深入剖析.  Nuwa的github地址 https://github.com/jasonross/Nuwa 以及用于 ...

  7. OKHttp源码解析

    http://frodoking.github.io/2015/03/12/android-okhttp/ Android为我们提供了两种HTTP交互的方式:HttpURLConnection 和 A ...

  8. Android源码解析——Toast

    简介 Toast是一种向用户快速展示少量信息的视图.当它显示时,它会浮在整个应用层的上面,并且不会获取到焦点.它的设计思想是能够向用户展示些信息,但又能尽量不显得唐突.本篇我们来研读一下Toast的源 ...

  9. 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析

    通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...

随机推荐

  1. ATOM:亮瞎程序员双眼的编辑器插件横空出世

    Atom 编辑器有一个叫 activate-power-mode,啥玩意?看下面的动图吧,非常有 Power ,有木有!!!自带眩晕特技,有木有!

  2. ecplise中设置字符编码

    ecplise 设置 1 ecplise编码格式 右键 在general-workspace- text file encoding 选择utf-8 2 jsp文件编码格式 web-jspfile-e ...

  3. Java 平时作业三

    自定义一个可以存储 int 类型的集合类(例如:SequenceList),封装一维数组存储数据,该 集合类具有以下方法: (1)新增元素: (2)在指定位置插入一个元素: (3)按位置删除元素: ( ...

  4. 构建--> 部署-->

    这一篇中我们会写一些关于自动化部署的代码.我们会使用 Powershell 书写这类代码. 你将发现这篇文章中涉及的东西非常具体,有的要求甚至相当苛刻且可能不具有通用性.这是因为部署从来都是跟环境打交 ...

  5. malloc/free与new/delete的区别与联系

    相同点:(1)都是申请内存,释放内存,free和delete可以释放NULL指针:(2)都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就对应一个delete/free,而是指在作 ...

  6. vue学习笔记——篇3

    1.绑定计算后数据,三种方式: >1.红色框,通过method >2.黄色框,通过computed >3.蓝色框,通过watch 推荐computed,vue对computed做了缓 ...

  7. 更强大的python正则表达式模块 -- regex

    python内置的正则表达库re比较弱,而且似乎在好几年里都没太大的变化. 这里介绍这个python模块regex,实现了更多方便好用的功能. 比如:\p{han} 可以匹配汉字, \p{Latin} ...

  8. DB9接口定义

    注意公头和母头的引脚序号是不一样的.

  9. 新手学习之浅析一下c/c++中的指针

    一.我们先来回忆一下指针的概念吧,方便下面的介绍 指针是存放地址值的变量或者常量.例如:int a=1;&a就表示指针常量(“&”表示取地址运算符,也即引用).int *b,b表示的是 ...

  10. Firefox下载附件乱码的解决办法

    通过在http的header里设置fileName下载附件时,中文文件名通过chrome浏览器下载时正常,通过firefox下载时为乱码: 原来的Java代码: response.addHeader( ...