ROS機(jī)器人開發(fā)項(xiàng)目實(shí)戰(zhàn) 課件 第3、4章 ROS通信機(jī)制、ROS運(yùn)行管理_第1頁
ROS機(jī)器人開發(fā)項(xiàng)目實(shí)戰(zhàn) 課件 第3、4章 ROS通信機(jī)制、ROS運(yùn)行管理_第2頁
ROS機(jī)器人開發(fā)項(xiàng)目實(shí)戰(zhàn) 課件 第3、4章 ROS通信機(jī)制、ROS運(yùn)行管理_第3頁
ROS機(jī)器人開發(fā)項(xiàng)目實(shí)戰(zhàn) 課件 第3、4章 ROS通信機(jī)制、ROS運(yùn)行管理_第4頁
ROS機(jī)器人開發(fā)項(xiàng)目實(shí)戰(zhàn) 課件 第3、4章 ROS通信機(jī)制、ROS運(yùn)行管理_第5頁
已閱讀5頁,還剩83頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第3章

ROS通信機(jī)制·ROS

通信機(jī)制介紹·ROS

項(xiàng)目開發(fā)流程·

話題通信機(jī)制·

服務(wù)通信機(jī)制·

參數(shù)服務(wù)器ROS通信機(jī)制介紹

ROS通信機(jī)制介紹話題

(Topic)——異步通信機(jī)制●節(jié)點(diǎn)間用來傳輸數(shù)據(jù)的重要總線;●

使

用發(fā)布/訂閱模型,數(shù)據(jù)由發(fā)布者傳輸?shù)接嗛喺撸粋€(gè)話題的訂閱者或發(fā)布者可以不唯一。消息

(Message)——話題數(shù)據(jù)●具有一定的類型和數(shù)據(jù)結(jié)構(gòu),包括ROS提供的標(biāo)準(zhǔn)類型和用戶自定義類型;●使用編程語言無關(guān)的.msg

文件定義,編譯過程中生成對(duì)應(yīng)的代碼文件。Computer

on

the

RobotLaptopROS

NodeTopic:/exampleMessageType:std_msgs/StringSubscriber話題模型(發(fā)布/訂閱)ProcessingSubscribePubish/image_data

MessageCameraNodeDataRegistration

RogistraionROS

MasterReqistrationROS

Node ROS通信機(jī)制介紹服務(wù)

(Service)——同步通信機(jī)制●

使

用客戶端/服務(wù)器(C/S)

模型,客戶端發(fā)送請(qǐng)求數(shù)據(jù),服務(wù)器完成處理后返回應(yīng)答數(shù)據(jù);●使用編程語言無關(guān)的.srv文件定義請(qǐng)求和應(yīng)答數(shù)據(jù)結(jié)構(gòu),編譯過程中生成對(duì)應(yīng)的代碼文件。ReplyService

ClientROS

NodeData服務(wù)模型(請(qǐng)求/應(yīng)答)Computeron

the

Robot_

ROSMasterResistraionImageProcessingNodeRegistrationCameraNodeReply

/image_dataMessageROS

NodeServiceServerRequest-requestresponse話題服務(wù)同步性異步同步通信模型發(fā)布/訂閱服務(wù)器/客戶端底層協(xié)議ROSTCP/ROSUDPROSTCP/ROSUDP反饋機(jī)制無有緩沖區(qū)有無實(shí)時(shí)性弱強(qiáng)節(jié)點(diǎn)關(guān)系多對(duì)多一對(duì)多(一個(gè)server)適用場(chǎng)景數(shù)據(jù)傳輸邏輯處理 ROS通信機(jī)制介紹話題與服務(wù)的區(qū)別ROS通信機(jī)制介紹參數(shù)

(Parameter)——

全局共享字典●

可通過網(wǎng)絡(luò)訪問的共享、多變量字典;●節(jié)點(diǎn)使用此服務(wù)器來存儲(chǔ)和檢索運(yùn)行時(shí)的參數(shù);●適合存儲(chǔ)靜態(tài)、非二進(jìn)制的配置參數(shù),不適合存儲(chǔ)動(dòng)態(tài)配置的數(shù)據(jù)。ROS

Master

Node

ANode

BParameterServer/robot_name:"my_robot"/robot_radius:0.4/robot_height:0.5Node

CNode

DROS

項(xiàng)目開發(fā)流程

ROS

項(xiàng)目開發(fā)流程ROS

項(xiàng)目開發(fā)過程,采用如下步驟:配置編譯規(guī)則(CMakeLists.txt)創(chuàng)建源代碼(C++/Python)創(chuàng)建工作空間創(chuàng)建功能包編譯與運(yùn)行wozkspace_foldez/sre/CMakeLists.txtpackage_1/CMakeLists.txt

package.xml--WORKSPACE--sOURCESPACE-The'toplevel'CMake

filepackage_n/CMakeLists.txt

package.xmlbuild/CATKIN_IGNOREdevel/bin/etc/include/1ib/share/.catkinenv.bashsetup.bashsetup.shinstall/bin/ete/--BUILDSPACE--Keepscatkinfromwalking

this

directory--DEVELOPLENT

SPACE(setby

CATKIN_DEVEL_PREFIX)--INSTALL

SPACE(setby

CIAKE_INSTALL_PREPIX)ROS

項(xiàng)目開發(fā)流程工作空間(workspace)是一個(gè)存放工程開發(fā)相關(guān)文件的文件夾。src:

