LOAM中消除IMU重力影响解析

在LOAM的处理中,IMU数据甫一进入系统第一步是对重力分量的去除。LOAM中对重力影响的去除有以下公式:

float accX = vec_imuData[pointer].accy - sin(imuRoll[pointer]) * cos(imuPitch[pointer]) * 9.81;
float accY = vec_imuData[pointer].accz - cos(imuRoll[pointer]) * cos(imuPitch[pointer]) * 9.81;
float accZ = vec_imuData[pointer].accx + sin(imuPitch[pointer]) * 9.81;

以上公式处理对初始IMU的数据进行了以下两个操作:

  1. 去除了重力的影响;
  2. 变换了坐标表示。

以下对两个方面逐个进行说明。

IMU数据去除重力

IMU中的加速度计有以下原理图:
在这里插入图片描述
加速度传感器在感受轴线上进行加速运动时,质量块将压缩弹簧,弹簧按牛顿第二定律为质量块提供相应的力以推动质量块进行加速运动:
F = m a = − k x F=ma=-kx F=ma=kx
在该过程中,可建立弹簧形变量与加速度的直接关系,弹簧的形变量将直接反映加速度的大小:
a = − k x / m a=-kx/m a=kx/m
在地球上,受重力的影响,加速度计中的质量块在竖直方向将压缩弹簧,等效将记录一个方向竖直向上的加速度。将该加速度按IMU在空间中的姿态将受重力影响的加速度分解到三个敏感轴方向上,之后在读数基础上减去该部分影响,即可得到去除重力加速度的三轴加速度。

将重力影响在IMU系中的三轴分量记录为 V I V_I VI,在世界坐标系中重力影响可记为 V W = [ 0 , 0 , 9.8 ] V_W=[0,0,9.8] VW=[0,0,9.8].则:
V I = R W I V W (1) V_I=R^I_WV_W\tag{1} VI=RWIVW(1)
式中, R W I R^I_W RWI表示World系中坐标向IMU系映射的坐标变换矩阵,也可以表示为从IMU系到World系的旋转矩阵。

另外,值得一提的是,在LOAM中定义了与物理常规相异的roll、pitch、yaw定义。在日常实际中,常有以车体(或机体)前、右、下为roll、pitch、yaw方向的定义。而在LOAM框架的输入1中,采用了与xyz三轴前、左、上方向一一绑定的roll、pitch、yaw方向定义。这点在后面的处理与理解上需要格外注意。无特殊说明,本文之后提到的roll、pitch、yaw方向将采用LOAM定义。

欧拉角转旋转矩阵的规则有众多类别,同样的欧拉角在不同的规则下将组合成不同的旋转矩阵,从而构成不同的旋转结果。换句话说,对某一次确定的三维旋转,根据不同的规则能够分解成多组不同的欧拉角表示。

而遵循常规欧拉角物理定义,常采用先进行实际意义偏航yaw,再进行实际意义俯仰pitch,最后进行实际意义滚转roll的规则顺序来进行组合旋转构成。仅从转轴顺序上进行对应,则对应了z、y、x的坐标轴顺序,即可以表示为:
R I W = R z R y R x (2) R^W_I=R_zR_yR_x\tag{2} RIW=RzRyRx(2)
式中, R I W R^W_I RIW表示从World系到IMU系的旋转矩阵。
由于是欧拉角连续旋转,旋转矩阵的累积采用右乘模式。(机器人学)
将(2)式子带入(1)式,有:
V I = R W I V W = ( R I W ) T V W = ( R z R y R x ) T V W (3) V_I=R^I_WV_W=(R^W_I)^TV_W=(R_zR_yR_x)^TV_W\tag{3} VI=RWIVW=(RIW)TVW=(RzRyRx)TVW(3)
其中:
R x = [ 1 0 0 0 c o s α − s i n α 0 s i n α c o s α ] ; R y = [ c o s β 0 s i n β 0 1 0 − s i n β 0 c o s β ] ; R z = [ c o s γ − s i n γ 0 s i n γ c o s γ 0 0 0 1 ] R_x= \begin{bmatrix} 1&0&0\\ 0&cos\alpha & -sin\alpha \\ 0& sin\alpha & cos\alpha \end{bmatrix} ;R_y= \begin{bmatrix} cos\beta&0&sin\beta\\ 0&1 & 0 \\ -sin\beta& 0 &cos\beta \end{bmatrix} ;R_z= \begin{bmatrix} cos\gamma&-sin\gamma&0\\ sin\gamma&cos\gamma &0 \\ 0& 0 & 1 \end{bmatrix} Rx=1000cosαsinα0sinαcosα;Ry=cosβ0sinβ010sinβ0cosβ;Rz=cosγsinγ0sinγcosγ0001

