为什么机器人运动学逆解最好采用双变量反正切函数atan2而不用反正/余弦函数?

一、采用 a t a n 2 ( y , x ) atan2(y,x) atan2(y,x)的三点优势

  机器人运动学逆解最好采用双变量反正切函数 a t a n 2 atan2 atan2而不用反正/余弦函数 a s i n asin asin a c o s acos acos的原因主要有:
   1 1 1.反正弦函数 a s i n ( x ) asin(x) asin(x)的值域为 [ − π / 2 , π / 2 ] [-\pi/2,\pi/2] [π/2,π/2],反余弦函数 a c o s ( x ) acos(x) acos(x)的值域为 [ 0 , π ] [0,\pi] [0,π],而双变量反正切函数 a t a n 2 ( y , x ) atan2(y,x) atan2(y,x)的值域为 [ − π , π ] [-\pi,\pi] [π,π]。机器人关节角度范围一般在 [ − π , π ] [-\pi,\pi] [π,π]之间,采用 a t a n 2 ( y , x ) atan2(y,x) atan2(y,x)更加方便、直接,避免了额外的角度范围判断。
   2 2 2. a t a n 2 ( y , x ) atan2(y,x) atan2(y,x)相对于 a s i n ( x ) asin(x) asin(x) a c o s ( x ) acos(x) acos(x),对输入变量 x x x y y y具有更好的容错性。这里的容错性,主要是指由于计算精度的影响, x x x的实际计算值有可能稍微大于1或小于-1,这时 a s i n ( x ) asin(x) asin(x) a c o s ( x ) acos(x) acos(x)的值是未定义的,而 a t a n 2 ( y , x ) atan2(y,x) atan2(y,x)可以得到正确的结果。当然,我们也可以通过判断 x x x的值在计算误差范围内是否可以认为是-1或1,强制赋值为-1或1,从而解决这个问题。
   3 3 3.对于函数 y = f ( x ) y=f(x) y=f(x) x x x的误差 Δ x \Delta x Δx引起 y y y的误差为 Δ y ≈ f ′ ( x ) Δ x \Delta y\approx f'(x)\Delta x Δyf(x)Δx
  若 f ( x ) = a s i n ( x ) f(x)=asin(x) f(x)=asin(x),当 x ∈ ( − 1 , 1 ) x\in(-1,1) x(1,1)时, f ′ ( x ) = 1 1 − x 2 ∈ [ 1 , + ∞ ) f'(x)=\frac{1}{\sqrt{1-x^2}}\in[1,+\infty) f(x)=1x2 1[1,+)
  若 f ( x ) = a c o s ( x ) f(x)=acos(x) f(x)=acos(x),当 x ∈ ( − 1 , 1 ) x\in(-1,1) x(1,1)时, f ′ ( x ) = − 1 1 − x 2 ∈ ( − ∞ , − 1 ] f'(x)=\frac{-1}{\sqrt{1-x^2}}\in(-\infty,-1] f(x)=1x2 1(,1]
  若 f ( x ) = a t a n ( x ) f(x)=atan(x) f(x)=atan(x),当 x ∈ ( − ∞ , + ∞ ) x\in(-\infty,+\infty) x(,+)时, f ′ ( x ) = 1 x 2 + 1 ∈ ( 0 , 1 ] f'(x)=\frac{1}{x^2+1}\in(0,1] f(x)=x2+11(0,1]
  由于实际机器人的臂长、零点、减速比等运动学参数有误差,使用 a s i n ( x ) asin(x) asin(x) a c o s ( x ) acos(x) acos(x)误差会放大,从保证逆解精度均匀性来看,在求解机器人运动学逆解时宜采用 a t a n 2 ( y , x ) atan2(y,x) atan2(y,x)
atan2(y,x)

二、采用 a t a n 2 ( y , x ) atan2(y,x) atan2(y,x)的两个坑

  1.当 x = 0 x=0 x=0 y = 0 y=0 y=0时,无定义( 在matlab、lua、vs上测试过,atan2(0,0)=0,其他编译环境可能结果不一样 )。在编写程序时,如果 x x x y y y有同时为0,则一定要做异常处理。

  if (fabs(x - 0.0) < 1.0e-4 && fabs(y - 0.0) < 1.0e-4)
  {
    //异常处理
  }

  通常,当六轴机器人手腕中心在基坐标系的z轴上时, x = 0 x=0 x=0 y = 0 y=0 y=0,此时机器人处于肩部奇异位置,关节1有无穷多个解。
  2.通过观察 a t a n 2 atan2 atan2的分段表达式,可以知道:当x与y的取值变化时, a t a n 2 atan2 atan2可能会切换表达式,发生跳变,所有的跳变情况都和x或y是否“过零”有关。虽然上述第一点做了异常处理,但是在连续插补运动中,两个插补点可能跳过0值,例如自-0.1跳至0.1,躲过判断条件if (fabs(x - 0.0) < 1.0e-4 && fabs(y - 0.0) < 1.0e-4)。
  下面把所有x和y的取值列出,分9种情况:
   ( 1 ) x < 0 且 y < 0 (1)x<0且y<0 (1)x<0y<0
   ( 2 ) x < 0 且 y = 0 (2)x<0且y=0 (2)x<0y=0
   ( 3 ) x < 0 且 y > 0 (3)x<0且y>0 (3)x<0y>0
   ( 4 ) x = 0 且 y < 0 (4)x=0且y<0 (4)x=0y<0
   ( 5 ) x = 0 且 y = 0 (5)x=0且y=0 (5)x=0y=0
   ( 6 ) x = 0 且 y > 0 (6)x=0且y>0 (6)x=0y>0
   ( 7 ) x > 0 且 y < 0 (7)x>0且y<0 (7)x>0y<0
   ( 8 ) x > 0 且 y = 0 (8)x>0且y=0 (8)x>0y=0
   ( 9 ) x > 0 且 y > 0 (9)x>0且y>0 (9)x>0y>0
  在0附近的两个点,在以上任意两种情况切换,共有 C 9 2 = 36 C_9^2=36 C92=36种情况。
  计算36种情况的 a t a n 2 ( y , x ) atan2(y,x) atan2(y,x)值matlab代码:

clc
clear
delta = 0.01;
xy = [-delta, -delta    %x < 0 and y < 0
    -delta, 0           %x < 0 and y = 0
    -delta, delta       %x < 0 and y > 0
    0, -delta           %x = 0 and y < 0
    0, 0                %x = 0 and y = 0
    0, delta            %x = 0 and y > 0
    delta, -delta       %x > 0 and y < 0
    delta, 0            %x > 0 and y = 0
    delta, delta        %x > 0 and y > 0
    ];

theta = zeros(nchoosek(9, 2), 2);
n = 1;
for i = 1 : 9
    for j = i + 1 : 9
        theta(n, 1) = atan2(xy(i, 2), xy(i, 1)) * 180 / pi;
        theta(n, 2) = atan2(xy(j, 2), xy(j, 1)) * 180 / pi;
        n = n + 1;
    end
end
theta

在这里插入图片描述
  可以得到:36种情况中,只有 x = 0 且 y = 0 x=0且y=0 x=0y=0切换到 x > 0 且 y = 0 x>0且y=0 x>0y=0这种情况,不会导致跳变(由于 x = 0 且 y = 0 x=0且y=0 x=0y=0无定义,所以,可以认为36种情况都会跳变)。因此,在连续插补运动中,若逆解采样 a t a n 2 ( y , x ) atan2(y,x) atan2(y,x)函数,则连续两次插补的关节角度,一定要判断两次关节角度是否跳变(也即关节速度是否超限)。

三、参考文献/资料

机器人动力学与控制 霍伟

PUMA560机器人是一种六自由度的工业机器人,常用于机器人运动学研究和控制。运动学逆解是通过已知机器人末端执行器的位置和姿态,计算出每个关节的角度值,以实现机器人的精确定位和控制。MATLAB是一种常用的数学软件,也被广泛应用于机器人运动学逆解的计算。 以下是一种基于MATLAB的PUMA560机器人运动学逆解的实现方法: 1. 定义机器人的DH参数 DH参数是描述机器人关节之间距离和相对姿态的参数,需要先进行定义。对于PUMA560机器人,其DH参数如下: alpha = [0 -pi/2 0 pi/2 -pi/2 0]; a = [0.4318 0 0.0203 0 0 0]; d = [0.1491 0 0 0.4331 0 0.068]; theta = [q1 q2 q3 q4 q5 q6]; 其中,alpha、a、d分别表示前后相邻关节旋转轴线之间的夹角、相邻关节的距离、相邻关节的偏移量,而theta则是每个关节的角度值,即运动学逆解需要求解的量。 2. 计算机器人各关节的转换矩阵 根据DH参数,可以计算出每个关节的转换矩阵,即T01、T12、T23、T34、T45、T56。这些矩阵可以使用MATLAB中的Tz、Tx、Rz、Rx等函数进行计算。具体实现方法如下: T01 = Rz(theta(1))*Tx(a(1))*Tz(d(1))*Rx(alpha(1)); T12 = Rz(theta(2))*Tx(a(2))*Tz(d(2))*Rx(alpha(2)); T23 = Rz(theta(3))*Tx(a(3))*Tz(d(3))*Rx(alpha(3)); T34 = Rz(theta(4))*Tx(a(4))*Tz(d(4))*Rx(alpha(4)); T45 = Rz(theta(5))*Tx(a(5))*Tz(d(5))*Rx(alpha(5)); T56 = Rz(theta(6))*Tx(a(6))*Tz(d(6))*Rx(alpha(6)); 3. 计算机器人末端执行器的位姿矩阵 根据机器人的DH参数和各关节的转换矩阵,可以计算出机器人末端执行器的位姿矩阵T06,即机器人的正向运动学矩阵。具体实现方法如下: T06 = T01*T12*T23*T34*T45*T56; 4. 计算机器人各关节的角度值 根据机器人末端执行器的位姿矩阵T06,可以计算出机器人各关节的角度值,即机器人的逆向运动学解。具体实现方法如下: T06 = simplify(T06); x = T06(1,4); y = T06(2,4); z = T06(3,4); r = sqrt(x^2 + y^2); q1 = atan2(y, x); q3 = acos((r^2 + (z - d(1))^2 - a(2)^2 - a(3)^2)/(2*a(2)*a(3))); q2 = atan2(z - d(1), r) - atan2(a(3)*sin(q3), a(2) + a(3)*cos(q3))); q5 = acos((T06(3,1)*sin(q1) - T06(2,1)*cos(q1))/sin(q4)); q4 = atan2(-T06(2,3)*cos(q1) - T06(3,3)*sin(q1), T06(2,2)*cos(q1) + T06(3,2)*sin(q1)); q6 = atan2(T06(1,2)*sin(q1) - T06(1,3)*cos(q1), T06(1,3)*sin(q1) + T06(1,2)*cos(q1)); 最终,q1到q6就是机器人各关节的角度值,即为机器人运动学逆解
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值