《ROS应用技术》课件-11.ros通信编程_第1页
《ROS应用技术》课件-11.ros通信编程_第2页
《ROS应用技术》课件-11.ros通信编程_第3页
《ROS应用技术》课件-11.ros通信编程_第4页
《ROS应用技术》课件-11.ros通信编程_第5页
已阅读5页,还剩127页未读 继续免费阅读

下载本文档

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

文档简介

ROS应用开发技术1.ROS通信编程-话题发布者(上)01话题介绍与创建步骤02C++创建话题03文件编译与运行目录CONTENTS话题介绍与创建步骤ROS中的话题话题是实现节点间通信的重要机制。消息发布与订阅节点通过话题发布消息和订阅消息,实现数据传输和共享。话题是ROS中实现节点之间通信的重要机制,通过话题节点可以发布消息和订阅消息,实现数据的传输和共享。话题定义ROS话题发布者创建步骤节点与ROS系统其他部分交互的接口。创建消息对象并填充字段,消息是节点间通信的基本单位。按照一定频率循环发送消息。设置ROS环境的基础,启动新节点。向ROSMaster注册节点信息,包括发布的话题名和消息类型以及队列长度。创建句柄创建并初始化消息数据注册节点信息循环发送消息C++创建话题创建功能包0102使用catkin_create_pkg命令创建功能包。catkin_create_pkglearn_topicstd_msgsrospyroscppgeometry_msgsturtlesim创建功能包进入src文件夹使用cd命令进入工作空间的src文件夹,然后使用catkin_create_pkg命令创建功能包。使用cd命令进入工作空间的src文件夹。cd~/ros_ws/src创建C++文件使用touch命令创建一个名为turtle_velocity_publisher的C++文件touchturtle_velocity_publisher.cpp或者直接使用vi命令创建并打开该文件viturtle_velocity_publisher.cpp编写速度发布者程序/*创建一个小海龟的速度发布者*/#include<ros/ros.h>#include<geometry_msgs/Twist.h>intmain(intargc,char**argv){ros::init(argc,argv,"turtle_velocity_publisher");//ROS节点初始化ros::NodeHandlen;//这里是创建句柄//创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10ros::Publisherturtle_vel_pub=n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",10);ros::Rateloop_rate(10);//设置循环的频率while(ros::ok())

编写速度发布者程序

