Arduino计算角度精度问题?

Arduino calculating angle accuracy problem?

我正在尝试计算我正在测量的点的角度。

使用:https://www.calculator.net/triangle-calculator.html?vc=90&vx=50&vy=50&va=&vz=&vb=&angleunits=d&x=101&y=9 我的a = 50, b = 50 and c = unknown (随a变化),我目前正在用50的固定距离测试它。

查看 link 进行可视化,它可能会有很大帮助。

我正在使用以下代码:

float calculateAngle(float distance)
{
  float a = TSThorizontalDistanceToProjector - (distance + TSTdistanceFromFrontToProjection);
  float b = TSTverticalDistanceToProjector;
  float C = 90;

  float c = sqrt(pow(TSTverticalDistanceToProjector, 2) + pow(a,2) - ((2 * b * a) * cos(C)));
  Serial.println("float c is: ");
  Serial.println(c);

 float A = acos((pow(c,2) + pow(b,2) - pow(a,2)) / (2 * c * b));
 Serial.println("float A is: ");
 Serial.println(A);
}

我先计算c,这样我就可以计算出A角了。但是我只想要 A 角,所以如果我能马上计算出来,请告诉我。然而,这段代码的问题是它输出了错误的数字。

根据网站 linked 上面的角度 A 应该是:45 度,边 c 应该是 70.711。我的代码输出角度 A = 0.40 和边 C = 68.88。两者都错了,我使用的公式不正确吗?还是它必须对我使用的变量做些什么?

编辑:

我现在使用以下代码:

float calculateAngle(float distance)
{
  float a = TSThorizontalDistanceToProjector - (distance + TSTdistanceFromFrontToProjection); //120 - (70 + 20) = 30
  Serial.println(a);
  float b = TSTverticalDistanceToProjector;
  float C = 90;

  float c = sqrt(pow(a,2) + pow(b,2));
  Serial.println("float c: ");
  Serial.println(c);

  float tanX = (a / b);
  Serial.println("float tanX is: ");
  Serial.println(tanX);
  
  float tanXresult = atan(tanX);
  Serial.println("float tanXresult: ");
  Serial.println(tanXresult);
}

我还看到 a = 30 而不是 50 但 b 仍然是 50。

我现在可以足够准确地计算出c,但是A的角度仍然是个问题。

不要使用度数作为三角函数的输入。使用弧度!

此外,如果 ab 以 90° 连接并且您知道 abc 就是 sqrt(a^2+b^2) 作为

c^2 = a^2 + b^2

不确定 cos 在这里应该做什么。

因为您已经知道 a 和 b,您可以通过 arcustangens 或 a/b 简单地计算 A。你不需要 c。

我建议你重温基本的三角学。

我不得不将我的 atan 从弧度转换为度数。

float calculateAngle(float distance)
{
  float a = TSThorizontalDistanceToProjector - (distance + TSTdistanceFromFrontToProjection); //120 - (70 + 20) = 30
  //Serial.println(a);
  float b = TSTverticalDistanceToProjector;
  float C = 90;

  float c = sqrt(pow(a,2) + pow(b,2));
  Serial.println("float c: ");
  Serial.println(c);

  float tanX = (a / b);
  Serial.println("float tanX is: ");
  Serial.println(tanX);
  
  float tanXresult = ((atan(tanX)) * 180) / Pi;
  
  Serial.println("float tanXresult: ");
  Serial.println(tanXresult);
}

我用:

float tanXresult = ((atan(tanX)) * 180) / Pi;

打印结果:30.96度,正确!