MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   如何正确计算移动物体的方向? (https://www.labfans.com/bbs/showthread.php?t=24129)

poster 2019-12-10 20:48

如何正确计算移动物体的方向?
 
我正在解决以下问题:我有一个对象,并且现在知道它的位置,并且在300毫秒前知道它的位置。我假设物体在移动。我有一个要让对象获得的点。

我需要的是以我知道是向左还是向右旋转的格式,从当前对象到目标点的角度。

这个想法是假设从最后一个已知位置到当前位置的当前角度。

我正在尝试在MATLAB中解决这个问题。我曾尝试使用atan2几种变体,但要么在某些情况下(例如,当我的对象绕圈运动时)获得错误的角度,要么在所有情况下都获得错误的角度。

搞砸的代码示例:

a = new - old; b = dest - new; alpha = atan2(a(2) - b(2), a(1) - b(1); 其中new是当前位置(例如x = 40; y = 60; new = [xy]; ), old是300ms的旧位置, dest是目的地。

[B]编辑[/B]

这是一张图片,通过一些示例来说明问题:

[IMG]https://i.stack.imgur.com/bf3UT.png[/IMG]

在上图中,绘制了一些点并进行了注释。黑线表示我们估计的物体当前朝向。

如果目的地是dest1我期望的角度约为88°。
如果目的地是dest2我期望的角度约为110°。
如果目的地是dest3我希望角度约为-80°。



[B]回答:[/B]

首先,您需要注意上面显示的样本图上的比例。 x轴刻度线以1的步长移动,而y轴刻度线以20的步长移动。两个轴经过适当缩放(如命令[URL="http://www.mathworks.com/help/techdoc/ref/axis.html"]axis equal[/URL] )的图片将比您要窄得多,因此您期望得到的角度不正确。预期角度将接近直角,与90度仅相差几度。

[URL="https://stackoverflow.com/questions/4209360/correctly-calculating-direction-for-moving-object/4209481#4209481"]Nathan得出[/URL]的方程对于列向量输入a和b :

theta = acos(a'*b/(sqrt(a'*a) * sqrt(b'*b))); 如果要更改此等式以使用行向量,则必须在点积和范数的计算中切换转置运算符,如下所示:

theta = acos(a*b'/(sqrt(a*a') * sqrt(b*b'))); 或者,您可以只使用[URL="http://www.mathworks.com/help/techdoc/ref/dot.html"]DOT[/URL]和[URL="http://www.mathworks.com/help/techdoc/ref/norm.html"]NORM[/URL]函数:

theta = acos(dot(a,b)/(norm(a)*norm(b))); 最后,您必须考虑方向,即角度应为正(顺时针旋转)还是负(逆时针旋转)。您可以通过计算b和a的[URL="http://en.wikipedia.org/wiki/Cross_product"]叉积[/URL]的z分量的符号来实现。如果为正,则角度应为正。如果为负,则角度应为负。使用函数[URL="http://www.mathworks.com/help/techdoc/ref/sign.html"]SIGN[/URL] ,我们的新公式变为:

theta = sign(b(1)*a(2)-b(2)*a(1)) * acos(dot(a,b)/(norm(a)*norm(b))); 对于您的示例,上述等式给出了您的三个点dest1 , dest2和dest3的角度为dest2和dest3 。


[B]注意:[/B]您需要[B]注意的[/B]一种特殊情况是,您的对象是否[I]直接[/I]远离目标点移动,即a和b之间的角度为180度。在这种情况下,您将必须选择一个任意的转向方向(左或右)和多个角度来转向(180度是理想的;))。这是使用函数[URL="http://www.mathworks.com/help/techdoc/ref/eps.html"]EPS[/URL]解决这种情况的一种方法:

theta = acos(dot(a,b)/(norm(a)*norm(b))); %# Compute theta if abs(theta-pi) < eps %# Check if theta is within some tolerance of pi %# Pick your own turn direction and amount here else theta = sign(b(1)*a(2)-b(2)*a(1))*theta; %# Find turn direction end

[url=https://stackoverflow.com/questions/4209360]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 01:03

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.