如何通过C++代码获取ROS_DISTRO值,实现不同ROS发行版分支逻辑
解决方案
完全可以通过C++实现ROS发行版判断,以下是两种常用的稳定实现方案:
方案1:编译期预处理判断(推荐,性能最优)
ROS官方头文件已经预定义了版本相关的全局宏,编译时就可以完成分支选择,运行时无额外开销:
#include <ros/ros.h> int main(int argc, char** argv) { ros::init(argc, argv, "distro_demo_node"); ros::NodeHandle nh; // Melodic对应ROS1版本号为1.14.x #if ROS_VERSION_MAJOR == 1 && ROS_VERSION_MINOR == 14 ROS_INFO("匹配到ROS Melodic,执行对应逻辑"); // 此处放置Melodic专属代码 // Noetic对应ROS1版本号为1.15.x/1.16.x #elif ROS_VERSION_MAJOR == 1 && (ROS_VERSION_MINOR == 15 || ROS_VERSION_MINOR == 16) ROS_INFO("匹配到ROS Noetic,执行对应逻辑"); // 此处放置Noetic专属代码 #else ROS_WARN("未匹配到支持的ROS发行版"); #endif ros::spin(); return 0; }
方案2:运行期读取环境变量判断
如果需要运行时动态适配不同ROS环境,可以直接读取系统的ROS_DISTRO环境变量:
#include <ros/ros.h> #include <cstdlib> #include <string> int main(int argc, char** argv) { ros::init(argc, argv, "distro_demo_node"); ros::NodeHandle nh; const char* distro_ptr = std::getenv("ROS_DISTRO"); if (distro_ptr == nullptr) { ROS_ERROR("未检测到ROS环境,请确认已source对应版本的setup.bash"); return 1; } std::string ros_distro = distro_ptr; if (ros_distro == "melodic") { ROS_INFO("匹配到ROS Melodic,执行对应逻辑"); // 此处放置Melodic专属代码 } else if (ros_distro == "noetic") { ROS_INFO("匹配到ROS Noetic,执行对应逻辑"); // 此处放置Noetic专属代码 } else { ROS_WARN("不支持的ROS发行版:%s", ros_distro.c_str()); } ros::spin(); return 0; }
补充说明
- Ubuntu 20.04官方默认只支持ROS1 Noetic版本,Melodic官方适配的最高系统版本为Ubuntu 18.04,如果你是在20.04上源码编译安装的Melodic,以上两种方案都可以正常识别。
- 无特殊需求优先使用编译期判断方案,可避免运行时环境配置错误导致的逻辑异常。
内容的提问来源于stack exchange,提问作者Ab Danyia
相关产品推荐
相关产品推荐

