ROS理论与实践学习笔记——6 ROS机器人导航(仿真)

        在 ROS 中,机器人导航(Navigation)是由多个功能包组合而成的系统,统称为导航功能包集(navigation stack)。它提供了一个全面的框架,使得移动机器人能够自主导航到指定目标点,同时避开环境中的障碍物。

        导航功能包集:该导航系统基于多个核心功能包,包括地图构建、定位、路径规划和运动控制等模块。这些功能包通过整合,协同处理机器人感知的环境数据和导航任务需求,从而实现自主导航。

        二维导航堆栈:ROS 的二维导航堆栈(2D Navigation Stack)是该功能集的核心组件之一。它接收以下主要信息:

  • 里程计数据:提供机器人自身的位置和运动状态信息。
  • 传感器数据流:包括来自激光雷达(LiDAR)、深度摄像头、Kinect 或其他传感器的数据,帮助机器人感知周围的环境并检测障碍物。
  • 目标姿态:用户通过 RViz 或其他接口为机器人设置的目标位置和方向(2D平面上的目标点)。

        基于这些输入,导航堆栈的路径规划模块会计算从当前位置到目标点的最优路径,并结合局部路径规划,在导航过程中避开障碍物。

1.1 导航模块简介

(1)全局地图(定位 + 路径规划)

        在现实生活中,当我们进行导航时,通常会首先参考一张全局地图,依据这张地图确定自己和目标的位置,并据此规划出一条合理的路线。同样地,对于机器人导航,地图也是其核心组成部分之一。机器人通过地图确定其在环境中的位置,并根据目标位置规划路径。为此,首先需要对环境进行建图。在机器人导航领域,随着技术的不断发展,出现了许多先进的地图建模方法,其中SLAM 技术尤其引人瞩目。

        SLAM(Simultaneous Localization and Mapping,即同步定位与地图构建),也被称为 CML(Concurrent Mapping and Localization, 并发建图与定位),它是一种能够让机器人在未知环境中从未知位置开始导航的技术。SLAM 的问题可以描述为:机器人在未知环境中,通过自身运动,根据传感器数据估计自己的位置,并同时构建环境的地图。在这一过程中,SLAM 通过不断迭代,逐步完善机器人的位置估计和环境地图,最终绘制出整个环境的完整地图。

SLAM 的核心工作

  1. 定位(Localization):机器人需要根据传感器数据和已知的地图或部分地图确定自身的具体位置。随着机器人在环境中移动,定位模块持续更新位姿信息。
  2. 建图(Mapping):机器人基于传感器数据同时构建环境的地图,通常是增量式的。在机器人更新自己位置的同时,它会在当前已知位置上逐步更新环境的地图信息。 

ROS 中的 SLAM 实现: 在 ROS 中,已有多种实现 SLAM 的功能包,常用的包括:

  • gmapping:基于粒子滤波的 2D SLAM 实现,适合激光雷达等传感器的应用。
  • hector_slam:无需里程计数据,通过激光雷达构建高精度 2D 地图。
  • cartographer:Google 开源的 2D/3D SLAM 框架,支持多传感器融合,效果稳定。
  • rgbdslam:利用 RGB-D 摄像头(如 Kinect)进行 3D 地图构建。
  • ORB-SLAM:基于视觉的 SLAM 系统,适合使用摄像头或立体相机。

        无论使用哪种 SLAM 实现,机器人必须具备对周围环境的感知能力,尤其是获取深度信息的能力。实现感知通常依赖于以下传感器:

  • 激光雷达(LiDAR):可以高精度扫描周围环境,生成二维或三维的深度数据。
  • RGB-D 摄像头:如 Kinect,能够同时获取彩色图像和深度信息。
  • 普通摄像头:用于视觉 SLAM,通过图像特征匹配来定位和建图。

        SLAM 的地图生成与保存: SLAM 技术用于动态生成环境地图,而生成的地图需要保存以供后续使用。在 ROS 中,map_server 是常用的功能包,用于保存和加载地图数据。它可以将 SLAM 生成的地图保存为图片格式(如 .pgm 文件),并通过 .yaml 文件提供地图的元数据(如分辨率、原点等)。保存后的地图可以用于后续的导航或路径规划任务。 

注意事项: 虽然 SLAM 是机器人导航的重要组成部分,但它与导航并不完全等同。SLAM 的作用主要是为机器人提供地图构建和即时定位功能,而导航系统则包括更多内容,如全局路径规划、局部避障等。SLAM 提供了机器人进行导航所需的地图和定位信息,但导航系统还需要综合其他模块来实现机器人从起点到目标点的自主运动。

