此前使用的虚拟机是 VMware Workstation 15 Pro,但是使用起来不是特别方便,比如基本操作主机复制的内容无法黏贴到客户机(ubuntu)中。于是本次实验使用了VirtualBox 6.1.18虚拟机。
首先从官网下载 Ubuntu 的镜像文件,这里选择的版本是20.04.2.0,于是其对应安装的ros版本为Noetic Ninjemys(May 2020-May2025):然后,配置虚拟主机,关联下载好的Ubuntu 镜像文件。 接下来对ubuntu进行优化,按照网上操作(安装虚拟机工具、启动文件交换模式)方便虚拟机与宿主机的文件交换。
使用国内清华大学安装源,这样安装速度更快,Ctrl+Ail+T打开终端输入命令:
如图1.4.3所示,输入:
初步检测,应该是网络问题,于是直接重复调用更新与安装命令,最后成功。
在 noetic 最初发布时,和其他历史版本稍有差异的是:没有安装构建依赖这一步骤。随着 noetic 不断完善,官方补齐了这一操作。 首先安装构建依赖的相关工具,如图1.4.8所示 调用命令:
机器人参数如下,底盘为圆柱状,半径 10cm,高 8cm,四轮由两个驱动轮和两个万向支撑轮组成,两个驱动轮半径为 3.25cm,轮胎宽度1.5cm,两个万向轮为球状,半径 0.75cm,底盘离地间距为 1.5cm(与万向轮直径一致),并添加雷达传感器
直接加载(6)中编写的小车模型xacro文件; 使用命令:<node pkg="rviz" type="rviz" name="rviz" />启动rviz; 使用命令:<node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" output="screen" /><node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen" /> 启动机器人状态和关节状态发布节点; 使用命令:<node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" output="screen" /> 启动图形化的控制关节运动节点; (8) 检查urdf01_rviz功能包文件 按上述步骤完成后,urdf01_rviz功能包含文件夹及文件如图2.1.1所示。
仿真环境搭建比较简单,直接放置了给定圆柱体与正方体,因为自身电脑的原因,带动ros非常卡顿,所以对于仿真环境搭建比较简单。本人也尝试构建参考实例中的环境发现Gazebo无响应。
要实现机器人建图需要用到gazebo搭建的机器人仿真环境的配置,也就是上一步的配置。其次前面已有阐述: URDF 用于创建机器人模型、Rviz 可以显示机器人感知到的环境信息,Gazebo 用于仿真,可以模拟外界环境,以及机器人的一些传感器。 建图首先需要将三者结合:通过 Gazebo 模拟机器人的传感器,然后在 Rviz 中显示这些传感器感知到的数据。
在urdf02_gazebo工作包的基础上,运动控制基本流程:
在仿真环境搭建的基础上,接下来实现对机器人的建图操作。
准备一、SLAM算法有多种,当前我们选用gmapping,gmapping 是ROS开源社区中较为常用且比较成熟的SLAM算法之一,gmapping可以根据移动机器人里程计数据和激光雷达数据来绘制二维的栅格地图,对应的,gmapping对硬件也有一定的要求: (1)该移动机器人可以发布里程计消息 (2)机器人需要发布雷达消息(该消息可以通过水平固定安装的雷达发布,或者也可以将深度相机消息转换成雷达消息) 关于里程计与雷达数据,仿真环境中可以正常获取的,不再赘述,栅格地图如案例所示。 gmapping 安装调用命令如下: sudo apt install ros--gmapping gmapping 功能包中的核心节点是:slam_gmapping。为了方便调用,需要事先了解该节点订阅的话题、发布的话题、服务以及相关参数。 准备二|新建功能包nav_demo,导入依赖包: urdf、xacro、gazebo_ros、gazebo_ros_control、gazebo_plugins config: 存储rviz配置文件 launch: 存储 launch 启动文件 map: 存储地图
定位就是推算机器人自身在全局地图中的位置,当然,SLAM中也包含定位算法实现,不过SLAM的定位是用于构建全局地图的,是属于导航开始之前的阶段,而当前定位是用于导航中,导航中,机器人需要按照设定的路线运动,通过定位可以判断机器人的实际轨迹是否符合预期。在ROS的导航功能包集navigation中提供了 amcl 功能包,用于实现导航中的机器人定位。 AMCL(adaptive Monte Carlo Localization) 是用于2D移动机器人的概率定位系统,它实现了自适应(或KLD采样)蒙特卡洛定位方法,可以根据已有地图使用粒子滤波器推算机器人位置。 amcl已经被集成到了navigation包,navigation安装前面也有介绍,命令如下: sudo apt install ros--navigation
amcl节点是不可以单独运行的,运行 amcl 节点之前,需要先加载全局地图,然后启动 rviz显示定位结果,上述节点可以集成进launch文件,因此在launch文件夹下新建test_acml文件,内容示例如下:
路径规划是ROS机器人仿真的重要组成,在ROS的导航功能包集navigation中提供了 move_base功能包,用于实现此功能。
move_base 功能包提供了基于动作(action)的路径规划实现,move_base 可以根据给定的目标点,控制机器人底盘运动至目标位置,并且在运动过程中会连续反馈机器人自身的姿态与目标点的状态信息。如前所述(7.1)move_base主要由全局路径规划与本地路径规划组成。 move_base已经被集成到了navigation包,navigation安装命令如下: sudo apt install ros--navigation
(1)概念
机器人导航(尤其是路径规划模块)是依赖于地图的,地图在SLAM时已经有所介绍了,ROS中的地图其实就是一张图片,这张图片有宽度、高度、分辨率等元数据,在图片中使用灰度值来表示障碍物存在的概率。不过SLAM构建的地图在导航中是不可以直接使用的,因为: SLAM构建的地图是静态地图,而导航过程中,障碍物信息是可变的,可能障碍物被移走了,也可能添加了新的障碍物,导航中需要时时的获取障碍物信息; 在靠近障碍物边缘时,虽然此处是空闲区域,但是机器人在进入该区域后可能由于其他一些因素,比如:惯性、或者不规则形体的机器人转弯时可能会与障碍物产生碰撞,安全起见,最好在地图的障碍物边缘设置警戒区,尽量禁止机器人进入… 所以,静态地图无法直接应用于导航,其基础之上需要添加一些辅助信息的地图,比如时时获取的障碍物数据,基于静态地图添加的膨胀区等数据。 (2)组成 代价地图有两张:global_costmap(全局代价地图) 和 local_costmap(本地代价地图),前者用于全局路径规划,后者用于本地路径规划。 两张代价地图都可以多层叠加,一般有以下层级: Static Map Layer:静态地图层,SLAM构建的静态地图。 Obstacle Map Layer:障碍地图层,传感器感知的障碍物信息。 Inflation Layer:膨胀层,在以上两层地图上进行膨胀(向外扩张),以避免机器人的外壳会撞上障碍物。
(2) launch文件集成 如果要实现导航,需要集成地图服务、amcl 、move_base 与 Rviz 等,集成示例如下:
经过这次ROS机器人仿真实验,了解到了ROS中仿真实现涉及的三大部分与机器人导航的相关内容以及实现。 URDF 是用于描述机器人模型的 xml 文件,可以使用不同的标签具代表不同含义,URDF 编写机器人模型代码冗余,xacro 可以优化 URDF 实现,代码实现更为精简、高效、易读。在实验中本人最容易混淆的是Rviz与Gazebo,但是通过这次试验我已会正确区分两者。 rviz是三维可视化工具,强调把已有的数据可视化显示,需要已有数据,提供了很多插件,这些插件可以显示图像、模型、路径等信息,但是前提都是这些数据已经以话题、参数的形式发布,rviz做的事情就是订阅这些数据,并完成可视化的渲染,让开发者更容易理解数据的意义。 gazebo是三维物理仿真平台,强调的是创建一个虚拟的仿真环境,它不是显示工具,强调的是仿真,它不需要数据,而是创造数据。 其次,实现建图、定位以及路径规划就是在仿真环境下实现机器人导航,在本实验基础上更进一步还可以完成机器人自主移动实现建图、定位与路径规划。 最后本人电脑运行ROS确实有点卡,本人操作基于VScode,尤其实在gazebo仿真启动下,再启动RVIZ,会经常出现RVIZ无响应情况出现。 程序链接: link