UVW平台运动控制算法以及matlab仿真

 

最近公司同事因为对某视觉对位平台的运动控制算法有疑问,所以来请教我。
由于我也是第一次接触到UVW自动对位平台(也可以叫XXY自动对位平台),于是找了一些资料学习一下,大概了解了运动模式后,使用matlab模拟了此平台,并验证了UVW平台资料提供的运动控制算法的正确性。


一、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仿真

按照第二步的程序思路,写了以下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

UVW平台运动控制算法以及matlab仿真的更多相关文章

  1. 车辆运动控制算法——MPC

    MPC是模型预测控制算法,在车辆运动跟踪轨迹的控制中发挥很大的优势 基础的不多说,下面记录我对LQR/MPC/二次规划问题的理解 我们从LQR来引出MPC LQR的能量函数,目的是求函数J最小,即用最 ...

  2. 经典功率谱估计及Matlab仿真

    原文出自:http://www.cnblogs.com/jacklu/p/5140913.html 功率谱估计在分析平稳各态遍历随机信号频率成分领域被广泛使用,并且已被成功应用到雷达信号处理.故障诊断 ...

  3. MATLAB仿真总结

    MATLAB仿真过程中,编写MATLAB代码的时候犯了很多错误,做了很多蠢事.记录下自己犯错的点点滴滴,并引以为戒.使用MATLAB版本为2014a,以下内容如有不当还请指正. 1. 仿真开始前清理工 ...

  4. 极化码的matlab仿真(1)——参数设置

    根据老师的安排,对于极化码的了解从仿真开始. 仿真的手段有很多种.可以利用C,C++,matlab等进行仿真的实现.其中matlab由于具有强大的函数库,和壮观的矩阵运算能力,被(我们老师课题组)看中 ...

  5. (转) 经典功率谱估计及Matlab仿真

    原文出自:http://www.cnblogs.com/jacklu/p/5140913.html 功率谱估计在分析平稳各态遍历随机信号频率成分领域被广泛使用,并且已被成功应用到雷达信号处理.故障诊断 ...

  6. OFDM通信系统的MATLAB仿真(1)

    由于是第一篇博客,想先说点废话,其实自己早就想把学到的一些东西总结成文章随笔之类的供自己复习时查看的了.但是一是觉得自己学的的不够深入,总结也写不出什么很深刻的东西:二是觉得网上也有海量的资料了,需要 ...

  7. OFDM通信系统的MATLAB仿真(2)

    关于OFDM系统的MATLAB仿真实现的第二篇随笔,在第一篇中,我们讨论的是信号经过AWGN信道的情况,只用添加固定噪声功率的高斯白噪声就好了.但在实际无线信道中,信道干扰常常是加性噪声.多径衰落的结 ...

  8. Matlab 仿真实现TI Instaspin 的Foc 逆Clarke变换和SVPWM

    一直没搞明白TI 的Instaspin的SVPWM实现原理,最后只能在Matlab里仿真看看输出波形是不是和普通的SVPWM实现输出的波形一样,用M文件实现,下面是代码: clear all; the ...

  9. MATLAB仿真中连续和离散的控制器有何区别?

    matlab系统同时提供连续和离散的控制器和对象的目的是:在降低用户使用复杂程度的同时提高仿真精度.仿真速度和应用的广泛性. 仿真步长和求解精度的概念对于理解这个问题至关重要. 首先是步长,步长和求解 ...

随机推荐

  1. jquery解析XML文件实现的省市联动

    XML我是直接在网上下载的文件包 拿过来用的 jquery我用的是3.1的 前台页面 <form action="buy.html" method="get&quo ...

  2. mysql 计算两个时间之间有多少分钟

    SELECT TIMESTAMPDIFF(MINUTE, (DATE_FORMAT('2015-08-12 10:38:00','%Y-%m-%d %H:%i')), (DATE_FORMAT('20 ...

  3. @NOIP2018 - D1T1@ 铺设道路

    目录 @题目描述@ @考场上的思路@ @比较正常的题解@ @题目描述@ 春春是一名道路工程师,负责铺设一条长度为 n 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 n 块首尾相连的 ...

  4. 13-4 jquery操作标签(文本,属性,class,value)

    一 文本操作 $().html() $().text() 文本赋值操作 $().html("") $().text("") 二 属性操作 $().attr(属性 ...

  5. epoll简介(二)

    一:多路复用的举例 以一个生活中的例子来解释: 假设你在大学中读书,要等待一个朋友(数据)来访(要读),而这个朋友只知道你在A号楼(socket集合),但是不知道你具体住在哪里,于是你们约好了在A号楼 ...

  6. H3C 常用设备管理命令

  7. Getting started with the basics of programming exercises_5

    1.编写函数,把由十六进制数字组成的字符串转换为对应的整型值 编写函数htoi(s),把由十六进制数字组成的字符串(包含可选的前缀0x或0X)转换为与之等价的整型值.字符串中允许包含的数字包括:0~9 ...

  8. php函数nl2br的反函数br2nl

    真是搞不明白,php里有nl2br这样的好函数,但是为什么就没有它的反函数呢?只好自己在网站找了一个br2nl.分两个版本:php和javascript的. php版的代码如下: function b ...

  9. tensorflow学习笔记(二十五):ConfigProto&GPU

    tensorflow ConfigPrototf.ConfigProto一般用在创建session的时候.用来对session进行参数配置 with tf.Session(config = tf.Co ...

  10. SQL 常见出现错误(附件、保存表、脱机、自增序列号 )

    一.问题如图所示: 当填了某些数据,按“保存”时出现这个问题怎么解决? 1.打开“工具”-“选项”-“Designers” , 2.选择如下去勾: 二.当附加数据库的时候出现如下错误: 在附件文件上选 ...