Cartographer算法2D激光雷达与IMU融合建图

这篇具有很好参考价值的文章主要介绍了Cartographer算法2D激光雷达与IMU融合建图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 上一篇文章讲了cartographer算法手持雷达建图的参数调试,这篇进一步讲如何融合2D雷达与IMU采用cartographer算法进行slam建图。

cartographer算法手持二维激光雷达建图(不使用里程计及IMU)

https://blog.csdn.net/wangchuchua/article/details/127268037?spm=1001.2014.3001.5502

首先先说一下我的硬件设备:

思岚s1激光雷达、Tobotics ROS IMU HFI-A9。

trajectory_builder_2d.use_imu_data,自动驾驶,机器人,人工智能

  和上一篇讲的一样在进行文件修改之前一定一定要先弄明白自己的雷达和IMU的话题名称topic_id以及frame_id,否则名称对不上肯定是会报错的。

首先启动雷达,如果有用思岚激光雷达的小伙伴可以参考这个网址。(只要可以实现点云信息的发布就好。)ROS与激光雷达入门教程-ROS中使用激光雷达(思岚S1) - 创客智造

雷达的frame_id就是图中画红圈的,我的是laser。

trajectory_builder_2d.use_imu_data,自动驾驶,机器人,人工智能  接下来就是查看雷达的话题名称,打开终端输入:

rostopic list

可以看到雷达topic名称一般都是scan。同时还有另一种方法查询雷达的frame_id,就是在终端输入:

rostopic echo /topic | grep frame_id

其中topic名称输入你雷达的话题名称就可,我的话题名称是scan所以输入:

rostopic echo /scan | grep frame_id

 这样就能查到话题scan的fram_id啦。通过以上操作我得知了我的雷达话题是scan、frame_id是laser。

trajectory_builder_2d.use_imu_data,自动驾驶,机器人,人工智能

 好接下来启动IMU模块,一般rosIMU是会有启动包的,启动IMU后通过rostopic查询一下IMU的话题名称,我的话题名称是/imu。知道话题名称后输入命令:rostopic echo /imu | grep frame_id查询frame-id。通过以上操作我得知了我IMU的话题名称是/imu,frame-id是base_link。知道这些后就开始正式的修改相关的文件。

trajectory_builder_2d.use_imu_data,自动驾驶,机器人,人工智能

首先找到~/google_ws/src/cartographer_ros/cartographer_ros/configuration_files目录下的建立一个revo_lds.lua文件,为了和手持建图的lua文件区分开,我有复制了这个文件,重命名为revo_imu.lua。修改后文件内容如下:

-- Copyright 2016 The Cartographer Authors
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
--      http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.

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 = "laser",
  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

主要修改的点就是一下三个地方:

tracking_frame = "base_link",#这里要与imu的frame_id名称一致
published_frame = "laser",#这里要与雷达的frame_id名称一致
TRAJECTORY_BUILDER_2D.use_imu_data = true

然后在~/google_ws/src/cartographer_ros/cartographer_ros//urdf/文件下创建一个urdf文件文件内容如下所示(我的urdf文件名称是:backpack_2d1.urdf,原本包里自带了两个urdf文件因为我要自己调整imu和雷达的位置关系就另写了一个urdf文件):这里一定要注意urdf里的link name一定要与雷达或者imu的fram_id相对应。

<!--
  Copyright 2016 The Cartographer Authors

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<robot name="mini">
  <material name="orange">
    <color rgba="1.0 0.5 0.2 1" />
  </material>
  <material name="gray">
    <color rgba="0.2 0.2 0.2 1" />
  </material>

  <link name="base_link">#与imu的fram_id对应
    <visual>
      <origin xyz="0 0 0" />
      <geometry>
        <box size="0.06 0.04 0.02" />
      </geometry>
      <material name="orange" />
    </visual>
  </link>
  <link name="laser">#与雷达的fram_id对应
    <visual>
      <origin xyz="0 0 0" />
      <geometry>
        <cylinder length="0.05" radius="0.03" />
      </geometry>
      <material name="gray" />
    </visual>
  </link>


  <joint name="imu2laser" type="fixed">
    <parent link="laser" />
    <child link="base_link" />
    <origin xyz="0 0 -0.035" />
  </joint>