{//初始化需要发布的消息,类型需与Publisher一致geometry_msgs::Twistturtle_vel_msg;turtle_vel_msg.linear.x=0.8;turtle_vel_msg.angular.z=0.6;turtle_vel_pub.publish(turtle_vel_msg);//发布速度消息//打印发布的速度内容ROS_INFO("Publshturtlevelocitycommand[%0.2fm/s,%0.2frad/s]",turtle_vel_msg.linear.x,turtle_vel_msg.angular.z);loop_rate.sleep();//按照循环频率延时}return0;CMakelist.txt配置说明生成的可执行程序的文件是turtle_velocity_publisheradd_executable说明编译生成可执行文件所需要链接的库。target_link_libraries在CMakelist.txt文件中添加两行代码:add_executable(turtle_velocity_publishersrc/turtle_velocity_publisher.cpp)target_link_libraries(turtle_velocity_publisher${catkin_LIBRARIES})文件编译与运行编译与运行使用catkin_make命令进行编译,然后重新source当前的环境变量。运行程序需要在终端中输入roscore命令,运行ROS的主节点。返回工作空间目录cd~/ros_wscatkin_make命令进行编译重新source环境变量sourcedevel/setup.bash运行小海龟节点程序使用rosrun命令运行小海龟节点程序,然后同样使用rosrun命令运行发布者节点程序。运行小海龟节点程序运行发布者节点程序rosrunturtlesimturtlesim_noderosrunlearn_topicturtle_velocity_publisher查看节点列表0201查看节点列表节点名为/turtle_velocity_publisher,与代码中编写的一致。在终端中使用rosnodelist查看节点列表,可以看到名为/turtle_velocity_publisher的节点。节点名称使用rosnodelist查看节点列表。ROS应用开发技术1.ROS通信编程-话题发布者(下)01Python创建话题02文件运行03C++与Python对比目录CONTENTSPython创建话题创建Python脚本文件夹和文件mkdirscripts创建文件创建文件夹touchturtle_velocity_publisher.py或viturtle_velocity_publisher.py编写Python发布者节点代码importrospyfromgeometry_msgs.msgimportTwistdefturtle_velocity_publisher():rospy.init_node('turtle_velocity_publisher',anonymous=True)#ROS节点初始化turtle_vel_pub=rospy.Publisher('/turtle1/cmd_vel',Twist,queue_size=8)rate=rospy.Rate(10)#设置循环的频率whilenotrospy.is_shutdown():#初始化geometry_msgs::Twist类型的消息turtle_vel_msg=Twist()turtle_vel_msg.linear.x=0.8turtle_vel_msg.angular.z=0.6#发布消息turtle_vel_pub.publish(turtle_vel_msg)rospy.loginfo("linearis:%0.2fm/s,angularis:%0.2frad/s",turtle_vel_msg.linear.x,turtle_vel_msg.angular.z)rate.sleep()#按照循环频率延时编写Python发布者节点代码if__name__=='__main__':try:turtle_velocity_publisher()exceptrospy.ROSInterruptException:pass添加执行权限使用chmod命令为Python文件添加可执行权限。sudochmoda+xturtle_velocity_publisher.py注意我们现在并不是root用户,所以在使用命令添加可执行的权限时得在命令前加上sudo,否则我们的操作将无法生效。文件运行验证Python发布者节点rosrunlearn_topicturtle_velocity_publisher.py启动小海龟节点启动ROS主节点,小海龟节点程序,以及Python发布者节点程序,观察小海龟的运动。rosrunturtlesimturtlesim_node启动ROS主节点roscore启动Python发布者节点C++与Python对比C++与Python创建发布者流程对比初始化ROS节点创建句柄注册节点信息创建并初始化消息发布消息C++创建发布者需要5步,而Python只需要4步,因为Python在初始化节点时已经完成了句柄创建。Python流程初始化ROS节点注册节点信息创建并初始化消息发布消息C++流程ROS应用开发技术2.ROS通信编程-话题订阅者(上)01概念与创建步骤02文件编写04节点通讯图目录CONTENTS03文件运行概念与创建步骤话题订阅者概念0204050301处理消息建立实时消息传输通道多订阅订阅指定话题,接收其他节点发布的消息实时通信话题订阅者是ROS中用于接收和处理消息的节点,通过订阅特定话题,实时接收并处理消息。接收消息一个节点可订阅多个话题解耦合调用回调函数处理消息内容节点之间无需直接通信,提高系统灵活性创建订阅者步骤循环等待消息创建句柄节点是可执行文件,使用ROS客户端库与其他节点通信初始化节点保持节点活跃,准备接收消息订阅话题与ROS通信的接口或引用节点希望接收来自其他节点发布到该话题的消息处理订阅到的消息,解析数据,决定程序进行创建ROS话题订阅者的步骤分为五步:初始化节点、创建句柄、订阅话题、循环等待消息、在回调函数中处理消息。回调函数处理文件编写创建C++文件使用touch命令使用touch或vi命令创建名为turtle_pose_subscriber的C++文件。touchturtle_pose_subscriber.cpp使用vi命令viturtle_pose_subscriber.cpp编写C++订阅者节点代码#include<ros/ros.h>#include"turtlesim/Pose.h"voidturtle_poseCallback(constturtlesim::Pose::ConstPtr&msg){ROS_INFO("Turtlepose:x:%0.3f,y:%0.3f",msg->x,msg->y);}intmain(intargc,char**argv){ros::init(argc,argv,"turtle_pose_subscriber");//初始化ROS节点ros::NodeHandlen;//这里是创建句柄ros::Subscriberpose_sub=n.subscribe("/turtle1/pose",10,turtle_poseCallback);ros::spin();//循环等待回调函数return0;}配置CMakelist.txt文件0201在learn_topic功能包目录下,打开CMakelist.txt文件,在build区域添加内容,编译生成可执行程序。add_executable(turtle_pose_subscribersrc/turtle_pose_subscriber.cpp)target_link_libraries(turtle_pose_subscriber${catkin_LIBRARIES})target_link_libraries说明编译生成可执行文件所需要链接的库说明生成的可执行程序的文件是turtle_pose_subscriberadd_executable文件运行编译与环境变量更新sourcedevel/setup.bash更新环境变量编译代码catkin_make启动ROS主节点与运行节点04010302运行速度控制节点rosrunlearn_topicturtle_pose_subscriberroscorerosrunturtlesimturtle_teleop_key运行小海龟节点rosrunturtlesimturtlesim_node使用roscore启动ROS主节点,运行小海龟节点和速度控制节点,再运行订阅者节点接收数据。启动ROS主节点运行订阅者节点节点通讯图查看节点通讯通过rqt_graph工具来查看节点之间的通讯椭圆代表的是节点名称矩形表示的是话题名称箭头表示话题消息传递的方向ROS应用开发技术2.ROS通信编程-话题订阅者(下)01文件编写02文件运行03C++与Python对比目录CONTENTS文件编写Python文件创建在learn_topic目录下的scripts文件夹中创建名为turtle_pose_subscriber的Python文件。touchturtle_pose_subscriber.py或viturtle_pose_subscriber.py编写Python订阅者节点代码#!/usr/bin/envpython#-*-coding:utf-8-*-importrospyfromturtlesim.msgimportPosedefposeCallback(msg):rospy.loginfo("Turtlepose:x:%0.3f,y:%0.3f",msg.x,msg.y)defturtle_pose_subscriber():rospy.init_node('turtle_pose_subscriber',anonymous=True)#ROS节点初始化#创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallbackrospy.Subscriber("/turtle1/pose",Pose,poseCallback)rospy.spin()#循环等待回调函数if__name__=='__main__':turtle_pose_subscriber()赋予执行权限为Python文件添加可执行权限。执行权限使用chmod命令添加执行权限,非root用户需在命令前加sudo。sudochmoda+xturtle_pose_subscriber.py文件运行验证Python订阅者020301启动主节点和小海龟节点启动ROS主节点,启动turtlesim包下的节点,运行Python订阅者节点。roscorerosrunturtlesimturtlesim_noderosrunlearn_topicturtle_pose_subscriber.py运行小海龟速度控制节点运行订阅者节点,持续接收小海龟发送的位姿数据rosrunturtlesimturtle_teleop_keyC++与Python对比C++订阅者程序流程0402050103消息传递使用回调函数C++编译的话题订阅者程序流程。创建句柄创建订阅者初始化ROS节点Python订阅者程序流程Python编写的程序流程与C++类似,但不需要手动创建句柄。句柄创建Python会在内部自行完成句柄创建,无需手动创建。ROS应用开发技术3.ROS通信编程-服务端(上)01功能与创建步骤02文件编写03文件运行目录CONTENTS功能与创建步骤ROS服务端功能接收服务请求,执行任务,返回结果服务端功能请求-响应模型路径规划、图像处理、运动控制等服务类型通信模型在ROS中,服务端是提供服务的节点,通过提供服务来满足其他节点的请求。服务端节点接收来自其他节点的服务请求,并针对这些请求执行相应的任务,然后返回结果给请求方。ROS服务通过请求-响应模型实现节点之间的通信。通过服务端节点,ROS系统中的节点可以提供各种服务,如路径规划、图像处理、运动控制等,满足其他节点的需求。开发者可以根据具体的应用场景,编写相应的服务端节点,实现复杂的机器人控制功能。创建服务端的一般步骤执行功能处理,如数据处理、传感器读取等将结果发送回客户端初始化ROS节点回调函数定义服务器对象,指定服务类型和回调函数创建Server实例生成应答数据循环等待设置节点名称,初始化ROS通信机制监听客户端发送的服务请求文件编写C++文件创建0201进入src文件夹创建C++文件cdlearn_server/srctouchturtle_vel_command_server.cpp或viturtle_vel_command_server.cpp使用cd命令进入之前创建好的功能包learn_server的src文件夹下,使用touch命令或者vi命令创建一个名为turtle_vel_command_server.cpp的C++文件C++代码编写#include<ros/ros.h>#include<geometry_msgs/Twist.h>#include<std_srvs/Trigger.h>ros::Publisherturtle_vel_pub;boolpubvel=false;//service回调函数,输入参数req,输出参数resboolpubvelCallback(std_srvs::Trigger::Request&req,std_srvs::Trigger::Response&res){pubvel=!pubvel;ROS_INFO("Doyouwanttopublishthevel?:[%s]",pubvel==true?"Yes":"No");//打印客户端请求数据//设置反馈数据res.success=true;res.message="Thestatusischanged!";returntrue;}C++代码编写intmain(intargc,char**argv){ros::init(argc,argv,"turtle_vel_command_server");ros::NodeHandlen;//创建一个名为/turtle_vel_command的server,注册回调函数pubvelCallbackros::ServiceServercommand_service=n.advertiseService("/turtle_vel_command",pubvelCallback);//创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度8

turtle_vel_pub=n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",8);ros::Rateloop_rate(10);//设置循环的频率C++代码编写while(ros::ok()){ros::spinOnce();//查看一次回调函数队列

//判断pubvel为True,则发布小海龟速度指令

if(pubvel){geometry_msgs::Twistvel_msg;vel_msg.linear.x=0.6;vel_msg.angular.z=0.8;turtle_vel_pub.publish(vel_msg);}loop_rate.sleep();//按照循环频率延时

}

