Page 1 of 1
【已解决】ZT5模组zigbee二次开发,调用atan或atan2函数计算结果错误
Posted: 2023年 Oct 24日 11:59
by Robertz
使用ZT5模组zigbee二次开发,产品是加速度传感器,在加速度换算角度时,调用atan或atan2函数计算结果错误,并且自己重新实现atan(取名为myatan)结果全为0,请问sdk是否做了哪方面的限制嘛? atan和atan2不是标准的数学库嘛?为什么会计算错误?
另外在ubuntu环境测试验证了角度换算公式,计算是正确的。详见附件:使用sdk的atan, 使用自己实现的myatan, myatan具体实现, ubuntu测试验证。
SDK版本:TLSR8258_TuyaOS-3.8.0
Re: 【求助】ZT5模组zigbee二次开发,调用atan或atan2函数计算结果错误
Posted: 2023年 Oct 25日 14:35
by iot_man
Re: 【求助】ZT5模组zigbee二次开发,调用atan或atan2函数计算结果错误
Posted: 2023年 Oct 25日 17:54
by huanghuan
Code: Select all
#include "math.h"
#define M_PI (float)3.1415926535f
#define PIO2F (float)1.57079632679
#define PIO4F (float)0.78539816339
double my_sqrt(double num) {
if (num == 0.0) {
return 0.0;
}
double x0 = num;
double x1 = (x0 + num / x0) / 2.0;
while (fabs(x1 - x0) >= 1e-9) {
x0 = x1;
x1 = (x0 + num / x0) / 2.0;
}
return x1;
}
float my_atan( float xx )
{
float x, y, z;
int sign;
x = xx;
/* make argument positive and save the sign */
if( xx < 0.0 ) {
sign = -1;
x = -xx;
} else {
sign = 1;
x = xx;
}
/* range reduction */
if( x > 2.414213562373095 ) /* tan 3pi/8 */
{
y = PIO2F;
x = -( 1.0 / x );
}
else if( x > 0.4142135623730950 ) /* tan pi/8 */
{
y = PIO4F;
x = ( x - 1.0 ) / ( x + 1.0 );
} else
y = 0.0;
z = x * x;
y += ( ( ( 8.05374449538e-2 * z - 1.38776856032E-1 ) * z + 1.99777106478E-1 ) * z
- 3.33329491539E-1 ) * z * x
+ x;
if( sign < 0 ) y = -y;
return ( y );
}
// 7.09,-61.68,62.74
void ConvertAccToAngle(float x, float y, float z)
{
float anglex,angley,anglez;
anglex = my_atan(x/my_sqrt(y*y+z*z))*180/M_PI;
angley = my_atan(y/my_sqrt(x*x+z*z))*180/M_PI;
anglez = my_atan(my_sqrt(x*x+y*y)/z)*180/M_PI;
tal_main_debug("anglex:%f,angley:%f,anglez:%f\r\n", anglex,angley,anglez);
}
Re: 【求助】ZT5模组zigbee二次开发,调用atan或atan2函数计算结果错误
Posted: 2023年 Oct 25日 17:57
by huanghuan
你好,你可以采用上面的 float入参的 atan函数,目前该平台对于double计算存在一些问题,我们会在之后的迭代中进行优化,谢谢