Chapter6:机器人SLAM与自主导航
ROS1{\rm ROS1}ROS1的基础及应用,基于古月的课,各位可以去看,基于hawkbot{\rm hawkbot}hawkbot机器人进行实际操作。
ROS{\rm ROS}ROS版本:ROS1{\rm ROS1}ROS1的Melodic{\rm Melodic}Melodic;实际机器人:Hawkbot{\rm Hawkbot}Hawkbot;
1.机器人必备条件
-
硬件要求
- 差分轮式机器人,使用Twist{\rm Twist}Twist速度指令控制
- linear{\rm linear}linear:XYZ{\rm XYZ}XYZ方向上的线速度,单位:m/s{\rm m/s}m/s;
- angular{\rm angular}angular:XYZ{\rm XYZ}XYZ方向上的角速度,单位:rad/s{\rm rad/s}rad/s;
- 机器人必须安装激光雷达等测距设备,可以获取环境深度信息;
- 最好使用正方形和圆形的机器人,其他外形的机器人效果可能不佳;
- 差分轮式机器人,使用Twist{\rm Twist}Twist速度指令控制
-
深度信息
rosmsg show sensor_msgs/LaserScan=========================================================================== angle_min:可检测范围的起始角度; angle_max:可检测范围的终止角度,与angle_min组成激光雷达可检测范围; angle_increment:相邻数据帧之间的角度步长; time_increment:采集到相邻数据帧之间的时间步长,当传感器处于相对运动状态时进行补偿使用; scan_time:采集一帧数据所需要的时间; range_min:最近可检测深度的阈值; range_max:最远可检测深度的阈值; ranges:一帧深度数据的存储数组; =========================================================================== -
里程计信息
- pose{\rm pose}pose:机器人当前位置坐标,包括机器人的XYZ{\rm XYZ}XYZ三轴位置与方向参数,及用于校正误差的协方差矩阵;
- twist{\rm twist}twist:机器人当前的运动状态,包括XYZ{\rm XYZ}XYZ三轴的线速度与角速度,及用于校正误差的协方差矩阵;
-
仿真环境
# 创建仿真环境 roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
2.ROS SLAM功能包应用方法
-
gmapping{\rm gmapping}gmapping功能包概述
- 基于激光雷达;
- Rao−Blackwellized{\rm Rao-Blackwellized}Rao−Blackwellized粒子滤波算法;
- 二维栅格地图;
- 需要机器人提供里程计信息;
- OpenSlam{\rm OpenSlam}OpenSlam开源算法;
- 输出地图话题:nav_msgs/OccupancyGrid{\rm nav\_msgs/OccupancyGrid}nav_msgs/OccupancyGrid;
-
gmapping{\rm gmapping}gmapping功能包总体框架

-
安装gmapping{\rm gmapping}gmapping功能包
# 安装gmapping sudo apt-get install ros-melodic-gmapping
-
栅格地图取值原理

- 致命障碍:栅格值为254254254,障碍物与机器人中心重合,此时机器人必然与障碍物发生碰撞;
- 内切障碍:栅格值为253253253,障碍物处于机器人轮廓的内切圆内,此时机器人也必然与障碍物发生碰撞;
- 外切障碍:栅格值为252~128252~128252~128,障碍物处于机器人轮廓的外切圆内,此时机器人与障碍物临界接触,不一定发生碰撞;
- 非自由空间:栅格值为128~0128~0128~0,障碍物附近区域,一旦机器人进入该区域,将有较大概率发生碰撞,属于危险警戒区,机器人应该尽量避免进入;
- 自由区域:栅格值为000,此处没有障碍物,机器人可以自由通过;
- 未知区域:栅格值为255255255,此处还没有探知是否有障碍物,机器人可以前往继续建图;
-
配置gmapping{\rm gmapping}gmapping功能包
# gmapping.launch文件内容<launch><arg name="scan_topic" default="scan" /><node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true"><param name="odom_frame" value="odom"/><param name="map_update_interval" value="5.0"/><!-- Set maxUrange < actual maximum range of the Laser --><param name="maxRange" value="5.0"/><param name="maxUrange" value="4.5"/><param name="sigma" value="0.05"/><param name="kernelSize" value="1"/><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="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.5"/><param name="angularUpdate" value="0.436"/><param name="temporalUpdate" value="-1.0"/><param name="resampleThreshold" value="0.5"/><param name="particles" value="80"/><param name="xmin" value="-1.0"/><param name="ymin" value="-1.0"/><param name="xmax" value="1.0"/><param name="ymax" value="1.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> -
运行激光雷达建图例程
# 1.启动gmapping演示 roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch roslaunch mbot_navigaztion gmapping_demo.launch roslaunch mbot_teleop mbot_teleop.launch# 2.切换到地图保存目录,保存地图 roscd mbot_navigation/maps/# rosrun map_server map_saver -f 地图名 rosrun map_server map_saver -f simulink_maps# 注: # 建图效果好坏和很多因素有关,如硬件、算法本身、可调参数等; # 硬件条件不好,建图过程中可能发生移位,导致建图失败;建图效果:

地图的.pgm{\rm .pgm}.pgm文和.yaml{\rm .yaml}.yaml信息:

-
运行kinect{\rm kinect}kinect建图例程
# 1.启动建图演示 roslaunch mbot_gazebo mbot_kinect_nav_gazebo.launch roslaunch mbot_navigation gmapping_demo.launch roslaunch mbot_teleop mbot_teleop.launch# 2.若运行kinect抛出如下错误 cannot launch node of type [depthimage_to_laserscan/depthimage_to_laserscan]:depthimage_to_laserscan# 解决方案 sudo apt-get install ros-melodic-depthimage-to-laserscan# 注: # 使用摄像头建模,效果好坏和硬件配置很大关系; # 如下图所示,使用虚拟机建图十分卡顿,很容易发生移位; # 如果笔记本的配置不是很好,建议了解建图过程即可; # 如果笔记本配置不是很好,建图过程会直接卡死,想退出也难;没有完全建好的图效果(发生了移位):

-
实际机器人建图实例
# Hawkbot机器人的实际建图过程 # 1.时间同步 # 远程登录移动机器人端,并进行时间同步 ssh ... sudo ntpdate 虚拟机IP# 2.启动建图节点 roslaunch hawbot bringup.launch(机器人端) roslaunch hawkbot teleop_key.launch(机器人或虚拟机端) roslaunch hawkbot gmapping_slam.launch(虚拟机端)# 3.保存地图 roscd hawkbot/maps/ rosrun map_server map_saver -f 地图名称
3.ROS中的导航框架
-
ROS{\rm ROS}ROS的导航框架

-
move_base{\rm move\_base}move_base

- 全局路径规划(globalplanner)({\rm global\ planner})(global planner):
- 全局最优路径规划;
- Dijkstra{\rm Dijkstra}Dijkstra或A∗A^*A∗算法;
- 本地实时规划(localplanner)({\rm local\ planner})(local planner):
- 规划机器人每个周期内的线速度、角速度,使之尽量符合全局最优路径;
- 实时避障;
- TrajectoryRollout{\rm Trajectory\ Rollout}Trajectory Rollout和DynamicWindowApproaches{\rm Dynamic\ Window\ Approaches}Dynamic Window Approaches算法;
- 搜索躲避和行进的多条路径,综合各评价标准选取最优路径;
- 全局路径规划(globalplanner)({\rm global\ planner})(global planner):
-
move_base{\rm move\_base}move_base功能包的话题和服务

-
配置move_base{\rm move\_base}move_base节点
# move_base.launch文件内容 <launch><node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true"><rosparam file="$(find mbot_navigation)/config/mbot/costmap_common_params.yaml" command="load" ns="global_costmap" /><rosparam file="$(find mbot_navigation)/config/mbot/costmap_common_params.yaml" command="load" ns="local_costmap" /><rosparam file="$(find mbot_navigation)/config/mbot/local_costmap_params.yaml" command="load" /><rosparam file="$(find mbot_navigation)/config/mbot/global_costmap_params.yaml" command="load" /><rosparam file="$(find mbot_navigation)/config/mbot/base_local_planner_params.yaml" command="load" /></node></launch> -
amcl{\rm amcl}amcl
- 蒙特卡罗定位方法;
- 二维环境定位;
- 针对已有地图使用粒子滤波器跟踪一个机器人的姿态;
-
amcl{\rm amcl}amcl功能包的话题和服务

-
amcl{\rm amcl}amcl定位

