苏州索亚机器人技术有限公司

网站首页 > 新闻 > 行业动态

使用谷歌制图器和OS1激光雷达传感器构建地图

来源:ouster公司blog

这篇文章描述了将Ouster OS1激光雷达数据与谷歌制图器集成以生成环境的2D3D地图的过程。虽然ouster在内部使用自己的HD映射解决方案,但本文将介绍如何使用开源程序(如谷歌制图程序)开始基本的映射。

 

Cartographer是一个系统,提供实时同步定位和测绘(SLAM)在二维和三维跨多个平台和传感器配置。SLAM算法将来自不同传感器(如激光雷达、IMU和相机)的数据结合起来,同时计算传感器的位置和传感器周围的地图。SLAM是自动驾驶平台的重要组成部分,如自动驾驶汽车、仓库中的自动叉车、自动吸尘器和无人机。关于Cartographer2D算法的详细描述可以在他们的ICRA 2016论文中找到。

1.gif

使用谷歌制图器制作地图

Cartographer201610月作为开源项目发布。谷歌还通过发布包含几个ROS包的mapping her_ros存储库来支持ROS,这些包可用于将mapping grapher集成到现有ROS系统中。

Cartographer安装

支持以下ROS分布:

Indigo

Kinetic

Lunar

Melodic

谷歌提供了从源代码构建和安装ROS的详细说明。另外,可以从debian存储库下载ROS包。下面的命令将安装必要的软件包的ROS旋律分布:

$ sudo apt-get install ros-melodic-cartographer ros-melodic-cartographer-ros ros-melodic-cartographer-ros-msgs ros-melodic-cartographer-rviz

谷歌还提供了示例数据和说明,以演示2D3D地图制作能力。

Cartographer过程概述

Cartographer主要由全局SLAM和局部SLAM两个子系统组成。使用局部SLAM生成区域的良好子映射,使用全局SLAM将子映射尽可能一致地连接在一起。

局部SLAM生成一系列子映射,这些子映射在局部上是一致的,但随着时间的推移会发生漂移。局部SLAM也创造了局部轨迹。全局SLAM在单独的线程中运行,并在由本地SLAM生成的子映射之间找到循环闭合约束。它通过对传感器数据的子映射进行匹配扫描来执行循环闭合。它还整合了其他传感器,试图获得最一致的全球解决方案。

2.jpg

谷歌制图系统概述

Cartographer SLAM算法的主要输入是距离测量,这些测量是由测距传感器(如激光雷达传感器或雷达)计算出来的。这些传感器天生就有噪声,因此数据处理的第一步是应用一个带通滤波器来去除最小和最大范围阈值之外的测量值。这些值来自所使用的特定传感器的物理特性。

OS1-64这样的高分辨率激光雷达传感器会产生大量的测量数据,这会降低计算时间。为了解决点密度问题,Cartographer使用了一个体素过滤器,它将原始点降采样到一个恒定大小的立方体中,并且只保留每个立方体的质心。Cartographer应用自适应体素过滤器,它试图确定最佳体素大小,以实现目标点的数量。

过滤数据之后,本地SLAM算法通过扫描匹配将扫描插入到当前子映射中。这个过程使用来自位姿外推算法的初始猜测,该算法使用其他传感器对扫描应该插入子地图的位置进行初始预测。

Cartographer提供CeresScanMatcherRealTimeCorrelativeScanMatcher扫描匹配器。CeresScanMatcher通常是首选的。它速度很快,但不能修复比子映射的分辨率大得多的错误。RealTimeCorrelativeScanMatcher非常昂贵,基本上可以覆盖除测距仪外来自其他传感器的任何信号,但它在功能丰富的环境中运行较稳。

一旦计算出一个扫描匹配,一个运动过滤器就会确保只有基于距离、角度或时间的重要运动产生的扫描才会包含在子映射中。当本地SLAM接收到给定数量的范围数据时,子映射被认为是完整的。局部SLAM算法将子地图及其范围数据存储在一个称为概率网格的数据结构中。

