《ROS應用技術》課件-11.ros通信編程_第1頁
《ROS應用技術》課件-11.ros通信編程_第2頁
《ROS應用技術》課件-11.ros通信編程_第3頁
《ROS應用技術》課件-11.ros通信編程_第4頁
《ROS應用技術》課件-11.ros通信編程_第5頁
已閱讀5頁,還剩127頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

ROS應用開發(fā)技術1.ROS通信編程-話題發(fā)布者(上)01話題介紹與創(chuàng)建步驟02C++創(chuàng)建話題03文件編譯與運行目錄CONTENTS話題介紹與創(chuàng)建步驟ROS中的話題話題是實現(xiàn)節(jié)點間通信的重要機制。消息發(fā)布與訂閱節(jié)點通過話題發(fā)布消息和訂閱消息,實現(xiàn)數據傳輸和共享。話題是ROS中實現(xiàn)節(jié)點之間通信的重要機制,通過話題節(jié)點可以發(fā)布消息和訂閱消息,實現(xiàn)數據的傳輸和共享。話題定義ROS話題發(fā)布者創(chuàng)建步驟節(jié)點與ROS系統(tǒng)其他部分交互的接口。創(chuàng)建消息對象并填充字段,消息是節(jié)點間通信的基本單位。按照一定頻率循環(huán)發(fā)送消息。設置ROS環(huán)境的基礎,啟動新節(jié)點。向ROSMaster注冊節(jié)點信息,包括發(fā)布的話題名和消息類型以及隊列長度。創(chuàng)建句柄創(chuàng)建并初始化消息數據注冊節(jié)點信息循環(huán)發(fā)送消息C++創(chuàng)建話題創(chuàng)建功能包0102使用catkin_create_pkg命令創(chuàng)建功能包。catkin_create_pkglearn_topicstd_msgsrospyroscppgeometry_msgsturtlesim創(chuàng)建功能包進入src文件夾使用cd命令進入工作空間的src文件夾,然后使用catkin_create_pkg命令創(chuàng)建功能包。使用cd命令進入工作空間的src文件夾。cd~/ros_ws/src創(chuàng)建C++文件使用touch命令創(chuàng)建一個名為turtle_velocity_publisher的C++文件touchturtle_velocity_publisher.cpp或者直接使用vi命令創(chuàng)建并打開該文件viturtle_velocity_publisher.cpp編寫速度發(fā)布者程序/*創(chuàng)建一個小海龜的速度發(fā)布者*/#include<ros/ros.h>#include<geometry_msgs/Twist.h>intmain(intargc,char**argv){ros::init(argc,argv,"turtle_velocity_publisher");//ROS節(jié)點初始化ros::NodeHandlen;//這里是創(chuàng)建句柄//創(chuàng)建一個Publisher,發(fā)布名為/turtle1/cmd_vel的topic,消息類型為geometry_msgs::Twist,隊列長度10ros::Publisherturtle_vel_pub=n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",10);ros::Rateloop_rate(10);//設置循環(huán)的頻率while(ros::ok())

編寫速度發(fā)布者程序