代碼空間(Source

Space)build:編譯空間(Build

Space)devel:開發(fā)空間(Development

Space)install:安裝空間(InstallSpace)

ROS

項(xiàng)目開發(fā)流程創(chuàng)建工作空間編譯工作空間設(shè)置環(huán)境變量$mkdir-p~/catkin_ws/src$cd~/catkin_ws/src$catkin_init_workspace$cd

~/catkin_ws/$catkin_make$source

devel/setup.bash

ROS

項(xiàng)目開發(fā)流程$catkin_create_pkg

<package_name>[depend1][depend2][depend3]$cd

~/catkin_ws/src創(chuàng)建功能包

$catkin_create_pkg

learning_communication

rospy

roscpp

std_msgs

std_srvs$cd~/catkin_ws編譯功能包

$catkin_make$source

~/catkin_ws/devel/setup.bash同一個(gè)工作空間下,不允許存在同名功能包不同工作空間下,允許存在同名功能包話題通信機(jī)制

ROS

Topic通信編程ROSMasterRegistrationRegistrationMessage(std_msgs::String)Subscriber(string_subscriber)Message(std_msgs:String)

Topic(/chatter)話題模型(發(fā)布者/訂閱者)Publisher(string_publisher)

ROS

Topic通信編程分別編寫發(fā)布者和訂閱者,實(shí)現(xiàn)發(fā)布方以10HZ(每秒10次)的頻率發(fā)布文本消息("Hello

World!"),訂閱方訂閱消息并將該消息內(nèi)容輸出至終端。1.編寫發(fā)布者程序首先在前面章節(jié)創(chuàng)建的catkin_ws

工作空間下,使用如下命令創(chuàng)建功能包和新建文件:cd

~/catkin_ws/srccatkin_create_pkg

learning_communication

roscpp

rospy

std_msgs

std_srvscd

learning_communication/srcgedit

string_publisher.cpp

ROS

Topic通信編程如何實(shí)現(xiàn)一個(gè)發(fā)布者:1)初始化ROS

節(jié)點(diǎn);2

)向ROSMaster注冊(cè)節(jié)點(diǎn)信息,包括發(fā)布的話題名和話題中的消息類型;3)創(chuàng)建消息數(shù)據(jù);4)按照一定頻率循環(huán)發(fā)布消息。*該例程將發(fā)布chatter話題,消息類型string*/#tnclude

<sstream>#include"ros/ros.h"#include"std_nsgs/String.h"intnain(int

argc,char

**argv){//ROS節(jié)點(diǎn)初始化ros::init(argc,argv,"string_publisher");//創(chuàng)建節(jié)點(diǎn)句柄ros::NodeHandle

n;//創(chuàng)建一個(gè)Publisher,發(fā)布名為chatter的topic,消息類型為std_msgs::Stringros::Publisherchatter_pub=n.adverttse<std_msgs::String>("chatter",1000);//設(shè)置循環(huán)的頻率ros::Rateloop_rate(10);|tnt

count

=0;(1/初始化std_nsgs::String類型的消息std_nsgs::String

nsg;std::stringstreamss;ss<e

"hetlo

world“<<count;msg.data

=ss.str();1/發(fā)布消息

a

Nr_

"

,lni

.

;_str());gamsdatssb"usp%puFOt_eItSchRO1/按照循環(huán)頻率延時(shí)loop_rate.sleep();++count;}}

return

θ;

string_publisher.cppwhtle

(ros::ok())ROS

Topic通信編程如何實(shí)現(xiàn)一個(gè)訂閱者:1)初始化ROS

節(jié)點(diǎn);2)訂閱需要的話題;3

)循環(huán)等待話題消息,接收到

消息后進(jìn)入回調(diào)函數(shù);4)在回調(diào)函數(shù)中完成消息處理。*該例程將訂閱chatter話題,消息類型string#include

"ros/ros.h"#include

"std_nsgs/String.h"1/接收到訂閱的消息后,會(huì)進(jìn)入消息回調(diào)函數(shù)void

chattercallback(const

std_msgs::String::ConstPtr&nsg)1/將接收到的消息打印出來ROS_INFO("I

heard:[%s]",nsg->data.c_str());int

nain(int

argc,

char**argv)1/初始化ROS節(jié)點(diǎn)ros::init(argc,argv,"string_subscriber"

);//

創(chuàng)建節(jié)點(diǎn)句柄ros::NodeHandle

n;1/創(chuàng)建一個(gè)Subscriber,訂閱名為chatter的topic,注冊(cè)回調(diào)函數(shù)chattercallbackros::Subscriber

sub

=n.subscribe("chatter",1000

,chattercallback);1/循環(huán)等待回調(diào)函數(shù)ros::spin();return

0;

string_subscriber.cppROS

Topic通信編程add_executable(string_publisher

src/string_publisher.cpp)

target_link_libraries(string_publisher${catkin_LIBRARIES})add_executable(string_subscriber

src/string_subscriber.cpp)target_link_libraries(string_subscriber${catkin_LIBRARIES)##Declare

a

C++executable##Withcatkin_makeallpackagesarebuilt

within

a

singleCMakecontext##Therecommendedprefixensuresthattarget

names

across

packages

don't

collide#add_executable(S{PROJECT_NAME}_node

src/learntng_communication_node.cpp)##Specifylibrartestolinkalibraryorexecutabletargetagainst#

)|add_executable(string_publishersrc/string_publisher.cpp)target_link_ltbraries(string_publishers{catkin_LIBRARIES})add_executable(string

_subscribersrc/string_subscriber.cpp)target_link_lbraries(

string_subscribers{catkin_LIBRARIESj)如何配置CMakeLists.txt

中的編譯規(guī)則·

設(shè)置需要編譯的代碼和生成的可執(zhí)行文件;·

設(shè)置鏈接庫;#target_link_libraries(S{PROJECT_NAME}_node

#

S[catkin_LIBRARIES}

ROS

Topic通信編程cd

~/catkin_wscatkin_makesource

devel/setup.bashroscorerosrunlearning_communication

string_publisherrosrun

learning_communication

string_subscriberscottascott-NUC11TNK15:-/catktn

S

rosrun

learning_comnuntcatton

string_publtsherINFO][165461185.35630835]:發(fā)送的消息:Hello

