ROS 节点之间如何使用服务?

39 阅读2分钟

以下是一个以《玩具总动员》为背景的 ROS 节点之间使用服务的例子,使用 C++ 编写:

  1. 场景描述: 假设我们有两个玩具机器人:WoodyBuzz。Woody 是一个移动机器人,而 Buzz 是一个机械臂机器人。我们希望 Woody 可以请求 Buzz 帮助抓取一些玩具。

  2. ROS 节点

    • Woody 节点:负责移动和控制 Woody 机器人。
    • Buzz 节点:负责控制 Buzz 机械臂。
  3. 服务通信

    • Woody 节点可以通过调用一个 ROS 服务请求 Buzz 节点来执行抓取操作。
    • Buzz 节点接收到请求后,执行机械臂的抓取动作,并将结果返回给 Woody 节点。
  4. 服务定义

    • 我们定义一个名为 grab_toy 的 ROS 服务,其中包含一个请求和一个响应:

      • 请求:包含目标玩具的信息(例如玩具的名称或位置)。
      • 响应:包含抓取操作的结果(成功或失败)。
  5. Woody 节点的代码示例

    // Woody 节点
    #include <ros/ros.h>
    #include <std_srvs/Trigger.h>
    
    bool grabToyRequest() {
        // 调用 Buzz 节点的抓取服务
        ros::NodeHandle nh;
        ros::ServiceClient client = nh.serviceClient<std_srvs::Trigger>("buzz/grab_toy");
        std_srvs::Trigger srv;
        if (client.call(srv)) {
            return srv.response.success;
        } else {
            ROS_ERROR("Failed to call service buzz/grab_toy");
            return false;
        }
    }
    
    int main(int argc, char** argv) {
        ros::init(argc, argv, "woody_node");
        bool success = grabToyRequest();
        if (success) {
            ROS_INFO("Woody successfully grabbed the toy!");
        } else {
            ROS_WARN("Woody failed to grab the toy.");
        }
        return 0;
    }
    
  6. Buzz 节点的代码示例

    // Buzz 节点
    #include <ros/ros.h>
    #include <std_srvs/Trigger.h>
    
    bool handleGrabToy(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res) {
        // 执行抓取动作
        // 这里可以添加 Buzz 机械臂的具体控制逻辑
        bool success = true;  // 假设抓取成功
        res.success = success;
        res.message = success ? "Toy grabbed successfully" : "Failed to grab toy";
        return true;
    }
    
    int main(int argc, char** argv) {
        ros::init(argc, argv, "buzz_node");
        ros::NodeHandle nh;
        ros::ServiceServer service = nh.advertiseService("buzz/grab_toy", handleGrabToy);
        ROS_INFO("Buzz node ready to grab toys!");
        ros::spin();
        return 0;
    }
    

这个例子展示了 Woody 和 Buzz 之间如何使用 ROS 服务进行通信,以实现玩具抓取功能。您可以根据实际需求进行修改和扩展。🤖🎪