cartographer 学习

cartographer 学习

编译并运行代码

由于cartographer整体分成了两个包

  • 一个是cartographer,不带ros的内容
  • 另一个是cartographer_ros,是已ros项目构建的
    这样因为带了普通cmake的包,就没法使用catkin_make了,只能使用catkin_make_isolated

编译:catkin_make_isolated --install --use-ninja

catkin_make_isolated会生成三个目录:

  • build_isolated
  • devel_isolated
  • install_isolated

其中所有的launch文件会被复制一份到install_isolated的share中。
也就是修改cartographer_ros中的launch文件,需要再编译一次才会生效(这里编译其实就是再拷一份文件),而catkin_make修改launch文件是不需要重新编译的


编译后source一下对应目录,然后启动就好了:
roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag

启动demo的launch文件分析

demo_backpack_2d.launch

<launch>
  <param name="/use_sim_time" value="true" />

  <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>
  • param是设置参数服务器,/use_sim_time设置成true是播放bag是使用仿真时间
  • include是添加其它的launch配置文件
  • node是启动节点,启动了rviz,并且required="true"是必须要启动成功,如果rviz节点无法正常启动,launch文件将会终止运行并报错。-d设置rviz的配置文件
  • 还启动了playbag节点,用于播放包,其中参数$(arg bag_filename)是执行roslaunch时指定的

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,值是文本文件,这个参数用于提供机器人的URDF描述。
  • 运行了节点robot_state_publisher,用于将机器人的关节状态发布为tf变换。
  • 运行了节点cartographer_node,输入参数给了一个lua配置文件
  • <remap>标签用于重新映射节点的话题,将echoes话题重映射为horizontal_laser_2d话题。这样订阅echoes可以很方便的更改为horizontal_laser_2d而不需要重新编译
  • 运行了节点cartographer_occupancy_grid_node用来生成占据网格地图,设置了参数resolution,网格分辨率是0.05m

查看相应信息

使用rqt_graph可以查看节点连接情况
在这里插入图片描述

使用gflag库读取输入参数

GFlag库是Google开发的一个命令行参数解析库,它提供了一种方便的方式来定义和解析命令行参数。它的实现原理涉及到解析命令行参数、存储参数值以及提供访问参数值的接口。
总共分成几步:

  • 使用DEFINE_type定义好变量和类型,默认值,解释
  • argc/argv传入解析内容,gflags::ParseCommandLineFlags(&argc, &argv, true);
  • 执行可执行文件并传入参数./my_program --verbose --count=10
  • 使用参数是大写的FLAGS_+对应的变量名,比如FLAGS_verbose

下面是一个简单的使用示例:

#include <gflags/gflags.h>  
#include <iostream>  
  
DEFINE_bool(verbose, false, "Enable verbose output");  
DEFINE_int32(count, 0, "Number of iterations");  
  
int main(int argc, char* argv[]) {  
  // 初始化GFlag库  
  gflags::ParseCommandLineFlags(&argc, &argv, true);  
  
  // 使用定义的命令行参数  
  if (FLAGS_verbose) {  
    std::cout << "Verbose output enabled" << std::endl;  
  }  
    
  std::cout << "Running " << FLAGS_count << " iterations" << std::endl;  
  
  // 其他代码...  
  
  return 0;  
}  

运行和输出是:

$ ./my_program --verbose --count=10  
Verbose output enabled  
Running 10 iterations  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值