World!INFO][1665461185.556308011]:

發(fā)送的消息:HelloINF0][1665461185.656292382]:發(fā)送的消息:HelloINF0][1665461185.756392602]:發(fā)送的消息:Hello

World!7INF0][1665461185.956310690]:愛送的消息:HelloINF0][1665461186.156325978]:發(fā)送的消息:Hello[INF?][1665461186.256418810]:發(fā)送的消息:HelloINFO][1665461186.556307066]:發(fā)送的消息:Hello

World!15INFO][1665461186.656334253]:發(fā)送的消息:Hello

World!16[Hello

World![Hello

World![Hello

World!665461235.656611860]:我聽見:[Hello

World![Hello

World![HelloWorld![Hello

World![Hello

World!ROSMasterRegistrationMessage(learning

communication::Person)

Subscriber(person_subscriber)

自定義msg話題通信示例下面通過創(chuàng)建自定義消息,要求該消息包含人的信息:姓名、身高、年齡等。Message(learning_communication.::Person)Publisher(person_publisher)Topic(/person_info)Registration

自定義msg話題通信示例下面通過創(chuàng)建自定義消息,要求該消息包含人的信息:姓名、身高、年齡等。1.按照固定格式創(chuàng)建msg

文件在功能包下新建msg

文件夾,新建文件PersonMsg.msg,

并在該文件中寫入如下信息:string

nameuint16agefloat64

height注:這里使用的基礎(chǔ)數(shù)據(jù)類型string

、uint16

、float64都是與編程語言無關(guān)的,編譯階段會(huì)變成各種語言對(duì)應(yīng)的數(shù)據(jù)類型。

自定義msg話題通信示例下面通過創(chuàng)建自定義消息,要求該消息包含人的信息:姓名、身高、年齡等。2.修

改package.xml和CMakeLists.txt

文件內(nèi)容在

package.xml

中添加功能包依賴<build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>在CMakeLists.txt

添加編譯選項(xiàng)find_package(……message_generation)add_message_files(FILES

PersonMsg.msg)generate_messages(DEPENDENCIESstd_msgs)catkin_package(……message_runtime)·該例程將發(fā)布/person_info話題,Learntng_communtcatton::PersonMsg#Lnclude<ros/ros,>#tnclude"Learntng_connuntcatton/Personsg.h“int

natn(tnt

argc,char

**argv)I/ROS

節(jié)點(diǎn)初始化ros::tntt(argc,argv,"person_publtsher");I/創(chuàng)建節(jié)點(diǎn)句柄ros;:NodeHandle

n;1/創(chuàng)建一個(gè)Publisher,發(fā)布名為/person_info的topte,消息類型為Learntng_conmuntcatton::PersonMsg,隊(duì)列長度10ros::Publtsherperson_tnfo_pub=n.advertise<learning_comnuntcatton::PersonMsg>("/person_tnfo",10);I/設(shè)置循環(huán)的頻率ros::Rate

loop_rate(1);int

count=

0

;//初始化learning_connuntcatton::Person類型的消息learning_communtcatton::PersonMsgperson_msg;person_msg.name=

"Tom";person_nsg.sex

Learning_comuntcation::PersonMsg::nale;1//發(fā)布消息person_tnfo_pub.publish(person_nsg);ROS_INFO("PublishPersonInfo:nane:%sage:%dsex:%d",//

按照循環(huán)頻率延時(shí)loop_rate.sleep();person_publisher.cpp如何實(shí)現(xiàn)一個(gè)發(fā)布者:1)初始化ROS

節(jié)點(diǎn);2

)向ROSMaster注冊(cè)節(jié)點(diǎn)信息,包括發(fā)布的話題名和話題中的消息類型;3)創(chuàng)建消息數(shù)據(jù);4)按照一定頻率循環(huán)發(fā)布消息。自定義msg話題通信示例下面通過創(chuàng)建自定義消息,要求該消息包含人的信息:姓名、身高、年齡等。person_msg.nane.c_str(),person_nsg.age,person_nsg.sex);whtle(ros::ok())*該例程將訂閱/person_info話題,自定義消息類型Learning_communication::PersonMsg#include

<ros/ros.h>#Lnclude

“Learning_conmuntcatton/PersonMsg.h”//接收到訂閱的消息后,會(huì)進(jìn)入消息回調(diào)函數(shù)voidpersonInfocallback(constlearning_conmunication::PersonMsg::ConstPtr&nsg)1/將接收到的消息打印出來ROS_INFO("Subcribe

Person

Info:name:%sage:%dsex;%d",msg->name.c_str(),msg->age,nsg->sex);int

main(int

argc,char**argv)1/初始化ROS節(jié)點(diǎn)ros::init(argc,argv,

"person_subscriber"

);1/創(chuàng)建節(jié)點(diǎn)句柄ros::NodeHandlen;I/創(chuàng)建一個(gè)Subscriber,訂閱名為/person_info的topic,

注冊(cè)回調(diào)函數(shù)personInfocallbackros::Subscriber

person_info_sub=n.subscribe("/person_info",10,

personInfocallback);1/循環(huán)等待回調(diào)函數(shù)ros::spin();return

θ;

person_subscriber.cpp如何實(shí)現(xiàn)一個(gè)訂閱者:1)初始化ROS

節(jié)點(diǎn);2)訂閱需要的話題;3

)循環(huán)等待話題消息,接收到

