该脚本是一个Lua脚本,主要实现了一个UR5机械臂的控制,该机械臂通过视觉传感器和传送带传感器来完成物品的抓取和堆叠。代码主要分为三个函数:

  1. suctionCupCmd(command)

该函数用于控制机械臂的吸盘,当参数command为'on'时,机械臂的吸盘打开;当参数command为'off'时,机械臂的吸盘关闭。

  1. enableIk(enable)

该函数用于控制机械臂的运动学逆解器(IK),当参数enable为true时,机械臂进入IK模式;当参数enable为false时,机械臂退出IK模式。

  1. sysCall_threadmain()

该函数是脚本的主函数,其中包含了机械臂的运动控制和物品的抓取和堆叠过程。代码首先获取了机械臂的关节句柄和IK相关的句柄,同时设置了机械臂的运动参数。接着进入了一个while循环,不断等待视觉传感器的信号,并根据传感器的信号控制机械臂的运动,完成对物品的抓取和堆叠。其中,机械臂的运动状态受到传送带传感器信号的影响,当传送带上有物品时,机械臂会将物品抓取并堆叠;当传送带上没有物品时,机械臂会将已堆叠的物品取出并重新堆叠。最后,当仿真结束时,机械臂退出IK模式。

function suctionCupCmd(command)
    modelBase=sim.getObjectAssociatedWithScript(sim.handle_self)
    modelName=sim.getObjectName(modelBase)
    if(command=='on') then
        sim.setIntegerSignal(modelName ..'_suctionCup',1)
    else if(command=='off') then
        sim.setIntegerSignal(modelName ..'_suctionCup',0)
        end
    end
end

enableIk=function(enable)
    if enable then
        sim.setObjectMatrix(ikTarget,-1,sim.getObjectMatrix(ikTip,-1))
        for i=1,#jointHandles,1 do
            sim.setJointMode(jointHandles[i],sim.jointmode_ik,1)
        end

        sim.setExplicitHandling(ikGroupHandle,0)
    else
        sim.setExplicitHandling(ikGroupHandle,1)
        for i=1,#jointHandles,1 do
            sim.setJointMode(jointHandles[i],sim.jointmode_force,0)
        end
    end
end