- 里程计定位:只通过里程计的数据来处理/base{\rm /base}/base和/odom{\rm /odom}/odom间的TF{\rm TF}TF变换;
- amcl{\rm amcl}amcl定位:估算机器人在地图坐标系/map{\rm /map}/map下的位姿信息,提供/base、/odom、/map{\rm /base、/odom、/map}/base、/odom、/map间的TF{\rm TF}TF变换;
-
配置amcl{\rm amcl}amcl节点
# amcl.launch文件内容 <launch><arg name="use_map_topic" default="false"/><arg name="scan_topic" default="scan"/><node pkg="amcl" type="amcl" name="amcl" clear_params="true"><param name="use_map_topic" value="$(arg use_map_topic)"/><!-- Publish scans from best pose at a max of 10 Hz --><param name="odom_model_type" value="diff"/><param name="odom_alpha5" value="0.1"/><param name="gui_publish_rate" value="10.0"/><param name="laser_max_beams" value="60"/><param name="laser_max_range" value="12.0"/><param name="min_particles" value="500"/><param name="max_particles" value="2000"/><param name="kld_err" value="0.05"/><param name="kld_z" value="0.99"/><param name="odom_alpha1" value="0.2"/><param name="odom_alpha2" value="0.2"/><!-- translation std dev, m --><param name="odom_alpha3" value="0.2"/><param name="odom_alpha4" value="0.2"/><param name="laser_z_hit" value="0.5"/><param name="laser_z_short" value="0.05"/><param name="laser_z_max" value="0.05"/><param name="laser_z_rand" value="0.5"/><param name="laser_sigma_hit" value="0.2"/><param name="laser_lambda_short" value="0.1"/><param name="laser_model_type" value="likelihood_field"/><!-- <param name="laser_model_type" value="beam"/> --><param name="laser_likelihood_max_dist" value="2.0"/><param name="update_min_d" value="0.25"/><param name="update_min_a" value="0.2"/><param name="odom_frame_id" value="odom"/><param name="resample_interval" value="1"/><!-- Increase tolerance because the computer can get quite busy --><param name="transform_tolerance" value="1.0"/><param name="recovery_alpha_slow" value="0.0"/><param name="recovery_alpha_fast" value="0.0"/><remap from="scan" to="$(arg scan_topic)"/></node> </launch>
4.ROS机器人自主导航
-
导航仿真
# 1.启动导航仿真包 roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch roslaunch mbot_navigation nav_cloister_demo.launch# 2.导航步骤 # 2.1 若机器人不在建图坐标系原点,先点击"2D Pose Estimate",将地图和雷达数据对上; # 2.2 匹配好机器人初始位置后,点击"2D Nav Goal"发布机器人目标点;
-
导航SLAM{\rm SLAM}SLAM仿真
# 1.启动相应.launch文件 roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch roslaunch mbot_navigation exploring_slam_demo.launch# 2.通过点击"2D Nav Goal"发布机器人目标点进行建图;# 自主探索SLAM仿真 # 启动相应的.launch文件 roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch roslaunch mbot_navigation exploring_slam_demo.launch rosrun mbot_navigation exploring_slam.py
相关文章:
Chapter6:机器人SLAM与自主导航
ROS1{\rm ROS1}ROS1的基础及应用,基于古月的课,各位可以去看,基于hawkbot{\rm hawkbot}hawkbot机器人进行实际操作。 ROS{\rm ROS}ROS版本:ROS1{\rm ROS1}ROS1的Melodic{\rm Melodic}Melodic;实际机器人:Ha…...
Sass的使用要点
Sass 是一个 CSS 预处理器,完全兼容所有版本的 CSS。实际上,Sass 并没有真正为 CSS 语言添加任何新功能。只是在许多情况下可以可以帮助我们减少 CSS 重复的代码,节省开发时间。 一、注释 方式一:双斜线 // 方式二:…...
计算机启动过程,从按下电源按钮到登录界面的详细步骤
1、背景 自接触计算机以来,一直困扰着我一个问题。当我们按下电脑的开机键后,具体发生了哪些过程呢?计算机启动的具体步骤是什么? 计算机启动过程通常分为五个步骤:电源自检、BIOS自检、引导设备选择、引导程序加载和…...
LeetCode 刷题之 BFS 广度优先搜索【Python实现】
1. BFS 算法框架 BFS:用来搜索 最短路径 比较合适,如:求二叉树最小深度、最少步数、最少交换次数,一般与 队列 搭配使用,空间复杂度比 DFS 大很多DFS:适合搜索全部的解,如:寻找最短…...
Hadoop01【尚硅谷】
大数据学习笔记 大数据概念 大数据:指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 主要解决,海量数据的存储…...
Echarts 配置横轴竖轴指示线,更换颜色、线型和大小
第018个点击查看专栏目录本示例是描述如何在Echarts上配置横轴竖轴指示线,更换颜色、线型和大小。方法很简单,参考示例源代码。 文章目录示例效果示例源代码(共85行)相关资料参考专栏介绍示例效果 示例源代码(共85行&a…...
OpenAI 官方API Java版SDK,两行代码即可调用。包含GhatGPT问答接口。
声明:这是一个非官方的社区维护的库。 已经支持OpenAI官方的全部api,有bug欢迎朋友们指出,互相学习。 注意:由于这个接口: https://platform.openai.com/docs/api-reference/files/retrieve-content 免费用户无法使…...
SpringBoot 日志文件
(一)日志文件有什么用?除了发现和定位问题之外,我们还可以通过日志实现以下功能:记录用户登录日志,以便分析用户是正常登录还是恶意破解用户。记录系统的操作日志,以便数据恢复和定位操作 。记录程序的执行时间&#x…...
SQL71 检索供应商名称
描述Vendors表有字段供应商名称(vend_name)、供应商国家(vend_country)、供应商州(vend_state)vend_namevend_countryvend_stateappleUSACAvivoCNAshenzhenhuaweiCNAxian【问题】编写 SQL 语句,…...
02:入门篇 - 漫谈 CTK
作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 十万个为什么 五千个在哪里?七千个怎么办?十万个为什么?。。。生活中,有很多奥秘在等着我们去思考、揭示! 同样地,在使用 CTK 时,很多小伙伴一定也存在诸多疑问: 为什么 CTK Plugin Framework 要借…...
SpringBoot常用注解
SpringBootApplication注解包含如下三个SpringBootConfigurationEnableAutoConfigurationComponentScanSpringBootConfiguration等同于Configuration,是属于spring的一个配置类这里的 Configuration 对我们来说并不陌生,它就是 JavaConfig 形式的 Spring…...
RBAC权限模型
什么是RBAC权限模型? RBAC是基于角色的访问控制,在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。 1.0级 用户、角色、权限 2.0 权限分级 公司>部门>小组 2.1 权限继承 ps: 这个人是一个小组长…...
【郭东白架构课 模块一:生存法则】07|法则三:架构师如何找到自己的商业模式?
你好,我是郭东白,今天我们来聊聊架构活动中对商业价值的考量。 今天我们要讲的是架构师的第三个生存法则:作为一个架构师,必须要在有限的资源下最大化架构活动所带来的商业价值。对于任何一个架构活动而言,架构师的可…...
STM32 - 看门狗
独立看门狗 IWDG专业时钟LSI 低功耗仍可以运行对定时的控制比较松喂狗这些时间是按照40kHz时钟给出。实际上,MCU内部的RC频率会在30kHz到60kHz之间变化。此外,即使RC振荡器的频率是精确的,确切的时序仍然依赖于APB接口时钟与RC振荡器时钟之间…...
Redis集群搭建
一、哨兵模式 在 redis3.0之前,redis使用的哨兵架构,它借助 sentinel 工具来监控 master 节点的状态;如果 master 节点异常,则会做主从切换,将一台 slave 作为 master。 哨兵模式的缺点: (1&…...
车载基础软件——AUTOSAR AP典型应用案例
我是穿拖鞋的汉子,魔都中一位坚持长期主义的工程师! 最近不知道为何特别喜欢苏轼的一首词: 缺月挂疏桐,漏断人初静。谁见幽人独往来,缥缈孤鸿影。 惊起却回头,有恨无人省。拣尽寒枝不肯栖,寂寞…...
消息中间件----内存数据库 Redis7(第3章 Redis 命令)
Redis 根据命令所操作对象的不同,可以分为三大类:对 Redis 进行基础性操作的命令,对 Key 的操作命令,对 Value 的操作命令。3.1 Redis 基本命令首先通过 redis-cli 命令进入到 Redis 命令行客户端,然后再运行下面的命令…...
react-03-react-router-dom-路由
react-router-dom:react路由 印记中文:react-router-dom 1、路由原理 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>前端路由的基石_history</title> </head> <body><a hre…...
2自由度悬架LQR控制
目录 1 悬架系统 1.1 悬架结构示意图 1.2 悬架数学模型 1.3 路面激励 2.仿真分析 2.1simulink模型 2.2 仿真结果 2.3 结论 3. 总结 1 悬架系统 1.1 悬架结构示意图 1.2 悬架数学模型 其中:x1为悬架动扰度,x2为车身加速度,x3为轮胎…...
C语言返回类型为指针的一些经典题目(下)
续上一篇文章,上一篇文章题目都很经典,这一篇也不例外。一.返回类型为指针经典题目(下)1.代码(第六题)char *GetMemory3(int num) {char *p (char *)malloc(sizeof(char) * num);return p; } void Test3(void) {char *str NULL;str GetMemory3(100…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...
小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
PydanticAI快速入门示例
参考链接:https://ai.pydantic.dev/#why-use-pydanticai 示例代码 from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider# 配置使用阿里云通义千问模型 model OpenAIMode…...