消息后進(jìn)入回調(diào)函數(shù);4)在回調(diào)函數(shù)中完成消息處理。自定義msg話題通信示例下面通過創(chuàng)建自定義消息,要求該消息包含人的信息:姓名、身高、年齡等。add_executable(person_publisher

src/person_publisher.cpp)target_link_libraries(person_publisher${catkin_LIBRARIES})add_dependencies(person_publisher

${PROJECT_NAME}_gencpp)add_executable(person_subscriber

src/person_subscriber.cpp)target_link_libraries(person_subscriber

${catkin_LIBRARIES})add_dependencies(person_subscriber${PROJECT_NAME}_gencpp)##

Declare

aC++executable##Mithcatkin_makeallpackagesarebuiltwithina

single

CMake

context##Therecomnendedprefixensuresthattarget

namesacross

packagesdon't

colltde#add_executable(5(PROJECT_NANE}_node

src/learntng_conmuntcatton_node.cpp)##Specifyltbrartestolinkalibrary

or

executable

target

agatnst#target_iink_libraries(S{PROJECT_NAME)_node#

s(catktn_LIBRARIES)##Add

cmake

target

dependenctes

oftheexecutable#sane

as

for

the

lLbrary

aboveadd_dependenctes(S[PROJECT_NAHE]_nodes{S{PROJECT_NAME)_EXPORTED_TARCETS)s(catkin_EXPORTED_TARCETS})add_executable

(person_publtsher

src/person_publisher.cpp)target_ltnk_ltbrartes

(person_publtsher

s{catktn_LIBRARIES})add_dependenctes

(person_publisher

S{PROJECT_NAME)_gencpp)add_executabte

(person_subscrtber

src/person_subscrtber.cpp)target_link_lLbrartes(person_subserLber

s{catktn_LIBRARIES

))add_dependenctes(person_subscrtbers{

PROJECT_NAME)_gencpp)ROS

Topic通信編程如何配置CMakeLists.txt

中的編譯規(guī)則●設(shè)置需要編譯的代碼和生成的可執(zhí)行文件;●設(shè)置鏈接庫;●添加依賴項(xiàng)。

ROS

Topic通信編程cd

~/catkin_wscatkin_makesource

devel/setup.bashroscorerosrun

learning_communication

person_publisherrosrun

learning_communication

person_subscriber單選題

1分ROS中自定義msg時(shí),字符串用哪個(gè)(

)定義。A

uint32B

stringCfloat64uint16設(shè)置提交服務(wù)通信機(jī)制

ROS

服務(wù)通信編程ROSMasterRegistration

RegistrationRequeststd_srvs::SetBoolResponseRequeststd_srvs::SetBoolResponse服務(wù)模型(服務(wù)端/客戶端)Server(string_server)Client(string_client)Service

(/print_string)

ROS

服務(wù)通信編程分別編寫服務(wù)端和客戶端,實(shí)現(xiàn)文本消息(“Hello

ROS!”)

服務(wù)通信的過程。1.編寫服務(wù)端程序首先在前面章節(jié)創(chuàng)建的catkin_ws

工作空間下,使用如下命令創(chuàng)建功能包和新建文件:cd

~/catkin_ws/srccatkin_create_pkg

learning_communication

roscpp

rospy

std_msgs

std_srvscd

learning_communication/srcgedit

string_server.cpp

ROS

服務(wù)通信編程如何實(shí)現(xiàn)一個(gè)服務(wù)器:1)初始化ROS

節(jié)點(diǎn);2)創(chuàng)建Server實(shí)例;3)循環(huán)等待服務(wù)請(qǐng)求,進(jìn)入回調(diào)函數(shù);4)在回調(diào)函數(shù)中完成服務(wù)功能的處理,

并反饋應(yīng)答數(shù)據(jù)。/**◆該例程將提供print_string服務(wù),std_srvs::SetBool*/#include"ros/ros.h"#include

"std_srvs/SetBool.hI/service

回調(diào)函數(shù),輸入?yún)?shù)req,

輸出參數(shù)resbool

print(std_srvs::SetBool::Request

&req,std_srvs::SetBool::Response

&res)

