文章目录
一、采用 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
Δy≈f′(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)=1−x21∈[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)=1−x2−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)。
二、采用 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<0且y<0
(
2
)
x
<
0
且
y
=
0
(2)x<0且y=0
(2)x<0且y=0
(
3
)
x
<
0
且
y
>
0
(3)x<0且y>0
(3)x<0且y>0
(
4
)
x
=
0
且
y
<
0
(4)x=0且y<0
(4)x=0且y<0
(
5
)
x
=
0
且
y
=
0
(5)x=0且y=0
(5)x=0且y=0
(
6
)
x
=
0
且
y
>
0
(6)x=0且y>0
(6)x=0且y>0
(
7
)
x
>
0
且
y
<
0
(7)x>0且y<0
(7)x>0且y<0
(
8
)
x
>
0
且
y
=
0
(8)x>0且y=0
(8)x>0且y=0
(
9
)
x
>
0
且
y
>
0
(9)x>0且y>0
(9)x>0且y>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=0且y=0切换到
x
>
0
且
y
=
0
x>0且y=0
x>0且y=0这种情况,不会导致跳变(由于
x
=
0
且
y
=
0
x=0且y=0
x=0且y=0无定义,所以,可以认为36种情况都会跳变)。因此,在连续插补运动中,若逆解采样
a
t
a
n
2
(
y
,
x
)
atan2(y,x)
atan2(y,x)函数,则连续两次插补的关节角度,一定要判断两次关节角度是否跳变(也即关节速度是否超限)。
三、参考文献/资料
机器人动力学与控制 霍伟