(2)自身定位

        在导航的起始阶段以及导航过程中的每一时刻,机器人都需要准确确定自身在环境中的位置。定位是导航的核心环节之一。如果机器人处于室外,使用 GPS 是一种便捷且有效的选择。然而,在室内、隧道、地下空间或其他屏蔽 GPS 信号的区域,GPS 信号变得微弱甚至完全不可用,因此需要使用其他技术进行定位。在这些环境中,SLAM(同步定位与地图构建)可以用于实现机器人自身的定位和地图构建。

        此外,ROS 中提供了一个专门用于定位的功能包:amcl

        amcl(Adaptive Monte Carlo Localization)——自适应蒙特卡洛定位,是一种基于概率的方法,专门用于 2D 移动机器人的定位。它通过已知的地图和传感器数据来跟踪和估计机器人在地图中的位姿。amcl 使用粒子滤波器对机器人进行姿态跟踪,自适应采样(KLD 采样)机制动态调整粒子的数量,以提高计算效率和精度。amcl 的优点是能够在存在噪声的传感器数据下稳健地实现机器人定位。

(3)路径规划(全局 + 本地路径规划)

        路径规划是导航中的关键步骤之一,它涉及如何让机器人从 A 点顺利到达 B 点。在此过程中,机器人需要根据全局地图规划出从起点到目标点的全局路线。同时,在导航过程中,还需要实时根据传感器反馈的环境变化(如出现的动态障碍物)调整当前的路线,避免碰撞并确保机器人到达目标位置。

        在 ROS 中,路径规划功能主要由 move_base 包实现。它包含两个重要的规划器:

  • 全局路径规划(global planner): 全局路径规划器根据机器人所在的位置、目标位置以及全局地图,计算一条从起点到目标点的最优路径。这通常使用 Dijkstra 或 A* 算法,它们通过对全局地图的遍历和权重计算来找到通往目标的最短路径。全局规划器生成的是一个宏观的全局路线,用于引导机器人朝目标移动。

  • 本地路径规划(local planner): 在实际导航过程中,机器人可能会遇到未预见的障碍物,或者由于环境的变化无法沿全局最优路线前行。这时,本地路径规划器发挥作用。它基于机器人当前的位姿和周围环境,实时调整行进路线,通常使用动态窗口法(DWA,Dynamic Window Approaches)等算法进行局部避障,并在确保安全的前提下尽量保持与全局规划路线一致。

        全局路径规划侧重于宏观的路线设计,而本地路径规划则侧重于微观的实时调整,两者结合能确保机器人既能朝着目标前进,又能灵活应对动态环境中的变化。

(4)运动控制(速度 + 方向)

        在导航系统中,最终的输出是运动指令,这些指令告诉机器人以什么样的速度和方向运动。ROS 导航功能包集假定控制系统可以通过一个名为 /cmd_vel 的话题发布速度指令。

  • cmd_vel 是 ROS 中标准的话题,发布的消息类型为 geometry_msgs/Twist,该消息包含两个部分:
    1. 线速度(linear velocity):表示机器人沿各轴(通常是 x 轴)方向的移动速度。
    2. 角速度(angular velocity):表示机器人绕 z 轴的旋转速度。

        这些速度指令是基于机器人自身的基座坐标系(base_link)生成的,机器人需要通过订阅 /cmd_vel 话题,将发布的速度命令转化为实际电机的控制指令,并执行相应的移动或旋转。这部分通常由机器人的底盘控制器来完成。

(5)环境感知(传感器)

        机器人导航离不开对环境的感知。环境感知系统通过多种传感器获取周围环境的实时数据,包括深度信息、速度信息等。这些信息为机器人定位、路径规划和避障提供了基础数据支持。

常用的传感器包括:

  • 激光雷达(LiDAR):用于精确扫描周围环境的深度信息,生成点云数据,帮助机器人感知障碍物和空间的形状。
  • 摄像头:用于获取环境的视觉信息,通常结合图像处理算法,用于 SLAM 或目标识别。
  • RGB-D 摄像头:如 Kinect,既能获取彩色图像,又能提供深度信息,广泛应用于 3D SLAM。
  • 编码器:用于测量电机的转速和机器人轮子的转动情况,生成**里程计(odometry)**信息。这对于定位和运动控制至关重要。

        在导航功能包集中,环境感知模块是整个系统的基础模块之一。它为 SLAM、AMCL、move_base 等模块提供必要的环境数据,支持定位、建图和路径规划功能。不同传感器的数据在导航过程中通过传感器融合技术整合,提升机器人对复杂环境的感知能力,从而实现更加精准的导航。

