为什么机器人运动学逆解最好采用双变量反正切函数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)函数,则连续两次插补的关节角度,一定要判断两次关节角度是否跳变(也即关节速度是否超限)。

三、参考文献/资料

机器人动力学与控制 霍伟

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值