【问题标题】:Angle to a circle tangent line与圆切线的角度
【发布时间】:2016-03-13 12:25:28
【问题描述】:

我无法上传图片,所以我会尽力解释我的问题。我想模拟独轮式机器人对移动物体的检测。机器人以位置 (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。有没有更好的方法来找到阿尔法角? 这是我的代码部分:

【问题讨论】:

  • 这可能是因为 atan2 在 -pi 和 pi 之间返回了 aux_t 的值,所以它一越过那条半线就会改变符号。

标签: matlab math geometry robotics


【解决方案1】:

就你的数学计算而言,我要做的唯一改变是减去 (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);

【讨论】:

  • 非常感谢我们提供的宝贵帮助。我的怀疑来自这样一个事实,即我没有(现在仍然没有)得到我想要的最终机器人的行为,所以当我开始对程序进行故障排除时,我提到的数字对我来说似乎不自然,并认为它们可能会对控制规律。但是,在查看您的答案之后,这很有意义,我没有想到第二条切线相对于机器人的方向朝向另一侧。我会使用 2*pi 的 mod 作为我的 alpha 角度,并检查我可能会出错的地方。问候
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多