anki_vector SDK源码解析(教程)
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的所有控制功能了。
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内部实现
这个程序里,其实程序里面最不理解的就是这两句:
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函数的实现,调用的时候是不带参数的:

然后先看一下say_text函数:创建一个protobuf定义的协议结构体对象,然后填充内容,然后使用gRPC发送给小V。gRPC是基于protobuf和http2.0的一种通用的RPC,使用它可以方便的生成服务端和客户端代码,由此也可以看出小V内部使用的是gRPC服务端。
看完这些后,大体明白了robot.py的作用,这个模块不做具体的工作,只是简单的把其他基础模块的功能集成进来,为外部用户提供一个统一的接口。从这个文件的开头也能看出,它引用了同级目录下的几乎所有模块。

五:功能模块详解
了解完这些,对SDK源码已经有全局的了解。之后将调出几个具体的功能讲一下,所有功能的实现流程都大致相同。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?