本人2年發(fā)那科機(jī)器人搬送應(yīng)用經(jīng)驗(yàn),+安川motoman+espon+配天機(jī)器人+雜七雜八的國(guó)產(chǎn)機(jī)器人應(yīng)用經(jīng)驗(yàn)。
總的來(lái)說(shuō)機(jī)器人應(yīng)用方面用的最多應(yīng)該還是搬運(yùn),像其他細(xì)分領(lǐng)域里,焊接,噴涂還有視覺(jué)應(yīng)用,接觸比較少,所以可能給不了大家太多的分享。
首先,機(jī)器人應(yīng)用里面就躲不過(guò)一個(gè)東西,叫坐標(biāo)系。
何為坐標(biāo)系,讀過(guò)書都應(yīng)該知道,平面里建立一個(gè)x方向與y方向垂直,便能形成一個(gè)二維的直角坐標(biāo)系。在二維平面的坐標(biāo)系上面垂直一個(gè)Z方向就得到了一個(gè)三維的坐標(biāo)系。
之前在常州機(jī)電做培訓(xùn)的時(shí)候,老師們都問(wèn)過(guò)一個(gè)問(wèn)題就是,機(jī)器人是靠什么去準(zhǔn)確再現(xiàn)位置的。我簡(jiǎn)單解釋說(shuō)就是靠電機(jī)編碼器的數(shù)值去記錄,然后就得到一個(gè)新的問(wèn)題,就是怎么知道它的位置就是原點(diǎn)。機(jī)器人本體下面有一個(gè)電池盒,電池是可以保存編碼器信息的,編碼器是絕對(duì)式,當(dāng)電池快沒(méi)電到時(shí)候,需要帶電更換電池,以防止掉電失掉數(shù)據(jù)。編碼器數(shù)據(jù)相當(dāng)于機(jī)器人再現(xiàn)動(dòng)作的基礎(chǔ)。然后就是煩人的坐標(biāo)系。
回到我們的坐標(biāo)系,基本有以下幾種坐標(biāo)系:
1.世界坐標(biāo)/基坐標(biāo)/底坐標(biāo)/全局坐標(biāo)(反正就一個(gè),以第一軸基座中心為原點(diǎn)就是了,有些把世界坐標(biāo)系分開說(shuō)是世界坐標(biāo)規(guī)定用戶坐標(biāo)的初始方向,倆坐標(biāo)是同一個(gè)點(diǎn)同一個(gè)方向,但有些廠家出廠標(biāo)定不一樣,沒(méi)辦法總有人要特立獨(dú)行)
2.法蘭坐標(biāo)系(以第六軸法蘭中心為原點(diǎn))
3.工具坐標(biāo)系/尖端坐標(biāo)系(以工具/夾持器/焊槍/噴槍/打磨頭等最終的中心位置為原點(diǎn))
4.用戶坐標(biāo)系/方向坐標(biāo)系/工件坐標(biāo)系(定義運(yùn)動(dòng)方向,有一些把用戶跟工件坐標(biāo)系分開,因?yàn)楣ぜ鴺?biāo)系Z軸方向以右手定則確定,用戶坐標(biāo)系可自定義)
然后我們需要知道:
1.世界/基座標(biāo)一般不需要我們自己標(biāo)定,因?yàn)槭窍到y(tǒng)內(nèi)設(shè)置好的
2.法蘭坐標(biāo)系一般只有一個(gè)(雙臂的就不知道了,沒(méi)用過(guò)),也不用我們操心
3.工具坐標(biāo)系(tool)一般需要進(jìn)行尖端TCP標(biāo)定也就是需要至少三個(gè)不同面的姿態(tài)去確定工具中心,通常采用三點(diǎn)/六點(diǎn)/九點(diǎn)法進(jìn)行。而我比較喜歡在規(guī)矩的夾具上面直接通過(guò)設(shè)計(jì)參數(shù)去設(shè)定tcp(遇到60°安裝的或者是特殊角度的工具就老老實(shí)實(shí)還是三點(diǎn)法吧)
4.用戶/工件坐標(biāo)系,一般也是比較簡(jiǎn)單的三點(diǎn)法即是原點(diǎn),X方向點(diǎn)Y方向點(diǎn),(方向距離越大,XY夾角越接近90度,坐標(biāo)系越準(zhǔn))
坐標(biāo)系是機(jī)器人應(yīng)用的基礎(chǔ),接觸過(guò)這么多的設(shè)備,有簡(jiǎn)單也有復(fù)雜的,最開始不會(huì)的時(shí)候基本都是使用初始化狀態(tài)的坐標(biāo)系,即是法蘭坐標(biāo)+世界坐標(biāo)去做,因?yàn)榛径际谴怪辈季,?dāng)你遇到45度布局的設(shè)備的時(shí)候就gg了,每次都是X+1Y+1,一點(diǎn)點(diǎn)的加,后面學(xué)會(huì)了坐標(biāo)系,上來(lái)就是先把坐標(biāo)系設(shè)定好了,對(duì)點(diǎn)編程的時(shí)候就相對(duì)輕松很多。
坐標(biāo)系制定是機(jī)器人應(yīng)用一個(gè)基礎(chǔ),也是比較多新手會(huì)不太喜歡去使用的一個(gè)東西,因?yàn)橛袝r(shí)候定好點(diǎn)運(yùn)行的時(shí)候發(fā)現(xiàn)坐標(biāo)系調(diào)用錯(cuò)了,整個(gè)程序就得重來(lái)或者重新使用那個(gè)坐標(biāo)系。一般我發(fā)現(xiàn)坐標(biāo)系錯(cuò)了我會(huì)試一下是不是某個(gè)坐標(biāo)系,然后偷懶的把坐標(biāo)系給改成那個(gè)坐標(biāo)系,但這個(gè)做法日后別人去讀程序的時(shí)候就會(huì)一臉懵不知道你為什么那樣干。所以該有的規(guī)矩還是得有,編程就是得邏輯清晰然后多做點(diǎn)備注吧。
坐標(biāo)系標(biāo)定好了之后,先別急著去編程,如果說(shuō)新接觸一家機(jī)器人廠家,最好先把相應(yīng)的動(dòng)作指令熟悉一下。
初次使用發(fā)那科機(jī)器人的時(shí)候我覺(jué)得跟三菱的機(jī)器人是差不多的,就是直線跟關(guān)節(jié),然后后帶個(gè)速度+截至類型,編程的時(shí)候溜得飛起,編完程序你還能一鍵把相應(yīng)點(diǎn)位重新按順序編號(hào),要改哪個(gè)點(diǎn)位就點(diǎn)哪里然后選擇修改數(shù)據(jù)就萬(wàn)事大吉。后來(lái)遇到了安川機(jī)器人就懵了,直接來(lái)個(gè)movj*****或者movl*****,點(diǎn)位呢沒(méi)有編號(hào),尷尬的我都不得不吐槽這東西不科學(xué),用久了呢,也就摸出規(guī)律了,大概也就是各家人不一樣的做法而已。
說(shuō)到底目前的機(jī)器人運(yùn)動(dòng)指令無(wú)非就是:
MOVL直線運(yùn)動(dòng)+點(diǎn)位標(biāo)簽+運(yùn)動(dòng)速度+截止類型(+加減速)
MOVJ關(guān)節(jié)運(yùn)動(dòng)+點(diǎn)位標(biāo)簽+運(yùn)動(dòng)速度+截止類型(+加減速)
MOVC圓弧運(yùn)動(dòng)+點(diǎn)位信息+運(yùn)動(dòng)速度+截止類型(+加減速)
每一家人的指令方式都不一樣,編程之前最好了解一下指令的構(gòu)成是怎樣的。用習(xí)慣了發(fā)那科的fine/cnt100,突然來(lái)個(gè)F100/C50的截止類型,會(huì)有個(gè)一臉懵的感覺(jué);蛘呤墙y(tǒng)一速度的speed=80,變成了speedset/vset,這些都得先提前了解。
經(jīng)驗(yàn)告訴我,角度變換選關(guān)節(jié),因?yàn)榭,如你需要本體轉(zhuǎn)移90度或者末端工具轉(zhuǎn)180度的時(shí)候,關(guān)節(jié)運(yùn)動(dòng)是最快最安全的,因?yàn)閯?dòng)作可預(yù)見(jiàn)。或者運(yùn)行到安全點(diǎn)這類外部安全位置的一般都是走關(guān)節(jié)。迫近與末端執(zhí)行一般就是使用直線,這樣確保準(zhǔn)確程度,且這個(gè)時(shí)候坐標(biāo)系 的作用就體現(xiàn)出來(lái)了,一個(gè)合適的坐標(biāo)系能讓你動(dòng)作調(diào)試過(guò)程輕松很多倍。當(dāng)然,焊接工藝比較多還是走復(fù)雜曲線,我接觸的比較少,焊接是個(gè)工藝,為了子孫后代,沒(méi)想接觸。
然后有些特殊應(yīng)用場(chǎng)景可能會(huì)用到碼垛拆垛指令,這些指令需要各自去看指令代碼說(shuō)明。初學(xué)機(jī)器人可能都會(huì)在機(jī)器人怎么保存數(shù)據(jù)跟怎么執(zhí)行動(dòng)作上面比較難理解,搞兩個(gè)就知道了。實(shí)干才能深刻體會(huì)。
然后第三步就是機(jī)器人的io操作,首先了解io的手動(dòng)觸發(fā),手動(dòng)操作下io是如何觸發(fā)io監(jiān)控io,這是編程之前需要了解的。例如發(fā)那科可以設(shè)置快捷鍵shitf+數(shù)字鍵,安川也可以使用快捷方式觸發(fā),配天可以配置FN鍵,了解之后,對(duì)于你的操作會(huì)有很多幫助。進(jìn)入編程io觸發(fā),要了解編程指令中io是如何操作的。有些機(jī)器人io指令就是O1=ON/O1 ON/ON O1...復(fù)雜一點(diǎn)的可能就會(huì)pluse脈沖輸出或者是在指令后面有其他附加指令。也有些是在機(jī)器人動(dòng)作后面加上動(dòng)作結(jié)束后輸出或動(dòng)作輸出前關(guān)閉。像發(fā)那科是DO1=on,wait DI1=OFF,配天的是SETDO(1,TRUE),WAITUNTIL getdi().IO操作基本會(huì)貫徹你應(yīng)用過(guò)程。
到這個(gè)過(guò)程,基本上一個(gè)動(dòng)作就可以走完了。簡(jiǎn)單的動(dòng)作執(zhí)行,然后觸發(fā)IO,等待io到位,繼續(xù)下一步,一個(gè)簡(jiǎn)單的邏輯就完成了。
主菜上完了,該上小菜了。
進(jìn)入實(shí)際編程,我們來(lái)說(shuō)程序執(zhí)行結(jié)構(gòu)。到上面那一步,我們基本把機(jī)器人動(dòng)作的基礎(chǔ)講完了,點(diǎn)位運(yùn)動(dòng)+IO動(dòng)作,簡(jiǎn)單演示一個(gè)動(dòng)作流程是沒(méi)問(wèn)題了。
最近在看python,python把程序結(jié)構(gòu)分為順序結(jié)構(gòu),分支(選擇)結(jié)構(gòu),循環(huán)結(jié)構(gòu),在這里,我覺(jué)得可以套用。
順序結(jié)構(gòu)用于執(zhí)行動(dòng)作,流程,工藝。上面說(shuō)到的簡(jiǎn)單的點(diǎn)位運(yùn)行然后執(zhí)行io操作,可以歸類為順序結(jié)構(gòu)。
分支結(jié)構(gòu)用的比較多還是在工藝選擇,流程選擇,子程序調(diào)用上面,具體體現(xiàn)為,滿足條件即跳轉(zhuǎn)。舉個(gè)例子,機(jī)器人一對(duì)多設(shè)備,運(yùn)行等待時(shí)如果期中一臺(tái)設(shè)備發(fā)送了上下料或空閑指令,機(jī)器人收到信息后,需要進(jìn)行設(shè)備選擇以及動(dòng)作程序,其他設(shè)備后發(fā)送信息就得等相關(guān)流程處理完才會(huì)繼續(xù)執(zhí)行該動(dòng)作。再舉個(gè)例子,一個(gè)動(dòng)作里面如果有不同的工藝,工藝完成情況會(huì)決定相應(yīng)后續(xù)工藝,分支選擇便是決定工藝執(zhí)行的前提。有些機(jī)器人分支結(jié)構(gòu)命令為if(條件)then(執(zhí)行動(dòng)作),然后動(dòng)作內(nèi)部再嵌套一級(jí)if判斷,最多一般不超過(guò)7級(jí)。有些機(jī)器人則是if(條件成立)(執(zhí)行動(dòng)作)else(執(zhí)行動(dòng)作)endif,或者是if(條件成立)執(zhí)行動(dòng)作elseif(條件成立)(執(zhí)行動(dòng)作)elseif(條件成立)(執(zhí)行動(dòng)作)endif。有些會(huì)直接把elseif簡(jiǎn)寫elif或者其他,這時(shí)候廠家手冊(cè)就很有去看啦。不過(guò)我用的比較多還是使用
switch (條件)
case(條件1)執(zhí)行動(dòng)作
case(條件2)執(zhí)行動(dòng)作
case(條件3)執(zhí)行動(dòng)作
def 執(zhí)行動(dòng)作
每一家的指令都不一樣,但是思想可以歸為一類。條件滿足執(zhí)行相應(yīng)的動(dòng)作。這就是分支結(jié)構(gòu)的核心。不過(guò)使用分支結(jié)構(gòu)的話需要注意一點(diǎn)就是執(zhí)行結(jié)束后需要返回的位置,如果是循序工藝,那可以直接跳轉(zhuǎn)回下一行,如果是動(dòng)作工藝,那需要返回的有時(shí)候會(huì)是條件判斷的選擇行,這個(gè)地方需要注意。就像上下料,你判斷是上下料了,取完下一步就是上料,如果你跳轉(zhuǎn)回判斷機(jī)臺(tái)動(dòng)作,那鐵定出故障,如果你動(dòng)作做完了,下一步是去放成品,那跳轉(zhuǎn)回去判斷下一步工藝應(yīng)該是符合邏輯的。
循環(huán)結(jié)構(gòu),循環(huán)結(jié)構(gòu)和選擇結(jié)構(gòu)有些類似,不同點(diǎn)在于循環(huán)結(jié)構(gòu)的條件判斷和循環(huán)體之間形成了一條回路,當(dāng)進(jìn)入循環(huán)體的條件成立時(shí),程序會(huì)一直在這個(gè)回路中循環(huán),直到進(jìn)入循環(huán)體的條件不成立為止。
最近在搞PLC,F(xiàn)OR...NEXT..指令。剛開始我覺(jué)得獨(dú)立的程序也可以達(dá)到我想要的效果。寫了一個(gè)累加的程序,從1-50,普通程序花了5秒完成,24行程序,后來(lái)用FOR k50然后程序也是差不多的程序邏輯,100ms就出結(jié)果,1-1000累加也是100ms,普通程序花了要30秒。后面查查資料,意思就是在一個(gè)周期里面它這個(gè)程序會(huì)根據(jù)設(shè)定的次數(shù)運(yùn)行相應(yīng)的次數(shù),所以會(huì)快一點(diǎn)。
不過(guò)這里用在機(jī)器人上面,較多應(yīng)該還是用在對(duì)工藝內(nèi)動(dòng)作的選擇上面?赡苄枰啻螆(zhí)行一個(gè)動(dòng)作的時(shí)候,或者是判斷料號(hào),料量的選擇。
循環(huán)結(jié)構(gòu)用得最多應(yīng)該還是在主程序進(jìn)入后的while(1)以及最后的endwhile結(jié)束。
循環(huán)結(jié)構(gòu)我用得比較少,因?yàn)槲乙话阒鞒绦蜓h(huán)我是使用條件分支進(jìn)行跳轉(zhuǎn),終止條件不達(dá)到就能一直按照我們?cè)O(shè)定的流程走下去。
=======================
基礎(chǔ)應(yīng)用到上面這里就差不多完結(jié)了。畢竟機(jī)器人入門是比較簡(jiǎn)單的,坐標(biāo),動(dòng)作,邏輯,三劍客熟悉之后,新手跟老鳥的差別就要開始慢慢拉開距離了。
前菜:
之前在做機(jī)床上下料的時(shí)候,最開始只有幾十個(gè)料位,對(duì)點(diǎn)位還是比較簡(jiǎn)單,到了后來(lái)512個(gè)料位,加上64個(gè)刀位,一個(gè)料位有取料動(dòng)作跟放料動(dòng)作,對(duì)應(yīng)取料治具跟放料治具,也就是總的要1024+128個(gè)位置要對(duì),然后加上每個(gè)位置需要有迫近位,取料位,離開位,也就是(1024+128)*3,這工作量就嘿嘿嘿了,單純基礎(chǔ)的1024個(gè)點(diǎn)位就要對(duì)兩天,對(duì)完手都是抖動(dòng)的,更別說(shuō)還不知這個(gè)數(shù)量。所以后來(lái)上來(lái)先搞坐標(biāo)系,然后對(duì)點(diǎn)的時(shí)候使用同一的坐標(biāo)方向,上下左右前后都統(tǒng)一規(guī)定,使用統(tǒng)一的方向進(jìn)行,后面對(duì)點(diǎn)就方便一點(diǎn)。此外摸索規(guī)律也很重要,基本動(dòng)作可以分迫近位,取料位,離開位,那便是取放都可以通用同一種距離,只不過(guò)動(dòng)作反過(guò)來(lái)進(jìn)行而已。后面其實(shí)就都是只對(duì)一個(gè)取料點(diǎn)跟放料點(diǎn),其他都是使用偏移指令進(jìn)行點(diǎn)位數(shù)據(jù)的偏移,這樣又簡(jiǎn)單又快捷,只不過(guò)前期的坐標(biāo)系一定要對(duì)好還有就是方向要規(guī)定好,精度必須保證好。做好這個(gè)其實(shí)后面工作就解決了大概1/2.調(diào)試時(shí)間也能減少很多。
偏移指令在大量點(diǎn)位重復(fù)動(dòng)作 的情況下是非常節(jié)省人工效率的一個(gè)操作方法,但是前提的條件是你對(duì)坐標(biāo)系需要做到比較靈活的應(yīng)用。不會(huì)因?yàn)檎{(diào)用出錯(cuò)導(dǎo)致撞機(jī)。
小菜:
說(shuō)到大規(guī)模重復(fù)動(dòng)作就不得不說(shuō)碼垛這個(gè)指令了,偏移指令還需要進(jìn)行基礎(chǔ)點(diǎn)位的示教。但是機(jī)器人就是為了節(jié)約時(shí)間降低調(diào)試難度而升的。所以,當(dāng)你的動(dòng)作基本都是重復(fù)且距離都是一致的情況,碼垛作為一個(gè)解決方法,不得不說(shuō)它真的很省事。僅需要示教三到四個(gè)位置,輸入碼垛行數(shù)與列數(shù),運(yùn)行時(shí)候?qū)懭爰拇嫫鲾?shù)值,機(jī)器人會(huì)自動(dòng)運(yùn)算進(jìn)行位置尋找。一個(gè)料架128個(gè)位置,你只需要進(jìn)行三到四個(gè)位置的對(duì)點(diǎn)工作。原先一天的工作量,半小時(shí)不到你就做完并驗(yàn)證好了。剩下時(shí)間就是放松身心了。不過(guò)碼垛要求精度的話你就祈禱加工商把精度做到位了,不然可能某個(gè)時(shí)候你撞機(jī)都不知道怎么撞得。
[ 此帖被陳惠鑫在2021-09-25 09:01重新編輯 ]