当前位置: 首页 > news >正文

网站没有百度权重《jsp网站开发详解》百度云

网站没有百度权重,《jsp网站开发详解》百度云,简洁大方的网站,网上购物网站设计目录 0 专栏介绍1 服务通信模型2 服务模型实现(C)3 服务模型实现(Python)4 自定义服务5 话题、服务通信的异同 0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。…

目录

  • 0 专栏介绍
  • 1 服务通信模型
  • 2 服务模型实现(C++)
  • 3 服务模型实现(Python)
  • 4 自定义服务
  • 5 话题、服务通信的异同

0 专栏介绍

本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。

🚀详情:《ROS2从入门到精通》


1 服务通信模型

服务是 ROS 图中节点之间的另一种通信方法。服务基于服务器-客户端模型,不同于话题的发布者-订阅者模型。话题允许节点订阅数据流并获取持续更新,而服务只在客户端特别调用时才提供数据。二者更详细的对比请参考第5节

在这里插入图片描述

在这里插入图片描述

2 服务模型实现(C++)

实验目标:客户端提交请求给turtlesim功能包的/spawn服务,在界面上生成新的乌龟。

  • 服务器

    本实验中无需编程,为turtlesim::Spawn定义的/spwan服务

  • 客户端

    void OnResultCallBack(rclcpp::Client<turtlesim::srv::Spawn>::SharedFuture result) {auto response = result.get();RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Request service successfully! [turtle id: %s]", response->name.c_str());
    }void request() {auto spawn = std::make_shared<turtlesim::srv::Spawn::Request>();          spawn->name = "winter_turtle";spawn->x = 1.0;spawn->y = 1.0;spawn->theta = 1.57;while (!client_->wait_for_service(std::chrono::seconds(1))) {                                                   if (!rclcpp::ok()) {RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Interrupted while waiting for the service. Exiting.");return;}RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "service not available, waiting again...");}auto result = client_->async_send_request(spawn, std::bind(&ClientNode::OnResultCallBack, this, std::placeholders::_1));
    }
    

服务通信的效果如下所示:

在这里插入图片描述

3 服务模型实现(Python)

实验目标:客户端提交请求给turtlesim功能包的/spawn服务,在界面上生成新的乌龟。

  • 服务器

    本实验中无需编程,为turtlesim::Spawn定义的/spwan服务

  • 客户端

    class ClientNode(Node):def __init__(self, name):super().__init__(name)self.client = self.create_client(Spawn, '/spawn') while not self.client.wait_for_service(timeout_sec=1.0):self.get_logger().info('service not available, waiting again...') self.request = Spawn.Request()def sendRequest(self):self.request.name = "winter_turtle"self.request.x = 1.0self.request.y = 1.0self.request.theta = 1.57self.future = self.client.call_async(self.request)
    

服务通信的效果如下所示:

在这里插入图片描述

4 自定义服务

自定义服务的通用流程如下:

  • 功能包下新建srv文件夹,在其中添加自定义服务xxx.srv,注意请求和响应数据结构使用---分割
  • 功能包package.xml中添加编译依赖与执行依赖
    <buildtool_depend>rosidl_default_generators</buildtool_depend>
    <exec_depend>rosidl_default_runtime</exec_depend>
    <member_of_group>rosidl_interface_packages</member_of_group>
    
  • 功能包CMakeLists.txt中添加编译消息相关依赖
    find_package(rosidl_default_generators REQUIRED)
    rosidl_generate_interfaces(${PROJECT_NAME}"xxx.srv"DEPENDENCIES xxx_srvs
    )ament_export_dependencies(rosidl_default_runtime)
    
  • 编译自定义消息,在install/<pkg_name>/include中生成由xxx.srv编译的C++可识别的xxx.hpp头文件
  • 引入xxx.hpp即可调用自定义服务

下面给出一个实例

添加如下自定义服务实现一个加法服务,并按上面步骤配置依赖

# client
int32 a
int32 b
---
# server
int32 sum

定义一个服务器、一个客户端,限于篇幅只贴出部分代码,完整代码见文末。

  • 服务器
    class ServerNode : public rclcpp::Node
    {public:ServerNode() : Node("lab_srv_server_own") {server_ = create_service<own_srv_lab::srv::Add>("/add_service",std::bind(&ServerNode::OnAddSrvCallBack, this, std::placeholders::_1, std::placeholders::_2)); }private:rclcpp::Service<own_srv_lab::srv::Add>::SharedPtr server_;void OnAddSrvCallBack(const std::shared_ptr<own_srv_lab::srv::Add::Request> request, std::shared_ptr<own_srv_lab::srv::Add::Response> response) {response->sum = request->a + request->b;RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Incoming request\na: %d" " b: %d", request->a, request->b);RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "sending back response: [%d]", response->sum);}
    };
    
  • 客户端
    ClientNode() : Node("lab_srv_client_own") {client_ = create_client<own_srv_lab::srv::Add>("/add_service"); 
    }void request(int a, int b) {auto add_srv = std::make_shared<own_srv_lab::srv::Add::Request>();add_srv->a = a;          add_srv->b = b;while (!client_->wait_for_service(std::chrono::seconds(1))) {                                                   if (!rclcpp::ok()) {RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Interrupted while waiting for the service. Exiting.");return;}RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "service not available, waiting again...");}auto result = client_->async_send_request(add_srv, std::bind(&ClientNode::OnResultCallBack, this, std::placeholders::_1));
    }
    

服务通信效果如下所示:

在这里插入图片描述

5 话题、服务通信的异同

对比话题服务
通信模式发布-订阅请求-响应
同步性异步同步
缓冲区
实时性
节点关系多对多一对多(1个server对应一个服务)
通信格式.msg.srv
使用场景连续高频的数据传输,例如激光雷达、里程计传输数据偶尔调用的功能,例如图像识别

完整代码通过下方博主名片联系获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇
http://www.yayakq.cn/news/330141/

相关文章:

  • 外国网站上做Task免费制作网站服务器
  • 资源类网站怎么做的深圳十大广告公司
  • 网站广告设计怎么做商机加盟好项目
  • 网站建设实训报告心得如何使用模板做网站
  • 做音乐的网站网站建设工作领导小组
  • 企业网站模板演示上海最近新闻
  • 寻找大连网站建设北京网站建设公司哪个好
  • 云阳网站建设南京最新发布
  • 泰安做网站建设的公司哪家好wordpress 生成html
  • 网站的排名优化怎么做广东网站建设哪家专业
  • 中国制药网网站开发技术比较好的h5制作软件
  • 建设房地产公司网站的费用最有效的推广方式
  • 网站优化招聘化妆品网站 源码
  • 东昌府聊城网站优化公众号运营外包
  • 网站维护一般要几天二手房网站怎么做才能接到电话
  • 网站续费协议个人网站的制作教程
  • 如何在网站建设远程教育wordpress点击阅读全部
  • DW做网站的步骤我也要投放广告
  • 中山 网站建设一条龙全包wordpress postfix
  • 网站中文模板北京到安阳的火车票时刻表查询
  • 免备案做网站 可以盈利吗网站备案拍照背景图
  • 上海php网站开发装修招投标网站建设
  • 公司建设网站需要什么条件免费ppt模板下载在哪里下载
  • 哈尔滨口碑好的建站公司网站线上推广方案
  • 找工程去哪个网站微信公众号小程序搭建
  • 建设网站盈利2015郑州营销网站建设
  • 廊坊网站建设 elu桂林人论坛新鲜事爆料
  • 怎么在境外做网站网站 只做程序员
  • 网站制作费用网站改版 更换域名
  • 长沙网站seo诊断wordpress文章页修改