Hector-SLAM初使用

2023-11-05

Hector-SLAM初使用

首先把二维雷达的包拷贝到笔记本上,编译一次通过,连接也没有问题,rviz中可以看到原始激光

想演示一下二维激光雷达的SLAM建图,Hector-SLAM相对比较容易,主要参考了下面的几篇博客

SLAM-hector_slam 简介与使用

hector-slam安装与使用 (ubuntu 16.04)(使用数据包运行hector-slam)

激光雷达初体验 - Ubuntu 18.04 + 思岚科技 RPLIDAR A1M8 + hector_slam 建图

Rplidar A1/A2使用及Hector_SLAM建图

用下面的launch文件,可以演示建图效果,但是没有绿色的轨迹线

<launch>
    <node pkg= "hector_mapping" type= "hector_mapping" name= "hector_mapping" output= "screen">
        <param name= "pub_map_odom_transform" value= "true" />
        <param name= "map_frame" value= "map" />
        <param name= "base_frame" value= "base_link" />
        <param name= "odom_frame" value= "base_link" />

        <param name= "use_tf_scan_transformation" value= "true" />
        <param name= "use_tf_pose_start_estimate" value= "false" />

        <param name= "map_resolution" value= "0.05" />
        <param name= "map_size" value= "2048" />
        <param name= "map_start_x" value= "0.5" />
        <param name= "map_start_y" value= "0.5" />
        <param name= "laser_z_min_value" value= "-1.0" />
        <param name= "laser_z_max_value" value= "1.0" />
        <param name= "map_multi_res_levels" value= "2" />

        <param name= "map_pub_period" value= "2" />
        <param name= "laser_min_dist" value= "0.4" />
        <param name= "laser_max_dist" value= "5.5" />
        <param name= "output_timing" value= "false" />
        <param name= "pub_map_scanmatch_transform" value= "true" />

        <param name= "update_factor_free" value= "0.4" />
        <param name= "update_factor_occupied" value= "0.7" />
        <param name= "map_update_distance_thresh" value= "0.2" />
        <param name= "map_update_angle_thresh" value= "0.06" />

        <param name= "advertise_map_service" value= "true" />
        <param name= "scan_subscriber_queue_size" value= "5" />
        <param name= "scan_topic" value= "scan" />
    </node>

    <node pkg= "tf" type= "static_transform_publisher" name= "base_to_laser_broadcaster" args= "0 0 0 0 0 0 base_link laser 100" />

    <node pkg= "rviz" type= "rviz" name= "rviz"
        args="-d $(find hector_slam_launch)/rviz_cfg/mapping_demo.rviz" />

</launch>

差不多是上面这种效果,但下面的效果更好一些

在这里插入图片描述
在这里插入图片描述

有一些问题,明天看看能否优化解决

  • 激光本身的参数如laser_min_distlaser_max_dist需要确定下
  • 建图的一些参数可能也需要优化一下
  • tf变换没有考虑,/laser坐标系到/base_link的变化,以及/base_link到/map的变换等等

又参考了下面几篇博客

SLAM实现之hector_slm

使用数据集跑Hector_slam

自动驾驶系列(五)hector_slam建地图

其实基本都参照了官方的launch文件,改动并不大,先看官方的

tutorial.launch

<?xml version="1.0"?>

<launch>

  <arg name="geotiff_map_file_path" default="$(find hector_geotiff)/maps"/>

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

  <node pkg="rviz" type="rviz" name="rviz"
    args="-d $(find hector_slam_launch)/rviz_cfg/mapping_demo.rviz"/>

  <include file="$(find hector_mapping)/launch/mapping_default.launch"/>

  <include file="$(find hector_geotiff)/launch/geotiff_mapper.launch">
    <arg name="trajectory_source_frame_name" value="scanmatcher_frame"/>
    <arg name="map_file_path" value="$(arg geotiff_map_file_path)"/>
  </include>

</launch>

mapping_default.launch

<?xml version="1.0"?>

