OpenCV实验箱---机械臂自由抓取例程开发使用手册

这篇具有很好参考价值的文章主要介绍了OpenCV实验箱---机械臂自由抓取例程开发使用手册。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、项目介绍

        项目背景:

        相机型号:

二、机械臂自由抓取演示 

        使用注意事项:

         操作步骤:

三、核心代码讲解

① 机械臂相关运动驱动代码

② BGR图像转换伪彩色深度图像代码

③ 目标跟随及抓取动作代码


开发者:居正

如果大家对这个项目感兴趣的话,可以评论或私聊我,加群进行交流。同时也可以关注3D视觉开发者社区哦。

一、项目介绍

        项目背景:

        基于奥比中光OpenCV实验箱,配合六自由度机械臂实现360度物体自由抓取,同时设置两种姿态配合桌面抓取和自由抓取,使机械爪能够精准的对目标进行抓取。

OpenCV实验箱---机械臂自由抓取例程开发使用手册,奥比中光产品系列开发使用说明,opencv,人工智能,计算机视觉,机械臂
OpenCV实验箱套装

        相机型号:

        OpenCV实验箱搭配了奥比中光目前最新的深度相机Gemini2,它十分小巧,方便嵌入到任何设备中,同时对图像深度信息采集十分精准,经过测试Gemini2可支持2米以上超长距离的物体识别与跟踪。

二、机械臂自由抓取演示 

机械臂自由抓取演示视频

        使用注意事项:

        因为机械臂长度有限制,所以在使用药瓶自由抓取的时候,尽可能与摄像头保持水平,过高过远都无法准确抓取。因为角度限制,使用大药瓶在进行桌面抓取时,会发生滑爪现象,所以尽量使用小药瓶进行桌面抓取,大药瓶仅可进行自由抓取,小药瓶无限制。

机械臂抓取范围
范围 \ 目标类型 大药瓶 小药瓶
高度 30---40cm 30---35cm
距离 以自身为圆心,半径为31cm以内距离 以自身为圆心,半径为30cm以内距离

         操作步骤:

        首先找到例程运行所在的文件夹Code202308,打开终端(Ctrl+alt+T),输入命令cd Desktop/,接着cd Robotic_arm_apps,运行例程文件 python3 free_pickup.py

OpenCV实验箱---机械臂自由抓取例程开发使用手册,奥比中光产品系列开发使用说明,opencv,人工智能,计算机视觉,机械臂

        显示上图界面代表运行例程成功,可以进行实验了。

三、核心代码讲解

        我将这里分成三个部分,分别是 ① 机械臂相关运动驱动代码 ② BGR图像转换伪彩色深度图像代码 ③ 目标跟随及抓取动作代码。

① 机械臂相关运动驱动代码

        下面代码是用来控制舵机对抓取动作位置的控制。x是中心铜柱到目标的抓取距离,y是抓取高度。

import math

def step(x = None, y = None):

    pi = 3.14

    L1 = 105     # L1
    L2 = 110     # L2
    L3 = 110     # L3

    if x is None:
        x = int(input("x:"))
    if y is None:
        y = int(input("y:"))
    theta = math.radians(0)

    Bx = x - L3 * math.cos(theta)
    By = y - L3 * math.sin(theta)

    lp = Bx**2 + By**2
    alpha = math.atan2(By, Bx)
    tmp = (L1*L1 + lp - L2*L2) / (2*L1*math.sqrt(lp))
    if tmp < -1:
        tmp = -1
    elif tmp > 1:
        tmp = 1
    beta = math.acos(tmp)
    q1 = -(pi/2.0 - alpha - beta)
    tmp = (L1*L1 + L2*L2 - lp) / (2*L1*L2)
    if tmp < -1:
        tmp = -1
    elif tmp > 1:
        tmp = 1
    q2 = math.acos(tmp) - pi
    q3 = - q1 - q2 - pi/2

    step_5 = int(2047 + int(math.degrees(q1) * 11.375))
    step_4 = int(2047 + int(math.degrees(q2) * 11.375))
    step_3 = int(2047 - int(math.degrees(q3) * 11.375))

    return step_3, step_4, step_5

        L1、L2、L3 是自定义连杆长度(标定值,提前测量好),接着定义好关节姿态theta坐标(x,y),接着计算中间位置Bx,By,即第二个关节的位置。这里用三角函数和末端关节的位置和姿态来求解,包括后面的所有动作基本上都是用三角函数逆解运算。

        计算第一个和第二个关节的角度q1,q2,使用二连杆机械臂的逆运动学公式。这里用math.acos 和 math.atan2 函数来求解反余弦和反正切,使用math.sqrt函数求平方根。

        计算第三个关节的角度q3,使用末端关节的姿态(预先定义,theta)减去前两个角度得到。math.degrees 函数将弧度转换为角度。

        接着用底层舵机控制库,传送舵机姿态,并返回舵机姿态。

② BGR图像转换伪彩色深度图像代码

        下面的代码是将相机采集到的深度信息配合BGR图像转换成伪彩色深度图像。 

