这里是厂妹,这个月要做一个机械臂+摄像头给物体定点的项目,我以前做的机械臂知识基本全忘了,重新学一遍顺便整理一下,写个博客记录。
用的机械臂是AUBO I5AUBOi5https://www.aubo-robotics.cn/i5product?CPID=i5 摄像头是淘宝买的广角模组 电脑配置随意
主要语言是PYTHON和C#
目录
第一部分:六自由度机械臂
A、基础知识
我看的是菠萝的博客,里面有对六自由度机械臂的大部分知识,我这里就总结一下我觉得重要的。菠萝爱吹雪的博客https://blog.csdn.net/weixin_47849087?type=blog
有1~6共六个旋转关节。其中,关节1到3控制机械臂末端的位置,而关节4到6主要控制末端的姿态。
路径规划:即规划一条从起始点到目标点的路径,不关乎其他。
轨迹规划:除了规划路径之外,还要给出具体经过每个路径点的时间,即得到包含路径点的时间序列。
运动规划:是个很广泛的概念,一般包括路径和轨迹规划,除上述两者之外,运动过程中运动体一切有关的动作和状态规划都可以称之为运动规划。
1、运动学建模
对于多关节串联型的工业机器人,一般采用D-H法建模。
需建立连杆坐标系和确定连杆参数
2、运动学分析
D-H法 改进D-H法 固连坐标系 以连杆后一个关节坐标系为其固连坐标系 以连杆前一个关节坐标系为其固连坐标系 相邻关节坐标系变换顺序 θ,d,a,α a,α,d,θ或者α,a,θ,d
求解机器人各连杆关节的运动关系称为 机器人运动学。已知各连杆夹角以及其余连杆坐标系参数,求解末端执行器的位姿,称为机器人的 正运动学求解,反之称为 逆运动学求解。
本项目主要是已经确定好坐标,然后让机械臂运动到那里,主要使用的是 逆运动学求解。
求取机器人的逆解,就是在已知末端执行器位姿的情况下,经过矩阵变换,求得各个关节的转角,从而控制机器人达到理想的位姿。
求逆解的一般方法为:在如上图所示的矩阵方程两端,同时乘单个T矩阵的逆矩阵,接着进行观察,令等号两端矩阵特定元素对应相等,得到方程进行求解。
正解FK
给定机器人各关节的角度,计算出机器人末端的空间位置逆解IK
已知机器人末端的位置和姿态,计算机器人各关节的角度值
B、机械臂操作
用的aubo机械臂,官方自带介绍视频和资料
视频资料作为协作机器国家标准制定者,遨博开发了具有核心知识产权的协作机器人产品,实现核心部件国产化,打破了国外长期垄断。遨博产品先后通过EN ISO 13849-1:2015(PL=d, CAT 3)、欧盟 CE、北美 NRTL、韩国 KCs、中国 CR、SEMI S2 等认证https://www.aubo-robotics.cn/videos资料下载作为协作机器国家标准制定者,遨博开发了具有核心知识产权的协作机器人产品,实现核心部件国产化,打破了国外长期垄断。遨博产品先后通过EN ISO 13849-1:2015(PL=d, CAT 3)、欧盟 CE、北美 NRTL、韩国 KCs、中国 CR、SEMI S2 等认证https://www.aubo-robotics.cn/download
初始零位
其中每个关节的方向都是逆时针方向为正。
因为我用的是C#,而官方自带的SDK是C和C++的教程,也有C#的DEMO,看了一下就是用C生成的dll,然后调用即可。
具体指令我单独开一章
这边简单介绍一下几个常用的函数和调用说明
功能函数:
初始化函数:rs_initialize
登录函数:rs_login
启动函数:rs_robot_startup
用户坐标系标定函数:rs_set_user_coord
主要运动函数:rs_move_joint
计算函数:
逆解姿态:rs_inverse_kin
欧拉角转四元数:rs_rpy_to_quaternion()
设置机械臂碰撞等级:rs_set_collision_class()
第二部分:二维图像标定
A、坐标转换法(适合单目相机)
分为两部分:位置标定和透视拉伸(姿态标定还没想好要不要做,要是做了补上)
机械臂位置标定1
而相机+机械臂的应用组合,我们称之为手眼系统。
相机所能看到的图像是2D屏幕,而手的移动是在3D空间中,因此手眼系统的功能就是能够将相机所拍摄到的2D画面,转换为手所在的3D空间的坐标。
常见的手眼系统有两种安装形式:
图a)的安装方式,相机安装在机械臂上,称之为眼在手上(eye in hand);图b)的安装方式,相机固定在机械臂之外的安装架上,称之为眼在手外(eye to hand)。
涉及到以下四个坐标系
uv:像素坐标系,原点为图像左上角,单位pixel
o-xy:图像坐标系,基于相机中感光元器件的现实平面空间,原点为成像平面中点,单位mm
Oc-XcYcZc:相机坐标系,光心为原点,单位m
Or-XrYrZr: 机器人坐标系,描述机械臂移动的位置,单位m
P:机器人坐标系中的一点,表示识别目标在机械臂三维空间中的位置
p:点p在图像中的成像点,在图像坐标系中的坐标为(x,y),在像素坐标系中的坐标为(u,v)
import numpy as np
import cv2
# 通过九点标定获取的圆心相机坐标
A_points_camera = np.array([
[207, 160],
[311, 159],
[415, 159],
[206, 256],
[311, 257],
[416, 258],
[205, 353],
[311, 356],
[416, 357],
])
# 通过九点标定获取的圆心机械臂坐标
A_points_robot = np.array([
[54, -74],
[-4, -76],
[-54, -77],
[52, -32],
[-4, -34],
[-55, -35],
[50, 11],
[-4, 10],
[-54, 8],
])
# 手眼标定方法
class HandInEyeCalibration:
def get_m(self, points_camera, points_robot): ##获得参数m 记得保存
"""
取得相机坐标转换到机器坐标的仿射矩阵
:param points_camera:
:param points_robot:
:return:
"""
# 确保两个点集的数量级不要差距过大,否则会输出None
m, _ = cv2.estimateAffine2D(points_camera, points_robot)
return m
def get_points_robot(self, x_camera, y_camera): #输出需要的点
"""
相机坐标通过仿射矩阵变换取得机器坐标
:param x_camera:
:param y_camera:
:return:
"""
m = self.get_m(A_points_camera, A_points_robot)
robot_x = (m[0][0] * x_camera) + (m[0][1] * y_camera) + m[0][2]
robot_y = (m[1][0] * x_camera) + (m[1][1] * y_camera) + m[1][2]
return robot_x, robot_y
代码如上。优点明显,代码简单计算快
缺点也很明显,没有z轴。所以需要加上透视变换。
已知给定两个对应点集AB,如何估计指定变换矩阵R的参数?
一对对应点可以列两个线性方程,多个对应点可以列出线性方程组,为了求解参数,需要的对应点数至少为自由度的一半,多个点时构成超定方程组,可以基于最小二乘或者SVD分解等方法进行求解,这里就暂时展开讨论。
机械臂位置标定2
使用aubo自带的位置标定函数rs_set_user_coord
p. * 该结构体描述一个坐标系。系统根据该结构体能够唯一个确定一个坐标系。
q. *
r. * 坐标系分3种类型:基座标系(BaseCoordinate),末端坐标系(EndCoordinate),用户坐标系(WorldCoordinate);
s. *
t. * 基座坐标系是 根据机械臂底座建立的坐标系
u. * 末端坐标系是 根据法兰盘中心建立的坐标系
v. * 用户坐标系是 用户根据自己的需求建立的实际需要用到的坐标系,系统根据用户提供的3个点和标定方法确定用户坐标系的X轴,Y轴,Z轴。
w. * 在实际应用中标定坐标系时会用到工具,系统为了准确的得到坐标系标定的3个点,所以用户需要提供工具信息,
x. * 如果没有使用工具可以将工具描述(toolDesc)设置为0.
y. *
z. * 使用说明:
aa. * 1:当coordType==BaseCoordinate或者coordType==EndCoordinate时,下面3个参数(methods,wayPointArray,toolDesc)系统不做处理,
ab. * 因为系统根据这个参数coordType已经可以确定该坐标系了。
ac. *
ad. * 2:如果坐标系标定的时候没有使用工具,工具描述中的位置和姿态信息应设置为0。
ae. */
af. typedef struct
ag. {
ah. coordinate_refer coordType; //坐标系类型:当coordType==BaseCoordinate或者coordType==EndCoordinate是,下面3个参数不做处理
ai. CoordCalibrateMathod methods; // 坐标系标定方法
aj. JointParam wayPointArray[3]; //用于标定坐标系的3个点(关节角),对应于机械臂法兰盘中心点基于基座标系
ak. ToolInEndDesc toolDesc; //标定的时候使用的工具描述
al. }CoordCalibrateByJointAngleAndTool;
(这接口文本真的写的很拉,感觉写的最好的是python版本,c版本真的一言难尽),但是根据aubo自带上位机可以得出:
coord_type为坐标系类型,默认为2
calibrate_methon为坐标系方法,xoy,yoz,xoz等等,默认为xoy
calibrate_points就是三个点,如果是选择xoy,第一个点用户坐标系原点,第二个点为x轴上任意一点,第三个点为y轴上任意一点,以此类推
pos:工具相对末端位置,默认为(0,0,0)
ori:工具相对末端姿态(四元数,可用位姿转成四元数)
摄像头图像透视拉伸
用的opencv,就是一个三的三个点到另一个平面三个点
主要函数如下
cv2.getPerspectiveTransform()
cv2.warpPerspective()
效果如下
[图片校准(矫正)]——透射变换应用_Star星屹程序设计的博客-CSDN博客如果想要对图像进行校准,那么透射变换是非常有效的变换方法。透射变换的定义如下:将图像投影到一个新的视平面,通常也成为投影映射。详情参考链接:透射变换介绍1、举例说明直观的来看,透视变换的作用就是将左侧图像的坐标点 [[50,0],[150,0],[0,200],[200,200]]转化为新的坐标 [[0,0],[200,0],[0,200],[200,200]]2、应用原图是一个旋转过的图片,现在需要做图片矫正,将图片放正。做法:手工选去需要矫正区域四个角上...https://blog.csdn.net/weixin_42067873/article/details/120090882python opencv鼠标点击图像显示坐标值(已验证)-CSDN博客python opencv鼠标点击图像显示坐标值(已验证)直接上代码import cv2import numpy as npimg = cv2.imread("111.jpg")# print img.shapedef on_EVENT_LBUTTONDOWN(event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDOWN: xy = "%d,%d" % (x, y) printhttps://blog.csdn.net/Vertira/article/details/123629522
B、三维重建(适合双目 RGBD摄像头)
换了个思路,用三维重建方法。但因为省钱我用的是单目摄像头,试了试浙大的NeuralRecon模型。
百度安全验证https://baijiahao.baidu.com/s?id=1731047083693844946&wfr=spider&for=pc相机标定介绍。
第三部分:C#上位机编写
采用的是我比较习惯的C#和sunny ui。画UI都花了我一周,还被嫌弃丑,呜呜呜呜。
使用的sunnyui然后发链接审核说我是广告(????)给我没通过,删掉了
图标库采用阿里开源图标库
阿里开源图标库https://www.iconfont.cn/字体采用oppo sans汉仪定制——OPPOhttp://www.hanyi.com.cn/weixin/h5/customizedfont/OPPOSans.php
最后结果如上,打个马赛克(跑)
c#如何调用,我看了很多,封装dll,加库什么的,我觉得都一般,最后采用的是传参。
摄像头部分采用opencv全程处理,保证和后面python数据格式对接。
具体展示、主要算法和演示视频涉嫌保密 ,我就不放了,主要思路和流程是这样,部分能公开细节我会补上。(跑)