1.2 导航之坐标系

(1)简介

        定位是导航中的核心环节之一,其目的是确定机器人在某个参考坐标系中的位置和姿态。所谓定位,指的是在特定的参考坐标系中标定机器人的位置。比如,可以通过在机器人启动时设置一个参考点(如出发点),并以此为原点建立坐标系,然后通过该坐标系标注机器人的位置和姿态。

        虽然定位的原理看似简单,但该参考坐标系并不是客观存在的。我们无法通过外部的上帝视角直接确定机器人的位姿,而是需要机器人通过自身感知,推导出参考系的原点并计算坐标系间的相对关系。实现这一过程常用的两种方式是:

  • 里程计定位:通过实时收集机器人的速度信息来计算位置。基于速度信息和时间推导出机器人相对于父级参考系的位姿(位置和方向),并发布机器人在该参考系下的位置关系。

  • 传感器定位:通过传感器(如激光雷达或摄像头)收集环境信息,通过匹配外部环境与已知地图来计算机器人相对于父级参考系的位置,并发布其坐标关系。

(2)特点

  • 里程计定位

    • 优点:里程计定位基于速度信息推导位置,因此位置信息是连续的,没有离散的跳跃,数据平滑且稳定。
    • 缺点:由于每一次的位置估计都基于前一时刻的位置,里程计定位会产生累计误差(随着时间推移误差会逐渐增加),不适合长时间或长距离的定位任务。
  • 传感器定位

    • 优点:传感器定位通过直接匹配环境特征进行定位,通常比里程计定位更加精准,可以有效避免累计误差。
    • 缺点:传感器定位会受到环境条件的影响,可能出现跳变(位置突然跳动)的情况。此外,在标志物较少或环境特征不明显的场景下,传感器定位的精度会大幅下降,可能导致误差增大或无法进行有效定位。

        结合使用:由于两种定位方式各有优缺点,常见的做法是将里程计定位与传感器定位结合使用。通过里程计定位实现连续的位置估计,而传感器定位则用于修正里程计误差,确保长时间和复杂环境中的精确定位。

(3)坐标系变换

        在导航系统中,机器人使用多个坐标系来描述位置和运动。一般来说,机器人自身的坐标系为根坐标系,通常称为 base_linkbase_footprint,这是机器人运动控制和感知的参考坐标系。

  • 里程计定位:基于速度推导位置,父级坐标系通常称为 odomodom 坐标系描述了机器人相对于起始点(通常为机器人启动时的位置)的相对位移和旋转。

  • 传感器定位:基于传感器的环境信息匹配,父级坐标系通常为 mapmap 坐标系用于描述机器人在已知地图中的绝对位置。

        当里程计定位和传感器定位结合使用时,通常会同时使用 mapodom 两个父级坐标系。为了遵循坐标系变换的“单继承”原则,即每个坐标系只能有一个直接父级,ROS 导航中采用了以下坐标系转换结构:

map -> odom -> base_link 或 map -> odom -> base_footprint

        这种层级结构表明:

        map -> odom:传感器定位修正了里程计定位中的误差,提供了机器人在全局地图中的位姿信息。

        odom -> base_link:里程计定位提供机器人在局部的精确位姿,通过时间推导出机器人相对于初始位置的变化。

        这种转换关系确保了导航过程中,机器人能够通过 odom 实现局部定位和连续运动控制,同时通过 map 修正全局误差,提升整体定位精度。

1.3 导航条件说明

(1)硬件条件(三个主要的硬件限制)

  • 差速驱动的轮式机器人:ROS 导航功能包集是为差速驱动的轮式机器人设计的。它假设机器人的底盘能够精确执行理想的运动命令,并能够实现预期的运动结果。具体的命令格式包括:

    • x 轴速度分量(向前或向后移动)
    • y 轴速度分量(通常在差速驱动下为零,因为机器人不具备侧向移动能力)
    • 角速度(theta)分量(绕 z 轴的旋转速度)

        在导航过程中,这些运动命令通过 /cmd_vel 话题发布,机器人需要能够根据这些命令控制自身的运动,执行路径规划和避障任务。 

  • 激光雷达(LiDAR):导航系统要求机器人装备一个单线激光雷达,通常安装在底盘上。激光雷达负责扫描周围环境,生成二维的点云数据。这些数据用于环境感知,帮助机器人实时构建地图(如在 SLAM 中)以及在定位过程中确定其在地图中的位置。激光雷达数据也是机器人避障和路径调整的关键信息来源。

  • 机器人底盘形状和尺寸:ROS 的导航功能包集最初是为方形机器人设计的,因此方形或圆形的机器人可以获得最佳的导航性能。这是因为这些形状的机器人在移动和旋转时能够更好地适应导航中的几何计算。虽然导航系统可以兼容任意形状和大小的机器人,但对于较大的机器人,尤其是那些形状复杂或体积较大的机器人,它们可能会在狭窄空间中难以移动,导致导航性能下降。因此,机器人在设计时需要考虑其形状和尺寸,确保其在目标环境中能够高效导航。

