智能机器人技术 课件 项目9智能机器人的GPS_第1页
智能机器人技术 课件 项目9智能机器人的GPS_第2页
智能机器人技术 课件 项目9智能机器人的GPS_第3页
智能机器人技术 课件 项目9智能机器人的GPS_第4页
智能机器人技术 课件 项目9智能机器人的GPS_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

授课老师:连国云项目9:智能机器人的GPS《智能机器人技术》课程任务要求知识导入任务实施任务评价通过TF的广播器和监听器实现智能机器人的跟随运动,使用一个launch文件实现所有节点的启动工作,进行智能机器人的操作。任务要求知识导入任务实施任务评价ROS中的命名空间ROS中的node、topic、service、parameter等统称为计算图源,其命名方式采用灵活的分层结构,便于在复杂的系统中集成和复用。计算图源命名是ROS封装的一种重要机制。每个资源都定义在一个命名空间内,该命名空间内还可以创建更多资源。处于不同命名空间内的资源不仅可以在所处命名空间内使用,还可以在全局范围内访问。这种命名机制可以有效避免不同命名空间内的命名冲突。任务要求知识导入任务实施任务评价ROS中的命名空间一个有效的命名应该具备以下特点:(1)首字符必须是字母([a-z],[A-Z])、波浪线(~)、或者左斜杆(/)(2)后续字符可以是字母或数字([a-z],[A-Z],[0-9])、下划线(_)或者左斜杠(/)计算图源的名称可以分为以下四种:(1)基础(base)名称,例如cmd_vel(2)全局(global)名称,例如/turtle1/cmd_vel(3)相对(relative)名称,例如:turtle1/cmd_vel(4)私有(private)名称,例如:~turtle1/cmd_vel任务要求知识导入任务实施任务评价ROS中的命名空间基础名称用来描述资源本身,可以看作相对名称的一个子类,上述示例中的cmd_vel就是一个基础名称。首字符是左斜杠(/)的名称为全局名称,由左斜杠分开一系列命名空间,示例中的命名空间为global。全局名称之所以称为全局,是因为它的解析度最高,可以在全局范围内直接访问。但是在系统中全局名称越少越好,因为过多的全局名称会直接影响功能包的可移植性。任务要求知识导入任务实施任务评价ROS中的命名空间相对名称由ROS提供默认命名空间,不需要带有开头的左斜杠。例如在默认命名空间/relative内使用相对名称name,解析到全局名称为/relative/name。相比全局名称,相对名称具备良好的移植性,用户可以直接将一个相对命名的节点移植到其他命名空间内,有效防止命名冲突。任务要求知识导入任务实施任务评价ROS中的命名空间私有名称是一个节点内部私有的资源名称,只会在节点内部使用。私有名称以波浪线“~”开始,与相对名称一样,并不包含本身所在的命名空间,需要ROS为其解析;但不同的是,私有名称不使用当前默认命名空间,而是用节点的全局名称作为命名空间。例如有一个节点的全局名称是/sim1/pubvel,其中的私有名称~max_vel解析成全局名称即为/sim1/pubvel/max_vel。任务要求知识导入任务实施任务评价ROS中的launch文件通常一个机器人运行时要开启很多节点,一个节点接一个节点地启动比较麻烦。通过launch文件以及roslaunch命令,可以一次性启动多个节点,并且可以设置丰富的参数,大大提高了ROS系统的操作方便性和效率。任务要求知识导入任务实施任务评价ROS中的launch文件ROS中的launch文件本质上是一种xml文件,主要由标签(tag)组成,在tag中指定相应的指令内容。作为一种xml文件,在launch文件的头部可以添加版本号<?xmlversion="1.0"?>任务要求知识导入任务实施任务评价ROS中的launch文件launch文件的tag主要包括以下几个部分:<rosparam>:加载yaml文件中的参数到参数服务器<arg>:定义变量<remap>:设定topic映射<group>:设定分组</launch>:根标签<launch>:根标签<node>:需要启动的node及其参数<include>:包含其他launch<machine>:指定运行的机器<env-loader>:设置环境变量<param>:定义参数到参数服务器任务要求知识导入任务实施任务评价ROS中的launch文件1.<launch>XML文件必须包括一个根元素,launch文件中的根元素采用<launch>标签定义,文件中的其他内容都必须包含在这个标签中:<launch>…</launch>任务要求知识导入任务实施任务评价ROS中的launch文件2.<node>launch文件的核心是启动ROS节点,而这一功能主要是通过<node>标签实现的,其语法主要结构如下:<nodepkg="package_name"type="executable_file"name="node_name1"/>任务要求知识导入任务实施任务评价ROS中的launch文件从上面的定义规则可以看出,在launch文件中启动一个节点需要三个属性:pkg、type和namepkg:节点所在的package名称type:package中的可执行文件,如果是python或者Julia编写的,就可能是.py或者.jl文件,如果是C++编写的,就是源文件编译之后的可执行文件的名字name:是节点启动之后的名字,每一个节点都要有自己独一无二的名字任务要求知识导入任务实施任务评价ROS中的launch文件roslaunch不能保证node的启动顺序,因此launch文件中所有的node都应该对启动顺序有鲁棒性。下面是一个典型的launch文件<launch><nodepkg="turtlesim"

