万能青年_ZZ 发表于 2025-1-11 20:18:28

用atan模拟atan2以解决逐飞AI8051u开源库中的双精度浮点运算与atan2运算冲突问题

由于全国大学生智能汽车竞赛中越野组需要使用GNSS模块进行定位和解算,但单精度浮点运算会导致精度丢失,所以解决方案为勾选“double precision floating point”开启双精度浮点运算,以避免精度丢失问题。但与之带来的是atan2函数计算异常的情况,由于惯性导航在智能汽车上的普及,IMU模块的姿态解算尤为重要,其中四元数解算欧拉角时可能会涉及到atan2函数,所以必须用atan函数来表示出atan2函数,而不能直接调用标准数学库中的atan2函数。故分享解决原理与示例代码如下,将my_atan2函数定义并声明,在需要使用atan2的地方替换为my_atan2即可。

https://pica.zhimg.com/v2-5b9ba5ca035a4fd0ad0a001d57c3cef2_1440w.jpg


#define M_PI 3.1415926535
double my_atan2(double y, double x) {
    // 处理x = 0的情况
    if (x == 0) {
      if (y > 0) {
            return M_PI / 2; // y轴正半轴
      } else if (y < 0) {
            return -M_PI / 2; // y轴负半轴
      } else {
            return 0; // 原点
      }
    }
else{
    // 计算基础角度
    double theta = atan(y / x);

    // 处理x ≠ 0的情况
    if (x > 0) {
      return theta; // 第一象限和第四象限
   // 处理x < 0的情况
    } else {
      if (y >= 0) {
            return theta + M_PI; // 第二象限或x轴负半轴
      } else {
            return theta - M_PI; // 第三象限
      }
   }
}
}


仅供参考,特别鸣谢:陈工、左工、王昱顺、yan、大w!

页: [1]
查看完整版本: 用atan模拟atan2以解决逐飞AI8051u开源库中的双精度浮点运算与atan2运算冲突问题