服务调用乌龟案例
实现步骤:
1.启动乌龟显示节点。
2.通过ros命令,获取乌龟生成服务的服务名称以及服务消息类型。
3.编写服务请求节点,生成新的乌龟。
实现流程:
1.通过ros命令获取服务与服务消息信息。
2.编码实现服务请求节点。
3.启动roscore,turtlesim_node,乌龟生成节点,生成新的乌龟。
获取服务话题
rosservice list
# 获取服务列表
显示ros正在服务的列表
/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/rqt_gui_py_node_19784/get_loggers
/rqt_gui_py_node_19784/set_logger_level
/rqt_gui_py_node_20438/get_loggers
/rqt_gui_py_node_20438/set_logger_level
/spawn
/teleop_turtle/get_loggers
/teleop_turtle/set_logger_level
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level
rosservice info /spawn
/spawn的信息结果
Node: /turtlesim
URI: rosrpc://makus-AFS:60819
Type: turtlesim/Spawn
Args: x y theta name
查看 turtlesim/Spawn信息
rossrv info turtlesim/Spawn
turtlesim/Spawn类型信息
float32 x
float32 y
float32 theta
string name
---
string name
命令的方式调用服务
rosservice call /spawn "x: 0.0
y: 05.0
theta: 90.0
name: 'turtle2'"
c++程序实现
#include "ros/ros.h"
#include "turtlesim/Spawn.h"
/*
* 需求:向服务端发送请求,生成一只新乌龟
* 话题:/spawn
* 消息:turtlesim/Spawn
*/
int main(int argc,char *argv[])
{
ros::init(argc,argv,"service_call");
ros::NodeHandle nh;
ros::ServiceClient client= nh.serviceClient<turtlesim::Spawn>("/spawn");
//组织数据
turtlesim::Spawn spawn;
spawn.request.x = 1.0;
spawn.request.y = 4.0;
spawn.request.theta = 1.5;
spawn.request.name = "turtle2";
//发送数据请求
//判断服务器状态
//ros::service::waitForService("spawn"); //可以判断
client.waitForExistence();
bool flag = client.call(spawn);//flag接收响应状态
if(flag)
{
ROS_INFO("generate turtle:%s ",spawn.response.name.c_str());
}
else
{
ROS_INFO("Requst failed!");
}
}
CmakeLists.txt设置
add_executable(service_pub_spawn src/service_pub_spawn.cpp)
target_link_libraries(service_pub_spawn ${catkin_LIBRARIES})
编译代码
catkin_make
测试代码运行
roscore
rosrun turtlesim turtlesim_node
rosrun pakage_02 service_PUB_spawn
[ INFO] [1647933957.137713494]: generate turtle:turtle2
结果展示,这里你可以看到2只啦。