我有两个点,分别为source
和target
。我知道源的坐标(例如[-1 1]
),问题在于确定目标的位置(例如[1 -1]
)。
我有一些测量值,其中一个是从目标到源的箭头角度(即135 deg
)。
为了找到目标的位置,我定义了一个最小化的误差函数;我正在使用梯度下降算法,因此我有一个符号错误函数,如;
syms xs ys xt yt
z(xs,ys,xt,yt) = theta - asin((ys - yt)/((xs - xt)^2 + (ys - yt)^2)^.5);
其中theta
是测量角度,135 deg
(对于理想解z
,误差为零,135 - 135 = 0
)
还有其他测量值,我计算这些误差函数的雅可比行列式并最小化误差。
无论如何,问题在于此示例中的theta
为135 deg
,但我们知道asin
的输出为[-90 90]
,此示例为asin(1/2^.5) = 45 deg
1}}。所以对于正确的答案,我的错误函数z
不会为零,我需要更改我的错误函数,我应该使用什么?
我只需要一个错误函数,theta
变化超过[0 360]
,而asin
和atan
的范围为[-90 90]
,我不能因符号函数而使用if
语句。
答案 0 :(得分:2)
Matlab定义sym/atan2(Y,X)
如果没有,您可以使用
创建它function [ theta ] = atan2( dy,dx )
%ATAN2 Four Quadrant Arc Tangent Function
%
if dx>0
theta = atan(dy/dx);
elseif dx<0
theta = atan(dy/dx)+sign(dy)*pi;
else
theta = sign(dy)*pi/2;
end
end
最后你可以像
一样使用它z = theta - atan2(ys - yt, xs - xt);
正如@LuisMendo指出的那样。
<强>更新强> Wikipedia提及
atan2(y,x) = 2*atan(y/(sqrt(x^2+y^2)+x));
答案 1 :(得分:1)
让phi
表示从源到目标的箭头角度。您需要一个非负和单峰的错误函数,仅theta==phi
的值为零。
该标准由函数
满足z = (cos(theta) - cos(phi))^2 + (sin(theta) - sin(phi))^2;
或等效地,使用xs
,ys
,xt
,yt
代替phi
,
z = (cos(theta) - (xs-xt)/((xs - xt)^2 + (ys - yt)^2)^.5)^2 + ...
(sin(theta) - (ys-yt)/((xs - xt)^2 + (ys - yt)^2)^.5)^2;
此误差函数具有以下解释:如果角度theta
和phi
表示为单位圆中的点,z
是和弦的平方长度< / em>加入这两点。
当然,只需将sqrt
应用于上面的表达式,就可以用长度(而不是平方长度)来定义错误;并且可以在0
和1
之间进行归一化,然后除以2
。