move_base+自己的定位程序(攻略篇) --- 成功实现ESKF的lidar+imu以及move_base的路径规划

临近放假,老板要求回去之前找其汇报进展,无奈近几月忙于毕业论文的编写,实在是没有多少可以汇报的内容,想来自己弄得定位程序只能实现定位,要不自己再加一个路径规划,直接干!

本文的文字量较大,请各位耐心阅读

首先,我自己的定位程序是参考网课写的,其主要实现的是基于ESKF的LIDAR/GNSS/IMU的多传感器融合定位系统,那么我自己的程序的TF树如下图所示。
在这里插入图片描述

可以看到,我的定位程序给出的是map到激光雷达传感器坐标系PandarXT-16的坐标变换,我们再考虑move_base的TF结构,如下图所示:
在这里插入图片描述
上面这幅图是在网上找的网图(侵删),可以看到,move_base需要如上图所示,需要map->odom->base_link(也可以是base_footprint,看你自己喜好),如此下来,我们似乎只需要将我们的定位程序按照这样的TF树进行发布即可?

非也!

我们在将自己的定位程序移植与move_base结合时,需要考虑如下几点:
1.TF结构;
2.那些坐标系之间可以是静态的,哪些可以是动态的?(这很重要!!!);
3.move_base在启动过程中,需要使用amcl获取到里程计信息,从而完成位姿初始化,进而完成costmap的初始化(没有costmap,就无法使用路径规划器!);
4.move_base需要单线激光雷达数据,但考虑到有一部分情况下,我们使用的是三维激光的定位程序,比如我自己的这个,那么就需要对原始点云做一些处理,进而得到单线激光雷达数据类型(即laser_scan);

以上四点,除了第四点外的每一个点都可能会出现不同种类的报错或者警告,第四点相对比较好处理,直接一个第三方工具包即可完成任务(链接放到最后)。

首先考虑TF之间的变换,哪些是可以静止的,哪些是必须动态的,直接给出答案:
map->odom:可以是静止的(我自己实测,手动发布map和odom之间的静态转换,后续的程序是可以启动的,我发布的是map与odom重合的TF静态变换)
odom->base_link/base_footprint:必须是动态的,必须是动态的,必须是动态的!!!! 重要的事儿说三遍。这里解释一下,其实amcl通过订阅坐标系之间的变换来完成位姿的初始化以及实时定位,笔者在这里卡了很久(基础不牢,地动山摇啊),因为一直以为amcl是通过订阅某个定位话题去完成位姿的初始化,后来请教过大佬和查看官网后,才发现amcl其实订阅的是odom与base_link/base_footprint之间的TF变换来的。
这里就很关键,回到本文的第一张图,可以看到我自己的定位程序发布的其实是map->PandarXT-16这两个坐标系之间的TF变换,笔者最开始的时候以为amcl订阅的是map->odom之间的TF变换,将自己的定位程序修改为发布map->odom之后,发现一直提示如下图的warning:
在这里插入图片描述
可以看到一直提示global_pose的stamp一直为0.00,这就很奇怪了哦,因为我使用tf_echo map odom这个指令监听这两个坐标系之间的变换时,at time是有时间的,笔者最开始一直没想明白,后来也是在别人的提醒下,同时参考了网上一篇博文lio-sam+move_base后,自己研究了一下lio-sam的TF变换情况,在RVIZ中查看lio-sam运行过程中各个坐标系之间的变换后,才猛然发现有可能amcl拿到的不是map->odom,而是odom->base_link/base_footprint!!!!
随后笔者立即修改定位程序,手动发布map与odom之间的静态变换,最终,成功点亮move_base~
在这里插入图片描述
很漂亮的轨迹就出现了~~~~
最后的TF树:
这张图里面map->odom应该是static,而odom到base_link是/kitti_…才对,写博文的时候实在是找不到最后正确TF的截图了,但是跟这个图片的结构是一样的,只需要吧map到odom和odom到base_link的变换关系对调一下就行~(后续有正确的了我会更新补充的)

