赞
踩
作者丨 在梦里-119
编辑丨3D视觉开发者社区
导读
ROS进行仿真机器人实验的保姆级别教学下篇来啦!从安装步骤开始讲解,一直到配置、测试、建图、定位与路径规划,每一步的操作过程都极尽详细,包括可能出现的问题以及对应的解决方案,非常推荐大家阅读。结合上篇阅读更易看懂,一起动手尝试下吧~
要实现机器人建图需要用到gazebo搭建的机器人仿真环境的配置,也就是上一步的配置。其次前面已有阐述: URDF 用于创建机器人模型、Rviz 可以显示机器人感知到的环境信息,Gazebo 用于仿真,可以模拟外界环境,以及机器人的一些传感器。
建图首先需要将三者结合:通过 Gazebo 模拟机器人的传感器,然后在 Rviz 中显示这些传感器感知到的数据。
在urdf02_gazebo工作包的基础上,运动控制基本流程:
在urdf文件夹下新建一个gazebo文件夹并在其下编写 move.xacro 文件,为机器人模关节的运动学和动力学属性joint 添加传动装置以及控制器添加传动装置以及控制器。
并将此文件集成进car.xacro文件中,调用命令:
<xacro:include filename=“gazebo/move.xacro” />
在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
在上述步骤基础上,在launch文件夹下新建sensor.launch文件用于启动rviz并查看里程计信息,其内容与之前类似。新建一个终端,在该终端下运行命令:
source ./devel/setup.bash
oslaunch urdf02_gazebo sensor.launch
之后在启动好的rviz下更改参考坐标系为odom,然后添加组件RobotModel与里程计Odometry,最后为里程计添加话题并去掉覆盖的阴影,通过上述控制机器人移动便可看到如图3.2.2所示的里程计显示结果。
图3.2.2
继续上一步骤,在gazebo文件夹下,编写laser.xacro 文件,为机器人模型添加雷达配置。
并将此文件集成进car.xacro文件中,调用命令:
<xacro:include filename=“gazebo/laser.xacro” />
调用命令:roslaunch urdf02_gazebo env.launch
在gazebo中显示的带有雷达的模型,从图3.3.1中明显可以按到蓝色的雷达线程。
图3.3.1
在上一步打开的rviz中更改参考坐标系为base_footprint,添加LaserScan,并在LaserScan中订阅话题/scan并更改Size为0.05,便可以看到如图3.3.2所示的雷达显示。之后可以保存配置数据到config下的sensor.rviz下。
至此,整个仿真环境已全部搭建完毕,仿真环境的功能包及其目录结构如图3.3.3所示。
图3.3.3
在仿真环境搭建的基础上,接下来实现对机器人的建图操作。
准备一 | 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: 存储地图
在launch文件夹下编写nav01_slam.launch文件编写可以参考 github 的演示 launch文件:
https://github.com/rosperception/slam_gmapping/blob/melodicdevel/gmapping/launch/slam_gmapping_pr2.launch,这里其内部具体进行细讲。
(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
定位就是推算机器人自身在全局地图中的位置,当然,SLAM中也包含定位算法实现,不过SLAM的定位是用于构建全局地图的,是属于导航开始之前的阶段,而当前定位是用于导航中,导航中,机器人需要按照设定的路线运动,通过定位可以判断机器人的实际轨迹是否符合预期。在ROS的导航功能包集navigation中提供了 amcl 功能包,用于实现导航中的机器人定位。
AMCL(adaptive Monte Carlo Localization) 是用于2D移动机器人的概率定位系统,它实现了自适应(或KLD采样)蒙特卡洛定位方法,可以根据已有地图使用粒子滤波器推算机器人位置。
amcl已经被集成到了navigation包,navigation安装前面也有介绍,命令如下:
sudo apt install ros–navigation
关于launch文件的实现,在amcl功能包下的example目录已经给出了示例,可以作为参考,调用命令:
roscd amcl
ls examples
该目录下会列出两个文件: amcl_diff.launch 和 amcl_omni.launch 文件,前者适用于差分移动机器人,后者适用于全向移动机器人。本实验建立模型就是差速移动机器人,故选取amcl_diff.launch文件。在launch文件夹下新建 nav04_acml.launch 文件,复制 amcl_diff.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>
(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
路径规划是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:膨胀层,在以上两层地图上进行膨胀(向外扩张),以避免机器人的外壳会撞上障碍物。
路径规划算法在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
在上述配置好的rviz下,继续添加组件Path,这里需要添加两个Path组件,分别命名为Path_global,订阅全局规划地图;Path_local,订阅局部规划地图,并将其颜色改为红色。点击界面上部的2D Nav Goal,并在在地图上点击任意一点为目标点,接下来小车将自主移动到目标点,并且绿色线条表示全局规划地图,红色线条表示局部规划地图,最后显示界面如图4.2.2所示
图4.2.2
经过这次ROS机器人仿真实验,了解到了ROS中仿真实现涉及的三大部分与机器人导航的相关内容以及实现。
URDF 是用于描述机器人模型的 xml 文件,可以使用不同的标签具代表不同含义,URDF 编写机器人模型代码冗余,xacro 可以优化 URDF 实现,代码实现更为精简、高效、易读。在实验中本人最容易混淆的是Rviz与Gazebo,但是通过这次试验我已会正确区分两者。
rviz是三维可视化工具,强调把已有的数据可视化显示,需要已有数据,提供了很多插件,这些插件可以显示图像、模型、路径等信息,但是前提都是这些数据已经以话题、参数的形式发布,rviz做的事情就是订阅这些数据,并完成可视化的渲染,让开发者更容易理解数据的意义。
gazebo是三维物理仿真平台,强调的是创建一个虚拟的仿真环境,它不是显示工具,强调的是仿真,它不需要数据,而是创造数据。
其次,实现建图、定位以及路径规划就是在仿真环境下实现机器人导航,在本实验基础上更进一步还可以完成机器人自主移动实现建图、定位与路径规划。
最后本人电脑运行ROS确实有点卡,本人操作基于VScode,尤其是在gazebo仿真启动下,再启动RVIZ,会经常出现RVIZ无响应情况出现。
版权声明:本文为奥比中光3D视觉开发者社区授权转载发布,仅做学术分享,版权归原作者所有,若涉及侵权内容请联系删文。
3D视觉开发者社区是由奥比中光给所有开发者打造的分享与交流平台,旨在将3D视觉技术开放给开发者。平台为开发者提供3D视觉领域免费课程、奥比中光独家资源与专业技术支持。
点击加入3D视觉开发者社区,和开发者们一起讨论分享吧~
也可以移步微信关注官方公众号 3D视觉开发者社区 ,获取更多干货知识哦~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。