ROS 导航坐标系及条件说明(二十一)

本文详细介绍了ROS中的机器人导航模块,包括全局地图、自身定位、路径规划、运动控制和环境感知等关键组成部分。讲解了SLAM、amcl、move_base在导航中的作用,以及里程计和传感器在定位中的应用。同时,阐述了导航坐标系的特点和坐标变换,并提到了导航实现所需的硬件和软件条件。最后,强调了导航模块的安全、功能稳定性和高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

概述

概念 

作用 

导航模块简介 

概述 

1.全局地图

2.自身定位

3.路径规划

全局路径规划(gloable_planner)

本地时时规划(local_planner)

4.运动控制

5.环境感知

导航坐标系 

1.简介

2.特点

3.坐标系变换

 导航条件说明

1.硬件

2.软件


导航是机器人系统中最重要的模块之一,比如现在较为流行的服务型室内机器人,就是依赖于机器人导航来实现室内自主移动的,本章主要就是介绍仿真环境下的导航实现,主要内容有:

  • 导航相关概念
  • 导航实现:机器人建图(SLAM)、地图服务、定位、路径规划....以可视化操作为主。
  • 导航消息:了解地图、里程计、雷达、摄像头等相关消息格式。

预期达成的学习目标:

  • 了解导航模块中的组成部分以及相关概念
  • 能够在仿真环境下独立完成机器人导航

概述

概念 

在ROS中机器人导航(Navigation)由多个功能包组合实现,ROS 中又称之为导航功能包集,关于导航模块,官方介绍如下:

一个二维导航堆栈,它接收来自里程计、传感器流和目标姿态的信息,并输出发送到移动底盘的安全速度命令。
 更通俗的讲: 导航其实就是机器人自主的从 A 点移动到 B 点的过程。

里程计: 机器人相对出发点坐标系的位姿状态(X 坐标 Y 坐标 Z坐标以及朝向)。

作用 

秉着"不重复发明轮子"的原则,ROS 中导航相关的功能包集为机器人导航提供了一套通用的实现,开发者不再需要关注于导航算法、硬件交互... 等偏复杂、偏底层的实现,这些实现都由更专业的研发人员管理、迭代和维护,开发者可以更专注于上层功能,而对于导航功能的调用,只需要根据自身机器人相关参数合理设置各模块的配置文件即可,当然,如果有必要,也可以基于现有的功能包二次开发实现一些定制化需求,这样可以大大提高研发效率,缩短产品落地时间。总而言之,对于一般开发者而言,ROS 的导航功能包集优势如下:

  • 安全: 由专业团队开发和维护

  • 功能: 功能更稳定且全面

  • 高效: 解放开发者,让开发者更专注于上层功能实现

导航模块简介 

概述 

 机器人是如何实现导航的呢?或换言之,机器人是如何从 A 点移动到 B 点呢?ROS 官方为了提供了一张导航功能包集的图示,该图中囊括了 ROS 导航的一些关键技术:

 

 

假定我们已经以特定方式配置机器人,导航功能包集将使其可以运动。上图概述了这种配置方式。白色的部分是必须且已实现的组件,灰色的部分是可选且已实现的组件,蓝色的部分是必须为每一个机器人平台创建的组件。

总结下来,涉及的关键技术有如下五点:

  1. 全局地图

  2. 自身定位

  3. 路径规划

  4. 运动控制

  5. 环境感知

机器人导航实现与无人驾驶类似,关键技术也是由上述五点组成,只是无人驾驶是基于室外的,而我们当前介绍的机器人导航更多是基于室内的。

 

 

 

1.全局地图

在现实生活中,当我们需要实现导航时,可能会首先参考一张全局性质的地图,然后根据地图来确定自身的位置、目的地位置,并且也会根据地图显示来规划一条大致的路线.... 对于机器人导航而言,也是如此,在机器人导航中地图是一个重要的组成元素,当然如果要使用地图,首先需要绘制地图。关于地图建模技术不断涌现,这其中有一门称之为 SLAM 的理论脱颖而出:

  1. SLAM(simultaneous localization and mapping),也称为CML (Concurrent Mapping and Localization), 即时定位与地图构建,或并发建图与定位。SLAM问题可以描述为: 机器人在未知环境中从一个未知位置开始移动,在移动过程中根据位置估计和地图进行自身定位,同时在自身定位的基础上建造增量式地图,以绘制出外部环境的完全地图。

  2. 在 ROS 中,较为常用的 SLAM 实现也比较多,比如: gmapping、hector_slam、cartographer、rgbdslam、ORB_SLAM ....

  3. 当然如果要完成 SLAM ,机器人必须要具备感知外界环境的能力,尤其是要具备获取周围环境深度信息的能力。感知的实现需要依赖于传感器,比如: 激光雷达、摄像头、RGB-D摄像头...

  4. SLAM 可以用于地图生成,而生成的地图还需要被保存以待后续使用,在 ROS 中保存地图的功能包是 map_server

