ROS编程实践:创建和使用自定义消息与服务
ROS(Robot Operating System)是一个用于机器人应用的灵活框架,提供了一整套工具和库,以便帮助软件开发者创建机器人应用。在ROS中,消息和服是实现节点间通信的基本机制。本篇博客将介绍如何创建自定义的消息和服务,以及如何在ROS项目中实现它们。
创建和使用自定义消息
在ROS中,消息是节点间传递信息的数据结构。为了创建自定义消息,我们首先需要在ROS包中创建一个新的msg文件夹,并在其中添加自定义消息文件。例如,我们可以创建一个包含三个整型的简单消息:
int32 A
int32 B
int32 C
接下来,我们需要修改CMakeLists.txt和package.xml文件以支持消息的生成。完成后,我们可以通过 catkin_make
命令编译ROS包,这样ROS就会根据我们的自定义消息文件生成相应的代码。使用 rosmsg show
命令可以检查消息是否被正确创建。
创建和使用自定义服务
服务(srv)在ROS中用于请求执行某些操作。创建服务的过程类似于创建消息。首先,在包中创建一个srv文件夹,并添加一个新的srv文件,比如 chapter2_srv1.srv
,并定义请求和响应部分:
int32 A
int32 B
int32 C
---
int32 sum
同样地,编辑CMakeLists.txt和package.xml文件,然后编译。使用 rossrv show
命令可以验证服务是否创建成功。
实现一个简单的加法服务
为了演示如何使用自定义服务,我们将实现一个计算三个整数之和的服务。首先,我们创建服务端节点,当接收到客户端的请求时,它会计算和并返回结果。服务端代码如下:
#include "ros/ros.h"
#include "chapter2_tutorials/chapter2_srv1.h"
bool add(chapter2_tutorials::chapter2_srv1::Request &req,
chapter2_tutorials::chapter2_srv1::Response &res)
{
res.sum = req.A + req.B + req.C;
ROS_INFO("request: A=%ld, B=%ld C=%ld", (int)req.A, (int)req.B, (int)req.C);
ROS_INFO("sending back response: [%ld]", (int)res.sum);
return true;
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_3_ints_server");
ros::NodeHandle n;
ros::ServiceServer service = n.advertiseService("add_3_ints", add);
ROS_INFO("Ready to add 3 ints.");
ros::spin();
return 0;
}
然后是客户端节点,它发送请求到服务端,并接收响应:
#include "ros/ros.h"
#include "chapter2_tutorials/chapter2_srv1.h"
#include <cstdlib>
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_3_ints_client");
if (argc != 4)
{
ROS_INFO("usage: add_3_ints_client A B C");
return 1;
}
ros::NodeHandle n;
ros::ServiceClient client = n.serviceClient<chapter2_tutorials::chapter2_srv1>("add_3_ints");
chapter2_tutorials::chapter2_srv1 srv;
srv.request.A = atoll(argv[1]);
srv.request.B = atoll(argv[2]);
srv.request.C = atoll(argv[3]);
if (client.call(srv))
{
ROS_INFO("Sum: %ld", (long int)srv.response.sum);
}
else
{
ROS_ERROR("Failed to call service add_3_ints");
return 1;
}
return 0;
}
最后,我们可以通过 catkin_make
编译节点,然后使用 rosrun
命令启动服务端和客户端节点。
通过本篇博客的学习,读者可以掌握如何在ROS项目中创建和使用自定义消息和服务,这是开发复杂机器人应用不可或缺的一部分。", "blog_content": "# ROS编程实践:创建和使用自定义消息与服务\n\nROS(Robot Operating System)是一个用于机器人应用的灵活框架,提供了一整套工具和库,以便帮助软件开发者创建机器人应用。在ROS中,消息和服是实现节点间通信的基本机制。本篇博客将介绍如何创建自定义的消息和服务,以及如何在ROS项目中实现它们。\n\n## 创建和使用自定义消息\n\n在ROS中,消息是节点间传递信息的数据结构。为了创建自定义消息,我们首先需要在ROS包中创建一个新的msg文件夹,并在其中添加自定义消息文件。例如,我们可以创建一个包含三个整型的简单消息:\n\n cpp\nint32 A\nint32 B\nint32 C\n
\n\n接下来,我们需要修改CMakeLists.txt和package.xml文件以支持消息的生成。完成后,我们可以通过 catkin_make
命令编译ROS包,这样ROS就会根据我们的自定义消息文件生成相应的代码。使用 rosmsg show
命令可以检查消息是否被正确创建。\n\n## 创建和使用自定义服务\n\n服务(srv)在ROS中用于请求执行某些操作。创建服务的过程类似于创建消息。首先,在包中创建一个srv文件夹,并添加一个新的srv文件,比如 chapter2_srv1.srv
,并定义请求和响应部分:\n\n \nint32 A\nint32 B\nint32 C\n---\nint32 sum\n
\n\n同样地,编辑CMakeLists.txt和package.xml文件,然后编译。使用 rossrv show
命令可以验证服务是否创建成功。\n\n## 实现一个简单的加法服务\n\n为了演示如何使用自定义服务,我们将实现一个计算三个整数之和的服务。首先,我们创建服务端节点,当接收到客户端的请求时,它会计算和并返回结果。服务端代码如下:\n\n cpp\n#include \"ros/ros.h\"\n#include \"chapter2_tutorials/chapter2_srv1.h\"\n\nbool add(chapter2_tutorials::chapter2_srv1::Request &req,\n chapter2_tutorials::chapter2_srv1::Response &res)\n{\n res.sum = req.A + req.B + req.C;\n ROS_INFO(\"request: A=%ld, B=%ld C=%ld\", (int)req.A, (int)req.B, (int)req.C);\n ROS_INFO(\"sending back response: [%ld]\", (int)res.sum);\n return true;\n}\n\nint main(int argc, char **argv)\n{\n ros::init(argc, argv, \"add_3_ints_server\");\n ros::NodeHandle n;\n ros::ServiceServer service = n.advertiseService(\"add_3_ints\", add);\n ROS_INFO(\"Ready to add 3 ints.\");\n ros::spin();\n return 0;\n}\n
\n\n然后是客户端节点,它发送请求到服务端,并接收响应:\n\n cpp\n#include \"ros/ros.h\"\n#include \"chapter2_tutorials/chapter2_srv1.h\"\n#include <cstdlib>\n\nint main(int argc, char **argv)\n{\n ros::init(argc, argv, \"add_3_ints_client\");\n if (argc != 4)\n {\n ROS_INFO(\"usage: add_3_ints_client A B C\");\n return 1;\n }\n ros::NodeHandle n;\n ros::ServiceClient client = n.serviceClient<chapter2_tutorials::chapter2_srv1>(\"add_3_ints\");\n chapter2_tutorials::chapter2_srv1 srv;\n srv.request.A = atoll(argv[1]);\n srv.request.B = atoll(argv[2]);\n srv.request.C = atoll(argv[3]);\n if (client.call(srv))\n {\n ROS_INFO(\"Sum: %ld\", (long int)srv.response.sum);\n }\n else\n {\n ROS_ERROR(\"Failed to call service add_3_ints\");\n return 1;\n }\n return 0;\n}\n
\n\n最后,我们可以通过 catkin_make
编译节点,然后使用 rosrun
命令启动服务端和客户端节点。\n\n通过本篇博客的学习,读者可以掌握如何在ROS项目中创建和使用自定义消息和服务,这是开发复杂机器人应用不可或缺的一部分。