版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中职电力技术(高压电工基础)试题及答案
- 2025年高职口腔医学技术(口腔修复)试题及答案
- 江苏教育出版社旅游管理硕士入学考试复习指南试题及答案
- 2025-2030中国膨化小吃市场盈利前景及未来投资走势预测研究报告
- 2025-2030汽车油电混合动力技术发展趋势分析及市场应用前景报告
- 2025-2030汽车尾气净化后处理技术催化剂配方性能评测方案
- 2025-2030汽车后市场服务模式优化探索未来家庭出行方式变革研究分析报告
- 2025-2030汽车制造行业排放研究表明制定行动目标政策法规环境识别技术升级设备改造合理划算评估报告
- 2025-2030汽车制造业行业技术发展需求分析及产业链竞争评估行业发展规划研究分析报告
- 学校财务管理规章制度
- 烟花爆竹经营零售申请书
- 《鲤鱼的遇险》读书分享
- 融媒体中心党支部2025年前三季度党建工作总结范文
- 提升施工企业安全管理水平的关键措施与路径探索
- 自动扶梯应急预案演练计划(3篇)
- GB/T 16271-2025钢丝绳吊索插编索扣
- 暴盲的中医护理方案
- GB/T 20871.62-2025有机发光二极管显示器件第6-2部分:测试方法视觉质量和亮室性能
- 旋挖钻机地基承载力验算2017.7
- 轮机管理题库(助理管轮)
- 基于深度学习的妊娠期糖尿病早期筛查策略优化-洞察阐释
评论
0/150
提交评论