基于ROS的多传感器融合程序设计毕业论文
2020-02-16 17:14:08
摘 要
随着机器人技术的提高,移动机器人的应用也越来越广泛,对其的要求也变高了。导航和定位是移动机器人最为重要的功能,其中,机器人的里程计对整个系统起了重要作用。但是移动机器人里程计误差相对较大,使用单一传感器在精度方面不是很理想,为了解决这一问题,本文采用激光雷达里程计计算,并与IMU进行卡尔曼滤波融合,提升整个系统的精度。
首先,通过Socket通讯获取激光雷达数据,建立结构体保留数据,对激光雷达数据解析,在IMU连接之后,接收IMU数据,对数据进行进制转换,通过波峰-波谷滤波算法缩小IMU敏感误差,为下一步运算提供数据。
然后,通过激光雷达数据对机器人里程计进行研究计算,主要实现得到激光雷达移动过程中位置的变化。采用LM算法实现里程计计算,提升系统的鲁棒性。
最后,IMU采集的数据与激光雷达里程计通过卡尔曼滤波进行融合,以激光雷达里程计作为观测数据,用IMU数据更新。对卡尔曼滤波进行融合,然后将IMU数据与激光雷达里程计进行卡尔曼滤波,并对实验结果进行分析。
实验结果表明,激光雷达与IMU的里程计融合提升了机器人的精度,缩小了误差,为定位和导航提供帮助。
关键词:传感器数据采集;里程计计算;卡尔曼滤波融合
Abstract
With the improvement of robotics technology, mobile robots are more and more widely used, and their requirements are also higher. Navigation and positioning are the most important functions of mobile robots, and the odometer of the robot plays an important role in the whole system. But the mobile robot odometer error is relatively large, using a single sensor is not ideal in accuracy. In order to solve this problem, this paper uses the position and attitude calculation of lidar and Kalman filter fusion with IMU path to improve the accuracy of the whole system.
Firstly, the data of lidar is acquired by Socket communication, the structure is established to retain the data, the data of lidar is parsed, the IMU data is received after IMU connection, and the data is converted to binary system. The sensitivity error of IMU is reduced by peak-valley filtering algorithm, which provides data for the next operation.
Then, the position and pose of the robot are studied and calculated by the data of lidar, and the position and steering angle of the lidar are obtained. LM algorithm is used to calculate pose and improve the robustness of the system.
Finally, the path of IMU moving process is established, that is, the acceleration information of IMU moving process is established through the motion formula, assisted by Kalman filter. Fusion with the previous position and attitude of lidar, an accurate and complete path is obtained.
The experimental results show that the integration of lidar and IMU odometer improves the accuracy of the robot, reduces the error, provides help for positioning and navigation, and can be applied to practical production.
Key words: sensor data acquisition; odometer calculation; Kalman filter fusion
目录
第1章 绪论 1
1.1 研究背景及意义 1
1.2 国内外研究现状 1
1.3 论文主要内容和结构安排 2
第2章 传感器数据采集 4
2.1 激光数据接收 4
2.1.1 激光数据结构 4
2.1.2 激光雷达数据解析 5
2.2 IMU数据采集 6
2.2.1 IMU数据获取 6
2.2.2 波峰-波谷法筛选数据 8
2.3 本章小结 9
第3章 激光雷达里程计计算 10
3.1 地图映射 10
3.2 基于LM算法的里程计计算 12
3.2.1 LM算法介绍 12
3.2.2 里程计求解 14
3.3 本章小结 18
第4章 IMU里程计计算及卡尔曼滤波融合 19
4.1 卡尔曼滤波介绍 19
4.2 基于卡尔曼滤波的IMU里程计实现 22
4.2.1 多传感器的卡尔曼滤波器 22
4.2.2激光雷达与IMU卡尔曼融合过程 22
4.3 实验结果与分析 23
4.4 本章小结 24
第5章 总结与展望 25
5.1 本文总结 25
5.2未来展望 25
致 谢 26
参考文献 27
第1章 绪论
1.1 研究背景及意义
随着现代生活水平的不断提高,科学技术的发展也越来越快,机器人已经走进很多人的日常生活当中,智能机器人的研究成为了炙手可热的话题,在人工智能高速发展的大环境下,国家对人工智能的重视程度也提升到了战略高度。在机器人发展的过程中,移动机器人一直占据这主导地位,且移动机器人在人们生活中会越来越多地展现。
对于移动机器人,导航和定位是其重要的功能,而里程计是其中的重要内容。里程计指两帧数据之间机器人的移动状态,即移动位移和旋转角度。对于里程计的研究,可以选择多种传感器,如相机、激光雷达、惯性测量单元(IMU)等。但是,如何能够保证里程计的精度,是现今需要解决的难点。
相机与激光雷达建立里程计原理相同,它们通过感知环境信息,与上一帧环境信息匹配,进而估计自身的相对运动。相机结构简单、安装的要求低,探测距离较远,并且成本低。但是其对环境要求比较高,环境光强度对其影响大,在暗处环境中无法工作,运算成本也很高,负荷大。激光雷达以点云的方式来建立周围环境,然后通过匹配点云的方式来建立里程计,但是激光雷达会受到环境距离的限制,当面对长走廊等大空间时,其精度就会下降很多。IMU能采集机器人的加速度、角速度,对外界环境的要求很低,然后通过运动方程来表示里程计,但是,机器人难以克服的因素就是噪声问题,这会在产生累积误差,影响后面的运算。
由此,我们能够得出结论,单一传感器很难实现里程计可靠计算。但是,传感器之间在很多方面能够互补,对比于相机,激光雷达的精确度更高一些,当其处于大空间时,可以通过IMU弥补其不足,这样,通过激光雷达和IMU融合的方式能够提高里程计精度,此时,选用何种融合方式显得尤为重要。
1.2 国内外研究现状
里程计对于机器人导航和定位具有重要的作用,里程计指机器人的移动状态,即每次机器人的移动位移和旋转角度。对于IMU和激光雷达融合,根据融合方式,可分为滤波融合和优化融合。按照融合的状态信息可分为紧耦合和松耦合,紧耦合是指根据采集的传感器信息直接进行融合;松耦合指激光雷达建立自身里程计,然后与IMU进行融合。
MSCKF(Multi-State Constraint Kalman Filter)和ROVIO(Robust Visual Interial Odometry)是通过紧耦合的方式采用滤波的融合算法,这种方法以空间点坐标、里程计、速度作为状态向量,以IMU数据作为预测值,通过观测特征点作为测量值进行更新,于是,可以看出状态矩阵的维数会很高,计算量很大,需要很大的计算机资源。
通过优化来完成融合的算法核心在紧耦合处理上,当前方案有VINS-MONO、OKVIS(Open Keyframe-based Visual-Interial SLAM),其主要内容是在激光雷达计算里程计时融合IMU测量数据,然后联合优化其里程计函数,以迭代的方式不断求解,这种方法计算量仍然较大,对初始值的依赖较重。
松耦合的方式与紧耦合不同,其不关心激光雷达的采集信息,采用融合里程计的方式进行融合,先进行激光雷达采集信息的里程计计算,然后与IMU进行融合。这种方法比紧耦合方法精度低一些,但是可实现程度高、而且结果简单、可扩展性强,可以对多传感器进行融合,应用比较广泛。采用松耦合的方式通过卡尔曼滤波的方式进行融合,能够提供系统精确度。因此,本文采用卡尔曼滤波的方式对激光雷达和IMU融合,估计出里程计最优状态。
1.3 论文主要内容和结构安排
本文使用激光雷达作为传感器建立里程计,使用IMU传感器数据与里程计进行融合。实现分为三个阶段:第一阶段是采集传感器数据并预处理,首先通过激光雷达收集场景信息,通过结构体保留数据,并进行解析;对IMU数据采集转化,进行滤波。第二阶段基于LM算法设计了里程计计算,现实空间转换为栅格地图表示,提高效率;第三阶段是IMU数据与激光雷达里程计进行卡尔曼滤波融合,使误差更小。本文整个研究流程如图1-1所示。
图1-1本文研究过程
本文研究的主要内容包括一些几个方面:
(1)以Socket通讯获取激光雷达数据,并实现数据解析。
(2)接收IMU传感器数据,并对数据进行除噪处理。
(3)对激光雷达数据进行计算,通过LM算法进行里程计计算。
(4)以卡尔曼滤波的方式对激光雷达里程计和IMU融合。
本文章节安排如下:
第1章为绪论。主要交代了本文所研究的课题的背景和意义,介绍并分析移动机器人自动导航的研究现状和存在问题,最后阐述本文的研究内容和结构安排。
第2章为Socket通讯获取激光雷达数据,建立结构体保留数据,对激光雷达数据解析。连接IMU,接收IMU数据,对数据进行进制转换,通过波峰-波谷滤波算法缩小IMU敏感误差,为下一步运算提供数据。
第3章通过激光雷达数据对机器人里程计进行研究计算,主要实现得到激光雷达移动过程中位置的变化以及其转向角度的变化。采用LM算法实现里程计计算,提升系统的鲁棒性。
第4章将IMU采集的数据与激光雷达里程计通过卡尔曼滤波进行融合,以激光雷达里程计作为观测数据,用IMU数据更新。对卡尔曼滤波进行接收,然后将IMU数据与激光雷达里程计进行卡尔曼滤波,并对实验结果进行分析。
第2章 传感器数据采集
本章的主要内容是实现对激光雷达和IMU传感器数据的采集。通过Socket通讯获取激光雷达数据,建立结构体保留数据,对激光雷达数据解析,在IMU连接之后, 接收IMU数据,对数据进行进制转换,通过波峰-波谷滤波算法缩小IMU敏感误差,为下一步运算提供数据.
2.1 激光数据接收
本文采用的Leuze激光雷达虽然性能较高,但仍会产生少量异常或无效的数据。如若不处理这些数据,则会对后续步骤的精确性产生影响。本小节从激光数据的获取开始展开介绍,对获取到的数据进行预处理,从而得到较为精确的数据。
2.1.1 激光数据结构
本设计中激光雷达作为数据感知的唯一传感器,其获取的环境数据是后续工作的基础,因此对激光雷达的数据结构的解析是十分重要的。这些数据被封装到雷达厂家规定格式的数据报中,其结构如数据结构2-1和数据结构2-2所示。因此需要对报文进行解析,以获取我们需要的环境信息数据。
数据结构2-1 激光雷达数据校验的数据结构 |
typedef struct tagUdpTelegramType{ Header1 H1; //报头 Header2 H2; //报头 WORD Id; //数据包类型(ID=6;ID=3(前者无光强信息)) WORD BlockNo; //块号,一个完整的激光雷达数据按6块发送 DWORD ScanNo; //扫描序列号 } UdpTelegramType,*PUdpTelegramType; estimate.setZero(); |
数据结构2-2 激光雷达数据内容的数据结构 |
typedef struct tagBeam{ WORD Distance; // 单条光线长度 }Beam, *PBeam; typedef struct tagUdpBeamPacket : UdpTelegramType{ Beam Beams[1]; //激光雷达光线数据组 }UdpBeamPacket, *PUdpBeamPacket; |
数据结构2-1是激光雷达数据检验的数据结构,其中包含了整个数据包的报头,数据包类型,块号和扫描序列号。这里的数据包类型主要有两种,ID为3时包含了光线中的距离信息和光强信息,ID为6时只包含了光线中的距离信息。块号和扫描序列号则是当前数据包的唯一地址信息,扫描序列号代表了当前数据包属于哪一帧,块号代表了数据包在当前激光雷达帧的哪一块。
当确定了接收的数据包没有问题后,将数据包以数据结构2-2的方式进行解析,其中包含的信息即激光雷达扫描的每一条光线的距离信息。
2.1.2 激光雷达数据解析
本研究中激光雷达与工控机之间采用网线传输,通信过程通过Socket通讯完成的。它是一个通信链的句柄,可以用来实现不同各设备或程序之间的通信。本研究中使用的Socket进行激光数据接收的详细过程如图所示。
首先,创建Socket,为其绑定地址和端口,然后接收数据报,判断其是否为无光强模式报文,如果是无光强模式,则进行下一步解析,并判断块号是否为0,为0解析到本地,继续接收数据报;如果不为0,判断块号是否乱序以及是否所有激光数据解析完毕,当块号乱序并解析完毕时,发布雷达数据,否则,进行下有一帧数据报接收。
在Ubuntu上对激光雷达数据接收,由于激光雷达数据较多,需将其在文本中记录、显示,数据接收结果如图所示:
从图中可以看出,激光雷达数据能够完整接收,可以在下一步计算激光雷达里程计中进行使用。
2.2 IMU数据采集
2.2.1 IMU数据获取
IMU由于其实时性高,且安装十分便捷,广泛应用在机器人上。它能记录机器人上一帧到下一帧之间的数据信息,对机器人的位置信息进行矫正,缩小误差,辅助下一帧里程计工作。IMU连接过程如下:硬件设备有六轴姿态测量传感器和USB-TTL模块以及传感器与工控机之间适当长度的杜邦线。将IMU与USB-TTL模块进行焊接,焊接过程中需要注意IMU的TX和RX与USB-TTL模块的TX、RX进行反接,之后水平固定在移动机器人上,固定过程中注意IMU传感器尽量水平,因为其需要采集二维地面的x、y轴,如果放置倾斜,会造成x轴、y轴采集的加速度信息在z轴上产生偏移,使加速度不精确。之后,将USB-TLL模块接口连接至工控机的端口。
IMU采集信息采集及解析,因为IMU是在ROS平台下工作,其信息获取过程即在linux系统下进行。首先,获取IMU传感器工作端口,通过端口函数open(ptty, O_RDWR | O_NOCTTY | O_NONBLOCK)实现,返回端口号。设置端口信息,波特率设置为115200即可。之后进行数据接收,通过PortRecv()函数接收IMU返回的16进制数据,注意PortRecv()函数设置为非阻塞模式,使得数据接收过程能够顺利返回接收数据。
对接收的16进制函数进行解析,其解析过程如算法2-2所示:
算法2-2 IMU数据解析 |
while(1)
以上是毕业论文大纲或资料介绍,该课题完整毕业论文、开题报告、任务书、程序设计、图纸设计等资料请添加微信获取,微信号:bysjorg。
相关图片展示: