ROS机器人开发项目实战 课件 第3、4章 ROS通信机制、ROS运行管理_第1页
ROS机器人开发项目实战 课件 第3、4章 ROS通信机制、ROS运行管理_第2页
ROS机器人开发项目实战 课件 第3、4章 ROS通信机制、ROS运行管理_第3页
ROS机器人开发项目实战 课件 第3、4章 ROS通信机制、ROS运行管理_第4页
ROS机器人开发项目实战 课件 第3、4章 ROS通信机制、ROS运行管理_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

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

文档简介

第3章

ROS通信机制·ROS

通信机制介绍·ROS

项目开发流程·

话题通信机制·

服务通信机制·

参数服务器ROS通信机制介绍

ROS通信机制介绍话题

(Topic)——异步通信机制●节点间用来传输数据的重要总线;●

使

用发布/订阅模型,数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以不唯一。消息

(Message)——话题数据●具有一定的类型和数据结构,包括ROS提供的标准类型和用户自定义类型;●使用编程语言无关的.msg

文件定义,编译过程中生成对应的代码文件。Computer

on

the

RobotLaptopROS

NodeTopic:/exampleMessageType:std_msgs/StringSubscriber话题模型(发布/订阅)ProcessingSubscribePubish/image_data

MessageCameraNodeDataRegistration

RogistraionROS

MasterReqistrationROS

Node ROS通信机制介绍服务

(Service)——同步通信机制●

使

用客户端/服务器(C/S)

模型,客户端发送请求数据,服务器完成处理后返回应答数据;●使用编程语言无关的.srv文件定义请求和应答数据结构,编译过程中生成对应的代码文件。ReplyService

ClientROS

NodeData服务模型(请求/应答)Computeron

the

Robot_

ROSMasterResistraionImageProcessingNodeRegistrationCameraNodeReply

/image_dataMessageROS

NodeServiceServerRequest-requestresponse话题服务同步性异步同步通信模型发布/订阅服务器/客户端底层协议ROSTCP/ROSUDPROSTCP/ROSUDP反馈机制无有缓冲区有无实时性弱强节点关系多对多一对多(一个server)适用场景数据传输逻辑处理 ROS通信机制介绍话题与服务的区别ROS通信机制介绍参数

(Parameter)——

全局共享字典●

可通过网络访问的共享、多变量字典;●节点使用此服务器来存储和检索运行时的参数;●适合存储静态、非二进制的配置参数,不适合存储动态配置的数据。ROS

Master

Node

ANode

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

CNode

DROS

项目开发流程

ROS

项目开发流程ROS

项目开发过程,采用如下步骤:配置编译规则(CMakeLists.txt)创建源代码(C++/Python)创建工作空间创建功能包编译与运行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

项目开发流程工作空间(workspace)是一个存放工程开发相关文件的文件夹。src:

代码空间(Source

Space)build:编译空间(Build

Space)devel:开发空间(Development

Space)install:安装空间(InstallSpace)

ROS

项目开发流程创建工作空间编译工作空间设置环境变量$mkdir-p~/catkin_ws/src$cd~/catkin_ws/src$catkin_init_workspace$cd

~/catkin_ws/$catkin_make$source

devel/setup.bash

ROS

项目开发流程$catkin_create_pkg

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

~/catkin_ws/src创建功能包

$catkin_create_pkg

learning_communication

rospy

roscpp

std_msgs

std_srvs$cd~/catkin_ws编译功能包

$catkin_make$source

~/catkin_ws/devel/setup.bash同一个工作空间下,不允许存在同名功能包不同工作空间下,允许存在同名功能包话题通信机制

ROS

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

Topic(/chatter)话题模型(发布者/订阅者)Publisher(string_publisher)

ROS

Topic通信编程分别编写发布者和订阅者,实现发布方以10HZ(每秒10次)的频率发布文本消息("Hello

World!"),订阅方订阅消息并将该消息内容输出至终端。1.编写发布者程序首先在前面章节创建的catkin_ws

工作空间下,使用如下命令创建功能包和新建文件:cd

~/catkin_ws/srccatkin_create_pkg

learning_communication

roscpp

rospy

std_msgs

std_srvscd

learning_communication/srcgedit

string_publisher.cpp

ROS

Topic通信编程如何实现一个发布者:1)初始化ROS

节点;2

)向ROSMaster注册节点信息,包括发布的话题名和话题中的消息类型;3)创建消息数据;4)按照一定频率循环发布消息。*该例程将发布chatter话题,消息类型string*/#tnclude

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

