http://www.cnblogs.com/SongHaoran/p/6912042.html
https://bitbucket.org/alberto_pretto/imu_tk/overview
IMU-TK: Inertial Measurement Unit ToolKit
https://blog.csdn.net/liweibin1994/article/details/53704140
摄像头与imu坐标转换
最近由于实习需要在玩orb slam,然后想在摄像头上安装一个imu来辅助测量。在把imu贴在摄像头后面之后,一个问题出现了:摄像头的坐标系与imu的坐标系不会对得很准,即它们的坐标很难人工对准。要让它们的坐标轴都重合,需要一个转换。
上图中,
C1:摄像头从初始状态(即单位阵I,这个单位阵是指摄像头开机的时候当做起始状态)到T1时刻的转换为C1;
C2:摄像头从初始状态(即单位阵I)到T2时刻的转换为C2;
Rc:从T1时刻的状态转换到T2时刻的状态所需要的转换(旋转)矩阵;
M1:imu初始状态(即单位阵,这个单位阵是指imu与世界坐标系重合时为单位阵。)到T1时刻的转换为M1;
M2:imu初始状态(即单位阵,这个单位阵是指imu与世界坐标系重合时为单位阵。)到T2时刻的转换为M2;
Rm:从T1时刻的状态转换到T2时刻的状态所需要的转换(旋转)矩阵;
R:imu自身的坐标系到与摄像头的坐标系之间存在的转换。
为什么说摄像头初始状态是单位阵呢?
在orb slam开始运行时,它并不知道这个世界的方位是怎样的。于是它会把它的初始状态当做原点,以后新的姿态都是相对于初始状态来说的。在旋转矩阵中,单位阵表示没有旋转。
求解转换矩阵R:
我们的目标是求出转换矩阵R,这一从imu坐标系上的数据就能转换到摄像头的坐标系上进行计算了。显然:
C2 = Rc×C1;
M2 = Rm×M1;
C1 = R×M1;
C2 = R×M2;
于是:R×M2 = Rc×R×M1
即:R×Rm×M1 = Rc×R×M1
所以:R×Rm = Rc×R
这里要注意的是,旋转矩阵都是在左边,即左乘的。顺序要保持一致,推导出来的公式才是对的。
我们要求解的是R,所以我们要先计算出Rm和Rc。orb slam在运行的时候会一直输出摄像头的估计姿态矩阵,也就是类似于C1和C2,所以可以通过C1和C2来计算出Rc。Rc = C2×inv(C1);
在运行的过程中也可以测量到imu的姿态M1和M2,通过M1和M2来计算出Rm。
但是对于矩阵方程:R×Rm = Rc×R,即使知道Rc和Rm也难算出R。所以要进行一些小小的转换。
可以将上面的方程展开如下:
将上面的方程经过转换之后,即可得到:
其中A是一个9X9的矩阵。一般来说,A的行列式不等于0,所以没有非零解,所以在matlab下可以通过svd函数求出近似解。
[u,s,v] = svd(A'*A);得到的v的最后一列即是近似解。
https://blog.csdn.net/liweibin1994/article/details/53704140
IMU-Camera 联合标定资料总结
https://blog.csdn.net/OKasy/article/details/79864573
imu标定代码
https://bitbucket.org/alberto_pretto/imu_tk/src