type="turtlesim_node"

name="sim_node1"><nodepkg="turtlesim"

type="turtlesim_node"name="sim_node2"></launch>任务要求知识导入任务实施任务评价ROS中的launch文件除了这三个最常用的属性之外,我们还可能用到以下属性:output:指定节点标准输出的终端,该属性默认输出的终端是日志文档,也可以指定为“screen”等其他终端;respawn:指定节点复位属性,bool型变量,该属性默认为false,当指定为“true”时,该节点停止时,会自动重启,当为“false”时则不会重启;任务要求知识导入任务实施任务评价ROS中的launch文件required:指定节点是否为必要节点,bool型变量,该属性默认为false,当指定为“true”时,该节点停止时,其他节点也会停止,当为“false”时其他节点则不会停止;ns:指定命名空间,通过该属性为节点内的相对名称添加命名空间前缀;args:指定节点需要的输入参数。任务要求知识导入任务实施任务评价ROS中的launch文件3.<param>parameter是ROS系统运行中的参数,存储在参数服务器中。在launch文件中通过<param>标签加载parameter;launch文件执行后,parameter就加载到ROS的参数服务器上了。每个活跃的节点都可以通过ros::param::get()接口来获取parameter的值,用户也可以在终端通过rosparam命令获得parameter值。任务要求知识导入任务实施任务评价ROS中的launch文件<param>的语法格式如下:<paramname=”param_name”value=”param_value”/>例如,<paramname=”out_frame”value=”odom”/>运行launch文件后,output_frame这个parameter的值就设置为odom,并且加载到ROS参数服务器上了。任务要求知识导入任务实施任务评价ROS中的launch文件4.<arg><arg>可以指定launch文件中变量,在这其中指定的变量类似于局部变量,仅限于launch文件使用,便于launch文件的重构,与ROS节点内部的实现并无关系。<arg>的语法格式如下:<argname=”arg_name”default=”arg_value”>任务要求知识导入任务实施任务评价ROS中的launch文件5.<remap>ROS系统中提供了一种重映射机制,其本质是在不修改其他用户开发的功能包接口的条件下,只是将相应的接口的名称进行重新命名,这时系统可以通过新的别名对相应的软件资源进行识别。在launch文件中提供了<remap>标签,可以实现重映射机制。<remap>的语法格式如下:<remapfrom=”original_name”to=”re_name”>任务要求知识导入任务实施任务评价ROS中的launch文件6.<include>在复杂的系统中,launch文件之间有可能存在相互之间的依赖关系,在launch文件中提供了<include>标签,可以解决在一个launch文件中复用另外一个launch文件的内容的功能需求。<include>的语法格式如下:<includefile=”$(dirname)/other.launch”/>任务要求知识导入任务实施任务评价创建TF的广播器由于机器人是运动的,不同坐标系之间的变换关系是随时间变化的,此外由于涉及相关控制和计算过程,无论是机器人的开发者还是使用者都需要实时掌握这种变换关系,在ROS系统中主要是通过TF广播器(broadcaster)来实现的。任务要求知识导入任务实施任务评价#!/usr/bin/envpython#-*-coding:utf-8-*-#该例程将请求/show_person服务,服务数据类型learning_service::Person