网上对于这块内容的博文较少(我会在本文最后贴出所有自己参考过的博文),且有些看着有点云里雾里的,所以我自己在前辈们的经验基础上,得出了自己在做这项工作时的一些总结,汇总形成此篇博文,很感谢他们!
最后,再给出一个自己的经验总结,在使用move_base时,一定要清楚自己所使用的定位程序的TF结构,确保与move_base基本一致后,再查看定位程序是否能够发出满足amcl需求的TF变换,通常要考虑好哪些坐标系之间可以静态变换,哪些必须动态变换!其实一般TF一致后,能够正常发布amcl所需要的TF变换后,基本move_base就能跑起来了,但我在网上也看到过一些其他的问题,诸如:
1.move_base起来了,但是global_pose的时间戳与系统时间差的有点多,这种情况我看网上多见于一些自己搭建的小车里,主要原因好像是因为没有做系统时钟同步,我自己是用工控机跑的,所以暂时没出现这样的问题;
2.局部代价地图和全局代价地图过小,这个就是调节一下move_bsae的地图相关的参数,还有map_server相关的参数就行,网上有相关教程
3.关于map->odom,其实这个问题我自己也有点犯迷糊,因为有一部分代码中,虽然odom坐标系与map坐标系基本保持一致,但其并不是如我这样是一个静态的坐标转换,而是通过某一个节点发布的动态坐标变换,我之所以使用静态,一方面是参考博文lio-sam+move_base一文中,博主说一般认为map与odom坐标系之间为静态变换,另外一方面我自己运行lio-sam时发现odom与map就是一个静态变换,所以我才这样做的。所以,还是要特别关注一下自己的定位程序的TF树结构,因为有可能您修改了TF树后,move_base的满足了,但是定位却出现了其他的错误,这样是事倍功半的。
我自己的定位其实本身只发布两个坐标系之间的变换关系,所以,我修改定位程序,将其两个坐标系改为odom与base_link之间的变换后,我发现启动定位后RVIZ中有时不会出现定位信息,究其原因是因为我最开始做定位时,基坐标选择的是map,但是修改了坐标转换后,与map之间失去了TF关系,故我手动发布map到odom之间的坐标系转换。

参考文献

1.lio-sam+move_base
2.hdl_localization+move_base
3.lio-sam+move_base+3d点云转2d

希望阅读本文的各位工作学业顺利!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

centos 7.6 进入单用户模式

1、重启服务器,在选择内核界面使用上下箭头移动 2、选择内核并按“e” 将“RO”改成 rw ,删除 rhgb quiet 添加 init/bin/bash Ctrl X 进入单用户模式 为防止乱码,修改语言为英语 修改完密码建议输入:touch /.autorelabel 更新系统信…

websocket服务端本地部署

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

Unity3d引擎中使用AIGC生成的360全景图(天空盒)

前言 在这里与Skybox AI一起,一键打造体验无限的360世界,这是这个AIGC一键生成全景图的网站欢迎语。 刚使用它是23年中旬,在没有空去给客户实地拍摄全景图时,可以快速用它生成一些相关的全景图,用作前期沟通的VR de…

因谷歌Play Store审核超过7天和联系他们的方式

三种联系他们的方式 1.让他们打电话过来 英语好不好没关系,主要是他们讲着一口浓厚的印度口音英语,很难听懂 2.在线实时聊天沟通 可以选择英文、中文、但是英文肯定容易约上 3.发送邮件 回复太慢了,1-2天回复你一次 传送门&#xff1…

【Java数据结构 -- 队列:队列有关面试oj算法题】

队列、循环队列、用队列模拟栈、用栈模拟队列 1.队列1.1 什么是队列1.2 创建队列1.3 队列是否为空和获取队头元素 empty()peek()1.4 入队offer()1.5 出队(头删)poll() 2. 循环队列2.1 创建循环队列2.2 判断是否为空isEmpty()和满isFull()2.3 入队enQueue…

大数据开发之Scala

第 1 章:scala入门 1.1 概述 scala将面向对象和函数式编程结合成一种简洁的高级语言 特点 1、scala和java一样属于jvm语言,使用时都需要先编译为class字节码文件,并且scala能够直接调用java的类库 2、scala支持两种编程范式面向对象和函数式…

Flink中的时间和窗口(时间语义,水位线,窗口,迟到数据的处理)

目录 Flink中的时间和窗口 1时间语义 1.1Flink中的时间语义 1.1.1处理时间 1.1.2事件时间 1.2那种时间语义更重要 2 水位线 2.1 事件时间和窗口 2.2 什么是水位线 2.3 如何生成水位线 2.3.1使用WatermarkGenerator 2.3.2使用SourceFunction 2.4 水位线的传递 2.5 水位…

