Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 252 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
252
Dung lượng
9,6 MB
Nội dung
博士留学生学位论文 并联机器人运动学模型优化解析方法研究 作 者 姓 名 TRANG THANH TRUNG (庄成忠 ) 学 科 专 业 机械制造及其自动化 指 导 教 师 李伟光 教授 所 在 学 院 机械与汽车工程学院 论文提交日期 20 17 年 11 月 Optimization Analysis Method of Parallel Manipulator Kinematic Model A Dissertation Submitted for the Degree of Doctor Candidate:Trang Thanh Trung Supervisor:Prof Li Weiguang South China University of Technology Guangzhou, China 分类号:TP242 学校代号:10561 学 号:201312800054 华南理工大学博士学位论文 并联机器人运动学模型优化解析方法研究 作者姓名:TRANG THÀNH TRUNG(庄成忠) 指导教师姓名、职称:李伟光教授/博士生导师 申请学位级别:工学博士 学科专业名称:机械制造及其自动化 研究方向:精密制造装备与现代控制技术 论文提交日期:2017 年 11 月 11 日 论文答辩日期:2018 年 03 月 12 日 学位授予单位:华南理工大学 学位授予日期: 年 月 日 答辩委员会成员: 主席: 张永俊教授 委员: 赵学智教授 黄平教授 姚锡凡教授 李伟光教授 摘 要 本文的主要目的是建立一个新的算法,以简化所有类型的并联机器人的运动学问 题的解决,而不限制自由度的数量。该算法适用于各种并联机器人结构,具有精度高、 可靠性好、执行时间短、比现有方法更易于使用的特点。五连杆并联机器人的数值模 拟和实验结果表明,该方法可用于解决各种并联机器人的运动学问题,对于结构复杂 和自由度多的并联机器人,该方法也具有计算时间短、精度高、可靠性高、结果收敛 快等优点。此外,本文还扩展了该方法在机器人公差设计领域的应用。通过两个仿真 实验验证了该方法的可行性;计算和仿真结果也说明了所提出的公差分配方法的准确 性和效率。 首先,在研究手臂机器人优化问题的基础上,本论文提供了新的接入方法以寻找 运动学参数,即将传统并联机器人运动学问题转换成有约束的非线性最优化问题,其 目标函数是 Rosenbrock-Banana 函数。经过很多试验,在非线性优化问题中 RosenbrockBanana 函数最合适是广义简约算法。从运动学控制试验中直接寻找,将缩短编程开发 时间。 其次,本文提出一种新的方式分类并联机器人,非棱柱并联机器人与棱柱并联机 器人,包括 种:非棱柱并联机器人(类型 1),棱柱并联机器人分成两种:主动棱柱 关节连接到固定平台的并联机器人(类型 2)和第二棱柱关节连接到固定平台的并联机 器人(类型 3)。本文描述所有并联机器人结构的模式化和将并联机器人运动学问题数 学模型转换成求解最优化问题的方式。对于类型 并联机器人,将初始数学模型转化为 最优问题时,目标函数为二次函数,因此直接应用广义简约求解运动学问题,而类型 和类型 的初始数学模型机器人是四次幂函数,与所提出的方法不相容。因此,本文提 出用同等代替结构将两类并联机器人(2 型和 型)的目标函数形式从四次幂函数降为 二次函数来解决这一问题,通过这种变换之后符合提出的方法。 第三,Excel 微软应用程序支持数学解析,并通过求解机器人的运动学问题,给出 了各类机器人的典型并联机器人解决方案。在两个不同的空间(关节空间和工作空间) 之间的唯一解决方案的保证已经充分论证。可靠性和精密度试验结果表明,所提出的 方法是非常可靠和准确的。通过与其它算法相比较,求解最优运动问题的顺序二次规 划和遗传算法,提出的方法的精度更高(约从二个到四个数量级),并且具有较短的执 行时间。 I 第四,逆运动学的结果作为实时控制机器人轨迹的信息,通过 Adams 仿真以及五 连杆并联机器人的实验表明,该方法能够实际应用于并联机器人控制。 最后,除了用于并行机器人运动学求解外,本论文提出的方法还可以应用于一个 新领域中—机器人制造设计,即确定成品工序容差以保证末端执行器的估计正确度和 精度。该技术不仅能应用在并行机器人而且还可以应用给手臂机器人。通过两个实例 验证了上述方法的可行性和计算结果, 该方法能准确、有效设计公差构件。 关键词:并联机器人;运动学问题;优化问题;同等代替结构;广义简约梯度法;制 造设计误差。 II Abstract The primary objective of this dissertation is to build a new algorithm that simplifies the resolution of the kinematic problems for all types of parallel robots without limiting the number of degrees of freedom This algorithm applies to various parallel robotic structures in a general order with high accuracy and reliability, shorter execution time, easier to use than current methods To this end, the numerical simulation and experiment results of parallel Scara robots prove that the proposed method can be applied to solve kinematic problems for a variety of parallel robots regardless of its structures and degree of freedom with several advantages such as shorter computation time, high precision, high reliability and rapid convergence of results In addition, this dissertation also extends the application of the proposed method in the field of robot tolerance design Two examples are used to verify the feasibility of the proposed method; the accuracy and efficiency of the proposed method for generating tolerance allocations are also illustrated by calculations and simulation results Firstly, based on optimal problem applied on the robot arm the dissertation proposes a new approach to find kinematic parameters by transforming the kinematic problem of the traditional parallel robot into a nonlinear optimization with the objective function Rosenbrock-Banana Through many tests, the best algorithm for the Rosenbrock-Banana function in the optimal problem is the General Reduced Gradient (GRG) method Direct recovery of the kinematic control resulting from the optimal problem will reduce the preparation time of the programmable data Secondly, classification of a parallel robot based on texture with or without prismatic joints, the dissertation has been grouped into three types of parallel robots: the non-prismatic parallel robot (type 1) and the prismatic parallel robots including the parallel robot with the active prismatic joints connected to its base (type 2), the parallel robot with the second prismatic joints from its base (type 3) The dissertation presented modeling for all types of parallel robot structures and how to convert the mathematical model of the kinematic problem of the parallel robot to the optimal form The situations that may arise when applying the proposed method on the three types of parallel robots are fully argued With type of parallel robot, the initial mathematical models when transforming into optimal problem, the object function is the quadratic function, so directly apply the GRG to solve the kinematic problem but the initial mathematical models of type and type robots are the quaternary function, which is incompatible with the proposed method Thus, the dissertation proposes to solve this problem by using the equivalent substitution configuration to downgrade the object function form of the III two types of robots (type and type 3) from quaternary function to quadratic function, which is compatible with the proposed method Thirdly, the Microsoft-Excel solver application supports mathematical resolution, to illustrate the example, by solving the kinematic problem of the robot for some typical parallel robots for each type of robot are presented in detail The assurance of a unique solution between two different spaces (joint space and work space) has been fully argued The results of the reliability and precision tests showed that the proposed method was very reliable and accurate By comparing with other algorithms to solve an optimal problem, which are Sequential Quadratic Programming and the Genetic Algorithm to solve the optimal kinematic problem, the proposed method has exceeded the accuracy (approximately from 102 to 104 times) and has shorter execution time Fourthly, the results of the inverse kinematic problem are used as information to control the trajectory of the robot in real time, presented in detail and illustrated by the Adams simulation software as well as experiments in the Scara parallel robot Experimental results demonstrated the capability, accuracy and feasibility of the proposed method when applied to robot control in practice Finally, in addition to solving the kinematic problem of the parallel robot, the dissertation also developed a new application of the method proposed in the field of the manufacture of robots in order to design the tolerances of the components (links and joints) to ensure the given accuracy of the end effector and vice versa This technique applies not only to parallel robots but also to the robot arm Two examples are used to verify the feasibility of the above method and the calculated result that the method can produce tolerance allocations accurately and efficiently Key words: Parallel robot; kinematics problem; optimization problem; equivalent structure; General Reduced Gradient method; tolerance design IV South China University of Technology double radians(double angle) { return ((double)Math.PI / 180) * angle; } private double degrees(double angle) { return angle * (180.0 / Math.PI); } void fDrawOM1(double alpha) { alpha = radians(alpha); M1x = A + L * (double)Math.Cos(alpha); M1y = L * (double)Math.Sin(alpha); fLine(O1x, O1y, M1x, M1y, Color.Yellow, 7); _O1x = O1x; _O1y = O1y; _M1x = M1x; _M1y = M1y; } void fDrawOM2(double alpha) { alpha = radians(alpha); M2x = -A + R * (double)Math.Cos(alpha); M2y = R * (double)Math.Sin(alpha); fLine(O2x, O2y, M2x, M2y, Color.Yellow, 7); _O2x = O2x; _O2y = O2y; _M2x = M2x; _M2y = M2y; } void TimCxy1(double a, double b, double m, double n) { double G, H; double c = a * a + b * b - R * R; double p = m * m + n * n - R * R; double x1, y1, x2, y2; G = (m - a) / (b - n); H = (c - p) / (2 * (b - n)); double A = G * G + 1; double B = * (G * H - m - n * G); double C = H * H - * n * H + p; if (B * B - * A * C >= 0) { x1 = (-B + (double)Math.Sqrt(B * B - * A * C)) / (2 * A); x2 = (-B - (double)Math.Sqrt(B * B - * A * C)) / (2 * A); y1 = x1 * G + H; y2 = x2 * G + H; //Output: C1x = x1; C1y = y1; C2x = x2; C2y = y2; } } /* * * * o C / \ / \ / \ 214 Appendix I * / \ * / \ * / \ * O M1 \ * \ O M2 * \ \ * \ \ * \ \ *\ \ * o _o O1 O2 * */ public void setup(double height, double width) { _H2 = 4.5 * height / 5; _W2 = width / 2; O1x O1y O2x O1y Cx0 Cy0 C1x C1y C2x C2y = = = = = = = = = = A; 0; -A; 0; -19.44771; 166.20479; 6.987565; 330.8239; -392.63895; -4.498352; TotalNpu1 = 0; TotalNpu2 = 0; cnt = 1; kk = 0; MaxCnt = Nmax; _alpha = 171.244; _beta = 108.7572; fDrawOM1(_alpha); fDrawOM2(_beta); alpha0 = _alpha; beta0 = _beta; TimCxy1(M1x, M1y, M2x, M2y); XacDinhC0xC0y(); stopwatch.Reset(); stopwatch.Start(); } public Stopwatch stopwatch = new Stopwatch(); public void DrawAxis() { } public void DrawAllPoint() { } void XacDinhC0xC0y() { d1 = LineLength(Cx0, Cy0, C1x, C1y); d2 = LineLength(Cx0, Cy0, C2x, C2y); if (d1 = (cnt / MaxCnt) * (tSP[kk + 1] - tSP[kk]) + tSP[kk]) && (kk < 32)) { if (cnt < MaxCnt) { cnt++; } else { break; } Tms = stopwatch.ElapsedMilliseconds; } if (Tms < (cnt / MaxCnt) * (tSP[kk + 1] - tSP[kk]) + tSP[kk]) { T = Tms; alpha0 = _alpha; beta0 = _beta; if (EqFromFile) { Fi(kk, T / 1000); } else { double[] Albe = new double[]{ 1.720801725 , 1.420790928 , 1.647359974 , 1.439343808 , 1.554125063 , 1.416869256 , 1.457942027 , 1.374206588 , 1.361302611 , 1.319543855 , 1.266675683 , 1.256105369 , 1.184601186 , 1.18517187 , 1.149727603 , 1.10807712 , 1.202894718 , 1.037277171 , 1.308432698 , 1.014364004 , 1.407312009 , 1.036591516 , 1.494345981 , 1.08160872 , 1.572029684 , 1.139691729 , 1.640577572 , 1.206333671 , 1.697143156 , 1.27899333 , 1.732568712 , 1.354932335 , 1.720801725 , 1.420790928 , 1.702248846 , 1.49423268 , 1.724723398 , 1.58746759 , 1.767386066 , 1.683650627 , 1.822048798 , 1.780290042 , 1.885487285 , 1.874916971 , 1.956420784 , 1.956991468 216 Appendix I , 2.033515534 , 1.99186505 , 2.104315482 , 1.938697935 , 2.12722865 , 1.833159956 , 2.105001137 , 1.734280645 , 2.059983933 , 1.647246672 , 2.001900924 , 1.56956297 , 1.935258983 , 1.501015082 , 1.862599324 , 1.444449497 , 1.786660319 , 1.409023942 }; } TextWriter file = new StreamWriter("_Functions_data_DF.csv", true); file.WriteLine(String.Format("{0},{1},{2},{3}", kk, cnt, F1, F2)); file.Close(); _alpha = degrees(F2); _beta = degrees(F1); fDrawOM1(_alpha); fDrawOM2(_beta); NpuDeltaAngle1 = (_alpha - alpha0) * HSxung1 + angRemain1; NpuDeltaAngle2 = (_beta - beta0) * HSxung2 + angRemain2; if (firstCalangle) { NpuDeltaAngle1 = 0; NpuDeltaAngle2 = 0; firstCalangle = false; } angRemain1 = NpuDeltaAngle1 - (int)NpuDeltaAngle1; angRemain2 = NpuDeltaAngle2 - (int)NpuDeltaAngle2; NpuDeltaAngle1 = (int)NpuDeltaAngle1; NpuDeltaAngle2 = (int)NpuDeltaAngle2; TotalNpu1 = TotalNpu1 + NpuDeltaAngle1; TotalNpu2 = TotalNpu2 + NpuDeltaAngle2; Form1.f1NpuDeltaAngle1 = NpuDeltaAngle1; Form1.f1NpuDeltaAngle2 = NpuDeltaAngle2; Form1.f1NpuTotal1 = TotalNpu1; Form1.f1NpuTotal2 = TotalNpu2; Console.WriteLine("F{0} \t{1} \t{2}", kk, NpuDeltaAngle1, NpuDeltaAngle2); if (Form1.chkSavedata2file) { if (!File.Exists(Form1.dataFullFileName)) { Directory.CreateDirectory(Form1.datapathOnly); TextWriter tw = new StreamWriter(Form1.dataFullFileName); tw.WriteLine("Function Fi, Alpha2 (degree), Alpha1 (degree), Time (ms), X, Y, (_alpha - alpha0), NpuDeltaAngle1 , TotalNpu1, Start Now=" + DateTime.Now.ToLongTimeString()); tw.Close(); } else { TextWriter tw = new StreamWriter(Form1.dataFullFileName, true); 217 South China University of Technology tw.WriteLine("F" + (kk + 1) + "," + _alpha + "," + _beta + "," + stopwatch.ElapsedMilliseconds + "," + _CX[CXYcnt - 1] + "," + _CY[CXYcnt - 1] + "," + (_alpha - alpha0) + "," + NpuDeltaAngle1 + "," + TotalNpu1); tw.Close(); } } TimCxy1(M1x, M1y, M2x, M2y); XacDinhC0xC0y(); if (CXYcnt < 10000 - 1) { if ((Cx0 == 0) && (Cy0 == 0)) { Cx0 = C1x; Cy0 = C1y; } XacDinhC0xC0y(); _Color[CXYcnt] = kk % 4; CXYcnt++; } _C1x = C1x; _C1y = C1y; } if (Tms > tSP[kk + 1]) { cnt = 1; MaxCnt = Nmax; if (++kk > 31) { kk = 0; stopwatch.Reset(); stopwatch.Start(); stopwatch.Stop(); Form1 x = new Form1(); x.btnStop_Click(null, null); } } } string[] st = new string[50]; string[] sF1 = new string[50]; string[] sF2 = new string[50]; double T1F = 2.5; public void Read_AllFi_toStringArr() { String s=""; try { System.IO.StreamReader file = new System.IO.StreamReader("_Functions.txt"); file.ReadLine(); s = file.ReadToEnd(); s = s.Replace("\r\n", ""); file.Close(); } catch (Exception ex) { 218 Appendix I System.Windows.Forms.MessageBox.Show(ex.ToString(),"File open errors"); return; } String[] sBlock = s.Split('$'); for (int i = 0; i < sBlock.Length; i++) { string[] ss = sBlock[i].Split(';'); st[i] = ss[0]; sF1[i] = ss[1]; sF2[i] = ss[2]; } string tt = st[0].Substring(st[0].IndexOf("/") + 1); T1F=T = Convert.ToDouble(tt); } public double[] FiVL = new double[2]; public void GetFi12(int STT,double T) { if (String.IsNullOrEmpty( st[0]) ) { Read_AllFi_toStringArr(); } string st1 = st[STT]; st1 = st1.Replace("T", T.ToString()); st1 = st1.Remove(0, st1.IndexOf('=') + 1); Expression EX = new Expression(st1); double dt1 = (double)EX.Evaluate(), dt2 = dt1 * dt1, dt3 = dt2 * dt1, dt4 = dt3 * dt1, dt5 = dt4 * dt1; string s1 = sF1[STT]; s1 = s1.Replace("t1", dt1.ToString()); s1 = s1.Replace("t2", dt2.ToString()); s1 = s1.Replace("t3", dt3.ToString()); s1 = s1.Replace("t4", dt4.ToString()); s1 = s1.Replace("t5", dt5.ToString()); s1 = s1.Remove(0, s1.IndexOf('=') + 1); string s2 = sF2[STT]; s2 = s2.Replace("t1", dt1.ToString()); s2 = s2.Replace("t2", dt2.ToString()); s2 = s2.Replace("t3", dt3.ToString()); s2 = s2.Replace("t4", dt4.ToString()); s2 = s2.Replace("t5", dt5.ToString()); s2 = s2.Remove(0, s2.IndexOf('=') + 1); Expression exF1 = new Expression(s1); FiVL[0] = (double)exF1.Evaluate(); Expression exF2 = new Expression(s2); FiVL[1] = (double)exF2.Evaluate(); } double[,] arF1 = new double[32,200]; double[,] arF2 = new double[32,200]; public void EqProcess() { double Tinc=T1F/Nmax; Tms=0;kk=0; cnt=1;MaxCnt = Nmax; System.IO.StreamWriter file = new System.IO.StreamWriter("_Functions_data.csv"); file.WriteLine("Fi, cnt/MaxCNT, Alpha F1, Alpha F2"); do{ 219 South China University of Technology Tms += Tinc; if (Tms < (cnt / MaxCnt) * (tSP[kk + 1] - tSP[kk]) + tSP[kk]) { T = Tms; GetFi12(kk, T / 1000); arF1[kk,(int)cnt] = FiVL[0]; arF2[kk,(int)cnt] = FiVL[1]; file.WriteLine("{0},{1},{2},{3}", kk, cnt, FiVL[0], FiVL[1]); } if (++cnt > MaxCnt) { cnt = 1; MaxCnt = Nmax; kk++; } }while(kk