@devilogic
2020-05-07T20:12:05.000000Z
字数 1706
阅读 815
我的无人车之路
mymath
角度操作在源文件angle.hpp中,使用它的时候需要一起编译sin_table.cc源文件。这里定义了函数表。角度类中使用一个正弦函数表来提高运算速度与精度。也可以通过注释掉mymath_config.h文件中的宏定义#define USE_SIN_TABLE
来取消使用函数表。这样可以直接包含angle.hpp使用,无需编译。
Angle
类是一模板类,接受有符号整型作为模板类型。Angle
类使用整数表示角度,并支持常用的操作,例如加法和减法,以及三角函数的使用。 具有专门的Angle
类可防止代码重复,即用于某些任务,例如:计算角度差或以某个指定间隔(通常为)查找等效角度。以整数表示角度具有以下优点:
1. 精度控制的级别更高('<
'表示"精度低于"):Angle8 < Angle16 < float < Angle32 < double < Angle64
。
2. Angle8
和Angle16
允许通过64-KiB查找表实现超快速三角函数。
3. 在相同的显示尺寸下精度更高。
4. 鼓励使用Angle
类。特别是应将Angle32
用于纬度/经度(误差小于)。Angle16
足够精确,可以进行定位/物体检测。
函数名 | 说明 |
---|---|
from_deg (静态函数) |
从角度制构造Angle 类。 |
from_rad (静态函数) |
从弧度制构造Angle 类。 |
raw_to_deg (静态函数) |
从原始值转换到角度值。 |
raw_to_rad (静态函数) |
从原始值转换到弧度值。 |
raw |
获取原始值。(角度与弧度的一个中间表示) |
to_deg |
将当前的弧度转换为角度。 |
to_rad |
将当前的角度转换为弧度。 |
operator+= |
与其他Angle 类相加并自赋值。 |
operator-= |
与其他Angle 类相减并自赋值。 |
operator*= |
与其他Angle 类相乘并自赋值。 |
operator/= |
与其他Angle 类相除并自赋值。 |
除以上类函数外,此模块还提供了一系列的重载运算符号操作。提供基础的三角函数运算操作。其中在函数中使用了SIN_TABLE
固定表加快了运算。其他的运算都是基于运算的变形。模块提供了以下操作。
Angle
相加。Angle
相减。Angle
相乘。Angle
相除。Angle
比较是否相等。Angle
比较是否不相等。模块默认提供了以下4中类型也是四种精度。精度最低的为Angle8
,最高精度为Angle64
。
using Angle8 = Angle<std::int8_t>;
using Angle16 = Angle<std::int16_t>;
using Angle32 = Angle<std::int32_t>;
using Angle64 = Angle<std::int64_t>;
模块在保存角度时使用了一个原始值的中间值。在获取具体值时通过to_deg
或者to_rad
函数来得到所需的单位制。
以下的一段代码揭示了它的原理。
static constexpr T RAW_PI = std::numeric_limits<T>::min();
static constexpr T RAW_PI_2 = -(std::numeric_limits<T>::min() >> 1);
static constexpr double DEG_TO_RAW = RAW_PI / -180.0;
static constexpr double RAD_TO_RAW = RAW_PI * -M_1_PI;
static constexpr double RAW_TO_DEG = -180.0 / RAW_PI;
static constexpr double RAW_TO_RAD = -M_PI / RAW_PI;
double to_deg() const { return _value * RAW_TO_DEG; }
double to_rad() const { return _value * RAW_TO_RAD; }