return0;}配置CMakelist.txt文件0201在learn_server功能包目录下,打开CMakelist.txt文件,在build区域添加内容,编译生成可执行程序。add_executable(turtle_vel_command_serversrc/turtle_vel_command_server.cpp)target_link_libraries(turtle_vel_command_server${catkin_LIBRARIES})target_link_libraries指定turtle_vel_command_server这个可执行目标在链接时需要链接的库添加一个名为turtle_vel_command_server的目标,它对应于要构建的可执行文件的名称add_executable文件运行编译C++代码010203catkin_make回到工作空间重新source环境变量编译C++代码sourcedevel/setup.bashcd~/ros_ws启动ROS服务并测试040601050302调用服务rosservicelistrosservicecall/turtle_vel_commandrosrunturtlesimturtlesim_node启动小海龟节点程序控制小海龟运动启动服务端节点查看服务rosrunlearn_serviceturtle_vel_command_server启动ROS核心服务roscore服务回调函数中pubvel值的反转ROS应用技术3.ROS通信编程-服务端(下)01文件编写02文件运行目录CONTENTS文件编写Python脚本创建与启动touchturtle_vel_command_server.py或viturtle_vel_command_server.py使用cd命令进入scripts文件夹,在该文件夹下创建一份名为turtle_vel_command_server.py的Python文件。进入scripts文件夹cdlearn_service/scripts创建Python文件Python代码编写importrospyimport_thread,timefromgeometry_msgs.msgimportTwistfromstd_srvs.srvimportTrigger,TriggerResponsepubvel=False;turtle_vel_pub=rospy.Publisher('/turtle1/cmd_vel',Twist,queue_size=8)defpubvel_thread():whileTrue:ifpubvel:vel_msg=Twist()vel_msg.linear.x=0.6vel_msg.angular.z=0.8turtle_vel_pub.publish(vel_msg)time.sleep(0.1)Python代码编写defpubvelCallback(req):globalpubvelpubvel=bool(1-pubvel)rospy.loginfo("Doyouwanttopublishthevel?[%s]",pubvel)#显示请求数据

