EC機(jī)器人微段插補(bǔ)
1. 簡介
微段插補(bǔ)(Micro-segment Interpolation) 是一種用于機(jī)器人精確軌跡控制的技術(shù),尤其在路徑復(fù)雜或精度要求高的任務(wù)中表現(xiàn)出色。微段插補(bǔ)通過將機(jī)器人運(yùn)動路徑劃分為多個(gè)微小的線段,逐段進(jìn)行插補(bǔ)計(jì)算,使得機(jī)器人能夠平滑且精確地沿著預(yù)定軌跡運(yùn)動,多用在涂膠領(lǐng)域。
2. 操作流程
JBI程序介紹
LOADML JOB:20240827_925
TIMER T=1.0 S
MOVEML VJ=50% IN#(0) JOB:20240827_925
UNLOADML JOB:20240827_925
MOVML 指令可以被用于機(jī)器人的離線軌跡規(guī)劃。其中 LOADML 指令是把離線軌跡文件
20240827_925.jbi 加載到內(nèi)存中去,UNLOADML 指令是把已經(jīng)加載在內(nèi)存中的 20240827_925 文件清空。
MOVML 指令是執(zhí)行一段已經(jīng)被加載在內(nèi)存中的 20240827_925 文件。其中 VJ 代表運(yùn)動到第一個(gè)點(diǎn)的
速度,IN#(0) 代表指令運(yùn)行需要被觸發(fā)的 Digital Input 變量,(0)就代表 Di0。
文件格式說明
微段插補(bǔ)程序,就是加載微段插補(bǔ)JBI文件,文件格式如下


說明: 如果 interval[1]ms 當(dāng)這個(gè)時(shí)間為 1 的時(shí)候,軌跡間隔和機(jī)器人控制器執(zhí)行間隔相
同,當(dāng)時(shí)間大于 1 的正整數(shù)的時(shí)候,MOVML 指令會在每個(gè)給出的軌跡點(diǎn)中間差值,確保控制
器可以每 1ms 拿到一個(gè)點(diǎn)位。
LUA代碼演示參考
采集機(jī)器人路徑,輸出微段插補(bǔ)文件
--[[
根據(jù)差值記錄用戶坐標(biāo)下的位置數(shù)據(jù)并寫入文件中
B0=1:開始記錄
B0=2:記錄結(jié)束
B0=3:開始寫入文件
jbi程序中連續(xù)修改B0狀態(tài)的時(shí)候中間盡量加個(gè)延時(shí)
當(dāng)B0=1前,需要先手動移動到初始點(diǎn)
當(dāng)B0=1時(shí),程序立馬開始判斷兩個(gè)點(diǎn)的間距,當(dāng)距離大于設(shè)定距離時(shí),就開始記錄點(diǎn)
!功能:
! 根據(jù)空間上兩個(gè)點(diǎn)的距離差 連續(xù)記錄 其在用戶坐標(biāo)系 下的數(shù)據(jù)g
! 生成一個(gè)后綴為jbi的ml文件
! ml的頭文件格式可以根據(jù)需要自動生成
]]--
sleep(0.5)
--\\定義要計(jì)算的空間上的兩點(diǎn)間距差 單位:mm
PPD_value = 0.1
folder="glue_path" --存放記錄path文件的文件夾名
user_frame={}
user_frame=get_user_frame(1) --用戶坐標(biāo)系
elite_print(user_frame[1],user_frame[2],user_frame[3],user_frame[4],user_frame[5],user_frame[6])
----------------------------------------------------------------------------------
--\\計(jì)算兩點(diǎn)(x/y/z)之間的間距差
function PPDistance(p1,p2)
--兩點(diǎn)空間上的距離
return
math.sqrt(((p1[1]-p2[1])*(p1[1]-p2[1]))+((p1[2]-p2[2])*(p1[2]-p2[2]))+((p1[3]-p2[3])*(p1[3]-p2[3])))
end
--\\ml文件title
function MovemlTitle(interval,refJointPos,length,postype,refFrame)
io.write("//trajfile\n")
io.write("version2.15.0\n")
io.write("interval ["..interval.."]ms\n")
io.write("refJointPos ["..refJointPos[1]..","..refJointPos[2]..","..refJointPos[3]..","..refJointPos[4]..","..refJointPos[5]..","..refJointPos[6].."]\n")
io.write("length ["..length.."]\n")
io.write("postype ["..postype.."]\n")
io.write("outputNumber [2]\n")
io.write("refFrame ["..refFrame[1]..","..refFrame[2]..","..refFrame[3]..","..refFrame[4]..","..refFrame[5]..","..refFrame[6].."]\n")
end
--\\按照當(dāng)前時(shí)間生成一個(gè)帶.jbi后;件名
function CreateFilename()
local date = os.date("*t")
return date.year..string.format("%02d",date.month)..string.format("%02d",date.day).."_"..date.hour..date.min..".jbi"
end
--\\傳入一個(gè)列表,寫文件
function Writefile(lists,ref_Frame)
user_pose={}
for i=1,#lists do
-- io.write("["..write_pose[i][1]..","..write_pose[i][2]..","..write_pose[i][3]..","..write_pose[i][4]..","..write_pose[i][5]..","..write_pose[i][6].."]")
user_pose = pose_mul(pose_inv(ref_Frame),lists[i])
io.write("["..user_pose[1]..","..user_pose[2]..","..user_pose[3]..","..user_pose[4]..","..user_pose[5]..","..user_pose[6].."]")
io.write("\n")
end
end
--\\持續(xù)點(diǎn)位記錄
function RecoedPPDis()
repeat
B0 = get_global_variable("B0")
Now_pose = get_robot_pose()
if(PPDistance(Begin_pose,Now_pose) >= PPD_value) then
write_pose[i] = Now_pose
Begin_pose = Now_pose
i = i+1
end
elite_print("Recording, wait B0 == 2")
until(B0 == 2)
end
----------------------------------初始化--------------------------------
set_global_variable("B0",0)
Begin_pose = {}
Begin_joint = {}
Now_pose = {}
write_pose = {}
i = 1
-----------------------------------Main---------------------------------
repeat
B0 = get_global_variable("B0")
elite_print("wait B0 == 1")
until(B0 == 1)
Begin_pose = get_robot_pose()
Begin_joint = get_robot_joint()
--!當(dāng)B0=0時(shí),jbi開始運(yùn)動
set_global_variable("B0",0)
RecoedPPDis()
repeat
B0 = get_global_variable("B0")
elite_print("wait B0 == 3")
elite_print("采點(diǎn)共:"..#write_pose)
until(B0 == 3)
----------------------------------------寫文件--------------------------------------------
elite_print("write file begin")
elite_print("please wait")
filename = CreateFilename()
elite_print(filename:sub(13))
file = io.open(filename,"w+")
io.output(file)
--\\ml文件的title
MovemlTitle(1,Begin_joint,#write_pose,"pose",user_frame)
Writefile(write_pose,user_frame)
elite_print("write file done")
io.close()
3. 常見問題解答
注意事項(xiàng):
如果機(jī)器人運(yùn)行離線軌跡時(shí)明顯震動,說明加速太猛,時(shí)間和距離不對等,需要對 interval [*]ms 即采樣時(shí)間進(jìn)行更改,例如將 interval [1]ms改為interval[10]ms。