argc,char

**argv){//ROS节点初始化ros::init(argc,argv,"string_publisher");//创建节点句柄ros::NodeHandle

n;//创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::Stringros::Publisherchatter_pub=n.adverttse<std_msgs::String>("chatter",1000);//设置循环的频率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/发布消息

a

Nr_

"

,lni

.

;_str());gamsdatssb"usp%puFOt_eItSchRO1/按照循环频率延时loop_rate.sleep();++count;}}

return

θ;

string_publisher.cppwhtle

(ros::ok())ROS

Topic通信编程如何实现一个订阅者:1)初始化ROS

节点;2)订阅需要的话题;3

)循环等待话题消息,接收到

消息后进入回调函数;4)在回调函数中完成消息处理。*该例程将订阅chatter话题,消息类型string#include

"ros/ros.h"#include

"std_nsgs/String.h"1/接收到订阅的消息后,会进入消息回调函数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节点ros::init(argc,argv,"string_subscriber"

);//

创建节点句柄ros::NodeHandle

n;1/创建一个Subscriber,订阅名为chatter的topic,注册回调函数chattercallbackros::Subscriber

sub

=n.subscribe("chatter",1000

,chattercallback);1/循环等待回调函数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

中的编译规则·

设置需要编译的代码和生成的可执行文件;·

设置链接库;#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]:发送的消息:Hello

World!INFO][1665461185.556308011]:

发送的消息:HelloINF0][1665461185.656292382]:发送的消息:HelloINF0][1665461185.756392602]:发送的消息:Hello

World!7INF0][1665461185.956310690]:爱送的消息:HelloINF0][1665461186.156325978]:发送的消息:Hello[INF⁰][1665461186.256418810]:发送的消息:HelloINFO][1665461186.556307066]:发送的消息:Hello

World!15INFO][1665461186.656334253]:发送的消息: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话题通信示例下面通过创建自定义消息,要求该消息包含人的信息:姓名、身高、年龄等。Message(learning_communication.::Person)Publisher(person_publisher)Topic(/person_info)Registration

自定义msg话题通信示例下面通过创建自定义消息,要求该消息包含人的信息:姓名、身高、年龄等。1.按照固定格式创建msg

文件在功能包下新建msg

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

并在该文件中写入如下信息:string

nameuint16agefloat64

height注:这里使用的基础数据类型string

、uint16

、float64都是与编程语言无关的,编译阶段会变成各种语言对应的数据类型。

自定义msg话题通信示例下面通过创建自定义消息,要求该消息包含人的信息:姓名、身高、年龄等。2.修

改package.xml和CMakeLists.txt

文件内容在

package.xml

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

添加编译选项find_package(……message_generation)add_message_files(FILES

PersonMsg.msg)generate_messages(DEPENDENCIESstd_msgs)catkin_package(……message_runtime)·该例程将发布/person_info话题,Learntng_communtcatton::PersonMsg#Lnclude<ros/ros,>#tnclude"Learntng_connuntcatton/Personsg.h“int

natn(tnt

argc,char

**argv)I/ROS

节点初始化ros::tntt(argc,argv,"person_publtsher");I/创建节点句柄ros;:NodeHandle

n;1/创建一个Publisher,发布名为/person_info的topte,消息类型为Learntng_conmuntcatton::PersonMsg,队列长度10ros::Publtsherperson_tnfo_pub=n.advertise<learning_comnuntcatton::PersonMsg>("/person_tnfo",10);I/设置循环的频率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//发布消息person_tnfo_pub.publish(person_nsg);ROS_INFO("PublishPersonInfo:nane:%sage:%dsex:%d",//

按照循环频率延时loop_rate.sleep();person_publisher.cpp如何实现一个发布者:1)初始化ROS

节点;2

)向ROSMaster注册节点信息,包括发布的话题名和话题中的消息类型;3)创建消息数据;4)按照一定频率循环发布消息。自定义msg话题通信示例下面通过创建自定义消息,要求该消息包含人的信息:姓名、身高、年龄等。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”//接收到订阅的消息后,会进入消息回调函数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节点ros::init(argc,argv,

"person_subscriber"

);1/创建节点句柄ros::NodeHandlen;I/创建一个Subscriber,订阅名为/person_info的topic,

注册回调函数personInfocallbackros::Subscriber

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

personInfocallback);1/循环等待回调函数ros::spin();return

