cartographer接入2D雷达laser+imu实时建图

13 篇文章 3 订阅

前言

最近也是需要稍微看一下cartographer,然后用来跑2D建图,且需要融入imu数据

这篇文章也是自己在搞的过程中记录下来,以免自己以后忘记了,也希望能给小伙伴们们提供帮助

另外需要注意的是,我这里使用的carto launch是demo_revo_lds.launch,默认情况下是用来跑bag的,也没有设置imu的接口

1 接入laser

接入laser相对简单点,而且不了解cartographer的人也可以接入,总的来说就是改topic、frame_id、加入urdf,那么下面我们就来进行修改吧

1.1 修改laser启动文件

一般来说,laser的启动文件里面都是有直接的参数可以修改laser的topic和frame_id的,我这拿镭神的lsn10作为例子吧,我们直接打开启动雷达的launch文件,如下:

<launch>
    <node name="lsn10" pkg="lsn10" type="lsn10" output="screen" >
        <param name="scan_topic" value="scan"/>           #设置激光数据topic名称
        <param name="frame_id" value="laser_link"/>       #激光坐标
        <param name="serial_port" value="/dev/ttyUSB1" />  #雷达连接的串口
        <param name="baud_rate" value="230400" />         #雷达连接的串口波特率
	<param name="angle_disable_min" value="0.0"/>           #雷达裁剪角度开始值 
	<param name="angle_disable_max" value="0.0"/>           #雷达裁剪角度结束值 
	<param name="min_range" value="0.0"/>                   #雷达点云距离最小值
	<param name="max_range" value="100.0"/>                 #雷达点云距离最大值
    </node>
    
  <!-- <node name="rviz" pkg="rviz" type="rviz" args="-d $(find lsn10)/rviz/default.rviz" output="screen"/>      #雷达点云配置 -->

</launch>

我用的雷达不是很多,但是感觉差不多都是这样子吧,可以简单明了的找到需要改的两个参数scan_topicframe_id。这两分别对应

  • scan_topic horizontal_laser_2d
  • frame_id horizontal_laser_link

修改后如下

<launch>
    <node name="lsn10" pkg="lsn10" type="lsn10" output="screen" >
        <param name="scan_topic" value="horizontal_laser_2d"/>           #设置激光数据topic名称
        <param name="frame_id" value="horizontal_laser_link"/>       #激光坐标
        <param name="serial_port" value="/dev/ttyUSB1" />  #雷达连接的串口
        <param name="baud_rate" value="230400" />         #雷达连接的串口波特率
	<param name="angle_disable_min" value="0.0"/>           #雷达裁剪角度开始值 
	<param name="angle_disable_max" value="0.0"/>           #雷达裁剪角度结束值 
	<param name="min_range" value="0.0"/>                   #雷达点云距离最小值
	<param name="max_range" value="100.0"/>                 #雷达点云距离最大值
    </node>
    
  <!-- <node name="rviz" pkg="rviz" type="rviz" args="-d $(find lsn10)/rviz/default.rviz" output="screen"/>      #雷达点云配置 -->

</launch>

1.2 修改demo_revo_lds.launch文件

修改这个文件第一个是use_sim_time参数要改成false,第二个就是加入urdf,我直接使用了官方的,也就是tf变换,直接看成品吧

<launch>
  <param name="/use_sim_time" value="false" />
  <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 revo_lds.lua"
      output="screen">
    <remap from="scan" to="horizontal_laser_2d" />
  </node>

  <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"
      type="cartographer_occupancy_grid_node" args="-resolution 0.05" />

  <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>

这里面主要修改的就是launch下的前三个,两个param和一个node,然后屏蔽掉rosbag,需要注意直接屏蔽rosbag是会报错的,因为--clock用了两个扛,所以要么直接删除,要么删去一个扛,像我这样

到此为止,启动laser的launch和demo_revo_lds.launch即可实现用雷达建图了,下面再讲一下imu怎么加入

2 接入imu

接入imu其实也不难,就是没有了解过carto的参数会不知道除了什么问题,下面跟着我的步骤来改吧

2.1 修改revo_lds.lua