<launch>
  <arg name="tf_map_scanmatch_transform_frame_name" default="scanmatcher_frame"/>
  <arg name="base_frame" default="base_footprint"/>
  <arg name="odom_frame" default="nav"/>
  <arg name="pub_map_odom_transform" default="true"/>
  <arg name="scan_subscriber_queue_size" default="5"/>
  <arg name="scan_topic" default="scan"/>
  <arg name="map_size" default="2048"/>
  
  <node pkg="hector_mapping" type="hector_mapping" name="hector_mapping" output="screen">
    
    <!-- Frame names -->
    <param name="map_frame" value="map" />
    <param name="base_frame" value="$(arg base_frame)" />
    <param name="odom_frame" value="$(arg odom_frame)" />
    
    <!-- Tf use -->
    <param name="use_tf_scan_transformation" value="true"/>
    <param name="use_tf_pose_start_estimate" value="false"/>
    <param name="pub_map_odom_transform" value="$(arg pub_map_odom_transform)"/>
    
    <!-- Map size / start point -->
    <param name="map_resolution" value="0.050"/>
    <param name="map_size" value="$(arg map_size)"/>
    <param name="map_start_x" value="0.5"/>
    <param name="map_start_y" value="0.5" />
    <param name="map_multi_res_levels" value="2" />
    
    <!-- Map update parameters -->
    <param name="update_factor_free" value="0.4"/>
    <param name="update_factor_occupied" value="0.9" />    
    <param name="map_update_distance_thresh" value="0.4"/>
    <param name="map_update_angle_thresh" value="0.06" />
    <param name="laser_z_min_value" value = "-1.0" />
    <param name="laser_z_max_value" value = "1.0" />
    
    <!-- Advertising config --> 
    <param name="advertise_map_service" value="true"/>
    
    <param name="scan_subscriber_queue_size" value="$(arg scan_subscriber_queue_size)"/>
    <param name="scan_topic" value="$(arg scan_topic)"/>
    
    <!-- Debug parameters -->
    <!--
      <param name="output_timing" value="false"/>
      <param name="pub_drawings" value="true"/>
      <param name="pub_debug_output" value="true"/>
    -->
    <param name="tf_map_scanmatch_transform_frame_name" value="$(arg tf_map_scanmatch_transform_frame_name)" />
  </node>
    
  <!--<node pkg="tf" type="static_transform_publisher" name="map_nav_broadcaster" args="0 0 0 0 0 0 map nav 100"/>-->
</launch>

geotiff_mapper.launch

<?xml version="1.0"?>

<launch>
  <arg name="trajectory_source_frame_name" default="/base_link"/>
  <arg name="trajectory_update_rate" default="4"/>
  <arg name="trajectory_publish_rate" default="0.25"/>
  <arg name="map_file_path" default="$(find hector_geotiff)/maps"/>
  <arg name="map_file_base_name" default="hector_slam_map"/>

  <node pkg="hector_trajectory_server" type="hector_trajectory_server" name="hector_trajectory_server" output="screen">
    <param name="target_frame_name" type="string" value="/map" />
    <param name="source_frame_name" type="string" value="$(arg trajectory_source_frame_name)" />
    <param name="trajectory_update_rate" type="double" value="$(arg trajectory_update_rate)" />
    <param name="trajectory_publish_rate" type="double" value="$(arg trajectory_publish_rate)" />
  </node>

  <node pkg="hector_geotiff" type="geotiff_node" name="hector_geotiff_node" output="screen" launch-prefix="nice -n 15">
    <remap from="map" to="/dynamic_map" />
    <param name="map_file_path" type="string" value="$(arg map_file_path)" />
    <param name="map_file_base_name" type="string" value="$(arg map_file_base_name)" />
    <param name="geotiff_save_period" type="double" value="0" />
    <param name="draw_background_checkerboard" type="bool" value="true" />
    <param name="draw_free_space_grid" type="bool" value="true" />
    <param name="plugins" type="string" value="hector_geotiff_plugins/TrajectoryMapWriter" />
  </node>

</launch>

综合学习后我的launch文件

hector_mapping.launch

<launch>
    <arg name="tf_map_scanmatch_transform_frame_name" default="scanmatcher_frame" />

    <node pkg="hector_mapping" type="hector_mapping" name="hector_mapping" output="screen">
        <param name="pub_map_odom_transform" value="true" />
        <param name="map_frame" value="map" />
        <param name="base_frame" value="base_link" />
        <param name="odom_frame" value="base_link" />

        <param name="use_tf_scan_transformation" value="true" />
        <param name="use_tf_pose_start_estimate" value="false" />

        <param name="map_resolution" value="0.05" />
        <param name="map_size" value="2048" />
        <param name="map_start_x" value="0.5" />
        <param name="map_start_y" value="0.5" />
        <param name="laser_z_min_value" value="-1.0" />
        <param name="laser_z_max_value" value="1.0" />
        <param name="map_multi_res_levels" value="2" />

        <param name="map_pub_period" value="2" />
        <param name="laser_min_dist" value="0.4" />
        <param name="laser_max_dist" value="5.5" />
        <param name="output_timing" value="false" />
        <param name="pub_map_scanmatch_transform" value="true" />

        <param name="update_factor_free" value="0.4" />
        <param name="update_factor_occupied" value="0.7" />
        <param name="map_update_distance_thresh" value="0.2" />
        <param name="map_update_angle_thresh" value="0.06" />

        <param name="advertise_map_service" value="true" />
        <param name="scan_subscriber_queue_size" value="5" />
        <param name="scan_topic" value="scan" />

        <param name="tf_map_scanmatch_transform_frame_name" value="$(arg tf_map_scanmatch_transform_frame_name)" />
    </node>
