1 input:点云数据 C j ,里程计数据 p t

2 output:一帧点云扫描期间的机器人位姿变换信息矩阵 c j 1 c j T

3 begin:

4 do

5 d e q o p t d e q l C j //将轮式里程计数据和点云数据存入对应的双端队列

6 while( d e q l .size<2)//防止没有对应的里程计数据,缓存两帧雷达数据程序再继续执行

7 FindCorrespondPose ( d e q o , d e q l , p t s , p t e ) //按每帧点云的开始和结束的时间戳 t s Math_140#在 d e q o 中寻找对应的里程计位姿,若没有对应位姿则利用附近时刻的位姿通过式(6)进行线性位姿插值。

8 T t s p t s T t e p t s //位姿矩阵变换

9 T t s t e = T t s 1 T t e //计算相对位姿变换即 t e 时刻机器人在 t s 时刻机器人坐标系下的位姿

10 b k = ( t k , θ k ) = ( t t s , t e , θ t s , t e ) //得到点云配准初值

11 if( c i j . distance < d min c i j . distance > d max ) delete //数据预处理去除无效点

12 do

13 num1=VoxelFilter(Cj,lmax,lmin) //利用体素滤波对点云进行下采样num1、num2分别表示滤波后的激光点数和目标激光点数

14 mid=(lmax + lmin)/2

15 if(num1 max = midelse l min = mid

16 Whilenum1 1.1*num2

17 Sort(Cj) //利用选择排序将滤波后的激光点按照角度递增的关系进行排序

18 do

19 fori= 1:n

20 FindClosePoint(Cj, Cj−1)

21 E ( b k + 1 ) = i ( n i T [ R ( θ k + 1 ) g i w + t k + 1 c i + 1 j 1 ] ) 2

22 C j = T b k + 1 C j ; c j 1 c j T = T b k + 1 c j 1 c j T ; g i w = c i j

23 while b k + 1 > ε //直到配准误差小于设定的值停止迭代

24 return c j 1 c j T

25 end