1. 程式人生 > >anki_vector SDK原始碼解析(教程)

anki_vector SDK原始碼解析(教程)

一:最近anki vector robot開放了Python SDK,我聽到的第一時間就趕快上網查了查,先拋幾個官網重要連結吧: Python程式設計API手冊及環境搭建等:    https://sdk-resources.anki.com/vector/docs/generated/anki_vector.html anki公司github地址及anki_vectorSDK實現原始碼,用於理解電腦和vector的通訊協議,包含教學例程:    https://github.com/anki/vector-python-sdk 一些關於cozmo和vector程式設計使用的Web工具,可以在瀏覽器看到機器人看到的影象:   
https://github.com/GrinningHermit/Vector-Explorer-Tool
anki程式設計交流社群:    https://forums.anki.com/ cozmo線上手冊:    http://cozmosdk.anki.com/docs/initial.html cozmo程式設計SDK原始碼及教學例程原始碼:    https://github.com/anki/cozmo-python-sdk 目前沒有相關書籍,anki不是像google一樣的一流大廠。筆者從事C++開發,對python程式設計也是小白級別,對vector程式設計的學習也全是靠上面這幾個連結。     首先,你得擁有一臺vector和一臺能用於程式設計的電腦(對作業系統沒有要求,這點很不錯),使它們處於同一個區域網內(都連著家裡的wifi就行)。具體安裝python和搭建環境等細節不再展開,線上文件寫的已經很詳盡了。   二:接下來的部分介紹幾個簡單的官網demo:
  原始碼目錄:vector-python-sdk-master/examples/tutorials/
 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 入門程式設計教程