ROS2+TurtleBot3+Cartographer+Nav2实现slam建图和导航

0 引言

入门机器人最常见的应用就是slam建图和导航,本文将详细介绍这一流程, 便于初学这快速上手。
首先对需要用到的软件包就行简单介绍。
turtlebot3: 是一个小型的,基于ros的移动机器人。 学习机器人的很多示例程序都是基于turtlebot3。
Cartographer: 是一个流行的slam建图工具包。
Nav2: 是一个流行的导航工具包。
gazebo: 是一个基于ros的物理仿真平台。

1 依赖包安装

前提条件是已经安装好了ros2环境, 本文安装的是humble版本, 其他版本需要注意修改对应的安装包。

1.1 gazebo 安装

sudo apt install ros-humble-gazebo-*

1.2 Cartographer安装

sudo apt install ros-humble-cartographer
sudo apt install ros-humble-cartographer-ros

1.3 nav2 安装

sudo apt install ros-humble-navigation2
sudo apt install ros-humble-nav2-bringup

1.4 tutlebot3安装

sudo apt install ros-humble-turtlebot3*

1.5 键盘控制程序包安装

sudo apt install ros-humble-teleop-twist-keyboard

2 用Cartographer进行slam, 得到地图

第一步: 启动gazebo仿真

ros2 launch turtlebot3_gazebo turtlebot3_house.launch.py

第二步: 启动cartographer节点

ros2 launch turtlebot3_cartographer cartographer.launch.py 

第三步: 启动键盘控制节点

ros2 run teleop_twist_keyboard teleop_twist_keyboard

用键盘控制机器人的移动进行slam建图。

键盘控制程序的使用方法可以参考我的另一篇博客: ros键盘控制程序teleop_twist_keyboard 键值含义及用法

第四步:保存地图

ros2 run nav2_map_server map_saver_cli -f my_map

my_map 是保存的地图的文件名, 会生成yaml 和pgm 两个文件。

实际场景如下: 在这里插入图片描述

建图效果如下:
在这里插入图片描述

3 用Nav2 实现导航

第一步: 启动gazebo 仿真

ros2 launch turtlebot3_gazebo turtlebot3_house.launch.py

第二步: 启动nav2 导航程序

ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=true map:=map/my_map.yaml

注意: 这里用到的map就是上面通过slam建图得到的地图文件。

第三步:操作rviz界面进行导航
首先需要点击 2D Pose Estimate, 并在地图上点一个点, 作为机器人的初始位姿。
然后点击Nav2 Goal设定目标位姿。
设置好之后就可以看到导航程序会规划好一条从起始点到目标点的路径, 并沿着路径进行移动。
在这里插入图片描述

4 FAQ

