【手把手做ROS2机器人系统开发五】使用C++实现编写简单的服务器和客户端

这篇具有很好参考价值的文章主要介绍了【手把手做ROS2机器人系统开发五】使用C++实现编写简单的服务器和客户端。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用C++实现编写简单的服务器和客户端

目录

使用C++实现编写简单的服务器和客户端

一、程序编写

1、创建软件包

 2、编译软件包

3、软件配置

4、服务器程序编写

5、客户端程序编写

6、软件包设置

7、设置编译选项

二、程序测试

1、编译程序

2、开启节点测试运行

3、执行效果展示


        上一讲我们讲解了如何编写一个发布者和订阅者程序。本章节继续讲解程序模板,如何编写一个服务器和客户端程序。对于后续的实战开发,前期的理论教学还是少不了,请大家多多阅读。

一、程序编写

1、创建软件包

        继续将软件包创建src目录下,方便统一存放和管理。

ros2 pkg create --build-type ament_cmake cpp_srvcli --dependencies rclcpp example_interfaces

【手把手做ROS2机器人系统开发五】使用C++实现编写简单的服务器和客户端

 2、编译软件包

        回到上级目录进行编译工作,注意路径。

colcon build --packages-select cpp_srvcli

【手把手做ROS2机器人系统开发五】使用C++实现编写简单的服务器和客户端

3、软件配置

 软件编程环境配置,参考上一章节

【手把手做ROS2机器人系统开发三】搭建vscode编程环境

【手把手做ROS2机器人系统开发四】使用C++实现编写简单的发布者和订阅者

4、服务器程序编写

服务器代码路径:

src/cpp_srvcli/src/add_two_ints_server.cpp

实现两个数相加基本运算服务

/**
 * @file add_two_ints_server.cpp
 * @author gmotion (motion_gui@126.com)
 * @brief 发布服务器节点
 * @version 0.1
 * @date 2022-06-10
 * @copyright Copyright (c) 2022
 */

#include <memory>       //内存管理
#include <string>       //字符串

#include <rclcpp/rclcpp.hpp>
//这里使用示例中的接口,后续章节会重点讲解如何自定义专用接口
#include <example_interfaces/srv/add_two_ints.hpp>

//添加服务信息
void add(const std::shared_ptr<example_interfaces::srv::AddTwoInts::Request>reques,
        std::shared_ptr<example_interfaces::srv::AddTwoInts::Response>response)
{
    response->sum = reques->a + reques->b;
    RCLCPP_INFO(rclcpp::get_logger("rclcpp"),"Incoming request\n a:%ld " "b: %ld",
    reques->a,reques->b);
    RCLCPP_INFO(rclcpp::get_logger("rclcpp"),"sending back response: [%ld] ",
    (long int)response->sum);
}

//主运行程序
int main(int argc,char * argv[])
{
    rclcpp::init(argc,argv);
    //创建服务名称节点
    std::shared_ptr<rclcpp::Node>node = rclcpp::Node::make_shared("add_two_ints_server");
    //创建服务函数
    rclcpp::Service<example_interfaces::srv::AddTwoInts>::SharedPtr service=
    node->create_service<example_interfaces::srv::AddTwoInts>("add_two_ints",&add);

    RCLCPP_INFO(rclcpp::get_logger("rclcpp"),"Ready to add two ints.");
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}

5、客户端程序编写

客户端代码路径:

src/cpp_srvcli/src/add_two_ints_client.cpp

实现请求服务器调用计算,测试服务器是否正确运行

/**
 * @file add_two_ints_client.cpp
 * @author gmotion (motion_gui@126.com)
 * @brief 客户端-请求服务器计算
 * @version 0.1
 * @date 2022-06-10
 * @copyright Copyright (c) 2022
 */

#include <chrono>       //处理时间类
#include <cstdlib>      //标准函数库
#include <memory>       //内存管理

#include <rclcpp/rclcpp.hpp>
#include <example_interfaces/srv/add_two_ints.hpp>

using namespace std::chrono_literals;

