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的所有控制功能了。
第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源碼解析(教程)