在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-clistener,会显示其平均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
提升确实很多。。。