如何在MATLAB中检测严格的顺时针/逆时针运动



我需要写一个小程序来测试一条线(位置向量)是否严格顺时针或CCLW运动。我试着用atand来求角度,但是当它超过90度时,它可以从负值跳到正值,如果我用斜率法,它会有同样的事情。

然而,运动不一定要在90度处切割,它可以从89度跳到91度。然后可能会发生大的坡度跳跃。有什么想法吗?

谢谢

一种方法是计算连续位置向量的外积。如果所有的叉乘都是正的,那么直线的移动是严格顺时针的。同样地,如果它们都是负的,那么直线逆时针移动。如果符号是混合的,那么线没有严格地沿一个角度方向移动:

function checkRotation(pos)
pos(:,3) = 0;
pos = unique(sum(sign(cross(pos(1:end-1,:), pos(2:end,:))), 2));
if isequal(pos, 1)
    disp('Rotation was counter-clockwise');
elseif isequal(pos, -1)
    disp('Rotation was clockwise');
else
    disp('No strict rotation direction');
end

-10<=x<=10-10<=y<=10上创建一些随机位置向量并测试旋转:

<>之前>> pos = 20 * rand([10,2]) - 10pos =-8.28968405819912 9.26177078573826-4.75035530603335 - 0.9361143747793596.02029245539477 - 0.422716616080031-9.41559444875707 - 5.368112265829528.57708278956089 - -0.2220451215966614.60661725710906 2.48120176347379-0.227820523928417 3.582710817314951.57050122046878 - 2.08969568662814-5.25432840456957 - 2.65126702911047-0.823023436401378 9.75964006323266>> checkRotation (pos)没有严格的旋转方向之前

创建只移动CCW和test的位置向量:

<>之前>> theta = 0:15:18;>> pos = [cosd(theta)' sin (theta)'];>> checkRotation (pos)逆时针旋转之前

和CW旋转类似:

<>之前>> theta = 180:-15:0;>> pos = [cosd(theta)' sin (theta)'];>> checkRotation (pos)旋转是顺时针的之前

请注意,旋转检测的成功受到采样率的限制。如果直线在连续采样的直线位置逆时针旋转180度以上,则与顺时针方向旋转小于180度无法区分。这是一个混叠的例子。

最新更新