JBI中微段轨迹MOVML的使用


可以通过离线仿真软件或者LUA等计算方式,获得等时间间隔的轨迹点(例如每10ms,最小可至1ms)。这些轨迹点位可以是Joint或者笛卡尔空间的。

机器人基于以上离线轨迹,可以方便实现匀速运动(例如等时间等距离的轨迹)

机器人希望可以实现以下圆形轨迹。圆形轨迹通过lua计算并获得对应的微段轨迹.jbi文件


JBI文件如下:

C00000=-36.0656,-111.4706,105.1191,-83.6512,90.0004,53.8920
NOP
SET D002 50
// 设置圆的半径
SET D003 5
// 设置圆每1°,机器人运行的时间,单位ms
SET D004 360
// 设置插补的总个数
SETJOINT P000 -36.0656,-111.4706,105.1191,-83.6508,90.0004,53.8920
SETJOINT P001 -36.0656,-110.7748,99.8632,-79.0914,90.0004,53.8920
SET B000 0
MOVJ P001 VJ=100% CR=0.0MM ACC=50 DEC=50
MOVL P000 V=100.0MM/S CR=0.0MM ACC=50 DEC=50
SET B000 1
// 生成笛卡尔空间的微段插补轨迹的JBI文件
// 微段轨迹的jbi文件也可通过第三方离线软件生成,注意生成的文件格式
WAIT B000=2
MOUT M#(528) ON
LOADML JOB:mFileCart
// 加载微段轨迹JBI
MOVML VJ=100% M#(528) JOB:mFileCart
// 机器人移动到开始位置,并等待信号为1后,开始运行微段轨迹
UNLOADML JOB:mFileCart
SET B000 0
//
// 重新计算圆轨迹,插补成joint格式
TIMER T=1 S
SET B000 3
// 生成Joint空间的微段插补轨迹的JBI文件
WAIT B000=4
MOUT M#(528) ON
LOADML JOB:mFileJoint
// 加载微段轨迹JBI
MOVML VJ=100% M#(528) JOB:mFileJoint
// 机器人移动到开始位置,并等待信号为1后,开始运行微段轨迹
UNLOADML JOB:mFileJoint
SET B000 0
END


后台生成微段轨迹的lua代码如下:

function Movml_generator()
    local pStart = get_tcp_pose()
    pStart[1] = pStart[1] +R
    local c_joint = get_robot_joint()
    file = io.open("mFileCart.jbi", "w")
    io.output(file)
    io.write("//trajfile\n")
    io.write("version2.15\n")
    io.write("interval ["..string.format('%d',interval_time).."]ms\n")
    local s_joint = string.format('[%.2f,%.2f,%.2f,%.2f,%.2f,%.2f]',c_joint[1],c_joint[2],c_joint[3],c_joint[4],c_joint[5],c_joint[6])
    io.write('refJointPos '..s_joint..'\n') -- 设置第一个点的参考关节角度
    io.write("length ["..string.format('%d',ttl_length).."]\n")
    io.write("postype [pose]\n") -- 点位类型是Pose笛卡尔
    io.write("outputNumber [2]\n")
    io.write("refFrame [0.0,0.0,0.0,0.0,0.0,0.0]\n") -- 参考坐标系

    Pout = {pStart[1], pStart[2], pStart[3], pStart[4], pStart[5], pStart[6]}
    -- 实际输出的位置
    for i = 1, 360, 1 do
        Pout[1] = pStart[1] - R* math.cos(math.rad(i))
        Pout[2] = pStart[2] + R* math.sin(math.rad(i))
        local v = string.format('[%.2f,%.2f,%.2f,%.5f,%.5f,%.5f]', Pout[1], Pout[2], Pout[3], Pout[4], Pout[5], Pout[6])
        io.write(v..'\n')
    end
    io.close(file)
    elite_print("轨迹已经保存到mFileCart.jbi")
end

