anki_vector SDK源码解析(教程)
#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的所有控制功能了。
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就行了。
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函数的实现,调用的时候是不带参数的:

然后先看一下say_text函数:创建一个protobuf定义的协议结构体对象,然后填充内容,然后使用gRPC发送给小V。gRPC是基于protobuf和http2.0的一种通用的RPC,使用它可以方便的生成服务端和客户端代码,由此也可以看出小V内部使用的是gRPC服务端。

看完这些后,大体明白了robot.py的作用,这个模块不做具体的工作,只是简单的把其他基础模块的功能集成进来,为外部用户提供一个统一的接口。从这个文件的开头也能看出,它引用了同级目录下的几乎所有模块。
五:功能模块详解
了解完这些,对SDK源码已经有全局的了解。之后将调出几个具体的功能讲一下,所有功能的实现流程都大致相同。
anki_vector SDK源码解析(教程)的更多相关文章
- Mybatis源码解析1—— JDBC
在之前的文章中,我为大家介绍了 Mybatis 的详细用法,算是基础教程. 详细链接:Mybatis 基础教程 言归正传,只懂基础可不行,接下来将给大家带来高阶的源码解析教程,从浅入深,通过源码解析, ...
- Ocelot简易教程(七)之配置文件数据库存储插件源码解析
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9852711.html 上篇文章给大家分享了如何集成我写的一个Ocelot扩展插件把Ocelot的配置存储 ...
- jQuery2.x源码解析(构建篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 笔者阅读了园友艾伦 Aaron的系列博客< ...
- EventBus源码解析 源码阅读记录
EventBus源码阅读记录 repo地址: greenrobot/EventBus EventBus的构造 双重加锁的单例. static volatile EventBus defaultInst ...
- 【Android】EventBus 源码解析
EventBus 源码解析 本文为 Android 开源项目实现原理解析 中 EventBus 部分项目地址:EventBus,分析的版本:ccc2771,Demo 地址:EventBus Demo分 ...
- Android 热修复Nuwa的原理及Gradle插件源码解析
现在,热修复的具体实现方案开源的也有很多,原理也大同小异,本篇文章以Nuwa为例,深入剖析. Nuwa的github地址 https://github.com/jasonross/Nuwa 以及用于 ...
- OKHttp源码解析
http://frodoking.github.io/2015/03/12/android-okhttp/ Android为我们提供了两种HTTP交互的方式:HttpURLConnection 和 A ...
- Android源码解析——Toast
简介 Toast是一种向用户快速展示少量信息的视图.当它显示时,它会浮在整个应用层的上面,并且不会获取到焦点.它的设计思想是能够向用户展示些信息,但又能尽量不显得唐突.本篇我们来研读一下Toast的源 ...
- 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析
通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...
随机推荐
- Google Quic协议
0x01 Quic QUIC协议于2012年实现,2015年提交RFC草案,它是Goolge为了解决当今WEB应用常见的传输层和应用层问题而提出的,从分层结构上可以看做是TCP+TLS+HTTP2的集 ...
- [Linux] Extend space of root disk in Linux7
[root@node1 ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/centos-root 26G 17G 9.8G ...
- linux ubuntu 安装后没有root密码
终端中输入:sudo passwd root 此时重新设置原登录用户的密码. 设置成功后在终端继续输入: su root 则出现#号,原用户名得到root权限.此时可以进行超级用户操作.
- Properties类
简介: Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这 ...
- LNMP(三)
第二十二次课 LNMP(三) 目录 一.Nginx负载均衡 二.ssl原理 三.生成ssl密钥对 四.Nginx配置ssl 五.php-fpm的pool 六.php-fpm慢执行日志 七.open_b ...
- linux中sed命令批量修改
sed命令下批量替换文件内容 格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径` 文件名 -i 表示inplace edit,就地修改文件 ...
- [Chrome] 谷歌浏览器开启开发模式仍然无法安装油猴脚本
右键 > 属性 > 起始位置 > 添加 --enable-easy-off-store-extension-install 谷歌浏览器无法安装油猴脚本:--enable-easy-o ...
- TCPIP学习笔记
TCP的连接 状态变化 各个状态的意义如下: LISTEN - 侦听来自远方TCP端口的连接请求: SYN-SENT -在发送连接请求后等待匹配的连接请求: SYN-RECEIVED - 在收到和发送 ...
- 洛谷P1966 【火柴排队】
题解 P1966 [火柴排队] 说明: 在数学中有个公式: (a1-b1)^2+(a2-b2)^2<(a2-b1)^2+(a1-b2)^2 (你可以自己试着证一下) 两列火柴对应的两根火柴在各列 ...
- wpf binging(三) 绑定方法的返回值
有时候我们不能绑定对象的属性或者成员,我们需要绑定一个对象的方法时 可以用 ObjectDataProvider 比如先声明一个类 含有加法 ObjectDataProvider 的简单使用 以下为综 ...