机器人操作系统ROS原理及应用 课件汇 09 ROS文件系统与包管理工具 -30 可视化与仿真、31-32 复习与考试_第1页
机器人操作系统ROS原理及应用 课件汇 09 ROS文件系统与包管理工具 -30 可视化与仿真、31-32 复习与考试_第2页
机器人操作系统ROS原理及应用 课件汇 09 ROS文件系统与包管理工具 -30 可视化与仿真、31-32 复习与考试_第3页
机器人操作系统ROS原理及应用 课件汇 09 ROS文件系统与包管理工具 -30 可视化与仿真、31-32 复习与考试_第4页
机器人操作系统ROS原理及应用 课件汇 09 ROS文件系统与包管理工具 -30 可视化与仿真、31-32 复习与考试_第5页
已阅读5页,还剩250页未读 继续免费阅读

下载本文档

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

文档简介

ROS文件系统与包管理

一、ROS文件系统

二、ROS包管理

三、操作示例2024/11/292ROS文件系统一、ROS文件系统ROS的工程结构,也就是ROS的文件系统结构,是ROS软件开发项目的组织形式2024/11/294ROS文件系统也叫catkin工作空间Catkin工作空间是创建、修改、编译catkin软件包的目录。catkin的工作空间,里面存放着ROS的各种项目工程,便于系统组织管理调用。在可视化图形界面里是一个文件夹。build和devel目录由catkin系统自动生成、管理,我们日常的开发一般不会去涉及2024/11/295ROS工作区/工作区开发中主要用到的是src文件夹我们编写的ROS程序、网上下载的ROS源代码包都存放在这里。在编译时,catkin编译系统会递归的查找和编译src/下的每一个源代码包因此也可以把几个源代码包放到同一个文件夹下2024/11/296ROS工作空间/工作区mkdir-p~/mycatkin_ws/srccd~/mycatkin_wscatkin_makesource~/mycatkin_ws/devel/setup.bash

第一行代码直接创建了第二层级的文件夹src,这也是存放ROS软件包的地方。第二行代码进入工作空间第三行代码执行catkin_make初始化(编译软件包)catkin_make必须在工作空间目录执行,在其他路径下编译不会成功

第四行代码刷新环境,使得系统能够找到刚才编译生成的ROS可执行文件一般紧跟着要source刷新环境,这个细节比较容易遗漏,致使后面出现可执行文件无法打开等错误

2024/11/297创建并初始化ROS工作空间一个软件包(package)下常见的文件、路径有:

├──CMakeLists.txt #package的编译规则(必须)

├──package.xml #package的描述信息(必须)

├──src/ #源代码文件

├──include/ #C++头文件

├──scripts/ #可执行脚本

├──msg/ #自定义消息

├──srv/ #自定义服务

├──models/ #3D模型文件

├──urdf/ #urdf文件

├──launch/ #launch文件2024/11/298软件包(package)结构一个软件包(package)下常见的文件、路径有:

├──CMakeLists.txt #软件包的编译规则(必须)

├──package.xml #软件包的描述信息(必须)最简单的包只有这两个文件

2024/11/299软件包(package)结构CMakeLists.txt文件规定了这个软件包(package)要依赖哪些软件包(package),要编译生成哪些目标,如何编译等等流程。

CMakeLists.txt非常重要!!!它指定了由源码到目标文件的规则,catkin编译系统在工作时首先会找到每个软件包(package)下的CMakeLists.txt,然后按照规则来编译构建。必须掌握CMakeLists.txt基本修改方法!!!通常的做法是在系统生成的模板文件上修改2024/11/2910CMakeLists.txt文件cmake_minimum_required() #CMake的版本号

project() #项目名称

find_package() #找到编译需要的其他package

catkin_python_setup() #打开catkin的PythonModule的支持

add_message_files() #添加自定义Message文件

add_service_files()

#添加自定义Service文件

add_action_files() #添加自定义Action文件

generate_message() #生成不同语言版本的msg/srv/action接口

catkin_package() #生成当前package的cmake配置,供依赖本包的其他

软件包调用

add_library() #生成库

add_executable() #生成可执行二进制文件

add_dependencies()

#定义目标文件依赖于其他目标文件,确保其他目

标已被构建

target_link_libraries() #链接

catkin_add_gtest() #生成测试

install()

#安装至本机

2024/11/2911CMakeLists.txt写法package.xml也是一个catkin的package必备文件,它是这个软件包的描述文件。2024/11/2912package.xmlpacakge.xml包含了package的名称、版本号、内容描述、维护人员、软件许可、编译构建工具、编译依赖、运行依赖等信息。

实际上rospackfind、rosdep等命令之所以能快速定位和分析出package的依赖项信息,就是直接读取了每一个pacakge中的package.xml文件。它为用户提供了快速了解一个pacakge的渠道。

2024/11/2913package.xml的作用二、ROS包管理命令rospack获取软件包的有关信息。在本教程中,我们只涉及到rospack中find参数选项,该选项可以turtlesim用法:#rospackfind[包名称]示例:$rospackfindroscpp返回软件包的路径信息2024/11/2915使用rospackroscd进入ros软件包目录用法:#roscd

cd[包名称]示例:$roscdroscpp进入软件包的路径2024/11/2916使用roscdrosls列出软件包的文件信息用法:#rosls[包名称]示例:$rosls

