anki_vector SDK源碼解析(教程)

一:最近anki vector robot開放了Python SDK,我聽到的第一時間就趕快上網查了查,先拋幾個官網重要連接吧:
Python編程API手冊及環境搭建等:
anki公司github地址及anki_vectorSDK實現源碼,用於理解電腦和vector的通訊協議,包含教學例程:
一些關於cozmo和vector編程使用的Web工具,能夠在瀏覽器看到機器人看到的圖像:
anki編程交流社區:
cozmo在線手冊:
cozmo編程SDK源碼及教學例程源碼:
new:DDL官方SDK教學視頻:(40分鐘)(2020年新出的)
目前沒有相關書籍,anki不是像google同樣的一流大廠。筆者從事C++開發,對python編程也是小白級別,對vector編程的學習也全是靠上面這幾個連接。
 
  首先,你得擁有一臺vector和一臺能用於編程的電腦(對操做系統沒有要求,這點很不錯),使它們處於同一個局域網內(都連着家裏的wifi就行)。具體安裝python和搭建環境等細節再也不展開,在線文檔寫的已經很詳盡了。
 轉載請註明出處:https://www.cnblogs.com/xjjsk/p/10159946.html
二:接下來的部分介紹幾個簡單的官網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的全部控制功能了。html

 第6行解析命令行參數,只須要寫在這就好了,暫時用不着命令行參數。
第7行將解析後的命令行參數傳給Robot類,建立一個Robot對象,取名爲robot。
從第8行開始操做robot,就能完成全部對vector機器人的操做了。
例如,第9行讓你的機器人說一句「Hello World」,目前不支持中文,可是能夠用漢語拼音哈哈哈。
11行和12行,若是這個文件是被別的文件引用,則main只是個普通被調函數,不然就執行main()函數。
其實,每個程序都是這麼寫的,你只須要複製上面的代碼,將第八、9兩行換成你須要實現的邏輯就行,而全部的控制,均可以經過robot對象實現。
固然,引入anki_vector模塊就是爲了獲得robot對象的,除了這個模塊,你還能夠引入任何其餘python庫進來玩,甚至可使用ros、opencv等龐大的庫進行人工智能編程。
若是不清楚robot裏面支持哪些操做,能夠翻閱其餘的例程和 vector的在線API文檔。若是有遇到很是奇怪的Bug,能夠到vector社區提出,與其餘開發者交流。
 
  其實我感受anki_vector的接口封裝的特別好,就只須要看上面一個例子,再結合API文檔,就能玩遍全部功能了。
 
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

 

三:因此接下來,我將嘗試對SDK進行源碼解析,看看其餘語言是否也能實現控制功能。
   如下是剛剛下載下來的源碼目錄:

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函數的實現,調用的時候是不帶參數的:

 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函數:建立一個protobuf定義的協議結構體對象,而後填充內容,而後使用gRPC發送給小V。gRPC是基於protobuf和http2.0的一種通用的RPC,使用它能夠方便的生成服務端和客戶端代碼,由此也能夠看出小V內部使用的是gRPC服務端。

看完這些後,大致明白了robot.py的做用,這個模塊不作具體的工做,只是簡單的把其餘基礎模塊的功能集成進來,爲外部用戶提供一個統一的接口。從這個文件的開頭也能看出,它引用了同級目錄下的幾乎全部模塊。

 

 五:功能模塊詳解

回頭仔細看看anki_vector目錄,裏面除了python源文件,還包含了三個目錄,一個是messaging,一個是opengl,一個是configure。
打開messaging,一看裏面的文件後綴就知道,這是在使用gRPC,google開源的通訊框架,基於google protobuf實現,是一種高效率的、使用很是便捷的、被普遍使用的通訊方法,應該是用於電腦和vector的全部通訊。雖然文件多,可是其實編碼時只須要編寫proto後綴的文件,用這些文件說明協議和RPC規則,編寫完proto文件後,運行google提供的工具,就能生成兩個同名的py文件。例如編寫了*.proto,運行工具就會生成*_pb2.py和*_pb2_grpc.py兩個文件,而後在源碼中使用這兩個生成的文件就行。並且用的是protobuf的第2版本,已經有第3版本了。
opengl目錄更不用說了,調用了openGL,應該是用於處理和渲染vector看到的圖像,或者輸入一些圖像給vector。
configure目錄內只有一個__main__.py,用於配置本身的vector的信息,使電腦有權限可以鏈接特定vector。

 瞭解完這些,對SDK源碼已經有全局的瞭解。以後將調出幾個具體的功能講一下,全部功能的實現流程都大體相同。

----後面會持續更新----
-----未完期待-----
----轉載請註明出處(此頁面URL)----
anki vector robot SDK python 入門編程教程
相關文章
相關標籤/搜索