当前位置:首页 » 《随便一记》 » 正文

ROS仿真机器人(安装、配置、测试、建图、定位、路径规划)

11 人参与  2023年04月11日 12:49  分类 : 《随便一记》  评论

点击全文阅读


ROS机器人仿真(安装、配置、测试、建图、定位、路径规划)

1、ROS安装与配置1.1、安装虚拟机软件1.2、虚拟一台主机1.3、安装ubuntu1.4、在ubuntu中安装ROS机器人操作系统1.4.1 配置ubuntu的软件和更新1.4.2 设置安装源1.4.3 设置key1.4.4 安装1.4.5 安装构建依赖 1.5、配置环境变量1.6、测试ROS 2、机器人仿真模型与环境配置2.1 构建差速移动机器人仿真模型2.1.1 差速移动机器人(四轮圆柱状机器人)模型描述:2.1.2 实现流程 2.2 仿真环境搭建2.2.1 仿真环境描述2.2.2 机器人模型显示在gazebo的实现流程2.2.3 Gazebo仿真环境搭建 3、机器人建图3.1 建图前期准备3.2 运动控制实现流程及里程计查看(Gazebo)3.2.1 编写xacro文件并集成3.2.2 启动 Gazebo 并发布 /cmd_vel 消息控制机器人运动3.2.3 显示里程计 3.3 通过 Gazebo 模拟激光雷达传感器,并在 Rviz 中显示激光数据3.3.1 编写雷达的配置文件3.3.2 启动gazebo查看机器人模型3.3.3 启动rviz查看雷达显示 3.4 SLAM建图3.4.1 基础准备3.4.2 编写gmapping节点相关launch文件3.4.3 执行 4、机器人定位与路径规划4.1 机器人定位4.1.1 编写amcl节点相关的launch文件4.1.2 编写测试launch文件4.1.3 执行 4.2 机器人路径规划4.2.1 move_base功能包说明4.2.2 move_base与代价地图4.2.3 move_base的使用4.2.4 实现路径规划 5、实验总结

1、ROS安装与配置

1.1、安装虚拟机软件

此前使用的虚拟机是 VMware Workstation 15 Pro,但是使用起来不是特别方便,比如基本操作主机复制的内容无法黏贴到客户机(ubuntu)中。于是本次实验使用了VirtualBox 6.1.18虚拟机。

1.2、虚拟一台主机

使用VirtualBox虚拟计算机的过程也不算复杂,只需要按照提示配置其相关参数即可,其各项参数设置如图1所示。
在这里插入图片描述

图1.2.1:VirtualBox虚拟主机

1.3、安装ubuntu

首先从官网下载 Ubuntu 的镜像文件,这里选择的版本是20.04.2.0,于是其对应安装的ros版本为Noetic Ninjemys(May 2020-May2025):然后,配置虚拟主机,关联下载好的Ubuntu 镜像文件。
接下来对ubuntu进行优化,按照网上操作(安装虚拟机工具、启动文件交换模式)方便虚拟机与宿主机的文件交换。

1.4、在ubuntu中安装ROS机器人操作系统

1.4.1 配置ubuntu的软件和更新

配置ubuntu的软件和更新,允许安装不经认证的软件。
首先打开“软件和更新”对话框,具体可以在 Ubuntu 搜索按钮中搜索。
打开后按照图1.4.1进行配置(确保勾选了"restricted", “universe,” 和 “multiverse.”)
在这里插入图片描述

图1.4.1

1.4.2 设置安装源

使用国内清华大学安装源,这样安装速度更快,Ctrl+Ail+T打开终端输入命令:

sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'

回车输入管理员密码,显示如图1.4.2下界面即成功发。
在这里插入图片描述

图1.4.2

1.4.3 设置key

如图1.4.3所示,输入:

sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

在这里插入图片描述

图1.4.3

1.4.4 安装

首先需要更新apt,apt 是用于从互联网仓库搜索、安装、升级、卸载软件或操作系统的工具。
在终端输入:sudo apt update,界面显示如图1.4.4所示:
在这里插入图片描述