θ;

person_subscriber.cpp如何实现一个订阅者:1)初始化ROS

节点;2)订阅需要的话题;3

)循环等待话题消息,接收到

消息后进入回调函数;4)在回调函数中完成消息处理。自定义msg话题通信示例下面通过创建自定义消息,要求该消息包含人的信息:姓名、身高、年龄等。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

中的编译规则●设置需要编译的代码和生成的可执行文件;●设置链接库;●添加依赖项。

ROS

Topic通信编程cd

~/catkin_wscatkin_makesource

devel/setup.bashroscorerosrun

learning_communication

person_publisherrosrun

learning_communication

person_subscriber单选题

1分ROS中自定义msg时,字符串用哪个(

)定义。A

uint32B

stringCfloat64uint16设置提交服务通信机制

ROS

服务通信编程ROSMasterRegistration

RegistrationRequeststd_srvs::SetBoolResponseRequeststd_srvs::SetBoolResponse服务模型(服务端/客户端)Server(string_server)Client(string_client)Service

(/print_string)

ROS

服务通信编程分别编写服务端和客户端,实现文本消息(“Hello

ROS!”)

服务通信的过程。1.编写服务端程序首先在前面章节创建的catkin_ws

工作空间下,使用如下命令创建功能包和新建文件:cd

~/catkin_ws/srccatkin_create_pkg

learning_communication

roscpp

rospy

std_msgs

std_srvscd

learning_communication/srcgedit

string_server.cpp

ROS

服务通信编程如何实现一个服务器:1)初始化ROS

节点;2)创建Server实例;3)循环等待服务请求,进入回调函数;4)在回调函数中完成服务功能的处理,

并反馈应答数据。/**◆该例程将提供print_string服务,std_srvs::SetBool*/#include"ros/ros.h"#include

"std_srvs/SetBool.hI/service

回调函数,输入参数req,

输出参数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

节点初始化ros::init(argc,argv,

"string_server"

);I/

创建节点句柄ros::NodeHandle

n;//创建一个名为print_string的server,

注册回调函数print()ros::ServtceServer

servlce=n.advertseservtce("prtnt_string

",print);1/

循环等待回调函数ROS_INFO("Ready

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

o;

string_server.cpp}(/***该例程将请求print_string服务,std_srvs::SetBool*/#include

"ros/ros.h"#include

"std_srvs/SetBool.h"int

nain(intargc,char

**argv){//ROS

节点初始化ros::init(argc,argv,

"string_cltent"

);1/创建节点句柄ros::NodeHandle

n;1/创建一个client,service

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

client

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

");1/创建std_srvs::SetBool类型的servtce消息std_srvs::SetBool

srv;1/

发布service请求,等待应答结果{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如何实现一个客户端:1)初始化ROS

节点;2)创建

个Client实例;3)发布服务请求数据;4

)

待Server处理之后的应答结果。

ROS

服务通信编程srv.request.data

=

true

;if(client.call(srv))ROS

服务通信编程##

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中的编译规则·

设置需要编译的代码和生成的可执行文件;·

设置链接库;

ROS

服务通信编程cd

~/catkin_wscatkin_makesource

devel/setup.bashroscorerosrun

learning_communication

string_serverrosrun

learning_communication

string_clientscott@scott-NUC11TNKi5:~/catkin_ws[INFO][1665798531.379460753]:服务已经启动,准备输出字符串[INF0][1665798742.916009164]:服务器收到请求信息为:Hello

ROS!scott@scott-NUC11TNKi5:~/catkin

wsS

rosrun

learning_communication

string_client[INF0][1665798742.916135042]:请求正常处理,响应结果:[True]Print

successully

scott@scott-NUC11TNKi5

:

~/catkin_ws

$Lscott@scott-NUC11TNKi5:~/catkin_ws

自定义srv服务通信示例本例中,客户端提交两个整数至服务端,服务端接收请求后完成求和运算,并返回结果到客户端。1.

按照固定格式创建srv

文件在功能包下新建srv文件夹,新建文件AddTwolnts.srv,并在该文件中写入如下信息:#客户端请求时发送的两个数字int32

num1int32

num2

#

服务器响应发送的数据int32sum

自定义srv服务通信示例2.修改package.xml和CMakeLists.txt文件内容在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

添加编译选项find_package(catkin

REQUIRED

COMPONENTSroscpprospystd_msgsstd_srvsmessage_generation3.编译生成中间文件

自定义srv服务通信示例如何实现一个服务器(AddTwolnts_Server.cpp):1)初始化ROS

