我有一个应用程序,我在罗盘标题上引导车辆,当车辆从360度过渡到0度时我遇到了问题。
在这种情况下,控制循环中没有智能来计算最接近标题的方法。
例如,如果指示车辆遵循360度的航向,则将不可避免地向车辆侧漂移几度。如果它漂移到0度以上,控制环将变得坚固并试图将车辆一直转向以使其再次达到360度。
有没有一种优雅的方式来处理这个问题?
导航功能的编写方式,我使用外部PID控制器类,我计算这样的标题:
lock (steering)
{
if (!Engaged)
{
return;
}
double mv = 90 + Trim + pidController.CalculateCorrection(flyHeading, currentHeading);
steering.Degree = mv;
}
谢谢!
答案 0 :(得分:2)
这可能听起来过于简单,但你不能只使用目标矢量和当前矢量之间的差值,这样你总是测量距离0和你的方位指示现在换行-180和180?
我不确定你是如何计算轴承的,但是快速查看Ardupilot显示轴承计算为:
int calc_bearing(float flat1, float flon1, float flat2, float flon2)
{
float calc;
float calc2;
float bear_calc;
float diflon;
//I've to spplit all the calculation in several steps. If i try it to do it in a single line the arduino will explode.
flat1=radians(flat1);
flat2=radians(flat2);
diflon=radians((flon2)-(flon1));
calc=sin(diflon)*cos(flat2);
calc2=cos(flat1)*sin(flat2)-sin(flat1)*cos(flat2)*cos(diflon);
calc=atan2(calc,calc2);
bear_calc= degrees(calc);
if(bear_calc<=1){
bear_calc=360+bear_calc;
}
return bear_calc;
}
通过钳制来纠正航向误差:
int heading_error(int PID_set_Point, int PID_current_Point)
{
float PID_error = PID_set_Point - PID_current_Point;
if (PID_error > 180) {
PID_error -= 360;
}
if (PID_error < -180) {
PID_error += 360;
}
return PID_error;
}
答案 1 :(得分:2)
假设您无法更改CalculateCorrection
方法,请在调用之前添加这些行,以确保增量处于合理范围内。
if (flyHeading - currentHeading > 180) currentHeading+=360;
else if (flyHeading - currentHeading< -180) currentHeading-=360;
如果您可以修复CalculateCorrection
,请将夹子放在那里,就像@Greg Buehler的例子一样。
答案 2 :(得分:0)
作为一个黑客,你试过在720°标题上发送它吗?
否则,我必须看到你要求的属性和方法的更多细节,以便进一步理解。