图1.4.4

然后,再安装所需类型的 ROS:ROS 多个类型:Desktop-Full、Desktop、ROS-Base。这里介绍较为常用的Desktop-Full(官方推荐)安装: ROS, rqt, rviz, robot-generic libraries, 2D/3D simulators, navigation and 2D/3D perception
在终端输入:sudo apt install ros-noetic-desktop-full
出现如图1.4.5界面,输入Y回车。
在这里插入图片描述

图1.4.5

如图1.4.6所示的安装过程,经过漫长等待,直至安装成功。
在这里插入图片描述

图1.4.6

吃了个饭回来,发现如图1.4.7错误提示:
在这里插入图片描述

图1.4.7

初步检测,应该是网络问题,于是直接重复调用更新与安装命令,最后成功。

1.4.5 安装构建依赖

在 noetic 最初发布时,和其他历史版本稍有差异的是:没有安装构建依赖这一步骤。随着 noetic 不断完善,官方补齐了这一操作。
首先安装构建依赖的相关工具,如图1.4.8所示
调用命令:

sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential

回车输入密码,直至安装成功。
在这里插入图片描述

图1.4.8

ROS中使用许多工具前,要求需要初始化rosdep(可以安装系统依赖) – 上一步实现已经安装过了,如图1.4.9。
sudo apt install python3-rosdep
在这里插入图片描述

图1.4.9

初始化rosdep,输入命令:sudo rosdep init,显示如图1.4.10所示。
在这里插入图片描述

图1.4.10

rosdep update
出现图1.4.11所示的问题:网络超时
在这里插入图片描述

图1.4.11

在网上查找了以下几种方法解决上述问题,发现都不行。
(1)更改镜像源
(2)更改域名服务器
执行:sudo gedit /etc/resolv.conf

将原有的nameserver这一行注释,并添加以下两行:
nameserver 8.8.8.8 #google域名服务器
nameserver 8.8.4.4 #google域名服务器
保存退出,执行
sudo apt-get update
再执行
rosdep update
(3)添加网站上解析出来的IP,进行操作
最后参考一篇博主的方法:将相关资源备份到gitee,修改 rosdep 源码,重新定位资源。
步骤一:切换路径cd /usr/lib/python3/dist-packages/
步骤二:查找rosdep中和raw.githubusercontent.com相关的内容,调用命令:
find . -type f | xargs grep “raw.githubusercontent”,显示如图1.4.12.
在这里插入图片描述

图1.4.12

步骤三:找到如下四个文件:
./rosdistro/init.py、
./rosdep2/gbpdistro_support.py、
./rosdep2/sources_list.py 、
./rosdep2/rep3.py。、
可以使用sudo gedit命令修改文件中涉及的 URL 内容,如果是
:raw.githubusercontent.com/ros/rosdistro/master都替换成:gitee.com/zhao-xuzuo/rosdistro/raw/master即可,这样就改变了资源路径。
步骤四:重新运行:
sudo rosdep init rosdep update,如图1.4.13所示。
就可以正常实现 rosdep 的初始化与更新了。

在这里插入图片描述

图1.4.13

1.5、配置环境变量

配置环境变量,方便在任意 终端中使用 ROS。
调用命令:echo “source /opt/ros/noetic/setup.bash” >> ~/.bashrc
source ~/.bashrc,如图1.5所示。
在这里插入图片描述

图1.5

1.6、测试ROS

首先调用命令:roscore,显示如图1.6.1所示:
在这里插入图片描述

图1.6.1

其次添加新窗口并调用命令:rosrun turtlesim turtlesim_node(此时会弹出图形化界面,如图1.6.2所示)
在这里插入图片描述

图1.6.2

之后添加新窗口并调用命令:rosrun turtlesim turtle_teleop_key(在3中可以通过上下左右控制2中乌龟的运动)
最终结果如下所示,则测试成功
在这里插入图片描述

图1.6.1

2、机器人仿真模型与环境配置

