树莓派5上mavros2原先占用20%单核,改后只占5%
cpu高来源两个方面:DDS对于单个节点资源消耗高,mavros2的plugins每个都是一个node;同时ros2的multi threaded executor线程多时占用cpu也高。
三招:
-
设置plugin_allowlist为只允许必要的,因为mavros2里每个node都是一个节点占用DDS资源较多:
[
"sys_status",
"command",
"imu",
"local_position",
"setpoint_raw",
"sys_time",
"vision_pose",
"global_position",
"gps_status"
]
改善明显
-
设置MAVROS_UAS_EXECUTOR_THREADS环境变量为2。mavros2默认用的multi thread executor是用的全部核心,没必要,最低设置为2保证并发。改善会有一些,较为明显。该参数只适用于Jazzy 及更高版本 CPU usage 4x higher in ROS 2 than ROS 1 · Issue #2031 · mavlink/mavros · GitHub
-
改rmw的dds从fastdds改到cyclonedds,因为dds开销层面cyclonedds小一点,对所有节点都适用,尤其对mavros这种多plugin多node的架构有效。实测能从50%降低到40%,有一定效果。
bash
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
未来可能可行: ubuntu26 ros2 lyrical版本及以上(最近jazzy版本也支持了),执行器multi threaded executor可以改为事件驱动的CBGEventsExecutor,改善会有一些,但是cm executor是实验性功能,对service等的支持还不完善:Lyrical: try new executor by vooon · Pull Request #2249 · mavlink/mavros · GitHub