function sysCall_threadmain()

    jointHandles={-1,-1,-1,-1,-1,-1}
    for i=1,6,1 do
        jointHandles[i]=sim.getObjectHandle('UR5_joint'..i)
    end
    
    ikGroupHandle=sim.getIkGroupHandle('UR5')
    ikTip=sim.getObjectHandle('UR5_ik')
    ikTarget=sim.getObjectHandle('UR5_target')
    waitHandle = sim.getObjectHandle('wait')
    cam = sim.getObjectHandle('Vision_sensor0')
    sensor=sim.getObjectHandle('Beltsensor')

    -- Set-up some of the RML vectors:
    vel=180
    accel=40
    jerk=80
    currentVel={0,0,0,0,0,0,0}
    currentAccel={0,0,0,0,0,0,0}
    maxVel={vel*math.pi/180,vel*math.pi/180,vel*math.pi/180,vel*math.pi/180,vel*math.pi/180,vel*math.pi/180}
    maxAccel={accel*math.pi/180,accel*math.pi/180,accel*math.pi/180,accel*math.pi/180,accel*math.pi/180,accel*math.pi/180}
    maxJerk={jerk*math.pi/180,jerk*math.pi/180,jerk*math.pi/180,jerk*math.pi/180,jerk*math.pi/180,jerk*math.pi/180}
    targetVel={0,0,0,0,0,0}

    ikMaxVel0={0.6,0.6,0.6,1.8}
    ikMaxAccel0={0.8,0.8,0.8,0.9}
    ikMaxVel={0.9,0.9,0.9,2.7}
    ikMaxAccel={1.2,1.2,1.2,1.35}
    ikMaxVel2={18,18,18,48}
    ikMaxAccel2={24,24,24,27}
    ikMaxJerk={0.6,0.6,0.6,0.8}
    
    position = {{-0.35,1.6},{-0.35,1.675},{-0.35,1.75},
                {-0.425,1.6},{-0.425,1.675},{-0.425,1.75},
                {-0.5,1.6},{-0.5,1.675},{-0.5,1.75}}
    tempposition = {-0.7,1.6}
    occupy={}
    for i=1,9,1 do
        occupy[i]=0
    end
    tempoccupy=0
    
    local waitPos = sim.getObjectPosition(waitHandle,-1)
    waitQuat = sim.getObjectQuaternion(waitHandle,-1)
    enableIk(true)
    sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,waitPos,waitQuat,nil)
    while true do
        if sim.getSimulationState()~=sim.simulation_advancing_abouttostop then
            sim.waitForSignal('arrive5')
            local data = {}
            data = sim.unpackTable(sim.readCustomDataBlock(cam, 'data'))
            if(#data~=0) then
                for i=1,#data,1 do
                    local size=0
                    sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{data[i][1],data[i][2],0.33},waitQuat,nil)
                    sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel0,ikMaxAccel0,ikMaxJerk,{data[i][1],data[i][2],0.30},waitQuat,nil)
                    sim.wait(0.1)
                    if sim.readProximitySensor(sensor)>0 then
                        size=1
                    end
                    if(size==1) then
                        sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel,ikMaxAccel,ikMaxJerk,{data[i][1],data[i][2],0.29},waitQuat,nil)
                    else
                        sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel,ikMaxAccel,ikMaxJerk,{data[i][1],data[i][2],0.28},waitQuat,nil)
                    end
                    suctionCupCmd('on')
                    sim.wait(0.08)
                    sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{data[i][1],data[i][2],0.38},waitQuat,nil)
                    if(i==#data) then
                        sim.setIntegerSignal('finish5',1)
                        sim.clearIntegerSignal('arrive5')
                    end
                    sim.setObjectOrientation(waitHandle, -1, {0,0,-data[i][3]})
                    local temp = sim.getObjectQuaternion(waitHandle, -1)
                    local targetQuat = {temp[1], temp[2], temp[3], temp[4]}
                    sim.setObjectOrientation(waitHandle, -1, {0,0,0})
                    if(size==0) then
                        local n=1
                        for j=1,9,1 do
                            if(occupy[j]~=2) then
                                n=n+1
                            else
                                break
                            end
                        end
                        if(n==10) then
                            sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{tempposition[1],tempposition[2],0.35},targetQuat,nil)
                            if(tempoccupy==0) then
                                height=0.04
                            else
                                height=0.04*tempoccupy+0.04
                            end
                            sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{tempposition[1],tempposition[2],height+0.1},targetQuat,nil)
                            sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel,ikMaxAccel,ikMaxJerk,{tempposition[1],tempposition[2],height+0.01},targetQuat,nil)
                            sim.wait(0.08)
                            suctionCupCmd('off')
                            sim.wait(0.05)
                            sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{tempposition[1],tempposition[2],0.33},targetQuat,nil)
                            tempoccupy=tempoccupy+1
                        else
                            sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{position[n][1],position[n][2],0.35},targetQuat,nil)
                            sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{position[n][1],position[n][2],0.22},targetQuat,nil)
                            sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel,ikMaxAccel,ikMaxJerk,{position[n][1],position[n][2],0.14+0.005},targetQuat,nil)
                            sim.wait(0.05)
                            suctionCupCmd('off')
                            sim.wait(0.05)
                            sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{position[n][1],position[n][2],0.33},targetQuat,nil)
                            occupy[n]=3
                        end
                    else
                        local m=1
                        for j=1,9,1 do
                            if(occupy[j]>=2) then
                                m=m+1
                            else
                                break
                            end
                        end
                        sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{position[m][1],position[m][2],0.35},targetQuat,nil)
                        sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{position[m][1],position[m][2],0.22},targetQuat,nil)
                        if(occupy[m]==0) then
                            height=0.05
                        else
                            height=0.05*occupy[m]+0.05
                        end
                        sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel,ikMaxAccel,ikMaxJerk,{position[m][1],position[m][2],height+0.005},targetQuat,nil)
                        sim.wait(0.05)
                        suctionCupCmd('off')
                        sim.wait(0.05)
                        sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{position[m][1],position[m][2],0.33},targetQuat,nil)
                        occupy[m]=occupy[m]+1
                    end
                end
            else
                sim.setIntegerSignal('finish5',1)
                sim.clearIntegerSignal('arrive5')
            end
            
            if(tempoccupy~=0) then
                local p=tempoccupy
                for i=1,p,1 do
                    local n=1
                    for j=1,9,1 do
                        if(occupy[j]~=2) then
                            n=n+1
                        else
                            break
                        end
                    end
                    if(n==10) then
                        sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,waitPos,waitQuat,nil)
                        break
                    else
                        high=0.04*tempoccupy
                        if(high>0.3) then
                            sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{tempposition[1],tempposition[2],high+0.1},waitQuat,nil)
                        else
                            --sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{tempposition[1],tempposition[2],0.3},waitQuat,nil)
                            sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{tempposition[1],tempposition[2],high+0.1},waitQuat,nil)
                            sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel,ikMaxAccel,ikMaxJerk,{tempposition[1],tempposition[2],high+0.005},waitQuat,nil)
                            sim.wait(0.05)
                            suctionCupCmd('on')
                            sim.wait(0.05)
                            sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{tempposition[1],tempposition[2],0.3},waitQuat,nil)
                            --sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{position[n][1],position[n][2],0.3},waitQuat,nil)
                            sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{position[n][1],position[n][2],0.22},waitQuat,nil)
                            sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel,ikMaxAccel,ikMaxJerk,{position[n][1],position[n][2],0.14+0.005},waitQuat,nil)
                            sim.wait(0.05)
                            suctionCupCmd('off')
                            sim.wait(0.05)
                            sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,{position[n][1],position[n][2],0.33},waitQuat,nil)
                            tempoccupy=tempoccupy-1
                            occupy[n]=3
                        end
                    end
                end
                sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,waitPos,waitQuat,nil)
            else
                sim.rmlMoveToPosition(ikTarget,-1,-1,nil,nil,ikMaxVel2,ikMaxAccel2,ikMaxJerk,waitPos,waitQuat,nil)
            end
        end
    end
    enableIk(false)
end

原文地址: https://www.cveoy.top/t/topic/oVD4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录