</robot>

 在riviz中显示是这样的,小老板们可以根据需要调整雷达和imu之间的相对位置关系。trajectory_builder_2d.use_imu_data,自动驾驶,机器人,人工智能

在~/google_ws/src/cartographer_ros/cartographer_ros/launch目录下建立launch文件,我的文件名称是demo_revo_sc_imu.launch。文件内容如下:

<!--
  Copyright 2016 The Cartographer Authors

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

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

  <node name="rplidarNode"          pkg="rplidar_ros"  type="rplidarNode" output="screen">
  <param name="serial_port"         type="string" value="/dev/ttyUSB0"/>  
  <param name="serial_baudrate"     type="int"    value="256000"/>
  <param name="frame_id"            type="string" value="laser"/>
  <param name="inverted"            type="bool"   value="false"/>
  <param name="angle_compensate"    type="bool"   value="true"/>
  </node>

  <node name="cartographer_node" pkg="cartographer_ros"
      type="cartographer_node" args="
          -configuration_directory $(find cartographer_ros)/configuration_files
          -configuration_basename revo_imu.lua"
      output="screen">
    <remap from="scan" to="scan" />
    <remap from="imu/data" to="imu" />#这里是你的imu的话题名称
  </node>

  <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"
      type="cartographer_occupancy_grid_node" args="-resolution 0.05" />
  <param name="robot_description" textfile="$(find cartographer_ros)/urdf/backpack_2d1.urdf" />
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />


  <node name="rviz" pkg="rviz" type="rviz" required="true"
      args="-d $(find cartographer_ros)/configuration_files/demo_2d.rviz" />
 
</launch>

这个文件中包含了启动雷达节点,和cartographer建图节点,相对于上节的launch文件内容增加了 

 <remap from="imu/data" to="imu" />注意要用你自己imu的话题名称。

以及 urdf文件,注意要对应你的urdf文件路径。

 <param name="robot_description" textfile="$(find cartographer_ros)/urdf/backpack_2d1.urdf" />
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />

到这里文件调整部分就完成了,可以开始启动建图了,因为上面的launch文件没有包含imu启动节点所以我这里先单独启动imu。 

roslaunch handsfree_ros_imu imu1.launch

imu启动之后就可以运行 demo_revo_sc_imu.launch文件了,别忘记启动之前要catkin_make_isolated --install --use-ninja。

source install_isolated/setup.bash
catkin_make_isolated --install --use-ninja
roslaunch cartographer_ros demo_revo_sc_imu.launch

 运行成功后的效果是这样的。trajectory_builder_2d.use_imu_data,自动驾驶,机器人,人工智能

 打开终端输入rqt_graph查看节点关系,我们可以看到imu和雷达信息已经输入到cartographer的节点中去说明融合成功了。

rqt_graph

trajectory_builder_2d.use_imu_data,自动驾驶,机器人,人工智能

打开终端输入rosrun rqt_tf_tree rqt_tf_tree得到tf关系图: 

trajectory_builder_2d.use_imu_data,自动驾驶,机器人,人工智能

到这里就完成了cartographer算法的雷达与IMU融合建图。希望这篇文章能够帮助到大家,祝大家生活愉快,学业顺利 (*^▽^*)。文章来源地址https://www.toymoban.com/news/detail-724808.html

