function sysCall_init()
    -- 初始化函数,在脚本加载时调用
    camera = sim.getObjectAssociatedWithScript(sim.handle_self)
    sensor = sim.getObjectHandle('conveyorBelt_sensor#0')
    view = sim.floatingViewAdd(0.9, 0.55, 0.2, 0.1, 0)
    sim.adjustView(view, camera, 64)
    res = sim.getVisionSensorResolution(camera)
    cam_pos = sim.getObjectPosition(camera, -1)
    cam_x = 1 -- 视角宽度
    cam_y = 0.25
    ProximitySensor = 0
    ProximitySensorprevious = 0
    tick = 0
end


function sysCall_actuation()
    -- 执行函数,在每个仿真步骤中调用,本脚本中未使用
end


function sysCall_vision(inData)
    -- 视觉处理函数,在每个仿真步骤中调用
    local data = {}
    ProximitySensorprevious = ProximitySensor
    ProximitySensor = sim.readProximitySensor(sensor)
    local handler = inData.handle
    if (ProximitySensorprevious <= 0) and (ProximitySensor > 0) then
        -- 当传感器检测到物体时
        local packet = {}
        local data = {}
        simVision.sensorImgToWorkImg(handler)  -- 传感器图像转换到工作图像
        -- 颜色选择
        simVision.selectiveColorOnWorkImg(inData.handle, {1.00, 0.29, 0.21}, {0.15, 0.15, 0.15}, true, false, true)
        simVision.selectiveColorOnWorkImg(inData.handle, {0.28, 1, 0.21}, {0.15, 0.15, 0.15}, true, true, false)
        simVision.addBuffer1ToWorkImg(inData.handle) -- 将缓存1添加到工作图像
        -- 边缘检测
        local _, ans = simVision.blobDetectionOnWorkImg(handler, 0.1, 0, false)
        packet = sim.unpackFloatTable(ans)
        local blobCount = packet[1]  -- 检测到的物体数量
        local dataSizePerBlob = packet[2]  -- 每个物体的数据大小
        -- 提取物体信息
        for i = 1, blobCount, 1 do
            local blobRelativeSize = packet[2 + (i - 1) * dataSizePerBlob + 1]
            local blobOrientation = packet[2 + (i - 1) * dataSizePerBlob + 2]
            local blobRelativePos = {packet[2 + (i - 1) * dataSizePerBlob + 3], packet[2 + (i - 1) * dataSizePerBlob + 4]}
            local realposX = cam_pos[1] + cam_x / 2 - cam_x * packet[2 + (i - 1) * dataSizePerBlob + 3] - 0.012
            local realposY = cam_pos[2] + cam_y / 2 - cam_y * packet[2 + (i - 1) * dataSizePerBlob + 4]
            local blobBoxRelativeDimensions = {packet[2 + (i - 1) * dataSizePerBlob + 5], packet[2 + (i - 1) * dataSizePerBlob + 6]}
            local blobCol = sim.getVisionSensorImage(camera, res[1] * blobRelativePos[1], res[2] * blobRelativePos[2], 1, 1, 0)
            local colorCode = 'unknown'
            if (blobCol[1] > blobCol[2]) and (blobCol[1] > blobCol[3]) then
                colorCode = 'red'
            end
            if (blobCol[2] > blobCol[1]) and (blobCol[2] > blobCol[3]) then
                colorCode = 'green'
            end
            data[i] = {realposX, realposY, colorCode} -- 存储物体位置和颜色信息
        end
        -- 对物体位置进行排序
        for i = 1, #data - 1, 1 do
            for j = 1, #data - i, 1 do
                if (data[j][1] > data[j + 1][1]) then
                    local relay = {}
                    relay = data[j]
                    data[j] = data[j + 1]
                    data[j + 1] = relay
                end
            end
        end
        -- 将数据传递给其他脚本
        sim.writeCustomDataBlock(handler, 'data3', sim.packTable(data))
        sim.setIntegerSignal('getdata', 1)
        simVision.workImgToSensorImg(handler) -- 将工作图像转换回传感器图像
    end
    -- 处理完成信号
    if (sim.getIntegerSignal('finishDone') == 1) then
        data = {}
        sim.writeCustomDataBlock(handler, 'data3', sim.packTable(data))
        sim.clearIntegerSignal('finishDone')
    end
end

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

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