ret_bgr, bgr_image = orbbec_cap.retrieve(None, cv.CAP_OBSENSOR_BGR_IMAGE)
ret_depth, depth_map = orbbec_cap.retrieve(None, cv.CAP_OBSENSOR_DEPTH_MAP)
            
if ret_depth:
    depth_map_8U = depth_map * 255.0 / 5000 
    depth_map_8U = np.clip(depth_map_8U, 0, 255) 
    depth_map_8U = np.uint8(depth_map_8U) 

    color_depth_map = cv.applyColorMap(depth_map_8U, cv.COLORMAP_JET) 
    cv.imshow("Depth: ColorMap",  color_depth_map) 

        首先对图像进行归一化和均值处理,强制转换类型,并显示图像。

 ③ 目标跟随及抓取动作代码

         此处代码是核心运动及抓取动作,包括了目标跟随代码还有旋转同步抓取动作代码。

def track_arm(packetHandler, bbox, frame_size,pid_errorx,pid_errory):
    c = frame_size[0] + 25
    s = frame_size[1] + (frame_size[1]/2)

    centerx = bbox[0]   
    centery = bbox[1] 
    stepx = int((centerx - c /2))
    stepy = int((centery - s /2))
    
    P_x = 0.2
    P_y = 0.3

    I_x = 0.05
    I_y = 0.06

    errorx = stepx - pid_errorx
    errory = stepy - pid_errory

    scs_present_position_3, scs_comm_result, scs_error = packetHandler.ReadPos(SCS_ID_3)
    scs_present_position_6, scs_comm_result, scs_error = packetHandler.ReadPos(SCS_ID_6)

    ACC_X = int (abs(P_x * stepx) + I_x * abs(errorx))
    if ACC_X > 256:
        ACC_X = 255
    elif ACC_X < 0:
        ACC_X = 0
    ACC_Y = int (abs(P_y * stepy) + I_y * abs(errory))
    if ACC_Y > 256:
        ACC_Y = 255
    elif ACC_Y < 0:
        ACC_Y = 0

    if scs_present_position_3 + stepy >= 3070:
        scs_comm_result, scs_error = packetHandler.WritePosEx(SCS_ID_5, 2480, SCS_MOVING_SPEED, SCS_MOVING_ACC)
        #packetHandler.WritePosEx(SCS_ID_2, 2048, SCS_MOVING_SPEED, SCS_MOVING_ACC)
    if scs_present_position_3 + stepy <= 2550:
        scs_comm_result, scs_error = packetHandler.WritePosEx(SCS_ID_5, 2900, SCS_MOVING_SPEED, SCS_MOVING_ACC)
    else:
        scs_comm_result, scs_error = packetHandler.WritePosEx(SCS_ID_3, scs_present_position_3 + stepy, SCS_MOVING_SPEED, ACC_Y)
        scs_comm_result, scs_error = packetHandler.WritePosEx(SCS_ID_6, scs_present_position_6 + stepx, SCS_MOVING_SPEED, ACC_X)

    pid_errorx = stepx
    pid_errory = stepy

    return pid_errorx, pid_errory

        上面的是目标跟随代码,实现原理是将目标始终固定到图像的中央,在利用PID算法对舵机进行移动,消除舵机抖动。 

        下面的是舵机跟随旋转代码,原理是利用掩膜目标坐标进行三角函数逆解运算,求出目标旋转角度,再将角度传送给舵机进行同步旋转。

def track_set_2(contours, x, y, w, h):
    arg = 0.0
    X_1 = x
    Y_1 = y
    X_2 = x + w - 1
    Y_2 = y + h - 1
    l = len(contours)
    for i in range(l - 1):
        if contours[i][0][0] == X_1:
            L1 = contours[i][0][1]
            break
    for i in range(l - 1):
        if contours[i][0][0] == X_2:
            L2 = contours[i][0][1]
            break
    for i in range(l - 1):
        if contours[i][0][1] == Y_1:
            R1 = contours[i][0][0]
            break
    for i in range(l - 1):
        if contours[i][0][1] == Y_2:
            R2 = contours[i][0][0]
            break
    '''0--90 AND 90--180 '''
    if R1 > R2 and h / w <= 0.65 * 56 / 22: 
        arg1 = math.acos((R1 - X_1)/math.sqrt((R1 - X_1) * (R1 - X_1) + (Y_1 - L1) * (Y_1 - L1))) / math.pi * 180
        arg2 = math.acos((X_2 - R2)/math.sqrt((X_2 - R2) * (X_2 - R2) + (L2 - Y_2) * (L2 - Y_2))) / math.pi * 180
        arg = (arg1 + arg2) / 2
    if R1 < R2 and h / w <= 0.65 * 56 / 22: 
        arg1 = math.acos((X_1 - R2) / math.sqrt((X_1 - R2) * (X_1 - R2) + (L1 - Y_2) * (L1 - Y_2))) / math.pi * 180
        arg2 = math.acos((R1 - X_2) / math.sqrt((R1 - X_2) * (R1 - X_2) + (Y_1 - L2) * (Y_1 - L2))) / math.pi * 180
        arg = (arg1 + arg2) / 2
    if h / w > 0.65 * 56 / 22:
        arg = 90
    arg = 1024 + int (arg / 180 * 2047)
    return arg

        如果大家对这个项目感兴趣的话,可以评论或私聊我,加群进行交流。同时也可以关注3D视觉开发者社区哦。文章来源地址https://www.toymoban.com/news/detail-639423.html