引言-ROS机器人仿真实验几点说明
本实验使用编程软件:VScode,及界面显示如图2所示:
在这里插入图片描述

图2

2.1 构建差速移动机器人仿真模型

2.1.1 差速移动机器人(四轮圆柱状机器人)模型描述:

机器人参数如下,底盘为圆柱状,半径 10cm,高 8cm,四轮由两个驱动轮和两个万向支撑轮组成,两个驱动轮半径为 3.25cm,轮胎宽度1.5cm,两个万向轮为球状,半径 0.75cm,底盘离地间距为 1.5cm(与万向轮直径一致),并添加雷达传感器

2.1.2 实现流程

(1)创作ROS工作空间并初始化
使用命令:
mkdir -p demo_18/src
cd demo_18
catkin_make
(2) 启动VScode
在demo_18目录下使用命令:code .
便可以开启VScode,接下来所有操作都在可视化的VScode上进行。
(3)创建 ROS 功能包
选定 src 右击 —> create catkin package
创建urdf01_rviz功能包,导入依赖包:urdf与xacro
(4)在当前功能包下,添加如下目录
urdf: 存储 urdf 文件的目录
config: 配置文件
launch: 存储 launch 启动文件
(5)编写URDF文件
这里可以使用URDF文件编写也可以使用XACRO文件编写小车模型文件,本人在此两种实现方法都用了,分别在urdf文件夹下,新建urdf用于编写urdf小车模型;新建xacro文件夹编写xacro小车模型,但是这里只讲解xacro文件编写的小车模型,这是因为urdf编写小车模型存在如下问题:
问题1:在设计关节的位置时,需要按照一定的公式计算,公式是固定的,但是在 URDF 中依赖于人工计算,存在不便,容易计算失误,且当某些参数发生改变时,还需要重新计算。
问题2:URDF 中的部分内容是高度重复的,驱动轮与支撑轮的设计实现,不同轮子只是部分参数不同,形状、颜色、翻转量都是一致的,在实际应用中,构建复杂的机器人模型时,更是易于出现高度重复的设计,按照一般的编程涉及到重复代码应该考虑封装。
(6)编写xacro文件用于构建小车模型
编写car_base.xacro用于构建小车底盘;
编写laser.xacro文件用于构建雷达;
编写car.xacro文件用于组合地盘与雷达。
(7)编写launch文件
编写car.launch文件,这里在launch文件中使用命令:
<paramname="robot_description"command="$(findxacro)/xacro$(findurdf01_rviz)/urdf/xacro/car.xacro" />

