Catalogue
1. 从node_main.cc开始
虽说从node_main.cc
开始,但是,实际上还是从demo开始吧
2. demo_backpack_2d.launch
官方的demo启动如下:
2D: 1
2wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag
roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag
可以发现,主要是启动了demo_backpack_2d.launch
文件,该文件内容如下:
1 | <launch> |
该launch文件实现了
- 调用
backpack_2d.launch
文件 - 启动rviz
- 使用playbag进行数据包回放
3. backpack_2d.launch
接下来,继续跟踪backpack_2d.launch
文件,该文件内容如下:
1 | <launch> |
backpack_2d.launch
文件实现了
- 启动
robot_state_publisher
节点,发布TF变换 - 启动了
cartographer_node
节点,传入lua文件进行参数加载configuration_files/backpack_2d.lua
- 启动了
cartographer_occupancy_grid_node
节点,传入分辨率参数-resolution 0.05
4. 继续node_main.cc
上面的launch
文件最终启动了Cartographer_ros节点,而这个主节点在node_main.cc
启动。
4.1. int main()
- 初始化google的日志输出
- 初始化节点
"cartographer_node"
- 调用
cartographer_ros::Run()
4.2. cartographer_ros::Run()
- 初始化tf2的缓冲区
tf_buffer
- 创建tf变换监听器
- 获取命令行传入的配置文件
- [重点来了]创建
MapBuilder
对象,返回对象指针,赋值map_builder - new一个Google自己定义的
Node
节点,传入配置文件、map_builder指针、tf缓冲区进行构造 - 启动上面new出来的
Node
节点 - ...建图...
- 结束轨迹
- 调用最后一次全局BA优化
- 根据标志位判断是否进行序列化输出
5. Google自己定义的Node
节点(类)
从main()
函数来看,最终都交给了Node
节点来处理