另外注意: SLAM 虽然是机器人导航的重要技术之一,但是 二者并不等价,确切的讲,SLAM 只是实现地图构建和即时定位。

2.自身定位

导航伊始和导航过程中,机器人都需要确定当前自身的位置,如果在室外,那么 GPS 是一个不错的选择,而如果室内、隧道、地下或一些特殊的屏蔽 GPS 信号的区域,由于 GPS 信号弱化甚至完全不可用,那么就必须另辟蹊径了,比如前面的 SLAM 就可以实现自身定位,除此之外,ROS 中还提供了一个用于定位的功能包: amcl

amcl(adaptiveMonteCarloLocalization)自适应的蒙特卡洛定位,是用于2D移动机器人的概率定位系统。它实现了自适应(或KLD采样)蒙特卡洛定位方法,该方法使用粒子过滤器根据已知地图跟踪机器人的姿态。

3.路径规划

导航就是机器人从A点运动至B点的过程,在这一过程中,机器人需要根据目标位置计算全局运动路线,并且在运动过程中,还需要时时根据出现的一些动态障碍物调整运动路线,直至到达目标点,该过程就称之为路径规划。在 ROS 中提供了 move_base 包来实现路径规则,该功能包主要由两大规划器组成:

  1. 全局路径规划(gloable_planner)

    根据给定的目标点和全局地图实现总体的路径规划,使用 Dijkstra 或 A* 算法进行全局路径规划,计算最优路线,作为全局路线

  2. 本地时时规划(local_planner)

    在实际导航过程中,机器人可能无法按照给定的全局最优路线运行,比如:机器人在运行中,可能会随时出现一定的障碍物... 本地规划的作用就是使用一定算法(Dynamic Window Approaches) 来实现障碍物的规避,并选取当前最优路径以尽量符合全局最优路径

全局路径规划与本地路径规划是相对的,全局路径规划侧重于全局、宏观实现,而本地路径规划侧重与当前、微观实现。

4.运动控制

导航功能包集假定它可以通过话题"cmd_vel"发布geometry_msgs/Twist类型的消息,这个消息基于机器人的基座坐标系,它传递的是运动命令。这意味着必须有一个节点订阅"cmd_vel"话题, 将该话题上的速度命令转换为电机命令并发送。

5.环境感知

感知周围环境信息,比如: 摄像头、激光雷达、编码器...,摄像头、激光雷达可以用于感知外界环境的深度信息,编码器可以感知电机的转速信息,进而可以获取速度信息并生成里程计信息。

在导航功能包集中,环境感知也是一重要模块实现,它为其他模块提供了支持。其他模块诸如: SLAM、amcl、move_base 都需要依赖于环境感知。

导航坐标系 

1.简介

定位是导航中的重要实现之一,所谓定位,就是参考某个坐标系(比如:以机器人的出发点为原点创建坐标系)在该坐标系中标注机器人。定位原理看似简单,但是这个这个坐标系不是客观存在的,我们也无法以上帝视角确定机器人的位姿,定位实现需要依赖于机器人自身,机器人需要逆向推导参考系原点并计算坐标系相对关系,该过程实现常用方式有两种:

  • 通过里程计定位:时时收集机器人的速度信息计算并发布机器人坐标系与父级参考系的相对关系。
  • 通过传感器定位:通过传感器收集外界环境信息通过匹配计算并发布机器人坐标系与父级参考系的相对关系。

两种方式在导航中都会经常使用。

 

 

2.特点

两种定位方式都有各自的优缺点。

里程计定位:

  • 优点:里程计定位信息是连续的,没有离散的跳跃。
  • 缺点:里程计存在累计误差,不利于长距离或长期定位。

传感器定位:

  • 优点:比里程计定位更精准;
  • 缺点:传感器定位会出现跳变的情况,且传感器定位在标志物较少(匹配特征难)的环境下,其定位精度会大打折扣。(或者说有两个相似特征点环境可能出现极大误差)

两种定位方式优缺点互补,应用时一般二者结合使用。

3.坐标系变换

上述两种定位实现中,机器人坐标系一般使用机器人模型中的根坐标系(base_link 或 base_footprint).

里程计定位时,父级坐标系一般称之为 odom,

如果通过传感器定位,父级参考系一般称之为 map。

当二者结合使用时,map 和 odom 都是机器人模型根坐标系的父级,这是不符合坐标变换中"单继承"的原则(坐标系中只有一个父级)的,所以,一般会将转换关系设置为: map -> odom -> base_link 或 base_footprint。(设置map为父级

 

 导航条件说明

 

1.硬件

虽然导航功能包集被设计成尽可能的通用,在使用时仍然有三个主要的硬件限制:

  1. 它是为差速驱动的轮式机器人设计的。它假设底盘受到理想的运动命令的控制并可实现预期的结果,命令的格式为:x速度分量,y速度分量,角速度(theta)分量。

  2. 它需要在底盘上安装一个单线激光雷达。这个激光雷达用于构建地图和定位。

  3. 导航功能包集是为正方形的机器人开发的,所以方形或圆形的机器人将是性能最好的。 它也可以工作在任意形状和大小的机器人上,但是较大的机器人将很难通过狭窄的空间。

2.软件

导航功能实现之前,需要搭建一些软件环境:

  1. 毋庸置疑的,必须先要安装 ROS

  2. 当前导航基于仿真环境,先保证上一章的机器人系统仿真可以正常执行

    在仿真环境下,机器人可以正常接收 /cmd_vel 消息,并发布里程计消息,传感器消息发布也正常,也即导航模块中的运动控制和环境感知实现完毕

后续导航实现中,我们主要关注于: 使用 SLAM 绘制地图、地图服务、自身定位与路径规划。

### 关于ROS中机器人定位、导航和控制的概念及区别 #### 1. **机器人定位** 机器人的定位是指确定其在全球坐标系中的具体位置和姿态。这是机器人自主运行的基础之一。在ROS环境中,通常使用`amcl`(Adaptive Monte Carlo Localization)节点来完成这一任务[^2]。 `amcl`通过结合已知的地图数据以及来自激光雷达或其他传感器的数据,利用概率方法估计机器人在其环境中的当前位置。它主要依赖于粒子滤波器技术,在每次接收到新的传感器读数时更新机器人的可能位置分布。 为了实现精确的定位,除了上述提到的`amcl`外,还需要满足一些硬件条件,比如能够提供里程计信息的轮式编码器或者惯性测量单元(IMU),这些设备帮助估算机器人运动轨迹的变化情况。此外,高质量的距离探测装置也是不可或缺的一部分,它们能捕捉周围障碍物的位置从而辅助校正定位误差[^1]。 #### 2. **机器人导航** 导航指的是规划一条从起点到达目标点的安全路径,并指导机器人沿着这条路径前进的过程。这不仅涉及到静态路径计算还包含了动态避障策略的应用。 在ROS框架下,全局路径规划一般采用A*或Dijkstra等经典算法生成初步路线;而局部路径调整则更多依靠Teb Local Planner这样的模块实时响应突发状况下的转向需求。整个过程会综合考虑多种因素如地形特征、通行能力限制以及潜在碰撞风险等等。值得注意的是,良好的导航性能建立在可靠定位的基础上——只有当系统清楚知道自身所处的确切地点之后才能做出合理决策。 另外值得一提的是,对于复杂场景而言单靠预设指令难以应对所有可能出现的情况,因此现代移动平台往往还会配备视觉伺服控制系统或者其他高级感知手段进一步增强适应性和灵活性。 #### 3. **机器人控制** 控制环节负责将高层次的任务命令转化为具体的动作执行细节。例如设定速度参数、调节方向舵角度或是启动特定行为模式等功能都属于此范畴之内。就ROS生态系统来说存在众多专门针对不同类型机械结构设计的动作控制器可供选用,像差分驱动型底盘常用的`diff_drive_controller`就是其中之一。 这类组件接收到来自上层应用传递过来的目标状态向量后经过内部运算得出实际电机驱动力矩大小进而推动物理实体按照预期方式运作起来。与此同时反馈机制同样扮演着重要角色因为它允许闭环修正过程中产生的偏差确保最终效果尽可能贴近理想模型预测结果。 ```python import rospy from geometry_msgs.msg import Twist def move_robot(): pub = rospy.Publisher('cmd_vel', Twist, queue_size=10) rospy.init_node('move_robot_node', anonymous=True) rate = rospy.Rate(10) # 10hz twist = Twist() twist.linear.x = 0.5; twist.angular.z = 0.2 while not rospy.is_shutdown(): pub.publish(twist) rate.sleep() if __name__ == '__main__': try: move_robot() except rospy.ROSInterruptException: pass ``` 以上代码片段展示了一个简单的例子说明如何发送速度命令给支持Twist消息类型的行动者接口以改变它的线性和角加速度属性值。 --- ### 总结对比表 | 特性 | 定位 | 导航 | 控制 | |------------|------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------| | 主要功能 | 确定机器人当前所在的具体地理位置及其朝向 | 制定通往目的地的有效可行路径 | 将抽象的操作意图转换成具体的机电操作 | | 使用工具/包| `amcl`, 航迹推算(DR), IMU | 全局路径规划(GP): A*, Dijkstra<br> 局部路径优化(LP): Teb Local Planner | 动作服务器(Action Server)<br>`ros_control`: diff_drive_controller | | 数据输入源 | 地图(Maps), 激光扫描(Laser Scans), 编码器(Odometry Data) | 预先构建好的地图文件(.pgm/.yaml), 实时传感数据 | 用户定义的速度矢量(Speed Vectors), 外界干扰信号 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值