(I/

打印字符串tf(req.data)ROS_INFO("HelloROS!");res,success=true;res.message=

"PrintSuccessully";

elseres.success

=false;res.messag

e="Prtnt

Fatled";return

true;tntnatn(tnt

argc,

char

**argv){//ROS

節(jié)點(diǎn)初始化ros::init(argc,argv,

"string_server"

);I/

創(chuàng)建節(jié)點(diǎn)句柄ros::NodeHandle

n;//創(chuàng)建一個(gè)名為print_string的server,

注冊(cè)回調(diào)函數(shù)print()ros::ServtceServer

servlce=n.advertseservtce("prtnt_string

",print);1/

循環(huán)等待回調(diào)函數(shù)ROS_INFO("Ready

toprinthetlostring.");ros::spin();return

o;

string_server.cpp}(/***該例程將請(qǐng)求print_string服務(wù),std_srvs::SetBool*/#include

"ros/ros.h"#include

"std_srvs/SetBool.h"int

nain(intargc,char

**argv){//ROS

節(jié)點(diǎn)初始化ros::init(argc,argv,

"string_cltent"

);1/創(chuàng)建節(jié)點(diǎn)句柄ros::NodeHandle

n;1/創(chuàng)建一個(gè)client,service

消息類型是std_srvs::SetBoolros::Serviceclient

client

=n.serviceclient<std_srvs::SetBool>("print_string

");1/創(chuàng)建std_srvs::SetBool類型的servtce消息std_srvs::SetBool

srv;1/

發(fā)布service請(qǐng)求,等待應(yīng)答結(jié)果{ROS_INFO("Response:[%s]%s"

,srv.response.success?"True?:"False",srv.response.message.c_str());else{ROS_ERROR("Fatledtocallserviceprint_string");return

1;}

return

0;

string_client.cpp如何實(shí)現(xiàn)一個(gè)客戶端:1)初始化ROS

節(jié)點(diǎn);2)創(chuàng)建

個(gè)Client實(shí)例;3)發(fā)布服務(wù)請(qǐng)求數(shù)據(jù);4

)

待Server處理之后的應(yīng)答結(jié)果。

ROS

服務(wù)通信編程srv.request.data

=

true

;if(client.call(srv))ROS

服務(wù)通信編程##

Declare

a

C++executable##Withcatkin_makeallpackagesare

builtwithina

single

CMake

context##Thereconmendedprefixensuresthattargetnamesacrosspackagesdon't

collide

#add_executable(${PROJECT_NAME)_node

src/learning_communication_node.cpp)##Specifylibrariestolinkalibraryorexecutabletargetagainst#target_link_libraries(S{PROJECT_NAME}_node#

S{catkin_LIBRARIES}#

)add_executable

(string_serversrc/string_server.cpp)target_link_lLbrartes(string_servers{catkin_LIBRARIES})add_executable(string_clientsrc/string_client.cpp)target_link_ltbrartes(

string_cltents{catkin_LIBRARIES})add_executable(string_server

src/string_server.cpp)target_link_libraries(string_server${catkin_LIBRARIES})add_executable(string_client

src/string_client.cpp)target_link_libraries(string_client${catkin_LIBRARIES})如何配置CMakeLists.txt中的編譯規(guī)則·

設(shè)置需要編譯的代碼和生成的可執(zhí)行文件;·

設(shè)置鏈接庫;

ROS

服務(wù)通信編程cd

~/catkin_wscatkin_makesource

devel/setup.bashroscorerosrun

learning_communication

string_serverrosrun

learning_communication

string_clientscott@scott-NUC11TNKi5:~/catkin_ws[INFO][1665798531.379460753]:服務(wù)已經(jīng)啟動(dòng),準(zhǔn)備輸出字符串[INF0][1665798742.916009164]:服務(wù)器收到請(qǐng)求信息為:Hello

ROS!scott@scott-NUC11TNKi5:~/catkin

wsS

rosrun

learning_communication

string_client[INF0][1665798742.916135042]:請(qǐng)求正常處理,響應(yīng)結(jié)果:[True]Print

successully

scott@scott-NUC11TNKi5

:

~/catkin_ws

$Lscott@scott-NUC11TNKi5:~/catkin_ws

自定義srv服務(wù)通信示例本例中,客戶端提交兩個(gè)整數(shù)至服務(wù)端,服務(wù)端接收請(qǐng)求后完成求和運(yùn)算,并返回結(jié)果到客戶端。1.

按照固定格式創(chuàng)建srv

文件在功能包下新建srv文件夾,新建文件AddTwolnts.srv,并在該文件中寫入如下信息:#客戶端請(qǐng)求時(shí)發(fā)送的兩個(gè)數(shù)字int32

num1int32

num2

#

服務(wù)器響應(yīng)發(fā)送的數(shù)據(jù)int32sum

自定義srv服務(wù)通信示例2.修改package.xml和CMakeLists.txt文件內(nèi)容在package.xml

中添加功能包依賴<build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>#需要加入

message_generation,必須有std_msgsadd_service_files(FILESAddTwolnts.srv)generate_messages(DEPENDENCIESstd_msgs)在CMakeLists.txt

添加編譯選項(xiàng)find_package(catkin

REQUIRED

COMPONENTSroscpprospystd_msgsstd_srvsmessage_generation3.編譯生成中間文件

自定義srv服務(wù)通信示例如何實(shí)現(xiàn)一個(gè)服務(wù)器(AddTwolnts_Server.cpp):1)初始化ROS

節(jié)點(diǎn);2)創(chuàng)建Server實(shí)例;3)循環(huán)等待服務(wù)請(qǐng)求,進(jìn)入回調(diào)函數(shù);4)在回調(diào)函數(shù)中完成服務(wù)功能的處理,

