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的全部控制功能了。html
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就好了。python
anki_vector目錄下存放的就是SDK庫源碼了,這是最重要的,接下來我就閱讀這一部分。git
examples目錄下存放着一些應用例子,就是調用了anki_vector模塊的示例程序,包含了上面講的01_hello_world.py例程,若是還不清楚怎麼調用anki_vector,能夠多看看這部分。github
剩下的都是一些可有可無的文件,感興趣能夠翻閱一下。編程
接下來打開anki_vector目錄:api
雖然文件不少,可是並不複雜,沒有太多的嵌套,就一個平滑的文件列表,裏面每個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源碼已經有全局的瞭解。以後將調出幾個具體的功能講一下,全部功能的實現流程都大體相同。