cartographer_ros的submap获取与保存

本文详细介绍了cartographer_ros中的occupancy_grid_node_main如何处理子图,包括子图的介绍、地图格式、保存和加载过程。在保存子图时,通过服务接口完成,而在加载时则需要正确处理子图的坐标变换以确保加载正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cartographer:occupancy_grid_node_main

本文分析cartographer 使用二维激光传感器的SLAM, google cartographer的地图生成在occupancy_grid_node_main中实现。先放上生成的地图,走廊约为90m*60m 。左边的range_data_inserter中的insert_free_space = true,右边false。表示是否更新raytracy中的free栅格的概率。

系统简介
1. 系统采用local和global的方法来优化位姿 ξ=(ξx,ξy,ξz) ; 在local的方法中,每一帧与submap匹配;使用的是非线性优化将激光和地图对齐。因为在扫描匹配的过程中会累计误差,因此需要全局的方法来回环消除误差。
2. 在local的匹配中,采用的是类似hector_slam的线性插值的方式,不过为了解决双线性插值的不连续性,采用了双三线性插值; 在global的方法中借鉴了olson的相关性扫描匹配方式,通过全局位姿优化来解决误差累计。
3. 在子图构建完成(已经加入足够的激光数据帧), 会用来做loop closure,当激光现在的位姿估计和之前的子图足够近的时候(再次访问一个地图),在搜索窗口内,完成类似与olson的相关性扫描匹配,如果匹配结构很好就增加loop closing constraint

子图介绍

首先分析的是输出的地图,由次来分析采用的算法结构。这个ROS节点的任务是接受cartographer_node节点运行计算得到的子图序列和子图内容,拼接成一个大的地图的工作。如下图所示:上面的栅格地图是cartographer得到的整体的地图,下面的两张是其中两个子图对应的栅格地图。

occupancy_grid_node_main中维护的全局地图数据:

  std::map<SubmapId, SubmapSlice> submap_slices_ GUARD
### 使用 Cartographer_ROS 进行机器人轨迹规划 #### 一、理解 Cartographer_ROS 的工作原理 Cartographer 是由谷歌开发并开源的一个 SLAM(同步定位建图)库,能够处理二维和三维空间中的激光雷达数据来构建环境的地图[^4]。通过利用 CSM 和梯度优化技术实现高效的帧间匹配以及回环检测功能。 #### 二、安装配置 Cartographer_ROS 为了使机器人能够在未知环境中导航并记录其运动路径,在启动之前需要先完成 cartographer_ros 的正确安装设置。这通常涉及到下载源代码仓库[^2]: ```bash cd ~/catkin_ws/src/ git clone git@github.com:googlecartographer/cartographer.git git clone git@github.com:googlecartographer/ros1_cartographer.git ``` 接着编译整个 Catkin 工作区: ```bash cd ~/catkin_ws && catkin_make_isolated --use-ninja source install_isolated/setup.bash ``` #### 三、运行实时 SLAM获取轨迹信息 一旦完成了上述准备工作之后就可以开始执行实时 SLAM 流程了。这里可以通过发布 TF 变换消息给 `cartographer_node` 来跟踪机器人的位置变化情况,并保存这些变换作为轨迹的一部分: ```xml <launch> <!-- 启动 cartographer 节点 --> <node name="cartographer_node" pkg="cartographer_ros" type="cartographer_node" output="screen"> ... </node> <!-- 发布 odometry 到 base_link 的转换关系 --> <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"/> </launch> ``` 当节点正常运作时会自动生成全局坐标系下各个时刻的位置姿态估计值,即构成了所谓的“轨迹”。 #### 四、查询子地图以辅助轨迹分析 对于某些应用场景来说可能还需要进一步访问局部区域内的详细结构化描述——也就是所谓的小地图(submaps),这时可以调用服务接口 `/submap_query` 来获得指定编号的 submap 数据[^3]。 ```python import rospy from cartographer_ros_msgs.srv import SubmapQuery, GetTrajectoryStates rospy.wait_for_service('/submap_query') try: query_submap = rospy.ServiceProxy('/submap_query', SubmapQuery) response = query_submap() except rospy.ServiceException as e: print(f'Service call failed: {e}') ``` 以上就是关于如何基于 Cartographer_ROS 构建机器人轨迹的基本介绍和技术细节说明。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值