如何在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
相关产品推荐
相关产品推荐

