ROS通信机制比较

三种通信机制中,参数服务器是一种数据共享机制,可以在不同的节点之间共享数据,话题通信与服务通信是在不同的节点之间传递数据的,三者是ROS中最基础也是应用最为广泛的通信机制。

这其中,话题通信和服务通信有一定的相似性也有本质上的差异,在此将二者做一下简单比较:

二者的实现流程是比较相似的,都是涉及到四个要素:

  • 要素1: 消息的发布方/客户端(Publisher/Client)
  • 要素2: 消息的订阅方/服务端(Subscriber/Server)
  • 要素3: 话题名称(Topic/Service)
  • 要素4: 数据载体(msg/srv)

可以概括为: 两个节点通过话题关联到一起,并使用某种类型的数据载体实现数据传输。

二者的实现也是有本质差异的,具体比较如下:

Topic(话题)Service(服务)
通信模式发布/订阅请求/响应
同步性异步同步
底层协议ROSTCP/ROSUDPROSTCP/ROSUDP
缓冲区
时时性
节点关系多对多一对多(一个 Server)
通信数据msgsrv
使用场景连续高频的数据发布与接收:雷达、里程计偶尔调用或执行某一项特定功能:拍照、语音识别

不同通信机制有一定的互补性,都有各自适应的应用场景。尤其是话题与服务通信,需要结合具体的应用场景与二者的差异,选择合适的通信机制。

侵删

### ROS通信机制原理与实现 ROS(Robot Operating System)提供了多种通信机制,用于在节点之间传递数据。这些通信机制包括Topic、Service、Action以及Parameter Server等[^1]。以下是每种通信机制的详细原理与实现方式: #### 1. Topic通信机制 Topic是一种异步的发布-订阅消息传递模式。一个节点可以发布消息到某个Topic,而其他节点可以订阅该Topic以接收消息。这种机制适合于需要频繁更新和广播的数据流。 - **理论模型**:Topic通信基于发布者-订阅者模式,发布者将消息发送到特定的Topic,订阅者从该Topic接收消息。每个Topic都有一个唯一的名字,并且消息类型必须匹配。 - **代码实现**: ```cpp // C++实现发布者 #include "ros/ros.h" #include "std_msgs/String.h" int main(int argc, char **argv) { ros::init(argc, argv, "talker"); ros::NodeHandle nh; ros::Publisher chatter_pub = nh.advertise<std_msgs::String>("chatter", 1000); ros::Rate loop_rate(10); int count = 0; while (ros::ok()) { std_msgs::String msg; std::stringstream ss; ss << "hello world " << count++; msg.data = ss.str(); chatter_pub.publish(msg); ros::spinOnce(); loop_rate.sleep(); } return 0; } ``` ```python # Python实现订阅者 import rospy from std_msgs.msg import String def callback(data): rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data) def listener(): rospy.init_node('listener', anonymous=True) rospy.Subscriber("chatter", String, callback) rospy.spin() if __name__ == '__main__': listener() ``` #### 2. Service通信机制 Service是一种同步的请求-响应通信模式。客户端向服务端发送请求,服务端处理请求并返回结果。 - **理论模型**:Service通信基于请求-响应模式,客户端发送请求,服务端处理请求并返回结果。Service通信通常用于需要立即响应的操作。 - **代码实现**: ```cpp // C++实现服务端 #include "ros/ros.h" #include "example_service/AddTwoInts.h" bool add(example_service::AddTwoInts::Request &req, example_service::AddTwoInts::Response &res) { res.sum = req.a + req.b; ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b); ROS_INFO("sending back response: [%ld]", (long int)res.sum); return true; } int main(int argc, char **argv) { ros::init(argc, argv, "add_two_ints_server"); ros::NodeHandle n; ros::ServiceServer service = n.advertiseService("add_two_ints", add); ROS_INFO("Ready to add two ints."); ros::spin(); return 0; } ``` #### 3. Action通信机制 Action是一种异步的请求-响应通信模式,支持长时间运行的任务,并允许客户端获取任务的状态和反馈。 - **理论模型**:Action通信结合了Topic和Service的特点,适用于需要长时间执行的任务。它提供目标、结果和反馈三种消息类型。 - **代码实现**:Action的实现较为复杂,涉及目标的发送、状态的监控以及结果的接收,具体实现可参考官方文档或示例代码。 #### 4. Parameter Server通信机制 Parameter Server是一个全局的键值存储系统,用于在节点之间共享配置参数。 - **理论模型**:Parameter Server使用键值对的形式存储参数,支持获取、设置、删除等操作。 - **代码实现**: ```python # Python实现参数操作 import rospy rospy.set_param('/turtlesim_background_r', 255) rospy.set_param('/turtlesim_background_g', 255) rospy.set_param('/turtlesim_background_b', 0) r = rospy.get_param('/turtlesim_background_r') g = rospy.get_param('/turtlesim_background_g') b = rospy.get_param('/turtlesim_background_b') print(f"Background color set to RGB({r}, {g}, {b})") ``` #### 5. TCPROS与UDPROS传输协议 ROS中的通信机制底层依赖TCPROS和UDPROS两种传输协议。TCPROS适用于可靠性和稳定性要求较高的场景,而UDPROS则适用于低延迟和高效率的场景[^4]。 ```cpp // 示例:TCPROS通常用于Topic和服务通信 #include "ros/ros.h" #include "geometry_msgs/Twist.h" int main(int argc, char **argv) { ros::init(argc, argv, "tcp_example"); ros::NodeHandle nh; ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("/cmd_vel", 10); ros::Rate loop_rate(10); geometry_msgs::Twist msg; while (ros::ok()) { pub.publish(msg); ros::spinOnce(); loop_rate.sleep(); } return 0; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值