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

如何在ROS中通过C++(.cpp)文件运行launch文件

在C++中根据条件判断运行不同ROS Launch文件

你可以通过两种常用方式实现根据条件运行不同Launch文件:

方法一:使用系统调用system()函数

通过调用系统命令roslaunch启动指定的Launch文件,这是最直接的实现方式:

#include <cstdlib>
#include <iostream>

int main() {
    bool case1 = true;  // 根据实际业务逻辑设置条件
    bool case2 = false;

    if (case1) {
        // 替换package_name为你的ROS包名,确保路径正确
        int launch_result = system("roslaunch package_name launch_file_1.launch");
        if (launch_result != 0) {
            std::cerr << "启动launch_file_1.launch失败" << std::endl;
        }
    }
    else if (case2) {
        int launch_result = system("roslaunch package_name launch_file_2.launch");
        if (launch_result != 0) {
            std::cerr << "启动launch_file_2.launch失败" << std::endl;
        }
    }

    return 0;
}

注意事项:

  • 如果需要后台运行Launch文件(不阻塞当前C++进程),可以在命令末尾添加&,例如:system("roslaunch package_name launch_file_1.launch &");
  • 确保roslaunch命令在系统环境变量中,或者使用完整路径调用
  • 替换代码中的package_name为你的ROS包实际名称

方法二:使用ROS官方roslaunch C++ API

这种方式更适合ROS项目的集成开发,无需依赖系统命令调用:

第一步:配置CMakeLists.txt

需要链接roslaunch库,在CMakeLists.txt中添加以下内容:

find_package(catkin REQUIRED COMPONENTS
    roscpp
    roslaunch
)

include_directories(${catkin_INCLUDE_DIRS})
target_link_libraries(your_node_executable_name ${catkin_LIBRARIES})

第二步:编写C++代码

#include <ros/ros.h>
#include <roslaunch/launch.h>
#include <roslaunch/config.h>
#include <ros/package.h>

int main(int argc, char** argv) {
    ros::init(argc, argv, "launch_controller");
    ros::NodeHandle nh;

    bool case1 = true;
    bool case2 = false;

    if (case1) {
        // 拼接Launch文件的完整路径
        std::string launch_path = ros::package::getPath("package_name") + "/launch/launch_file_1.launch";
        roslaunch::LaunchManager launch_manager;
        roslaunch::Config launch_config;

        // 加载Launch文件
        if (!roslaunch::load_config_file(launch_path, launch_config, false)) {
            ROS_ERROR("加载launch_file_1.launch失败");
            return 1;
        }

        // 启动Launch文件
        launch_manager.start();
        launch_manager.launchConfig(launch_config);

        // 保持进程运行,直到Launch中的节点退出
        ros::spin();
    }
    else if (case2) {
        std::string launch_path = ros::package::getPath("package_name") + "/launch/launch_file_2.launch";
        roslaunch::LaunchManager launch_manager;
        roslaunch::Config launch_config;

        if (!roslaunch::load_config_file(launch_path, launch_config, false)) {
            ROS_ERROR("加载launch_file_2.launch失败");
            return 1;
        }

        launch_manager.start();
        launch_manager.launchConfig(launch_config);
        ros::spin();
    }

    return 0;
}

方法优势:

  • 直接通过ROS API操作,无需依赖系统命令
  • 可以更精准地处理Launch文件加载失败的情况
  • 与ROS节点深度集成,便于和其他ROS组件交互

内容的提问来源于stack exchange,提问作者Ankit Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:07:31