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的角度仍然是个问题。
不要使用度数作为三角函数的输入。使用弧度!
此外,如果 a
和 b
以 90° 连接并且您知道 a
和 b
,c
就是 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度,正确!
我正在尝试计算我正在测量的点的角度。
使用: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的角度仍然是个问题。
不要使用度数作为三角函数的输入。使用弧度!
此外,如果 a
和 b
以 90° 连接并且您知道 a
和 b
,c
就是 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度,正确!