{//初始化需要發(fā)布的消息,類型需與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);//發(fā)布速度消息//打印發(fā)布的速度內容ROS_INFO("Publshturtlevelocitycommand[%0.2fm/s,%0.2frad/s]",turtle_vel_msg.linear.x,turtle_vel_msg.angular.z);loop_rate.sleep();//按照循環(huán)頻率延時}return0;CMakelist.txt配置說明生成的可執(zhí)行程序的文件是turtle_velocity_publisheradd_executable說明編譯生成可執(zhí)行文件所需要鏈接的庫。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當前的環(huán)境變量。運行程序需要在終端中輸入roscore命令,運行ROS的主節(jié)點。返回工作空間目錄cd~/ros_wscatkin_make命令進行編譯重新source環(huán)境變量sourcedevel/setup.bash運行小海龜節(jié)點程序使用rosrun命令運行小海龜節(jié)點程序,然后同樣使用rosrun命令運行發(fā)布者節(jié)點程序。運行小海龜節(jié)點程序運行發(fā)布者節(jié)點程序rosrunturtlesimturtlesim_noderosrunlearn_topicturtle_velocity_publisher查看節(jié)點列表0201查看節(jié)點列表節(jié)點名為/turtle_velocity_publisher,與代碼中編寫的一致。在終端中使用rosnodelist查看節(jié)點列表,可以看到名為/turtle_velocity_publisher的節(jié)點。節(jié)點名稱使用rosnodelist查看節(jié)點列表。ROS應用開發(fā)技術1.ROS通信編程-話題發(fā)布者(下)01Python創(chuàng)建話題02文件運行03C++與Python對比目錄CONTENTSPython創(chuàng)建話題創(chuàng)建Python腳本文件夾和文件mkdirscripts創(chuàng)建文件創(chuàng)建文件夾touchturtle_velocity_publisher.py或viturtle_velocity_publisher.py編寫Python發(fā)布者節(jié)點代碼importrospyfromgeometry_msgs.msgimportTwistdefturtle_velocity_publisher():rospy.init_node('turtle_velocity_publisher',anonymous=True)#ROS節(jié)點初始化turtle_vel_pub=rospy.Publisher('/turtle1/cmd_vel',Twist,queue_size=8)rate=rospy.Rate(10)#設置循環(huán)的頻率whilenotrospy.is_shutdown():#初始化geometry_msgs::Twist類型的消息turtle_vel_msg=Twist()turtle_vel_msg.linear.x=0.8turtle_vel_msg.angular.z=0.6#發(fā)布消息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()#按照循環(huán)頻率延時編寫Python發(fā)布者節(jié)點代碼if__name__=='__main__':try:turtle_velocity_publisher()exceptrospy.ROSInterruptException:pass添加執(zhí)行權限使用chmod命令為Python文件添加可執(zhí)行權限。sudochmoda+xturtle_velocity_publisher.py注意我們現(xiàn)在并不是root用戶,所以在使用命令添加可執(zhí)行的權限時得在命令前加上sudo,否則我們的操作將無法生效。文件運行驗證Python發(fā)布者節(jié)點rosrunlearn_topicturtle_velocity_publisher.py啟動小海龜節(jié)點啟動ROS主節(jié)點,小海龜節(jié)點程序,以及Python發(fā)布者節(jié)點程序,觀察小海龜的運動。rosrunturtlesimturtlesim_node啟動ROS主節(jié)點roscore啟動Python發(fā)布者節(jié)點C++與Python對比C++與Python創(chuàng)建發(fā)布者流程對比初始化ROS節(jié)點創(chuàng)建句柄注冊節(jié)點信息創(chuàng)建并初始化消息發(fā)布消息C++創(chuàng)建發(fā)布者需要5步,而Python只需要4步,因為Python在初始化節(jié)點時已經完成了句柄創(chuàng)建。Python流程初始化ROS節(jié)點注冊節(jié)點信息創(chuàng)建并初始化消息發(fā)布消息C++流程ROS應用開發(fā)技術2.ROS通信編程-話題訂閱者(上)01概念與創(chuàng)建步驟02文件編寫04節(jié)點通訊圖目錄CONTENTS03文件運行概念與創(chuàng)建步驟話題訂閱者概念0204050301處理消息建立實時消息傳輸通道多訂閱訂閱指定話題,接收其他節(jié)點發(fā)布的消息實時通信話題訂閱者是ROS中用于接收和處理消息的節(jié)點,通過訂閱特定話題,實時接收并處理消息。接收消息一個節(jié)點可訂閱多個話題解耦合調用回調函數處理消息內容節(jié)點之間無需直接通信,提高系統(tǒng)靈活性創(chuàng)建訂閱者步驟循環(huán)等待消息創(chuàng)建句柄節(jié)點是可執(zhí)行文件,使用ROS客戶端庫與其他節(jié)點通信初始化節(jié)點保持節(jié)點活躍,準備接收消息訂閱話題與ROS通信的接口或引用節(jié)點希望接收來自其他節(jié)點發(fā)布到該話題的消息處理訂閱到的消息,解析數據,決定程序進行創(chuàng)建ROS話題訂閱者的步驟分為五步:初始化節(jié)點、創(chuàng)建句柄、訂閱話題、循環(huán)等待消息、在回調函數中處理消息。回調函數處理文件編寫創(chuàng)建C++文件使用touch命令使用touch或vi命令創(chuàng)建名為turtle_pose_subscriber的C++文件。touchturtle_pose_subscriber.cpp使用vi命令viturtle_pose_subscriber.cpp編寫C++訂閱者節(jié)點代碼#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節(jié)點ros::NodeHandlen;//這里是創(chuàng)建句柄ros::Subscriberpose_sub=n.subscribe("/turtle1/pose",10,turtle_poseCallback);ros::spin();//循環(huán)等待回調函數return0;}配置CMakelist.txt文件0201在learn_topic功能包目錄下,打開CMakelist.txt文件,在build區(qū)域添加內容,編譯生成可執(zhí)行程序。add_executable(turtle_pose_subscribersrc/turtle_pose_subscriber.cpp)target_link_libraries(turtle_pose_subscriber${catkin_LIBRARIES})target_link_libraries說明編譯生成可執(zhí)行文件所需要鏈接的庫說明生成的可執(zhí)行程序的文件是turtle_pose_subscriberadd_executable文件運行編譯與環(huán)境變量更新sourcedevel/setup.bash更新環(huán)境變量編譯代碼catkin_make啟動ROS主節(jié)點與運行節(jié)點04010302運行速度控制節(jié)點rosrunlearn_topicturtle_pose_subscriberroscorerosrunturtlesimturtle_teleop_key運行小海龜節(jié)點rosrunturtlesimturtlesim_node使用roscore啟動ROS主節(jié)點,運行小海龜節(jié)點和速度控制節(jié)點,再運行訂閱者節(jié)點接收數據。啟動ROS主節(jié)點運行訂閱者節(jié)點節(jié)點通訊圖查看節(jié)點通訊通過rqt_graph工具來查看節(jié)點之間的通訊橢圓代表的是節(jié)點名稱矩形表示的是話題名稱箭頭表示話題消息傳遞的方向ROS應用開發(fā)技術2.ROS通信編程-話題訂閱者(下)01文件編寫02文件運行03C++與Python對比目錄CONTENTS文件編寫Python文件創(chuàng)建在learn_topic目錄下的scripts文件夾中創(chuàng)建名為turtle_pose_subscriber的Python文件。touchturtle_pose_subscriber.py或viturtle_pose_subscriber.py編寫Python訂閱者節(jié)點代碼#!/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節(jié)點初始化#創(chuàng)建一個Subscriber,訂閱名為/turtle1/pose的topic,注冊回調函數poseCallbackrospy.Subscriber("/turtle1/pose",Pose,poseCallback)rospy.spin()#循環(huán)等待回調函數if__name__=='__main__':turtle_pose_subscriber()賦予執(zhí)行權限為Python文件添加可執(zhí)行權限。執(zhí)行權限使用chmod命令添加執(zhí)行權限,非root用戶需在命令前加sudo。sudochmoda+xturtle_pose_subscriber.py文件運行驗證Python訂閱者020301啟動主節(jié)點和小海龜節(jié)點啟動ROS主節(jié)點,啟動turtlesim包下的節(jié)點,運行Python訂閱者節(jié)點。roscorerosrunturtlesimturtlesim_noderosrunlearn_topicturtle_pose_subscriber.py運行小海龜速度控制節(jié)點運行訂閱者節(jié)點,持續(xù)接收小海龜發(fā)送的位姿數據rosrunturtlesimturtle_teleop_keyC++與Python對比C++訂閱者程序流程0402050103消息傳遞使用回調函數C++編譯的話題訂閱者程序流程。創(chuàng)建句柄創(chuàng)建訂閱者初始化ROS節(jié)點Python訂閱者程序流程Python編寫的程序流程與C++類似,但不需要手動創(chuàng)建句柄。句柄創(chuàng)建Python會在內部自行完成句柄創(chuàng)建,無需手動創(chuàng)建。ROS應用開發(fā)技術3.ROS通信編程-服務端(上)01功能與創(chuàng)建步驟02文件編寫03文件運行目錄CONTENTS功能與創(chuàng)建步驟ROS服務端功能接收服務請求,執(zhí)行任務,返回結果服務端功能請求-響應模型路徑規(guī)劃、圖像處理、運動控制等服務類型通信模型在ROS中,服務端是提供服務的節(jié)點,通過提供服務來滿足其他節(jié)點的請求。服務端節(jié)點接收來自其他節(jié)點的服務請求,并針對這些請求執(zhí)行相應的任務,然后返回結果給請求方。ROS服務通過請求-響應模型實現(xiàn)節(jié)點之間的通信。通過服務端節(jié)點,ROS系統(tǒng)中的節(jié)點可以提供各種服務,如路徑規(guī)劃、圖像處理、運動控制等,滿足其他節(jié)點的需求。開發(fā)者可以根據具體的應用場景,編寫相應的服務端節(jié)點,實現(xiàn)復雜的機器人控制功能。創(chuàng)建服務端的一般步驟執(zhí)行功能處理,如數據處理、傳感器讀取等將結果發(fā)送回客戶端初始化ROS節(jié)點回調函數定義服務器對象,指定服務類型和回調函數創(chuàng)建Server實例生成應答數據循環(huán)等待設置節(jié)點名稱,初始化ROS通信機制監(jiān)聽客戶端發(fā)送的服務請求文件編寫C++文件創(chuàng)建0201進入src文件夾創(chuàng)建C++文件cdlearn_server/srctouchturtle_vel_command_server.cpp或viturtle_vel_command_server.cpp使用cd命令進入之前創(chuàng)建好的功能包learn_server的src文件夾下,使用touch命令或者vi命令創(chuàng)建一個名為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;//創(chuàng)建一個名為/turtle_vel_command的server,注冊回調函數pubvelCallbackros::ServiceServercommand_service=n.advertiseService("/turtle_vel_command",pubvelCallback);//創(chuàng)建一個Publisher,發(fā)布名為/turtle1/cmd_vel的topic,消息類型為geometry_msgs::Twist,隊列長度8

turtle_vel_pub=n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",8);ros::Rateloop_rate(10);//設置循環(huán)的頻率C++代碼編寫while(ros::ok()){ros::spinOnce();//查看一次回調函數隊列

//判斷pubvel為True,則發(fā)布小海龜速度指令

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();//按照循環(huán)頻率延時

}

