如何自己制作免费网站,网站建设与管理用什么软件有哪些内容,diy图片制作,下载免费ppt模板目录 0 专栏介绍1 服务通信模型2 服务模型实现(C)3 服务模型实现(Python)4 自定义服务5 话题、服务通信的异同 0 专栏介绍
本专栏旨在通过对ROS2的系统学习#xff0c;掌握ROS2底层基本分布式原理#xff0c;并具有机器人建模和应用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::Clientturtlesim::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_sharedturtlesim::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_sec1.0):self.get_logger().info(service not available, waiting again...) self.request Spawn.Request()def sendRequest(self):self.request.name winter_turtleself.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_dependrosidl_default_generators/buildtool_depend
exec_dependrosidl_default_runtime/exec_depend
member_of_grouprosidl_interface_packages/member_of_group功能包CMakeLists.txt中添加编译消息相关依赖find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}xxx.srvDEPENDENCIES 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_serviceown_srv_lab::srv::Add(/add_service,std::bind(ServerNode::OnAddSrvCallBack, this, std::placeholders::_1, std::placeholders::_2)); }private:rclcpp::Serviceown_srv_lab::srv::Add::SharedPtr server_;void OnAddSrvCallBack(const std::shared_ptrown_srv_lab::srv::Add::Request request, std::shared_ptrown_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_clientown_srv_lab::srv::Add(/add_service);
}void request(int a, int b) {auto add_srv std::make_sharedown_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深度学习实战》《机器学习强基计划》《运动规划实战精讲》… 源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系