这个文件在launch上一级的configuration_files下面,launch加载的时候也可以看到。
这里需要改的地方只有三个

  • tracking_frame base_link
  • published_frame base_link
  • TRAJECTORY_BUILDER_2D.use_imu_data true

直接看一下code吧

include "map_builder.lua"
include "trajectory_builder.lua"

options = {
  map_builder = MAP_BUILDER,
  trajectory_builder = TRAJECTORY_BUILDER,
  map_frame = "map",
  tracking_frame = "base_link",
  published_frame = "base_link",
  odom_frame = "odom",
  provide_odom_frame = true,
  publish_frame_projected_to_2d = false,
  use_pose_extrapolator = true,
  use_odometry = false,
  use_nav_sat = false,
  use_landmarks = false,
  num_laser_scans = 1,
  num_multi_echo_laser_scans = 0,
  num_subdivisions_per_laser_scan = 1,
  num_point_clouds = 0,
  lookup_transform_timeout_sec = 0.2,
  submap_publish_period_sec = 0.3,
  pose_publish_period_sec = 5e-3,
  trajectory_publish_period_sec = 30e-3,
  rangefinder_sampling_ratio = 1.,
  odometry_sampling_ratio = 1.,
  fixed_frame_pose_sampling_ratio = 1.,
  imu_sampling_ratio = 1.,
  landmarks_sampling_ratio = 1.,
}

MAP_BUILDER.use_trajectory_builder_2d = true

TRAJECTORY_BUILDER_2D.submaps.num_range_data = 35
TRAJECTORY_BUILDER_2D.min_range = 0.3
TRAJECTORY_BUILDER_2D.max_range = 8.
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 1.
TRAJECTORY_BUILDER_2D.use_imu_data = true
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.linear_search_window = 0.1
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.translation_delta_cost_weight = 10.
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.rotation_delta_cost_weight = 1e-1

POSE_GRAPH.optimization_problem.huber_scale = 1e2
POSE_GRAPH.optimize_every_n_nodes = 35
POSE_GRAPH.constraint_builder.min_score = 0.65

return options

2.2修改imu启动文件

根laser是一样的,需要修改topic和frame,然后就可以直接接上了,我这里那lpmsbe1作为参考吧

  • imu_topic imu
  • frame_id imu_link

里面没有直接设置topic的接口,我们可以使用remap进行修改,然后frame_id直接进行设置即可,下面来看code吧

<launch>
    <!-- IG1 Sensor node -->
    <remap from="/imu/data" to="/imu" />
    <node name="lpms_be1" pkg="lpms_ig1" type="lpms_be1_node" output="screen">
        <param name="port" value="0001" type="string" />
        <param name="baudrate" value="115200" type="int" />
        <param name="frame_id" value="imu_link" type="string" />
    </node>

    <!-- imudata rad to deg conversion node -->
    <node name="imudata_deg" pkg="lpms_ig1" type="imudata_rad_to_deg_node" />

    <!-- Plots -->
    <node name="plot_imu_gyro" pkg="rqt_plot" type="rqt_plot" 
        args="/angular_vel_deg" />

    <node name="plot_imu_euler" pkg="rqt_plot" type="rqt_plot"
        args="/rpy_deg" />
</launch>

到此为止就全部搞定了,然后启动laser、imu、cartographer的demo_revo_lds.launch即可

3 发生过的报错

过程中发现了几个问题,但是有一个问题没有在网上查到直接的资料,问题如下

[FATAL] [1658375430.748902123]: F0721 11:50:30.000000 11409 sensor_bridge.cc:126] Check failed: sensor_to_tracking->translation().norm() < 1e-5 The IMU frame must be colocated with the tracking frame. Transforming linear acceleration into the tracking frame will otherwise be imprecise.
[ WARN] [1658375200.196875179]: W0721 11:46:40.000000 10794 ordered_multi_queue.cc:155] Queue waiting for data: (0, imu)

上面这个问题是我在设置了imu接口在graph中直接可以接上了的报错,这个时候我还没有更改tracking_framepublished_frame 这两个参数,后来我直接将两个参数从horizontal_laser_link改到base_link后就不会报错了

4 实验发现

