SLAM(Simultaneous Localization and Mapping,同步位置与地图构建)技术是本设计的核心内容之一,该部分完成了基于Cartographer的地图构建和基于Cartographer的纯定位算法设计。

机器人模型描述文件

ROS中的系统人工智能定义形式(URDF,Unified Robot DesCription Format)功能中包括有一组URDF的标准C++解释器,URDF文档通过XML格式定义智能机器人模式。

在URDF文件描述中,机器人有link连接杆和joint关节组成。ROS系统在加载解析URDF模型的同时,也会通过joint state publisher将机器人各部分的TF坐标变换关系一并发出。

在此次系统设计当中,首先通过Gazebo仿真平台进行数据仿真模拟测试来验证算法,然后将算法迁移至真实机器系统。无论是仿真测试还是真实机器人均需要通过TF坐标变换来描述机器人各部分组成的位姿关系,本文使用的机器人模型如图所示。

 

 机器人仿真模型

 Cartographer建图与定位

Cartographer是由google公司推出的实时室内SLAM项目,Cartographer使用了根据google自身研发的ceres线形优化的设计方法,而Cartographer的一大亮点便是代码标准化和工程化,尤其适用于在商务应用领域中的再技术开发。另外,Cartographer还引入了利用submap子图建立全域版图的技术理念,能够相当好的降低建图过程中对周围自然环境和移动物体的干扰。另外,Cartographer还支援用各种传感器参数(Odometry、IMU、LaserScan等)建图,而且同时支持用2D SLAM和3D SLAM建图,而且可以自动的生成协方差矩阵,再加上后端经过调整的输入项。对于成本低的雷达技术数据也能够跑出不错的结果,Cartographer系统框架如图所示。

 

Cartographer框架描述

Cartographer所需要的输入数据为2D的LaserScan或者3D的PointClouds2、里程估计信息、IMU数据和相对位姿。

前端部分首先对原始点云数据进行体素化处理来降低点云数据数量、提升点云数据精度,体素化点云将参与体素地图的迭代更新工作。另一方面,体素点云再次经过滤波传入前端框架,前端首先进行ceres进行scan-to-scan的帧间点云匹配,通过点云帧差估计来得到一个PoseObservation位姿数据,该数据与里程估计、IMU数据进行融合,从而得到一个较为准确的位姿数据,作为下一帧点云的先验校准数据。

帧间匹配得到位姿的同时,需要将当前体素化点云帧添加并更新到submap当中,至此前端的工作完成。

在得到一定数量的子图之后,将进入后端优化环节。后端优化的需要使用时间、位姿、传感器数据、submap子图等内容,在设定号节点数量和滤波范围之后,进行子图拼接完成全局地图的构建。

在纯定位模式下,子图数据并不会添加全局地图当中,只需要odometry、IMU Data、Fixed Frame Pose和后端优化后输出的一个坐标变换关系即可。

在环境配置的过程中,已经编译安装了ceres-solver求解器、protobuf传输和abseil-cpp库依赖,可以直接运行Cartographer看到建图效果,配置文件如图所示。

 

 Cartographer建图文件

代码部分通过use_sim_time配置启动了仿真时钟对齐,通过node启动了Cartographer节点程序,并将激光雷达的点云数据和IMU惯导数据传入,Cartographer生成占据栅格地图的部位设置为pure_localization,分辨率为0.05m,最后是启动RVIZ三维数据可视化平台。建图效果如图所示。

 

SLAM实时地图构建

激光雷达对当前环境进行扫掠实现地图的建立,从外观来看地图的边框还是比较清晰的。图左侧的终端启动机器人命令行控制节点,通过键盘按键操作实现机器人的控制。