关于cartographer中的trajectory的理解与应用

从两三个月前开始安装,编译,使用cartographer已经有一段时间了,一直也想写写博客记录一下,可惜没有这个习惯,暂无实现,最近发现trajectory这个有趣的东西,可以帮助我们做好多事。

1cartographer建图

2dslam中是不需要imu的但是打开use oline correlative scan time = true
这个开关,这样可以在旋转时仍然保证稳定建图,放一张建好的图,整体效果还是不错的。
关于cartographer中的trajectory的理解与应用_第1张图片
这个是已经转换成pgm的。

2cartographer简单描述

关于cartographer的源码解读、原理分析以及scanmatch和回环都已经有好多博主介绍过了,这个之后有时间在发帖。需要注意的是launch文件和lua文件的配置,如果没有urdf 自己发一个static坐标转换,tf_tree联通后就可以正常运行了。这里我们着重介绍一下trajectory。

3trajectory的理解

cartographer中有几个serveric接口,其中一个是finish trajectory,表示当前轨迹停止接收数据。还有一个start trajectory,这个就是新建一条轨迹。

1纯定位模式

细心的同学可以发现,在使用出纯定位模式(pure localization)中是有两条轨迹并存的标号id 为0 和1 其中 id为0的trajectory中包含我们之前pbstream中包含的submap和node通过当前建立1–4和submap与之前的匹配实现定位。这也就是trajectory的应用之一。

2手动定位

trajectory还有一个应用就是手动定位。在像amcl那样可以直接选择开始位姿。这样就需要我们在定位模式中先finish当前trajectory,然后开启start new trajectory service,可以运行cartographer_start_trajectory这个生成的可执行文件,如果需要执行cartographer_start_trajectory,写一个launch文件。

<launch>
  <node name="cartographer_start_trajectory" pkg="cartographer_ros" type="cartographer_start_trajectory" 
      args= "
      -configuration_directory  $(find cartographer_ros)/configuration_files
      -configuration_basename backpack_2d_localization.lua 
     " />
 </launch>
如果其中指定位姿,就需要加入initial参数
<launch>
  <node name="cartographer_start_trajectory" pkg="cartographer_ros" type="cartographer_start_trajectory" 
      args= "
      -configuration_directory  $(find cartographer_ros)/configuration_files
      -configuration_basename backpack_2d_localization.lua 
      -initial_pose {to_trajectory_id=0,relative_pose={translation={0.0,0.0,0.},rotation={0.,0.,0.,timestamp=0}}}" />
 </launch>

这里需要注意,to_trajectory_id=0是相对于哪条轨迹,一般都是0,relative_pose就是要指定的initialpose,不必多说。timestamp=0,非常重要,如果不写这个time,cartographer会默认为当前的时间,这样你传入的pose会根据时间做一个位姿变化。

3地图扩展

如果你之前建好了地图,存在了pbstream中,但是在导航时候发现地图不够全,或者有新的场景加入,那么就需要重新扫图。或者!我们可以在之前的轨迹上叠加一条新的轨迹。
同样的操作,先finish当前trajectory。
运行下面launch

<launch>
  <node name="cartographer_start_trajectory" pkg="cartographer_ros" type="cartographer_start_trajectory" 
      args= "
      -configuration_directory  $(find cartographer_ros)/configuration_files
      -configuration_basename backpack_2d_localization.lua 
      -initial_pose {to_trajectory_id=0,relative_pose={translation={0.0,0.0,0.},rotation={0.,0.,0.,timestamp=0}}}" />
 </launch>

这个time可以调整,不设置也可以甚至initial_pose也可以不用设置,一般特征有共同点的地方,cartographer全局会检测到,这样建图时候就有多条轨迹了,建好后保存为新的pbstream。
轨迹间的node和submap还可以互相约束,是不是很好玩?这也是cartographer的强大之处。
今天没有截图,有时间把rviz截图加入进来

你可能感兴趣的:(ros,cartographer)