( R z R y R x ) T = [ c o s γ c o s β c o s β s i n γ − s i n β c o s γ s i n β s i n α − c o s α s i n γ c o s γ c o s α + s i n γ s i n β s i n α c o s β s i n α s i n γ s i n α + c o s γ c o s α s i n β c o s α s i n γ s i n β − c o s γ s i n α c o s β c o s α ] (R_zR_yR_x)^T= \begin{bmatrix} cos\gamma cos\beta&cos\beta sin\gamma&-sin\beta\\ cos\gamma sin\beta sin\alpha -cos\alpha sin\gamma & cos\gamma cos\alpha +sin\gamma sin\beta sin\alpha & cos\beta sin\alpha \\ sin\gamma sin\alpha+cos\gamma cos\alpha sin\beta & cos\alpha sin\gamma sin\beta -cos\gamma sin\alpha & cos\beta cos\alpha \end{bmatrix} (RzRyRx)T=cosγcosβcosγsinβsinαcosαsinγsinγsinα+cosγcosαsinβcosβsinγcosγcosα+sinγsinβsinαcosαsinγsinβcosγsinαsinβcosβsinαcosβcosα
所以,有
V I = [ − 9.8 s i n β 9.8 c o s β s i n α 9.8 c o s β c o s α ] V_I=\begin{bmatrix} -9.8sin\beta\\9.8cos\beta sin\alpha\\9.8cos\beta cos\alpha \end{bmatrix} VI=9.8sinβ9.8cosβsinα9.8cosβcosα
LOAM定义将与x、y、z轴关联的相应轴向旋转,按右手握轴正向分别记为imuroll、imupitch、imuyaw。在三轴方向的加速度上分别 减去重力的分量,得:

Y向实际加速度 = vec_imuData[pointer].accy - sin(imuRoll[pointer]) * cos(imuPitch[pointer]) * 9.81;
Z向实际加速度 = vec_imuData[pointer].accz - cos(imuRoll[pointer]) * cos(imuPitch[pointer]) * 9.81;
X向实际加速度 = vec_imuData[pointer].accx + sin(imuPitch[pointer]) * 9.81;

LOAM框架坐标变换

LOAM框架作者为了与其他关于视觉SLAM的工作进行匹配统一,将点云坐标系进行了坐标变换。

变换进行了y->x, z->y, x->z的坐标交换,实际对整体坐标进行了一次旋转。而imuroll、imupitch、imuyaw的旋转轴方向没有进行变换,仍然与原有的x、y、z轴方向保持一致,即与变换后的z、x、y一一对应。这导致了后面的处理中看似旋转顺序的表示产生了变化,而本质上旋转顺序按物理意义的偏航-俯仰-滚转保持了一致。

经过坐标变换,最终得到了以下的三行代码:

float accX = vec_imuData[pointer].accy - sin(imuRoll[pointer]) * cos(imuPitch[pointer]) * 9.81;
float accY = vec_imuData[pointer].accz - cos(imuRoll[pointer]) * cos(imuPitch[pointer]) * 9.81;
float accZ = vec_imuData[pointer].accx + sin(imuPitch[pointer]) * 9.81;

  1. 此处强调输入的原因在于原始数据输入LOAM之后会进行其他坐标变换,届时xyz轴与roll、pitch、yaw将有新的对应关系。 ↩︎

### 回答1: 要将IMU信息添加到LEGO-LOAM中,需要进行以下步骤: 1. 首先,需要在代码中添加IMU数据的读取和处理功能。可以使用ROS中的IMU消息类型来读取IMU数据,并将其转换为适合LEGO-LOAM使用的格式。 2. 接下来,需要将IMU数据与激光雷达数据进行同步。可以使用时间戳来将两者同步,确保它们在同一时刻被处理。 3. 最后,需要将IMU数据与激光雷达数据进行融合,以提高定位和建图的精度。可以使用卡尔曼滤波或扩展卡尔曼滤波等技术来实现融合。 总之,将IMU信息添加到LEGO-LOAM中需要进行一些代码修改和算法调整,以确保IMU数据能够与激光雷达数据有效地融合。 ### 回答2: LEGO-LOAM是一个基于LEGO Mindstorms EV3硬件平台和三维激光雷达(3D Lidar)的开源SLAM系统。在实际的应用场景中,通常需要加入IMU(惯性测量单元)信息来提高其定位精度和鲁棒性。那么,LEGO-LOAM如何加入IMU信息呢? 在LEGO-LOAM中,IMU信息是通过IMU传感器进行获取的。具体来说,IMU传感器能够测量设备的加速度和角速度信息,通过对这些信息进行积分可以获取设备的位置和姿态信息。因此,将IMU传感器的输出信息与3D Lidar的测量数据进行融合,便可以提高LEGO-LOAM系统的定位精度和鲁棒性。 在LEGO-LOAM中,可以通过以下步骤将IMU信息加入到系统中: 1.将IMU传感器与LEGO Mindstorms EV3设备相连接,通过EV3软件获取IMU传感器的输出数据。可以使用EV3DEV系统配合Python命令行工具对IMU传感器进行操作。 2.利用IMU传感器获取到设备的加速度和角速度信息,并进行积分得到设备的位置和姿态信息。 3.通过将IMU信息与3D Lidar测量数据进行融合,得到更可靠和精准的定位信息。 4.在代码实现中,可以运用卡尔曼滤波等算法进行IMU信息的融合和滤波,进一步提高系统的精度和稳定性。 总之,在LEGO-LOAM系统中加入IMU信息,能够显著提高系统的定位精度和鲁棒性,为实际的应用场景带来更多便利和价值。 ### 回答3: LEGO-LOAM是一种基于激光雷达的无人驾驶系统,它利用点云数据进行建图和定位。但是,对于具有运动状态的无人车辆而言,仅仅使用激光雷达并不能很好地实现建图和定位。因此,LEGO-LOAM需要结合IMU(惯性测量单元)的信息。 惯性测量单元(IMU)是一种能够测量物体姿态和运动状态的仪器。它通常包括加速度计和陀螺仪。加速度计可以测量物体的加速度,从而可以得到物体的姿态信息。而陀螺仪可以测量物体的角速度,从而可以得到物体的旋转信息。 在LEGO-LOAM中,可以通过将IMU的信息加入激光雷达数据中,使得无人车辆能够更准确地进行建图和定位。 具体来讲,首先需要读取IMU的数据,并将其转换为IMU坐标系下的加速度和角速度信息。然后,需要将IMU坐标系和激光雷达坐标系之间的关系进行校准,从而得到准确的坐标系转换矩阵。最后,将转换后的IMU信息与激光雷达数据进行融合,从而得到更加准确的点云数据,进而进行建图和定位。 总的来说,加入IMU信息可以提高LEGO-LOAM的定位精度和建图效果,使得无人车辆能够更加准确和稳定地进行自主导航和控制。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值