并反饋應(yīng)答數(shù)據(jù)。#include

<ros/ros.h>#include

"learning_communication/AddTwoInts.h"1/service

回調(diào)函數(shù),輸入?yún)?shù)req,輸出參數(shù)resbool

add(learning_communication::AddTwoInts::Request

&req,learning_communication::AddTwoInts::Response&res){//

將輸入?yún)?shù)中的請(qǐng)求數(shù)據(jù)相加,結(jié)果放到應(yīng)答變量中res.sum

=req.a

+req.b;ROS_INFO("request:x=%1d,y=%1d",(longint)req.a,(longint)req.b);

ROS_INFO("sendingbackresponse:[%1d]",(longint)res.sum);return

true;{int

main(int

argc,char**argv){//ROS

節(jié)點(diǎn)初始化ros::init(argc,argv,"add_two_ints_server");//創(chuàng)建節(jié)點(diǎn)句柄ros::NodeHandlen;//創(chuàng)建一個(gè)名為/show_person的server,

注冊(cè)回調(diào)函數(shù)personCallbackros::Serviceserverservice=

n.advertiseService(

"/add_two_ints

",add);//循環(huán)等待回調(diào)函數(shù)ROS_INFO("Readytoadd

two

ints.");ros::spin();return

θ;}#include<cstdlib>#include<ros/ros.h>#include"learning_communication/AddTwoInts.h"int

main(int

argc,char**

argv){//初始化ROS節(jié)點(diǎn)ros::init(argc,argv,

"add_two_ints_client");//從終端命令行獲取兩個(gè)加數(shù)if(argc!=

3){ROS_INFO("usage:add_two_ints_client

XY");return

1;//創(chuàng)建節(jié)點(diǎn)句柄ros::NodeHandle

n;//創(chuàng)建一個(gè)client,請(qǐng)求add_two_int

service,service消息類型是

learning_communication::AddTwoIntsros::ServiceClient

client

=n.serviceClient<learning_communication::AdTwoInts>("add_two_ints");//創(chuàng)建learning_communication::AddTwoInts類型的service

消息learning_communication::;AddTwoIntssrv;srv.request.a=atoll(argv[1]);srv.request.b=atoll(argv[2]);//發(fā)布service請(qǐng)求,等待加法運(yùn)算的應(yīng)答結(jié)果if

(client.call(srv)){ROS_INFO("Sum:%1d",(long

int)srv.response.sum);}else{ROS_ERROR("Failed

tocallserviceadd_two_ints");return

1;}return

0;};

自定義srv服務(wù)通信示例如何實(shí)現(xiàn)一個(gè)客戶端(AddTwolnts_Client.cpp):1)初始化ROS

節(jié)點(diǎn);2)創(chuàng)建

個(gè)Client實(shí)例;3)發(fā)布服務(wù)請(qǐng)求數(shù)據(jù);4

)

待Server處理之后的應(yīng)答結(jié)果。add_executable(AddTwolnts_Server

src/AddTwolnts_Server.cpp)target_link_libraries(AddTwolnts_Server${catkin_LIBRARIES})add_dependencies(AddTwolnts_Server${PROJECT_NAME}_gencpp)add_executable(AddTwolnts_Client

src/AddTwolnts_Client.cpp)target_link_libraries(AddTwolnts_Client

${catkin_LIBRARIES})add_dependencies(AddTwolnts_Client

${PROJECT_NAME}_gencpp)

自定義srv服務(wù)通信示例CMakeLists.txt配置文件

自定義srv服務(wù)通信示例cd~/catkin_wscatkin_makesource

devel/setup.bashroscorerosrun

learning_communicationAddTwolnts_Serverrosrun

learning_communication

AddTwolnts_Client12scott@scott-NUC11TNKi5:~/catkin_wsscottascott-NUC11TNKi5:~/catkin_us

s

rosrun_learning_conmunication

AddTwoInts_serverINFo][1665803779.915779552]:服務(wù)器接收到的請(qǐng)求數(shù)據(jù)為:nun1=1,nun2=2scott@scott-NUC11TNKi5:~/catkin_wsscott@scott-NUC11TNKi5:~/catkin_ws

S

rosrun

learning_communicationAddTwoInts_client12

[INF0][1665803662.585609419]:請(qǐng)求正常處理,響應(yīng)結(jié)果:3scott@scott-NUC11TNKi5

:~/catkin_wsSAmsgBsrvClaunchroSsrv提交單選題

1分ROS

中自定義服務(wù)的文件夾名稱為(

)設(shè)置參數(shù)服務(wù)器

參數(shù)服務(wù)器參數(shù)服務(wù)器也可以說是特殊的“通信方式”。參數(shù)服務(wù)器在ROS中主要用于實(shí)現(xiàn)不同節(jié)點(diǎn)之間的數(shù)據(jù)共享。參數(shù)服務(wù)器的維護(hù)方式非常的簡單靈活,總的來講有三種方式:命令行參數(shù)設(shè)

、launch文件內(nèi)讀寫和node源

碼。ROS

Master

Node

ANode

BParameter

Server/robot_name:"my_robot"/robot_radius:0.4/robot_height:0.5Node

CNode

D參數(shù)服務(wù)器機(jī)制

參數(shù)服務(wù)器1.命令行參數(shù)設(shè)置使用命令行來設(shè)置參數(shù)服務(wù),主要通過rosparam命令來進(jìn)行各種操作設(shè)置。

