五轴机械臂实现视觉抓取--realsense深度相机和五自由度机械臂

前言:要实现视觉抓取,首先需要实现机械臂的驱动,深度相机的目标识别,能够反馈位置。

1、实现机械臂在ROS层的控制

2、基于深度相机目标物体的空间坐标反馈,需要知道摄像头中物体的像素坐标系到大地坐标系的转换。

3、五轴机械臂使用KDL插件不友好,需要适配IKFAST运动学插件,环境是Ubuntu16.04+ROS系统

IKFAST的安装参考如下的链接:

1)安装OpenRAVE 0.9版本

https://roboticslab-uc3m.github.io/installation-guides/install-openrave.html#install-openrave-0540-ubuntu-1804-bionic

MoveIt!运动学插件IKFAST(八) - 白雪儿 - 博客园

ROS进阶——MoveIt!运动学插件IKFAST配置_偷得浮生半日闲-CSDN博客

https://roboticslab-uc3m.github.io/installation-guides/install-aravis.html

https://roboticslab-uc3m.github.io/installation-guides/install-openrave.html

OpenRAVE | Welcome to Open Robotics Automation Virtual Environment | OpenRAVE Documentation

注意:1、安装过程中可能遇到一些错误,可以修改 CMakeLists.txt文件

2、fcl碰撞库是可以不编译进去的

2)安装ikfast插件

Industrial/Tutorials/Create a URDF for an Industrial Robot - ROS Wiki

https://github.com/ros-industrial/fanuc/tree/kinetic-devel

Fanuc的模型文件

Magics21中文破解版,修改slt模型文件,修改它的坐标方向等等

Magics21破解版|Materialise Magics21中文破解版下载 - 多多软件站

 安装生成ikfast的步骤大致可以分为以上的步骤,具体之前的参考链接中包含。生成中出现错误时需要注意你的运动链不能设置错误,不然会出现raghavan roth equations too complex。

可以参考我的运动链设置,这个要修改urdf文件描述,具体可以去官方查找fanuc的模型文件参考,我的ikfast生成插件的配置参考

xcar marm translationdirection5d 5自由度机械臂  两次测试使用正常

export MYROBOT_NAME="marm"  && export IKFAST_PRECISION="5" && export PLANNING_GROUP="manipulator"  && export BASE_LINK="0"  && export EEF_LINK="7"  && export IKFAST_OUTPUT_PATH=/home/zonesion/ikfast61_marm_"$PLANNING_GROUP".cpp

4、使用官方的moveit_simple_grasps功能包,使用这个包中的grasp_filter_test节点完成对目标物体可行抓取的过滤,从而得到可以到达的抓取,然后根据这些可行的抓取进一步选择最优的抓取即可。

这个包中需要调整很多代码,这里需要仔细看懂代码然后才能够很好的适配这个包,这个包中重点是抓取的过滤,就是根据之前生成的ikfast逆向解算器过滤掉无法到达的姿态,五自由度的机械臂到达姿态有效,导致的结果是无法准确的到达我们需要的姿态,这个是5D算法的弊端,因为平移三个参数,旋转也是三个参数,正常旋转为9个参数。

5、最后可以实现的效果如下:

好的,以下是一段深度相机机械臂手眼标定的程序: ```python import numpy as np import cv2 import glob # 初始化机械臂深度相机的变量 robot_pose = [] depth_pose = [] robot_pose_inv = [] depth_pose_inv = [] # 读取机械臂深度相机的标定图像 robot_images = sorted(glob.glob('robot_calib_images/*.jpg')) depth_images = sorted(glob.glob('depth_calib_images/*.png')) # 从标定图像中提取角点 robot_criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) depth_criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) robot_objp = np.zeros((6*7,3), np.float32) robot_objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2) depth_objp = np.zeros((6*7,3), np.float32) depth_objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2) robot_objpoints = [] depth_objpoints = [] robot_imgpoints = [] depth_imgpoints = [] for robot_img, depth_img in zip(robot_images, depth_images): robot_img = cv2.imread(robot_img) depth_img = cv2.imread(depth_img, cv2.IMREAD_UNCHANGED) gray_robot = cv2.cvtColor(robot_img, cv2.COLOR_BGR2GRAY) gray_depth = cv2.cvtColor(depth_img, cv2.COLOR_BGR2GRAY) ret_robot, corners_robot = cv2.findChessboardCorners(gray_robot, (7,6), None) ret_depth, corners_depth = cv2.findChessboardCorners(gray_depth, (7,6), None) if ret_robot and ret_depth: robot_objpoints.append(robot_objp) depth_objpoints.append(depth_objp) corners_robot = cv2.cornerSubPix(gray_robot,corners_robot,(11,11),(-1,-1),robot_criteria) corners_depth = cv2.cornerSubPix(gray_depth,corners_depth,(11,11),(-1,-1),depth_criteria) robot_imgpoints.append(corners_robot) depth_imgpoints.append(corners_depth) # 进行机械臂深度相机的手眼标定 retval, robot_matrix, robot_distCoeffs, robot_rvecs, robot_tvecs = cv2.calibrateCamera(robot_objpoints, robot_imgpoints, gray_robot.shape[::-1], None, None) retval, depth_matrix, depth_distCoeffs, depth_rvecs, depth_tvecs = cv2.calibrateCamera(depth_objpoints, depth_imgpoints, gray_depth.shape[::-1], None, None) for robot_rvec, robot_tvec, depth_rvec, depth_tvec in zip(robot_rvecs, robot_tvecs, depth_rvecs, depth_tvecs): robot_rmat, _ = cv2.Rodrigues(robot_rvec) depth_rmat, _ = cv2.Rodrigues(depth_rvec) robot_pose.append(np.hstack((robot_rmat, robot_tvec))) depth_pose.append(np.hstack((depth_rmat, depth_tvec))) robot_pose_inv.append(np.hstack((robot_rmat.T, -robot_rmat.T.dot(robot_tvec)))) depth_pose_inv.append(np.hstack((depth_rmat.T, -depth_rmat.T.dot(depth_tvec)))) robot_pose = np.array(robot_pose) depth_pose = np.array(depth_pose) robot_pose_inv = np.array(robot_pose_inv) depth_pose_inv = np.array(depth_pose_inv) H = np.zeros((3,3)) for i in range(len(robot_pose)): H += np.dot(robot_pose[i], depth_pose_inv[i]) U, S, V = np.linalg.svd(H) R = np.dot(U, V) T = np.dot(depth_pose.mean(axis=0)[:3], R.T) - np.dot(robot_pose.mean(axis=0)[:3], R.T) # 输出标定结果 print('Robot camera matrix:\n', robot_matrix) print('Robot distortion coefficients:\n', robot_distCoeffs) print('Depth camera matrix:\n', depth_matrix) print('Depth distortion coefficients:\n', depth_distCoeffs) print('Rotation matrix:\n', R) print('Translation vector:\n', T) ``` 这段程序首先读取了机械臂深度相机的标定图像,并从中提取出角点。然后,使用这些角点进行机械臂深度相机的相机内参数标定,得到了相机矩阵和畸变系数。接着,使用这些角点进行机械臂深度相机的手眼标定,得到了机械臂深度相机之间的转换矩阵。最后,使用SVD方法求解旋转矩阵和平移向量,输出标定结果。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值