全局SLAM算法获取子映射并尝试重新排列它们,使它们形成一个一致的全局映射。这是一种Graph SLAM,一种位姿图优化,它通过在节点和子映射之间建立约束,然后优化得到的约束图。

当考虑节点和子映射以进行约束构建时,它们将首先经过一个称为Fast Correlative Scan Matcher的扫描匹配器。一旦Fast Correlative Scan Matcher有了一个足够好的提议(高于匹配的最低分数),它就会被送入Ceres扫描机中以改进姿态。

有关所涉及算法的详细信息,请参阅算法调优演练页面。

在模拟中运行Cartographer

使用Cartographer提供的ROS节点,可以配置一个模拟机器人和传感器套件,并通过ROS Gazebo在模拟世界中操作机器人。ROSRViz工具可以用来查看由Cartographer生成的地图和轨迹。制图器ROS包已经集成到diy_driverless_car_ROS存储库中。

在这个过程中,我们将使用一个模拟的OS1-64激光雷达传感器来获得IMU和距离测量。OS1-64将安装在由麻省理工学院赛车项目提供的模拟遥控车上。最后,我们将使用WillowGarage界面作为模拟环境来操作系统并创建地图。OS1-64安装在WillowGarage Gazebo环境的赛车平台上的样本图像如下:

3.png

OS1 RC小车Gazebo仿真

Lua配置文件

定义的第一个文件是.lua配置文件。机器人配置是从必须从Lua脚本定义的选项数据结构中读取的。lua文件应该是特定于机器人的。对于这个模拟来说,racer_2d.lua是用于定义此机器人的Cartographer配置。

首先,我们将定义环境和机器人的TFid。这些坐标系在REP 105中定义。

map_frame = "map",

tracking_frame = "os1_imu",

published_frame = "base_link",

odom_frame = "odom",

map_frame是用于发布子映射的ROS框架ID

tracking_frameSLAM算法跟踪的帧的ROSID,如果使用的话,通常是IMU帧。

published_frame是用作发布姿态的子框架的ROS框架ID。因为我们将配置Cartographer来发布里程测量,所以我们将其设置为“基本链接”。

如果将Cartographer配置为发布里程测量,则odom_frame设置为“odom”。此框架发布非循环封闭的本地SLAM结果。

接下来,我们将Cartographer配置为发布本地的、非循环闭合的、连续的姿态作为odom_frame

provide_odom_frame = true,

use_odometryuse_nav_satuse_landmarks的设置都是false会使我们不会有任何里程表、GPS或地标输入。

我们将以2D激光扫描的方式输入OS1-64激光雷达数据。我们设置了num_laser_scan字段,以使Cartographer能够处理/scan主题上的点云信息,并定义要使用的sensor_msgs/LaserScan主题的数量。

num_laser_scans = 1,

需要根据传感器属性配置一个全局变量。TRAJECTORY_BUILDER_2Dnum_accumulated_range_data变量定义了构建一次完整扫描(通常是一次完整的转换)所需的消息数量。这个字段的默认值是基本设置中的1lua文件是正确的,因为OS-1-64每次运行输出一条消息。

URDF文件

可以从一个/ TF主题分发机器人的TF树,也可以在.urdf机器人定义中定义它。我们将使用os1_sensorurdf文件定义IMU、激光光圈和传感器外壳之间的转换。

os1_sensorurdf文件将传感器外壳链接“os1_sensor”定义为基本链接。这个链接有两个子链接。“os1_imu”链接表示IMU位置,“os1_lidar”链接表示激光孔径位置。这将创建以下TF树,它与Ouster ROS传感器客户端提供的TF树正确匹配。

4.jpg

OS1变换树

组件之间的特定旋转和转换也在.urdf文件中定义。这些尺寸取自OS1数据表。

5.png

OS1数据表

Launch文件

建议使用Cartographer为每个机器人提供自定义.launch文件和SLAM类型。在这个模拟中,我们将使用模拟的IMU和激光扫描数据作为输入进行2D slam。制图器ROS设置在 racer_2d_cartographer.launch文件。