节点;2)创建Server实例;3)循环等待服务请求,进入回调函数;4)在回调函数中完成服务功能的处理,

并反馈应答数据。#include

<ros/ros.h>#include

"learning_communication/AddTwoInts.h"1/service

回调函数,输入参数req,输出参数resbool

add(learning_communication::AddTwoInts::Request

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

将输入参数中的请求数据相加,结果放到应答变量中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

节点初始化ros::init(argc,argv,"add_two_ints_server");//创建节点句柄ros::NodeHandlen;//创建一个名为/show_person的server,

注册回调函数personCallbackros::Serviceserverservice=

n.advertiseService(

"/add_two_ints

",add);//循环等待回调函数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节点ros::init(argc,argv,

"add_two_ints_client");//从终端命令行获取两个加数if(argc!=

3){ROS_INFO("usage:add_two_ints_client

XY");return

1;//创建节点句柄ros::NodeHandle

n;//创建一个client,请求add_two_int

service,service消息类型是

learning_communication::AddTwoIntsros::ServiceClient

client

=n.serviceClient<learning_communication::AdTwoInts>("add_two_ints");//创建learning_communication::AddTwoInts类型的service

消息learning_communication::;AddTwoIntssrv;srv.request.a=atoll(argv[1]);srv.request.b=atoll(argv[2]);//发布service请求,等待加法运算的应答结果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服务通信示例如何实现一个客户端(AddTwolnts_Client.cpp):1)初始化ROS

节点;2)创建

个Client实例;3)发布服务请求数据;4

)

待Server处理之后的应答结果。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服务通信示例CMakeLists.txt配置文件

自定义srv服务通信示例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]:服务器接收到的请求数据为:nun1=1,nun2=2scott@scott-NUC11TNKi5:~/catkin_wsscott@scott-NUC11TNKi5:~/catkin_ws

S

rosrun

learning_communicationAddTwoInts_client12

[INF0][1665803662.585609419]:请求正常处理,响应结果:3scott@scott-NUC11TNKi5

:~/catkin_wsSAmsgBsrvClaunchroSsrv提交单选题

1分ROS

中自定义服务的文件夹名称为(

)设置参数服务器

参数服务器参数服务器也可以说是特殊的“通信方式”。参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器的维护方式非常的简单灵活,总的来讲有三种方式:命令行参数设

、launch文件内读写和node源

码。ROS

Master

Node

ANode

BParameter

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

CNode

D参数服务器机制

参数服务器1.命令行参数设置使用命令行来设置参数服务,主要通过rosparam命令来进行各种操作设置。

rosparam能够存

储并操作ROS

参数服务器(Parameter

Server)

上的数据。参数服务器能够存储整型、浮点、

布尔、字符串、字典和列表等数据类型。rosparam命令rosparam命令作用rosparam

set

param_key

param_value设置参数rosparam

get

param_key显示参数rosparam

load

file_name从文件加载参数rosparam

dump

file_name保存参数到文件rosparam

delete删除参数rosparam

list列出参数名称

参数服务器2.launch文件内读写参数launch

文件中有很多标签,而与参数服务器相关的标签只有两个,

一个是<param>,

个是

<rosparam>

。示例如下:<!--直接定义参数并赋值--><param

name="velodyne_frame_id"type="string"value="velodyne"/><!--定义参数并通过arg

给参数赋值--><arg

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

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

velodyne_frame_id)"/>

参数服务器3.节点源码内进行读写参数除了上述最常用的两种读写参数服务器的方法,还有一种就是修改ROS的源码,也就是利用API来对参数服务器进行操作。C++节点中实现参数服务器的读写有两套API

系统。(1)ros::NodeHandle,

该方式的示例如下://创建ros节点句柄ros::NodeHandle

nh;string

node_param;std::vector<std::string>param_names;//新增参数到参数服务器中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);

参数服务器(2)ros::param,

相关示例如下:

课程作业使用海龟仿真器,完成以下编程作业:1.创建一个节点,在其中实现一个订阅者和一个发布者,完成以下功能:发布者:发布海龟速度指令,让海龟圆周运动订阅者:订阅海龟的位置信息,并在终端中周期打印输出2.创建另外一个节点,在其中实现一个客户端,完成以下功能:客户端:请求海龟诞生的服务,在仿真器中产生一只新的海龟THANKS感谢观看第4章

