【ROS2】ROS2使用C++实现简单服务端

首先,参见XXXX构建服务接口功能包。

【ROS2】实现自定义服务接口-CSDN博客

使用ROS2实现简单的服务端,功能为将客户端提供的两个数相加后返回给客户端。

代码如下:

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
#include "base_interfaces_demo/msg/student.hpp"
#include "base_interfaces_demo/srv/add_ints.hpp"
#include <memory>

using namespace std::chrono_literals;
using base_interfaces_demo::msg::Student;
using base_interfaces_demo::srv::AddInts;
using std::placeholders::_1;//定义两个占位符,用以在bind函数中表示回调函数的两个参数
using std::placeholders::_2;

class AddIntServer:public rclcpp::Node
{
private:
  /* data */
public:
  AddIntServer():rclcpp::Node("addIntServer_node_cpp"){
    RCLCPP_INFO(this->get_logger(),"服务端节点已创建!");
    // 创建服务端
    server_=this->create_s
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ROS2中,可以使用`create_wall_timer`函数创建一个定时器来循环执行某个任务。下面是一个简单的例子,演示如何使用定时器来循环发送服务通讯的请求。 ```cpp #include <rclcpp/rclcpp.hpp> #include <example_interfaces/srv/add_two_ints.hpp> class ClientNode : public rclcpp::Node { public: ClientNode() : Node("client_node") { // 创建一个定时器,每1秒触发一次回调函数 timer_ = create_wall_timer(std::chrono::seconds(1), std::bind(&ClientNode::send_request, this)); } private: void send_request() { auto client = create_client<example_interfaces::srv::AddTwoInts>("add_two_ints"); // 等待服务启动 if (!client->wait_for_service(std::chrono::seconds(1))) { RCLCPP_ERROR(get_logger(), "Service not available"); return; } // 组装请求消息 auto request = std::make_shared<example_interfaces::srv::AddTwoInts::Request>(); request->a = 1; request->b = 2; // 发送请求 auto future = client->async_send_request(request); if (rclcpp::spin_until_future_complete(this->get_node_base_interface(), future) != rclcpp::FutureReturnCode::SUCCESS) { RCLCPP_ERROR(get_logger(), "Failed to call service add_two_ints"); return; } // 处理响应消息 auto response = future.get(); RCLCPP_INFO(get_logger(), "%d + %d = %d", request->a, request->b, response->sum); } rclcpp::TimerBase::SharedPtr timer_; }; int main(int argc, char **argv) { rclcpp::init(argc, argv); auto node = std::make_shared<ClientNode>(); rclcpp::spin(node); rclcpp::shutdown(); return 0; } ``` 在这个例子中,我们创建了一个名为`client_node`的ROS2节点,并在节点构造函数中创建了一个定时器`timer_`,每1秒触发一次回调函数`send_request`。在`send_request`函数中,我们首先创建了一个客户端,连接到了名为`add_two_ints`的服务端。如果服务没有启动,则等待1秒钟后退出函数。然后,我们组装了一个请求消息,并使用`async_send_request`函数异步发送请求,并等待响应。最后,我们在控制台输出了请求和响应的信息。 注意,在ROS2中,需要使用异步API来发送请求和等待响应。这是因为ROS2框架支持多线程,而异步API可以在不阻塞主线程的情况下发送请求和处理响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pangweijian

传播知识,点亮智慧~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值