到了这里,关于OpenCV实验箱---机械臂自由抓取例程开发使用手册的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用唐都实验箱通过微指令实现冒泡排序,原码一位乘和栈的相关操作

    摘要 1 前言 2 实验原理 2.1 数据格式 2.2 指令格式 2.3 数据通路框图 3 总体****设计 3.1 微指令流程图 3.2 指令系统 3.3 线路连接图 4 详细设****计 4.1 冒泡排序 4.2 原码一位乘 4.3 堆栈 5 实验结果 5.1 冒泡排序 5.2 原码一位乘 5.3堆栈 6 参考文献 摘要 本次课程设计首先对复杂模型机进

    2024年02月03日
    浏览(54)
  • ARM920T实验箱s3c2410 矩阵按键控制步进电机正反转和停止

    问题描述 按下第一个按键使步进电机可以正转、第二个反转反转、第三个按键停止 矩阵按键控制 画了张矩阵按键的内部电路图: 矩阵按键实物图: ABC 按键右边的就是步进电机。 按键第一行连接的是寄存器 GPFDAT0 的端口 第二行连接的是寄存器 GPFDAT2 的端口 第三行连接的是

    2024年02月09日
    浏览(46)
  • UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂

    目录 1. ABB机械臂形态 2. ABB机械臂数学模型分析 3. 初步程序实现 4. 误差分析 5. 最终实现   前文已经在Unity中,将3自由度机械臂的数学模型实现出来了,现在我们将它实际应用于机械臂中。选用的机械臂3D模型是ABB IRB 4600工业机器人,来自AssetStore。    (图片来自ABB官网)

    2024年02月10日
    浏览(46)
  • 基于鱼眼相机的机械臂抓取流程

    相机标定使用ROS中camera_calibration工具进行标定,该工具也可以标定鱼眼相机。标定板黑白格大小为12x8,单个方块大小20mm 标定后即可得到相机内参。后续使用时需要通过参数矫正鱼眼相机的图片 工具标定根据机械臂厂商提供的工具进行 参考手眼标定。 注意事项:image_callba

    2024年02月13日
    浏览(38)
  • UnityVR--机械臂场景6-三自由度逆向解算1

    本文我们要做的是:给机器人一个末端坐标,使机器人自动调整姿态。为了使问题简单易懂,我们先以2自由度(XY平面中)的机器人为例,如下图为2自由度机器人的连杆机构模型。  其中P为末端点即手爪的位置,坐标为(x,y);L1、L2分别为两个手臂的长度,θ1、θ2分别为两

    2024年02月06日
    浏览(53)
  • 78、基于STM32单片机学习型搬运机器人四自由度机械臂机械手遥感控制设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图  六、程序源码 七、资料包括  在当今大规模制造业中,企业为提高生产效率,保障产品质量,普遍重视生产过程的自动化程度,工业机器人作为自动

    2024年02月09日
    浏览(53)
  • k210-arduino深度学习视觉机械臂抓取

    一、arduino对机械臂的基础控制        1、首先实现arduino对机械臂的控制(点动和自动),六个轴分别定义为xyzjkl。 点动:点动方式为按一下对应按键使对应轴正转或反转3度,此方式能够使机械臂快速移动到目标位置,到达目标位置可以在串口输入“o”返回当前各轴角度

    2023年04月27日
    浏览(37)
  • 6自由度机械臂雅克比矩阵求解,结果同jacob0函数

    雅可比矩阵描述了关节空间和笛卡尔空间的速度和角速度映射关系。 初学者入门通常会使用matlab中的robotics toolbox,在进行操作空间末端速度求解时会有疑问jacob0函数是怎样实现的。 在网上有很多人公布了jacobian求解的代码,但是都不能运行出正确的结果,本文给出了与机器

    2024年01月20日
    浏览(50)
  • 机械臂仿真:使用matlab机器人工具箱与标准DH法,实现6自由度机械臂的仿真运动

    在了解了如何描述末端执行器的位姿之后,接下来我们就可以实现对机械臂的数学建模。建模的工具有很多种,本文介绍一种基于 标准DH参数法 与Matlab的Robotics Toolbox - Peter Corke库来实现此过程,并尝试实现6自由度机器人的仿真运动。 强烈推荐b站教学视频MATLAB机器人工具箱

    2024年04月13日
    浏览(64)
  • 基于STM32的机械臂抓取系统【1】【环境搭建】

    哈喽鸭,大家好,在总览中,咱们提到了整个系统的主控MCU、模块和软件。系列文章分为环境搭建、机械臂板块、各类模块使用、软件板块四大类。 【注】系列文章适合小白从0到1,自主完成一个较完整的物联网产品。另外,我会较为详细的讲解各类板块的重难点,当然由于

    2024年02月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包