以下是一个以《玩具总动员》为背景的 ROS 节点之间使用服务的例子,使用 C++ 编写:
-
场景描述: 假设我们有两个玩具机器人:Woody 和 Buzz。Woody 是一个移动机器人,而 Buzz 是一个机械臂机器人。我们希望 Woody 可以请求 Buzz 帮助抓取一些玩具。
-
ROS 节点:
- Woody 节点:负责移动和控制 Woody 机器人。
- Buzz 节点:负责控制 Buzz 机械臂。
-
服务通信:
- Woody 节点可以通过调用一个 ROS 服务请求 Buzz 节点来执行抓取操作。
- Buzz 节点接收到请求后,执行机械臂的抓取动作,并将结果返回给 Woody 节点。
-
服务定义:
-
我们定义一个名为
grab_toy
的 ROS 服务,其中包含一个请求和一个响应:- 请求:包含目标玩具的信息(例如玩具的名称或位置)。
- 响应:包含抓取操作的结果(成功或失败)。
-
-
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; }
-
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 服务进行通信,以实现玩具抓取功能。您可以根据实际需求进行修改和扩展。🤖🎪