1 启动gazebo时可能报错 [error] [gzserver-1]: process has died [pid 690246, exit code 255
原因是可能之前运行过gzserver进程并且没有正常退出, 解决办法是杀掉gzserver进程。
killall gzserver 或者ps -ef 查看gzserver进程, 用kill -9 杀掉即可。

2 无报错能打开gazebo界面, 但场景出不来
原因是没找到gazebo模型库,找到它的安装路径, 并添加以下环境变量即可。

export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/opt/ros/humble/share/turtlebot3_gazebo/models

3 nav2 导航程序可能报错: nav2_amcl::MotionModel does not exist

解决办法是找到配置文件参数, 如上述例子中配置文件为/opt/ros/humble/share/turtlebot3_navigation2/param/waffle.yaml

amcl节点使用的robot_model_type参数值为"differential",需要修改为"nav2_amcl::DifferentialMotionModel"
在这里插入图片描述

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

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

相关文章

Java入门之数据类型和变量

1.字面常量 字面常量就是在程序运行中,固定不变的量,例如如下的代码 public class Demo{public static void main(String[] args){System.Out.println("hello world!");System.Out.println(100);System.Out.println(3.14);System.Out.println…

Windows Docker 部署 Etcd 键值存储系统

一、简介 etcd 是一个由 CoreOS 团队发起的开源项目,它用 Go 语言实现,是一个分布式、高可用的键值存储系统。etcd 采用 Raft 算法,确保了数据的强一致性和高可用性,即使集群中有部分节点发生故障,也能保持服务的正常…

Github20K星开源团队协作工具:Zulip

Zulip:让团队协作的每一次交流,都精准高效。- 精选真开源,释放新价值。 概览 随着远程工作的兴起和团队协作的需求不断增加,群组聊天软件成为了日常工作中不可或缺的一部分。Zulip 是github上一个开源的团队协作工具,…

微信支付商户的“商家转账到零钱”产品快速开通指南

微信支付商户的“商家转账到零钱”功能为商家提供了便捷的转账途径,尤其适用于费用报销、员工福利发放、合作伙伴货款或分销返佣等多种场景。那么,如何快速开通这一功能呢,需要快速开通的商户可以联系小编。 首先,确保你的企业已经…

Java | Leetcode Java题解之第89题格雷编码

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> grayCode(int n) {List<Integer> ret new ArrayList<Integer>();for (int i 0; i < 1 << n; i) {ret.add((i >> 1) ^ i);}return ret;} }

【vivado】 IBERT GT收发器误码率测试

一、前言 IBERT(Integrated Bit Error Ratio Tester),集成误码率测试仪。作为用户来说可以使用这个工具对自己设计的板子中的高速串行收发器进行简单测试&#xff0c;从而判断设计的接口是否有问题。因为这个工具是直接集成到FPGA上&#xff0c;这样一来直接使用这个工具来测试…

能播放SWF文件的FlashPlayer播放器

问题&#xff1a; 你是不是遇到了 flash 动画 放不了了&#xff1f; 以前的flash游戏玩不了了 在网上很难找到好用的&#xff0c;免费Flashplayer播放器&#xff0c; 找到的也没法保存.exe 以前买的课件放不了了 一打开就更新提示&#xff1a; 再不就是意外能打开了但【创建…

前端 performance api使用 —— mark、measure计算vue3页面echarts渲染时间

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐Performance api计算持续时间&#x1f496; mark用法&#x1f496; measure用法 ⭐计算echarts渲染的持续时间⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端 performance api使用 —— mark、measure计…

Dilworth定理:最少的下降序列个数就等于整个序列最长上升子序列的长度

概念如下&#xff1a; 狄尔沃斯定理_百度百科 (baidu.com) 本质就是找要求序列中最长的单调的子序列&#xff08;不一定连续&#xff09;的长度。 模板如下&#xff1a; 时间复杂度为O&#xff08;N^2&#xff09; #include<iostream>using namespace std;int dp[100…

3、架构-事务处理

目录 概述 场景事例 本地事务 实现原子性和持久性 实现隔离性 概述 事务处理几乎在每一个信息系统中都会涉及&#xff0c;它存在的意义是为 了保证系统中所有的数据都是符合期望的&#xff0c;且相互关联的数据之间不 会产生矛盾&#xff0c;即数据状态的一致性&#xff0…

meshlab: pymeshlab合并多个物体模型并保存(flatten visible layers)

一、关于环境 请参考&#xff1a;pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 本文所给出的例子是https://download.csdn.net/download/weixin_42605076/89233917中的…

np.linalg.norm()

np.linalg.norm()是NumPy中用于计算向量或矩阵的范数的函数。它可以计算不同类型的范数&#xff0c;包括向量的L1范数、L2范数以及矩阵的Frobenius范数等。 基本用法如下, numpy.linalg.norm(x, ordNone, axisNone, keepdimsFalse) x&#xff1a;输入数组&#xff0c;可以是…

Python | Leetcode Python题解之第90题子集II

题目&#xff1a; 题解&#xff1a; class Solution:def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:if not nums:return list()results list()nums.sort()visited [False] * len(nums)self.dfs(nums, results, list(), visited, 0)return resultsdef df…

elasticsearch使用Ngram实现任意位数手机号搜索

文章目录 Ngram自定义分词案例实战问题拆解 Ngram分词器定义Ngram分词定义Ngram分词示例Ngram分词应用场景 Ngram分词实战 Ngram自定义分词案例 当对keyword类型的字段进行高亮查询时&#xff0c;若值为123asd456&#xff0c;查询sd4&#xff0c;则高亮结果是&#xff1c;em&a…

欧洲风景(地理)

1.尼斯湖 尼斯湖亦译内斯湖&#xff0c;位于英国苏格兰高原北部的大峡谷中&#xff0c;湖长39公里&#xff0c;宽2.4公里。面积并不大&#xff0c;却很深。传说这儿住着一只水怪&#xff0c;因此吸引了大量游客。 2.伦敦塔桥 伦敦塔桥是从英国伦敦泰晤士河口算起的第一座桥(泰…

类图及类的关系

类图&#xff08;Class Diagram&#xff09;是UML&#xff08;Unified Modeling Language&#xff0c;统一建模语言&#xff09;中的一种图&#xff0c;用于描述系统中类的静态结构&#xff0c;包括类的属性、方法以及类之间的关系。 一、类 类&#xff08;Class&#xff09;…

Elasticsearch - HTTP

文章目录 安装基本语法索引创建索引查看索引删除索引 文档创建文档更新文档匹配查询多条件查询聚合查询映射 安装 https://www.elastic.co/downloads/past-releases/elasticsearch-7-17-0 下载完成启动bin/elasticsearch服务&#xff0c;可以在Postman调试各种请求。 基本语法…

数据库系统概论(超详解!!!)第八节 数据库设计

1.数据库设计概述 数据库设计是指对于一个给定的应用环境&#xff0c;构造&#xff08;设计&#xff09;优化的数据库逻辑模式和物理结构&#xff0c;并据此建立数据库及其应用系统&#xff0c;使之能够有效地存储和管理数据&#xff0c;满足各种用户的应用需求&#xff0c;包…

【Qt问题】windeployqt如何提取Qt依赖库

往期回顾 【Qt问题】Qt Creator 如何链接第三方库-CSDN博客 【Qt问题】Qt 如何带参数启动外部进程-CSDN博客 【Qt问题】VS2019 Qt win32项目如何添加x64编译方式-CSDN博客 【Qt问题】windeployqt如何提取Qt依赖库 考虑这个问题主要是&#xff1a;当我们的程序运行好之后&#…

Nginx生产环境最佳实践之配置灰度环境

你好呀&#xff0c;我是赵兴晨&#xff0c;文科程序员。 下面的内容可以说是干货满满建议先收藏再慢慢细品。 今天&#xff0c;我想与大家深入探讨一个我们日常工作中不可或缺的话题——灰度环境。你是否在工作中使用过灰度环境&#xff1f;如果是&#xff0c;你的使用体验如…