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

2023-11-13

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • python 数据库连接池_python数据库连接池

    一 DBUtils的认识 首先管理数据库连接池的包是 DBUtils 为高频度并发的数据库访问提供更好的性能 可以自动管理连接对象的创建和释放 最常用的两个外部接口是PersistentDB 和 PooledDB 前者提供了单个线程专用的数
  • mac下面有epoll?

    没有的 但是mac下面有kqueue 跟epoll原理是差不多的 这个是没办法的 如果实在需要 就用Ubuntu吧 这个也可以无缝迁移 更多资源 更多文章由小白技术社提供 是我啦
  • Mysql学习(十一) -- 常见问题处理

    1 MySQL数据库cpu飙升的话你会如何分析 重点是定位问题 使用top观察mysqld的cpu利用率 切换到常用的数据库 使用show full processlist 查看会话 观察是哪些sql消耗了资源 其中重点观察state指标
  • 5G到底有哪些能力

    来源 工信头条 作者 华为5G首席科学家 童文 摘要 华为5G首席科学家告诉你5G到底有哪些能力 2019年是5G产业进入全面商用的关键一年 全球5G网络的部署已经启动 2018年6月 5G独立组网标准冻结 5G完成了第一阶段全功能eMBB
  • Android Execution failed for task ‘:app:mergeDebugAssets‘. > java.nio.file.AccessDeniedException:错误

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 错误详情图 在项目中引入萤石云的依赖后 compile com ezviz sdk ezuikit 2 2 1 就开始报这个错误 前前后
  • (.*?)正则表达式

    1 匹配任意除换行符 n 外的字符 2 表示匹配前一个字符0次或无限次 3 表示前边字符的0次或1次重复 4 或 后跟 表示非贪婪匹配 即尽可能少的匹配 如 重复任意次 但尽可能少重复 5 表示匹配任意数量的重复 但是在能使整个匹配成功的前
  • cookies添加python selenium

    def add ck a browser delete all cookies 删除原有cookies cookies 在浏览器里面复制 a BIDUPSID B8D733AE1AF91ABF07AE6448B2DF91AA PSTM 16
  • 预约到家按摩小程序开发定制同城服务

    随着生活节奏加快 生活压力也随之而来 很多人忙于工作与生计 身体和心理两方面都在承受重压 而按摩能够消除身体的疲惫 增强人的身体体质 在劳累过后放松身心按摩一会儿 可以快速恢复精神状态 增强免疫力和抵抗力 按摩的好处很多 但由于现代人时间和
  • 0001.两数之和(简单)

    代码 Java版 2020 07 03 public int twoSum int nums int target int ans new int 2 for int i 0 i lt nums length i for int j i 1
  • c#线程二

    下面的表格列展了 NET对协调或同步线程动作的可用的工具 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程完成 锁系统 构成 目的 跨进程 速度 lock 确保只有一个线程访问某个资源或某段代码 否 快 M
  • 记录WIN10选择文件右键后资源管理器无响应的解决方法

    现象 WIN10选择文件 右键文件后资源管理器无响应 解决方法 找到一种亲测可用的解决方法 即清除文件资源管理器历史记录 详细操作 1 打开文件资源管理器 2 点击左上角 文件 点击 选项 找到 隐私 下方的 清除 按钮 点击 清除 最后点
  • DVWA - XSS DOM (high)

    随便选择一个 url中会出现我们选的哪个 http 127 0 0 1 DVWA master vulnerabilities xss d default 3Cscript
  • CVPR 2022

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 作者 轻尘一笑 已授权转载 源 知乎 编辑 CVer https zhuanlan zhihu com p 489839282 导读 在CVPR 2022上 新加坡南洋
  • 【H5】canvas画布像素的设置与获取:

    H5 canvas画布像素的设置与获取 getImageData 从Canvas画板上取得指定位置的像素数据 putImageData 将所得到的像素数据描画到Canvas画板上 createImageData 方法创建新的空白像素 Ima
  • IPSec基础知识

    文章目录 IPSec基础知识 IPSec特性 IPSec组成部分 IPSec对等体 IPSec隧道 安全联盟 Security Association AH安全协议 AH包结构 ESP安全协议 ESP包结构 AH和ESP比较 封装模式 传输
  • 解决Rational Rose找不到suite objects.dll文件的问题

    问题描述 打开Rational Rose 2007时 发现有以下问题 提示找不到suite objects dll文件 需要重装软件 但是查看Rational Rose 2007安装文件夹 发现Common文件夹下有suite object
  • Windows系统管理七:本地组策略&注册表及其维护与优化

    本地组策略 概述 组策略 英语 Group Policy 是微软 Windows NT 家族操作系统的一个特性 它可以控制用户帐户和计算机帐户的工作环境 组策略提供了操作系统 应用程序和活动目录中用户设置的集中化管理和配置 组策略的其中个版
  • Ceph 集群在线迁移方案

    一 环境准备 1 1 场景介绍 最近收到一个需求 客户希望将运行了多年的ceph集群服务器全部更换掉 因为这些老服务器性能和容量都已经无法满足当前业务的需求 并希望在迁移到新服务器的过程中 业务不中断 在参考一些网上的方案后 选择了一个方案
  • 解决Error response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifests/问题

    昨天在使用docker 时 将 image 文件从仓库抓取到本地一直报错 经过尝试 终于得以解决 错误信息如下 root archlinux docker image pull library hello world Using defau
  • ROS仿真机器人(安装、配置、测试、建图、定位、路径规划)

    ROS机器人仿真 安装 配置 测试 建图 定位 路径规划 1 ROS安装与配置 1 1 安装虚拟机软件 1 2 虚拟一台主机 1 3 安装ubuntu 1 4 在ubuntu中安装ROS机器人操作系统 1 4 1 配置ubuntu的软件和更