(2)软件条件

  • 安装 ROS:要使用 ROS 导航功能包集,首先需要在机器人或仿真环境中安装 ROS 以及相关的软件包。导航系统依赖于多个核心软件包(如 move_baseamclmap_server),这些软件包必须在系统中正确配置和运行。

  • 基于仿真环境的测试:当前导航系统可以在仿真环境中测试,如使用 Gazebo 等仿真平台。在仿真环境中,机器人能够正常接收和处理 /cmd_vel(运动控制命令)消息,并可以发布以下关键信息:

    • 里程计(Odometry)消息:由机器人的运动系统(如轮子编码器)生成,提供机器人相对位移和速度信息。通过里程计数据,导航系统能够跟踪机器人位置并计算运动轨迹。
    • 传感器消息:激光雷达、摄像头或其他传感器的数据被实时发布,用于构建环境地图、识别障碍物,并提供避障和路径规划支持。

        在仿真环境下,导航功能中的运动控制环境感知模块已经可以成功运行。这意味着机器人可以通过接收速度命令调整运动路径,并利用传感器数据感知周围环境,完成定位、地图构建和路径规划等任务。

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

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

相关文章

分析调优、性能测试曲线图

目录 一、分析调优 性能测试分析的关键指标 分析步骤 收集数据: 找到瓶颈: 性能调优策略 调优硬件资源: 数据库调优: 持续监控和改进 二、性能测试曲线图 1. 轻负载阶段(Light Load) 2. 重负载…

非淘系阿里231滑块 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间头像私信联系我删…

Leetcode—1188. 设计有限阻塞队列【中等】(多线程)