//主程序函数
int main(int argc,char * argv[])
{
    rclcpp::init(argc,argv);

    //参数数量发生错误
    //传入两个计算对应的数值-用于请求服务器及计算
    if(argc !=3)
    {
        RCLCPP_INFO(rclcpp::get_logger("rclcpp"),"usage: add_two_ints_client X Y");
        return 1;
    }

    //建立node节点
    std::shared_ptr<rclcpp::Node>node = rclcpp::Node::make_shared("add_two_ints_client");

    //建立客户端
    rclcpp::Client<example_interfaces::srv::AddTwoInts>::SharedPtr client =
    node->create_client<example_interfaces::srv::AddTwoInts>("add_two_ints");

    //建立请求发送参数
    auto request = std::make_shared<example_interfaces::srv::AddTwoInts::Request>();
    request->a = atoll(argv[1]);
    request->b = atoll(argv[2]);

    //等待服务
    while (!client->wait_for_service(1s))
    {
        if (!rclcpp::ok())
        {
            RCLCPP_INFO(rclcpp::get_logger("rclcpp"),"service no avaiable,wait again...");
        }
    }
    
    //发送运行请求
    auto result = client->async_send_request(request);
    //等待运行结果
    if(rclcpp::spin_until_future_complete(node,result) == rclcpp::FutureReturnCode::SUCCESS)
    {
        RCLCPP_INFO(rclcpp::get_logger("rclcpp"),"Sum: %ld",result.get()->sum);
    }
    else
    {
        RCLCPP_ERROR(rclcpp::get_logger("rclcpp"),"Failed to call service add_two_ints");
    }

    rclcpp::shutdown();
    return 0;
}

6、软件包设置

src/cpp_srvcli/package.xml
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>cpp_srvcli</name>
  <version>0.0.0</version>
  <description>C++ client server tutorial</description>
  <maintainer email="motion_gui@126.com">gmotion</maintainer>
  <license>Apache License 2.0</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <depend>rclcpp</depend>
  <depend>example_interfaces</depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

7、设置编译选项

src/cpp_srvcli/CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(cpp_pubsub)

# Default to C99
if(NOT CMAKE_C_STANDARD)
  set(CMAKE_C_STANDARD 99)
endif()

# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 14)
endif()


if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
find_package(ament_cmake REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)


add_executable(talker src/publisher_member_function.cpp)
ament_target_dependencies(talker rclcpp std_msgs)

add_executable(listener src/subscriber_member_function.cpp)
ament_target_dependencies(listener rclcpp std_msgs)

install(TARGETS
  talker
  listener
  DESTINATION lib/${PROJECT_NAME})


if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # comment the line when a copyright and license is added to all source files
  set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # comment the line when this package is in a git repo and when
  # a copyright and license is added to all source files
  set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()

二、程序测试

1、编译程序

单一软件包指定编译

colcon build --packages-select cpp_srvcli

2、开启节点测试运行

服务器终端:

. install/setup.bash
ros2 run cpp_srvcli server

客户端终端:

. install/setup.bash
ros2 run cpp_srvcli client 12 10

3、执行效果展示

【手把手做ROS2机器人系统开发五】使用C++实现编写简单的服务器和客户端

         程序准确执行,达到预期结果。本节实现一个简单的服务器节点和一个客户端节点。更多精彩内容,欢迎订阅,敬请阅读下一章内容。谢谢大家的阅读。。。文章来源地址https://www.toymoban.com/news/detail-495217.html

