当前位置:   article > 正文

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

opencv机械臂抓取

目录

一、项目介绍

        项目背景:

        相机型号:

二、机械臂自由抓取演示 

        使用注意事项:

         操作步骤:

三、核心代码讲解

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

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

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


开发者:居正

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

一、项目介绍

        项目背景:

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

OpenCV实验箱套装
OpenCV实验箱套装

        相机型号:

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

二、机械臂自由抓取演示 

机械臂自由抓取演示视频

        使用注意事项:

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

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

         操作步骤:

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

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

三、核心代码讲解

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

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

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

  1. import math
  2. def step(x = None, y = None):
  3. pi = 3.14
  4. L1 = 105 # L1
  5. L2 = 110 # L2
  6. L3 = 110 # L3
  7. if x is None:
  8. x = int(input("x:"))
  9. if y is None:
  10. y = int(input("y:"))
  11. theta = math.radians(0)
  12. Bx = x - L3 * math.cos(theta)
  13. By = y - L3 * math.sin(theta)
  14. lp = Bx**2 + By**2
  15. alpha = math.atan2(By, Bx)
  16. tmp = (L1*L1 + lp - L2*L2) / (2*L1*math.sqrt(lp))
  17. if tmp < -1:
  18. tmp = -1
  19. elif tmp > 1:
  20. tmp = 1
  21. beta = math.acos(tmp)
  22. q1 = -(pi/2.0 - alpha - beta)
  23. tmp = (L1*L1 + L2*L2 - lp) / (2*L1*L2)
  24. if tmp < -1:
  25. tmp = -1
  26. elif tmp > 1:
  27. tmp = 1
  28. q2 = math.acos(tmp) - pi
  29. q3 = - q1 - q2 - pi/2
  30. step_5 = int(2047 + int(math.degrees(q1) * 11.375))
  31. step_4 = int(2047 + int(math.degrees(q2) * 11.375))
  32. step_3 = int(2047 - int(math.degrees(q3) * 11.375))
  33. 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图像转换成伪彩色深度图像。 

  1. ret_bgr, bgr_image = orbbec_cap.retrieve(None, cv.CAP_OBSENSOR_BGR_IMAGE)
  2. ret_depth, depth_map = orbbec_cap.retrieve(None, cv.CAP_OBSENSOR_DEPTH_MAP)
  3. if ret_depth:
  4. depth_map_8U = depth_map * 255.0 / 5000
  5. depth_map_8U = np.clip(depth_map_8U, 0, 255)
  6. depth_map_8U = np.uint8(depth_map_8U)
  7. color_depth_map = cv.applyColorMap(depth_map_8U, cv.COLORMAP_JET)
  8. cv.imshow("Depth: ColorMap", color_depth_map)

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

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

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

  1. def track_arm(packetHandler, bbox, frame_size,pid_errorx,pid_errory):
  2. c = frame_size[0] + 25
  3. s = frame_size[1] + (frame_size[1]/2)
  4. centerx = bbox[0]
  5. centery = bbox[1]
  6. stepx = int((centerx - c /2))
  7. stepy = int((centery - s /2))
  8. P_x = 0.2
  9. P_y = 0.3
  10. I_x = 0.05
  11. I_y = 0.06
  12. errorx = stepx - pid_errorx
  13. errory = stepy - pid_errory
  14. scs_present_position_3, scs_comm_result, scs_error = packetHandler.ReadPos(SCS_ID_3)
  15. scs_present_position_6, scs_comm_result, scs_error = packetHandler.ReadPos(SCS_ID_6)
  16. ACC_X = int (abs(P_x * stepx) + I_x * abs(errorx))
  17. if ACC_X > 256:
  18. ACC_X = 255
  19. elif ACC_X < 0:
  20. ACC_X = 0
  21. ACC_Y = int (abs(P_y * stepy) + I_y * abs(errory))
  22. if ACC_Y > 256:
  23. ACC_Y = 255
  24. elif ACC_Y < 0:
  25. ACC_Y = 0
  26. if scs_present_position_3 + stepy >= 3070:
  27. scs_comm_result, scs_error = packetHandler.WritePosEx(SCS_ID_5, 2480, SCS_MOVING_SPEED, SCS_MOVING_ACC)
  28. #packetHandler.WritePosEx(SCS_ID_2, 2048, SCS_MOVING_SPEED, SCS_MOVING_ACC)
  29. if scs_present_position_3 + stepy <= 2550:
  30. scs_comm_result, scs_error = packetHandler.WritePosEx(SCS_ID_5, 2900, SCS_MOVING_SPEED, SCS_MOVING_ACC)
  31. else:
  32. scs_comm_result, scs_error = packetHandler.WritePosEx(SCS_ID_3, scs_present_position_3 + stepy, SCS_MOVING_SPEED, ACC_Y)
  33. scs_comm_result, scs_error = packetHandler.WritePosEx(SCS_ID_6, scs_present_position_6 + stepx, SCS_MOVING_SPEED, ACC_X)
  34. pid_errorx = stepx
  35. pid_errory = stepy
  36. return pid_errorx, pid_errory

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

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

  1. def track_set_2(contours, x, y, w, h):
  2. arg = 0.0
  3. X_1 = x
  4. Y_1 = y
  5. X_2 = x + w - 1
  6. Y_2 = y + h - 1
  7. l = len(contours)
  8. for i in range(l - 1):
  9. if contours[i][0][0] == X_1:
  10. L1 = contours[i][0][1]
  11. break
  12. for i in range(l - 1):
  13. if contours[i][0][0] == X_2:
  14. L2 = contours[i][0][1]
  15. break
  16. for i in range(l - 1):
  17. if contours[i][0][1] == Y_1:
  18. R1 = contours[i][0][0]
  19. break
  20. for i in range(l - 1):
  21. if contours[i][0][1] == Y_2:
  22. R2 = contours[i][0][0]
  23. break
  24. '''0--90 AND 90--180 '''
  25. if R1 > R2 and h / w <= 0.65 * 56 / 22:
  26. arg1 = math.acos((R1 - X_1)/math.sqrt((R1 - X_1) * (R1 - X_1) + (Y_1 - L1) * (Y_1 - L1))) / math.pi * 180
  27. arg2 = math.acos((X_2 - R2)/math.sqrt((X_2 - R2) * (X_2 - R2) + (L2 - Y_2) * (L2 - Y_2))) / math.pi * 180
  28. arg = (arg1 + arg2) / 2
  29. if R1 < R2 and h / w <= 0.65 * 56 / 22:
  30. arg1 = math.acos((X_1 - R2) / math.sqrt((X_1 - R2) * (X_1 - R2) + (L1 - Y_2) * (L1 - Y_2))) / math.pi * 180
  31. arg2 = math.acos((R1 - X_2) / math.sqrt((R1 - X_2) * (R1 - X_2) + (Y_1 - L2) * (Y_1 - L2))) / math.pi * 180
  32. arg = (arg1 + arg2) / 2
  33. if h / w > 0.65 * 56 / 22:
  34. arg = 90
  35. arg = 1024 + int (arg / 180 * 2047)
  36. return arg

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/843038
推荐阅读
相关标签
  

闽ICP备14008679号