0
点赞
收藏
分享

微信扫一扫

SLAM Cartographer(2)ROS封装

SLAM Cartographer(2)ROS封装


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


谢谢

举报

相关推荐

0 条评论