return0;}配置CMakelist.txt文件0201在learn_server功能包目錄下,打開CMakelist.txt文件,在build區(qū)域添加內容,編譯生成可執(zhí)行程序。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這個可執(zhí)行目標在鏈接時需要鏈接的庫添加一個名為turtle_vel_command_server的目標,它對應于要構建的可執(zhí)行文件的名稱add_executable文件運行編譯C++代碼010203catkin_make回到工作空間重新source環(huán)境變量編譯C++代碼sourcedevel/setup.bashcd~/ros_ws啟動ROS服務并測試040601050302調用服務rosservicelistrosservicecall/turtle_vel_commandrosrunturtlesimturtlesim_node啟動小海龜節(jié)點程序控制小海龜運動啟動服務端節(jié)點查看服務rosrunlearn_serviceturtle_vel_command_server啟動ROS核心服務roscore服務回調函數中pubvel值的反轉ROS應用技術3.ROS通信編程-服務端(下)01文件編寫02文件運行目錄CONTENTS文件編寫Python腳本創(chuàng)建與啟動touchturtle_vel_command_server.py或viturtle_vel_command_server.py使用cd命令進入scripts文件夾,在該文件夾下創(chuàng)建一份名為turtle_vel_command_server.py的Python文件。進入scripts文件夾cdlearn_service/scripts創(chuàng)建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節(jié)點初始化

