天天看點

實習交接文檔

對于Test_5項目中py檔案的一些說明

multimode

  • 這個檔案夾放的是符号接地部分的的代碼,這部分的代碼的主要功能是傳回行為樹中條件節點判斷的結果,目前是以布爾值作為傳回值,後續可以做更改,這部分在​

    ​test.py​

    ​中:
my_list = pred.cpu().numpy().tolist()[0]
my_dic = {'is_insert': True if int(my_list[0]) == 1 else False,
'is_open': True if int(my_list[1]) == 0 else False,
'is_hold': True if int(my_list[2]) == 1 else False,
'hand_free': True if int(my_list[2]) == 0 else False,
'is_close_to': True if int(my_list[3]) == 0 else False}
print("dic:", my_dic)
return my_dic[condition_name]
      
  • 項目中隻在​

    ​FunctinList.py​

    ​中對符号接地有調用,相關方法為​

    ​judge_condition​

    ​:
def judge_condition(condition_name, parm):
from multimodal import test
for dic in FunctionList.condition_function_list:
if dic['name'] == condition_name:
# 由于前端任務生成的條件會按字典序排列參數
# 這裡将參數調整為仿真端規定的順序
n_parm = dic['parm'].copy()
print('parm: ', parm)
print('n_parm: ', n_parm)
for key in n_parm.keys():
if key not in parm:
raise Exception('Parm not exists')
n_parm[key] = parm[key]
classic = test.classic()
judge_res = classic.classic(condition_name, n_parm)
print('condition ' + condition_name)
print('judge_res: ', judge_res)
return judge_res
raise Exception('Condition not exists')
      
  • 值得一提的是,由于符号接地和主函數部分都要與Vrep仿真端建立連接配接,而建立多個連接配接容易出現錯誤,目前的做法是讓這兩種共用一個連接配接,即​

    ​VrepAPI.py​

    ​中建立的連接配接。又由于一些複雜的原因,把import放到開頭就會報錯(我分析原因可能是multimode中的​

    ​Get_State.py​

    ​需要在一開始就建立好連接配接,傳回vrep對象,而項目目前的邏輯是開啟前端頁面後才會調用get_list建立連接配接,兩者時間上的沖突造成的),是以目前的做法是在調用方法的時候再import,蠢是蠢了點,不過管用就行!

FunctionList.py

  • 這個檔案的主要功能是在與仿真端Vrep建立連接配接後與其通信,如下達動作指令、擷取實時狀态等。這個檔案的上一個版本的所有動作函數和條件函數都是寫死的,經過我們修改後變成了​

    ​action_excute​

    ​和​

    ​judge_condition​

    ​兩個函數。

FunctionList_2.py

  • 這個檔案是與符号接地對接的結果之一,仍然是由于兩部分需要共享一個連接配接,在對接的時候我們就将符号接地部分需要與仿真端通信的函數集中抽取出來成為一個py檔案。
  • 寫文檔的時候突然想到,這部分好像放到mulitmode裡更合理一點。

newbot.py

  • 這個檔案的主要功能是與前端的互動和行為樹算法的一些實作(擴充子樹、沖突檢測等等)。在前端發出'/get_list'請求後,會調用這個檔案中的​

    ​newbot​

    ​方法,這也是開啟前端界面後調用的第一個方法,是以會比較重要,一些清單的初始化的工作也放到了這個方法裡(動作清單、條件清單等)。

VrepAPI.py

  • 這個檔案的作用就是單純的與Vrep建立連接配接,為了保持一緻性,我們建議如果需要新寫與Vrep通信的方法,盡量不要寫到這個檔案中,而是寫到​

    ​FunctionList.py​

    ​這樣的檔案中。

vrep.py

  • 這個檔案和​

    ​vrepConst.py​

    ​是配套的,和multimode中的​

    ​sim.py​

    ​與​

    ​simConst.py​

    ​相同,它們都是Vrep官方提供的庫函數,一般來說是不需要修改的。
  • 但是我們修改了。
  • 在與符号接地對接的時候,我們遇到了很離譜的事情。在手動建立好與Vrep的連接配接并開始仿真後,在multimode檔案夾與根目錄下分别運作一樣的代碼(即​

    ​test.py​

    ​)來從仿真端擷取用于符号接地判斷的資料,結果居然不一緻(multimode檔案夾下運作就是對的,根目錄下運作就是空的)。
  • 經過排查,我發現在multimode檔案夾下運作代碼,​

    ​vrep.py​

    ​找到的就是multimode下的​

    ​remoteApi.so​

    ​,而在根目錄下運作代碼,​

    ​vrep.py​

    ​找到的就是根目錄下的​

    ​remoteApi.so​

    ​。
  • 機智的我馬上想到,隻要用multimode下的​

    ​remoteApi.so​

    ​替換根目錄下的​

    ​remoteApi.so​

    ​不就行了嗎,诶,還真不行!
  • 無奈之下,我隻能修改了​

    ​vrep.py​

    ​中的源碼,強行讓它使用multimode下的​

    ​remoteApi.so​

    ​,更改如下所示:
# load library
libsimx = None
try:
print("system:", platform.system())
if platform.system() == 'Windows':
libsimx = CDLL("./remoteApi.dll")
elif platform.system() == 'Darwin':
libsimx = CDLL("./remoteApi.dylib")
else:
libsimx = CDLL("./multimodal/remoteApi.so")  # 之前是"./remoteApi.so"
      

其他檔案

  • 其他的檔案我們基本沒有結構性的調整與修改,與上一版功能和效果是一樣的,可以直接參考上一版的文檔和代碼中的注釋,在此就不再贅述。