直接加载(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所示。

在这里插入图片描述

图2.1.1

(9) 运行编写好的car.launch文件
点击udf01_rviz功能包,右击–>点击在集成终端中打开,如图2.1.2所示。
在这里插入图片描述

图2.1.2

在打开的第一个终端输入:roscore命令,运行ros。接着点击加号,新建终端,输入命令:
source ./devel/setup.bash
roslaunch urdf01_rviz car.launch
接下来便会打开rviz窗口。
(10)在RVIZ中显示机器人模型
viz 启动后,会发现并没有盒装的机器人模型,这是因为默认情况下没有添加机器人显示组件,需要手动添加,在添加组件前,先设置Fixed Frame为base_footprint,也就是更改参考坐标系,结果如图2.1.2.
在这里插入图片描述

图2.1.2 bnm

添加机器人模型组件,如图2.1.3,点击Add,之后选择需要的组件,比如RobotModel,其余组件添加方式类似,之后类似操作不再赘述。之后便可以看到图2.1.的机器人模型。
在这里插入图片描述

图2.1.3

在这里插入图片描述

图2.1.4

(11)在RVIZ配置操作并调用
为了避免每一次啊都要进行更改坐标系与组件添加操作,可以在步骤(10)中,点击file–>save config as ,并将其保存到demo_18/src/urdf01_rviz/config下,命名为car.rviz。
之后修改car.launch下rviz启动命令为:
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/car.rviz"/>
这样,下次打开rviz显示模型便不需要配置操作。

2.2 仿真环境搭建

2.2.1 仿真环境描述

仿真环境搭建比较简单,直接放置了给定圆柱体与正方体,因为自身电脑的原因,带动ros非常卡顿,所以对于仿真环境搭建比较简单。本人也尝试构建参考实例中的环境发现Gazebo无响应。

2.2.2 机器人模型显示在gazebo的实现流程

(1)在demo_18工作空间下,创建 ROS 功能包
创建urdf02_gazebo功能包,导入依赖包: urdf、xacro、gazebo_ros、gazebo_ros_control、gazebo_plugins
(2)在当前功能包下,添加如下目录
urdf: 存储 urdf 文件的目录
config: 存储rviz配置文件
launch: 存储 launch 启动文件
worlds: 保存地图文件
(3)编写封装惯性矩阵算法的 xacro 文件
在urdf下新建head.xacro文件,存放惯性矩阵算法。惯性矩阵的设置需要结合link的质量与外形参数动态生成,标准的球体、圆柱与立方体的惯性矩阵公式如下(已经封装为 xacro 实现):
球体惯性矩阵
圆柱惯性矩阵
立方体惯性矩阵
这里直接复制并保存。需要注意的是,原则上,除了base_footprint 外,机器人的每个刚体部分都需要设置惯性矩阵,且惯性矩阵必须经计算得出,如果随意定义刚体部分的惯性矩阵,那么可能会导致机器人在 Gazebo 中出现抖动,移动等现象。
(4)编写小车模型的xavro文件
直接从2.1下拷贝car.xacro、car_base.xacro、laser.xacro文件到urdf目录下,并且需要并设置 collision inertial 以及 color 等参数。具提程序参照附件,这里不对程序做详细介绍,附录程序有详细注释。
(5)编写launch文件
在launch文件夹下编写env.launch文件,这里在launch文件中使用命令:
使用命令:<param name="robot_description" command="$(find xacro)/xacro $(find urdf02_gazebo)/urdf/car.xacro" />
将 Urdf 文件的内容加载到参数服务器;
使用命令:<include file="$(find gazebo_ros)/launch/empty_world.launch" />
启动 gazebo;
使用命令:<node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model car -param robot_description" />
在 gazebo 中显示机器人模型;
(6)运行程序并在gazebo中查看
在终端下输入:roslaunch urdf02_gazebo env.launch命令,便可以启动gazebo,界面显示如图2.2.1。
在这里插入图片描述

图2.2.1

2.2.3 Gazebo仿真环境搭建

到目前为止,我们已经可以将机器人模型显示在 Gazebo 之中了,但是当前默认情况下,在 Gazebo 中机器人模型是在 empty world 中,并没有类似于房间、家具、道路、树木… 之类的仿真物。在Gazebo 中创建仿真实现方式有两种:
方式1: 直接添加内置组件创建仿真环境
方式2: 手动绘制仿真环境(更为灵活)
也还可以直接下载使用官方或第三方提高的仿真环境插件。
本实验采用方式1添加内置组件创建仿真环境,大家可能更倾向于方式2,这里因为本人电脑的原因,采用方式1,其具体步骤如下
步骤一:启动 Gazebo 并添加组件,如图2.2.2红色框所示:
在这里插入图片描述

图2.2.2

步骤二:保存仿真环境
添加完毕后,选择 file —> Save World as 选择保存路径(功能包下: worlds 目录),文件名自定义,后缀名设置为 .world
步骤三:启动仿真环境
这里只需要将上述的env.launch文件中的gazebo启动命令更改为:

<include file="$(find gazebo_ros)/launch/empty_world.launch" >       <arg name="world_name" value="$(find urdf02_gazebo)/worlds/box_house.world" /></include>

这里我保存仿真环境文件为:box_house.world。
按照上述(6)步骤重新打开gazebo,便可得到如下图2.2.3所示的仿真环境。
在这里插入图片描述

图2.2.3

3、机器人建图

3.1 建图前期准备

要实现机器人建图需要用到gazebo搭建的机器人仿真环境的配置,也就是上一步的配置。其次前面已有阐述: URDF 用于创建机器人模型、Rviz 可以显示机器人感知到的环境信息,Gazebo 用于仿真,可以模拟外界环境,以及机器人的一些传感器。
建图首先需要将三者结合:通过 Gazebo 模拟机器人的传感器,然后在 Rviz 中显示这些传感器感知到的数据。

3.2 运动控制实现流程及里程计查看(Gazebo)

在urdf02_gazebo工作包的基础上,运动控制基本流程:

3.2.1 编写xacro文件并集成

在urdf文件夹下新建一个gazebo文件夹并在其下编写 move.xacro 文件,为机器人模关节的运动学和动力学属性joint 添加传动装置以及控制器添加传动装置以及控制器。
并将此文件集成进car.xacro文件中,调用命令:
<xacro:include filename="gazebo/move.xacro" />

3.2.2 启动 Gazebo 并发布 /cmd_vel 消息控制机器人运动

在VScode终端下启动launch文件吗,方法同步骤(6),便可以在gazebo中看到图2.2.3的效果。接下来新建ubuntu终端,输入命令:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py _speed:=0.5 _turn:=1
便得到图3.2.1的终端显示结果,这样便可以通过键盘按键实现对机器人控制,实现gozebo机器人的移动。
在这里插入图片描述

图3.2.1

3.2.3 显示里程计

在上述步骤基础上,在launch文件夹下新建sensor.launch文件用于启动rviz并查看里程计信息,其内容与之前类似。新建一个终端,在该终端下运行命令:
source ./devel/setup.bash
oslaunch urdf02_gazebo sensor.launch
之后在启动好的rviz下更改参考坐标系为odom,然后添加组件RobotModel与里程计Odometry,最后为里程计添加话题并去掉覆盖的阴影,通过上述控制机器人移动便可看到如图3.2.2所示的里程计显示结果。
在这里插入图片描述

图3.2.2

3.3 通过 Gazebo 模拟激光雷达传感器,并在 Rviz 中显示激光数据

3.3.1 编写雷达的配置文件

继续上一步骤,在gazebo文件夹下,编写laser.xacro 文件,为机器人模型添加雷达配置。
并将此文件集成进car.xacro文件中,调用命令:
<xacro:include filename="gazebo/laser.xacro" />

3.3.2 启动gazebo查看机器人模型

调用命令:roslaunch urdf02_gazebo env.launch
在gazebo中显示的带有雷达的模型,从图3.3.1中明显可以按到蓝色的雷达线程。
在这里插入图片描述

图3.3.1

3.3.3 启动rviz查看雷达显示

在上一步打开的rviz中更改参考坐标系为base_footprint,添加LaserScan,并在LaserScan中订阅话题/scan并更改Size为0.05,便可以看到如图3.3.2所示的雷达显示。之后可以保存配置数据到config下的sensor.rviz下。
在这里插入图片描述

图3.3.2

至此,整个仿真环境已全部搭建完毕,仿真环境的功能包及其目录结构如图3.3.3所示。
在这里插入图片描述

图3.3.3

3.4 SLAM建图

在仿真环境搭建的基础上,接下来实现对机器人的建图操作。

3.4.1 基础准备

准备一、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: 存储地图

3.4.2 编写gmapping节点相关launch文件

在launch文件夹下编写nav01_slam.launch文件编写可以参考 github 的演示 launch文件:https://github.com/ros-perception/slam_gmapping/blob/melodicdevel/gmapping/launch/
slam_gmapping_pr2.launch,这里其内部具体进行细讲。

3.4.3 执行

(1)先启动 Gazebo 仿真环境,也就接着上一个实验,就绪运行搭建好的仿真环境。
(2)启动地图绘制的 launch 文件:
roslaunch nav_demo nav01_slam.launch
(3)在打开的rviz 中更改参考参考坐标为map,新添加添加组件TF与MAP并在MAP中订阅/map,这是便可以显示栅格地图,如图3.4.1所示,最后保存配置文件到config下的nav中。
在这里插入图片描述

图3.4.1

(4)启动键盘键盘控制节点,用于控制机器人运动建图,这里注意不是自主建图,而是手动控制机器人移动建图,在后面将会对此操作进行改进,实现机器人自主移动建图。
(5)使用map_sever的map_saver节点保存地图
在launch文件夹下编写nav02_map_save.launch文件:

<launch>    <arg name="filename" value="$(find nav_demo)/map/nav_map" />    <node name="map_save" pkg="map_server" type="map_saver" args="-f $(arg filename)" /></launch>

接着第四步新建终端运行该文件,在map文件夹下显示nav_map.pgm与nav_map.yaml文件,打开nav_map.pgm,显示如图3.4.2所示,即为建好的地图。
在这里插入图片描述

图3.4.2

nav_map.pgm本质是一张图片,直接使用图片查看程序即可打开。
nav_map.yaml保存的是地图的元数据信息,用于描述图片。
(6)使用map_sever的map_server节点读取保存地图
在launch文件夹下编写nav03_map_sever.launch文件:

<launch>    <!-- 设置地图的配置文件 -->    <arg name="map" default="nav_map.yaml" />    <!-- 运行地图服务器,并且加载设置的地图-->    <node name="map_server" pkg="map_server" type="map_server" args="$(find nav_demo)/map/$(arg map)"/></launch>

其中参数是地图描述文件的资源路径,执行该launch文件,该节点会发布话题:map(nav_msgs/OccupancyGrid)
在仿真环境启动下,下在ubuntu终端中输入:rviz 启动rviz,并添加使用 map 组件并订阅/map话题便可以看到栅格地图,如图3.4.3所示。
在这里插入图片描述

图3.4.3

4、机器人定位与路径规划

4.1 机器人定位

定位就是推算机器人自身在全局地图中的位置,当然,SLAM中也包含定位算法实现,不过SLAM的定位是用于构建全局地图的,是属于导航开始之前的阶段,而当前定位是用于导航中,导航中,机器人需要按照设定的路线运动,通过定位可以判断机器人的实际轨迹是否符合预期。在ROS的导航功能包集navigation中提供了 amcl 功能包,用于实现导航中的机器人定位。
AMCL(adaptive Monte Carlo Localization) 是用于2D移动机器人的概率定位系统,它实现了自适应(或KLD采样)蒙特卡洛定位方法,可以根据已有地图使用粒子滤波器推算机器人位置。
amcl已经被集成到了navigation包,navigation安装前面也有介绍,命令如下:
sudo apt install ros--navigation

4.1.1 编写amcl节点相关的launch文件

关于launch文件的实现,在amcl功能包下的example目录已经给出了示例,可以作为参考,调用命令:
roscd amcl
ls examples
该目录下会列出两个文件: amcl_diff.launch 和 amcl_omni.launch 文件,前者适用于差分移动机器人,后者适用于全向移动机器人。本实验建立模型就是差速移动机器人,故选取amcl_diff.launch文件。在launch文件夹下新建 nav04_acml.launch 文件,复制 amcl_diff.launch 文件内容并做部分修改。

4.1.2 编写测试launch文件

amcl节点是不可以单独运行的,运行 amcl 节点之前,需要先加载全局地图,然后启动 rviz显示定位结果,上述节点可以集成进launch文件,因此在launch文件夹下新建test_acml文件,内容示例如下:

<launch>    <!-- 启动rviz -->    <node pkg="joint_state_publisher" name="joint_state_publisher" type="joint_state_publisher" />    <node pkg="robot_state_publisher" name="robot_state_publisher" type="robot_state_publisher" />    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find nav_demo)/config/test_amcl.rviz" />    <!-- 加载地图服务 -->    <include file="$(find nav_demo)/launch/nav03_map_sever.launch" />    <!-- AMCL文件 -->    <include file="$(find nav_demo)/launch/nav04_amcl.launch" /><!-- args="-d $(find nav_demo)/config/nav.rviz" --></launch>

