【已解决】ZT5模组zigbee二次开发,调用atan或atan2函数计算结果错误

Zigbee 子设备开发


Post Reply
Robertz
Posts: 119

使用ZT5模组zigbee二次开发,产品是加速度传感器,在加速度换算角度时,调用atan或atan2函数计算结果错误,并且自己重新实现atan(取名为myatan)结果全为0,请问sdk是否做了哪方面的限制嘛? atan和atan2不是标准的数学库嘛?为什么会计算错误?
另外在ubuntu环境测试验证了角度换算公式,计算是正确的。详见附件:使用sdk的atan, 使用自己实现的myatan, myatan具体实现, ubuntu测试验证。
SDK版本:TLSR8258_TuyaOS-3.8.0

Attachments
企业微信截图_16981174963553.png
企业微信截图_16981174929615.png
企业微信截图_1698117485247.png
企业微信截图_16981174813734.png
Last edited by Robertz on 2023年 Oct 30日 15:29, edited 1 time in total.
iot_man
Posts: 66

Re: 【求助】ZT5模组zigbee二次开发,调用atan或atan2函数计算结果错误

自己的函数double换成float试试

huanghuan
Posts: 244

Re: 【求助】ZT5模组zigbee二次开发,调用atan或atan2函数计算结果错误

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); }
huanghuan
Posts: 244

Re: 【求助】ZT5模组zigbee二次开发,调用atan或atan2函数计算结果错误

你好,你可以采用上面的 float入参的 atan函数,目前该平台对于double计算存在一些问题,我们会在之后的迭代中进行优化,谢谢

Attachments
企业微信截图_16982277137331.png
Post Reply