returnTriggerResponse(1,"Changestate!")#反馈数据Python代码编写defturtle_pubvel_command_server():rospy.init_node('turtle_vel_command_server')#ROS节点初始化

#创建一个名为/turtle_command的server,注册回调函数pubvelCallbacks=rospy.Service('/turtle_vel_command',Trigger,pubvelCallback)#循环等待回调函数

print("Readytoreceiveturtle_pub_vel_command.")_thread.start_new_thread(pubvel_thread,())rospy.spin()if__name__=="__main__":turtle_pubvel_command_server()添加执行权限我们的Python文件还不能运行,我们还得以超级用户的身份,给turtle_vel_command_server.py这个文件添加执行权限,这样所有用户都可以运行这个Python脚本。并且可以直接在命令行中输入./turtle_vel_command_server.py来运行这个脚本,而不需要先使用python或python3命令。直接运行脚本添加执行权限./turtle_vel_command_server.pysudochmoda+xturtle_vel_command_server.py文件运行启动ROS节点与服务调用04030102roscore启动小海龟节点程序启动服务端节点调用服务rosservicecall/turtle_vel_commandrosrunturtlesimturtlesim_node启动ROS主节点ROS应用技术4.ROS通信编程-客户端(上)01客户端介绍与创建步骤02文件编写03文件运行目录CONTENTS客户端介绍与创建步骤服务客户端简介在ROS中,服务客户端是用于向服务端节点发送服务请求并接收响应的节点。服务客户端节点负责向指定的服务发送请求消息,并等待服务端节点的响应消息,然后根据响应执行相应的操作。客户端作用03010204实现节点通信接收响应发送服务请求执行操作应用场景030102感知任务运动控制路劲规划创建ROS服务客户端的步骤创建ROS服务客户端包括以下步骤:初始化ROS节点、创建句柄、创建Client实例、初始化并发布服务请求数据、等待Server处理之后的应答结果。创建句柄,管理节点与ROS主节点之间的通信。第四步等待Server处理之后的应答结果。第五步创建Client实例,用于发送服务请求并接收服务器的响应。第二步初始化并发布服务请求数据。第三步初始化ROS节点,通过调用ROS提供的初始化函数完成。第一步文件编写创建learn_service功能包020301依赖包括std_msgs、rospy、roscpp、geometry_msgs、turtlesim等。使用catkin_make命令编译learn_service功能包。依赖配置使用catkin_create_pkg命令创建learn_service功能包。创建功能包编译功能包C++代码编写#include<ros/ros.h>#include<turtlesim/Spawn.h>intmain(intargc,char**argv){ros::init(argc,argv,"a_nes_turtle");//初始化ROS节点ros::NodeHandlenode;ros::service::waitForService("/spawn");//等待/spawn服务ros::ServiceClientnew_turtle=node.serviceClient<turtlesim::Spawn>("/spawn");//创建一个服务客户端,连接名为/spawn的服务//初始化turtlesim::Spawn的请求数据turtlesim::Spawnnew_turtle_srv;new_turtle_srv.request.x=6.0;new_turtle_srv.request.y=8.0;new_turtle_="turtle2";C++代码编写

