(02)Cartographer源码无死角解析-(04) 熟悉bag文件,配置.launch与.lua文件,初步调参

news2025/1/11 21:52:33

本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-接如下:
(02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/127350885
 
文末正下方中心提供了本人 联系方式, 点击本人照片即可显示 W X → 官方认证 {\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证} 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX官方认证
 

一、前言

再上一篇博客中,使用了新的数据集,在给出的下载链接中,launch 文件夹中存在很多 .launch 后缀文件,该文件在前面已经对齐进行过简单介绍,另外在 configuration_files 文件夹中存在很多 .luo 后缀文件,下面呢,会对其进行一个详细的讲解。一般来说呢,配置 launch 与 lua 文件,分为三个步骤:了解 bag 文件,配置 launch 文件,配置 lua 文件。
 

二、bag 文件

bag 文件是可以对齐进行播放的,当然这里不是类似视频意义上的播放。首先我们启动五个终端,分别执行如下指令:

roscore # 第一个终端,启动 rosmaster
rosbag info rslidar-outdoor-gps.bag # 第二个终端,了解 bag 中 topic 的名称与类型
rosbag play --clock ~/Downloads/rslidar-outdoor-gps.bag -l # 第三个终端,开始播放(空格建可暂停), --clock 可加可不加,-l表示循环播放
rqt # 第四个终端,了解 bag 中的 tf 树.
rviz # 可视化雷达数据与 tf 数据,刚打开什么都没有,不用着急

rqt 的所有显示插件都在菜单栏的 plugins 内, 再点击 visualization→ tf tree, 即可显示视频中的 tf 树的可视化界面。rviz 左侧最顶上的 Fixed frame 除了下拉菜单可以选择之外,还是可以手动输入的, 现在手动输入成 odom。左侧下方的 Add 按钮, 可以添加显示的插件, 自己选择添加 pointcloud2, laserscan 等格式的数据, 之后把插件订阅的 topic 选择一下, 如果不会可以自己多玩玩, 很简单的。

第二个终端 → {\color{blue}{第二个终端}}→ 第二个终端本人打印如下:
在这里插入图片描述
duration→持续时常;start(end)→开始结束时间;messages→消息数量;types→消息类型;topics→会话名称,其中 /fix 表示GPS的topic;/front_scan→单线雷达数据;/heading→两个GPS确定出来的航向;/imu→惯性里程计;/odom_scout→里程计数据;/rslidar_points→16线雷达的点云数据;其上有 /tf 与 /tf_static 两个话题,他们的区别在后面进行讲解。

第四个终端 → {\color{blue}{第四个终端}}→ 第四个终端通过左上角点击Plugins→introspection→Node Graph,还能够查看节点图,如下:
在这里插入图片描述
另外通过左上角点击 plugins→visualization→ tf tree,本人显示类似于下:
在这里插入图片描述
最上面的节点叫 odom,指向关系为 odom→footprint→base_link。但是从这里看不出来什么是 tf 或 tf_static。先来看看几个名词的介绍:

base_link→是固定在机器人本体上的坐标系,通常选择机器人腰部。
base_footprint(footprint)→表示机器人base_link原点在地面上的投影,区别base_link之处是其“z”坐标不同。

总的来说可以把 odom 理解为世界坐标系,base_link 理解机器人坐标系,footprint 理解为机器人的影子,随着机器人移动,odom→footprint 的 tf 是在变化的。但是 footprint→base_link 通常是不变的,也就是所谓的 tf_static。

第五个终端 → {\color{blue}{第五个终端}}→ 第五个终端该启动时什么都没有,通过点击左上角 Fixed Frame 默认为map,重新选择为 odom(base_link )。然后左下角点击 add→tf。如下图,就是机器人的机构,他们 link 之间的tf 可以理解为 tf_static。
在这里插入图片描述

另外还能看到 odom 与 机器人之间的一根连线,连接世界坐标系原点,那就是 tf,会发生变换的。另外还可以add一些其他的显示部件,如LaserScan(单线雷达)、Pointcloud2(16线雷达)等、但是都要记得选择Topic。
在这里插入图片描述
 

三、配置 .launch 文件

launch 文件中需要如下几个设置:

1、bag 文件的地址与 bag 文件的名字
2、lua 文件的名字
3、topic 需要 remap 成 bag 文件中发布的 topic

下面针对前面使用的 zwh_rs16_2d_outdoor.launch 进行讲解,其位于 src/cartographer_ros/cartographer_ros/launch/ 文件中:

<!--
<launch>
  <!-- bag的地址与名称 -->
  <arg name="bag_filename" default="$(env HOME)/Downloads/rslidar-outdoor-gps-notf.bag"/>

  <!-- 使用bag的时间戳 -->
  <param name="/use_sim_time" value="true" />

  <!-- 启动cartographer,注意这里的.lua文件,每个.launch都对应一个.lua文件 -->
  <node name="cartographer_node" pkg="cartographer_ros"
      type="cartographer_node" args="
          -configuration_directory $(find cartographer_ros)/configuration_files
          -configuration_basename lx_rs16_2d_outdoor.lua"
      output="screen">
    <remap from="points2" to="rslidar_points" />
    <remap from="scan" to="front_scan" />
    <remap from="odom" to="odom_scout" />
    <remap from="imu" to="imu" />
  </node>

  <!-- 生成ros格式的地图 -->
  <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"
      type="cartographer_occupancy_grid_node" args="-resolution 0.05" />

  <!-- 启动rviz -->
  <node name="rviz" pkg="rviz" type="rviz" required="true"
      args="-d $(find cartographer_ros)/configuration_files/lx_2d.rviz" />

  <!-- 启动rosbag -->
  <node name="playbag" pkg="rosbag" type="play"
      args="--clock $(arg bag_filename)" />
      
</launch>

如果以后大家配置自己的 .launch 文件, 首先配置bag的路径,对应.lua文件路径,然后设置订阅的话题。如上面的 <remap from=“points2” to=“rslidar_points” /> 把话题 points2 映射为 rslidar_points(多线雷达),同理把话题scan(单线雷达)映射为front_scan . . . . . . ...... ...... 这里是一个话题映射的过程。那么为什么要这样做呢?这是因为在Cartographer源码中,其订阅的话题为points2、scan、odom,但是bag中发布的话题为 rslidar_points,front_scan,odom_scout 所以需要重新建立一个映射关系。
 

三、配置 .lua 文件

该文件需要配置的如下:
( 01 ) : \color{blue}(01): (01) tracking_frame 有 imu 的 link 就设置成 imu 的 link, 没有就设置成 base_link
( 02 ) : \color{blue}(02): (02) published_frame cartographer 发布的 tf 的最下边一个坐标系, 就是 bag 文件中 tf 树的最上边的一个坐标系。
( 03 ) : \color{blue}(03): (03) provide_odom_frame 的作用是使得坐标系之间经过如下转换以后再发布:published_frame->odom_frame->map_frame。如果不是true,则是 published_frame ->map_frame进行发布。
( 04 ) : \color{blue}(04): (04) use_odometry 是否使用里程计的传感器数据, 如果为 true, tf 树中一定要存在odom 这个坐标系
( 05 ) : \color{blue}(05): (05) num_laser_scans/num_point_clouds 单线点云与多线点云的话题的数量, 可以同时为 1, 不可以同时为 0
( 06 ) : \color{blue}(06): (06) TRAJECTORY_BUILDER_2D.use_imu_data 是否使用 imu, 如果用 imu, tracking_frame 一定要设置成 imu 的 link
( 07 ) : \color{blue}(07): (07) TRAJECTORY_BUILDER_2D.min_z 点云的最小 z 的范围, 单线点云不能设置大于 0 的值(不设置), 多线点云的这个值要大于 0
 
( 08 ) : \color{blue}(08): (08) use_pose_extrapolator = false 这个一定要设置成 false
( 09 ) : \color{blue}(09): (09) use_nav_sat/use_landmarks 是否订阅里程计话题的数据, 以及 landmark 话题的数据
( 10 ) : \color{blue}(10): (10) num_subdivisions_per_laser_scan 一帧点云数据会被分成几次处理, 设置成 1 就行了
( 11 ) : \color{blue}(11): (11) MAP_BUILDER.use_trajectory_builder_2d = true 建二维图时一定要有这句话, 建三维图就把 2d 改成 3d

这里以 src/cartographer_ros/cartographer_ros/configuration_files/backpack_2d.lua 文件进行示例

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 = 0,
  num_multi_echo_laser_scans = 1,
  num_subdivisions_per_laser_scan = 10,
  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.num_accumulated_range_data = 10

return options

以上是原版,那么如何修改成适配我们的版本呢?

tracking_frame = 'imu_link',  --1.在第四个终端,选择 plugins→visualization→ tf tree之后,可以看到其是存在Imu_link。 
published_frame = "odom",  -- tf tree最上面的坐标系
provide_odom_frame = false, --在tf tree已经存在odom了,所以一定要设置为false
use_pose_extrapolator = false,  --这个一定要设置成 false
use_odometry = false, --已经有odom坐标系,所以可以不用
num_laser_scans = 0, --不订阅单线雷达
num_multi_echo_laser_scans = 0, --多回身波雷达,很少使用
num_subdivisions_per_laser_scan = 1, --默认为1即可
num_point_clouds = 1, --订阅点云数据
TRAJECTORY_BUILDER_2D.use_imu_data = ture, --使用imu数据
TRAJECTORY_BUILDER_2D.min_z = 0.2 --注意单线点云不能设置大于0的数,多线点云数据如果打到地面可以通过这个值过滤掉

 

四、前言

通过该篇博客,对.launch与.lua文件文件的设置,进行了简单介绍,如果还需要设置其他的参数,可以自行百度一下。另外需要注意的就是,修改.launch与.lua文件之后,需要重新编译。
 
 
 

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

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

相关文章

算法 | 详解斐波那契数列问题

14天阅读挑战赛 本篇是学习了《趣学算法&#xff08;第2版&#xff09;》 第一章之后总结的。 上一篇讲到了等比数列求和问题&#xff0c;求Sn122223...263&#xff1f;S_n 1 2 2^2 2^3 ... 2^{63} &#xff1f;Sn​122223...263&#xff1f;&#xff0c;该函数属于爆…

1024,我们节日

文章目录1024的前奏1024应该锻炼身体1024 &#xff1f;为何是1024其他的1024代码有Bug&#xff0c;世界却温暖特殊的一类人群&#xff08;一&#xff09;特殊的一类人群&#xff08;二&#xff09;写在最后1024的前奏 写博文的时间是23号&#xff0c;距离1024这个标志性的节日…

趣学算法14天阅读|Day2

14天阅读挑战赛 文章目录前言什么是算法&#xff1f;算法复杂度如何评定好算法案例案例一&#xff1a;棋盘的麦子案例二&#xff1a;兔子数列总结前言 &#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端中级工…

@AutoConfigurationPackage注解详解

AutoConfigurationPackage是在springboot启动类注解SpringBootApplication下的EnableAutoConfiguration下。AutoConfigurationPackage作用是指定springboot扫描包&#xff0c;默认就是扫描启动类同包下的类。可以通过AutoConfigurationPackage来附加其他路径&#xff0c;然后sp…

asp.net园林绿化服务交易网站

本设计的目的是通过对园林绿化的初步了解&#xff0c;在巩固网站设计所学知识的基础上。运用于实践&#xff0c;在实践中强化理论知识&#xff0c;做到理论联系实践。在设计中学会搜集资料地方法&#xff0c;学会查阅设计规程。掌握设计步骤&#xff0c;同时培养创新能力&#…

【图像评价】基于matlab GUI图像评价系统【含Matlab源码 2185期】

一、图像质量评价 图像质量评价对图像处理算法的可行性分析以及某类算法达成效果的比较都起着非常重要的指导作用。随着图像处理技术的发展&#xff0c;对于图像质量评价的研究也日益深入&#xff0c;新的评价指标和评价算法不断涌现&#xff0c;共同推动了图像质量评价的进步…

【模型训练】YOLOv7旋翼无人机检测

YOLOv7旋翼无人机检测 1、YOLOv7算法旋翼无人机检测模型训练2、YOLOv7模型模型评估3、模型和数据集下载1、本项目采用YOLOv7算法实现对空中旋翼无人机的检测,在一万多张旋翼无人机检测数据集中训练得到,我们训练了YOLOv7模型,经评估我们得出了各个模型的评价指标; 2、目标类…

研发效能工程实践开篇

背景 随着技术的发展&#xff0c;大至一线互联网公司、小至几十人研发团队的公司都开始开展devops运动。大公司有能力自研&#xff0c;小公司则采用开源解决方案。如何实施devops业界已经有非常成熟的方案&#xff0c;所以本系列不再谈devops工具链以及如何实施。本系列想谈谈…

初识C++ - 类与对象(中篇·下半)

目录 赋值运算符重载 以下是一个日期类的运算符重载的案例(重点) 关于流插入与流提取的使用 方法一&#xff1a;定义与声明分离 方法二&#xff1a;使用内联函数 const成员 概念 关于上述日期类代码为什么需要在函数后面加入const 取地址及const取地址操作符重载 …

5G核心网技术基础自学系列 | 网络切片

书籍来源&#xff1a;《5G核心网 赋能数字化时代》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G核心网技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 支持网络切片是设计5G架构的主要驱…

【牛客刷题--SQL篇】必会的常用函数之条件函数SQL26计算25岁以上和以下的用户数量(多种写法)

&#x1f496;个人主页&#xff1a;与自己作战 &#x1f4af;作者简介&#xff1a;CSDN博客专家、CSDN大数据领域优质创作者、CSDN内容合伙人、阿里云专家博主 &#x1f49e;牛客刷题系列篇&#xff1a;【SQL篇】】【Python篇】【Java篇】 &#x1f4cc;推荐刷题网站注册地址&a…

基于WEB的二维码生成系统设计与实现(Asp.net)

目 录 1 引言 6 2 二维码的生成原理 6 2.1基础知识 6 2.1.1定位图案 7 2.1.2功能性数据 8 2.1.3数据码和纠错码 8 2.2数据编码 8 2.3结束符和补齐符 9 2.3.1补齐码&#xff08;Padding Bytes&#xff09; 9 2.3.2纠错码 10 2.4最终编码 11 2.4.1穿插放置 11 2.4.2Remainder Bi…

JWT基础概念

1. 介绍 JWT &#xff08;JSON Web Token&#xff09; 是目前最流行的跨域认证解决方案&#xff0c;是一种基于 Token 的认证授权机制。 从 JWT 的全称可以看出&#xff0c;JWT 本身也是 Token&#xff0c;一种规范化之后的 JSON 结构的 Token。 JWT 自身包含了身份验证所需要…

【正点原子I.MX6U-MINI应用篇】6、嵌入式Linux在LCD屏幕上显示字符

一、原始方式&#xff1a; 取模显示字符 LCD显示屏是由width * height个像素点构成的&#xff0c;显示字符&#xff0c;一个非常容易想到的方法便是对字符取模&#xff0c;然后在LCD屏上打点显示字符&#xff1b;如果大家以前学习过单片机&#xff0c;想必接触过一些显示屏&am…

三次、五次多项式插值(附代码)

文章目录一、三次多项式插值二、五次多项式插值三、matlab代码三次、五次多项式插值在工程实践中很常见。求解多项式的系数最直接的方法是根据端点处的约束条件&#xff0c;列出线性方程组&#xff0c;再写成矩阵方程AXB&#xff0c;然后用通用的方法(如高斯消元法、LU分解等)解…

二叉树广度优先搜索、深度优先搜索(前序、中序、后序)遍历,动图详解-Java/Kotlin双版本代码

自古逢秋悲寂寥&#xff0c;我言秋日胜春朝 二叉树结构说明 本博客使用树节点结构&#xff0c;如下所示&#xff1a; Kotlin 版本 class TreeNode(var value: String, var leftNode: TreeNode? null, var rightNode: TreeNode? null)Java 版本 class TreeNode(){public…

经典排序之插入排序

目录 直接插入排序&#xff1a; 基本思路 图解过程 代码 复杂度分析 希尔排序 基本思想 图解过程 代码 复杂度分析 总结 参赛话题&#xff1a;学习笔记 直接插入排序&#xff1a; 基本思路 直接插入排序的工作方式像许多人排序一手扑克牌。开始时&#xff0c;我们的左手…

【Netty 从成神到升仙系列 大结局】全网一图流死磕解析 Netty 源码

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;Java领域新星创作者。&#x1f4dd;个人公众号&#xff1a;爱敲代码的小黄&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法&#x…

第八篇 python 面向对象编程

11 面向对象编程 面向对象编程——Object Oriented Programming&#xff0c;简称OOP&#xff0c;是一种程序设计思想。OOP把对象作为程序的基本单元&#xff0c;一个对象包含了数据和操作数据的函数。 面向过程的程序设计把计算机程序视为一系列的命令集合&#xff0c;即一组…

Python攻防-APK批量化Pull与自动化反编译

文章目录前言Pull APK根据包名列表根据手机路径逆向APK自动化反编译findstr检索…总结前言 日常工作过程中&#xff0c;经常会遇到发现新的攻击模式的情况下&#xff0c;需要全量排查手机上所有 APP 的代码是否存在该类代码缺陷。对于复杂的攻击模式而言&#xff0c;往往需要动…