DP活动:HMI-Board以太网数据监视器(一)以太网外设的使用

HMI-Board以太网数据监视器 开发工具  RT-Thread Studio/Keil MDK5(固件开发、编译)  SquareLine Studio(LVGL UI设计工具) 资料链接  RT-Thread Studio下载链接: https://download_redirect.rt-thread.org/…

超优秀的三维模型轻量化、格式转换、可视化部署平台!

1、基于 HTML5 和 WebGL 技术,可在主流浏览器上进行快速浏览和调试,支持PC端和移动端 2、自主研发 AMRT 展示框架和9大核心技术,支持3D模型全网多端流畅展示与交互 3、提供格式转换、减面展UV、烘焙等多项单模型和倾斜摄影模型轻量化服务 4、…

OpenSource - 文件在线预览模块(多格式转 PDF 文件)

文章目录 文件在线预览模块(多格式转PDF文件)现已支持格式如下界面展示运行方式接口介绍文件上传文件转 PDF文件转图片文件转SVG 参数配置其他说明项目关联关键词文档转换预览技术说明同步转换异步转换 主要技术乱码问题处理帮助文档 前端预览弹出层用法…

【数据结构】链表(单链表与双链表实现+原理+源码)

博主介绍:✌全网粉丝喜爱、前后端领域优质创作者、本质互联网精神、坚持优质作品共享、掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战✌有需要可以联系作者我哦! 🍅附上相关C语言版源码讲解🍅 &#x1f44…

Android14源码剖析:MediaPlayer与MediaPlayerService区别?(五十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

论文阅读 1| 从仿真域到实验域无监督轴承故障诊断的新型联合传输网络

标题:Novel Joint Transfer Network for Unsupervised Bearing Fault Diagnosis From Simulation Domain to Experimental Domain 期刊:IEEE-ASME TRANSACTIONS ON MECHATRONICS (2022) 作者:Yiming Xiao, Haid…

初识 JVM

什么是JVM JVM 全称是 J ava V irtual M achine,中文译名 Java虚拟机 。 JVM 本质上是一个运行在计算机上的程序,他的职责是运行 Java字节码文件 。 JVM的功能 Java语言如果不做任何优化,性能不如C、C等语言。 Java需要实时解释&…

【Foxmail】客户端发送邮件错误:SSL Recv :服务器断开连接, errorCode: 6

Foxmail客户端发送邮件提示:SSL Recv :服务器断开连接, errorCode: 6 错误代码 处理方式: 去邮箱生成新的16位授权码,输入到 密码框 内即可。 注:一旦开通授权码,在Foxmail验证时 密码框 里输入的就是 授权码

【Android】在WSA安卓子系统中进行新实验性功能试用与抓包(2311.4.5.0)

前言 在根据几篇22和23的WSA抓包文章进行尝试时遇到了问题,同时发现新版Wsa的一些实验性功能能优化抓包配置时的一些步骤,因而写下此篇以作记录。 Wsa版本:2311.40000.5.0 本文出现的项目: MagiskOnWSALocal MagiskTrustUserCer…

【软考中级】3天擦线过软考中级-软件设计师

前提:已有数据结构、操作系统、计算机网络、数据库基础 (风险系数较高,请谨慎参考) 贴一个成绩单hhhh 弯路:很早之前有看过一遍网上的软考课程,也记录了一些笔记,然而听完还是啥都记不住。 推…

Text Workflow 1.8.2 mac文本转换处理

Text Workflow for mac是一款易于使用但功能强大的应用程序,可将任何文本转换成您需要的格式,以满足您的需求。Text Workflow具有广泛(并不断增长)的文本转换操作列表,可以实现各种功能。 软件下载:Text Wo…

RKE快速搭建离线k8s集群并用rancher管理界面

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 本文记录使用RKE快速搭建一套k8s集群过程,使用的rancher老版本2.5.7(当前最新版为2.7)。适用…

linux的安装配置

文章目录 1.centos7安装2.如何进行一个网络的开启3.客户端Xshell和Xftp的一个使用4.换源 1.centos7安装 1.我是在虚拟机里面重装了一个liunx系统,首先我们新建一个虚拟机 2.前面东西都不需要我们进行一个选择,到图中的这一步我们选择一个liunx,版本的话我们选择一个…