UVW平台运动控制算法以及matlab仿真
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仿真的更多相关文章
- 车辆运动控制算法——MPC
MPC是模型预测控制算法,在车辆运动跟踪轨迹的控制中发挥很大的优势 基础的不多说,下面记录我对LQR/MPC/二次规划问题的理解 我们从LQR来引出MPC LQR的能量函数,目的是求函数J最小,即用最 ...
- 经典功率谱估计及Matlab仿真
原文出自:http://www.cnblogs.com/jacklu/p/5140913.html 功率谱估计在分析平稳各态遍历随机信号频率成分领域被广泛使用,并且已被成功应用到雷达信号处理.故障诊断 ...
- MATLAB仿真总结
MATLAB仿真过程中,编写MATLAB代码的时候犯了很多错误,做了很多蠢事.记录下自己犯错的点点滴滴,并引以为戒.使用MATLAB版本为2014a,以下内容如有不当还请指正. 1. 仿真开始前清理工 ...
- 极化码的matlab仿真(1)——参数设置
根据老师的安排,对于极化码的了解从仿真开始. 仿真的手段有很多种.可以利用C,C++,matlab等进行仿真的实现.其中matlab由于具有强大的函数库,和壮观的矩阵运算能力,被(我们老师课题组)看中 ...
- (转) 经典功率谱估计及Matlab仿真
原文出自:http://www.cnblogs.com/jacklu/p/5140913.html 功率谱估计在分析平稳各态遍历随机信号频率成分领域被广泛使用,并且已被成功应用到雷达信号处理.故障诊断 ...
- OFDM通信系统的MATLAB仿真(1)
由于是第一篇博客,想先说点废话,其实自己早就想把学到的一些东西总结成文章随笔之类的供自己复习时查看的了.但是一是觉得自己学的的不够深入,总结也写不出什么很深刻的东西:二是觉得网上也有海量的资料了,需要 ...
- OFDM通信系统的MATLAB仿真(2)
关于OFDM系统的MATLAB仿真实现的第二篇随笔,在第一篇中,我们讨论的是信号经过AWGN信道的情况,只用添加固定噪声功率的高斯白噪声就好了.但在实际无线信道中,信道干扰常常是加性噪声.多径衰落的结 ...
- Matlab 仿真实现TI Instaspin 的Foc 逆Clarke变换和SVPWM
一直没搞明白TI 的Instaspin的SVPWM实现原理,最后只能在Matlab里仿真看看输出波形是不是和普通的SVPWM实现输出的波形一样,用M文件实现,下面是代码: clear all; the ...
- MATLAB仿真中连续和离散的控制器有何区别?
matlab系统同时提供连续和离散的控制器和对象的目的是:在降低用户使用复杂程度的同时提高仿真精度.仿真速度和应用的广泛性. 仿真步长和求解精度的概念对于理解这个问题至关重要. 首先是步长,步长和求解 ...
随机推荐
- Centos7.3-mysql5.7复制安装过程
一.环境 192.168.56.102 为主服务器 192.168.56.101 为从服务器 Mysql5.7.20 二进制安装包环境 1. 下载免编译安装包并进行安装 从官网下载 mysql-5.7 ...
- java 简单实现FtpClient
1. 引入喜闻乐见的maven地址 <dependency> <groupId>commons-net</groupId> <artifactId>co ...
- @bzoj - 4356@ Ceoi2014 Wall
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给出一个N*M的网格图,有一些方格里面存在城市,其中首都位于网格 ...
- 怎么清除火狐浏览器的cookie?
火狐浏览器清除Cookie方法/步骤 1.打开火狐浏览器.并在火狐浏览器工具栏找到并单击“工具”下的“选项”. 2.在打开的“火狐浏览器选项”程序窗口中,找到工具栏中的“隐私”并单击,在隐私选项下找到 ...
- CODE FESTIVAL 2017 qual B C 3 Steps(补题)
总感觉这题是个题意杀,理解错题目了,看了好久才发现题目意思:操作是让,只要两点没有直接相连,而且只要有一条路的距离3,就可以把这两点连接起来. 按照题解中讲的,可以把图分为二分图和非二分图来解.不过题 ...
- Pytest - 使用介绍
1. 概述 pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1.简单灵活,容易上手,文档丰富: 2.支持参数化,可以细粒度地控制要测试的测试用例: 3.能够支持简单的单 ...
- 通过git从码云克隆项目到本地
1.下载安装Git,傻瓜式下一步下一步即可... 2.配置Git: 2.1.选择你要clone到本地的路径:右键--->$ Git Bash Here,弹出Linux命令窗口:$ cd ~直接回 ...
- SpringBoot 集成 Activiti 一路踩得坑
由于项目需要,本人开始在项目Spring boot 中集成工作流引擎Activiti.由于第一次集成,一路上步步都是坑,怪我没有先去看官方文档.现将一路上遇到的问题一一记录. 一. 环境配置 1.项目 ...
- HDU 1072
题意:给你一个迷宫,2代表你当前的位置,0代表墙,1代表可走的路,3代表出口,4代表的是炸弹的重置点,一开始炸弹的倒计时设置为6,每走一步时间减少1,倒计时到0的时候走到3或者4都不可以,问走出迷宫的 ...
- C# 标准性能测试
经常我写一个类,作为一个工具类,小伙伴会问我这个类的性能,这时我就需要一个标准的工具进行测试. 本文告诉大家如何使用 benchmarkdotnet 做测试. 现在在 github 提交代码,如果有小 ...