SLAM Cartographer(2)ROS封装
- 1. ROS节点
- 2. cartographer_ros目录结构
- 2. 封装核心cartographer_ros
- 3. demo_backpack_2d.launch
- 4. cartographer_node
1. ROS节点
在 《SLAM Cartographer(1)框架与安装》 的demo中,可以看到运行时的系统节点和发布的主题
发现实际与cartographer相关的ROS节点只有 /cartographer_node 和 /cartographer_occupancy_grid_node 两个
- /cartographer_node 整个程序的入口,它接收激光雷达和IMU的传感数据完成定位和子图的构建
- /cartographer_occupancy_grid_node 用于构建占用栅格地图
这两个节点都是官方ROS封装cartographer_ros的一部分
2. cartographer_ros目录结构
$ cd cartographer_ws/src/cartographer_ros
$ ls
切换到cartographer_ros的源码目录下,并列举出其中的目录和文件名称
- cartographer_rviz 与可视化相关的工程
- docs 说明文档
- cartographer_ros 官方ROS封装的核心
- Dockerfile 不同ROS环境下的Docker配置配置文件
- cartographer_ros_msgs 定义各种消息类型
- scripts 一些与安装相关的自动化脚本
2. 封装核心cartographer_ros
再进入官方ROS封装的核心 ~/cartographer_ws/src/cartographer_ros/cartographer_ros
$ cd cartographer_ros
$ ls
可以看到就是一个ROS功能包
里面还有一个cartographer_ros
文件夹,下才是官方ROS封装的源码
3. demo_backpack_2d.launch
《SLAM Cartographer(1)框架与安装》 的demo启动文件demo_backpack_2d.launch
就存在launch文件夹中:
利用ROS的录包与回放功能加载了官方提前录制好的传感器数据,重现了当时的实验过程
当时在双肩背包中安置了激光雷达和IMU,完成了对德意志博物馆的建图
加载脚本demo_backpack_2d.launch
,其内容如下:
<launch>
<!-- 使用仿真时间 -->
<param name="/use_sim_time" value="true" />
<!-- 加载backpack_2d.launch -->
<include file="$(find cartographer_ros)/launch/backpack_2d.launch" />
<!-- 加载可视化 -->
<node name="rviz" pkg="rviz" type="rviz" required="true" args="-d $(find cartographer_ros)/configuration_files/demo_2d.rviz" />
<!-- 数据回放 -->
<node name="playbag" pkg="rosbag" type="play" args="--clock $(arg bag_filename)" />
</launch>
以上加载的文件backpack_2d.launch
如下:
<launch>
<!-- 机器人结构描述节点 -->
<param name="robot_description" textfile="$(find cartographer_ros)/urdf/backpack_2d.urdf" />
<!-- 机器人状态发布节点 坐标变换关系 -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
<!-- 定位和子图构建节点 -->
<node name="cartographer_node" pkg="cartographer_ros" type="cartographer_node" args="
-configuration_directory $(find cartographer_ros)/configuration_files
-configuration_basename backpack_2d.lua" output="screen">
<remap from="echoes" to="horizontal_laser_2d" />
</node>
<!-- 构建占用栅格地图节点 -->
<node name="cartographer_occupancy_grid_node" pkg="cartographer_ros" type="cartographer_occupancy_grid_node" args="-resolution 0.05" />
</launch>
通过参数robot_description
指定了机器人的模型文件
该模型将被robot_state_publisher
维护传感器与背包之间的坐标变换关系
在demo运行的时候查看系统的TF坐标系:
robot_state_publisher维护了水平安装和竖直安装的激光传感器、IMU相对于基座(base link)的坐标变换
cartographer_node则维护了地图(map)、里程计(odom)和机器人基座之间的坐标关系
4. cartographer_node
与SLAM相关的节点就是cartographer_node
查看CMake文件~/cartographer_ws/src/cartographer_ros/cartographer_ros/CMakeLists.txt
查找与cartographer_node相关的源文件
add_subdirectory("cartographer_ros") # 调用cartographer_ros子目录下的CMake文件
再进入cartographer_ros/cartographer_ros/cartographer_ros/CMakeLists.txt
# 定位和子图构建节点编译源文件
google_binary(cartographer_node
SRCS
node_main.cc
)
# 定位和子图构建节点安装方式
install(TARGETS cartographer_node
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
看到cartographer_node
的入口main函数定义在node_main.cc
谢谢