各位晚安,今天是第14天了,我打算今天介紹完pybullet。首先會向各位介紹一些新的方法,因為昨天發文完後又回去看了這兩天發的東西,發現有漏掉一些方法沒有介紹,接下來就會帶各位複習這三天我介紹的方法。今天發文前對程式做確認時發現了pybullet有一些快捷功能鍵,在介紹方法前先來介紹一些快捷功能鍵吧,如果有更多我沒發現的也歡迎告知!
當我在撰寫今日的內容時發現按下特定的按鍵時會有特殊的效果,也算是一個意外的驚喜,那既然有發現我就來向各位介紹吧,對於一些功能的理解有可能會出錯也歡迎討論。
W鍵:場景透明化,只顯示骨架
A鍵:當場景透明化的時候再按A鍵可以顯示碰撞箱
J鍵:當場景透明化時可以切換以各部件為主的三軸座標,可以以視覺確認該link的所在位置跟以link為主的座標系,如圖所示。這是按下W鍵跟J鍵的顯示結果。
G鍵:切換所有子視窗顯示/隱藏
I鍵:暫停程式執行
V鍵:切換顯示/隱藏所有物體
F1鍵:切換顯示/隱藏世界座標軸
我們曾介紹過p.getBasePositionAndOrientation()
這個方法,這個方法會回傳機器人的所在位置,但如果今天是要回傳特定link位置的話,我們會使用p.getLinkState(模型ID,linkIndex=link索引值)
來取得link的位置等訊息,那一樣這個回傳值由8個元素所組成,不過在這個專案中我們只會使用到第一個元素,即位置座標。
如果我們今天要使用鍵盤來跟環境互動的話,我們就可以使用p.getKeyboardEvents()
來取得我們所按下的按鍵,這方法會回傳以按下按鍵的key跟鍵盤狀態的value組合成的dict,所以接下來可以使用.keys()方法來取得按下按鍵的種類,不過最後要再將結果強制轉換成串列,就能得到我們所按的鍵了。具體程式如下:
def getKeyPressed():
events = p.getKeyboardEvents()
print(f'events:{events}') #當按下方向鍵左鍵後會print出 events:{65295: 1}
list_key = list(events.keys())
print(list_key)#當按下方向鍵左鍵後會print出 [65295]
return list_key
但是鍵碼都會被轉換成unicode的形式,所以我會列出常用按鍵會回傳的值,各位可以當作參考。
空白鍵(32)
方向鍵:左(65295)、右(65296)、上(65297)、下(65298)
數字鍵:0(48)、1(49)以此類推
英文字母:A(97)其餘也是以此類推,我認為全部打出來可能版面會亂亂的,所以幫各位起個頭,剩餘的就往後推就好了。
另外狀態的值1為按住、3為按下的瞬間、4為放開,
接下來可以再進行更進一步的操作,例如當按下左鍵後可以判斷該做甚麼事,例如if 65295 in getKeyPressed():
...各位可以根據需求去設定。
我們除了偵測鍵盤事件以外也可以使用p.getMouseEvents()
來取得滑鼠事件,該方法回傳值為:
(事件種類,滑鼠x座標,滑鼠y座標,按鍵種類,按鍵狀態)
事件種類1為滑鼠移動事件,2為點擊事件
x,y座標應該就不用說了吧,就是滑鼠當前x,y座標(還是說了,但說了也等於沒說哈哈)
按鍵種類0為左鍵、1為中鍵(滾輪)、2為右鍵
按鍵狀態分成0為移動中、3為按下、4為放開
這三天我們學了很多方法,我打算以方法(參數)
的方式帶各位快速看過我們認識到的方法,並且會附上提及時的天數,如果忘記詳細資訊可以直接回去看看~
physicsClient = p.connect(p.GUI)
:建立虛擬環境跟物理引擎。D12
p.setGravity(x, y, z)
:設定重力。D12
p.setRealTimeSimulation(1)
:設定模擬方式,當使用到p.applyExternalForce()
時不可使用這個方法。D12
p.stepSimulation()
:當使用到p.applyExternalForce()
方法時所要設定的模擬方式。D13
p.setAdditionalSearchPath(pybullet_data.getDataPath())
:搜尋模組內建的模型並新增。D12
p.loadURDF(模型路徑,初始座標,初始朝向)
:依照路徑匯入模型,副檔名須為.urdf。D12
p.removeBody(模型ID)
:刪除指定模型。D12
p.getNumJoints(模型ID)
:獲取模型關節數量。D12
p.getJointInfo(模型ID,關節索引值)
:獲取該關節資訊。D12
p.addUserDebugParameter(paramName=參數名稱字串, rangeMin=最小值, rangeMax=最大值, startValue=初始值)
:新增可控參數。D12
p.readUserDebugParameter(可控參數名稱)
:讀取可控參數的值。D12
p.setJointMotorControl2(模型ID,jointIndex=關節索引值,controlMode=p.VELOCITY_CONTROL, targetVelocity=速度值)
:控制方法為速度控制的關節馬達控制。D13
p.setJointMotorControl2(模型ID,jointIndex=關節索引值,controlMode=p.POSITION_CONTROL, targetPosition=位置值)
:控制方法為位置控制的關節馬達控制。D13
p.setJointMotorControlArray(模型ID, jointIndices=所有關節索引值組合的串列,controlMode=p.VELOCITY_CONTROL,targetVelocities=各關節速度值組合的串列)
:控制方法為速度控制的多個關節馬達控制。D13
p.setJointMotorControlArray(模型ID, jointIndices=所有關節索引值組合的串列,controlMode=p.POSITION_CONTROL,targetPositions=各關節速度值組合的串列)
:控制方法為位置控制的多個關節馬達控制。D13
p.applyExternalForce(模型ID,關節索引值,[fx,fy,fz],[px,py,pz],flags)
:對關節直接施加作用力。D13
p.resetBasePositionAndOrientation(模型ID,生成位置,生成朝向)
:重新生成模型。D13
p.getEulerFromQuaternion(四元數串列)
:將四元數串列轉換成歐拉角度。D13
p.getBasePositionAndOrientation(模型ID)
:取得模型當前座標跟朝向等資訊。D13
p.getLinkState(模型ID,linkIndex=link索引值)
:取得模型中某link當前座標跟朝向等資訊。D14
p.resetDebugVisualizerCamera(cameraDistance=距離,cameraYaw=俯視視角,cameraPitch=水平視角,cameraTargetPosition=相機目標位置)
:設定上帝視角。D13
p.rayTest(raystartpos, raytopos)
:設定偵測用透明雷射。D13
p**.**addUserDebugLine(起始處,終止處,顏色)
:新增線段。D13
p.removeAllUserDebugItems()
:刪除所有除了模型外的物件(線段)。D13
p.getKeyboardEvents()
:獲取鍵盤事件。D14
p.getMouseEvents()
:獲取滑鼠事件。D14
pybullet中還有許多實用的方法可以使用,不過因為我也沒使用過的關係就先不提了,有興趣的話可以到官方文檔中了解,文檔寫的相當淺顯易懂~連結會附於下面,這三天介紹pybullet時我也發現許多方法都忘記如何使用了,也很多方法記得如何使用但卻忘記背後的意義,經過這三天介紹我也重新複習了一遍,記憶更深刻了,真是可喜可賀。希望各位在使用上也可以順暢,雖然可能大多數人都直接使用ROS(但我目前仍然在學習當中,還是菜雞),明後天會介紹一些URDF檔案的基礎語法,在有時候需要自定義物件等的時候就可以使用,接下來就可以正式進入強化學習環境的部分了。