ROS小车研究笔记:二维SLAM建图简介与源码分析

news2024/12/19 18:32:36

ROS提供了现成的各类建图算法实现。如果只是应用的话不需要了解详细算法原理,只需要了解其需要的输入输出即可。

1 Gmapping

Gmapping使用粒子滤波算法进行建图,在小场景下准确度高,但是在大场地中会导致较大计算量和内存需求

Gmapping需要机器人提供深度信息,IMU信息,和里程计信息这三个中至少两个。利用这些输入信息gmapping算法可以输出栅格地图即小车在地图中定位
在这里插入图片描述
Gmapping订阅话题tf和scan。tf话题包含激光雷达和机器人基坐标系位置关系,scan包含激光雷达信息和IMU加速度信息。Gmapping可以通过话题和服务两种方式发布地图信息。其中map话题发布实时地图栅格数据,而服务dynamic_map只有在客户端发布请求是才会发布最新地图,相对于话题可以节省通信开支

在这里插入图片描述
对于odom里程计信息,Gmapping不用话题获取,而是通过TF树进行维护。其中 -> base_link为激光雷达相对base_link(默认的机器人基坐标系)位置,这一值一般为静态,在小车模型文件中定义好。

base_link ->odom为机器人位置相对于里程计原点坐标。其中odom坐标系位置为小车开始运行时里程计位置。通过速度积分得到base_link和odom的距离即可得到小车里程信息

map->odom 为地图中机器人位置关于里程计坐标。这里map和odom都为1不同的参考坐标系,odom是里程计测得的位置坐标,依靠小车自身移动速度积分得到,map为激光雷达测得的小车在地图上位置坐标。两者坐标系差距即为里程计的偏移

小车源码:
1 mapping.launch 启动建图的launch文件(只保留和gmapping相关内容)

<launch>
  <arg name="mapping_mode"  default="gmapping" doc="opt: gmapping,hector,cartographer,karto"/>


  <!-- turn on lidar开启雷达  -->
  <include file="$(find turn_on_wheeltec_robot)/launch/wheeltec_lidar.launch" />

  <!-- 开启gmapping建图算法  -->
  <group if="$(eval mapping_mode == 'gmapping')">
  <include file="$(find turn_on_wheeltec_robot)/launch/include/algorithm_gmapping.launch" />
  <!-- 开启机器人底层相关节点  -->
  <include file="$(find turn_on_wheeltec_robot)/launch/turn_on_wheeltec_robot.launch">
    <arg name="navigation" value="$(arg navigation)"/>
    <arg name="is_cartographer" value="false"/>
    <arg name="odom_frame_id"   value="$(arg odom_frame_id)"/>
  </include>
  </group>
</launch>

这里我们可以看到在开启gmapping 建图算法中,我们启动了文件turn_on_wheeltec_robot/launch/include/algorithm_gmapping.launch

该文件内容如下:

 
<launch>
  <arg name="scan_topic"  default="scan" />
  <arg name="base_frame"  default="base_footprint"/>
  <arg name="odom_frame"  default="odom_combined"/>

  <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
    <param name="base_frame" value="$(arg base_frame)"/>
    <param name="odom_frame" value="$(arg odom_frame)"/>
    <param name="map_update_interval" value="0.01"/>
    <param name="maxUrange" value="9.0"/>
    <param name="maxRange" value="10.0"/>
    <param name="sigma" value="0.05"/>
    <param name="kernelSize" value="3"/>
    <param name="lstep" value="0.05"/>
    <param name="astep" value="0.05"/>
    <param name="iterations" value="5"/>
    <param name="lsigma" value="0.075"/>
    <param name="ogain" value="3.0"/>
    <param name="lskip" value="0"/>
    <param name="minimumScore" value="30"/>
    <param name="srr" value="0.01"/>
    <param name="srt" value="0.02"/>
    <param name="str" value="0.01"/>
    <param name="stt" value="0.02"/>
    <param name="linearUpdate" value="0.02"/>
    <param name="angularUpdate" value="0.02"/>
    <param name="temporalUpdate" value="-1.0"/>
    <param name="resampleThreshold" value="0.25"/>
    <param name="particles" value="8"/>

    <param name="xmin" value="-5.0"/>
    <param name="ymin" value="-4.0"/>
    <param name="xmax" value="5.0"/>
    <param name="ymax" value="4.0"/>

    <param name="delta" value="0.05"/>
    <param name="llsamplerange" value="0.01"/>
    <param name="llsamplestep" value="0.01"/>
    <param name="lasamplerange" value="0.005"/>
    <param name="lasamplestep" value="0.005"/>
    <remap from="scan" to="$(arg scan_topic)"/>
  </node>