rosparam能夠存

儲(chǔ)并操作ROS

參數(shù)服務(wù)器(Parameter

Server)

上的數(shù)據(jù)。參數(shù)服務(wù)器能夠存儲(chǔ)整型、浮點(diǎn)、

布爾、字符串、字典和列表等數(shù)據(jù)類型。rosparam命令rosparam命令作用rosparam

set

param_key

param_value設(shè)置參數(shù)rosparam

get

param_key顯示參數(shù)rosparam

load

file_name從文件加載參數(shù)rosparam

dump

file_name保存參數(shù)到文件rosparam

delete刪除參數(shù)rosparam

list列出參數(shù)名稱

參數(shù)服務(wù)器2.launch文件內(nèi)讀寫參數(shù)launch

文件中有很多標(biāo)簽,而與參數(shù)服務(wù)器相關(guān)的標(biāo)簽只有兩個(gè),

一個(gè)是<param>,

個(gè)是

<rosparam>

。示例如下:<!--直接定義參數(shù)并賦值--><param

name="velodyne_frame_id"type="string"value="velodyne"/><!--定義參數(shù)并通過arg

給參數(shù)賦值--><arg

name="velodyne_frame_id"default="velodyne"/><param

name="velodyne_frame_id"type="string"value="$(arg

velodyne_frame_id)"/>

參數(shù)服務(wù)器3.節(jié)點(diǎn)源碼內(nèi)進(jìn)行讀寫參數(shù)除了上述最常用的兩種讀寫參數(shù)服務(wù)器的方法,還有一種就是修改ROS的源碼,也就是利用API來對(duì)參數(shù)服務(wù)器進(jìn)行操作。C++節(jié)點(diǎn)中實(shí)現(xiàn)參數(shù)服務(wù)器的讀寫有兩套API

系統(tǒng)。(1)ros::NodeHandle,

該方式的示例如下://創(chuàng)建ros節(jié)點(diǎn)句柄ros::NodeHandle

nh;string

node_param;std::vector<std::string>param_names;//新增參數(shù)到參數(shù)服務(wù)器中nh.setParam("param_1",1.0);nh.param<std::string>("param_2",node_param,"hahaha");string

node_param;std::vector<std::string>param_names;ros::param::set("param_1",1.0);node_param

=ros:param::param("param_2","hahaha");//其他功能ros::param::getParamNames(param_names);ros::param::has("param_2");ros::param::search("param_2",node_param);

參數(shù)服務(wù)器(2)ros::param,

相關(guān)示例如下:

課程作業(yè)使用海龜仿真器,完成以下編程作業(yè):1.創(chuàng)建一個(gè)節(jié)點(diǎn),在其中實(shí)現(xiàn)一個(gè)訂閱者和一個(gè)發(fā)布者,完成以下功能:發(fā)布者:發(fā)布海龜速度指令,讓海龜圓周運(yùn)動(dòng)訂閱者:訂閱海龜?shù)奈恢眯畔?,并在終端中周期打印輸出2.創(chuàng)建另外一個(gè)節(jié)點(diǎn),在其中實(shí)現(xiàn)一個(gè)客戶端,完成以下功能:客戶端:請(qǐng)求海龜誕生的服務(wù),在仿真器中產(chǎn)生一只新的海龜THANKS感謝觀看第4章

ROS

運(yùn)行管理·ROS

節(jié)點(diǎn)運(yùn)行管理·ROS

工作空間覆蓋·ROS

節(jié)點(diǎn)重名·ROS

話題名稱設(shè)置·ROS

參數(shù)名稱設(shè)置·Launch文件綜合案例ROS

節(jié)點(diǎn)運(yùn)行管理

ROS

節(jié)點(diǎn)運(yùn)行管理ROS使用多進(jìn)程(節(jié)點(diǎn))的分布式框架,

一個(gè)完整的ROS系統(tǒng)可能出現(xiàn)如下情形:●可能包含多臺(tái)主機(jī);●每臺(tái)主機(jī)上有多個(gè)工作空間;●每個(gè)工作空間中又包含多個(gè)功能包;●每個(gè)功能包包含多個(gè)節(jié)點(diǎn),不同的節(jié)點(diǎn)都有自己的節(jié)點(diǎn)名稱;●每個(gè)節(jié)點(diǎn)可能還會(huì)設(shè)置一個(gè)或多個(gè)話題。

ROS節(jié)點(diǎn)運(yùn)行管理—launch文件launch文件是一個(gè)XML格式的文件,可以啟動(dòng)本地和遠(yuǎn)程的多個(gè)節(jié)點(diǎn),還可以在參數(shù)服務(wù)器中設(shè)置參數(shù)。其作用是簡化節(jié)點(diǎn)的配置與啟動(dòng),提高ROS程序的啟動(dòng)效率。新建launch文件<launch><nodepkg="learning_communication"type="person_subscriber"name="talker"/><nodepkg="learning_communication"type="person_publisher"name="listener"/>調(diào)用launch文件roslaunch

learning_launch

demo.launch注意:

roslaunch

命令執(zhí)行l(wèi)aunch文件

時(shí),首先會(huì)判斷是否啟動(dòng)了roscore。如果已經(jīng)啟動(dòng),則不再啟動(dòng),否則,

會(huì)自動(dòng)調(diào)用roscore。</launch>