4.1.3 执行

(1)先启动 Gazebo 仿真环境,也就接着上一个实验,就绪运行搭建好的仿真环境。
(2)启动上一步中集成地图服务、amcl 与 rviz 的 launch 文件;
(3)启动键盘控制节点:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
使用键盘控制机器人移动。
(4)在启动的 rviz 中,添加RobotModel、Map组件,分别显示机器人模型与地图,添加 posearray 插件,设置topic为particlecloud来显示 amcl 预估的当前机器人的位姿,箭头越是密集,说明当前机器人处于此位置的概率越高,设置之后便得到图4.1.1。
在这里插入图片描述

图4.1.1

(5)通过键盘控制机器人运动,会发现 posearray 也随之而改变,演示结果如图4.1.2所示。
在这里插入图片描述

图4.1.2

4.2 机器人路径规划

路径规划是ROS机器人仿真的重要组成,在ROS的导航功能包集navigation中提供了 move_base功能包,用于实现此功能。

4.2.1 move_base功能包说明

move_base 功能包提供了基于动作(action)的路径规划实现,move_base 可以根据给定的目标点,控制机器人底盘运动至目标位置,并且在运动过程中会连续反馈机器人自身的姿态与目标点的状态信息。如前所述(7.1)move_base主要由全局路径规划与本地路径规划组成。
move_base已经被集成到了navigation包,navigation安装命令如下:
sudo apt install ros--navigation