import

roslibroslib.load_manifest('learning_tf')import

rospy

import

tfimport

turtlesim.msg任务要求知识导入任务实施任务评价def

handle_turtle_pose(msg,turtlename):br=tf.TransformBroadcaster()br.sendTransform((msg.x,msg.y,0),tf.transformations.quaternion_from_euler(0,0,msg.theta),rospy.Time.now(),turtlename,

"world")任务要求知识导入任务实施任务评价if__name__==

'__main__':rospy.init_node('turtle_tf_broadcaster')turtlename=rospy.get_param('~turtle')rospy.Subscriber('/%s/pose'

%turtlename,turtlesim.msg.Pose,handle_turtle_pose,turtlename)rospy.spin()任务要求知识导入任务实施任务评价创建TF的广播器在该代码文件中,首先定义了handle_turtle_pose的callback函数,在callback函数中主要进行了如下操作:(1)br=tf.TransformBroadcaster()定义了TF的TransformBroadcaster的实例br;任务要求知识导入任务实施任务评价创建TF的广播器(2)br.sendTransform((msg.x,msg.y,0), tf.transformations.quaternion_from_euler(0,0,msg.theta), rospy.Time.now(), turtlename, "world")任务要求知识导入任务实施任务评价创建TF的广播器填充br实例中的相关数据,设定turtlename与“world”之间的坐标变化关系,其中平移关系为(msg.x,msg.y,0),旋转关系为Euler角模式,角度为(0,0,msg.theta),并把当前时间作为时间戳,turtle是需要传递所创建link的子坐标系名称,world需要传递所创建link的父坐标系名称。任务要求知识导入任务实施任务评价创建TF的广播器完成callback函数定义之后,该文件就定义了代码主体部分,在代码主体部分主要完成了以下操作:(1)rospy.init_node('turtle_tf_broadcaster')初始化turtle_tf_broadcaster节点;(2)turtlename=rospy.get_param('~turtle')节点获取turtle参数,这个指定一个turtle名,如"turtle1"or"turtle2";任务要求知识导入任务实施任务评价创建TF的广播器(3)rospy.Subscriber('/%s/pose'%turtlename, turtlesim.msg.Pose, handle_turtle_pose, turtlename)订阅由turtlebname参数指定的“/pose”的topic,并指定callback函数为handle_turtle_pose。任务要求知识导入任务实施任务评价创建TF的广播器通过以上代码可以看出TF的broadcaster定义主要有2个步骤:(1)通过订阅相应的topic,获得相应的msg信息,并指定callback函数(2)在callback函数中指定相应的broadcaster实例,封装相应的坐标转换信息,并指定父子坐标系任务要求知识导入任务实施任务评价创建TF的监听器TF坐标变换除了需要广播器之外,还需要监听器(listener),缓存系统中发布的所有坐标变换数据,并可以实现相应的查询。任务要求知识导入任务实施任务评价#!/usr/bin/envpython#-*-coding:utf-8-*-#该例程将请求/show_person服务,服务数据类型learning_service::Person

import

roslibroslib.load_manifest('learning_tf')import

rospyimport

mathimport

tfimport

geometry_msgs.msgimport

