ROS编程实践:创建和使用自定义消息与服务

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项目中创建和使用自定义消息和服务,这是开发复杂机器人应用不可或缺的一部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值