4.2.2 move_base与代价地图

(1)概念

机器人导航(尤其是路径规划模块)是依赖于地图的,地图在SLAM时已经有所介绍了,ROS中的地图其实就是一张图片,这张图片有宽度、高度、分辨率等元数据,在图片中使用灰度值来表示障碍物存在的概率。不过SLAM构建的地图在导航中是不可以直接使用的,因为:
SLAM构建的地图是静态地图,而导航过程中,障碍物信息是可变的,可能障碍物被移走了,也可能添加了新的障碍物,导航中需要时时的获取障碍物信息;
在靠近障碍物边缘时,虽然此处是空闲区域,但是机器人在进入该区域后可能由于其他一些因素,比如:惯性、或者不规则形体的机器人转弯时可能会与障碍物产生碰撞,安全起见,最好在地图的障碍物边缘设置警戒区,尽量禁止机器人进入…
所以,静态地图无法直接应用于导航,其基础之上需要添加一些辅助信息的地图,比如时时获取的障碍物数据,基于静态地图添加的膨胀区等数据。
(2)组成
代价地图有两张:global_costmap(全局代价地图) 和 local_costmap(本地代价地图),前者用于全局路径规划,后者用于本地路径规划。
两张代价地图都可以多层叠加,一般有以下层级:
Static Map Layer:静态地图层,SLAM构建的静态地图。
Obstacle Map Layer:障碍地图层,传感器感知的障碍物信息。
Inflation Layer:膨胀层,在以上两层地图上进行膨胀(向外扩张),以避免机器人的外壳会撞上障碍物。