function Movml_generator2()
    local pStart = get_tcp_pose()
    pStart[1] = pStart[1] +R
    local c_joint = get_robot_joint()
    file = io.open("mFileJoint.jbi", "w")
    io.output(file)
    io.write("//trajfile\n")
    io.write("version2.15\n")
    io.write("interval ["..string.format('%d',interval_time).."]ms\n")
    local s_joint = string.format('[%.2f,%.2f,%.2f,%.2f,%.2f,%.2f]',c_joint[1],c_joint[2],c_joint[3],c_joint[4],c_joint[5],c_joint[6])
    io.write('refJointPos '..s_joint..'\n') -- 设置第一个点的参考关节角度
    io.write("length ["..string.format('%d',ttl_length).."]\n")
    io.write("postype [joint]\n") -- 点位类型是Joint
    io.write("outputNumber [2]\n")
    io.write("refFrame [0.0,0.0,0.0,0.0,0.0,0.0]\n") --参考坐标系

    Pout = {pStart[1], pStart[2], pStart[3], pStart[4], pStart[5], pStart[6]}
    -- 实际输出的位置
    for i = 1, 360, 1 do
        Pout[1] = pStart[1] - R* math.cos(math.rad(i))
        Pout[2] = pStart[2] + R* math.sin(math.rad(i))
        local out1 = get_inv_kinematics(Pout)
        local p = string.format('[%.2f,%.2f,%.2f,%.5f,%.5f,%.5f]', out1[1], out1[2], out1[3], out1[4], out1[5], out1[6])
        io.write(p..'\n')
    end
    io.close(file)
    elite_print("轨迹已经保存到mFileJoint.jbi")
end

sleep(0.3)
interval_time = 1-- 设置插补间隔时间
R = 0 --圆的半径
CT = 1 -- 整圆的时间
ttl_length = 1-- 插补总点数
set_global_variable("B000", 0)
while true do
    B000 = get_global_variable("B0")
    if B000 == 1 then
        R = get_global_variable("D002") --获取圆的半径
        ttl_length = get_global_variable("D004") -- 获取-- 插补总点数
        interval_time = get_global_variable("D003") -- 设置插补间隔时间
        Movml_generator()
        -- 产生笛卡尔空间的位置数据
        set_global_variable('B000',2)
    end
    if B000 == 3 then
        Movml_generator2()
        --产生joint类型的位置数据
        set_global_variable('B000',4)
    end
    sleep(0.5)
end


产生的mFileCart.jbi文件部分内容如下:

//trajfile
version2.15
interval [5]ms
refJointPos [-36.07,-111.47,105.12,-83.65,90.00,53.89]
length [360]
postype [pose]
outputNumber [2,3] #后续可以控制DO2,DO3
refFrame [0.0,0.0,0.0,0.0,0.0,0.0]
[266.31,-64.94,199.83,-3.14157,0.00004,-3.14085]
[266.34,-64.07,199.83,-3.14157,0.00004,-3.14085]
[266.37,-63.19,199.83,-3.14157,0.00004,-3.14085]
output [2,1] #经过此点,将DO2置为1,方括号内不能有空格,信号控制不要出现在整个点位的最后两行
[266.43,-62.32,199.83,-3.14157,0.00004,-3.14085]
[266.50,-61.45,199.83,-3.14157,0.00004,-3.14085]

产生的mFileJoint.jbi文件部分内容如下:

//trajfile
version2.15
interval [5]ms
refJointPos [-36.10,-111.46,105.11,-83.66,90.00,53.86]
length [360]
postype [joint]
outputNumber [2]
refFrame [0.0,0.0,0.0,0.0,0.0,0.0]
[-35.96,-111.50,105.14,-83.63975,90.00038,54.00087]
[-35.79,-111.55,105.17,-83.62288,90.00037,54.16349]
[-35.63,-111.58,105.19,-83.60760,90.00036,54.32847]
[-35.46,-111.62,105.21,-83.59391,90.00036,54.49572]
[-35.29,-111.65,105.23,-83.58184,90.00035,54.66517]
[-35.12,-111.68,105.25,-83.57139,90.00034,54.83674]
[-34.95,-111.70,105.26,-83.56258,90.00033,55.01036]
[-34.77,-111.72,105.27,-83.55543,90.00033,55.18594]
[-34.59,-111.73,105.28,-83.54992,90.00032,55.36341]
点击显示全文
赞同0
发表评论
分享

手机扫码分享
0
685
收藏
举报
收起
登录
  • 密码登录
  • 验证码登录
还没有账号,立即注册
还没有账号,立即注册
注册
已有账号,立即登录
选择发帖板块
上传文件
举报
请选择举报理由
举报
举报说明