You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:06:03