turtlesim返回软件包的路径信息2024/11/2917使用rosls三、操作示例2024/11/2919示例一创建ROS工作空间如果catkin_ws目录已经存在,先删除mkdir-p~/mycatkin_ws/srccd~/mycatkin_wscatkin_makesource~/mycatkin_ws/devel/setup.bashecho“source~/mycatkin_ws/devel/setup.bash”>>~/.bashrc2024/11/2920示例二导入ros软件包1、创建工作空间2、下载软件包(http://www.yzyfine.top/download/turtlesim.zip)3、放入工作空间的src目录并解压4、在工作空间运行catkin_make命令编译工作空间下的软件包5、刷新环境变量source~/mycatkin_ws/devel/setup.bash6、运行()roscorerosrunturtlesimturtlesim_noderosrunturtlesimdraw_square2024/11/2921示例三VScode编写python测试程序1、进入前面已经创建的工作空间mycatkin_wscd~/mycatkin_ws2、启动vscodecode.3.编写测试程序操作演示(1)创建包指定包名test,指定依赖roscpprospystd_msgs(2)创建scripts文件夹(存放python文件)2024/11/2922示例三VScode编写python测试程序3.编写测试程序操作演示(3)创建python文件#!/usr/bin/envpythonimportrospyif__name__=="__main__":rospy.init_node("mynode")rospy.loginfo("helloworld")2024/11/2923示例三VScode编写python测试程序3.编写测试程序操作演示(4)设置python文件权限,设置CMakelists.txt2024/11/2924示例三VScode编写python测试程序3.编写测试程序操作演示(5)编译(shift+ctrl+B)(6)运行(先启动主节点master)刷新环境变量source~/XXX/devel/setup.bashrosrun包名python文件名

2024/11/2925示例三VScode编写python测试程序ROS包管理1、创建名称为mycatkin_ws工作空间2、进入工作空间src目录3、刷新工作空间路径到ROS环境echo“source~/mycatkin_ws/devel/setup.bash”>>~/.bashrc4、关闭当前终端窗口后再开一个新终端2024/11/2927任务一创建ROS工作空间1、下载软件包(2:8080/file/turtlesim.zip)2、放入工作空间的src目录并解压3、在工作空间运行catkin_make命令编译工作空间下的软件包4、运行roscorerosrunturtlesimturtlesim_noderosrunturtlesimdraw_square2024/11/2928任务二导入ROS包1、使用rospacklist统计本机上的软件包,把软件包清单存入文件allpack2、统计软件包数量追加到allpack3、把turtlesim软件包的目录路径存入文件tj_turtle4、把turtlesim包所包含的文件和目录列表追加到tj_turtle2024/11/2929任务三使用ROS包管理工具ROS节点与话题什么是节点node在ROS的世界里,最小的进程单元就是节点(node)。一个软件包里可以有多个可执行文

件,可执行文件在运行之后就成了一个进程(process),这个进程在ROS中就叫做节点。2024/11/2931

ROS节点(node)什么是节点node从程序角度来说,node就是一个可执行文件(通常为C++编译生成的可执行文件、Python脚本)被执行,加载到了内存之中;从功能角度来说,通常一个node负责机器人的某一个单独的功能。2024/11/2932

ROS节点(node)什么是节点node由于机器人的功能模块非常复杂,我们往往不会把所有功能都集中到一个node上。例如在轮式机器人中:一个node来控制底盘轮子的运动,一个node驱动摄像头获取图像,一个node驱动激光雷达,一个node根据传感器信息进行路径规划……

2024/11/2933

ROS节点(node)什么是节点node一个节点只负责单一功能,这样做可以降低程序发生崩溃的可能性,如果把所有功能都写到一个程序中,模块间的通信、异常处理将会很麻烦。

前面的例子中,小海龟画面显示程序(turtlesim_node)、小海龟键盘控制程序(turtle_teleop_key)、小海龟画正方形程序(draw_square)都是节点2024/11/2934

ROS节点(node)节点(Node)执行具体任务的进程、独立运行的可执行文件;不同节点可使用不同的编程语言,可分布式运行在不同的主机;节点在系统中的名称必须是唯一的。2024/11/2935

ROS节点(node)节点管理器(master)机器人实际运行时往往会运行众多的node。为了调配、管理这些node,ROS提供节点管理器

master,管理各个节点node。当ROS程序启动时,第一步首先启动master,由节点管理器处理依次启动node。

2024/11/2936

ROS节点(node)节点管理器ROS程序控制中心为节点node提供命名和注册服务;跟踪和记录话题/服务通信,辅助节点相互查找、建立连接;提供参数服务器,节点使用此服务器存储和检索运行时的参数2024/11/2937

ROS节点(node)节点管理器ROS程序启动时必须先启动master使用下列ros命令roscore2024/11/2938

ROS节点(node)1节点运行命令rosrun

$rosrunpkg_nameprog_name

包名程序名包名和程序名记不太清是可以使用tab键补全

2024/11/2939

ROS节点操作命令2节点管理命令rosnode

2024/11/2940

ROS节点操作命令rosnodelist列出当前运行的node信息rosnodeinfonode_name显示node的详细信息rosnodekillnode_name结束某个noderosnodeping测试连接节点

话题topictopic是ROS中的常用的通信方式。适用于实时性、周期性的消息传输。topic是一种点对点的单向通信方式,这里的“点”指的是node,也就是说node之间可以通过topic方式来传递信息。

2024/11/2941

ROS话题发布者与订阅者话题topic通信中发送话题数据的节点称为发布者(publisher)

接受话题数据的节点称为订阅者(

subscriber

2024/11/2942

ROS话题消息(message)话题topic通信的数据称为消息(message)

2024/11/2943

ROS话题话题topic通信的过程topic要经历下面几步的初始化过程:首先,publisher节点和subscriber节点都要到节点管理器进行注册,然后publisher会发布topic,subscriber在master的指挥下会订阅该主题topic,从而建立起发布-订阅(pub-sub)之间的通信。整个过程是单向的,数据由发布者传递给订阅者。2024/11/2944

ROS话题发布/订阅模型发布者可以发布一个或多个话题发布者也可以是订阅者一个发布者可以有多个订阅者,一个订阅者可以订阅多个话题一个话题topic可以被多个节点同时发布,也可以同时被多个节点接收2024/11/2945

ROS话题理解“异步”概念在发布者node1每发布一次消息之后,就会继续执行下一个动作,至于消息是什么状态、被怎样处理,它不需要了解;对于订阅者node2,它只管接收和处理某个话题上的消息,至于是谁发来的,它不会关心。所以node1、node2两者都是各司其责,不存在协同工作,称这样的通信方式是异步的

2024/11/2946

ROS话题命令作用rostopiclist

列出当前所有的topicrostopicinfotopic_name显示某个topic的属性信息rostopicechotopic_name显示某个topic的内容rostopicpubtopic_name...向某个topic发布内容rostopicbwtopic_name查看某个topic的带宽rostopichztopic_name查看某个topic的频率rostopicfindtopic_type查找某个类型的topicrostopictypetopic_name查看某个topic的类型(msg)2024/11/2947

ROS话题操作命令

2024/11/2948节点计算图概念计算图(ComputationGraph)是一个由ROS进程组成的点对点网络,它们能够共同处理数据。ROS的基本计算图概念有节点(Nodes)、主节点(Master)、参数服务器(ParameterServer)、消息(Messages)、服务(Services)、话题(Topics)和包(Bags),它们都以不同的方式向图(Graph)提供数据。节点(Nodes):节点是一个可执行文件,可以与其他节点进行通信。消息(Messages):订阅或发布话题时所使用的ROS数据类型。话题(Topics):节点可以将消息发布到话题,或通过订阅话题来接收消息。主节点(Master):ROS的命名服务,例如帮助节点发现彼此。rosout:在ROS中相当于stdout/stderr(标准输出/标准错误)。roscore:主节点+rosout+

参数服务器(会在以后介绍)。2024/11/2949使用rqt_grqph查看节点构成的计算图1、在ROS中启动小乌龟示例程序$roscore$rosrunturtlesimturtlesim_node$rosrunturtlesimturtle_teleop_key2、使用rosnodelist查看启动的节点列表3、使用rosnodeinfo查看具体节点信息4、使用rqt_graph

查看计算图理解并掌握节点运行和管理命令rosrun

、rosnode的基本用法2024/11/2950作业:运行和查看节点ROS话题与消息在之前建立的turtlesim例子中,键盘控制节点(turtle_teleop_key)和仿真节点(turtulesim_node)以某种方式进行对话使海龟响应按键操作。ROS节点之间进行通信所利用的最重要的机制就是消息传递(发布/订阅)。2024/11/2952ROS消息在ROS中,消息就是数据,有组织地存放在话题里。消息传递的理念是:当一个节点想要分享信息时,它就会发布(publish)消息到对应的一个或者多个话题;当一个节点想要接收信息时,它就会订阅(subscribe)它所需要的一个或者多个话题。ROS节点管理器负责确保发布节点和订阅节点能找到对方;而且消息是直接地从发布节点传递到订阅节点,中间并不经过节点管理器转交。2024/11/2953ROS消息话题的通信是通过节点间发送ROS消息实现的。为了使发布者(turtle_teleop_key)和订阅者(turtulesim_node)进行通信,发布者和订阅者必须发送和接收相同类型的消息。这意味着话题的类型是由发布在它上面消息的类型决定的。2024/11/2954ROS消息使用rostopicecho查看话题数据(消息)内容$rostopicecho/turtle1/cmd_vel

需要按键控制乌龟节点移动才看得到数据变化2024/11/2955查看话题数据(消息)内容使用rostopicecho查看话题数据(消息)内容$rostopicecho/turtle1/cmd_vel每当/teleop_turtle接收到按键信息时,将会显示类似右图的结果。输出中的每一个“---”线表示一个消息的结束以及另一个消息的起始linear:线速度angular:角速度2024/11/2956查看话题数据(消息)内容$rostopichz/turtle1/cmd_vel$rostopicbw/turtle1/cmd_vel第一条命令输出每秒发布的消息数量第二条命令输出每秒发布消息所占的字节量这些命令主要用于调试,它们提供了一种简单的方法来验证这些消息确实有规律地在向这些特定的话题发布2024/11/2957查看话题发布频率、带宽rostopicinfo/turtle1/cmd_vel输出了该话题的消息类型。Type在文本输出中表示数据类型。理解消息的类型很重要,因为它决定了消息的内容。也就是说,一个话题的消息类型能告诉你该话题中每个消息携带了哪些信息,以及这些信息是如何组织的2024/11/2958查看消息类型要想查看某种消息类型的详情,使用类似下面的命令:rosmsgshow#显示消息的说明描述rosmsglist#列出所有消息

rosmsgmd5#显示消息的md5码rosmsgpackage#列出单个包中的消息rosmsgpackages#列出包含消息的软件包2024/11/2959rosmsg消息管理命令rosmsgshow消息类型

例如:rosmsgshowturtlesim/Color

其输出为:

uint8ruint8guint8brosmsgshow可以帮助理解通过话题传输的数据类型的具体构成,即变量类型及变量名称(结构体)2024/11/2960使用rosmsgshow查看消息类型(详情)rosmsgshowturtlesim/Color输出的格式是域(field)的列表,每行一个元素。每一个域由基本数据类型(例如int8、bool、或者string)以及域名称定义。turtlesim/Color包含三个无符号8位整型变量r,g和b。任何话题的消息只要是turtlesim/Color类型,都由上述三个域的值定义。2024/11/2961使用rosmsgshow查看消息类型(详情)rosmsgshowgeometry_msgs/Twistgeometry_msgs/Twist

是ROS中常用消息类型。该消息类型对应/turtle1/cmd_vel话题geometry_msgs/Twist

消息包含六个成员,并且以两个向量的形式组织,分别为linear

angular(线速度和角速度)。其中每个数值都是基本数据类型float64,即每个数值都是64位浮点型数据2024/11/2962使用rosmsgshow查看消息类型(详情)线速度值为正时沿相应的轴正向移动,值为负时反向移动角速度值为正时沿相应的轴逆时针转动,值为负时顺时针转动2024/11/2963linear和angular(线速度和角速度)ROS复合域是由简单的一个或者多个子域组合而成,其中的每一个子域可能是另一个复合域或者独立的域,而且它们一般也都由基本数据类型组成常见的例子:

geometry_msgs/Twist表示线速度和角速度std_msgs/Header序列号,时间戳以及坐标系等信息sensor_msgs/NavSatFix表示单个GPS的定位数据sensor_msgs/LaserScan表示激光雷达数据2024/11/2964使用rosmsgshow查看消息类型(详情)和ROS里其他的程序一样,每个消息类型都属于一个特定的包。消息类型名总会包含一个斜杠,斜杠前面的名字是包含它的包turtlesim/Color消息类型按如下方式分解:turtlesim+Color⇒turtlesim/Color

功能包名类型名称消息类型2024/11/2965理解消息类型的命名rostopicpub可以把数据发布到当前某个正在广播的话题上$rostopicpub-1

/turtle1/cmd_velgeometry_msgs/Twist--'[2.0,0.0,0.0]''[0.0,0.0,1.8]‘

rostopicpub

参数

话题消息类型消息值以上命令会发送一条消息给turtlesim,告诉它以2.0大小的线速度沿x轴正向移动和1.8大小的角速度绕z轴逆时针转动。

该命令执行一次,画一段圆弧2024/11/2966使用rostopicpub发布消息空格$rostopicpub-r1/turtle1/cmd_velgeometry_msgs/Twist--'[2.0,0.0,0.0]''[0.0,0.0,1.8]'

r表示重复执行消息发布1次(只能是1)

以上命令会发送消息给turtlesim,告诉它以2.0大小的线速度沿x轴正向移动和1.8大小的角速度绕z轴逆时针转动。该命令重复执行,每秒执行一次,画一个圆平面图形中,geometry_msgs/Twist类型的数据线速度只有x,y轴有效,角速度只有z轴有效2024/11/2967使用rostopicpub发布消息rostopicpub另一种用法:输入

rostopicpub-r1/turtle1/cmd_vel后按tab补全消息类型然后再按一次tab补全消息格式然后移动光标修改线速度的x分量、角速度的z分量2024/11/2968使用rostopicpub发布消息重复执行,频率为1赫兹执行一次2024/11/2969使用rostopicpub发布消息2024/11/2970rostopicpub常用的角速度值弧度角度值

180°3.14159263/4135°2.356194492/3120°2.0943951/290°1.570796326/360°1.04719755/445°0.78539816/630°0.5235987/1215°0.2617993873/2270°4.71238898画半圆rostopicpub-1/turtle1/cmd_velgeometry_msgs/Twist--'[3,0,0]''[0,0,-3.1415926]'逆时针旋转90°

rostopicpub-1/turtle1/cmd_velgeometry_msgs/Twist--'[0,0,0]''[0,0,1.5707963]'画圆弧rostopicpub-1/turtle1/cmd_velgeometry_msgs/Twist--'[3,0,0]''[0,0,-3.1415926]'走直线rostopicpub-1/turtle1/cmd_velgeometry_msgs/Twist--'[1,0,0]''[0,0,0]'2024/11/2971使用rostopicpub发布消息示例重置:rosservicecall/reset2024/11/2972作业:用rostopicpub绘制几何图形rostopic发布消息示例控制turtle绘制图形1如何绘制心型75

vωr1如何绘制心型分析:绘制心型步骤如下:1、①

绘制半圆2、②

绘制圆弧3、在③号点旋转偏转角q4、③

绘制圆弧5、④

绘制半圆两个半圆的线速度和角速度容易确定,两段圆弧的线速度和角速度以及两段圆弧之间的偏转角需要计算,为了简化问题,只考虑大圆弧的圆心位于两个小圆弧的圆心所在直线上2024/11/29761如何绘制心型br2r1v1v2aqh

qr2o

2024/11/2977br2r1v1v2aqhqr2o1如何绘制心型

2024/11/2978br2r1v1v2aqhqor21如何绘制心型2024/11/2979br2r1hv1v2aqqr2o1如何绘制心型2024/11/2980br2r1hv1v2a

qr2o1如何绘制心型控制turtle绘制图形2如何绘制月型

2024/11/2982br2r1sv1Tav2Tw2如何绘制月型

2024/11/2983br2r1sv1Tav2Tw2

如何绘制月型控制turtle绘制图形3如何绘制环型

2024/11/2985r1r2v1Tv2Tv3T3如何绘制环型1、在ROS中启动小乌龟示例程序$roscore$rosrunturtlesimturtlesim_node2、创建命令脚本文件,运行后绘制以下图形2024/11/2986作业4使用rostopicpub发布消息abcdefghkmn习题课1、建立以“班级号+学生序号”命名的文件夹,并设置文件夹的权限为:宿主用户:rwx组用户:r-x其它用户:---然后通过使用重定向命令把设置好权限后“ls-l”命令显示的结果放到文件A01中。2、下载science.txt文件,把其中含有单词“and”的行放到文件A02中,然后用wc统计A02文件并把统计结果追加到A02文件。(wgethttp://www.ee.surrey.ac.uk/Teaching/Unix/science.txt)3、把本机历史命令放到A03文件中,筛选其中使用了ls命令的内容存放到ls.txt文件中、使用了cd命令的内容存放到cd.txt文件。4、确定上述的三个文件都放在已建立的文件夹中,然后把文件夹压缩为zip格式的压缩文件。2024/11/2988作业1安装ROS集成开发环境主要包括以下部分:1、使用vmware虚拟机软件安装ubuntu20.042、在ubuntu20.04虚拟机中安装ROS(noetic)3、在已安装好ROS的ubuntu虚拟机中安装vscode(包括必要插件)把安装过程的截图存放到word文档中上传,截图必须是电脑屏幕的全屏截图。2024/11/2989作业21、创建名称为mycatkin_ws工作空间2、进入工作空间src目录3、刷新工作空间路径到ROS环境echo“source~/mycatkin_ws/devel/setup.bash”>>~/.bashrc4、关闭当前终端窗口后再开一个新终端2024/11/2990作业3.1创建ROS工作空间1、下载软件包(2:8080/file/turtlesim.zip)2、放入工作空间的src目录并解压3、在工作空间运行catkin_make命令编译工作空间下的软件包4、运行roscorerosrunturtlesimturtlesim_noderosrunturtlesimdraw_square2024/11/2991作业3.2导入ROS包1、使用rospacklist统计本机上的软件包,把软件包清单存入文件allpack2、统计软件包数量追加到allpack3、把turtlesim软件包的目录路径存入文件tj_turtle4、把turtlesim包所包含的文件和目录列表追加到tj_turtle2024/11/2992作业3.3使用ROS包管理工具重置:rosservicecall/reset1、在ROS中启动小乌龟示例程序$roscore$rosrunturtlesimturtlesim_node2、创建命令脚本文件,运行后绘制以下图形2024/11/2993作业4使用rostopicpub发布消息绘制图形abcdefghkmn编写简单ROS程序1.建立ROS工作区(可选)2.创建ROS软件包package(常用依赖roscpprospystd_msgs)catkin_create_pkg包名依赖3.创建存放python文件的文件夹(目录一般为scripts)4.创建python文件,输入代码(导入需要的包

)5.修改CMakeLists.txt6.修改python文件权限(文件所在目录下运行chmod+x*.py)7.编译(在工作区目录下运行catkin_make命令vscode快捷键ctrl+shift+B)8.运行(刷新环境变量source~/catkin_ws/devel/setup.bash)

编写简单ROS程序的步骤

常规python程序ROS程序(python)ROS程序的结构

编写python程序常用技巧

1.输入使用input()函数输入的是字符串,可根据需要转换x=int(input('请输入一个整数'))y=float(input('请输入一个浮点数'))s=str(input('请输入一个字符串'))2.输出常规输出(1)输出数值型变量num=100print(num)(2)输出字符串str='helloworld'print(str)(3)输出列表list=[1,2,3]print(list)(4)输出元组tuple=(1,2,'a')print(tuple)(5)输出字典dict={'a':1,'b':2}print(dict)编写python程序常用技巧

例1:(使用格式控制符%s%d)s='HelloWorld'x=len(s)print('字符串:%s的长度是%d'%(s,x))例2:(指定宽度和精度)PI=3.1415926print('%8.3f'%PI)%s字符串采用str()的显示%x十六进制整数%c单个字符%b二进制整数%f,%F浮点数%d十进制整数%o八进制整数编写python程序常用技巧

2.输出换行与防止换行例1:(默认换行,输出5行

)forxinrange(0,5):print(x)例2:(在一行上输出,用空格分开

)forxinrange(0,5):print(x,

end='')例3:(在一行上输出,用逗号,分开

)forxinrange(0,5):print(x,

end=',')编写python程序常用技巧

3.分支结构例:a=2ifa>3:print('大于3')elifa<3:

print('a小于3')else:

print('a等于3')编写python程序常用技巧

4.循环结构for循环例1:forxinrange(0,5):print(x)range函数range(5)默认从0开始,0-5,前闭后开例2:输出斐波那契数列a,b=0,1forindexinrange(10):print(b)(a,b)=(b,a+b)编写python程序常用技巧

4.循环结构while循环例3:a=Trueindex=0whilea:index=index+1print(index)ifindexis10:break编写python程序常用技巧

1.编写小海龟绘制心型、月型、环型的参数计算程序2.输出1-100的累计求和值3.输出n的阶乘(n<10)4.输出1-100间的素数

作业5 编写ROS消息发布程序

画圆

rostopicpub-1/turtle1/cmd_velgeometry_msgs/Twist--'[4,0,0]''[0,0,6.28]'

发送消息控制仿真乌龟绘图

画三角形

①直线行走③直线行走④逆时针旋转⑤直线行走②逆时针旋转120度①直线行走②逆时针旋转③直线行走⑤直线行走④逆时针旋转120度发送消息控制仿真乌龟绘图

ROS程序必须导入此包指定python解释器定义并初始化“发布者”变量初始化节点,节点名为“circle”导入Twist消息定义Twist消息变量填充Twist消息变量定义并设定消息发布频率发表消息延时(避免消息发太快)了解ROS程序基本结构—画圆

ROS程序必须导入此包指定python解释器定义并初始化“发布者”变量初始化节点,节点名为“triangel”导入Twist消息定义Twist消息变量填充消息(画一条边)发布消息填充消息(旋转120°)定义并设定消息发布频率发布消息延时(避免消息发太快)了解ROS程序基本结构—画三角形

ROS程序必须导入此包指定python解释器定义并初始化“发布者”变量初始化节点,节点名为“triangel”导入Twist消息定义Twist消息变量节点未关闭时运行循环填充消息(画一条边)发布消息睡眠,等待下一次发布消息定义并设定消息发布频率了解ROS程序基本结构—画三角形-循环

1.导入包rospy2.导入相应消息fromgeometry_msgs.msgimportTwist3.在主入口中初始化节点,指定节点4.定义发布ros消息的对象,并实例化(明确话题名、消息类型,消息队列长度)5.定义ros消息变量(用于发布消息)6.设置消息发送的频率7.封装消息(填充数据)8.发送消息(调用第4步定义的对象的方法)9.睡眠,等待下一次发送消息

编写ROS消息发布程序步骤

了解要发布的消息的类型

在vscode中编写ROS程序绘制下列几何图形(python)

作业6

编写ROS消息发布程序编写ROS订阅者程序步骤

1.导入必要的包(rospy

)2.从消息文件中导入要接收的消息类型(本例为turtlesim/Pose)

3.初始化节点4.初始化接收消息的变量(调用消息接收函数初始化该变量,指定消息的话题,消息类型,回调函数)5.定义回调函数

(当收到消息时要做的操作)6.启动自循环

示例1:订阅海龟位姿信息程序功能:接收消息,显示乌龟x,y坐标、朝向、线速度、角速度准备工作:订阅话题:/turtle1/pose话题/turtle1/pose对应的数据类型:turtlesim/Pose使用rostopiclist查看话题列表使用rostopicinfo查看话题/turtle1/pose的数据类型turtlesim/Pose使用rosmsgshow查看turtlesim/Pose类型的具体定义示例1:订阅者程序get_pose.py定义回调函数,用于收到消息时执行。当收到消息时,消息存到data变量中启动自循环,尽快调用回调函数调用接收话题消息的函数初始sub变量话题名称,必须与发布者程序中的话题相同回调函数名,接收到消息就会调用该函数初始化节点接收的消息类型示例1:订阅者程序get_pose.py订阅者程序要点:1.创建订阅者对象当新的消息到达时,它们会被保存在一个队列中,然后自动执行回调函数,对消息的处理都是在回调函数中进行的。注意:不要在函数名后面添加括号()

回调函数接收的消息类型话题名创建订阅者函数示例1:订阅者程序get_pose.py订阅者程序要点:2.编写回调函数

订阅消息时,订阅者节点无法知道消息什么时候到达。为了应对这一情况,必须把响应收到消息事件的代码放到回调函数里,ROS每接收到一个新的消息将调用一次这个函数。订阅者的回调函数类似于:

本例程中,回调函数接收类型为turtlesim/Pose的消息,所以必须从定义该消息的文件导入Pose类型

回调函数中简单输出消息数据,包括x、y和theta数据成员。

回调函数名收到的消息位于data变量中消息处理:把坐标转换为字符串示例1:订阅者程序get_pose.py订阅者程序要点:3.给ROS控制权

这行代码不会让当前节点退出,除非当前节点被明确的关闭。有的资料中称为“阻塞”,或“自循环”示例1:订阅者程序get_pose.pyROS中的spin和spinOnce的区别spin函数spin函数会持续地检查并处理订阅缓冲区中的回调函数,直到队列为空。一旦进入spin函数,它就会进入一个循环,不断地检查回调函数队列。如果队列中有回调函数,spin会立即执行它。如果队列为空,spin会等待,直到有新的回调函数被放入队列。在这个过程中,spin会阻塞,不会占用CPU资源。因此,当使用spin时,节点会一直等待并处理回调函数,不会执行spin之后的代码。示例1:订阅者程序get_pose.pyROS中的spin和spinOnce的区别spinOnce函数与spin不同,spinOnce函数只处理一次回调函数,然后继续执行后续的代码。这意味着spinOnce不会阻塞,它会检查回调函数队列,执行一个回调函数(如果队列中有的话),然后立即返回。spinOnce通常与ros::Rate对象一起使用,在while循环中调用,以控制节点处理回调函数的频率。作业7:编写订阅者程序1、启动海龟示例节点2、仿照示例1,编写运行程序,实现订阅海龟坐标信息并输出3、编写订阅者程序,订阅话题/turtle1/color_sensor,然后输出颜色数据编写发布/订阅程序程序功能:发布者程序每秒发送消息(字符串),订阅者程序接收消息实现过程:一、发布者程序:1、导包2、初始化节点3、定义发布者变量并调用rospy.Publisher()函数初始化,设定参数(指定自定义话题,消息类型,队列长度)4、定义并设定消息发布频率5、定义消息变量并设置消息值6、发送消息(循环)

示例1:编写简单的发布者/订阅者程序程序功能:发布者程序每秒发送消息(字符串),订阅者程序接收消息实现过程:二、订阅者程序:1、导包2、初始化节点3、定义订阅者变量并调用rospy.Subscriber()函数初始化,设定参数(使用自定义话题,消息类型,回调函数)4、定义并编写回调函数处理消息

示例1:编写简单的发布者/订阅者程序发布者程序:订阅者程序:

示例1:编写简单的发布者/订阅者程序发布者和订阅者程序中的话题名必须相同发布者和订阅者程序中的话题名必须相同运行程序

示例1:编写简单的发布者/订阅者程序节点列表与话题列表

示例1:编写简单的发布者/订阅者程序订阅者/发布者程序程序功能:绘制放大版圆绘制过程:1、发布者程序节点发出绘制圆的消息(线速度,角速度),因为话题名

mycircle

与仿真乌龟节点/turtlesim的话题/turtle1/cmd_vel名不同,乌龟节点/turtlesim不接收该消息。2、订阅者程序节点接收发布者节点发出的geometry_msgs::Twist消息(两个节点有共同话题),处理后(线速度*2,角速度不变)转发给/turtle1/cmd_vel话题3、乌龟节点/turtlesim接收到消息后绘制图形

示例2:订阅者/发布者程序

示例2:发布者程序my_pub.py自定义的话题名称,仿真乌龟收不到该话题消息示例2:订阅者程序my_sub.py定义回调函数,用于接收自定义话题消息,处理后转发自定义的话题名称,必须与发布者程序中的话题相同课堂练习:在自己电脑上编写并运行示例1、示例21、创建包,包名为姓名拼音首字母或拼音全名2、编写发布订阅程序控制仿真乌龟绘制图形,要求:(1)发布者程序运行后接收键盘输入数字或字母,然后通过自定义话题把该数字或字母从发送给订阅者查询;(自定义消息的类型可设置为:“std_msgs/String”或“std_msgs/Int8”)(2)编写订阅者程序,接收(1)步中的消息,然后在话题“/turtle1/cmd_vel”上发送geometry_msgs/Twist消息,仿真乌龟收到消息后绘制出图形。(3)发布者程序循环运行,直到被终止。

2024/11/29134作业8:编写发布者订阅者程序服务(service)Service通信

topic是ROS中的一种单向的异步通信方式。有些时候单向的通信满足不了通信要求这种情况下,就需要有另外一种请求-响应式的通信模型——service(服务)

service方式在通信模型上与topic不同。Service通信是双向的,它不仅可以发送消息,同时还会有反馈。所以service包括两部分,一部分是请求方(Clinet)[客户],另一部分是应答方/服务提供方(Server)。通信时,客户(Client)发送一个request(请求),要等待server处理,然后反馈回一个reply/response(回复/应答),这样通过“请求-应答”的机制完成整个服务通信

Service工作原理

service是同步通信方式,所谓同步就是节点A(请求方)发布请求后会在原地等待响应,直到节点B(服务方)处理完了请求并且完成了响应,节点A才会继续执行。节点A在等待响应的过程中是处于阻塞状态。这样的通信模型没有频繁的消息传递,没有冲突与高系统资源的占用,只有接受请求才执行服务,简单高效

Service工作原理

Service与topic异同远程过程调用(RemoteProcedureCall,RPC),可以简单通俗的理解为在一个进程里调用另一个进程的函数Service工作原理

1、使用命令rosservice2、编写client/server程序server

rosservice命令作用rosservicelist列出所有服务rosserviceinfo[服务名]查看一个服务的数据类型rosservicecall[服务名]

[参数]命令行调用服务rosservice相关命令作用rossrvshow[服务数据类型]查看服务的数据类型构成rosnodeinfo[节点名]查看特点节点提供的服务、话题等信息Service的使用方式

查看乌龟节点服务、话题信息

rosnodeinfo/turtlesim

发布了3个topic订阅1个topic提供的服务了解海龟的节点信息

rosservicelist列出所有服务(包含仿真海龟提供的服务)

清除仿真乌龟轨迹杀乌龟复位/重置乌龟生成一个新乌龟设置轨迹的颜色、宽度移动乌龟到指定坐标和朝向通过设置线速度和角度移动乌龟了解海龟节点提供的Service rosserviceinfo[服务名]提供服务的节点服务的数据类型调用该服务需要的参数查看服务信息(数据类型与参数)

rossrvshow[类型名]查看服务的数据类型定义

调用服务(无参数)1、清除轨迹rosservicecall

/clear

调用服务示例1 调用服务(无参数)2、重置复位rosservicecall

/reset

调用服务示例2

调用服务(有参数)3、生成新乌龟rosservicecall

/spawn550turtle2

先输命令rosservicecall/spawn然后按TAB自动补全参数格式然后移动光标输入参数值

移动光标,输入服务调用命令的各个参数值调用服务生成新乌龟,坐标为(5,5),朝向0,乌龟名称为“turtle2”

注意:冒号后有空格方法一:直接输入命令方法二:使用TAB键补全调用服务示例3

调用服务(有参数)4、杀乌龟rosservicecall

/killturtle1

先输命令rosservicecall/kill然后按TAB自动补全参数格式

移动光标,输入要杀掉的乌龟命令的名称turtle1冒号后有空格方法一:直接输入命令方法二:使用TAB键补全调用服务示例4

调用服务(有参数)5、设置轨迹的颜色、宽度rosservicecall/turtle1/set_pen{255,0,0,5,0}先输命令rosservicecall/kill然后按TAB自动补全参数格式

移动光标,输入要设置的颜色和宽度冒号后有空格方法二:使用TAB键补全调用服务设置轨迹线颜色为红色、宽度为5方法一:直接输入命令,参数用花括号包含,逗号分隔调用服务示例5

调用服务(有参数)6、移动乌龟到指定坐标和朝向

rosservicecall/turtle1/teleport_absolute{10,10,1.57}移动光标,输入要设置的坐标和朝向冒号后有空格方法二:使用TAB键补全调用服务移动乌龟到(10,10),朝向为90°方法一:直接输入命令,参数用花括号包含,逗号分隔调用服务示例6

调用服务(有参数)7、设置线速度、角度移动乌龟rosservicecall/turtle1/teleport_relative{5,1.57}移动光标,输入要设置的线速度和角度冒号后有空格技巧:使用TAB键补全方法一:直接输入命令,参数用花括号包含,逗号分隔调用服务示例7

使用rostopic、rosservice命令绘制以下图形

调用服务示例8:绘制笑脸

使用rostopic命令绘制以下图形分析:整个图形由不连续的几段图形构成,需要控制乌龟分别绘制。绘制完成其中一段后,杀掉乌龟,然后在下一段需要绘制图形的坐标点生成一只新的乌龟绘制相应的图形,直至全部图形绘制完成。A(5,5)O(5,7)B(4,8)C(6,8)D(4,6)E(6,6)调用服务示例8:绘制笑脸

使用rostopic命令绘制调用服务示例8:绘制笑脸

1、参考课件,在自己电脑上练习示例1-82、使用rostopic绘制下列图形

2024/11/29155作业9编写服务请求程序1、导包rospy2、导入服务类型(根据要调用的服务导入相应的类型)使用rosserviceinfo服务了解该服务使用的数据类型使用rossrvshow类型了解该服务数据类型的详细定义,方便在程序中使用

编写服务请求(client)程序的步骤服务名类型参数/clearstd_srvs/Empty无/killturtlesim/Killname/resetstd_srvs/Empty无/spawnturtlesim/Spawnxythetaname/turtle1/set_penturtlesim/SetPenrgbwidthoff/turtle1/teleport_absoluteturtlesim/TeleportAbsolutexytheta/turtle1/teleport_relativeturtlesim/TeleportRelativelinearangular2、导入服务类型对于每个定义好的服务类,系统会自动生成Request和Response类型,用于发送调用服务的参数和接收响应数据例如:Spawn类自动生成SpawnRequest、SpawnResponse类型,SpawnRequest用于调用服务时传送创建乌龟的坐标等参数SpawnResponse用于接收创建成功后的响应数据(在对应的服务名后面加上Request、Response构成请求、响应的数据类型)

编写服务请求(client)程序的步骤2、导入服务类型服务数据类型的详细定义:用---把数据分为请求(client)和响应(server)两部分(1)无请求数据,无响应数据(2)有请求数据,有响应数据(3)有请求数据,无响应数据

编写服务请求(client)程序的步骤3、初始化节点4、定义client变量并调用rospy.ServiceProxy()函数初始化,设定参数(指定服务名,服务类型)5、等待服务端启动(阻塞)6、定义请求变量并填充参数(调用无参数的服务不需要这一步)7、调用服务并接收响应

编写服务请求(client)程序的步骤程序功能:程序调用turtlesim节点的/spawn服务,在指定的坐标生成海龟

示例1:编写服务请求程序(有参数)导入服务类型,SpawnRequest、SpawnResponse是系统自动生成的类型定义SpawnRequest类型变量用于设置参数阻塞调用进程,等待服务响应定义服务调用的客户端并初始化调用服务,把响应结果存变量response中定义SpawnResponse类型变量用于处理响应程序功能:程序调用turtlesim节点的/clear服务,清除轨迹

示例2:编写服务请求程序(无参数)定义服务调用的客户端并初始化导入服务类型1、参考课件示例,编写并运行示例1、示例22、编写服务调用程序1,运行后重置海龟3、编写服务调用程序2,运行后杀掉一个海龟4、编写服务调用程序3,运行后改变海龟运行轨迹的颜色和宽度5、编写服务调用程序4,运行后移动海龟到指定坐标(本次作业课堂检查,不提交程序文件)

2024/11/29163作业10:编写服务调用程序编写服务请求程序改进示例1(在指定位置生成乌龟),编写程序,随机生成乌龟思路:在生成乌龟的程序基础上,使用随机函数生成乌龟的坐标和朝向补充:在python中用于生成随机数的模块是random,在使用前需要import导入random.random()用于生成一个0到1的随机符点数:0<=n<1.0

random.randint(a,b)用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n:a<=n<=b,

示例3:随机生成乌龟改进示例3,编写程序,随机生成10个乌龟

改进示例3:随机生成乌龟编写程序,绘制图形

示例4:绘制图形

编写程序,绘制图形

示例4:绘制图形

1、编写程序,绘制下列图形

2、编写程序,绘制下列图形之一

课堂作业:绘制图形abcdef

g

h

习题课作业5 1.编写小海龟绘制心型、月型、环型的参数计算程序2.输出1-100的累计求和值3.输出n的阶乘(n<10)4.输出1-100间的素数

作业6 在vscode中编写ROS程序绘制下列几何图形(python)

作业7:编写订阅者程序1、启动海龟示例节点2、仿照示例1,编写运行程序,实现订阅海龟坐标信息并输出3、编写订阅者程序,订阅话题/turtle1/color_sensor,然后输出颜色数据1、创建包,包名为姓名拼音首字母或拼音全名2、编写发布订阅程序控制仿真乌龟绘制图形,要求:(1)发布者程序运行后接收键盘输入数字或字

温馨提示

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

评论

0/150

提交评论