4.2.3 move_base的使用

路径规划算法在move_base功能包的move_base节点中已经封装完毕了,但是还不可以直接调用,因为算法虽然已经封装了,但是该功能包面向的是各种类型支持ROS的机器人,不同类型机器人可能大小尺寸不同,传感器不同,速度不同,应用场景不同…最后可能会导致不同的路径规划结果,那么在调用路径规划节点之前,我们还需要配置机器人参数。具体实现如下:
(1) 配置文件
关于配置文件的编写,可以参考一些成熟的机器人的路径规划实现,比如: turtlebot3,github链接:https://github.com/ROBOTIS-GIT/turtlebot3/tree/master/turtlebot3_navigation/param,先下载这些配置文件备用。
在nav_demo下新建 param 目录,复制下载的文件到此目录: costmap_common_params_burger.yaml;
local_costmap_params.yaml;
global_costmap_params.yaml;
base_local_planner_params.yaml;
并将costmap_common_params_burger.yaml 重命名为:costmap_common_params.yaml。
在launch文件夹下新建nav06_test.launch文件完成move_base节点的调用,其内容如下:

<launch>        <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true">        <rosparam file="$(find nav_demo)/param/costmap_common_params.yaml" command="load" ns="global_costmap" />        <rosparam file="$(find nav_demo)/param/costmap_common_params.yaml" command="load" ns="local_costmap" />        <rosparam file="$(find nav_demo)/param/local_costmap_params.yaml" command="load" />        <rosparam file="$(find nav_demo)/param/global_costmap_params.yaml" command="load" />        <rosparam file="$(find nav_demo)/param/base_local_planner_params.yaml" command="load" />    </node></launch>

