EC机器人微段插补
1. 简介
微段插【wēi duàn chā】补(Micro-segment Interpolation) 是一种用于机🏓器人精🌡确轨迹控制的【kòng zhì de】技术💽,尤其在路径复杂或精度要求🏉高的任务中表现出色【xiàn chū sè】。微段插【wēi duàn chā】补通过💍将机器【jiāng jī qì】⛺人运动【rén yùn dòng】🍬路径划🍢分为多【fèn wéi duō】🐱个微小的线段🏹,逐段进【zhú duàn jìn】行插补计算,使得机【shǐ dé jī】器人能够平滑且精确地沿着预定轨【yù dìng guǐ】迹运动,多用在【duō yòng zài】🐄涂胶领域【yù】。
2. 操作流程
JBI程序介绍
LOADML JOB:20240827_925
TIMER T=1.0 S
MOVEML VJ=50% IN#(0) JOB:20240827_925
UNLOADML JOB:20240827_925
MOVML 指令可【zhǐ lìng kě】🧣以被用于机器人的离线轨迹规划【guī huá】。其中🔗 LOADML 指令是把离线💙轨迹文【guǐ jì wén】件【jiàn】🗝
20240827_925.jbi 加载到【jiā zǎi dào】内存中去,UNLOADML 指令是把已经【bǎ yǐ jīng】💬加载在内存中的【de】🏆 20240827_925 文件清🕧空。
MOVML 指令是🏓执行一【zhí háng yī】段已经被加载在内存中的【zhōng de】🛒 20240827_925 文件。其中【qí zhōng】 VJ 代表运动到第【dòng dào dì】🚅一个点🌏的
速度【sù dù】✴,IN#(0) 代表指🦒令运行需要被触发的【chù fā de】🏎 Digital Input 变量,(0)就代表【jiù dài biǎo】 Di0。
文件格式说明
微段插补【chā bǔ】📽程序,就是加载微段【zǎi wēi duàn】插补【chā bǔ】📽JBI文件🕓,文件🕓格式如下【xià】🚗


说明【shuō míng】🎙: 如果【rú guǒ】 interval[1]ms 当这个【dāng zhè gè】🛎时间为 1 的时候,轨迹间隔和机【gé hé jī】器人控🍯制器执行间隔🎎相
同🈂,当时间【dāng shí jiān】大于 1 的正整🤥数的时【shù de shí】候【hòu】🖌,MOVML 指令会在每个给出的【gěi chū de】轨迹点【guǐ jì diǎn】中间差⌛值🤤,确保控制
器可以每 1ms 拿到一个点位。
LUA代码演示参考
采集机器人路径,输出微段插补文件
--[[
根据差【gēn jù chà】值记录【lù】📊用户坐【yòng hù zuò】标下的【biāo xià de】🔫位置数🌬据并写入文件中🌤
B0=1:开始记录【lù】📊
B0=2:记录【lù】📊结束
B0=3:开始写入文件
jbi程序中🌤连续修改【gǎi】B0状态的时候中【shí hòu zhōng】🍥间尽量加个延【jiā gè yán】时【shí】
当⛑B0=1前【qián】👬,需要先【xū yào xiān】手动【shǒu dòng】👘移动到初【chū】🎏始点🥤
当⛑B0=1时【shí】,程序立【chéng xù lì】马开始判断两🉑个点的间距,当距离【dāng jù lí】🍝大于设定距离😬时【shí】,就开始【jiù kāi shǐ】😲记录【lù】📊点
!功能🥞:
! 根据空间上两【jiān shàng liǎng】个点的距离差【jù lí chà】 连续记💁录【lù】📊 其在用户坐【yòng hù zuò】标系【xì】😄 下的数据g
! 生成【shēng chéng】一🤕个后缀为🌛jbi的ml文件
! ml的头文件格式🛹可以根💷据需要🍃自动👘生成【shēng chéng】
]]--
sleep(0.5)
--\\定义要【dìng yì yào】计算的📧空间上的两点【de liǎng diǎn】间距差【jiān jù chà】 单位【dān wèi】🐶:mm
PPD_value = 0.1
folder="glue_path" --存放记录【lù】📊path文件的文件夹📉名【míng】
user_frame=}
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
--\\持续点【chí xù diǎn】位记录【wèi jì lù】📊
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
----------------------------------初始化【chū shǐ huà】--------------------------------
set_global_variable("B0",0)
Begin_pose = }
Now_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()
--!当⛑B0=0时【shí】,jbi开始运动👘
set_global_variable("B0",0)
RecoedPPDis()
repeat
B0 = get_global_variable("B0")
elite_print("wait B0 == 3")
elite_print("采点共:"..#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. 常见问题解答
注意事项:
如果机器人运行离线🏩轨迹时💛明显震动🏊,说明加速太猛【sù tài měng】,时间和【shí jiān hé】距离不⛩对等【duì děng】🔞,需要对【xū yào duì】 interval [*]ms 即采样✝时间进行更改【háng gèng gǎi】,例如将【lì rú jiāng】 interval [1]ms改为interval[10]ms。