#創(chuàng)建一個名為/turtle_command的server,注冊回調函數pubvelCallbacks=rospy.Service('/turtle_vel_command',Trigger,pubvelCallback)#循環(huán)等待回調函數

print("Readytoreceiveturtle_pub_vel_command.")_thread.start_new_thread(pubvel_thread,())rospy.spin()if__name__=="__main__":turtle_pubvel_command_server()添加執(zhí)行權限我們的Python文件還不能運行,我們還得以超級用戶的身份,給turtle_vel_command_server.py這個文件添加執(zhí)行權限,這樣所有用戶都可以運行這個Python腳本。并且可以直接在命令行中輸入./turtle_vel_command_server.py來運行這個腳本,而不需要先使用python或python3命令。直接運行腳本添加執(zhí)行權限./turtle_vel_command_server.pysudochmoda+xturtle_vel_command_server.py文件運行啟動ROS節(jié)點與服務調用04030102roscore啟動小海龜節(jié)點程序啟動服務端節(jié)點調用服務rosservicecall/turtle_vel_commandrosrunturtlesimturtlesim_node啟動ROS主節(jié)點ROS應用技術4.ROS通信編程-客戶端(上)01客戶端介紹與創(chuàng)建步驟02文件編寫03文件運行目錄CONTENTS客戶端介紹與創(chuàng)建步驟服務客戶端簡介在ROS中,服務客戶端是用于向服務端節(jié)點發(fā)送服務請求并接收響應的節(jié)點。服務客戶端節(jié)點負責向指定的服務發(fā)送請求消息,并等待服務端節(jié)點的響應消息,然后根據響應執(zhí)行相應的操作??蛻舳俗饔?3010204實現(xiàn)節(jié)點通信接收響應發(fā)送服務請求執(zhí)行操作應用場景030102感知任務運動控制路勁規(guī)劃創(chuàng)建ROS服務客戶端的步驟創(chuàng)建ROS服務客戶端包括以下步驟:初始化ROS節(jié)點、創(chuàng)建句柄、創(chuàng)建Client實例、初始化并發(fā)布服務請求數據、等待Server處理之后的應答結果。創(chuàng)建句柄,管理節(jié)點與ROS主節(jié)點之間的通信。第四步等待Server處理之后的應答結果。第五步創(chuàng)建Client實例,用于發(fā)送服務請求并接收服務器的響應。第二步初始化并發(fā)布服務請求數據。第三步初始化ROS節(jié)點,通過調用ROS提供的初始化函數完成。第一步文件編寫創(chuàng)建learn_service功能包020301依賴包括std_msgs、rospy、roscpp、geometry_msgs、turtlesim等。使用catkin_make命令編譯learn_service功能包。依賴配置使用catkin_create_pkg命令創(chuàng)建learn_service功能包。創(chuàng)建功能包編譯功能包C++代碼編寫#include<ros/ros.h>#include<turtlesim/Spawn.h>intmain(intargc,char**argv){ros::init(argc,argv,"a_nes_turtle");//初始化ROS節(jié)點ros::NodeHandlenode;ros::service::waitForService("/spawn");//等待/spawn服務ros::ServiceClientnew_turtle=node.serviceClient<turtlesim::Spawn>("/spawn");//創(chuàng)建一個服務客戶端,連接名為/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區(qū)域,添加add_executable和target_link_libraries內容,指定生成的可執(zhí)行程序文件和編譯的源碼,以及需要鏈接的庫。指定編譯源碼CMakelist.txt配置添加add_executable和target_link_libraries內容。指定可執(zhí)行程序文件編譯的源碼是src目錄下的a_new_turtle.cpp。add_executable(a_new_turtlesrc/a_new_turtle.cpp)文件運行編譯C++代碼0201更新環(huán)境變量進入工作空間目錄下,使用catkin_make命令對C++代碼進行編譯。編譯通過后,重新source環(huán)境變量,以便找到或更新程序。使用catkin_make命令對C++代碼進行編譯。編譯操作sourcedevel/setup.bash運行客戶端節(jié)點程序231運行小海龜節(jié)點程序rosrunlearn_servicea_new_turtle使用roscore命令開啟ROS主節(jié)點,然后在新終端運行小海龜節(jié)點程序。再新開一個終端窗口,使用rosrun命令運行客戶端節(jié)點程序,產生一個小海龜。開啟ROS主節(jié)點運行客戶端節(jié)點程序rosrunturtlesimturtlesim_noderoscore小海龜服務/spawn的使用使用rosserviceinfo/spawn查看服務需要的參數。創(chuàng)建服務/spawn,產生另外一只小海龜turtle2。使用rosservicelist命令查看小海龜提供的服務。查看服務服務/spawn的使用查看服務參數啟動小海龜節(jié)點后,運行a_new_turtle程序,畫面中會出現(xiàn)另外一只小海龜。這是因為小海龜的節(jié)點提供了服務/spawn,創(chuàng)建該服務會產生另外一只小海龜turtle2。通過rosservicelist命令查看小海龜提供的服務,使用rosserviceinfo/spawn查看服務需要的參數,包括x,y,theta,name。ROS應用開發(fā)技術4.ROS通信編程-客戶端(下)01文件編寫02文件運行03C++與Python對比目錄CONTENTS文件編寫Python腳本創(chuàng)建與啟動toucha_new_turtle.py或via_new_turtle.py使用cd命令進入scripts文件夾,在該文件夾下創(chuàng)建一份名為a_new_turtle.py的Python文件。進入scripts文件夾cdlearn_service/scripts創(chuàng)建Python文件Python代碼編寫importsysimportrospyfromturtlesim.srvimportSpawndefturtle_spawn():rospy.init_node('new_turtle')#ROS節(jié)點初始化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()))添加執(zhí)行權限我們的Python文件還不能運行,我們還得以超級用戶的身份,給a_new_turtle.py這個文件添加執(zhí)行權限,這樣所有用戶都可以運行這個Python腳本。并且可以直接在命令行中輸入./a_new_turtle.py來運行這個腳本,而不需要先使用python或python3命令。直接運行腳本添加執(zhí)行權限./a_new_turtle.pysudochmoda+xa_new_turtle.py文件運行啟動ROS節(jié)點與服務調用030102roscore啟動小海龜節(jié)點程序啟動服務端節(jié)點rosrunturtlesimturtlesim_node啟動ROS主節(jié)點rosrunlearn_servicea_new_turtle.pyC++與Python對比C++與Python流程對比初始化ROS節(jié)點創(chuàng)建句柄創(chuàng)建并連接服務客戶端初始化并發(fā)布服務請求數據調用服務并等待應答C++創(chuàng)建客戶端需要5步,而Python只需要4步,因為Python在初始化節(jié)點時已經完成了句柄創(chuàng)建。Python流程初始化ROS節(jié)點等待并創(chuàng)建服務客戶端初始化服務請求數據等待處理后的應答結果C++流程ROS應用開發(fā)技術5.ROS通信編程-動作客戶端01動作客戶端概述02文件創(chuàng)建03文件配置與運行目錄CONTENTS動作客戶端概述ROS動作客戶端概述向動作服務器發(fā)送動作請求并接收執(zhí)行結果應用場景工作流程動作客戶端功能查找動作、創(chuàng)建目標消息、發(fā)送目標消息、等待執(zhí)行結果實現(xiàn)復雜的機器人控制功能,如運動規(guī)劃、抓取任務和導航文件創(chuàng)建創(chuàng)建learn_action功能包020301依賴包括std_msgs、rospy、roscpp、actionlib、actionlib_msgs等。使用catkin_make命令編譯learn_action功能包。依賴配置使用catkin_create_pkg命令創(chuàng)建learn_action功能包。創(chuàng)建功能包編譯功能包依賴包解釋C++語言的ROS客戶端庫,允許使用C++編寫ROS節(jié)點std_msgsactionlib_msgsPython語言的ROS客戶端庫,允許使用Python編寫ROS節(jié)點roscpp包含一些標準消息類型,如String、Int32等,在ROS中被廣泛使用包含actionlib包使用的消息類型提供ROS動作機制的實現(xiàn),用于長時間運行的任務,它提供了目標設置、反饋和結果等交互機制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這個目標鏈接到由變量所定義的庫表示創(chuàng)建一個可執(zhí)行目標,名為action_client,其源代碼文件為src文件夾下的action_client.cppadd_executable03add_dependencies表示action_client這個目標依賴于變量所指定的其他目標工廠自動化更新環(huán)境運行C++文件rosrunlearn_actionaction_clientcatkin_makesourcedevel/setup.bash編譯功能包由于現(xiàn)在我們沒有運行服務端,所以沒有提供相對應的服務,或者說執(zhí)行相應的動作以及反饋。所以運行后我們無法看見任何內容。ROS應用開發(fā)技術6.ROS通信編程-動作服務端01動作服務端介紹02文件編寫03文件運行目錄CONTENTS動作服務端介紹動作服務端簡介目標-反饋-結果通信模型接收動作客戶端節(jié)點的動作請求并執(zhí)行具體動作動作服務器節(jié)點具體工作

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論