對於MOVEJ的關節運動來說,我們只關心每個電機的角度(只需要考慮多個電機協同開始運動和結束運動,關鍵是對每個電機加速度均一化,從而一起跑一起停,這部分內容可以參考機器人學導論以獲取更加詳細的說明),我們要注意整個的流程是更新關節位置(MOVEJ)=>更新TCP(正解)=>更新關節速度和TCP速度
且由於正解是唯一的,在主程序的每個周期都要執行(當然你也可以不在主程序每個周期都執行,放在MoveUpdate里面也可以,不管執行何種運動都刷新一次正解)
對於MOVEL的TCP運動來說,我們只關心末端的位置和姿態(只需要考慮末端能否到目標位置,關鍵是求逆解,並把每個周期逆解對應的關節位置傳遞給電機,從而實現末端動,所有軸跟着聯動的效果,同樣可以參考機器人學導論研究更復雜的情況)。我們要注意整個的流程是更新TCP位置(MOVEL)=>更新關節位置(逆解)=>更新關節速度和TCP速度
且由於逆解不一定要做,只在MOVEL的時候才會執行,並且即便執行也是划歸為跟MOVEJ一樣的流程(MOVEUpdateDATA),更新數據之前判斷關節位置,速度是否超過限制
對於兩軸的直線模組來說比較簡單,只有XY兩個自由度,不涉及姿態,但是算法的流程和含義卻是一樣的。可以添加監控捕捉每個關節的位置和TCP的位置在啟停的時候是否平滑(在本例中只有表示設備關節位置的theRadius和表示設備TCP位置的posRPYRadius兩個數組是重要的,核心的)。點動的按鈕都是會相互影響的,JOG關節會影響TCP位置,JOGTCP會影響關節位置。當然在直線模組中每個自由度是獨立的,比如X的自由度只受J1電機控制(電機的角度算上絲杠導軌或者減速機,等比例的映射為多少mm,甚至可以測量得到簡單結論)
J0:36CM=>72弧度
-45 弧度=>27 弧度
J1:40CM=>80弧度
-40 弧度=>40 弧度
因此可以簡單認為每個模組每個關節1弧度運動量對應了X或者5mm的偏移(用弧度表示比較簡潔,更多時候我們不關心電機的具體角度,只關心這個輸出部分是多少)
要充分理解化歸的思想,X和Y的點動本質上都是直線運動的一種,比如X+就是目標的Y不變,X給一個很大的值,然后執行直線運動。不管是JOG,還是回原點,還是彈出面板輸入目標位置然后運動,本質都是同樣的,只不過執行的目標位置和執行的流程有所區別。
雖然是直線插補,但是依然有很多講究,比如啟動過程可以直接按給定的速度,加速度進行孤立點位的計算(實際上就是等分直線段,每個PLC周期要求TCP到達孤立的直線段即可),還有一種方法是啟動過程TCP的步子越來越大(想象人百米加速啟動,也是越走越快,加速到指定速度之后再保持勻速)。再比如停止的時候還是可以分成多種情況討論,再次只是簡單演示了梯形加速和S形加速兩種情況,停止的時候沿用了MOVEJ的關節停止,所以本質上末端TCP停止不再是保持直線,可以繼續優化。
為了虛擬和真實模式的統一,在停止的時候也只采集虛擬的關節位置和關節速度(這兩個虛擬的變量也可能是真實的,如果在真實模式下就從真實的驅動器獲取)
由於是自定義的算法,我們無法從絕對運動模塊中獲取是否運動完畢,但是其實也可以自己寫這樣一個模塊(執行的過程中不斷判斷是否當前位置和目標位置很接近,比如接近到一定范圍之后就認為到位了),如果要在幾個點來回運動,則必然需要等前面運動結束才能開始下一個運動。
最后雖然定義了MOVEJ和MOVEL運動方法,但是本質上繪制的軌跡卻都是直線,因為關節和TCP是一個簡單正比例關系(如果是串聯純轉動結構的機器人,MOVEJ繪制的是空間不規則弧線,而MOVEL則保持TCP軌跡為直線)。MOVEJ由於不考慮求逆,所以大部分情況下可以獲得比MOVEL更加平滑的軌跡和電機啟停效果。
更多教學視頻和資料下載,歡迎關注以下信息:
我的優酷空間:
http://i.youku.com/acetaohai123
我的在線論壇:
http://csrobot.gz01.bdysite.com/
問題交流:
QQ:910358960