launch文件標(biāo)簽<launch>標(biāo)簽是所有l(wèi)aunch文件的根標(biāo)簽,充當(dāng)其他標(biāo)簽的容器,文件中的其他

內(nèi)容都必須放在這個(gè)標(biāo)簽中。<node>

標(biāo)簽用于指定ROS

節(jié)點(diǎn),是最常見的標(biāo)簽,需要注意的是roslaunch命令不能保證按照node的聲明順序來啟動(dòng)節(jié)點(diǎn)(節(jié)點(diǎn)的啟動(dòng)是多進(jìn)程的)。1.屬性pkg=“包名”:節(jié)點(diǎn)所在的功能包名稱type="nodeType":節(jié)點(diǎn)的可執(zhí)行文件名稱name="nodeName":節(jié)點(diǎn)運(yùn)行時(shí)的名稱(在

ROS網(wǎng)絡(luò)拓?fù)渲泄?jié)點(diǎn)的名稱)args="xxx××x×x"(可選):將參數(shù)傳遞給節(jié)點(diǎn)2.子級(jí)標(biāo)簽env

環(huán)境變量設(shè)置remap重映射節(jié)點(diǎn)名稱rosparam參數(shù)設(shè)置param參數(shù)設(shè)置

launch文件標(biāo)簽<include>

標(biāo)簽用于將另一個(gè)xml格式的launch

文件導(dǎo)入到當(dāng)前文件中,類似C語言中的頭文件包含。1.屬性file="S(find

功能包名)/×xx/xxx.launch":要包含的文件路徑ns="xxx"(可選):在指定命名空間導(dǎo)入文件2.子級(jí)標(biāo)簽env

環(huán)境變量設(shè)置arg將參數(shù)傳遞給被包含的文件

launch文件標(biāo)簽<remap>

標(biāo)簽用于重映射ROS

計(jì)算圖資源的命名。用戶不需要修改已有功能包的

接口,只需要將接口名稱重映射,取一個(gè)別名,這樣系統(tǒng)就能識(shí)別該接口。屬性from="xxx":

原命名to="yyy":

映射之后的命名比如turtlebot的鍵盤控制節(jié)點(diǎn)發(fā)布速度指令話題是/turtlebot/cmd_vel,但是如果當(dāng)前機(jī)器人訂閱

的速度控制話題是/cmd_vel,

這時(shí)使用<remap>就可以輕松解決問題,實(shí)現(xiàn)代碼如下:<remap

from="/turtelbot/cmd_vel"to="/cmd_vel"/>

launch文件標(biāo)簽<param>標(biāo)簽主要用來在參數(shù)服務(wù)器上設(shè)置參數(shù),參數(shù)源可以在標(biāo)簽中通過value

指定,也可以通過外部文件加載,在<node>

標(biāo)簽中時(shí),相當(dāng)于私有命名空間。launch文件執(zhí)行后,參數(shù)值就加載到ROS

的參數(shù)服務(wù)器上。屬性name="命名空間/參數(shù)名":參數(shù)名稱,可以包含命名空間value="xxx"(可選):定義參數(shù)值,如果此處省略,必須指定外部文件作為參數(shù)源type="str|int|double|bool|yaml"(可選):指定參數(shù)類型,如果未指定,roslaunch

會(huì)嘗試

確定參數(shù)類型

launch文件標(biāo)簽<rosparam>標(biāo)簽可以將YAML

格式文件中的參數(shù)全部導(dǎo)入到ROS

參數(shù)服務(wù)器中,或?qū)?shù)導(dǎo)出到Y(jié)AML

文件,也可以用來刪除參數(shù),<rosparam>標(biāo)簽在<node>標(biāo)簽中時(shí)被視為私有標(biāo)簽

。屬性command="load

|dump

|delete"

(可選,默認(rèn)load):

加載、導(dǎo)出或刪除參數(shù)file="S(findxxxxx)/xxx/yy...":加載或?qū)С龅降膟aml文件param="

參數(shù)名稱"ns="命名空間"(可選)

launch文件標(biāo)簽<arg>標(biāo)簽是用于動(dòng)態(tài)傳參,類似于函數(shù)的參數(shù),僅限于launch文件使用,便于launch文件的重構(gòu),與ROS節(jié)點(diǎn)內(nèi)部的實(shí)現(xiàn)沒有關(guān)系。1.屬性name="

參數(shù)名稱":

default="默認(rèn)值"(可選)value="數(shù)值"(可選):不可以與default并存doc="描述":參數(shù)說明2.示例設(shè)置argument

使

用<arg>標(biāo)簽元素,語法如下:<arg

name="arg-name"default="arg-value"/>launch文件中需要使用argument

時(shí),可以使用如下方式調(diào)用:<param

name="foo"value="$(arg

arg-name)"/><node

name="node"pkg="package"type="type"args="$(arg

arg-name)"/>ROS工作空間覆蓋

ROS

工作空間覆蓋所謂工作空間覆蓋,是指在不同工作空間中,存在同名功能包的情形。(1)新建工作空間A

與工作空間B,兩個(gè)工作空間中都創(chuàng)建turtlesim功能包。(2)在~/.bashrc文件下追加當(dāng)前工作空間的bash格式如下:source/home/用戶/路徑/工作空間A/devel/setup.bashs

溫馨提示

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

評(píng)論

0/150

提交評(píng)論