2024每日刷题(183) Leetcode—1188. 设计有限阻塞队列 C实现代码 class BoundedBlockingQueue { public:BoundedBlockingQueue(int capacity) {sem_init(&enSem, 0, capacity);sem_init(&deSem, 0, 0);}~BoundedBlockingQueue() {sem_destroy(…

WordPress 禁用上传媒体图片自动生成缩略图及多尺寸图片教程

一、在 设置-媒体-媒体设置 中几个尺寸大小的设置不勾选或设置为 0&#xff0c;如下图&#xff1a; 二、找到主题文件 function.php 文件&#xff0c;打开后&#xff0c;在 <?php 后面添加如下代码&#xff1a; function.php 文件路径一般为&#xff1a;WordPress网站根目录…

Nginx - 实现 TCP/DUP流量的按 IP 动态转发

文章目录 需求背景需求目标&#xff1a;使用场景&#xff1a;成功标准&#xff1a;技术要求&#xff1a; Ng配置测试验证 需求 Nginx Stream TCP 协议按 IP 转发 背景 为了优化网络性能和提升服务的可用性&#xff0c;我们需要在 Nginx 中配置 stream 模块&#xff0c;使其根…

力扣题解(鸡蛋掉落)

887. 鸡蛋掉落 已解答 困难 相关标签 相关企业 给你 k 枚相同的鸡蛋&#xff0c;并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。 已知存在楼层 f &#xff0c;满足 0 < f < n &#xff0c;任何从 高于 f 的楼层落下的鸡蛋都会碎&#xff0c;从 f 楼层或比它…

字节 HLLM 论文阅读

github连接&#xff1a;https://github.com/bytedance/HLLM 探讨问题&#xff1a; 推荐LLM的三个关键问题&#xff1a; LLM预训练权重通常被认为是对世界知识的概括&#xff0c;其对于推荐系统的价值&#xff1f;对推荐任务进行微调的必要性&#xff1f;LLM是否可以在推荐系统…

如何分离人声和背景音乐?精准音频分离,提升你的作品质量

在音频编辑和处理的领域中&#xff0c;分离人声和背景音乐是一项颇具挑战的任务&#xff0c;但也是众多音频爱好者和专业人士经常面临的需求。无论是为了制作卡拉OK伴奏、提升视频制作质量&#xff0c;还是进行音乐分析和研究&#xff0c;掌握人声与背景音乐的分离技术都显得至…

Winform和WPF的技术对比

WinForms&#xff08;Windows Forms&#xff09;和WPF&#xff08;Windows Presentation Foundation&#xff09;是用于创建桌面应用程序的两种技术。尽管两者都可以用于开发功能强大的Windows应用程序&#xff0c;但它们的设计理念、功能和开发体验都有显著区别。在本文中&…

如何将csdn文章导出为pdf

前言 在csdn上浏览文章的时候我发现有的文章支持pdf导出&#xff0c;但是有的文章不支持pdf导出&#xff0c;为了解决能将csdn上所有文章都能以pdf格式导出遂作此文。 正文 先上代码&#xff1a; (function(){use strict;var contentBox $("div.article_content")…

05 P1157 组合的输出

题目&#xff1a; 代码&#xff1a; #include<iostream> using namespace std; # define M 500 #include<algorithm>int sa[100005],k,n,count1;bool func(int n) {int mark0;if(n1){return 1;}else{for(int i2;i<n-1;i){if(n%i0){mark1;return 0;}}if(mark0)r…

力扣困难题汇总(13道)

题4&#xff08;困难&#xff09;&#xff1a; 思路&#xff1a; 找两数组中位数&#xff0c;这个看起来简单&#xff0c;顺手反应就是数第(mn)/2个&#xff0c;这个难在要求时间复杂度为log(mn)&#xff0c;所以不能这样搞&#xff0c;我的思路是&#xff1a;每次切割长度为较…

国家计算机二级MSOffice计算机选择题题库汇总精选

计算机二级选择题题目&#xff08;带答案&#xff09; 下列关于栈和队列的描述中&#xff0c;正确的是() 栈是先进先出队列是先进后出队列允许在队友删除元素栈在栈顶删除元素 答案&#xff1a;D 解析&#xff1a;栈实际也是线性表&#xff0c;只不过是一种特殊的线性表…

【C# 网络编程】基本概念

基本概念 OSI模型 背景&#xff1a; 为了统一和兼容不同计算机厂商的网络体系结构概念&#xff0c;国际标准化组织&#xff08;ISO&#xff09;在1979年提出了OSI参考模型&#xff08;Open System Interconnection&#xff0c;&#xff09; 结构 物理层&#xff08;Physica…

poi通过在word中写入了表格,通过libreoffice转换成PDF后,word中刚才画的表格宽度无限拉伸问题的解决。

一、复现&#xff1a; poi版本&#xff1a; <poi>3.17</poi><poi-ooxml>3.17</poi-ooxml><poi-ooxml-schemas>3.17</poi-ooxml-schemas><dependency><groupId>org.apache.poi</groupId><artifactId>poi</arti…

MySQL增删改进阶

目录 1.数据库约束 1.1约束类型 1.2 not null约束 1.3 unique&#xff1a;唯一约束 1.4 default&#xff1a;默认约束 1.5 primary key&#xff1a;主键约束 1.6 foreign key:外键约束 1.7 check约束&#xff08;了解&#xff09; 2.表的设计 3.新增&#xff08;进阶&…

论文阅读(十六):Deep Residual Learning for Image Recognition

文章目录 1.介绍2.基本原理3.两种残差块4.网络结构 论文&#xff1a;Deep Residual Learning for Image Recognition   论文链接&#xff1a;Deep Residual Learning for Image Recognition   代码链接&#xff1a;Github 1.介绍 在ResNet网络提出之前&#xff0c;传统的卷…

200Kg大载重多旋无人机价格高昂技术分析

200Kg大载重多旋无人机作为一种高度专业化的航空工具&#xff0c;其价格相较于普通无人机显著较高&#xff0c;这主要是由于其在技术设计和生产过程中所需的高要求所致。以下是对其价格高昂的技术分析&#xff1a; 一、高性能材料与结构设计 1. 高强度轻量化材料&#xff1a;…

D41【python 接口自动化学习】- python基础之函数

day41 函数参数传递错误 学习日期&#xff1a;20241018 学习目标&#xff1a;函数&#xfe63;-54 避坑指南&#xff1a;列表作为参数传递出错了怎么办&#xff1f; 学习笔记&#xff1a; 列表类型的特殊性 list1[x,y,z] tuple1(list1,b,c)# 修改元组中的列表&#xff0c;会…

树莓派4B-高精度驱动步进电机

项目介绍 利用4B树莓派控制步进电机转动&#xff0c;精度可达&#xff1a;0.0144度 (即360度/25000) 适用于非常精密的角度转动。 舵机的精度为1度&#xff0c;无法实现超高精度控制。 硬件需求 硬件型号不同&#xff0c;只要功能相同&#xff0c;代码即可兼用。 树莓派CDKU- …