ROS2与Gazebo11入门教程-性能分析工具(Profiler)
说明:
- 介绍使用性能分析工具
介绍
Gazebo 11使用Ignition通用性能分析工具(Common Profiler)来检查和可视化不同线程、函数和方法的性能。
而Gazebo 9使用Ignition通用性能分析工具(Common’s profiler)的一个内部分支(fork)来检查和可视化性能。
如何为Gazebo运行和查看性能分析结果?
- 要使用该编译器,必须用CMake标志-DENABLE_PROFILER = 1从源代码编译Gazebo,例如:
cmake .. --cmake-args -DENABLE_PROFILER=1
- 例如,如果使用colcon来编译Gazebo,则命令为:
colcon build --cmake-args -DENABLE_PROFILER=1
- 在编译Gazebo后,就可以启动待进行性能分析的仿真世界,例如:
gazebo profiler.world
有一个方便的启动器脚本(Linux和macOS)用于启动Remotery。
在Gazebo 11中其命令为:
ign_remotery_vis
- 在Gazebo 9中其命令则为:
gz_remotery_vis
该脚本应该会在一个浏览器中打开性能分析工具的输出结果。
Gazebo服务器和客户端进程的性能分析数据会分别配置到不同的端口上,可以在页面顶部选择端口:
gzserver进程的数据会配置到端口1500
gzclient进程的数据会配置到端口1501
应该可以看到对应于不同线程的性能分析图,如以下线程:
gzserver
[Ode,Bullet,Symbody,Dart]Physics
SensorManager
下图显示了传感器管理器的时间线。本示例中有5种不同的传感器:gps,imu,磁力计(magnetometer),高度计(altimeter)和接触式传感器(contact)。从该图中可以看到传感器管理器循环的持续时间(50毫秒)以及更新所有传感器所需的时间(约0.177毫秒),其余时间该线程都会进入休眠状态。
从下图中可以看到每个传感器的更新时间,所有传感器都有两个子任务:生成数据和发布该数据(填充数据结构并对其进行发布)。
- 从下面的两个图中,可以看出OdePhysics和gzserver线程循环的演变过程。
如何将性能分析工具添加到Gazebo自定义插件?
使用Gazebo 11,可以将性能分析工具添加到Gazebo的任何插件。 而在Gazebo 9中这是不可能的。
如果要将性能分析工具添加到Gazebo自定义插件中,需要执行以下步骤:
把性能分析工具的头文件包含进来:
#include <ignition/common/Profiler.hh>
- 链接到该性能分析工具库:
target_link_libraries(<your plugin name>
...
${IGNITION-COMMON_LIBRARIES}
)
- 将该性能分析工具宏添加到更新方法或其他周期性方法中:
IGN_PROFILE("WindPlugin::OnUpdate");
IGN_PROFILE_BEGIN("Update");
...
IGN_PROFILE_END();
传感器类
- 继承自gazebo::sensors::Sensor的类在其UpdateImpl方法中已经有了该性能分析工具宏。会定期调用该方法,而且该方法负责生成数据并发布该数据。
插件
- 继承自gazebo::*Plugin的类可以使用gazebo::event::Events::ConnectWorldUpdateBegin连接到定期的仿真世界更新事件。例如,WindPlugin插件会为仿真的每次迭代调用WindPlugin::OnUpdate方法:
this->dataPtr->updateConnection = event::Events::ConnectWorldUpdateBegin(std::bind(&WindPlugin::OnUpdate, this));
- 该回调函数是放置上面的性能分析工具宏的好地方。
参考:
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号