在Apollo 3.5中,百度自研了运行时计算框架Cyber RT
来代替ROS
,官方FAQ中提到其性能、延迟以及吞吐量都要优于ROS
。这篇博客记录了我依据Issue #7220来验证性能是否提高的过程。
我们测试的是发送和接收消息的延时。在Cyber RT
和ROS
中分别有自带的demo来完成这一功能,我们只需将这两个demo中发送的数据统一一下,并在接受时输出latency即可。
测试Cyber RT
Clone apollo最新代码
1 | git clone https://github.com/ApolloAuto/apollo.git -b master |
运行docker环境
1 | ./docker/scripts/dev_start.sh |
apollo提供了docker环境,已经预装了各种依赖的环境,官方也建议在docker中运行。
build项目
1 | bash apollo.sh build |
build后的可执行文件在bazel_bin/
目录下。
我们要测试的两个可执行文件即为talker
和listener
,它们在bazel_bin/cyber/examples/
目录下,此时可以运行这两个文件测试功能是否正常。
修改talker和listener 的源代码
1 | /* cyber/examples/talker.cpp */ |
1 | /* cyber/examples/listener.cpp */ |
修改conf文件
为了减少线程数,Cyber RT
更改了共享内存的可读通知机制,现在默认使用UDP,但是由此导致的系统调用(sendto
)会导致一些延迟,因此需要修改cyber/conf/cyber.pb.conf
来更改这个机制来达到最低的延迟。
1 | # cyber/conf/cyber.pb.conf |
使用opt
选项编译
1 | bazel build -c opt --copt=-fpic //cyber/examples/talker |
测试latency
在两个终端分别运行talker
和listener
,talker
会在发送1000条消息后退出,之后Ctrl-c
listener,会显示其平均latency
测试ROS
准备源代码 repo
将解压后的ros
文件夹放在apollo/third_party
中(上面clone的apollo项目中的)。
build项目
build同样要在之前的docker容器中进行。
1 | cd /apollo/third_party/ros |
不出意外的话,这里不会成功。。。
我遇到了以下几个错误:
缺少某些python包
报错中提示(*** not found. try to install ***
),按照提示装就好了
找不到gtest
此时运行:
1 | sudo apt install libgtest-dev |
你可能会发现提示gtest
已经安装了,且是最新版。
解决方案是先卸载gtest
,再重新安装(此处参考gist):
1 | sudo apt-get remove libgtest-dev |
找不到ogg
, vorbis
, theora
等
这是在build最后一个包的时候遇到的问题,stack overflow中说这可能是CMake
的bug,将其回滚到3.2.3-r1
版本即可,问题链接。我尝试后发现该问题并没有被解决。但是奇怪的是更改CMake
版本后,vorbis
和theora
都能找到了,而ogg
仍找不到。
解决方案是从source开始重装这几个包(参考文章):
1 | cd ~ |
其他
build共有113项,我们要测试的talker
和listener
大概是70项就完成了,但是如果没有完全build成功,生成的talker和listener运行也会出错(提示是无法找到动态链接库***.so)(WHY?)
运行talker和listener
生成的可执行文件talker
和listener
在/apollo/third_party/ros/devel_isolated/roscpp_tutorials/lib/roscpp_tutorials/
文件夹下。直接运行会报错:
1 | [FATAL] [1392021564.231775029]: ROS_MASTER_URI is not defined in the |
解决方案是先运行setup.sh
来配置环境:
1 | source /apollo/third_party/ros/install/ros_x86_64/setup.sh |
我执行这一步就没问题了,如果遇到其他错误可以参考这里。
修改talker和listener的源代码
1 | /* ros/ros_tutorials/roscpp_tutorials/talker/talker.cpp */ |
1 | /* ros/ros_tutorials/roscpp_tutorials/listener/listener.cpp */ |
重新编译tutorial并测试
1 | cd /apollo/third_party/ros/build_isolated/roscpp_tutorials && /apollo/third_party/ros/install/ros_x86_64/env.sh make -j8 -l8 |
测试方法同上
测试结果
平均latency:
Cyber RT
: 687us
ROS
: 1040us
提升确实很多。。。