圆切线的角度

Angle to a circle tangent line

我无法上传图片所以我会尽量解释我的问题。我想模拟独轮车型机器人对移动物体的检测。机器人以位置 (x,y) 和方向 theta 作为三种状态进行建模。障碍物表示为半径为 r1 的圆。我想求机器人局部坐标系到圆的角度alpha_1和alpha_2,如下图:

所以我正在做的是尝试找到从机器人到连接机器人和圆心的线的角度(这个角度在我的代码中称为 aux_t),然后找到切线和同一条线(称为phi_c)。最后,我会通过从 aux_t 中加减 phi_c 来找到我想要的角度。我想到的图如图:

问题是当我试图找到 alpha 角度时,我的代码遇到了问题:它开始正确计算角度(虽然是负值,不确定这是否会导致我的麻烦)但是作为汽车并且 cicle 越来越近,phi_c 变得比 aux_t 大,其中一个 alpha 突然改变了它的符号。例如我得到这个:

aux_t//////phi_c//////alpha_1//////alpha_2
-0.81//////+0.52//////-1.33//////-0.29

-0.74//////+0.61//////-1.35//////-0.12

-0.69//////+0.67//////-1.37//////-0.02

-0.64//////+0.74//////-1.38//////+0.1

所以基本上,alpha_2 在这里得到了错误的形式。我知道我做错了什么,但我不确定是什么,我不知道如何将角度从 0 限制到 pi。有没有更好的方法来找到 alpha 角? 这是我的代码部分:

就您的数学而言,我要做的唯一改变是从目标角度减去 (pi/2 - theta)而不是添加它。这将为您提供更典型方向的角度(逆时针方向为正)。

我不完全确定为什么您认为 alpha_2 在您的回答中发布的数据是错误的。发生的情况是您的机器人非常接近目标并且 alpha_2 切线实际上移动到另一侧或指向您的机器人正在看的方向的线。我在这里创建了一个类似的情况,切线上的标签是相对于机器人的角度(黄线)并且所有角度都被强制在 0 到 2*pi 之间。

为了解决您关于强制角度在特定范围内的问题。为此,您需要使用模数(MATLAB 中的 mod)。在这些示例中,我使用了 mod(theta, 2*pi),因为从技术上讲,如果您的机器人面向 远离目标 ,则角度可以大于 pi。

作为测试,我进行了一个简单的模拟,让机器人四处移动并显示切线相对于机器人方向的角度(同样,在 0 到 2pi 之间)

如果您真的希望角度介于 0 和 pi 之间,则可以改用 mod(theta, pi)

alpha_1 = mod(alpha_1, pi);
alpha_2 = mod(alpha_2, pi);

点在P,圆在O,半径r。 您想要通过 P 的圆的切线,将其命名为 T

所以我们知道距离OP,我们知道距离OT,也就是r, 我们知道角度 PTO 是直角。 所以我们使用毕达哥拉斯来获得距离 TP。然后cos theta( 角度 OPT 为 TP/OP。 我们可以节省一步并计算 sin theta,但是 cos theta 更容易处理,因为它给了我们点积 方向向量 PT 和 PO。通常你实际上并不需要 调用 acos().