最开始我用的laser是比较便宜的,然后直接去建图,直接就胡成一团了,在加入了imu后,我发现imu对于建图的校准是非常有效的
但carto毕竟是laser主导的算法,其建图效果还是受到laser的影响,后来我们发现一个很大的问题!!
不同的雷达,对于建图的效果那影响不是一星半点的,下面进行总结一下吧,对于我用过的几个雷达的效果(暂时只用过镭神家的雷达进行测试)

  • lsn10 —— 这款雷达相对来说比较便宜,然后有网口版和usb版的,我测试的时候用了usb版的,单laser直接不行,开始就直接糊了,后来加了imu后,发现imu对于转向的校准的帮助非常大,然后效果还可以,但是有时候往前走的时候停下来再往前走,算法中就会判定为没有走,然后我们发现停下来再转动,就是原地转圈,再走就会避免一些这样的情况
  • lsm10 —— 这个稍微贵上一丢丢吧,也有串口网口版本,在我手上测试的是串口的,只用laser的时候,发现laser点云会抖动,可能一秒钟抖一下的,然后测试carto的时候,最开始的时候效果就只是不准确,到后面完全就用不了了,但是比lsn10稍微好点点,同样的加入imu后的效果也是会好点,但是有时候吧,他就出问题
  • lsn301 —— 这个我也不知道有没有串口版本的,我测试的时候用的是网口版,然后没有加imu测试的,那个效果贼好,要是使用不严格的话,完全不需要加imu都可以,我们当时测试的场地有两个,大概都在10000平米的样子,那个效果真的好的没话说,根前面两个比,还是没有加imu的情况。只不过在极少数情况下转弯会没那么精确,可能就差一点点吧,但是不碍事。

然后我们的测试方向现在就有两个了,一个是判断是不是网口和串口对于建图效果的影响,第二个的话是不是雷达的影响。这个实验的话,我们后续再补上吧,这篇博客先这样吧

  • 4
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于ROS的激光雷达+小车+IMU的SLAM建图、定位、路径规划c++实现源码+项目说明.zip # 单线激光雷达SLAM建图与路径规划 使用的硬件:autolabor pro1小车、小觅双目相机(S1030标准版本)、IntelNUC迷你主机、显示器、2D激光雷达 Delta-1A 使用的软件:ubuntu 16.04 LTS、ROS-kinetic、小觅驱动、autolabor pro1小车驱动、Delta-1A驱动、VINS-Fusion算法、ROS-navigation导航包、gmapping建图算法、cartographer_ros建图算法 ## tf介绍 tf变换:map(地图坐标系)-->odom(里程计坐标系)——>base_link(小车基座坐标系)——>传感器坐标系(lidar、camera) ---- map-->odom 由建图算法提供 ---- odom --> base_link 由小车驱动提供 ---- base_link --> 传感器坐标系 根据传感器在小车上安装的位置确定,使用static_transform_publisher静态坐标转换来设置 所需传感器数据类型: sensor_msgs/LaserScan 使用Delta-1A驱动发布的雷达扫描话题,话题名:/scan 所需里程计信息数据类型:nav_msgs/Odometry 使用autolabor pro1发布的里程计,话题名:/wheel_odom ## 建图 采用gmapping与 cartographer_ros建图算法分别进行建图 ### gmapping建图:(雷达+小车) 打开终端,执行如下指令: $ cd ~/catkin_ws_lidar_slam/ $ source devel/setup.bash $ roslaunch autolabor_box_launch create_map_gmapping.launch ####打开小车urdf模型、驱动、键盘控制节点、打开雷达驱动、打开gmapping节点、打开rviz可视化节点 ####此时使用键盘的上下左右键控制小车移动,开始建图 ####建图完成后,开启新的终端执行如下指令,保存地图: $ rosrun map_server map_saver -f map_name ####保存地图 map_name为保存地图的名称,运行结果,会生成2个文件,后缀名分别为 .pgm .yaml ### cartographer_ros建图:(雷达+小车) ##打开终端,执行如下指令: $ cd ~/catkin_ws_lidar_slam/ $ source devel/setup.bash $ roslaunch autolabor_box_launch create_map_cartographer.launch ####此时使用键盘的上下左右键控制小车移动,开始建图 ####建图完成后,开启新的终端执行如下指令,保存地图: $ rosrun map_server map_saver -f map_name ......
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值