EC机器人微段插补

2025-01-22

1.  简介

微段插补(Micro-segment Interpolation) 是一种用于机器人精确轨迹控制的技术,尤其在路径复杂或精度要求高的任务中表现出色。微段插补通过将机器人运动路径划分为多个微小的线段,逐段进行插补计算,使得机器人能够平滑且精确地沿着预定轨迹运动,多用在涂胶领域。

2.  操作流程

JBI程序介绍


LOADML JOB:20240827_925
TIMER T=1.0 S
MOVEML VJ=50% IN#(0) JOB:20240827_925
UNLOADML JOB:20240827_925


MOVML 指令可以被用于机器人的离线轨迹规划。其中 LOADML 指令是把离线轨迹文件

20240827_925.jbi 加载到内存中去,UNLOADML 指令是把已经加载在内存中的 20240827_925 文件清空。

MOVML 指令是执行一段已经被加载在内存中的 20240827_925 文件。其中 VJ 代表运动到第一个点的

速度,IN#(0) 代表指令运行需要被触发的 Digital Input 变量,(0)就代表 Di0。

文件格式说明

微段插补程序,就是加载微段插补JBI文件,文件格式如下


说明: 如果 interval[1]ms 当这个时间为 1 的时候,轨迹间隔和机器人控制器执行间隔相

同,当时间大于 1 的正整数的时候,MOVML 指令会在每个给出的轨迹点中间差值,确保控制

器可以每 1ms 拿到一个点位。

LUA代码演示参考

采集机器人路径,输出微段插补文件


--[[
根据差值记录用户坐标下的位置数据并写入文件中
B0=1:开始记录
B0=2:记录结束
B0=3:开始写入文件

jbi程序中连续修改B0状态的时候中间尽量加个延时

当B0=1前,需要先手动移动到初始点
当B0=1时,程序立马开始判断两个点的间距,当距离大于设定距离时,就开始记录点

!功能:
!   根据空间上两个点的距离差 连续记录 其在用户坐标系 下的数据g
!   生成一个后缀为jbi的ml文件
!   ml的头文件格式可以根据需要自动生成
]]--
sleep(0.5)
--\\定义要计算的空间上的两点间距差  单位:mm
PPD_value = 0.1                
folder="glue_path"             --存放记录path文件的文件夹名
user_frame={}
user_frame=get_user_frame(1)    --用户坐标系
elite_print(user_frame[1],user_frame[2],user_frame[3],user_frame[4],user_frame[5],user_frame[6])
----------------------------------------------------------------------------------
--\\计算两点(x/y/z)之间的间距差
function PPDistance(p1,p2)
   --两点空间上的距离
   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

--\\按照当前时间生成一个带.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

--\\传入一个列表,写文件
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

--\\持续点位记录
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()

--!当B0=0时,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.  常见问题解答

注意事项:

如果机器人运行离线轨迹时明显震动,说明加速太猛,时间和距离不对等,需要对 interval [*]ms 即采样时间进行更改,例如将 interval [1]ms改为interval[10]ms。





download-669.svg comicon14.svg

电话咨询

download-397.svg comicon15.svg

免费试用

Vector.svg Frame.svg

微信小程序

img1.jpg

微信小程序

准备好突破增长瓶颈,开启智能制造了吗?
了解我们的机器人如何帮助您的业务增长
欢迎下载艾利特机器人资料

我已阅读并同意艾利特《隐私政策》《法律声明》

我已知晓并同意艾利特通过电子邮件发送相关资料

提交