</launch>

hector_test.launch

<?xml version="1.0"?>
<launch>
    <arg name="geotiff_map_file_path" default="$(find hector_geotiff)/maps" />

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

    <node pkg="rviz" type="rviz" name="rviz"
        args="-d $(find hector_slam_launch)/rviz_cfg/mapping_demo.rviz" />

    <include file="$(find lms1xx)/launch/hector_mapping.launch" />

    <include file="$(find hector_geotiff)/launch/geotiff_mapper.launch">
        <arg name="trajectory_source_frame_name" value="scanmatcher_frame" />
        <arg name="map_file_path" value="$(arg geotiff_map_file_path)" />
    </include>

    <node pkg="tf" type="static_transform_publisher" name="map_to_odom" args="0.0 0.0 0.0 0.0 0.0 0.0 /odom /base_link 10"/>
    <node pkg="tf" type="static_transform_publisher" name="base_frame_laser" args="0.0 0.0 0.0 0.0 0.0 0.0 /base_link /laser 10"/>
</launch>

变化并不大,主要有4处:

  • base_frame和odom_frame都是base_link
    在这里插入图片描述
  • Map update parameters较官方有所变化,但未测试变化前后的区别 在这里插入图片描述
  • 将时间同步设置为false在这里插入图片描述
  • 通过TF坐标变换将/odom、/base_link、/laser三个坐标系固定在一起,视作一个坐标系 在这里插入图片描述

效果还不错,跑的时候既有TF坐标,也有绿色轨迹线,使用map_server保存地图

sudo apt-get install ros-melodic-map-server

rosrun map_server map_saver -f ~/catkin_ws/src/LMS1xx/map/my_map

在这里插入图片描述

在实验楼大厅跑了一下,可以看到立柱和标识牌

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hector-SLAM初使用 的相关文章

  • VGA系列之一:VGA显示器驱动篇

    在这周里边 学习的内容包括两个主要的部分 UART通信和VGA显示器 串口通信是这周的前半周讲的 下半周讲的是VGA 在我们的这篇文章中 先来讲下VGA 当然在VGA实验中 我们暂时只做了5个小实验 1 显示器显示3栏颜色 2 在第一个的基
  • iOS-加密算法

    一 散列算法 签名算法 摘要 散列算法 又称哈希函数 是一种单向加密算法 在信息安全技术中 经常需要验证消息的完整性 散列 Hash 函数提供了这一服务 它对不同长度的输入消息 产生固定长度的输出 因为其结果是不可逆的 既然是不可逆的 那么