//请求服务传入xy位置参数以及名字参数

ROS_INFO("Callservicetocreateanewturtlenameis%s,atthex:%.1f,y:%.1f",new_turtle_.c_str(),new_turtle_srv.request.x,new_turtle_srv.request.y);new_turtle.call(new_turtle_srv);//请求服务

ROS_INFO("Spwanturtlesuccessfully[name:%s]",new_turtle_.c_str());//显示服务调用结果

return0;};C++代码编写与配置03010402target_link_libraries(a_new_turtle${catkin_LIBRARIES})指定需要链接的库完成C++代码编写后,需要在learn_service功能包下的CMakelist.txt文件内进行配置。使用vi命令打开该文件,找到build区域,添加add_executable和target_link_libraries内容,指定生成的可执行程序文件和编译的源码,以及需要链接的库。指定编译源码CMakelist.txt配置添加add_executable和target_link_libraries内容。指定可执行程序文件编译的源码是src目录下的a_new_turtle.cpp。add_executable(a_new_turtlesrc/a_new_turtle.cpp)文件运行编译C++代码0201更新环境变量进入工作空间目录下,使用catkin_make命令对C++代码进行编译。编译通过后,重新source环境变量,以便找到或更新程序。使用catkin_make命令对C++代码进行编译。编译操作sourcedevel/setup.bash运行客户端节点程序231运行小海龟节点程序rosrunlearn_servicea_new_turtle使用roscore命令开启ROS主节点,然后在新终端运行小海龟节点程序。再新开一个终端窗口,使用rosrun命令运行客户端节点程序,产生一个小海龟。开启ROS主节点运行客户端节点程序rosrunturtlesimturtlesim_noderoscore小海龟服务/spawn的使用使用rosserviceinfo/spawn查看服务需要的参数。创建服务/spawn,产生另外一只小海龟turtle2。使用rosservicelist命令查看小海龟提供的服务。查看服务服务/spawn的使用查看服务参数启动小海龟节点后,运行a_new_turtle程序,画面中会出现另外一只小海龟。这是因为小海龟的节点提供了服务/spawn,创建该服务会产生另外一只小海龟turtle2。通过rosservicelist命令查看小海龟提供的服务,使用rosserviceinfo/spawn查看服务需要的参数,包括x,y,theta,name。ROS应用开发技术4.ROS通信编程-客户端(下)01文件编写02文件运行03C++与Python对比目录CONTENTS文件编写Python脚本创建与启动toucha_new_turtle.py或via_new_turtle.py使用cd命令进入scripts文件夹,在该文件夹下创建一份名为a_new_turtle.py的Python文件。进入scripts文件夹cdlearn_service/scripts创建Python文件Python代码编写importsysimportrospyfromturtlesim.srvimportSpawndefturtle_spawn():rospy.init_node('new_turtle')#ROS节点初始化rospy.wait_for_service('/spawn')#等待/spawn服务try:new_turtle=rospy.ServiceProxy('/spawn',Spawn)response=new_turtle(2.0,2.0,0.0,"turtle2")#输入请求数据returnexceptrospy.ServiceExceptionase:print("failedtocallservice:%s")if__name__=="__main__":#服务调用并显示调用结果print("anewturtlenamed%s."%(turtle_spawn()))添加执行权限我们的Python文件还不能运行,我们还得以超级用户的身份,给a_new_turtle.py这个文件添加执行权限,这样所有用户都可以运行这个Python脚本。并且可以直接在命令行中输入./a_new_turtle.py来运行这个脚本,而不需要先使用python或python3命令。直接运行脚本添加执行权限./a_new_turtle.pysudochmoda+xa_new_turtle.py文件运行启动ROS节点与服务调用030102roscore启动小海龟节点程序启动服务端节点rosrunturtlesimturtlesim_node启动ROS主节点rosrunlearn_servicea_new_turtle.pyC++与Python对比C++与Python流程对比初始化ROS节点创建句柄创建并连接服务客户端初始化并发布服务请求数据调用服务并等待应答C++创建客户端需要5步,而Python只需要4步,因为Python在初始化节点时已经完成了句柄创建。Python流程初始化ROS节点等待并创建服务客户端初始化服务请求数据等待处理后的应答结果C++流程ROS应用开发技术5.ROS通信编程-动作客户端01动作客户端概述02文件创建03文件配置与运行目录CONTENTS动作客户端概述ROS动作客户端概述向动作服务器发送动作请求并接收执行结果应用场景工作流程动作客户端功能查找动作、创建目标消息、发送目标消息、等待执行结果实现复杂的机器人控制功能,如运动规划、抓取任务和导航文件创建创建learn_action功能包020301依赖包括std_msgs、rospy、roscpp、actionlib、actionlib_msgs等。使用catkin_make命令编译learn_action功能包。依赖配置使用catkin_create_pkg命令创建learn_action功能包。创建功能包编译功能包依赖包解释C++语言的ROS客户端库,允许使用C++编写ROS节点std_msgsactionlib_msgsPython语言的ROS客户端库,允许使用Python编写ROS节点roscpp包含一些标准消息类型,如String、Int32等,在ROS中被广泛使用包含actionlib包使用的消息类型提供ROS动作机制的实现,用于长时间运行的任务,它提供了目标设置、反馈和结果等交互机制actionlibrospy定义动作文件#Definethegoaluint32dishwasher_id#Specifywhichdishwasherwewanttouse---#Definetheresultuint32total_dishes_cleaned---#Defineafeedbackmessagefloat32percent_complete在action文件夹下,新建一个文件,命名为DoDishes.action配置CMakeLists.txt文件find_package(catkinREQUIREDCOMPONENTSactionlibactionlib_msgsroscpprospystd_msgsgenmsg)add_action_files(DIRECTORYactionFILESDoDishes.action)generate_messages(DEPENDENCIESactionlib_msgs)编译和生成消息文件编译CMakeLists.txt使用genaction.py生成msg文件使用catkin_make命令进行编译生成消息文件使用rosmsglist命令查看查看消息类型action_client.cpp文件编写#include<actionlib/client/simple_action_client.h>#include"learn_action/DoDishesAction.h"typedefactionlib::SimpleActionClient<learn_action::DoDishesAction>Client;//当action完成后会调用次回调函数一次voiddoneCb(constactionlib::SimpleClientGoalState&state,constlearn_action::DoDishesResultConstPtr&result){ROS_INFO("Yay!Thedishesarenowclean");ros::shutdown();}//当action激活后会调用次回调函数一次voidactiveCb(){ROS_INFO("Goaljustwentactive");}action_client.cpp文件编写//收到feedback后调用的回调函数voidfeedbackCb(constlearn_action::DoDishesFeedbackConstPtr&feedback){ROS_INFO("percent_complete:%f",feedback->percent_complete);}action_client.cpp文件编写intmain(intargc,char**argv){ros::init(argc,argv,"do_dishes_client");Clientclient("do_dishes",true);ROS_INFO("Waitingforactionservertostart.");client.waitForServer();ROS_INFO("Actionserverstarted,sendinggoal.");learn_action::DoDishesGoalgoal;goal.dishwasher_id=1;client.sendGoal(goal,&doneCb,&activeCb,&feedbackCb);ros::spin();return0;}文件配置与运行配置CMakelist.txt文件0201在learn_action功能包目录下,打开CMakelist.txt文件,添加以下内容add_executable(action_clientsrc/action_client.cpp)target_link_libraries(action_client${catkin_LIBRARIES})add_dependencies(action_client${${PROJECT_NAME}_EXPORTED_TARGETS})target_link_libraries表示将action_client这个目标链接到由变量所定义的库表示创建一个可执行目标,名为action_client,其源代码文件为src文件夹下的action_client.cppadd_executable03add_dependencies表示action_client这个目标依赖于变量所指定的其他目标工厂自动化更新环境运行C++文件rosrunlearn_actionaction_clientcatkin_makesourcedevel/setup.bash编译功能包由于现在我们没有运行服务端,所以没有提供相对应的服务,或者说执行相应的动作以及反馈。所以运行后我们无法看见任何内容。ROS应用开发技术6.ROS通信编程-动作服务端01动作服务端介绍02文件编写03文件运行目录CONTENTS动作服务端介绍动作服务端简介目标-反馈-结果通信模型接收动作客户端节点的动作请求并执行具体动作动作服务器节点具体工作

温馨提示

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

评论

0/150

提交评论