到了这里,关于【手把手做ROS2机器人系统开发五】使用C++实现编写简单的服务器和客户端的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手把手教你搭建微信聊天机器人系列(三):搭建对接文心一言(ERNIE-Bot大模型)接口的微信聊天机器人

            上一章介绍了eggjs+wechaty搭建一个简单的微信聊天机器人,只是实现了简单的回复,这一章我们将对接ERNIE-Bot接口,实现智能回复。         我们在上一章代码基础上进行调整,首先我们要加入access_token的请求逻辑。第一章我们说过,请求需要使用应用对应的

    2024年02月03日
    浏览(60)
  • 手把手QQ机器人制作教程,根据官方接口进行开发,基于Python语言制作的详细教程(更新中)

    QQ开放平台官方地址:https://q.qq.com/#/app/bot QQ开放平台包含:QQ机器人、QQ小程序、QQ小游戏,我们这边选择QQ机器人。 机器人类型:设置私域机器人或者公域机器人,当然公域机器人对于服务器的要求过高,我们这边选择 私域机器人 进行开发。 特别注意在选择沙箱频道的时候

    2023年04月08日
    浏览(61)
  • ROS2机器人任务级导航仿真系统设计与实现(预告)

    前一篇: ​​​​​ROS2工业机械臂抓取仿真系统设计与实现(预告) ROS2机器人任务级导航仿真系统设计与实现 一、背景与意义 随着机器人技术的不断发展和智能化需求的提高,机器人在各个领域中的应用越来越广泛。其中,机器人导航系统是实现机器人自主移动、完成各

    2024年01月24日
    浏览(52)
  • 手把手教你搭建微信聊天机器人系列(一):文心一言(百度千帆ERNIE-Bot大模型)API测试

            今年年初chatgpt大火,国产gpt文心一言也提供了内测服务,大家可以去访问官网申请体验。文心一言APP上的功能更加强大,可以看这个测评文章。作为程序猿的我们,想接入文心一言的能力,比如开发一个聊天机器人,要怎么做呢?百度在其开发者平台开放了大模

    2024年02月07日
    浏览(53)
  • [工业互联-14]:机器人操作系统ROS与ROS2是如何提升实时性的?

    目录 第1章 简介 第2章 历史 第3章 特点 (1)点对点设计 (2)不依赖编程语言 (3)精简与集成 (4)便于测试 (5)开源 (6)强大的库及社区: (7)通道: (8)工具: (9)强大的库: (10)生态系统: 第4章 ROS的系统架构 第5章 ROS与Linux 5.1 ROS能安装在Linux之上吗? 5.

    2024年02月14日
    浏览(48)
  • RoboMaster EP 实用功能开发(三): 基于树莓派的ROS2机器人系统搭建

    功能: 在树莓派4b上安装ros2系统,引入robomaster sdk,搭建一个基于ROS2的机器人系统,用于ROS系统的学习、开发和实践。 硬件: RobotMaster EP、树莓派4b 系统平台: Ubuntu 20.04、ROS2(Foxy) 开发语言及主要库函数版本:p ython == 3.8,robomaster == 0.1.1.62 一、树莓派4b安装ubuntu20.04  

    2024年02月09日
    浏览(47)
  • 【ROS2机器人入门到实战】ROS2话题入门

    当前平台文章汇总地址:ROS2机器人从入门到实战 获取完整教程及配套资料代码,请关注公众号鱼香ROS获取 教程配套机器人开发平台:两驱版| 四驱版 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn 话题是ROS2中最常用的通信方式之一,话题通信采取的是订阅发布

    2024年02月04日
    浏览(66)
  • 【ROS2机器人入门到实战】ROS2节点介绍

    当前平台文章汇总地址:ROS2机器人从入门到实战 获取完整教程及配套资料代码,请关注公众号鱼香ROS获取 教程配套机器人开发平台:两驱版| 四驱版 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn ROS2中每一个节点也是只负责一个单独的模块化的功能(比如一个

    2024年02月06日
    浏览(57)
  • 【ROS2机器人入门到实战】ROS2服务入门

    当前平台文章汇总地址:ROS2机器人从入门到实战 获取完整教程及配套资料代码,请关注公众号鱼香ROS获取 教程配套机器人开发平台:两驱版| 四驱版 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn 大家好,帅鱼又蹬蹬蹬的游回来了。本节小鱼将要带大家一起了解

    2024年02月07日
    浏览(61)
  • 【ROS2机器人入门到实战】ROS2接口介绍

    当前平台文章汇总地址:ROS2机器人从入门到实战 获取完整教程及配套资料代码,请关注公众号鱼香ROS获取 教程配套机器人开发平台:两驱版| 四驱版 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn 本节小鱼将会带你学习认识一个新的概念,叫做interface,即接口。

    2024年02月05日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包