camera和odometer的标定
这里,我们可以说,相机提供三维观测,三维空间中的3D点,可以计算3维的位姿;而轮速计只提供二维观测,只有左轮速度和右轮速度,通过内参转换成2D的线速度和角速度. 轮速计建模如下:
注意, 这里面包含了我们要标定的内参 r l r r r_l r_r rlrr 和轮距a(也有公式写作b).在后面的标定中,外参R和t,会分解为yaw pitch roll 和 l x . l y . l z l_x.l_y.l_z lx.ly.lz 来标定. 了解这些基本的知识后,我们 开始标定.
第一步,标定外参pitch和roll 1:
根据 旋转约束:
上面公式中, α \alpha α被单独提出来后, η i \eta_i ηi的最小值与 α \alpha α无关,只需要求()中的最小值即可.下面公式中,四元数q的左乘和右乘可以用左乘算子和右乘算子表示,并且相机的旋转q表示成绕 ( k x , k y , k z ) (k_x,k_y,k_z) (kx,ky,kz)轴,旋转了 ϕ i \phi_i ϕi
问题变成了一个线性最小二乘问题.
第二步,求解 y a w l x l y yaw l_x l_y yawlxly 内参 r l r r a r_l r_r a rlrra.注意,外参 lz是标定不出来的,可从可观性分析得出这个结论 2.
估计出pitch和roll角度之后,就可以将相机坐标系下的pose,纠正到二维平面上.然后分两步估计剩下的内参和部分外参yaw lx ly.
首先,根据角度约束估计J21和J22:
然后,根据 二维平移约束,估计其他参数.
接下来说说开源的标定代码.
标定流程是这样的:
数据筛选和插值对齐
利用cam观测估计pitch和roll角,纠正cam观测到二维平面上
估计J21 J22
估计内参 r r . r l . a r_r . r_l . a rr.rl.a,部分外参 y a w . l x . l y yaw .l_x .l_y yaw.lx.ly
再次估计pitch和roll角
refine估计的所有外参
使用 代码需要注意的问题:
首先需要检查你的小车的camera安装方式,我们的小车camera是朝前的,camera的x,y,z轴分别和odom的-y,-z,x相同,这个关系是需要根据你自己的安装方式,在代码中做修改的.
1. 在main_node.cpp中,
if(axis(1)>0) { deltaTheta_cl *= -1; axis *= -1; }
sync_tmp.scan_match_results[0] = camDatas[i].tlc[0]; sync_tmp.scan_match_results[1] = camDatas[i].tlc[2]; sync_tmp.scan_match_results[2] = camDatas[i].deltaTheta;
1. 修改config.yaml文件; 2. 根据自己camera和odom的坐标系关系部分代码,修改上面提到"代码需要注意的问题"; 3. 建立ros空间,catkin_make,然后source; 4. roslaunch cam_odo_cal S800.launch 5. rosbag play xxx.bag.
- An Analytical Least-Squares Solution to the Odometer-Camera Extrinsic Calibration Problem ↩︎
- Simultaneous calibration of odometry and sensor parameters for mobile robots ↩︎
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217088.html原文链接:https://javaforall.net