turtlesim.srv任务要求知识导入任务实施任务评价if__name__==

'__main__':rospy.init_node('turtle_tf_listener')

listener=tf.TransformListener()

rospy.wait_for_service('spawn')spawner=rospy.ServiceProxy('spawn',turtlesim.srv.Spawn)spawner(4,2,0,'turtle2')

turtle_vel=rospy.Publisher('turtle2/cmd_vel',geometry_msgs.msg.Twist,queue_size=1)

rate=rospy.Rate(10.0)任务要求知识导入任务实施任务评价while

notrospy.is_shutdown():

try:(trans,rot)=listener.lookupTransform('/turtle2','/turtle1',rospy.Time(0))

except(tf.LookupException,tf.ConnectivityException,tf.ExtrapolationException):

continue任务要求知识导入任务实施任务评价angular=

4

*math.atan2(trans[1],trans[0])linear=

0.5

*math.sqrt(trans[0]**

2

+trans[1]**

2)cmd=geometry_msgs.msg.Twist()cmd.linear.x=linearcmd.angular.z=angularturtle_vel.publish(cmd)

rate.sleep()任务要求知识导入任务实施任务评价创建TF的监听器(1)rospy.init_node('turtle_tf_listener')初始化turtle_tf_listener节点(2)listener=tf.TransformListener()定义了TF的TransformListener的实例listener任务要求知识导入任务实施任务评价创建TF的监听器(3)rospy.wait_for_service('spawn')spawner=rospy.ServiceProxy('spawn',turtlesim.srv.Spawn)spawner(4,2,0,'turtle2')创建服务处理句柄spawner,其中对应的服务为”spawn“,对应的srv类型为turtlesim.srv.Spawn,并按照turtlesim.srv.Spawn的srv的格式进行相应的数据封装。任务要求知识导入任务实施任务评价创建TF的监听器(4)turtle_vel=rospy.Publisher('turtle2/cmd_vel',geometry_msgs.msg.Twist,queue_size=1)发布一个名字为/turtle/cmd_vel的topic,消息类型为geometry_msgs.msg.Twist,队列长度为1(5)rate=rospy.Rate(10.0)指定循环体的循环频率任务要求知识导入任务实施任务评价创建TF的监听器(6)(trans,rot)=listener.lookupTransform('/turtle2','/turtle1',rospy.Time(0))得到从“/turtle1”

到“/turtle2”(from“turtle1”to“/turtle2”)的变换不可以把rospy.Time(0)改成rospy.Time.now(),因为监听不是实时的,会有几毫秒的延迟。rospy.Time(0)指最近时刻存储的数据,rospy.Time.now()则指当下任务要求知识导入任务实施任务评价创建TF的监听器(7)angular=4*math.atan2(trans[1],trans[0])linear=0.5*math.sqrt(trans[0]**2+trans[1]**2)cmd=geometry_msgs.msg.Twist()cmd.linear.x=linearcmd.angular.z=angularturtle_vel.publish(cmd)定义了一个Twist消息实例cmd,然后定义了x轴的线速度为linear,绕z轴的角速度为angular,并将这个msg发布出去任务要求知识导入任务实施任务评价创建TF的监听器(8)rate.sleep()根据之前rospy.Rate(10.0)的定义的发布话题频率进行延时控制,使循环体可以按照rospy.Rate(10.0)定义的频率进行循环。通过以上代码可以看出TF的listener定义主要就是通过listener.lookupTransform()进行实现的。任务要求知识导入任务实施任务评价根据任务要求,具体的工作任务实施步骤如下:(1)创建功能包。在前面的任务重已经指定catkin_ws为工作空间,在此仍然在此工作空间中创建功能包$

cd~/catkin_ws/src$catkin_create_pkgtransbot_tf_demorospyroscppstd_msgsgeometry_msgstf任务要求知识导入任务实施任务评价(2)创建launch和scripts文件夹

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论