Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 与圆切线的角度_Matlab_Math_Geometry_Robotics - Fatal编程技术网

Matlab 与圆切线的角度

Matlab 与圆切线的角度,matlab,math,geometry,robotics,Matlab,Math,Geometry,Robotics,我无法上传图片,所以我会尽力最好地解释我的问题。我想模拟独轮车型机器人对运动物体的检测。以位置(x,y)和方向θ为三种状态对机器人进行建模。障碍物表示为半径为r1的圆。我想找到从机器人的局部坐标系到圆的角度alpha_1和alpha_2,如下所示: 所以我要做的是找到机器人与连接机器人和圆心的直线之间的角度(这个角度在我的代码中称为aux_t),然后找到切线和同一直线之间的角度(称为phi_c)。最后,我将通过从aux_t中加减phi_c来找到我想要的角度。我想到的图表如下所示: 问题是,当

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

所以我要做的是找到机器人与连接机器人和圆心的直线之间的角度(这个角度在我的代码中称为aux_t),然后找到切线和同一直线之间的角度(称为phi_c)。最后,我将通过从aux_t中加减phi_c来找到我想要的角度。我想到的图表如下所示:

问题是,当我试图找到alpha角时,我的代码遇到了麻烦:它开始正确地计算角度(虽然是负值,但不确定这是否是造成我麻烦的原因),但随着汽车和圆环越来越近,phi_c变得比aux_t大,其中一个alpha突然改变了符号。例如,我得到以下信息:

aux\u t/////strong>phi\u c/////strong>alpha\u 1///////strong>alpha\u 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。有没有更好的方法找到阿尔法角?
这是我的代码部分:

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

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

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

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

如果你真的希望你的角度在0和π之间,你可以用
mod(θ,π)
代替

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

点位于p,圆位于O,半径为r。 你想要与通过P的圆相切,校准T

我们知道距离OP,我们知道距离OT,也就是r, 我们知道角度PTO是一个直角。 所以我们用毕达哥拉斯算出距离TP。然后cosθ(the 角度选项为TP/OP。 我们可以节省一步,计算sinθ,但是cosθ 更容易处理,因为它给了我们 方向向量PT和PO。通常你并不需要
调用acos()。

这可能是因为
atan2
返回了-pi和pi之间的
aux\u t
值,所以当它越过那条半线时,它会立即改变符号。非常感谢我们宝贵的帮助。我的怀疑来自于我不是(现在仍然不是)的事实得到了我想要的最终机器人的行为,所以当我开始对程序进行故障排除时,我提到的数字对我来说似乎不自然,并认为它们可能会对控制律产生负面影响。然而,在看了你的答案后,这很有意义,我没有想到第二条切线会指向另一个si关于机器人的方向。我会使用2*pi的模作为我的阿尔法角,并检查我还能在哪里出错。谢谢