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…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
