1、背景简介
在服务通信中,有时需要我们新建一个客户端,这时候我们可以通过相关命令获取服务话题,数据类型,从而新建客户端对服务端发起请求。
2、实现步骤
1.创建功能包,添加依赖:roscpp rospy std_msgs turtlesim
2.获取服务话题和信息
rosservice list
/clear
/key/get_loggers
/key/set_logger_level
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/spawn
/turtle/get_loggers
/turtle/set_logger_level
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
d102@d102-W65KJ1-KK1:/media/d102/EPAN/Desktop/code_study_ubuntu/rosdemo_05$ rosservice type /spawn
turtlesim/Spawn
d102@d102-W65KJ1-KK1:/media/d102/EPAN/Desktop/code_study_ubuntu/rosdemo_05$ rossrv info turtlesim/Spawn
float32 x
float32 y
float32 theta
string name
---
string name
3.代码实现
- C++
/* 目标:生成一个小乌龟 服务:/spawn 消息类型:turtlesim/Spawn 准备:启动turtlesim_node节点 */ #include"ros/ros.h" #include"turtlesim/Spawn.h" int main(int argc, char *argv[]){ setlocale(LC_ALL,""); ros::init(argc,argv,"turtle_add"); ros::NodeHandle nh; //spawn为服务话题 ros::ServiceClient client = nh.serviceClient<turtlesim::Spawn>("/spawn"); ros::service::waitForService("/spawn"); //建立spawn对象 turtlesim::Spawn spawn; spawn.request.x = 1.0; spawn.request.y = 1.1; spawn.request.theta = 2.2; //当乌龟名重复的时候会报错 spawn.request.name = "turtle_add1"; bool flag = client.call(spawn); if (flag){ ROS_INFO("乌龟名:%s",spawn.response.name.c_str()); } else{ ROS_INFO("失败!!!"); } return 0; }
- Python
#! /usr/bin/env python from tkinter import EXCEPTION from rosdep2 import RosdepLookup import rospy from turtlesim.srv import Spawn,SpawnRequest,SpawnResponse if __name__ == "__main__": rospy.init_node("turtle_add_p") client = rospy.ServiceProxy("/spawn",Spawn) client.wait_for_service() req = SpawnRequest() req.x = 1.0 req.y = 4.3 req.theta = 3.4 req.name = "turtle_p" try: response = client.call(req)#返回乌龟名 rospy.loginfo("乌龟名:%s",response.name) except EXCEPTION as e: rospy.loginfo("失败!!!!!")