最近在折腾ROS两个节点之间的通信实现,每个的功能都很简单,需要解决的地方在于两个之间的通信量很大,延迟要很低才行。确定使用protobuf共享内存后,网上查阅了好多资料才最终实现。在这实现一个最小的demo作为记录,希望能对后来者有帮助! github链接
1. protobuf与共享内存
关于二者的概念,网上资料很多,在这最基本的说明下。ROS中传统的通信方式是socket实现,通过订阅和发布信息实现通信,另外服务和参数服务器因为暂未涉及在这不进行比较。这种方式虽然延时也很低但当数据量比较大,对传输稳定性要求高或者更高传输速率时,便显得不那么合适了。
共享内存指的是通过对一块固定内存进行映射,使得不同程序或线程可以异步访问。通过这种数据拷贝的方式实现通信,速率和稳定性上有极大的提升。另外介绍下protobuf,可以简单理解为一种数据封装通信协议,可以实现不同语言之间的数据通信,而且可以离线更改和扩展,具体请查阅资料。
- protohuf安装
- proto文件编写
关于安装的具体步骤以及具体语法在这不一一细谈了,可以查看参考链接自行安装。在过程中,个人感觉有几点需要注意的在这说明下: 1. Ubuntu自身带有protobuf,最好提前卸载,替换成官方最新的,网上有资料自行查阅 2. 关于protobuf的安装路径说法不一,个人倾向于默认安装也就是官方安装,如自己指定安装目录后面程序运行还需要自己配置环境变量,有点麻烦
2. 实现细节
下面通过client和server两个节点之间最简单通信,来比较详细的说明protobuf与共享内存结合实现通信的过程。
2.1 创建工程
创建ros工作空间,并创建server和client两个节点
mkdir work_ws
cd work_ws & mkdir src
catkin_init_workspace
cd ..
catkin_make
cd src
catkin_create_pkg server roscpp
catkin create_pkg client roscpp
下面分别在两个节点下创建文件,最后创建完结构如下:
src
├── client
│ ├── CMakeLists.txt
│ ├── include
│ │ └── client
│ │ ├── client.cc
│ │ └── client.h
│ ├── package.xml
│ ├── proto
│ │ └── agreement.proto
│ └── src
│ └── client_node.cc
├── CMakeLists.txt
└── server
├── CMakeLists.txt
├── include
│ └── server
│ ├── server.cc
│ └── server.h
├── package.xml