调用服务去生成一只新的乌龟
与话题通信类似,首先去获得所有服务的话题,/spawn .然后查看话题的类型,turtlesim/Spawn,然后查看消息的具体内容都包括什么,具体的代码实现如下所示。
#include "ros/ros.h"
#include "turtlesim/Spawn.h"
#include <cstdlib>
/*
调用服务/spawn 去生成一只新的乌龟
ding@ding-TravelMate-P259-G2-MG:~$ rosservice list
/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/spawn
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level
----------------------------------------------------------------------------------
ding@ding-TravelMate-P259-G2-MG:~$ rosservice type /spawn
turtlesim/Spawn
-----------------------------------------------------------------------------
ding@ding-TravelMate-P259-G2-MG:~$ rossrv info turtlesim/Spawn
float32 x
float32 y
float32 theta
string name
---
string name
*/
int main(int argc,char *argv[])
{
ros::init(argc,argv,"turtlesim_new");
ros::NodeHandle nh;
if(argc!=5) //如果采用外部输入判断传入的参数的数量
{
ROS_INFO("failed");
return 1;
}
ros::ServiceClient new_turtlesim=nh.serviceClient<turtlesim::Spawn>("/spawn");
ros::service::waitForService("/spawn");
turtlesim::Spawn turtle2;
/*采用了两种输入形式,在程序中固定数据,以及在外部输入数据
在程序里进行参数的输入
turtle2.request.x=1.0;
turtle2.request.y=2.0;
turtle2.request.theta=0;
turtle2.request.name="turtle2";
*/
//外部数据的输入,第一个参数是节点路径
turtle2.request.x=atof(argv[1]);
turtle2.request.y=atof(argv[2]);
turtle2.request.theta=atof(argv[3]);
turtle2.request.name=argv[4];
if(new_turtlesim.call(turtle2))
{
ROS_INFO("name = %s ",turtle2.request.name.c_str());
}
else{
ROS_INFO("failed ");
return 1;
}
return 0;
}