ROS通信解析

了解ROS的几种通信方式以后,对于ROS通信延迟有一些困惑,更多的是想追究背后原理,这篇博客《ROS之topic和service通信比较》起到了抛砖引玉的作用。

更多可以参考2013年的这一篇论文《A lightweight Opensource communication framework for native integration of resource constrained robotics devices with ROS》,目前网上关于ROS通信模型的中文资料大部分都是对这篇文章的翻译。

先上结论

Topic(异步)

topic基于ros tcp/udp,pub/sub通信延迟大约0.7ms,但是ros::spin()是忙等待,对于异步架构,回调函数的执行频率设计对系统整体性能影响很大,node不宜过多。

Service(同步)

server基于RPC,它在接收到调用请求前都处于休眠状态;将休眠状态的server唤醒,所需要的时间大约是2.7ms,约占总通信延迟的82%,实际传输延迟大于0.3ms,只有topic的一半。server唤醒耗时太大,不建议用于通讯频率高的情况。

Client维护着一个与server的持久连接(persistent connection),在单纯的数据传输上可以做到更快,尤其是在分布式作业。

阻塞非阻塞与同步异步

怎样理解阻塞非阻塞与同步异步的区别? - 严肃的回答 - 知乎

  • 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication).
  • 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

在处理 IO 的时候,阻塞和非阻塞都是同步 IO。只有使用了特殊的 API 才是异步 IO。

异步消息的传递-回调机制

目前的粗浅理解,异步通信总会带点儿callback。