(2) launch文件集成
如果要实现导航,需要集成地图服务、amcl 、move_base 与 Rviz 等,集成示例如下:

<!-- 集成导航相关的launch文件 --><launch>    <!-- 加载地图服务 -->    <include file="$(find nav_demo)/launch/nav03_map_sever.launch" />    <!-- AMCL文件 -->    <include file="$(find nav_demo)/launch/nav04_amcl.launch" />    <!-- move_base -->    <include file="$(find nav_demo)/launch/nav05_path.launch" />      <!-- rviz   -->    <node pkg="joint_state_publisher" name="joint_state_publisher" type="joint_state_publisher" />    <node pkg="robot_state_publisher" name="robot_state_publisher" type="robot_state_publisher" />    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find nav_demo)/config/nav06_test.rviz"/>  </launch> 

(3)测试
步骤一:先启动 Gazebo 仿真环境,此过程同上。
步骤二:新建终端,运行nav06_test.launch文件 ,启动rviz。
步骤三:在启动的rviz界面,添加Rviz组件:RobotModal、Map,LaserScan,其中Map有三个,分别命名为Map,订阅话题:map为前面slam构建的地图;Map_global,订阅话题:全局代价地图;Map_local,订阅话题:本地代价地图。
更改Map_global下的Colour Schene为costmap,最后其显示如图4.2.1所示。最后保存配置到config下的nav06_test.rviz文件内。

在这里插入图片描述

图4.2.1

4.2.4 实现路径规划

在上述配置好的rviz下,继续添加组件Path,这里需要添加两个Path组件,分别命名为Path_global,订阅全局规划地图;Path_local,订阅局部规划地图,并将其颜色改为红色。点击界面上部的2D Nav Goal,并在在地图上点击任意一点为目标点,接下来小车将自主移动到目标点,并且绿色线条表示全局规划地图,红色线条表示局部规划地图,最后显示界面如图4.2.2所示,
在这里插入图片描述

图4.2.1

5、实验总结

经过这次ROS机器人仿真实验,了解到了ROS中仿真实现涉及的三大部分与机器人导航的相关内容以及实现。
URDF 是用于描述机器人模型的 xml 文件,可以使用不同的标签具代表不同含义,URDF 编写机器人模型代码冗余,xacro 可以优化 URDF 实现,代码实现更为精简、高效、易读。在实验中本人最容易混淆的是Rviz与Gazebo,但是通过这次试验我已会正确区分两者。
rviz是三维可视化工具,强调把已有的数据可视化显示,需要已有数据,提供了很多插件,这些插件可以显示图像、模型、路径等信息,但是前提都是这些数据已经以话题、参数的形式发布,rviz做的事情就是订阅这些数据,并完成可视化的渲染,让开发者更容易理解数据的意义。
gazebo是三维物理仿真平台,强调的是创建一个虚拟的仿真环境,它不是显示工具,强调的是仿真,它不需要数据,而是创造数据。
其次,实现建图、定位以及路径规划就是在仿真环境下实现机器人导航,在本实验基础上更进一步还可以完成机器人自主移动实现建图、定位与路径规划。
最后本人电脑运行ROS确实有点卡,本人操作基于VScode,尤其实在gazebo仿真启动下,再启动RVIZ,会经常出现RVIZ无响应情况出现。
程序链接:
link


点击全文阅读


本文链接:http://zhangshiyu.com/post/59269.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1