</launch>
  

这里有大量和gmapping算法本身的参数,如果不了解算法底层原理可以直接使用默认值。我们可以对这些参数进行调优以使用不同应用场景

里程计tf坐标发布
(代码位置/turn_on_wheeltec_robot/launch/turn_on_wheeltec_robot.launch)

  <!-- 发布用于建图、导航的TF关系与小车外形可视化 -->
  <include file="$(find turn_on_wheeltec_robot)/launch/robot_model_visualization.launch" unless="$(arg repeat)">
    <arg name="car_mode" value="$(arg car_mode)"/>
    <arg name="if_voice" value="$(arg if_voice)"/>
  </include>

  <!-- 扩张卡尔曼滤波 发布odom_combined到footprint的TF,即小车定位 使用cartographer算法时不使用该滤波算法-->
  <include file="$(find turn_on_wheeltec_robot)/launch/include/robot_pose_ekf.launch" unless="$(arg repeat)">
    <arg name="is_cartographer" value="$(arg is_cartographer)"/>
  </include>
 </launch>

这里涉及到的robot_pose_ekf节点是ros中常用的卡尔曼滤波算法,用于对里程计坐标信息进去预处理以提高精度

2 Cartographer

Cartographer相比于Gmapping更适用于大场地的建图。其包含回环检测可以防止累积误差。并且Cartographer只依靠雷达建图,不需要里程计

Cartographer检测步骤分为两步,local scan和global scan。其中local scan为雷达实时检测,而global scan将local scan的检测结果汇总,进行回环检测,以减小地图误差

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/371633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go语言内存管理详解-学习笔记

1 自动内存管理 1.1 相关概念 Mutator&#xff1a;业务线程&#xff0c;分配新对象&#xff0c;修改对象指向关系Collector&#xff1a;GC线程&#xff0c;找到存活对象&#xff0c;回收死亡对象的内存空间Serial GC&#xff1a;只有一个collector&#xff08;需要暂停&#…

读书笔记//《数据分析之道》

出版时间&#xff1a;2022年 作者曾在互联网大厂做数据分析。从举例可以洞见作者的工作经历。 点评&#xff1a;作者在数据分析领域非常资深&#xff0c;尝试在书中提供一个数据分析工作框架参考。书本内容有点感觉是ppt的集合&#xff0c;辅以案例说明。不过&#xff0c;干货还…

基于ORB-SLAM2+RTAB-MAP+ROS的三维重建设计——环境配置与安装

写下这篇是为了毕设题目《基于深度相机的电缆识别系统》。使用的设备与环境如下&#xff1a;Ubuntu 20.04ROSGazebo仿真运行Kinect 2.0ORB-SLAM2论文地址&#xff1a;https://arxiv.org/abs/1610.06475GitHub&#xff1a;https://github.com/raulmur/ORB_SLAM2一、为什么要选择…

python多线程网络编程

背景 使用过flask框架后&#xff0c;我对request这个全局实例非常感兴趣。它在客户端发起请求后会保存着所有的客户端数据&#xff0c;例如用户上传的表单或者文件等。那么在很多客户端发起请求时&#xff0c;服务器是怎么去区分不同的request对象呢&#xff1f;当查看了大量的…

Android 8请求权限时弹窗BUG

弹窗BUG 应用使用requestPermissions申请权限时&#xff0c;系统会弹出一个选择窗口&#xff0c;可进行允许或拒绝&#xff0c; 此窗口中有一个”不再询问“的选择框&#xff0c; ”拒绝”及“允许”的按钮。 遇到一个Bug,单点击“不再询问”&#xff0c;“允许”这个按钮会变…

OpenAPI SDK组件介绍

背景 公司成立以来&#xff0c;积累了数以万计的可复用接口。上层的SaaS业务&#xff0c;原则上要复用这些接口开发自己的业务&#xff0c;为了屏蔽调用接口的复杂性&#xff0c;基础服务开发了apisdk组件&#xff0c;定义了一套声明OpenAPI的注解、注解解析器&#xff0c;实例…

【蓝牙mesh】Bearer层(承载层)介绍

【蓝牙mesh】Bearer层&#xff08;承载层&#xff09;介绍 Bearer层简介 蓝牙Mesh协议栈由多个不同的协议层组成&#xff0c;其中最底层的协议就是Bearer层&#xff0c;它负责提供数据传输的底层支持。蓝牙Mesh协议栈的最底层就是BLE协议栈&#xff0c;所以Bearer层是直接与BL…

GO 中的 defer 有哪些注意事项?下