ROS

运行管理·ROS

节点运行管理·ROS

工作空间覆盖·ROS

节点重名·ROS

话题名称设置·ROS

参数名称设置·Launch文件综合案例ROS

节点运行管理

ROS

节点运行管理ROS使用多进程(节点)的分布式框架,

一个完整的ROS系统可能出现如下情形:●可能包含多台主机;●每台主机上有多个工作空间;●每个工作空间中又包含多个功能包;●每个功能包包含多个节点,不同的节点都有自己的节点名称;●每个节点可能还会设置一个或多个话题。

ROS节点运行管理—launch文件launch文件是一个XML格式的文件,可以启动本地和远程的多个节点,还可以在参数服务器中设置参数。其作用是简化节点的配置与启动,提高ROS程序的启动效率。新建launch文件<launch><nodepkg="learning_communication"type="person_subscriber"name="talker"/><nodepkg="learning_communication"type="person_publisher"name="listener"/>调用launch文件roslaunch

learning_launch

demo.launch注意:

roslaunch

命令执行launch文件

时,首先会判断是否启动了roscore。如果已经启动,则不再启动,否则,

会自动调用roscore。</launch>

launch文件标签<launch>标签是所有launch文件的根标签,充当其他标签的容器,文件中的其他

内容都必须放在这个标签中。<node>

标签用于指定ROS

节点,是最常见的标签,需要注意的是roslaunch命令不能保证按照node的声明顺序来启动节点(节点的启动是多进程的)。1.属性pkg=“包名”:节点所在的功能包名称type="nodeType":节点的可执行文件名称name="nodeName":节点运行时的名称(在

ROS网络拓扑中节点的名称)args="xxx××x×x"(可选):将参数传递给节点2.子级标签env

环境变量设置remap重映射节点名称rosparam参数设置param参数设置

launch文件标签<include>

标签用于将另一个xml格式的launch

文件导入到当前文件中,类似C语言中的头文件包含。1.属性file="S(find

功能包名)/×xx/xxx.launch":要包含的文件路径ns="xxx"(可选):在指定命名空间导入文件2.子级标签env

环境变量设置arg将参数传递给被包含的文件

launch文件标签<remap>

标签用于重映射ROS

计算图资源的命名。用户不需要修改已有功能包的

接口,只需要将接口名称重映射,取一个别名,这样系统就能识别该接口。属性from="xxx":

原命名to="yyy":

映射之后的命名比如turtlebot的键盘控制节点发布速度指令话题是/turtlebot/cmd_vel,但是如果当前机器人订阅

的速度控制话题是/cmd_vel,

这时使用<remap>就可以轻松解决问题,实现代码如下:<remap

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

launch文件标签<param>标签主要用来在参数服务器上设置参数,参数源可以在标签中通过value

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

标签中时,相当于私有命名空间。launch文件执行后,参数值就加载到ROS

的参数服务器上。属性name="命名空间/参数名":参数名称,可以包含命名空间value="xxx"(可选):定义参数值,如果此处省略,必须指定外部文件作为参数源type="str|int|double|bool|yaml"(可选):指定参数类型,如果未指定,roslaunch

会尝试

确定参数类型

launch文件标签<rosparam>标签可以将YAML

格式文件中的参数全部导入到ROS

参数服务器中,或将参数导出到YAML

文件,也可以用来删除参数,<rosparam>标签在<node>标签中时被视为私有标签

。属性command="load

|dump

|delete"

(可选,默认load):

加载、导出或删除参数file="S(findxxxxx)/xxx/yy...":加载或导出到的yaml文件param="

参数名称"ns="命名空间"(可选)

launch文件标签<arg>标签是用于动态传参,类似于函数的参数,仅限于launch文件使用,便于launch文件的重构,与ROS节点内部的实现没有关系。1.属性name="

参数名称":

default="默认值"(可选)value="数值"(可选):不可以与default并存doc="描述":参数说明2.示例设置argument

使

用<arg>标签元素,语法如下:<arg

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

时,可以使用如下方式调用:<param

name="foo"value="$(arg

arg-name)"/><node

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

arg-name)"/>ROS工作空间覆盖

ROS

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

与工作空间B,两个工作空间中都创建turtlesim功能包。(2)在~/.bashrc文件下追加当前工作空间的bash格式如下:source/home/用户/路径/工作空间A/devel/setup.bashs

温馨提示

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

评论

0/150

提交评论