版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ROS應(yīng)用開(kāi)發(fā)技術(shù)1.ROS通信編程-話題發(fā)布者(上)01話題介紹與創(chuàng)建步驟02C++創(chuàng)建話題03文件編譯與運(yùn)行目錄CONTENTS話題介紹與創(chuàng)建步驟ROS中的話題話題是實(shí)現(xiàn)節(jié)點(diǎn)間通信的重要機(jī)制。消息發(fā)布與訂閱節(jié)點(diǎn)通過(guò)話題發(fā)布消息和訂閱消息,實(shí)現(xiàn)數(shù)據(jù)傳輸和共享。話題是ROS中實(shí)現(xiàn)節(jié)點(diǎn)之間通信的重要機(jī)制,通過(guò)話題節(jié)點(diǎn)可以發(fā)布消息和訂閱消息,實(shí)現(xiàn)數(shù)據(jù)的傳輸和共享。話題定義ROS話題發(fā)布者創(chuàng)建步驟節(jié)點(diǎn)與ROS系統(tǒng)其他部分交互的接口。創(chuàng)建消息對(duì)象并填充字段,消息是節(jié)點(diǎn)間通信的基本單位。按照一定頻率循環(huán)發(fā)送消息。設(shè)置ROS環(huán)境的基礎(chǔ),啟動(dòng)新節(jié)點(diǎn)。向ROSMaster注冊(cè)節(jié)點(diǎn)信息,包括發(fā)布的話題名和消息類(lèi)型以及隊(duì)列長(zhǎng)度。創(chuàng)建句柄創(chuàng)建并初始化消息數(shù)據(jù)注冊(cè)節(jié)點(diǎn)信息循環(huán)發(fā)送消息C++創(chuàng)建話題創(chuàng)建功能包0102使用catkin_create_pkg命令創(chuàng)建功能包。catkin_create_pkglearn_topicstd_msgsrospyroscppgeometry_msgsturtlesim創(chuàng)建功能包進(jìn)入src文件夾使用cd命令進(jìn)入工作空間的src文件夾,然后使用catkin_create_pkg命令創(chuàng)建功能包。使用cd命令進(jìn)入工作空間的src文件夾。cd~/ros_ws/src創(chuàng)建C++文件使用touch命令創(chuàng)建一個(gè)名為turtle_velocity_publisher的C++文件touchturtle_velocity_publisher.cpp或者直接使用vi命令創(chuàng)建并打開(kāi)該文件viturtle_velocity_publisher.cpp編寫(xiě)速度發(fā)布者程序/*創(chuàng)建一個(gè)小海龜?shù)乃俣劝l(fā)布者*/#include<ros/ros.h>#include<geometry_msgs/Twist.h>intmain(intargc,char**argv){ros::init(argc,argv,"turtle_velocity_publisher");//ROS節(jié)點(diǎn)初始化ros::NodeHandlen;//這里是創(chuàng)建句柄//創(chuàng)建一個(gè)Publisher,發(fā)布名為/turtle1/cmd_vel的topic,消息類(lèi)型為geometry_msgs::Twist,隊(duì)列長(zhǎng)度10ros::Publisherturtle_vel_pub=n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",10);ros::Rateloop_rate(10);//設(shè)置循環(huán)的頻率while(ros::ok())
編寫(xiě)速度發(fā)布者程序
{//初始化需要發(fā)布的消息,類(lèi)型需與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ā)布的速度內(nèi)容ROS_INFO("Publshturtlevelocitycommand[%0.2fm/s,%0.2frad/s]",turtle_vel_msg.linear.x,turtle_vel_msg.angular.z);loop_rate.sleep();//按照循環(huán)頻率延時(shí)}return0;CMakelist.txt配置說(shuō)明生成的可執(zhí)行程序的文件是turtle_velocity_publisheradd_executable說(shuō)明編譯生成可執(zhí)行文件所需要鏈接的庫(kù)。target_link_libraries在CMakelist.txt文件中添加兩行代碼:add_executable(turtle_velocity_publishersrc/turtle_velocity_publisher.cpp)target_link_libraries(turtle_velocity_publisher${catkin_LIBRARIES})文件編譯與運(yùn)行編譯與運(yùn)行使用catkin_make命令進(jìn)行編譯,然后重新source當(dāng)前的環(huán)境變量。運(yùn)行程序需要在終端中輸入roscore命令,運(yùn)行ROS的主節(jié)點(diǎn)。返回工作空間目錄cd~/ros_wscatkin_make命令進(jìn)行編譯重新source環(huán)境變量sourcedevel/setup.bash運(yùn)行小海龜節(jié)點(diǎn)程序使用rosrun命令運(yùn)行小海龜節(jié)點(diǎn)程序,然后同樣使用rosrun命令運(yùn)行發(fā)布者節(jié)點(diǎn)程序。運(yùn)行小海龜節(jié)點(diǎn)程序運(yùn)行發(fā)布者節(jié)點(diǎn)程序rosrunturtlesimturtlesim_noderosrunlearn_topicturtle_velocity_publisher查看節(jié)點(diǎn)列表0201查看節(jié)點(diǎn)列表節(jié)點(diǎn)名為/turtle_velocity_publisher,與代碼中編寫(xiě)的一致。在終端中使用rosnodelist查看節(jié)點(diǎn)列表,可以看到名為/turtle_velocity_publisher的節(jié)點(diǎn)。節(jié)點(diǎn)名稱(chēng)使用rosnodelist查看節(jié)點(diǎn)列表。ROS應(yīng)用開(kāi)發(fā)技術(shù)1.ROS通信編程-話題發(fā)布者(下)01Python創(chuàng)建話題02文件運(yùn)行03C++與Python對(duì)比目錄CONTENTSPython創(chuàng)建話題創(chuàng)建Python腳本文件夾和文件mkdirscripts創(chuàng)建文件創(chuàng)建文件夾touchturtle_velocity_publisher.py或viturtle_velocity_publisher.py編寫(xiě)Python發(fā)布者節(jié)點(diǎn)代碼importrospyfromgeometry_msgs.msgimportTwistdefturtle_velocity_publisher():rospy.init_node('turtle_velocity_publisher',anonymous=True)#ROS節(jié)點(diǎn)初始化turtle_vel_pub=rospy.Publisher('/turtle1/cmd_vel',Twist,queue_size=8)rate=rospy.Rate(10)#設(shè)置循環(huán)的頻率whilenotrospy.is_shutdown():#初始化geometry_msgs::Twist類(lèi)型的消息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)頻率延時(shí)編寫(xiě)Python發(fā)布者節(jié)點(diǎn)代碼if__name__=='__main__':try:turtle_velocity_publisher()exceptrospy.ROSInterruptException:pass添加執(zhí)行權(quán)限使用chmod命令為Python文件添加可執(zhí)行權(quán)限。sudochmoda+xturtle_velocity_publisher.py注意我們現(xiàn)在并不是root用戶(hù),所以在使用命令添加可執(zhí)行的權(quán)限時(shí)得在命令前加上sudo,否則我們的操作將無(wú)法生效。文件運(yùn)行驗(yàn)證Python發(fā)布者節(jié)點(diǎn)rosrunlearn_topicturtle_velocity_publisher.py啟動(dòng)小海龜節(jié)點(diǎn)啟動(dòng)ROS主節(jié)點(diǎn),小海龜節(jié)點(diǎn)程序,以及Python發(fā)布者節(jié)點(diǎn)程序,觀察小海龜?shù)倪\(yùn)動(dòng)。rosrunturtlesimturtlesim_node啟動(dòng)ROS主節(jié)點(diǎn)roscore啟動(dòng)Python發(fā)布者節(jié)點(diǎn)C++與Python對(duì)比C++與Python創(chuàng)建發(fā)布者流程對(duì)比初始化ROS節(jié)點(diǎn)創(chuàng)建句柄注冊(cè)節(jié)點(diǎn)信息創(chuàng)建并初始化消息發(fā)布消息C++創(chuàng)建發(fā)布者需要5步,而Python只需要4步,因?yàn)镻ython在初始化節(jié)點(diǎn)時(shí)已經(jīng)完成了句柄創(chuàng)建。Python流程初始化ROS節(jié)點(diǎn)注冊(cè)節(jié)點(diǎn)信息創(chuàng)建并初始化消息發(fā)布消息C++流程ROS應(yīng)用開(kāi)發(fā)技術(shù)2.ROS通信編程-話題訂閱者(上)01概念與創(chuàng)建步驟02文件編寫(xiě)04節(jié)點(diǎn)通訊圖目錄CONTENTS03文件運(yùn)行概念與創(chuàng)建步驟話題訂閱者概念0204050301處理消息建立實(shí)時(shí)消息傳輸通道多訂閱訂閱指定話題,接收其他節(jié)點(diǎn)發(fā)布的消息實(shí)時(shí)通信話題訂閱者是ROS中用于接收和處理消息的節(jié)點(diǎn),通過(guò)訂閱特定話題,實(shí)時(shí)接收并處理消息。接收消息一個(gè)節(jié)點(diǎn)可訂閱多個(gè)話題解耦合調(diào)用回調(diào)函數(shù)處理消息內(nèi)容節(jié)點(diǎn)之間無(wú)需直接通信,提高系統(tǒng)靈活性創(chuàng)建訂閱者步驟循環(huán)等待消息創(chuàng)建句柄節(jié)點(diǎn)是可執(zhí)行文件,使用ROS客戶(hù)端庫(kù)與其他節(jié)點(diǎn)通信初始化節(jié)點(diǎn)保持節(jié)點(diǎn)活躍,準(zhǔn)備接收消息訂閱話題與ROS通信的接口或引用節(jié)點(diǎn)希望接收來(lái)自其他節(jié)點(diǎn)發(fā)布到該話題的消息處理訂閱到的消息,解析數(shù)據(jù),決定程序進(jìn)行創(chuàng)建ROS話題訂閱者的步驟分為五步:初始化節(jié)點(diǎn)、創(chuàng)建句柄、訂閱話題、循環(huán)等待消息、在回調(diào)函數(shù)中處理消息?;卣{(diào)函數(shù)處理文件編寫(xiě)創(chuàng)建C++文件使用touch命令使用touch或vi命令創(chuàng)建名為turtle_pose_subscriber的C++文件。touchturtle_pose_subscriber.cpp使用vi命令viturtle_pose_subscriber.cpp編寫(xiě)C++訂閱者節(jié)點(diǎn)代碼#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é)點(diǎn)ros::NodeHandlen;//這里是創(chuàng)建句柄ros::Subscriberpose_sub=n.subscribe("/turtle1/pose",10,turtle_poseCallback);ros::spin();//循環(huán)等待回調(diào)函數(shù)return0;}配置CMakelist.txt文件0201在learn_topic功能包目錄下,打開(kāi)CMakelist.txt文件,在build區(qū)域添加內(nèi)容,編譯生成可執(zhí)行程序。add_executable(turtle_pose_subscribersrc/turtle_pose_subscriber.cpp)target_link_libraries(turtle_pose_subscriber${catkin_LIBRARIES})target_link_libraries說(shuō)明編譯生成可執(zhí)行文件所需要鏈接的庫(kù)說(shuō)明生成的可執(zhí)行程序的文件是turtle_pose_subscriberadd_executable文件運(yùn)行編譯與環(huán)境變量更新sourcedevel/setup.bash更新環(huán)境變量編譯代碼catkin_make啟動(dòng)ROS主節(jié)點(diǎn)與運(yùn)行節(jié)點(diǎn)04010302運(yùn)行速度控制節(jié)點(diǎn)rosrunlearn_topicturtle_pose_subscriberroscorerosrunturtlesimturtle_teleop_key運(yùn)行小海龜節(jié)點(diǎn)rosrunturtlesimturtlesim_node使用roscore啟動(dòng)ROS主節(jié)點(diǎn),運(yùn)行小海龜節(jié)點(diǎn)和速度控制節(jié)點(diǎn),再運(yùn)行訂閱者節(jié)點(diǎn)接收數(shù)據(jù)。啟動(dòng)ROS主節(jié)點(diǎn)運(yùn)行訂閱者節(jié)點(diǎn)節(jié)點(diǎn)通訊圖查看節(jié)點(diǎn)通訊通過(guò)rqt_graph工具來(lái)查看節(jié)點(diǎn)之間的通訊橢圓代表的是節(jié)點(diǎn)名稱(chēng)矩形表示的是話題名稱(chēng)箭頭表示話題消息傳遞的方向ROS應(yīng)用開(kāi)發(fā)技術(shù)2.ROS通信編程-話題訂閱者(下)01文件編寫(xiě)02文件運(yùn)行03C++與Python對(duì)比目錄CONTENTS文件編寫(xiě)Python文件創(chuàng)建在learn_topic目錄下的scripts文件夾中創(chuàng)建名為turtle_pose_subscriber的Python文件。touchturtle_pose_subscriber.py或viturtle_pose_subscriber.py編寫(xiě)Python訂閱者節(jié)點(diǎn)代碼#!/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é)點(diǎn)初始化#創(chuàng)建一個(gè)Subscriber,訂閱名為/turtle1/pose的topic,注冊(cè)回調(diào)函數(shù)poseCallbackrospy.Subscriber("/turtle1/pose",Pose,poseCallback)rospy.spin()#循環(huán)等待回調(diào)函數(shù)if__name__=='__main__':turtle_pose_subscriber()賦予執(zhí)行權(quán)限為Python文件添加可執(zhí)行權(quán)限。執(zhí)行權(quán)限使用chmod命令添加執(zhí)行權(quán)限,非root用戶(hù)需在命令前加sudo。sudochmoda+xturtle_pose_subscriber.py文件運(yùn)行驗(yàn)證Python訂閱者020301啟動(dòng)主節(jié)點(diǎn)和小海龜節(jié)點(diǎn)啟動(dòng)ROS主節(jié)點(diǎn),啟動(dòng)turtlesim包下的節(jié)點(diǎn),運(yùn)行Python訂閱者節(jié)點(diǎn)。roscorerosrunturtlesimturtlesim_noderosrunlearn_topicturtle_pose_subscriber.py運(yùn)行小海龜速度控制節(jié)點(diǎn)運(yùn)行訂閱者節(jié)點(diǎn),持續(xù)接收小海龜發(fā)送的位姿數(shù)據(jù)rosrunturtlesimturtle_teleop_keyC++與Python對(duì)比C++訂閱者程序流程0402050103消息傳遞使用回調(diào)函數(shù)C++編譯的話題訂閱者程序流程。創(chuàng)建句柄創(chuàng)建訂閱者初始化ROS節(jié)點(diǎn)Python訂閱者程序流程Python編寫(xiě)的程序流程與C++類(lèi)似,但不需要手動(dòng)創(chuàng)建句柄。句柄創(chuàng)建Python會(huì)在內(nèi)部自行完成句柄創(chuàng)建,無(wú)需手動(dòng)創(chuàng)建。ROS應(yīng)用開(kāi)發(fā)技術(shù)3.ROS通信編程-服務(wù)端(上)01功能與創(chuàng)建步驟02文件編寫(xiě)03文件運(yùn)行目錄CONTENTS功能與創(chuàng)建步驟ROS服務(wù)端功能接收服務(wù)請(qǐng)求,執(zhí)行任務(wù),返回結(jié)果服務(wù)端功能請(qǐng)求-響應(yīng)模型路徑規(guī)劃、圖像處理、運(yùn)動(dòng)控制等服務(wù)類(lèi)型通信模型在ROS中,服務(wù)端是提供服務(wù)的節(jié)點(diǎn),通過(guò)提供服務(wù)來(lái)滿(mǎn)足其他節(jié)點(diǎn)的請(qǐng)求。服務(wù)端節(jié)點(diǎn)接收來(lái)自其他節(jié)點(diǎn)的服務(wù)請(qǐng)求,并針對(duì)這些請(qǐng)求執(zhí)行相應(yīng)的任務(wù),然后返回結(jié)果給請(qǐng)求方。ROS服務(wù)通過(guò)請(qǐng)求-響應(yīng)模型實(shí)現(xiàn)節(jié)點(diǎn)之間的通信。通過(guò)服務(wù)端節(jié)點(diǎn),ROS系統(tǒng)中的節(jié)點(diǎn)可以提供各種服務(wù),如路徑規(guī)劃、圖像處理、運(yùn)動(dòng)控制等,滿(mǎn)足其他節(jié)點(diǎn)的需求。開(kāi)發(fā)者可以根據(jù)具體的應(yīng)用場(chǎng)景,編寫(xiě)相應(yīng)的服務(wù)端節(jié)點(diǎn),實(shí)現(xiàn)復(fù)雜的機(jī)器人控制功能。創(chuàng)建服務(wù)端的一般步驟執(zhí)行功能處理,如數(shù)據(jù)處理、傳感器讀取等將結(jié)果發(fā)送回客戶(hù)端初始化ROS節(jié)點(diǎn)回調(diào)函數(shù)定義服務(wù)器對(duì)象,指定服務(wù)類(lèi)型和回調(diào)函數(shù)創(chuàng)建Server實(shí)例生成應(yīng)答數(shù)據(jù)循環(huán)等待設(shè)置節(jié)點(diǎn)名稱(chēng),初始化ROS通信機(jī)制監(jiān)聽(tīng)客戶(hù)端發(fā)送的服務(wù)請(qǐng)求文件編寫(xiě)C++文件創(chuàng)建0201進(jìn)入src文件夾創(chuàng)建C++文件cdlearn_server/srctouchturtle_vel_command_server.cpp或viturtle_vel_command_server.cpp使用cd命令進(jìn)入之前創(chuàng)建好的功能包learn_server的src文件夾下,使用touch命令或者vi命令創(chuàng)建一個(gè)名為turtle_vel_command_server.cpp的C++文件C++代碼編寫(xiě)#include<ros/ros.h>#include<geometry_msgs/Twist.h>#include<std_srvs/Trigger.h>ros::Publisherturtle_vel_pub;boolpubvel=false;//service回調(diào)函數(shù),輸入?yún)?shù)req,輸出參數(shù)resboolpubvelCallback(std_srvs::Trigger::Request&req,std_srvs::Trigger::Response&res){pubvel=!pubvel;ROS_INFO("Doyouwanttopublishthevel?:[%s]",pubvel==true?"Yes":"No");//打印客戶(hù)端請(qǐng)求數(shù)據(jù)//設(shè)置反饋數(shù)據(jù)res.success=true;res.message="Thestatusischanged!";returntrue;}C++代碼編寫(xiě)intmain(intargc,char**argv){ros::init(argc,argv,"turtle_vel_command_server");ros::NodeHandlen;//創(chuàng)建一個(gè)名為/turtle_vel_command的server,注冊(cè)回調(diào)函數(shù)pubvelCallbackros::ServiceServercommand_service=n.advertiseService("/turtle_vel_command",pubvelCallback);//創(chuàng)建一個(gè)Publisher,發(fā)布名為/turtle1/cmd_vel的topic,消息類(lèi)型為geometry_msgs::Twist,隊(duì)列長(zhǎng)度8
turtle_vel_pub=n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",8);ros::Rateloop_rate(10);//設(shè)置循環(huán)的頻率C++代碼編寫(xiě)while(ros::ok()){ros::spinOnce();//查看一次回調(diào)函數(shù)隊(duì)列
//判斷pubvel為T(mén)rue,則發(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)頻率延時(shí)
}
return0;}配置CMakelist.txt文件0201在learn_server功能包目錄下,打開(kāi)CMakelist.txt文件,在build區(qū)域添加內(nèi)容,編譯生成可執(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這個(gè)可執(zhí)行目標(biāo)在鏈接時(shí)需要鏈接的庫(kù)添加一個(gè)名為turtle_vel_command_server的目標(biāo),它對(duì)應(yīng)于要構(gòu)建的可執(zhí)行文件的名稱(chēng)add_executable文件運(yùn)行編譯C++代碼010203catkin_make回到工作空間重新source環(huán)境變量編譯C++代碼sourcedevel/setup.bashcd~/ros_ws啟動(dòng)ROS服務(wù)并測(cè)試040601050302調(diào)用服務(wù)rosservicelistrosservicecall/turtle_vel_commandrosrunturtlesimturtlesim_node啟動(dòng)小海龜節(jié)點(diǎn)程序控制小海龜運(yùn)動(dòng)啟動(dòng)服務(wù)端節(jié)點(diǎn)查看服務(wù)rosrunlearn_serviceturtle_vel_command_server啟動(dòng)ROS核心服務(wù)roscore服務(wù)回調(diào)函數(shù)中pubvel值的反轉(zhuǎn)ROS應(yīng)用技術(shù)3.ROS通信編程-服務(wù)端(下)01文件編寫(xiě)02文件運(yùn)行目錄CONTENTS文件編寫(xiě)Python腳本創(chuàng)建與啟動(dòng)touchturtle_vel_command_server.py或viturtle_vel_command_server.py使用cd命令進(jìn)入scripts文件夾,在該文件夾下創(chuàng)建一份名為turtle_vel_command_server.py的Python文件。進(jìn)入scripts文件夾cdlearn_service/scripts創(chuàng)建Python文件Python代碼編寫(xiě)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代碼編寫(xiě)defpubvelCallback(req):globalpubvelpubvel=bool(1-pubvel)rospy.loginfo("Doyouwanttopublishthevel?[%s]",pubvel)#顯示請(qǐng)求數(shù)據(jù)
returnTriggerResponse(1,"Changestate!")#反饋數(shù)據(jù)Python代碼編寫(xiě)defturtle_pubvel_command_server():rospy.init_node('turtle_vel_command_server')#ROS節(jié)點(diǎn)初始化
#創(chuàng)建一個(gè)名為/turtle_command的server,注冊(cè)回調(diào)函數(shù)pubvelCallbacks=rospy.Service('/turtle_vel_command',Trigger,pubvelCallback)#循環(huán)等待回調(diào)函數(shù)
print("Readytoreceiveturtle_pub_vel_command.")_thread.start_new_thread(pubvel_thread,())rospy.spin()if__name__=="__main__":turtle_pubvel_command_server()添加執(zhí)行權(quán)限我們的Python文件還不能運(yùn)行,我們還得以超級(jí)用戶(hù)的身份,給turtle_vel_command_server.py這個(gè)文件添加執(zhí)行權(quán)限,這樣所有用戶(hù)都可以運(yùn)行這個(gè)Python腳本。并且可以直接在命令行中輸入./turtle_vel_command_server.py來(lái)運(yùn)行這個(gè)腳本,而不需要先使用python或python3命令。直接運(yùn)行腳本添加執(zhí)行權(quán)限./turtle_vel_command_server.pysudochmoda+xturtle_vel_command_server.py文件運(yùn)行啟動(dòng)ROS節(jié)點(diǎn)與服務(wù)調(diào)用04030102roscore啟動(dòng)小海龜節(jié)點(diǎn)程序啟動(dòng)服務(wù)端節(jié)點(diǎn)調(diào)用服務(wù)rosservicecall/turtle_vel_commandrosrunturtlesimturtlesim_node啟動(dòng)ROS主節(jié)點(diǎn)ROS應(yīng)用技術(shù)4.ROS通信編程-客戶(hù)端(上)01客戶(hù)端介紹與創(chuàng)建步驟02文件編寫(xiě)03文件運(yùn)行目錄CONTENTS客戶(hù)端介紹與創(chuàng)建步驟服務(wù)客戶(hù)端簡(jiǎn)介在ROS中,服務(wù)客戶(hù)端是用于向服務(wù)端節(jié)點(diǎn)發(fā)送服務(wù)請(qǐng)求并接收響應(yīng)的節(jié)點(diǎn)。服務(wù)客戶(hù)端節(jié)點(diǎn)負(fù)責(zé)向指定的服務(wù)發(fā)送請(qǐng)求消息,并等待服務(wù)端節(jié)點(diǎn)的響應(yīng)消息,然后根據(jù)響應(yīng)執(zhí)行相應(yīng)的操作??蛻?hù)端作用03010204實(shí)現(xiàn)節(jié)點(diǎn)通信接收響應(yīng)發(fā)送服務(wù)請(qǐng)求執(zhí)行操作應(yīng)用場(chǎng)景030102感知任務(wù)運(yùn)動(dòng)控制路勁規(guī)劃創(chuàng)建ROS服務(wù)客戶(hù)端的步驟創(chuàng)建ROS服務(wù)客戶(hù)端包括以下步驟:初始化ROS節(jié)點(diǎn)、創(chuàng)建句柄、創(chuàng)建Client實(shí)例、初始化并發(fā)布服務(wù)請(qǐng)求數(shù)據(jù)、等待Server處理之后的應(yīng)答結(jié)果。創(chuàng)建句柄,管理節(jié)點(diǎn)與ROS主節(jié)點(diǎn)之間的通信。第四步等待Server處理之后的應(yīng)答結(jié)果。第五步創(chuàng)建Client實(shí)例,用于發(fā)送服務(wù)請(qǐng)求并接收服務(wù)器的響應(yīng)。第二步初始化并發(fā)布服務(wù)請(qǐng)求數(shù)據(jù)。第三步初始化ROS節(jié)點(diǎn),通過(guò)調(diào)用ROS提供的初始化函數(shù)完成。第一步文件編寫(xiě)創(chuàng)建learn_service功能包020301依賴(lài)包括std_msgs、rospy、roscpp、geometry_msgs、turtlesim等。使用catkin_make命令編譯learn_service功能包。依賴(lài)配置使用catkin_create_pkg命令創(chuàng)建learn_service功能包。創(chuàng)建功能包編譯功能包C++代碼編寫(xiě)#include<ros/ros.h>#include<turtlesim/Spawn.h>intmain(intargc,char**argv){ros::init(argc,argv,"a_nes_turtle");//初始化ROS節(jié)點(diǎn)ros::NodeHandlenode;ros::service::waitForService("/spawn");//等待/spawn服務(wù)ros::ServiceClientnew_turtle=node.serviceClient<turtlesim::Spawn>("/spawn");//創(chuàng)建一個(gè)服務(wù)客戶(hù)端,連接名為/spawn的服務(wù)//初始化turtlesim::Spawn的請(qǐng)求數(shù)據(jù)turtlesim::Spawnnew_turtle_srv;new_turtle_srv.request.x=6.0;new_turtle_srv.request.y=8.0;new_turtle_="turtle2";C++代碼編寫(xiě)
//請(qǐng)求服務(wù)傳入xy位置參數(shù)以及名字參數(shù)
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);//請(qǐng)求服務(wù)
ROS_INFO("Spwanturtlesuccessfully[name:%s]",new_turtle_.c_str());//顯示服務(wù)調(diào)用結(jié)果
return0;};C++代碼編寫(xiě)與配置03010402target_link_libraries(a_new_turtle${catkin_LIBRARIES})指定需要鏈接的庫(kù)完成C++代碼編寫(xiě)后,需要在learn_service功能包下的CMakelist.txt文件內(nèi)進(jìn)行配置。使用vi命令打開(kāi)該文件,找到build區(qū)域,添加add_executable和target_link_libraries內(nèi)容,指定生成的可執(zhí)行程序文件和編譯的源碼,以及需要鏈接的庫(kù)。指定編譯源碼CMakelist.txt配置添加add_executable和target_link_libraries內(nèi)容。指定可執(zhí)行程序文件編譯的源碼是src目錄下的a_new_turtle.cpp。add_executable(a_new_turtlesrc/a_new_turtle.cpp)文件運(yùn)行編譯C++代碼0201更新環(huán)境變量進(jìn)入工作空間目錄下,使用catkin_make命令對(duì)C++代碼進(jìn)行編譯。編譯通過(guò)后,重新source環(huán)境變量,以便找到或更新程序。使用catkin_make命令對(duì)C++代碼進(jìn)行編譯。編譯操作sourcedevel/setup.bash運(yùn)行客戶(hù)端節(jié)點(diǎn)程序231運(yùn)行小海龜節(jié)點(diǎn)程序rosrunlearn_servicea_new_turtle使用roscore命令開(kāi)啟ROS主節(jié)點(diǎn),然后在新終端運(yùn)行小海龜節(jié)點(diǎn)程序。再新開(kāi)一個(gè)終端窗口,使用rosrun命令運(yùn)行客戶(hù)端節(jié)點(diǎn)程序,產(chǎn)生一個(gè)小海龜。開(kāi)啟ROS主節(jié)點(diǎn)運(yùn)行客戶(hù)端節(jié)點(diǎn)程序rosrunturtlesimturtlesim_noderoscore小海龜服務(wù)/spawn的使用使用rosserviceinfo/spawn查看服務(wù)需要的參數(shù)。創(chuàng)建服務(wù)/spawn,產(chǎn)生另外一只小海龜turtle2。使用rosservicelist命令查看小海龜提供的服務(wù)。查看服務(wù)服務(wù)/spawn的使用查看服務(wù)參數(shù)啟動(dòng)小海龜節(jié)點(diǎn)后,運(yùn)行a_new_turtle程序,畫(huà)面中會(huì)出現(xiàn)另外一只小海龜。這是因?yàn)樾『}數(shù)墓?jié)點(diǎn)提供了服務(wù)/spawn,創(chuàng)建該服務(wù)會(huì)產(chǎn)生另外一只小海龜turtle2。通過(guò)rosservicelist命令查看小海龜提供的服務(wù),使用rosserviceinfo/spawn查看服務(wù)需要的參數(shù),包括x,y,theta,name。ROS應(yīng)用開(kāi)發(fā)技術(shù)4.ROS通信編程-客戶(hù)端(下)01文件編寫(xiě)02文件運(yùn)行03C++與Python對(duì)比目錄CONTENTS文件編寫(xiě)Python腳本創(chuàng)建與啟動(dòng)toucha_new_turtle.py或via_new_turtle.py使用cd命令進(jìn)入scripts文件夾,在該文件夾下創(chuàng)建一份名為a_new_turtle.py的Python文件。進(jìn)入scripts文件夾cdlearn_service/scripts創(chuàng)建Python文件Python代碼編寫(xiě)importsysimportrospyfromturtlesim.srvimportSpawndefturtle_spawn():rospy.init_node('new_turtle')#ROS節(jié)點(diǎn)初始化rospy.wait_for_service('/spawn')#等待/spawn服務(wù)try:new_turtle=rospy.ServiceProxy('/spawn',Spawn)response=new_turtle(2.0,2.0,0.0,"turtle2")#輸入請(qǐng)求數(shù)據(jù)returnexceptrospy.ServiceExceptionase:print("failedtocallservice:%s")if__name__=="__main__":#服務(wù)調(diào)用并顯示調(diào)用結(jié)果print("anewturtlenamed%s."%(turtle_spawn()))添加執(zhí)行權(quán)限我們的Python文件還不能運(yùn)行,我們還得以超級(jí)用戶(hù)的身份,給a_new_turtle.py這個(gè)文件添加執(zhí)行權(quán)限,這樣所有用戶(hù)都可以運(yùn)行這個(gè)Python腳本。并且可以直接在命令行中輸入./a_new_turtle.py來(lái)運(yùn)行這個(gè)腳本,而不需要先使用python或python3命令。直接運(yùn)行腳本添加執(zhí)行權(quán)限./a_new_turtle.pysudochmoda+xa_new_turtle.py文件運(yùn)行啟動(dòng)ROS節(jié)點(diǎn)與服務(wù)調(diào)用030102roscore啟動(dòng)小海龜節(jié)點(diǎn)程序啟動(dòng)服務(wù)端節(jié)點(diǎn)rosrunturtlesimturtlesim_node啟動(dòng)ROS主節(jié)點(diǎn)rosrunlearn_servicea_new_turtle.pyC++與Python對(duì)比C++與Python流程對(duì)比初始化ROS節(jié)點(diǎn)創(chuàng)建句柄創(chuàng)建并連接服務(wù)客戶(hù)端初始化并發(fā)布服務(wù)請(qǐng)求數(shù)據(jù)調(diào)用服務(wù)并等待應(yīng)答C++創(chuàng)建客戶(hù)端需要5步,而Python只需要4步,因?yàn)镻ython在初始化節(jié)點(diǎn)時(shí)已經(jīng)完成了句柄創(chuàng)建。Python流程初始化ROS節(jié)點(diǎn)等待并創(chuàng)建服務(wù)客戶(hù)端初始化服務(wù)請(qǐng)求數(shù)據(jù)等待處理后的應(yīng)答結(jié)果C++流程ROS應(yīng)用開(kāi)發(fā)技術(shù)5.ROS通信編程-動(dòng)作客戶(hù)端01動(dòng)作客戶(hù)端概述02文件創(chuàng)建03文件配置與運(yùn)行目錄CONTENTS動(dòng)作客戶(hù)端概述ROS動(dòng)作客戶(hù)端概述向動(dòng)作服務(wù)器發(fā)送動(dòng)作請(qǐng)求并接收?qǐng)?zhí)行結(jié)果應(yīng)用場(chǎng)景工作流程動(dòng)作客戶(hù)端功能查找動(dòng)作、創(chuàng)建目標(biāo)消息、發(fā)送目標(biāo)消息、等待執(zhí)行結(jié)果實(shí)現(xiàn)復(fù)雜的機(jī)器人控制功能,如運(yùn)動(dòng)規(guī)劃、抓取任務(wù)和導(dǎo)航文件創(chuàng)建創(chuàng)建learn_action功能包020301依賴(lài)包括std_msgs、rospy、roscpp、actionlib、actionlib_msgs等。使用catkin_make命令編譯learn_action功能包。依賴(lài)配置使用catkin_create_pkg命令創(chuàng)建learn_action功能包。創(chuàng)建功能包編譯功能包依賴(lài)包解釋C++語(yǔ)言的ROS客戶(hù)端庫(kù),允許使用C++編寫(xiě)ROS節(jié)點(diǎn)std_msgsactionlib_msgsPython語(yǔ)言的ROS客戶(hù)端庫(kù),允許使用Python編寫(xiě)ROS節(jié)點(diǎn)roscpp包含一些標(biāo)準(zhǔn)消息類(lèi)型,如String、Int32等,在ROS中被廣泛使用包含actionlib包使用的消息類(lèi)型提供ROS動(dòng)作機(jī)制的實(shí)現(xiàn),用于長(zhǎng)時(shí)間運(yùn)行的任務(wù),它提供了目標(biāo)設(shè)置、反饋和結(jié)果等交互機(jī)制actionlibrospy定義動(dòng)作文件#Definethegoaluint32dishwasher_id#Specifywhichdishwasherwewanttouse---#Definetheresultuint32total_dishes_cleaned---#Defineafeedbackmessagefloat32percent_complete在action文件夾下,新建一個(gè)文件,命名為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命令進(jìn)行編譯生成消息文件使用rosmsglist命令查看查看消息類(lèi)型action_client.cpp文件編寫(xiě)#include<actionlib/client/simple_action_client.h>#include"learn_action/DoDishesAction.h"typedefactionlib::SimpleActionClient<learn_action::DoDishesAction>Client;//當(dāng)action完成后會(huì)調(diào)用次回調(diào)函數(shù)一次voiddoneCb(constactionlib::SimpleClientGoalState&state,constlearn_action::DoDishesResultConstPtr&result){ROS_INFO("Yay!Thedishesarenowclean");ros::shutdown();}//當(dāng)action激活后會(huì)調(diào)用次回調(diào)函數(shù)一次voidactiveCb(){ROS_INFO("Goaljustwentactive");}action_client.cpp文件編寫(xiě)//收到feedback后調(diào)用的回調(diào)函數(shù)voidfeedbackCb(constlearn_action::DoDishesFeedbackConstPtr&feedback){ROS_INFO("percent_complete:%f",feedback->percent_complete);}action_client.cpp文件編寫(xiě)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;}文件配置與運(yùn)行配置CMakelist.txt文件0201在learn_action功能包目錄下,打開(kāi)CMakelist.txt文件,添加以下內(nèi)容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這個(gè)目標(biāo)鏈接到由變量所定義的庫(kù)表示創(chuàng)建一個(gè)可執(zhí)行目標(biāo),名為action_client,其源代碼文件為src文件夾下的action_client.cppadd_executable03add_dependencies表示action_client這個(gè)目標(biāo)依賴(lài)于變量所指定的其他目標(biāo)工廠自動(dòng)化更新環(huán)境運(yùn)行C++文件rosrunlearn_actionaction_clientcatkin_makesourcedevel/setup.bash編譯功能包由于現(xiàn)在我們沒(méi)有運(yùn)行服務(wù)端,所以沒(méi)有提供相對(duì)應(yīng)的服務(wù),或者說(shuō)執(zhí)行相應(yīng)的動(dòng)作以及反饋。所以運(yùn)行后我們無(wú)法看見(jiàn)任何內(nèi)容。ROS應(yīng)用開(kāi)發(fā)技術(shù)6.ROS通信編程-動(dòng)作服務(wù)端01動(dòng)作服務(wù)端介紹02文件編寫(xiě)03文件運(yùn)行目錄CONTENTS動(dòng)作服務(wù)端介紹動(dòng)作服務(wù)端簡(jiǎn)介目標(biāo)-反饋-結(jié)果通信模型接收動(dòng)作客戶(hù)端節(jié)點(diǎn)的動(dòng)作請(qǐng)求并執(zhí)行具體動(dòng)作動(dòng)作服務(wù)器節(jié)點(diǎn)具體工作
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球七葉神安片行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球醫(yī)療器械消毒產(chǎn)品行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)缺氧帳篷行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年全球及中國(guó)有機(jī)空穴傳輸材料行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球連續(xù)式鋰電池?zé)峤鉅t行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 競(jìng)業(yè)限制合同協(xié)議書(shū)
- 家具房屋租賃合同書(shū)
- 2025危險(xiǎn)廢物委托處置合同
- 房地產(chǎn)借款合同
- 提高談判技巧的訓(xùn)練課程
- 政治-湖北省湖部分名校(云學(xué)名校聯(lián)盟)2025屆高三1月聯(lián)考試題和答案
- 行政單位會(huì)計(jì)核算職責(zé)(4篇)
- 《義務(wù)教育道德與法治課程標(biāo)準(zhǔn)》解讀
- 2025年春新滬科版物理八年級(jí)下冊(cè)全冊(cè)教學(xué)課件
- 2025年國(guó)家廣播電視總局監(jiān)管中心招聘5人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024年山東省淄博市中考英語(yǔ)試題(含答案)
- 弱電智能化勞務(wù)分包合同
- 電網(wǎng)調(diào)度基本知識(shí)課件
- 環(huán)境與職業(yè)健康安全管理手冊(cè)
- 甲狀腺乳腺外科ERAS實(shí)施流程(模板)
- 2025屆高考語(yǔ)文復(fù)習(xí):小說(shuō)人物+課件
評(píng)論
0/150
提交評(píng)論