EC机器人微段插补
1. 简介
微段插【wēi duàn chā】🙂补🌀(Micro-segment Interpolation) 是一种用于机【yòng yú jī】器人精确轨迹控制的技术,尤其在➡路径复🏣杂或精度要求【dù yào qiú】🏫高的任务中表现出色【xiàn chū sè】。微段插【wēi duàn chā】🙂补通过🕙将机器人运动🈂路径划分为多个微小的线段,逐段进🎋行插补🌀计算【jì suàn】,使得机器人能【qì rén néng】够平滑【gòu píng huá】😿且精确【qiě jīng què】地沿着📁预定轨迹运动,多用在涂胶领【tú jiāo lǐng】💵域【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 指令可以被用【yǐ bèi yòng】于机器人的离💰线轨迹🙋规划。其中【qí zhōng】 LOADML 指令是把离线【bǎ lí xiàn】🏂轨迹文件【jiàn】🌿
20240827_925.jbi 加载到内存中🕡去,UNLOADML 指令是【zhǐ lìng shì】👡把已经加载在内存中🕡的【de】⏪ 20240827_925 文件清空【kōng】。
MOVML 指令是【zhǐ lìng shì】🚸执行一段已经被加载🚡在内存🤦中的【de】 20240827_925 文件。其中【qí zhōng】 VJ 代表运动到第一个点【yī gè diǎn】🧜的【de】
速度,IN#(0) 代表指【dài biǎo zhǐ】令运行【lìng yùn háng】💀需要被触发的 Digital Input 变量🎨,(0)就代表【jiù dài biǎo】🐼 Di0。
文件格式说明
微段插【wēi duàn chā】补💗程序【chéng xù】,就是加载微段插【wēi duàn chā】补💗JBI文件🕝,文件🕝格式如【gé shì rú】下


说明🎹: 如果【rú guǒ】✂ interval[1]ms 当这个【dāng zhè gè】时间为【shí jiān wéi】 1 的时候🚇,轨迹间隔和机器人控制器执🌍行间隔相【xiàng】
同,当时间大于【dà yú】📟 1 的正整数的时候🍽,MOVML 指令会【zhǐ lìng huì】在每个给出的轨迹点【guǐ jì diǎn】中间差😔值👩,确保控【què bǎo kòng】制【zhì】🙅
器可以每 1ms 拿到一个点位。
LUA代码演示参考
采集机器人路径,输出微段插补文件
--[[
根据🌷差值记录【jì lù】🕥用户坐【hù zuò】💤标下的位置数【wèi zhì shù】😱据🌷并写入【bìng xiě rù】文件【wén jiàn】🌗中
B0=1:开始记【kāi shǐ jì】录【lù】🕥
B0=2:记录结【jì lù jié】📱束
B0=3:开始写入文件【wén jiàn】🌗
jbi程序中【chéng xù zhōng】连续修🏿改【gǎi】🥛B0状态的时候中【shí hòu zhōng】⛄间尽量【jiān jìn liàng】🐐加个延【jiā gè yán】时
当B0=1前,需要先手动移动到初始点
当B0=1时,程序立【chéng xù lì】🍿马开始判断两个点的【gè diǎn de】间距,当距离🥛大于设定距离【dìng jù lí】时,就开始记【kāi shǐ jì】录【lù】🕥点
!功能【gōng néng】:
! 根据🌷空间上【kōng jiān shàng】两😍个点的【gè diǎn de】距离差 连续记【lián xù jì】⛸录【lù】🕥 其在用户坐【hù zuò】💤标系 下的数😑据🌷g
! 生成一🍩个后缀🥎为jbi的ml文件【wén jiàn】🔁
! ml的头文【de tóu wén】件🔁格式可以根📶据需要🐋自动生成
]]--
sleep(0.5)
--\\定义要计算的空间上【kōng jiān shàng】的两点间距差【jiān jù chà】 单位:mm
PPD_value = 0.1
folder="glue_path" --存放记【cún fàng jì】🚐录【lù】🕥path文件【wén jiàn】的🌫文件【wén jiàn】🔁夹名【jiá 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
--\\持续点📗位记录【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
----------------------------------初始化📝--------------------------------
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时,jbi开始运动
set_global_variable("B0",0)
RecoedPPDis()
repeat
B0 = get_global_variable("B0")
elite_print("wait B0 == 3")
elite_print("采点共【cǎi diǎn gòng】:"..#write_pose)
until(B0 == 3)
----------------------------------------写文件【wén jiàn】🔁--------------------------------------------
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文件【wén jiàn】的🌫title
MovemlTitle(1,Begin_joint,#write_pose,"pose",user_frame)
Writefile(write_pose,user_frame)
elite_print("write file done")
io.close()
3. 常见问题解答
注意事项:
如果机【rú guǒ jī】😨器人运行离线【háng lí xiàn】轨迹时🚊明显震动,说明加🤖速太猛【sù tài měng】🈳,时间和【shí jiān hé】🏂距离不对等,需要对🏝 interval [*]ms 即采样时间进【shí jiān jìn】行更改【háng gèng gǎi】,例如将 interval [1]ms改为interval[10]ms。