ros2cartographer建离线地图
时间: 2025-06-12 13:25:55 浏览: 23
### 如何使用 ROS2 和 Cartographer 进行离线地图构建
要实现基于 ROS2 的 Cartographer 离线地图构建功能,可以按照以下方法操作:
#### 1. 安装依赖项
首先需要安装必要的软件包。这包括 `cartographer` 及其对应的 ROS 软件包 `cartographer_ros`。可以通过 GitHub 或 Gitee 下载这些库并编译[^2]。
```bash
git clone https://gitee.com/mirrors/cartographer.git
git clone https://gitee.com/mirrors/cartographer_ros.git
```
完成克隆后,在 Catkin 工作空间中进行编译:
```bash
cd ~/catkin_ws/src/
colcon build --symlink-install
source install/setup.bash
```
#### 2. 配置文件设置
对于三维环境的地图构建,需指定相应的 Lua 配置文件路径。通常情况下,默认的配置文件位于 `/home/nvidia/catkin_ws/install_isolated/share/cartographer_ros/configuration_files/` 文件夹下[^3]。如果需要自定义参数,则可以在该目录创建新的 `.lua` 文件来调整扫描匹配器、子图分辨率以及其他重要选项。
例如,以下是典型的背包机器人使用的三维度量单位制配置片段:
```lua
options = {
map_builder = MAP_BUILDER,
trajectory_builder = TRAJECTORY_BUILDER,
}
TRAJECTORY_BUILDER.pure_localization_trimmer.min_submaps_to_keep = 3
POSE_GRAPH.optimization_problem.huber_scale = 1e2
return options
```
此部分代码设置了优化过程中 Huber 函数的比例因子以及纯定位模式下的修剪策略。
#### 3. 数据记录与回放
为了支持离线建图流程,先运行数据采集阶段并将传感器消息保存至袋文件(Bag File)。启动实际设备或者模拟节点时附加如下命令行参数即可开启录制服务:
```bash
ros2 bag record /scan /imu /odom
```
当收集足够的样本后停止录影过程,并切换到重播状态加载先前存储的数据流作为输入源供给 SLAM 系统处理[^4]:
```bash
ros2 launch cartographer_ros offline_backpack_3d.launch \
bag_filenames:=<path-to-your-bag-file>
```
这里 `<path-to-your-bag-file>` 替换为你本地磁盘上的具体路径名字符串表示形式。
#### 4. 地图导出
最后一步是从内部结构化表达转换成外部可读取的标准格式比如 PGM 图像加 YAML 描述文档组合体或者是二进制 Protobuf 序列化对象等等。执行下面指令序列能够提取最终成果物出来供后续应用层调用消费:
```bash
rosrun map_server map_saver -f my_map_file_name
```
上述脚本会自动寻找当前活动话题中的 OccupancyGrid 类型实例进而持久化存档下来形成静态快照副本[^1].
```python
import rclpy
from nav_msgs.msg import OccupancyGrid
def save_map_callback(msg:OccupancyGrid):
with open('my_offline_map.pgm', 'wb') as f:
f.write(bytes([int(x) for x in msg.data]))
rclpy.init()
node = rclpy.create_node('map_exporter')
sub = node.create_subscription(OccupancyGrid, '/map', save_map_callback , qos_profile=10)
try:
while True:
rclpy.spin_once(node)
except KeyboardInterrupt:
pass
finally:
node.destroy_node()
rclpy.shutdown()
```
以上 Python 片段展示了另一种方式通过订阅主题获取栅格网格信息并且手动写入文件系统之中去.
---
阅读全文
相关推荐

















