特别低 ros_基于ROS的移动机器人上层系统架构分析

特别低 ros_基于ROS的移动机器人上层系统架构分析_第1张图片

看过网上不少博客,介绍ROS系统架构的,基本上都是在介绍ROS自身系统架构,很少有介绍特定机器人的系统架构的。个人觉得,入门一个系统,首先需要从整体开始把握,而不必在意细节,整体把握好了,细节自然水到渠成。因此,本文以当下火热的移动机器人为载体,介绍移动机器人上层ROS系统架构,当然了,该架构也是参考了ROS BY EXAMPLE中Turtlebot,该书是个很适合入门的书,有空可以看看。

图是最容易说明问题的,一张清晰的架构图,能够让你少走很多弯路,看了下面这张架构图,你就大概能知道,一个激光SLAM的移动机器人系统,究竟需要哪些模块,而这些模块之间的关系又是什么,使用哪些Topic进行交互。下面的架构图中都是核心模块,有时间每一个模块都需要去熟悉和学习。

特别低 ros_基于ROS的移动机器人上层系统架构分析_第2张图片

ROS作为一个分布式架构,特点是低耦合,你可以随意的添加和删除模块,特别方便开发,但这种架构最大的问题是什么呢,进程交互速度慢,具有一定的延时,因此,这也是ROS饱受诟病的问题。

移动机器人ROS架构里面最核心的部分,自然是建图、定位和路径规划,分别对应着图中的Gmapping、AMCL和Move_base。建图算法,在室内移动机器人中, gmapping必须拥有姓名。为什么这里画成虚线呢,因为建图不是每次都需要的,一次就可以了,无论你采用什么方法,只要环境变化不大,建出一张图,你就可以一直使用。以后,只需要启动AMCL算法,根据此地图,即可实现移动机器人的定位。AMCL采用粒子滤波,融合激光雷达话题/scan和下面提到的odom坐标系到base_link坐标系的变换,主要向tf树发布base_link坐标系到map坐标系的坐标变换。

这里重点说说robot_pose_ekf节点,该节点通过扩展卡尔曼滤波器,融合/odom、/imu_data和/vo话题,实现更为精确的里程计先验,发布odom坐标系到base_link坐标系的变换。在我们自身的实际机器人架构中,/odom话题指四轮麦克纳轮解算出的里程计数据,没有采用视觉里程计,而是采用了测量轮加惯导生成的里程计数据代替/VO话题。大家一定要区分odom坐标系和/odom话题,这是两个概念,前者是坐标系,后者是根据编码器(或者视觉等)计算的里程计。

下图清晰的表明了这一关系,/map到/odom的坐标变换为里程计的漂移,也就是说系统刚启动的时候里程计漂移为0,/map坐标系和/odom坐标系重合,而后来随着机器人的不断移动漂移越来越大,因为里程计是相对定位,具有累积误差。

特别低 ros_基于ROS的移动机器人上层系统架构分析_第3张图片

Robot_state_publisher节点,解析URDF模型,向tf坐标树发布机器人各模块之间的坐标变换,如激光雷达位置相对于base_link的坐标变换。该坐标变换一方面是为了各模块之间的坐标系转换,同时也是为了在RVIZ中显示。该URDF模型可以手动编写,更方便的是用solidworks建模完成后进行导出。

我们自身实现了一个Chassis_driver节点,该节点是需要自行编程并建立与下位机STM32之间的通信协议。该底层通信节点接收下位机的里程计数据并发布到话题/odom和/vo,同时接收move_base生成的速度,发送给下位机的STM32。

而底层STM32控制器实现了怎样的功能呢?其一,将上层传递的速度指令解析成四个轮子的转速,下发给四个驱动器;其二,接收四个麦克纳姆轮的编码器数据,解析成轮式里程计数据,传给Chassis_driver节点。至于麦克纳姆轮的正逆解,可以参考下面:麦克纳姆轮及其速度分解计算。

下面为我们实验室第一代自主搭建的机器人底盘以及跑出来的效果,可以看出机器人可以穿过房门并在走廊行驶。

特别低 ros_基于ROS的移动机器人上层系统架构分析_第4张图片

特别低 ros_基于ROS的移动机器人上层系统架构分析_第5张图片

特别低 ros_基于ROS的移动机器人上层系统架构分析_第6张图片

这是本人的第一篇博客,旨在让新手入门ROS移动机器人,熟悉移动机器人整体架构,各模块之间是如何协同工作的,未涉及到具体的实现细节,对应各个模块的具体实现,可以参考roswiki官方,或网上的各种比较细节的教程,如有不足,请多多包涵。本人几年前就想写博客,一开始是想着做旅游博主的,给大家提供旅游攻略,但是一直拖着未能实现,希望以后有机会能补上。另外,架构图是我已经毕业的谢师兄画的,在此表示对他的感谢。

你可能感兴趣的:(特别低,ros)