ROS入门:客户端Client的编程实现

559 阅读1分钟

.客户端Client的编程实现[1]

图源自B站古月居视频,侵删

图源自B站古月居视频,侵删
图中模型共涉及两个节点,分别为客户端turtle_spawn和服务端turtlesim,turtlesim提供/spawn服务。client端turtle_spawn发布一个产生海龟的request,server端接受到请求后,产生新的海龟并向client端发送reponse,反馈给客户端。

  • 新建功能包learning_service
$ cd catkin_ws/src/
$ catkin_create_pkg learning_service rospy roscpp std_msgs geometry_msgs turtlesim
  • 在/home/nelson/catkin_ws/src/learning_service/src下新建turtle_spawn.cpp

编程实现步骤:

  1. 初始化ROS节点
  2. 创建一个Client实例
  3. 发送服务请求数据
  4. 等待Server处理之后的应答结果

具体实现:

/**
 * 该例程将请求/spawn服务,服务数据类型turtlesim::Spawn
*/

#include <ros/ros.h>
#include <turtlesim/Spawn.h>

int main(int argc,char** argv)
{
    // 初始化ROS节点
    ros::init(argc,argv,"turtle_spawn");

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

    // 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的service;若没发现,则会一直等待
    ros::service::waitForService("/spawn");
    ros::ServiceClient add_turtle=node.serviceClient<turtlesim::Spawn>("/spawn");

    // 初始化turtlesim::Spawn的请求数据
    turtlesim::Spawn srv;
    srv.request.x=2.0;
    srv.request.y=2.0;
    srv.request.name="turtle2";

    // 请求服务调用
    ROS_INFO("Call service to spawn turtle[x: %0.6f, y: %0.6f, name: %s]",srv.request.x,srv.request.y,srv.request.name.c_str());
    
    // 等待服务端响应后,程序才会继续执行
    add_turtle.call(srv);

    // 显示服务调用结果
    ROS_INFO("Spawn turtle successfully [name:%s]",srv.response.name.c_str());

    return 0;
}
  • ROS相关命令
  1. rosservice list 查看当前有哪些服务。如在运行turlesim_node节点后在终端输入rosservice list后会显示如下图结果,其中就有/spawn服务。
  2. rosservice call 向服务端发送请求。如在终端输入下面指令后,也会在turtlesim_node界面上出现上述代码所实现效果。
rosservice call /spawn "x: 0.0
y: 2.0
theta: 2.0
name: 'turtle2'" 

参考资料

[1]

古月居,ROS入门21讲: https://www.bilibili.com/video/BV1zt411G7Vn?p=13。