os1_sensor.urdf文件和robot_state_publisher节点将urdf文件中定义的状态发布到/TF主题。

 通过加载racer_2d.lua文件配置,Cartographer_ros节点也被初始化。我们还将IMU和激光扫描数据从它们的默认主题映射到仿真机器人和OS-1传感器输出的主题。

<remap from="scan" to="/scan_sim" />

<remap from="imu" to="/os1_cloud_node/imu" />

最后,运行 cartographer_occupancy_grid_node  occupancy_grid_nodeSLAM发布的子映射,根据它们构建一个ROS occupancy_grid并发布它。生成地图是昂贵和缓慢的,所以地图更新是在秒的顺序。

然后将此启动文件集成到更广泛的系统模拟启动文件中。

运行仿真

整个模拟由 rc_laser_map.launch文件定义。此文件加载模拟以及所有相关的支持ROS节点,以生成Cartographer工作所需的数据。

文件的第一部分为几个参数定义了默认值,这些参数可用于自定义模拟。在启动模拟时,可以通过命令行覆盖这些值。

接下来,通过加载适当的 World 文件并生成带有集成传感器的机器人,启动Gazebo仿真。然后加载几个节点,允许用户通过键盘或操纵杆控制机器人。然后加载pointcloud_to_laserscan节点,将3D pointcloud转换为2D激光扫描。这使得计算更简单,也增加了系统的灵活性。一些ROS节点只支持激光扫描输入,而不支持PointCloud2输入。最后,racer_2d_cartographer。执行启动文件,该文件启动具有前面描述的特定配置的制图器。

下面的视频显示了车辆在环境中行驶。mapgrapher提供了一个RViz插件,允许可视化子地图、轨迹和约束。

6.gif

OS1 遥控小车Cartographer ROS Gazebo模拟

一旦充分映射了环境,就可以保存映射文件并在以后加载它。这是通过map_server ROS包完成的

rosrun map_server map_saver -f /tmp/my_map

这将创建两个文件。YAML文件描述地图元数据,并命名图像文件。图像文件对占用数据进行编码。如下图所示:

7.png

OS1 遥控小车ROS Simulation Cartographer 建图

基于真实数据运行

下一步是从模拟环境转移到真实世界环境。由于在模拟中验证了Cartographer系统的设置,因此开发一个针对真实世界中收集的数据的工作实现是相当简单的。将会有一些小的变化和参数调整来反映真实世界的环境。我们将在2D3D模式下对安装在推车上的OS-1-64和安装在遥控车上的OS-1-64收集的数据运行Cartographer

室内数据收集

第一步是从您的环境中收集数据。在综合遥控车上运行之前,我们将在一个更简单、更可控的环境中收集数据。在第一个示例中,OS-1-64与一台笔记本电脑一起安装到车中,如下图所示。

8.png

用于数据收集的OS1小车安装

车被人在办公室里推着环绕。标准的ouster_ros传感器客户端包用于配置传感器和与ROS的接口。 os1_cloud_node/pointsos1_cloud_node/imu 主题将被记录下来。

验证ROS .bag文件

Cartographer ROS提供了一个名为cartographer_rosbag_validate的工具来自动分析包中的数据。在尝试为不正确的数据调整Cartographer之前,最好先运行这个工具。

它受益于Cartographer作者的经验,可以检测出包常见的各种错误。该工具还可以提供关于如何提高数据质量的提示。

该工具可以用以下命令运行:

rosrun cartographer_ros cartographer_rosbag_validate -bag_filename <bag filename>

这将产生以下输出:

 9.png

映射器ROSbag验证输出

详细步骤可参考以下网址:

https://ouster.com/blog/building-maps-using-google-cartographer-and-the-os1-lidar-sensor/

苏州索亚机器人技术有限公司为Ouster公司在中国的代理商,欢迎预定,联系方式:18115550180


Powered by MetInfo 5.3.19 ©2008-2020 www.ooboontoo.cn