版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
移动机器人技术原理与应用第十章
移动机器人ROS系统ROS总体框架ROS基本命令与功能包基于ROS的移动机器人功能仿真10.1ROS系统安装10.210.310.4ROS中移动机器人技术相关应用10.510.1
ROS系统安装10.1.1Ubuntu系统简介及安装ROS一般安装在Linux系统下,Ubuntu是Linux中最为常用的系统,绝大多数ROS系统安装在Ubuntu系统中。Ubuntu是一个以桌面应用为主的Linux操作系统,提供了一个健壮、功能丰富的计算环境,既适合家庭使用又适用于商业环境。Ubuntu几乎包含了所有常用的应用软件:文字处理、电子邮件、软件开发工具和Web服务等。用户下载、使用、分享Ubuntu系统,以及获得技术支持与服务,无需支付任何许可费用。10.1.1
Ubuntu系统简介及安装Ubuntu系统的安装对于电脑配置的要求并不严格,目前主流的PC都可以正常运行。安装系统的方式可以分为两种,直接对硬盘分区后安装和使用虚拟机安装,对于对Ubuntu系统不是很了解的新手,推荐先使用虚拟机安装Ubuntu,先进行基础的学习,等对Ubuntu有足够的认识后进行硬盘的安装。接下来介绍如何通过虚拟机进行Ubuntu系统的安装:10.1.1
Ubuntu系统简介及安装1.安装虚拟机,虚拟机推荐使用VMwareWorkstation,可以直接登录VMware官方下载,逐步安装即可。VMware打开界面10.1.1
Ubuntu系统简介及安装2.Ubuntu系统镜像可以直接在Ubuntu官网进行系统镜像的下载(/14.04/)。Ubuntu官网下载系统镜像10.1.1
Ubuntu系统简介及安装3.打开VMware软件,点击创建新的虚拟机,选择典型。新建虚拟机向导10.1.1
Ubuntu系统简介及安装4.选择稍后安装系统,创建一个空白硬盘。创建空白硬盘10.1.1
Ubuntu系统简介及安装5.客户机操作系统选择Linux(L),版本为Ubuntu64位。选择客户机操作系统10.1.1
Ubuntu系统简介及安装6.设置虚拟机名称和安装位置,然后点击下一步。命名虚拟机10.1.1
Ubuntu系统简介及安装7.设置虚拟机的磁盘大小,并设置为单个文件。设置虚拟机磁盘容量10.1.1
Ubuntu系统简介及安装8.完成虚拟机创建。完成虚拟机的创建10.1.1
Ubuntu系统简介及安装9.虚拟机设置。编辑虚拟机设置10.1.1
Ubuntu系统简介及安装10.根据电脑配置,合理分配虚拟机的设置,内存、处理器等。设置虚拟机的配置10.1.1
Ubuntu系统简介及安装11.在CD/DVD中使用下载好的ISO镜像文件。加载映像文件10.1.1
Ubuntu系统简介及安装12.点击开启此虚拟机,开始ubuntu的配置。开启虚拟机10.1.1
Ubuntu系统简介及安装13.选择语言,点击安装ubuntu。选择语言进行安装10.1.1
Ubuntu系统简介及安装14.默认进行安装。默认进行安装10.1.1
Ubuntu系统简介及安装15.选择清除整个磁盘并安装。清除磁盘进行安装10.1.1
Ubuntu系统简介及安装16.按照默认分配继续安装。按照默认分盘进行安装10.1.1
Ubuntu系统简介及安装17.选择对应的时区。选择对应的时区继续安装10.1.1
Ubuntu系统简介及安装18.选择汉语键盘布局。选择汉语键盘布局10.1.1
Ubuntu系统简介及安装19.设置用户名和密码。设置用户名和密码10.1.1
Ubuntu系统简介及安装20.安装结束,重新启动。系统界面10.1.2
不同Ubuntu版本与ROS版本Ubuntu版本和ROS版本对应关系10.1.3
Ubuntu14.04中安装ROSindigo版本按照Ubuntu和ROS版本的对应关系安装Indigo版本ROS的具体步骤如下:1.首先配置系统的软件源,这样,在安装软件时就可以直接使用国内的软件源了,本书选择的是清华的软件源,在设置中的软件与更新界面进行更换。10.1.3
Ubuntu14.04中安装ROSindigo版本设置软件源10.1.3
Ubuntu14.04中安装ROSindigo版本2.添加软件源到sources.list中;$sudosh-c'echo"deb/ros/ubuntu$(lsb_release-sc)main">/etc/apt/sources.list.d/ros-latest.list'3.设置密钥;$sudoapt-keyadv--keyserver
'hkp://:80'--recv-keyC1CF6E31E6BADE8868B172B4F42ED6FBAB17C65410.1.3
Ubuntu14.04中安装ROSindigo版本4.$sudoapt-getupdate更新软件源;5.$sudoapt-getinstallros-indigo-desktop-full安装ROS的Indigo完整版;6.初始化rosdep;$sudorosdepinit,$rosdepupdate7.设置环境变量;$echo"source/opt/ros/indigo/setup.bash">>~/.bashrc$source~/.bashrc经以上操作,完成了ROSIndigo版本安装,在终端输入几条命令调用小乌龟例子可以验证ROS的安装。命令如下:10.1.3
Ubuntu14.04中安装ROSindigo版本(1)在Terminal中输入$roscore命令,该命令是初始化ROS环境,全局参数,以及每个节点注册等工作。roscore命令启动后的日志信息10.1.3
Ubuntu14.04中安装ROSindigo版本(2)再打开一个Terminal,输入rosrunturtlesimturtlesim
_node命令,开启一个小乌龟界面。输入命令启动小乌龟10.1.3
Ubuntu14.04中安装ROSindigo版本(3)再打开一个Terminal,输入$rosrunturtlesimturtle
_teleop_key命令。接受键盘输入,控制小乌龟移动。键盘按下上下左右按键,可看到控制小乌龟移动通过键盘控制小乌龟运动10.2
ROS总体框架ROS架构有三个层次:首先是基于Linux系统的OS层,ROS并不是一个传统意义上的操作系统,无法直接运行在硬件上,需要依赖Linux、Windows等系统,来实现自身的功能;实现ROS核心通信机制以及众多机器人开发库的中间层,采用了基于TCPROS/UDPROS的通信系统,使用发布/订阅、客户端/服务端等模型,实现多种通信机制的数据传输;在ROSMaster的管理下保证功能节点的正常运行的应用层,ROS社区内共享了大量的机器人应用功能包,可实现复用,极大地提高了开发效率。10.2
ROS总体框架从系统实现角度将ROS划分三个层次:计算图、文件系统和开源社区,涵盖ROS中关键概念,如节点、消息、话题、服务、功能包、元功能包等。ROS的三个层次10.2.1
文件系统级ROS的文件系统结构10.2.1
文件系统级ROS文件系统中两个最基本的概念是Package和Manifest,即包和清单文件。1.Package是组织ROS代码的最基本单位,每一个Package都可以包括库文件、可执行文件、脚本及其它一些文件。2.Manifest文件是对Package的相关信息的一个描述。他提供了Package之间的依赖性,以及一个包的元信息,比如版本、维护着和许可证等信息。ROS类似于操作系统,将所有文件按照一定的规则进行组织,而不同功能的文件被放置在不同的文件夹下。10.2.1
文件系统级功能包(Package):功能包是ROS软件中的基本单元,包含ROS节点、库、配置文件等。功能包清单(PackageManifest):每个功能包都包含名为package.xml的功能包清单,用于记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等。元功能包(MetaPackage):在新版的ROS中,将原有功能包集(Stack)的概念升级为“元功能包”,主要作用都是组织多个用于同一目的的功能包。例如一个ROS导航的元功能包中会包含建模、定位、导航等多个功能包。10.2.1
文件系统级元功能包清单:元功能包清单中可能会包含运行时需要依赖的功能包或者声明一些引用的标签。消息(Message)类型:消息是ROS节点之间发布/订阅的通信信息,可以使用ROS提供的消息类型,也可以使用.msg文件在功能包的msg文件夹下自定义所需要的消息类型。10.2.1
文件系统级服务(Service)类型:服务类型定义了ROS客户端/服务器通信模型下的请求与应答数据类型,可以使用ROS系统提供的服务类型,也可以使用.srv文件在功能包的srv文件夹中进行定义。代码(Code):用来放置功能包节点源代码的文件夹。10.2.2
计算图级计算图是ROS处理数据的一种点对点的网络形式。程序运行时,所有进程以及他们所进行的数据处理,将会通过一种点对点的网络形式表现出来。这一级主要包括几个重要概念:节点(node)、消息(message)、主题(topic)、服务(service)。1.节点节点就是一些直行运算任务的进程。ROS利用规模可增长的方式是代码模块化:一个系统就是典型的由很多节点组成的。在这里,节点也可以被称之为“软件模块”。我们使10.2.2
计算图级用“节点”使得基于ROS的系统在运行的时候更加形象化:当许多节点同时运行时,可以很方便的将端对端的通讯绘制成一个图表,在这个图表中,进程就是图中的节点,而端对端的连接关系就是其中弧线连接。2.消息节点之间通过传送消息进行通讯。每个消息都是一个严格的数据结构。原来标准的数据类型(整型,浮点型,布尔型等等)都支持,也支持原始数组类型。消息可以包含任意的嵌套结构和数组(很类似于C语言的结构structs)。10.2.2
计算图级3.话题消息以一种发布/订阅的方式传递。一个节点可在一个给定的主题中发布消息。一个节点针对某个主题关注与订阅特定类型的数据。可能同时有多个节点发布或者订阅同一主题消息。总体上,发布者和订阅者不了解彼此的存在。10.2.2
计算图级话题通信示意图3.话题10.2.2
计算图级4.服务虽然基于话题的发布/订阅模型是很灵活的通讯模式,但是它广播式的路径规划对于可以简化节点设计的同步传输模式并不适合。在ROS中,称这种同步传输为服务,其基于客户端/服务器模型。包含两个部分的通信数据类型:一个用于请求,一个用于回应。这类似于web服务器,web服务器是由URIs定义的,同时带有完整定义类型的请求和回复文档。需要注意的是,不像话题,ROS中只有一个节点可以以任意独有的名字广播一个服务。10.2.2
计算图级4.服务服务通信示意图10.2.2
计算图级5.节点管理器需要有一个控制器可以使所有节点有条不紊的执行,这就是一个ROS的控制器(ROSMaster)。ROSMaster通过RPC(RemoteProcedureCallProtocol,远程过程调用)提供了登记列表和对其他计算图表的查找。帮助ROS节点之间互相查找、建立连接、提供参数服务器等功能。10.2.2
计算图级5.节点管理器ROS的控制器给ROS的节点存储了主题和服务的注册信息。节点与控制器通信从而报告它们的注册信息。当这些节点与控制器通信的时候,它们可以接收关于其他以注册及节点的信息并且建立与其它以注册节点之间的联系。当这些注册信息改变时控制器也会回馈这些节点,同时允许节点动态创建与新节点之间的连接。没有控制器,节点将无法找到其他节点,交换消息或调用服务。10.2.3
社区级发行版(Distribution):类似于Linux发行版,ROS发行版包括一系列带有版本号、可以直接安装的功能包,这使得ROS的软件管理和安装更加容易,而且可以通过软件集合来维持统一的版本号。软件源(Repository):ROS依赖于共享网络上的开源代码,不同组织结构可以开发或者共享自己的机器人软件。ROSwiki:记录ROS信息文档的主要论坛。所有人都可以注册、登录该论坛,并且上传自己的开发文档、进行更新、编写教程。10.2.3
社区级邮件列表(MailingList):ROS邮件列表是交流ROS更新的主要渠道,同时也可以交流ROS开发的各种疑问。ROSAnswers:ROSAnswers是一个咨询ROS相关问题的网站,用户可以在该网站提交自己的问题并得到其他开发者的问答。博客(Blog):发布ROS社区中的新闻、图片、视频(/news)。10.3
ROS基本命令与功能包10.3.1ROS文件系统命令1.rospack允许您获取有关软件包的信息用$rospackfind[package_name]命令返回包的绝对路径2.roscd是rosbash套件中的一部分,利用它可以改变路径到指定的功能包或功能包集中,命令形式为$roscd[locationname[/subdir]]。3.rosls也是rosbash套件的一部分,它可以通过功能包的名称列出其下面包含的文件,而不必使用绝对路径;10.3.1
ROS文件系统命令$rosls[locationname[/subdir]]4.Tab键补全;输入完整的软件包名称可能很麻烦。ROS工具支持在输入功能包开头后TAB键完成补全。10.3.2Topic相关操作命令rostopic工具允许获取ROStopics的相关信息。键入rostopic-h,可以知道话题相关的如下命令:rostopicbw显示话题使用的带宽、rostopicdelay显示话题的延迟、rostopicecho显示话题的数据、rostopicfind查找指定话题10.3.2
Topic相关操作命令类型的话题、rostopichz显示话题发布频率、rostopicinfo显示活动话题信息、rostopiclist列出活动话题、rostopicpub向话题发布数据、rostopictype显示话题类型。1.rostopicecho显示发布在一个话题上的数据。可以利用$rostopicecho[topic]命令看一下由turtle_teleop_key发布的command_velocity数据。$rostopicecho/turtle1/cmd_vel则是通过键盘操控小乌龟进行移动,通过按下方向键来使turtle_teleop_key节点在此topic上发布数据。10.3.2
Topic相关操作命令1.rostopicecho显示发布在一个话题上的数据。rostopicecho显示话题数据10.3.2
Topic相关操作命令2.rostopiclist命令显示当前被订阅和被发布主题列表据。rostopiclist显示话题10.3.2
Topic相关操作命令3.rostopictype返回正在使用的主题上的信息的类型。命令格式为$rostopictype[topic],使用$rostopictype/turtle1/cmd_vel命令查看小乌龟话题的信息类型。rostopictype返回的小乌龟话题信息类型10.3.2
Topic相关操作命令4.rostopicpub直接发布数据到一个话题通过$rostopicpub[topic][msg_type][args]命令向小乌龟话题发送一个运动指令,具体形式为$rostopicpub-1/turtle1/cmd_velgeometry_msgs/Twist--'[2.0,0.0,0.0]''[0.0,0.0,1.8]'。10.3.2
Topic相关操作命令4.rostopicpub直接发布数据到一个话题通过$rostopicpub[topic][msg_type][args]命令向小乌龟话题发送一个运动指令,$rostopicpub-1/turtle1/cmd_velgeometry_msgs/Twist--'[2.0,0.0,0.0]''[0.0,0.0,1.8]'。小乌龟按照rostopicpub发送的运动指令运动10.3.3
Service相关操作命令Service相关操作命令有rosservicelist显示活动的服务信息、rosserviceinfo显示指定服务的信息、rosservicetype显示服务类型、rosservicefind查找指定服务类型的服务、rosserviceuri显示ROSRPCURI服务、rosserviceargs显示服务参数、rosservicecall用输入的参数请求服务。10.3.3
Service相关操作命令1.rosservicelist显示活动中的服务的信息rosservicelist会显示在同一网络中使用的所有服务。rosservicelist显示活动中的服务的信息10.3.3
Service相关操作命令2.rosserviceinfo显示指定服务的信息命令形式Wie$rosserviceinfo[服务名称],以下是使用rosservice的info选项查看/turtle1/set_pen服务的节点名称、URI、类型和参数的示例。rosserviceinfo显示指定服务的信息10.3.3
Service相关操作命令3.rosservicetype显示服务类型命令形式$rosservicetype[服务名称],可以看到/turtle1/set_pen服务是turtlesim/SetPen类型。rosservicetype显示服务类型10.3.4
catkin程序包所有的ROS程序都被组织成功能包,存放在称之为工作空间的目录下。工作空间是一个存放工程开发相关文件的文件夹,典型的工作空间一般包括以下四个目录空间:src:代码空间,用来存储所有的ROS功能包的源码文件。build:编译空间,用来存储工作空间编译过程中生成的缓存信息等;devel:开发空间,放置编译生成的可执行文件。install:安装空间。在写程序之前第一步是创建一个工作空间以容纳功能包。10.3.4
catkin程序包1.创建工作空间目录,然后运行ROS工作空间初始化命令即可完成工作空间的创建。代码如下:$mkdir-p~/catkin_ws/src$cd~/catkin_ws/src$catkin_init_workspace2.创建完成后,需要在工作空间根目录下用catkin_make命令进行编译;代码如下:$cd~/catkin_ws/$catkin_make10.3.4
catkin程序包3.设置环境变量用$sourcedevel/setup.bash设置环境变量。4.检查环境变量用$echo$ROS_PACKAGE_PATH检查环境变量。至此,工作空间就创建成功了,接下来就开始创建catkin功能包,一个catkin功能包的组成如下:该功能包必须包含catkincompliantpackage.xml文件,这个package.xml文件提供有关程序包的元信息。10.3.4
catkin程序包该功能包也必须包含一个catkin版本的CMakeLists.txt文件,而Catkinmetapackages中必须包含一个对CMakeList.txt文件的引用。每个目录下只能有一个程序包,这意味着在同一个目录下不能有嵌套的或者多个程序包存在。最简单的功能包的形式如下:my_package/CMakeLists.txtpackage.xml10.3.4
catkin程序包ROS提供直接创建功能包的命令catkin_creat_pkg,首先进入代码空间,使用catkin_creat_pkg命令创建功能包:$cd~/catkin_ws/src$catkin_create_pkg<package_name>[depend1][depend2][depend3]用户需要输入功能包的名称(package_name)和所依赖的其他功能包的名称[depend1][depend2][depend3]。10.3.4
catkin程序包创建完成后,再返回到工作空间根目录下进行编译,并且设置环境变量,代码如下:$cd~/catkin_ws/$catkin_make$source~/catkin_ws/devel/setup.bash这样就成功创建了工作空间并在工作空间中创建了功能包。10.3.5
基于TurtleBot的移动机器人ROS基本设置TurtleBot是给入门级的移动机器人爱好者或从事移动机器人编程开发者提供一个基础移动平台,是ROS中最为重要的机器人之一,可以在ROS社区中获得大量关于TurtleBot的相关资源,很多功能包都能直接复用到个人自己开发的移动机器人平台上。TurtleBot移动平台主要包括kobuki移动底座以及Kinect2视觉传感器,kobuki移动底座作为移动机器人下位机,使用者自己配置的PC机作为上位机。ROS系统安装在上位机上。10.3.5
基于TurtleBot的移动机器人ROS基本设置在ROS中使用Turtlebot,需要在安装了ROS的上位机上安装Turtlebot相关的所有功能包,打开终端,运行如下命令进行安装:1.更新功能包列表运行$sudoapt-getupdate命令。2.安装所有功能包运行$sudoapt-getinstallros-indigo-turtlebotros-indigo-turtlebot-appsros-indigo-turtlebot-interactionsros-indigo-turtlebot-simulatorros-indigo-kobuki-ftdiros-indigo-rocon10.3.5
基于TurtleBot的移动机器人ROS基本设置-remoconros-indigo-rocon-qt-libraryros-indigo-ar-track-alvar-msgs命令。将TurtleBot本体通过USB串口与安装了ROS以及TurtleBot功能包的上位机进行连接,在上位机中通过ROS遥控TurtleBot进行移动。具体步骤如下:(1)打开一个新终端,键入$roscore,启动ROS;(2)按下Turtlebot启动开关,状态点亮;10.3.5
基于TurtleBot的移动机器人ROS基本设置(3)建立Turtlebot与上位机的联系,在上位机打开一个新终端,运行如下命令:$roslaunchturtlebot_bringupminimal.launch;(4)启动键盘遥控节点,在上位机打开另一个新终端,运行如下命令:$roslaunchturtlebot_teleopkeyboard_teleop.launch;(5)按下键盘“i”前进,实现对移动机器人的基本操控。10.4
基于ROS的移动机器人功能仿真10.4.1建立仿真环境在上位机上,打开终端,输入$gazebo打开gazebo;进入gazebo后使用快捷键Ctrl+B或者菜单栏选择Edit->buildingeditor,进入创建建筑的界面10-36,可以选择简单的墙和窗户和门。点击左上角菜单栏file->save然后点击Exitbuildingeditor进入gazebo主界面,然后继续点击file->saveworldas保存的.world文件后面要使用,到这里,gazebo的仿真环境搭建完成。10.4.1
建立仿真环境建立仿真环境10.4.2
地图创建与自主导航ROS开源社区中汇集了多种SLAM算法,可以直接使用或者进行二次开发,其中最为常用和成熟的是gmapping功能包。gmapping功能包订阅机器人采集的深度信息、IMU信息和里程计信息,同时完成一些必要的参数配置,即可创建并输出基于概率的二维栅格地图。在建立的仿真环境中通过gampping功能包进行建图,建图部分的仿真流程如下:1.通过如下命令安装gmapping功能包:$sudoapt-getinstallros-indigo-gmapping10.4.2
地图创建与自主导航2.创建mrobot_gazebo功能包,里面包含world文件夹存放创建的仿真环境文件,urdf文件夹存放机器人模型文件,launch文件夹存放节点启动文件。3.搭建移动机器人的仿真模型,首先搭建一个移动机器人底盘模型,将该底盘模型文件命名为mrobot_body.urdf.xacro,它定义了该移动机器人底盘的各个关节如轮子,电机等,同时也设定了它们的运行转速、转角等参数。10.4.2
地图创建与自主导航移动机器人底盘模型10.4.2
地图创建与自主导航4.为移动机器人底盘安装仿真的激光雷达,用于gmapping建图,激光雷达的模型文件为rplidar.xacro。5.将激光雷达模型与移动机器人底盘模型搭建在一起,将安装了激光雷达的移动机器人模型文件命名为mrobot_with_rplidar.urdf.xacro。6.通过mbot_laser_nav_gazebo.launch文件启动仿真环境,实现在gazebo中加载搭建的仿真环境以及移动机器人模型,mbot_laser_nav_gazebo.launch文件内容如下:<launch>10.4.2
地图创建与自主导航<!--设置launch文件的参数--><argname="world_name"value="$(findmrobot_gazebo)/worlds/cloister.world"/><argname="paused"default="false"/><argname="use_sim_time"default="true"/><argname="gui"default="true"/><argname="headless"default="false"/><argname="debug"default="false"/>10.4.2
地图创建与自主导航<!--运行gazebo仿真环境--><includefile="$(findgazebo_ros)/launch/empty_world.launch"><argname="world_name"value="$(argworld_name)"/><argname="debug"value="$(argdebug)"/><argname="gui"value="$(arggui)"/><argname="paused"value="$(argpaused)"/><argname="use_sim_time"value="$(arg10.4.2
地图创建与自主导航use_sim_time)"/><argname="headless"value="$(argheadless)"/></include><!--加载机器人模型描述参数--><paramname="robot_description"command="$(findxacro)/xacro--inorder'$(findmrobot_gazebo)/urdf/mrobot_with_rplidar.urdf.xacro'"/><!--运行joint_state_publisher节点,发布机器人的关节10.4.2
地图创建与自主导航状态--><nodename="joint_state_publisher"pkg="joint_state_publisher"type="joint_state_publisher"></node><!--运行robot_state_publisher节点,发布tf--><nodename="robot_state_publisher"pkg="robot_state_publisher"type="robot_state_publisher"output="screen"><paramname="publish_frequency"type="double"10.4.2
地图创建与自主导航value="50.0"/></node><!--在gazebo中加载机器人模型--><nodename="urdf_spawner"pkg="gazebo_ros"type="spawn_model"respawn="false"output="screen"args="-urdf-modelmrobot-paramrobot_description"/></launch>代码中的cloister.world就是上一节创建的仿真环境。10.4.2
地图创建与自主导航使用$roslaunchmbot_gazebombot_laser_nav_gazebo.launch命令运行以上launch文件,启动gazebo仿真环境。gazebo中显示移动机器人模型10.4.2
地图创建与自主导航8.调用gampping进行建图。首先编写gmapping功能包的启动文件gmapping.launch,该launch文件中设置了功能包的节点以及gmapping建图的配置参数。9.打开一个新的终端,通过运行gmapping_demo.launch文件,启动上面创建的gampping节点并启动rviz查看传感器和地图构建的实时信息。gmapping_demo.launch文件内容如下:<launch>10.4.2
地图创建与自主导航<includefile="$(findmbot_gazebo)/launch/gmapping.launch"/><!--启动rviz--><nodepkg="rviz"type="rviz"name="rviz"args="-d$(findmbot_gazebo)/rviz/gmapping.rviz"/></launch>通过命令$roslaunchmbot_gazebogmapping_demo.launch运行以上的launch文件,启动gmapping节点和rviz界面。10.4.2
地图创建与自主导航地图构建的实时信息10.4.2
地图创建与自主导航运行到这里后gazebo和rviz就都已经启动了,移动机器人模型在gazebo和rivz中同步显示,rviz中实时显示移动机器人搭载的雷达在仿真环境中扫描建图效果,其中红色的点是激光雷达传感器实时检测到的仿真环境的深度信息,浅灰色区域为根据当前深度信息建立的部分环境地图。10.4.2
地图创建与自主导航
10.启动键盘控制节点,打开一个新终端,运行mbot_teleop.launch文件。mbot_teleop.launch文件内容如下:<launch><nodename="mrobot_teleop"pkg="mrobot_teleop"type="mrobot_teleop.py"output="screen"><paramname="scale_linear"value="0.1"type="double"/><paramname="scale_angular"value="0.4"10.4.2
地图创建与自主导航
type="double"/></node></launch>通过如下命令启动以上launch文件,打开键盘控制节点:$roslaunchmbot_gazebombot_teleop.launch可以看到文件提示,通过键盘"u、i、o、j、k、l、m"这九个按钮来控制移动机器人的运动,扫描出的完整地图10.4.2
地图创建与自主导航gmapping中通过键盘完整的扫描地图10.4.2
地图创建与自主导航
11.通过使用键盘控制移动机器人运动,绕房间模型一周。可以通过$rosrunmap_servermap_saver-fhouse_gmapping命令,保存地图.pgm文件和.yaml文件。命令最后这里cloister_gmapping为自己命名的文件名。通过命令生成的地图10.4.2
地图创建与自主导航
在gazebo中实现自主导航仿真的整体思路:首先启动gazebo仿真环境,然后启动move_base导航功能节点,仿真流程如下:(1)通过下列命令安装导航功能包。$sudoapt-getinstallros-indigio-navigation(2)创建mrobot_navigation功能包,里面包含map文件夹存放上一节gmapping构建的地图,launch文件夹存放导航节点启动文件,config文件夹存放代价地图配置文件;10.4.2
地图创建与自主导航
(3)启动gazebo仿真环境和之前使用激光雷达建图的仿真环境相同,所以依然使用mbot_laser_nav_gazebo.launch文件启动仿真环境:$roslaunchmbot_gazebombot_laser_nav_gazebo.launch(4)接下来通过代价地图配置文件创建move_base导航节点启动文件move_base.launch,代价地图配置文件内容如下:10.4.2
地图创建与自主导航
1)通用配置文件costmap_common_params.yamlobstacle_range:2.5raytrace_range:3.0#footprint:[[0.175,0.175],[0.175,-0.175],[-0.175,-0.175],[-0.175,0.175]]#footprint_inflation:0.01robot_radius:0.175inflation_radius:0.1max_obstacle_height:0.610.4.2
地图创建与自主导航
min_obstacle_height:0.0observation_sources:scanscan:{data_type:LaserScan,topic:/scan,marking:true,clearing:true,expected_update_rate:0}2)全局规划配置文件global_costmap_params.yamlglobal_costmap:global_frame:maprobot_base_frame:base_footprintupdate_frequency:1.010.4.2
地图创建与自主导航
publish_frequency:1.0static_map:truerolling_window:falseresolution:0.01transform_tolerance:1.0map_type:costmap3)本地规划配置文件local_costmap_params.yamllocal_costmap:global_frame:map10.4.2
地图创建与自主导航
robot_base_frame:base_footprintupdate_frequency:3.0publish_frequency:1.0static_map:truerolling_window:falsewidth:6.0height:6.0resolution:0.01transform_tolerance:1.010.4.2
地图创建与自主导航4)本地规划期配置文件base_local_planner_params.yamlcontroller_frequency:3.0recovery_behavior_enabled:falseclearing_rotation_allowed:falseTrajectoryPlannerROS:max_vel_x:0.5min_vel_x:0.1max_vel_y:0.0#zeroforadifferentialdriverobotmin_vel_y:0.010.4.2
地图创建与自主导航
max_vel_theta:1.0min_vel_theta:-1.0min_in_place_vel_theta:0.4escape_vel:-0.1acc_lim_x:1.5acc_lim_y:0.0#zeroforadifferentialdriverobotacc_lim_theta:1.2holonomic_robot:false10.4.2
地图创建与自主导航
yaw_goal_tolerance:0.1#about6degreesxy_goal_tolerance:0.05#5cmlatch_xy_goal_tolerance:falsepdist_scale:0.4gdist_scale:0.8meter_scoring:trueheading_lookahead:0.325heading_scoring:false10.4.2
地图创建与自主导航
heading_scoring_timestep:0.8occdist_scale:0.05oscillation_reset_dist:0.05publish_cost_grid_pc:falseprune_plan:truesim_time:1.0sim_granularity:0.05angular_sim_granularity:0.110.4.2
地图创建与自主导航
vx_samples:8vy_samples:0#zeroforadifferentialdriverobotvtheta_samples:20dwa:truesimple_attractor:false接下来根据这四个代价地图配置文件构建move_base.launch文件内容如下:<launch>10.4.2
地图创建与自主导航<nodepkg="move_base"type="move_base"respawn="false"name="move_base"output="screen"clear_params="true"><rosparamfile="$(findmrobot_navigation)/config/mrobot/costmap_common_params.yaml"command="load"ns="global_costmap"/><rosparamfile="$(findmrobot_navigation)/config/mrobot/costmap_common_params.yaml"command="load"ns="local_costmap"/>10.4.2
地图创建与自主导航<rosparamfile="$(findmrobot_navigation)/config/mrobot/local_costmap_params.yaml"command="load"/><rosparamfile="$(findmrobot_navigation)/config/mrobot/global_costmap_params.yaml"command="load"/><rosparamfile="$(findmrobot_navigation)/config/mrobot/base_local_planner_params.yaml"command="load"/>10.4.2
地图创建与自主导航</node>
</launch>5)仿真环境和move_base导航节点都配置好后,创建一个启动move_base导航节点并加载环境地图的的launch文件fake_nav_cloister_demo.launch,fake_nav_cloister_demo.launch文件内容如下:<launch>10.4.2
地图创建与自主导航
<!--设置地图的配置文件--><argname="map"default="cloister_gmapping.yaml"/><!--运行地图服务器,并且加载设置的地图--><nodename="map_server"pkg="map_server"type="map_server"args="$(findmrobot_navigation)/maps/$(argmap)"/>10.4.2
地图创建与自主导航
<!--运行move_base节点--><includefile="$(findmrobot_navigation)/launch/move_base.launch"/><!--运行虚拟定位,兼容AMCL输出--><nodepkg="fake_localization"type="fake_localization"name="fake_localization"output="screen"/>10.4.2
地图创建与自主导航
<!--对于虚拟定位,需要设置一个/odom与/map之间的静态坐标变换--><nodepkg="tf"type="static_transform_publisher"name="map_odom_broadcaster"args="000000/map/odom100"/><!--运行rviz--><nodepkg="rviz"type="rviz"name="rviz"args="-d$(findmrobot_navigation)/rviz/nav.rviz"/></launch>10.4.2
地图创建与自主导航
通过命令$roslaunchmbot_navigationfake_nav_cloister_demo.launch启动launch文件,导航结果图如图:根据目标点自动导航10.5
ROS中移动机器人技术相关应用10.5.1开源机器视觉技术在ROS中的应用OpenCV是一个基于许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和MacOS操作系统上。它由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令,也提供对于C#、Ch、Ruby、GO的支持。10.5.1
开源机器视觉技术在ROS中的应用OpenCV提供的视觉处理算法非常丰富,加上其开源的特性,处理得当,不需要添加新的外部支持也可以完整的编译链接生成执行程序,所以很多人用它来做算法的移植,OpenCV的代码经过适当改写可以正常的运行在ARM嵌入式系统中。在ubuntu下安装ubuntu版本的opencv,就可以在ROS中使用了。OpenCV已经集成了人脸识别算法,只需要调用OpenCV相应的接口就可以实现人脸识别的功能。下面运行以下人脸识别的例程感受以下它的效果。10.5.1
开源机器视觉技术在ROS中的应用1.创建robot_vision功能包,里面包含scripts文件夹存放图像处理所需的python文件,launch文件夹存放节点启动文件;2.首先使用以下命令启动USB摄像头或者是笔记本自带的摄像头:$roslaunchrobot_visionusb_cam.launch其中usb_cam.launch文件内容如下:<launch>10.5.1
开源机器视觉技术在ROS中的应用<nodename="usb_cam"pkg="usb_cam"type="usb_cam_node"output="screen"><paramname="video_device"value="/dev/video0"/><paramname="image_width"value="640"/><paramname="image_height"value="480"/><paramname="pixel_format"value="yuyv"/><paramname="camera_frame_id"value="usb_cam"/><paramname="io_method"value="mmap"/>10.5.1
开源机器视觉技术在ROS中的应用</node></launch>3.启动好相机后,然后编写源码来实现人脸识别,该应用的实现代码只有一个python文件,即运行face_detector.py,直接调用OpenCV提供的人脸识别接口,与数据库中的人脸特征进行匹配。(1)face_detector.py文件内容如下:10.5.1
开源机器视觉技术在ROS中的应用#!/usr/bin/envpython#-*-coding:utf-8-*-importrospyimportcv2importnumpyasnpfromsensor_msgs.msgimportImage,RegionOfInterestfromcv_bridgeimportCvBridge,CvBridgeErrorclassfaceDetector:10.5.1
开源机器视觉技术在ROS中的应用def__init__(self):rospy.on_shutdown(self.cleanup);#创建cv_bridgeself.bridge=CvBridge()self.image_pub=rospy.Publisher("cv_bridge_image",Image,queue_size=1)#获取haar特征的级联表的XML文件,文件路径在10.5.1
开源机器视觉技术在ROS中的应用launch文件中传入cascade_1=rospy.get_param("~cascade_1","")cascade_2=rospy.get_param("~cascade_2","")#使用级联表初始化haar特征检测器self.cascade_1=cv2.CascadeClassifier(cascade_1)self.cascade_2=cv2.CascadeClassifier(cascade_2)#设置级联表的参数,优化人脸识别,可以在launch10.5.1
开源机器视觉技术在ROS中的应用文件中重新配置self.haar_scaleFactor=rospy.get_param("~haar_scaleFactor",1.2)self.haar_minNeighbors=rospy.get_param("~haar_minNeighbors",2)self.haar_minSize=rospy.get_param("~haar_minSize",40)self.haar_maxSize=rospy.get_param("~haar_maxSize",60)10.5.1
开源机器视觉技术在ROS中的应用self.color=(50,255,50)#初始化订阅rgb格式图像数据的订阅者,此处图像topic的话题名可以在launch文件中重映射self.image_sub=rospy.Subscriber("input_rgb_image",Image,self.image_callback,queue_size=1)defimage_callback(self,data):10.5.1
开源机器视觉技术在ROS中的应用#使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式try:cv_image=self.bridge.imgmsg_to_cv2(data,"bgr8")frame=np.array(cv_image,dtype=np.uint8)exceptCvBridgeError,e:printe10.5.1
开源机器视觉技术在ROS中的应用#创建灰度图像grey_image=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#创建平衡直方图,减少光线影响grey_image=cv2.equalizeHist(grey_image)#尝试检测人脸faces_result=self.detect_face(grey_image)10.5.1
开源机器视觉技术在ROS中的应用#在opencv的窗口中框出所有人脸区域iflen(faces_result)>0:forfaceinfaces_result:x,y,w,h=facecv2.rectangle(cv_image,(x,y),(x+w,y+h),self.color,2)#将识别后的图像转换成ROS消息并发布10.5.1
开源机器视觉技术在ROS中的应用self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image,"bgr8"))defdetect_face(self,input_image):#首先匹配正面人脸的模型ifself.cascade_1:faces=self.cascade_1.detectMultiScale(input_image,self.haar_scaleFactor,10.5.1
开源机器视觉技术在ROS中的应用self.haar_minNeighbors,cv2.CASCADE_SCALE_IMAGE,(self.haar_minSize,self.haar_maxSize))
#如果正面人脸匹配失败,那么就尝试匹配侧面人脸的模型iflen(faces)==0andself.cascade_2:faces=self.cascade_2.detectMultiScale(input_image,10.5.1
开源机器视觉技术在ROS中的应用self.haar_scaleFactor,self.haar_minNeighbors,cv2.CASCADE_SCALE_IMAGE,(self.haar_minSize,self.haar_maxSize))
returnfacesdefcleanup(self):print"Shuttingdownvisionnode."10.5.1
开源机器视觉技术在ROS中的应用cv2.destroyAllWindows()if__name__=='__main__':try:#初始化ros节点rospy.init_node("face_detector")faceDetector()rospy.loginfo("Facedetectorisstarted..")rospy.loginfo("PleasesubscribetheROSimage.")10.5.1
开源机器视觉技术在ROS中的应用rospy.spin()exceptKeyboardInterrupt:print"Shuttingdownfacedetectornode."cv2.destroyAllWindows()(2)编写启动文件face_d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高考物理总复习专题十二机械振动光学第4讲光的波动性、电磁波练习含答案
- 果蔬生鲜供应合约
- 吉林省通化市外国语学校九年级化学上册 第二单元 活动1 氧气的实验室制取与性质教案 (新版)新人教版
- 二年级道德与法治上册 第三单元 1《我爱秋天》教案2 浙教版
- 高中数学 第三章 指数函数、对数函数和幂函数 3.1.1 分数指数幂(2)教案 苏教版必修1
- 2024-2025学年新教材高中英语 Unit 1 Knowing me Knowing you泛读 技能初养成教案 外研版必修第三册
- 2024-2025学年八年级物理下册 第十一章 功和机械能 第1节 功教案 (新版)新人教版
- 高中语文 第7课 李清照词两首-声声慢教案2 新人教版必修4
- 2023七年级地理上册 第三章 天气与气候 第一节 多变的天气说课稿 (新版)新人教版
- 文书模板-买卖合同的构成要素
- 办理电信业务的委托书
- 2024年网上大学智能云服务交付工程师认证考试题库800题(含答案)
- 知道网课智慧树《盆景学(西南大学)》章节测试答案
- 《水土保持技术》课件-项目八 拦渣措施
- 机动车检测站违规检验整改报告
- 中国书法艺术 知到智慧树网课答案
- 2024年建筑电工复审考试题库附答案
- 2024年4月自考04737C++程序设计试题及答案含评分参考
- 睡眠医学智慧树知到期末考试答案章节答案2024年广州医科大学
- GB/T 17259-2024机动车用液化石油气钢瓶
- 国开(河北)2024年《中外政治思想史》形成性考核1-4答案
评论
0/150
提交评论