我正在研究四旋翼。我知道它的位置-$ a $,我想去的位置-目标位置$ b $,然后我计算出一个向量$ c $-一个将我带到目标的单位向量:

c = b - a
c = normalize(c)


由于四旋翼飞机可以沿任何方向移动而不旋转,所以我尝试做的是


旋转$ c $机器人偏航角
将其拆分为$ x,y $分量
将它们作为侧倾角和俯仰角传递给机器人。

问题是,如果偏航角为0°±5,则此方法有效,但如果偏航角接近+90或-90,则它将失败并转向错误的方向。我的问题是我在这里缺少明显的东西吗?

评论

您如何计算偏航角?另外,您正在使用什么控制器以及如何发送数据?

@Hamza有趣的问题,欢迎来到Robotics。

@Hamza,您使用什么语言和系统?我还使用Atmega328和Ada编程语言开发四轴飞行器。如果您有关于该项目的博客,请分享。

您是正确的@MarkBooth,我打开了两个标签,并打算将其他帖子标记为重复。我错误地标记了这个,没有办法撤消它。鉴于需要多于一票才能将其关闭,我认为这不会成为问题。但是我没有意识到它代表我发表了评论。

没问题@DaemonMaker这些事情发生了。现在,以重复投票方式关闭时会自动发布评论,我认为这是一个有用的功能,因为它会提示人们在自己进行紧密投票之前先审查另一个问题。

#1 楼

重新实现您的解决方案,得到的是:

向量之间的角度

首先,您想要点$ A $和$ B $之间的角度-而不是单位向量。


(通过Fx编程):
$ \ theta = math.atan2(B_ {x} -A_ {x},B_ {y} -A_ { y})$

车辆偏航角

接下来(我怀疑这是您的问题),您需要从计算出的$中减去车辆的偏航角$ \ psi $ \ theta $。

航向vs偏航

如果您使用指南针指示车辆的“偏航角”,这也可能是您的错误;航向和偏航不同。
指南针方向沿$ y $正轴为零,并随着顺时针方向旋转而增大:



沿$ x $正轴偏航为零,随着其逆时针旋转而增加:



这些测量之间的90度重叠,再加上从期望的偏航中添加(而不是减去)车辆的偏航,可能是为什么当目标在±5°范围内并且在±90°范围内表现不佳时,一切都会起作用。将$(\ theta- \ psi)$转换成其$ x $和$ y $分量,并将它们作为侧倾角和俯仰角传递给机器人。通过上述更正,您现在应该会获得所需的结果。但是,直接将这些分量映射到倾斜角度可能会遇到问题,因为您仅考虑位置的差异,而不考虑车辆的速度(实际上是动量)。

PID控制

使用PID控制回路为车辆的侧倾和俯仰提供最好的服务。就是说,一旦您修复了代码并能够达到目标,我的猜测是您将开始超调它-来回摆动。正确调整的PID将阻止这种情况的发生,同时仍然允许您快速接近目标。

不要将$ x $和$ y $插入滚动和俯仰,而是将它们视为滚动和俯仰PID接受的误差值。

评论


$ \ begingroup $
在那里进行了一些编辑,超过90%并完全改变了答案(从PID到ATAN2)。但是,您浮华的图形公式技能是野兽!
$ \ endgroup $
– Spiked3
2012-12-27 17:42

$ \ begingroup $
我仍然推荐PID(它在底部),我只是在问题的开始部分进行了工作,以确保我的假设是正确的。图形公式是Latex格式的一部分,值得一看。
$ \ endgroup $
–伊恩
2012-12-27 17:51



$ \ begingroup $
“罗盘航向从y轴的正方向开始,并顺时针增加,而偏航从x轴的正方向开始,并沿逆时针方向增加”参考? “将(θ-ψ)的x分量转换为滚动,将y分量转换为俯仰”我根本不明白这一点-请提供更多解释(我错过了一些东西)。
$ \ endgroup $
– Spiked3
2012-12-27 18:46

$ \ begingroup $
最初的问题提到“将[x和y分量]作为侧倾角和俯仰角传递给机器人”,对我来说,这表明四轴飞行器通过改变侧倾角来左右移动,而通过改变侧倾角来向前和向后移动俯仰角。我将添加一些清晰度。
$ \ endgroup $
–伊恩
2012年12月27日在20:30

$ \ begingroup $
整洁。我从来没有见过那样做过。我已经看到并做了自己,只需翻转cos / sin即可获得相同的结果。我将不得不在滚动/音调上再考虑一些。是的,那会引起运动,但是我不确定这与您的位置和去向有什么关系,除了您到达那里的速度。谢谢。
$ \ endgroup $
– Spiked3
2012-12-27 22:38

#2 楼

我假设您在这里谈论的是3D矢量。您能像这样概括一下normalize()吗?这是常见的吗(如果我是从未见过的,那么对我来说就是新闻)。否则,明显的指南针换行问题将应用于X和Y分量。为什么不称它们为滚动和/或俯仰和/或偏航? (混合使用3D和2D命名法会使这个问题感到困惑)。

我的2D规范化看起来像这样;

int Pilot_QuickestTurnTo(int hdgNow, int hdgNew)
{
    hdgNow = Pilot_Hdg360(hdgNow);
    hdgNew = Pilot_Hdg360(hdgNew);
    if (hdgNow < hdgNew)
        hdgNow += 360;
    int left = hdgNow - hdgNew;
        return (left < 181 ? -left : 360 - left);
}


如果确实是四边形,我假设您的X和Y分量实际上是YAW,海拔((X,Y)&Z)。您需要处理2D中的YAW(X, Y),然后简单地降低或增加Z的高度(这也是为什么我怀疑归一化比您拥有的要多)。