protobuf 安装_Ubuntu18下ROS使用Protobuf 共享内存实现节点通信

  • Post author:
  • Post category:其他


最近在折腾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