wanff0 2019-12-30
最近公司同事因为对某视觉对位平台的运动控制算法有疑问,所以来请教我。
由于我也是第一次接触到UVW自动对位平台(也可以叫XXY自动对位平台),于是找了一些资料学习一下,大概了解了运动模式后,使用matlab模拟了此平台,并验证了UVW平台资料提供的运动控制算法的正确性。
1、这是一种可以实现以平面上任意一点为中心,进行旋转运动的装置,并可沿着任意的方向平移。
2、此平台和视觉CCD纠偏系统对接在一起,可以很快完成高精度的纠偏工作,重复定位精度一般可达±1μm;
UVW平台和以前的xyθ平台相比,有以下几点不同:
1、控制精度高于xyθ平台;
2、UVW平台可以平面上任意一点为中心做旋转运动(包括无限远);而xyθ平台由于仅仅依靠一个电机的转动控制,所以旋转中心必须是固定在平台上某处(θ电机连接处),且必须随平台一同运动。
3、基于第二点的区别,显然UVW平台是需要一个绝对坐标系作为参考系,其旋转中心才有意义;而xyθ平台则必须是一个随平台动的坐标系作为参考系,这样控制计算方法便完全不一样了。
UVW平台工作模式如下图:
计算方法由平台供应商提供,截图如下:
仔细研究一下上述的公式,很容易发现,这只是简单的几何运算以及对二维坐标的求解问题。
简单说明一下视觉对位和运动控制思路:
1、通过UVW平台供应商提供的说明书,找到机械参数,得到UVW三个轴的初始坐标(基于UVW平台原点坐标系);
2、通过视觉标定方法,确定相机坐标系到UVW平台坐标系的转换矩阵;确定标志物模板基于UVW平台原点坐标系的坐标值(x_m, y_m);
3、通过相机得到标志物模板位置和待纠偏标志物之间的x、y、θ偏移量(基于UVW平台原点坐标系);
4、按照上图公式,输入三个轴初始坐标,设置旋转中心为(0,0),输入θ偏移量,可得到UVW三轴新的坐标值,以及待纠偏物体的新的坐标,以及三个电机对应的给进量A1、A2、A3;
5、输入上一步求得的UVW三轴新的坐标值,另外通过上一步求得的待纠偏物体的新的坐标,计算得此时待纠偏物体到模板点位置的x2、y2偏移量;输入x2、y2偏移量,则可以得到三个电机对应的给进量B1、B2、B3;
6、将5和6步获取的三个电机的给进量对应相加,分别得到对应电机给进量C1、C2、C3,并用此给进量驱动对应电机即可。即是,将运动过程拆解,变成平移和旋转部分,分别计算电机给进量。
接下来使用了一个matlab仿真实例,来验证自己的思路是正确的。
按照第二步的程序思路,写了以下matlab代码,以下代码省略了电机给进量的计算。基本都有注释,不过多解释。
模拟效果如图所示:
下面程序定义模板和待纠偏物体时,Template 数组和Rectify_deviation 数组的值都是可以任意改变的,这两个数组即是通过传感器输入的模板坐标及位姿和待纠偏物体坐标及位姿。
% 蓝色的o符号是待纠偏物体,初始位置; % 黑丝的o符号是待纠偏物体,在第一次旋转角度后的位置; % 红色的o符号是待纠偏物体,在第二次平移之后的位置 % 红色的*符号是模板位置 close all; clear all; clc %% 设置模板位置参数 figure(1) grid on;axis([-150,150,-150,150]);hold on; % 定义生成模板物体mode:x,y,theta(基于UVW平台绝对坐标系) Template = [25, 35 , pi*0.2]; % 定义待纠偏物体re:x,y,theta(基于UVW平台绝对坐标系) Rectify_deviation = [15, 22, pi*0.4]; %求出第一次变换之前,模板与待纠偏物体的角度偏移(基于UVW平台绝对坐标系) THETA_M = Template(3) - Rectify_deviation(3); %% 绘制模板和待纠偏物体 plot(Rectify_deviation(1), Rectify_deviation(2),‘ob‘); % 绘制待纠偏物体re,蓝色o符号 hold on; plot(Template(1), Template(2),‘*r‘); hold on;% 绘制模板位置,红色的*符号 draw_triangle(Template(1), Template(2), Template(3));hold on; %% UWV平台初始坐标参数 R = 72.837; % 四轴到原点的半径 m = 51.504; % 四个轴的坐标绝对值 % 轴初始坐标 Ux0 = -m; Uy0 = m; Vx0 = m; Vy0 = m; Wx0 = m; Wy0 = -m; Ox0 = -m; Oy0 = -m; %% 绘制UVW平台以及待纠偏物体 draw_frame(Ux0,Uy0,Vx0,Vy0,Wx0,Wy0,Ox0,Oy0); draw_circle(Ox0, Oy0, 5); draw_circle(Ux0, Uy0, 5); draw_circle(Vx0, Vy0, 5); draw_circle(Wx0, Wy0, 5); draw_triangle(Rectify_deviation(1), Rectify_deviation(2), Rectify_deviation(3)) %% 1--先旋转 figure(2) grid on;axis([-150,150,-150,150]);hold on; plot(Template(1), Template(2),‘*r‘);hold on; % 绘制模板位置,红色的*符号 draw_triangle(Template(1), Template(2), Template(3));hold on; X = 0; Y = 0; THETA = THETA_M; % 旋转中心 at = 0; bt = 0; % U轴执行机构-目标坐标 ux = (Ux0 - at)*cos(THETA) - (Uy0 - bt)*sin(THETA) + at + X; uy = (Ux0 - at)*sin(THETA) + (Uy0 - bt)*cos(THETA) + bt + Y; % V轴执行机构-目标坐标 vx = (Vx0 - at)*cos(THETA) - (Vy0 - bt)*sin(THETA) + at + X; vy = (Vx0 - at)*sin(THETA) + (Vy0 - bt)*cos(THETA) + bt + Y; % W轴执行机构-目标坐标 wx = (Wx0 - at)*cos(THETA) - (Wy0 - bt)*sin(THETA) + at + X; wy = (Wx0 - at)*sin(THETA) + (Wy0 - bt)*cos(THETA) + bt + Y; % O坐标 ox = (Ox0 - at)*cos(THETA) - (Oy0 - bt)*sin(THETA) + at + X; oy = (Ox0 - at)*sin(THETA) + (Oy0 - bt)*cos(THETA) + bt + Y; % !!!!求出第一次旋转后,待纠偏物体新的位姿 rx1 = Rectify_deviation(1); rx2 = Rectify_deviation(2); Rectify_deviation(1) = (rx1 - at)*cos(THETA) - (rx2 - bt)*sin(THETA) + at + X; Rectify_deviation(2) = (rx1 - at)*sin(THETA) + (rx2 - bt)*cos(THETA) + bt + Y; Rectify_deviation(3) = Rectify_deviation(3) + THETA_M; plot(Rectify_deviation(1), Rectify_deviation(2),‘ok‘); % 绘制待纠偏物体re,黑色o符号 hold on; % UVW平台新矩形位置 draw_frame(ux,uy,vx,vy,wx,wy,ox,oy); draw_circle(ux, uy, 5); draw_circle(vx, vy, 5); draw_circle(wx, wy, 5); draw_circle(ox, oy, 5); draw_triangle(Rectify_deviation(1), Rectify_deviation(2), Rectify_deviation(3)) %% 2--再平移xy figure(3) grid on;axis([-150,150,-150,150]);hold on; plot(Template(1), Template(2),‘*r‘); % 绘制模板位置,红色的*符号 hold on; draw_triangle(Template(1), Template(2), Template(3));hold on; % 求出此时,模板位置相对于待纠偏物体的位姿 X_M = Template(1) - Rectify_deviation(1); Y_M = Template(2) - Rectify_deviation(2); THETA_M = Template(3) - Rectify_deviation(3); X = X_M; Y = Y_M; THETA = 0; % 旋转中心 at = 0; bt = 0; % U轴执行机构-目标坐标 ux = (ux - at)*cos(THETA) - (uy - bt)*sin(THETA) + at + X; uy = (ux - at)*sin(THETA) + (uy - bt)*cos(THETA) + bt + Y; % V轴执行机构-目标坐标 vx = (vx - at)*cos(THETA) - (vy - bt)*sin(THETA) + at + X; vy = (vx - at)*sin(THETA) + (vy - bt)*cos(THETA) + bt + Y; % W轴执行机构-目标坐标 wx = (wx - at)*cos(THETA) - (wy - bt)*sin(THETA) + at + X; wy = (wx - at)*sin(THETA) + (wy - bt)*cos(THETA) + bt + Y; % O坐标 ox = (ox - at)*cos(THETA) - (oy - bt)*sin(THETA) + at + X; oy = (ox - at)*sin(THETA) + (oy - bt)*cos(THETA) + bt + Y; % !!!!求出第二次平移后,待纠偏物体新的位姿 rx1 = Rectify_deviation(1); rx2 = Rectify_deviation(2); Rectify_deviation(1) = (rx1 - at)*cos(THETA) - (rx2 - bt)*sin(THETA) + at + X; Rectify_deviation(2) = (rx1 - at)*sin(THETA) + (rx2 - bt)*cos(THETA) + bt + Y; Rectify_deviation(3) = Rectify_deviation(3) + THETA_M; plot(Rectify_deviation(1), Rectify_deviation(2),‘or‘); % 绘制待纠偏物体re,红色的o符号 hold on; % UVW平台新矩形位置 draw_frame(ux,uy,vx,vy,wx,wy,ox,oy); draw_circle(ux, uy, 5); draw_circle(vx, vy, 5); draw_circle(wx, wy, 5); draw_circle(ox, oy, 5); draw_triangle(Rectify_deviation(1), Rectify_deviation(2), Rectify_deviation(3)) %% 规定范围以及网格 grid on;axis([-150,150,-150,150]);hold on; %% 各种函数定义 % 以inc_x和inc_y为中心,inc_r为半径画圆 function ret = draw_circle(inc_x, inc_y, inc_r) r = inc_r; theta=0:pi/100:2*pi; x = r*cos(theta) + inc_x; y = r*sin(theta) + inc_y; plot(x,y,‘-b‘);hold on; axis equal % 等圆 fill(x,y, ‘c‘) % 填充颜色 ret = 0; end % 输入三个顶点的坐标,画直角三角形,角度30,60,90 function ret = draw_triangle(inc_x, inc_y, inc_theta) % 定义直角三角形abc三条边,设定斜边c为: a = 8 * 1; b = 8 * sqrt(3); c = 8 * 2; AX = inc_x; AY = inc_y; BX = c * cos(inc_theta) + inc_x; BY = c * sin(inc_theta) + inc_y; CX = b * cos(inc_theta + pi/6) + inc_x; CY = b * sin(inc_theta + pi/6) + inc_y; plot([AX,BX],[AY, BY],‘-r‘);hold on; plot([AX,CX],[AY, CY],‘-r‘);hold on; plot([BX,CX],[BY, CY],‘-r‘);hold on; ret = 0; end % 输入四个顶点的坐标,画矩形 function [] = draw_frame(Ux0,Uy0,Vx0,Vy0,Wx0,Wy0,Ox0,Oy0) plot([Ux0,Vx0],[Uy0, Vy0],‘-r‘);hold on; plot([Vx0,Wx0],[Vy0, Wy0],‘-r‘);hold on; plot([Ox0,Wx0],[Oy0, Wy0],‘-r‘);hold on; plot([Ox0,Ux0],[Oy0, Uy0],‘-r‘);hold on; end