上次一起写了 3 个案例&#xff0c;咱们这一次继续&#xff0c;这一次的会比上一次的稍微不太一样 案例 1 还有一个也非常常用的案例&#xff0c;使用 defer 来捕获异常 &#xff0c;也就是当程序崩溃的时候&#xff0c;defer 语句可以帮我们兜底&#xff0c;可以捕获异常后按…

vscode 配置 codeql

1、安装配置 codeql 环境 1.1 下载 codeql-cli 和 codeql 标准库 1&#xff09;下载安装 下载安装 codeql-cli: Releases github/codeql-cli-binaries GitHub 下载 codeql 标准库&#xff1a;https://github.com/gi thub/codeql 下载的安装包解压&#xff0c;codeql 可执…

二,从源代码开始编译安装iperf3

本文目录Linux系统中编译安装基本知识简介第一步&#xff0c;执行configure第二步&#xff0c;执行make第三步&#xff0c;make install其它功能说明Linux系统中编译安装基本知识简介 从前一文章"一&#xff0c;下载iPerf3最新源代码"我们已经知道如何通过git的方式…

Linux系统下命令行安装MySQL5.6+详细步骤

1、因为想在腾讯云的服务器上创建自己的数据库&#xff0c;所以我在这里是通过使用Xshell 7来连接腾讯云的远程服务器&#xff1b; 2、Xshell 7与服务器连接好之后&#xff0c;就可以开始进行数据库的安装了&#xff08;如果服务器曾经安装过数据库&#xff0c;得将之前安装的…

干货 | 八条“黄金规则”解决RF电路寄生信号

PART 01 接地通孔应位于接地参考层开关处流经所布线路的所有电流都有相等的回流。耦合策略固然很多&#xff0c;不过回流通常流经相邻的接地层或与信号线路并行布置的接地。在参考层继续时&#xff0c;所有耦合都仅限于传输线路&#xff0c;一切都非常正常。不过&#xff0c;如…

MySQL关于NULL值,常见的几个坑

数据库版本MySQL8。 1.count 函数 觉得 NULL值 不算数 &#xff0c;所以开发中要避免count的时候丢失数据。 如图所示&#xff0c;以下有7条记录&#xff0c;但是count(name)却只有6条。 为什么丢失数据&#xff1f;因为MySQL的count函数觉得 Null值不算数&#xff0c;就是说…

Shader(着色)

1.深度测试&#xff08;Z-Buffer &#xff09;每个像素需要一个深度来排序是否需要渲染&#xff0c;所以需要额外的buffer来存储&#xff0c;frame buffer 存颜色&#xff0c;depth buffer (z-buffer) 存深度。2.Lambert(漫反射)3.Blinn-Phong &#xff08;高光&#xff09;4.环…

Netty权威指南总结(一)

一、为什么选择Netty&#xff1a;API使用简单&#xff0c;开发门槛低&#xff0c;屏蔽了NIO通信的底层细节。功能强大&#xff0c;预制了很多种编解码功能&#xff0c;支持主流协议。定制能力强&#xff0c;可以通过ChannelHandler对通信框架进行灵活地拓展。性能高、成熟、稳定…

一文搞定Android Vsync原理简析

屏幕渲染原理"现代计算机之父"冯诺依曼提出了计算机的体系结构: 计算机由运算器&#xff0c;存储器&#xff0c;控制器&#xff0c;输入设备和输出设备构成&#xff0c;每部分各司其职&#xff0c;它们之间通过控制信号进行交互。计算机发展到现在&#xff0c;已经出…

【Python知识点桂电版】01基本数据类型

一、变量变量定义注&#xff1a;查看变量类型->type(变量)查看变量地址->id(变量)变量命名规则只允许出现&#xff1a;英文、中文、数字、下划线&#xff08;不推荐用中文&#xff0c;不能以数字开头&#xff09;大小写敏感不可使用关键字&#xff08;如and&#xff09;和…

代码随想录【Day24】| 开始回溯!77. 组合

回溯的本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案&#xff0c;如果想让回溯法高效一些&#xff0c;可以加一些剪枝的操作&#xff0c;但也改不了回溯法就是穷举的本质。 那么既然回溯法并不高效为什么还要用它呢&#xff1f; 因为没得选&#xf…

cesium: 设置skybox透明并添加背景图 ( 003 )

第003个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置skybox透明并添加背景图。 我们不想要黑乎乎的背景,想自定义一个背景图,然后前面显示地球。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共70…

奇妙的background-clip:text

我们在学习CSS3时&#xff0c;一个背景属性background-clip用来对背景进行裁剪&#xff0c;即指定背景绘制的区域&#xff0c;通常我们使用的几个属性如下&#xff1a;值说明border-box默认值。背景绘制在边框方框内&#xff08;剪切成边框方框&#xff09;。padding-box背景绘…