用几何法求机器人逆解的过程中,怎样求解含有多个参数的矩阵方程中的参数

题主来答一下。
这是上学期的robotics and control 课程期末作业,求6轴机械臂的运动学正逆解,涉及到奇异点与几何法(还发现还有用神经网络求逆解的方法,实在是迪奥)。最后基本是按照老师的意思做下来了。问这个问题其实就是一个化简的问题,下面我再阐述得清楚一点。
提这个问题的时候是在用几何法求逆解,给定了位姿矩阵T。theta1、2、3这三个解决定了机械臂末端的位置,可以通过几何法求出多解,方法在Craig的《机器人导论》里面。而theta4、5、6决定了end effector的姿态,而这三个是耦合在一起的,不能由几何法直接解出。其解法如同高票和我问题描述的方法一样,通过矩阵等式R_456 = inv(R_123) * T就可以得出。问题在于R_456是个巨几把长的矩阵式(里面的theta4、5、6都是syms符号形式),如下:
X2 =最开始想的解决方法是有没有函数像ode函数解微分方程一样直接输入矩阵等式R_456 = inv(R_123) * T以及求三个求解数theta4、5、6就可以求解,找了一圈最后放弃了。这也是我最开始问这个问题的本意。(要是有大神知道,求告诉!)
后来请教了班里同在做这个project的大神,从他那里学来了化简R_456的方法,才解决这个问题。所以下面说的是如何化简一个含有代数式的巨麻烦的矩阵行列式。
在最开始建立DH表的时候,alpha角需要转化为弧度制,我们是这样建立的:
DR=pi/180alpha=a=d=theta=DR即为弧度转换因子。问题是这里的pi作为圆周率是一个无理数,所以出现了运算到最后那个矩阵的时候数字变得贼长。又可能是因为R_456中含有符号的缘故,vpa函数无法减小行列式里面的小数位数(可能需要所有数同时减小位数,而theta4、5、6又无法这样操作)。
【用几何法求机器人逆解的过程中,怎样求解含有多个参数的矩阵方程中的参数】 解决方法就是在最开始建立DH表之前输入
syms pi;这样pi作为符号就可以在后面的运算中约去,使得矩阵变得简单:
\u0026gt;\u0026gt; X2=A4*A5*A6X2 =而之前我们很容易求出 inv(R_123) * T的纯数值矩阵
\u0026gt;\u0026gt; X1=inv(A1*A2*A3)*TX1 = 1.0e+03 * 0.0003 -0.0009 0.0002 0.2250 -0.0003 0.0001 0.0009 1.2800 -0.0009 -0.0004 -0.0002 0.0000 0 0 0 0.0010X1=X2,根据矩阵内元素一一对应的原则建立三个合适的三元一次方程(这个要手算):
theta5=-acos(X1(2,3));theta4=acos(X1(3,3)/sin(theta5));theta6=acos(X1(2,1)/sin(theta5));即可解出这三个解。因为theta 1、2、3有多解的情况,求解的过程中要做好条件的对应。
另外要指出的是,当运行了syms pi;这一句后,机器人的模型无法生成,即drivebot(R,q)这个函数会出错,因为它生成模型需要特定的数值,而把圆周率符号化以后大量数据变为分数,无法给出有效的参数去生成机械臂位姿,所以会出错,这时候需要运行clear pi;再把建立模型的代码再运行一遍。同样,如果在输入syms pi;化简R_456之前我们已经在命令行里面运行了代码去建立机械臂模型,那么还需要把建立模型的代码连同syms pi;一起再运行一遍。即
syms pi DR=pi/180alpha=a=d=theta=A1=rotx(alpha(1))*transl(a(1),0,0)*rotz(theta(1))*transl(0,0,d(1))A2=rotx(alpha(2))*transl(a(2),0,0)*rotz(theta(2))*transl(0,0,d(2))A3=rotx(alpha(3))*transl(a(3),0,0)*rotz(theta(3))*transl(0,0,d(3))A4=rotx(alpha(4))*transl(a(4),0,0)*rotz(theta(4))*transl(0,0,d(4))A5=rotx(alpha(5))*transl(a(5),0,0)*rotz(theta(5))*transl(0,0,d(5))A6=rotx(alpha(6))*transl(a(6),0,0)*rotz(theta(6))*transl(0,0,d(6))%---------------------------------------------------------------------%运行syms pi 或 clear pi 后需重新运行横线以上部分的代码


推荐阅读