随机推荐

  • 使用VC向word中插入图片

    发表于 2008 11 23 14 13 2913楼 得分 0 C C code pragma warning disable 4786 import C Program Files Common Files Microsoft Share
  • 通知 服务器维护,服务器维护通知

    服务器维护通知 内容精选 换一换 本章节介绍如何创建告警规则 用户可自定义监控目标与通知策略 及时了解云手机服务器 云手机 磁盘以及GPU卡的状况 从而起到预警作用 登录管理控制台 在管理控制台左上角 选择待创建告警规则的区域 在服务列表页
  • 【转载】解读USB-IF电池充电规范

    最近学电源管理驱动这一步分 对于电池充电规范不太理解 转载下来自己看 http www eechina com thread 4943 1 1 html 电池充电规范 原有USB2 0规范并没有考虑到使用USB接口为便携式设备的电池进行充电
  • 最基本的根据文本信息生成二维码的源代码

    public class TwoDimensionCode 生成二维码 QRCode 图片 param content 存储内容 param imgPath 图片路径 public void encoderQRCode String con
  • 多元高斯分布(二)——更多关于多元高斯分布

    注意 本文内容来自于吴恩达老师cs229课堂笔记的中文翻译项目 https github com Kivy CN Stanford CS 229 CN 中部分的内容进行翻译学习 更多关于多元高斯分布 介绍 到目前为止的课堂上 多元高斯分布已
  • JAVAFX_Effect效果介绍

    JAVAFX Effect介绍 学习记录 慢慢完善 Bloom 发光效果 InnerShadow 内阴影 Lighting 光照 BoxBlur 方框模糊 DisplacementMap 位移置换 DropShadow 阴影 Perspec
  • 一个动态添加panel 和 删除panel的例子

    unit Unit1 interface uses Windows Messages SysUtils Variants Classes Graphics Controls Forms Dialogs StdCtrls ExtCtrls t
  • python中.item()的讲解

    在pytorch训练时 一般用到 item 比如loss item 我们可以做个简单测试代码看看它的区别 import torch x torch randn 2 2 print x print x 1 1 print x 1 1 item
  • python倒序遍历字符串

    Hello大家好 今天我想和大家分享一个小tips 就是快速倒序遍历字符串 比如现在有一个小需求 是让我们找到一个长字符串里面的最后一个单词 并且返回这个单词的长度 每个单词用空格隔开 那么我们会如何去做这道题呢 我觉得使用倒序遍历 当如果
  • VS2017学习C++问题二(没有与这些操作数匹配的 “<<“ 运算符)

    添加要在此处预编译的标头 ifndef GZDEMO H define GZDEMO H pragma once include
  • 【javascript】2048小游戏

    目录 什么是2048 游戏状态机 游戏界面绘制 3 1 界面 3 2 数字的背景颜色 分数逻辑 4 1 加分 4 2 更新最高分 方向控制逻辑 5 1 数组 5 2 随机数 5 3 初始化 5 4 判断数组是否全部填满 5 5 判断方格是否
  • vue img video src动态设置

    图片存放位置 前端 img data中 url created中 created this select method中 async select var data res await this axios get select this
  • 手写Spring框架(二)

    目录 IOC相关类 BeanDefinitionReader BeanDefinition ApplicationContext BeanWrapper 简化后的DispatcherServlet 本章源码 https github com
  • nodejs require() of ES Module xxxxx not supported.

    某些 npm 库在 typescript 中使用时会存在这种情况 说一个解决方法 就是在 npm 官网中查看对应库的 version 看看是否有 cjs 版本 或者回退到上一个大版本
  • Java面试面经大合集(含答案),大厂越来越简单进了,

    Java面试笔记 尝到甜头的他开始得寸进尺 说5K的工资在北京根本生活不下去 没办法 我这人就是心软 在他一顿苦苦哀求后就答应再帮他想想办法 开会的时候灵光一闪想到了在阿里内部给他找两份大佬写的面试笔记 于是就有了最开始的一幕 被大佬逮到的
  • 前缀和实例4(和可被k整除的子数组)

    题目 给定一个整数数组 nums 和一个整数 k 返回其中元素之和可被 k 整除的 连续 非空 子数组 的数目 子数组 是数组的 连续 部分 示例 1 输入 nums 4 5 0 2 3 1 k 5 输出 7 解释 有 7 个子数组满足其元
  • 三个方法解决php并发问题

    福利 网络安全重磅福利 入门 进阶全套282G学习资源包免费分享 解决php并发问题的方法有很多 具体可以使用MySQL的行级锁 乐观锁和Redis的分布式锁等技术来解决 此外 还可以使用消息队列 多进程 多线程等技术来解决php并发问题
  • 人机交互-2-交互设计的原则与方法

    交互设计的原则与方法 交互设计中的问题 尽量减少用户需要记忆的部分 缺乏反馈 1 目标Goal vs 意图Intention 单个目标可对应多个意图 举例 删除文档中的部分内容的目标 意图1 通过编辑菜单删除 意图2 通过删除按钮删除 每个
  • CTF_Web_[GXYCTF2019]Ping Ping Ping

    一 题目 Ping Ping Ping 二 靶机信息链接 靶机信息 剩余时间 10072s http 70284b15 7c4e 4548 8b04 aadbc6e669f5 node4 buuoj cn 81 三 靶机链接页面 四 分析
  • Hector-SLAM初使用

    Hector SLAM初使用 首先把二维雷达的包拷贝到笔记本上 编译一次通过 连接也没有问题 rviz中可以看到原始激光 想演示一下二维激光雷达的SLAM建图 Hector SLAM相对比较容易 主要参考了下面的几篇博客 SLAM hect