到了这里,关于Cartographer算法2D激光雷达与IMU融合建图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 3D激光SLAM:LeGO-LOAM论文解读---激光雷达里程计与建图

    激光雷达里程计模块的功能就是 :估计相邻帧之间的位姿变换。 估计的方式 :在相邻帧之间做点到线的约束和点到面的约束 具体的方式和LOAM一样 针对LOAM的改进 1 基于标签的匹配 在特征提取部分提取的特征点都会有个标签(在点云分割时分配的) 因此在找对应点时,标签

    2023年04月09日
    浏览(84)
  • 镭神智能N10激光雷达测评+ROS_Cartographer应用测试

      将N10雷达连接ROS主控(本次使用Nvidia Jetson nano+melodic系统进行测试),通过Ubuntu电脑或虚拟机查看构建好的地图。   N10雷达的扫描频率为 6~12HZ的可调区间 ,对应可实现 0.48°~0.96°的角度分辨率,N10采用TOF的测距技术,每秒4500次的高速激光测距采样能力,可以在25米半径

    2024年02月16日
    浏览(79)
  • 使用lidar_align进行激光雷达与IMU的外参标定(超详细教程)

    1、下载lidar_align源码 ethz-asl/lidar_align: A simple method for finding the extrinsic calibration between a 3D lidar and a 6-dof pose sensor (github.com) https://github.com/ethz-asl/lidar_align 2、解压到ros工作空间目录下的src文件中 不知道如何创建ros工作空间的可以参考我另一篇博客: ubuntu下如何创建ros工作空间

    2024年02月08日
    浏览(48)
  • 3D激光雷达和相机融合

    主要看重投影误差,cv的标定识别率也太低了。。。原因是找到了,相机给的曝光时间5ms,增大曝光时间成功率大大提升,但曝光时间给打了,影响实时性,头疼。。 主要是3D-2D的标定 采集标定数据 参照以下采集标定数据和处理标定数据,pcd角点选取和图像角点选取: https:

    2024年02月06日
    浏览(62)
  • 视觉与激光雷达融合3D检测(一)AVOD

    AVOD(Aggregate View Object Detection)和MV3D类似,是一种融合3维点云和相机RGB图像的三维目标检测算法. 不同的是: MV3D中融合了相机RGB图像,点云BEV映射和FrontView映射,而AVOD则只融合相机RGB图像和点云BEV映射.         从网络结果来看,AVOD采用了基于两阶的检测网络,这让我们很容易想到

    2024年02月07日
    浏览(103)
  • 深度相机和激光雷达的融合标定(Autoware)

    深度相机和激光雷达是智能汽车上常用的传感器。但深度相机具有特征难以提取,容易受到视角影响。激光雷达存在数据不够直观且容易被吸收,从而丢失信息。因此在自动驾驶领域,需要对于不同传感器做数据的融合和传感器的标定。 内参标定的原理和方法比较简单,由于

    2024年02月10日
    浏览(57)
  • 传感器融合 | 适用于自动驾驶场景的激光雷达传感器融合项目_将激光雷达的高分辨率成像+测量物体速度的能力相结合

    项目应用场景 面向自动驾驶场景的激光雷达传感器融合,将激光雷达的高分辨率成像+测量物体速度的能力相结合,项目是一个从多个传感器获取数据并将其组合起来的过程,可以更加好地进行环境感知。项目支持 ubuntu、mac 和 windows 平台。 项目效果 项目细节 == 具体参见项目

    2024年04月24日
    浏览(51)
  • Autoware1.14-摄像头、激光雷达感知融合

    实现目标: 利用摄像头目标检测结果 vision_darknet_yolo3 (人、车)、利用激光雷达获得目标的几何信息 lidar_euclidean_cluster_detect (大小、距离)、利用感知融合模块融合摄像头和激光雷达信息 range_vision_fusion ,并在三维地图中可视化。 效果展示: 激光雷达-摄像头感知融合展示

    2024年02月05日
    浏览(47)
  • 使用扩展卡尔曼滤波(EKF)融合激光雷达和雷达数据(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 大多数自

    2024年02月09日
    浏览(55)
  • Fusion_PointClouds - 多激光雷达点云数据融合

    fusion_pointclouds 主要目的为Ubuntu环境下无人车多激光雷达标定之后, 将多个激光雷达点云话题/坐标系 通过PCL (Point Cloud Library)融合为 一个ros点云话题,以便于后期点云地面分割与地面处理等等。 1.1 应用场景 图1:为了保证激光雷达的360°环境覆盖,我们需要用到多传感器的拼

    2024年02月03日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包