[关闭]
@devilogic 2020-05-07T12:11:27.000000Z 字数 2269 阅读 559

MyMath数学库(二) - 支撑工具

我的无人车之路 mymath


支撑工具库提供了一些基本通用的数学运算函数,为其他的工具做底层支持。

2.1 支撑工具函数表

函数 说明
sqr 计算x的平方。
inner_prod 计算两个向量的内积。
inner_prod(三端点版本) 计算两个向量的内积,两个向量同一个起点。
cross_prod 计算两个向量的外积。
cross_prod(三端点版本) 计算两个向量的外积。两个向量同一个起点。
wrap_angle 将角度缩放到内的同样的角度内,如果角度为负则求出它相同的正值。(弧度制)
normalize_angle 将角度标准化到内。
angle_diff 计算两角度之间的差距,并正则化到之间。
sigmoid sigmoid函数。
square(模板函数) 计算两个模板类型值的平方。
clamp(模板函数) 如果参数value小于参数bound1则返回参数bound1,如果大于参数bound2则返回参数bound2,否则返回参数value
rotate_axis 轴1中的点转换为轴2中的点,其中从轴1轴2的逆时针旋转角度为
rfu_to_flu 转换RFUFLU
flu_to_rfu 转换FLURFU
l2_norm 计算维的向量的L2范数
random_int 生成随机整数。
random_double 生成随机浮点数。
gaussian 生成高斯分布随机数。

2.2 向量点乘与叉乘的意义

上述函数表中提供了两个在图像变换中常用的向量操作,一个是点乘,一个是叉乘。都提供了两个版本,一个是两个独立的向量。另外一个版本是两个向量拥有同一个起点,终点不同。

2.2.1 点乘

向量的点乘,也叫向量的内积、数量积,对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,点乘的结果是一个标量
对于向量与向量


的点积公式为:

这里需要一维向量和向量的行列数相同。

再探讨一下点乘的几何意义,点乘的几何意义是可以用来表征或计算两个向量之间的夹角,以及在向量在向量方向上的投影,有公式:


那么这里就可以得到两个向量的夹角

根据这个公式就可以计算向量和向量之间的夹角。从而就可以进一步判断这两个向量是否是同一方向,是否正交(也就是垂直)等方向关系,具体对应关系为:

2.2.2 叉乘

两个向量的叉乘,又叫向量积、外积、叉积,叉乘的运算结果是一个向量不是一个标量。并且两个向量的叉积与这两个向量组成的坐标平面垂直。
对于向量与向量


的叉乘公式为:

其中:

根据间的关系,有:

三维几何中,向量a和向量b的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于向量构成的平面。在3D图像学中,叉乘的概念非常有用,可以通过两个向量的叉乘,生成第三个垂直于法向量,从而构建坐标系。
二维空间中,叉乘还有另外一个几何意义就是:等于由向量和向量构成的平行四边形的面积

2.3 坐标系探讨

  1. 全球地理坐标系。
  2. 局部坐标系, 东-北-天坐标(ENU)。X : 东边, Y : 北边, Z : 天。
  3. 车身坐标系, 右-前-天坐标(RFU)。X : 面向车前方(横向), Y : 车辆前进方向, Z : 与地面垂直,指向车顶方向。一般用于感知模块。
  4. 车身坐标系, 前-左-天坐标(FLU)。X : 车辆前进方向, Y : 面向车前方(横向), Z : 与地面垂直,指向车顶方向。该坐标系常用于实时相对地图模块。将RFU坐标系向左旋转度即可得到FLU坐标系。
  5. Frenet坐标系,详细参考此文

工具库中提供了RFUFLU的相互转换。

  1. inline std::pair<double, double> rfu_to_flu(const double x, const double y) {
  2. return std::make_pair(y, -x);
  3. }
  4. inline std::pair<double, double> flu_to_rfu(const double x, const double y) {
  5. return std::make_pair(-y, x);
  6. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注