在ROS中,不能直接使用 roslaunch *.launch
这种指令运行 .launch
文件,因为 roslaunch
的设计机制要求显式指定 包名(package name) 和 launch 文件名。以下是详细解释:
1. roslaunch
的正确使用方式
(1)标准格式
bash
roslaunch <package_name> <launch_file_name>.launch
-
必须指定包名:ROS 通过
ROS_PACKAGE_PATH
查找包路径,再在包的launch/
目录下搜索对应的.launch
文件。 -
示例:
bash
-
roslaunch turtlebot3_gazebo turtlebot3_world.launch
(2)为什么不能直接 roslaunch *.launch
?
-
ROS 包隔离性:不同包可能包含同名
.launch
文件(如demo.launch
),直接指定文件名会导致歧义。 -
路径解析依赖:
roslaunch
需要先通过包名定位到包的根目录,再在launch/
子目录中查找文件。
2. 特殊情况下的变通方法
(1)直接运行绝对路径(不推荐)
如果知道 .launch
文件的完整路径,可通过 roslaunch
直接运行:
bash
roslaunch /path/to/package/launch/file.launch
但这种方式:
-
破坏了 ROS 的包管理规范。
-
可能导致依赖问题(如相对路径的资源加载失败)。
(2)使用 roscd
进入包目录后运行
bash
roscd <package_name>/launch # 切换到包的launch目录 roslaunch file.launch # 直接运行(需在launch目录下)
此时 roslaunch
能自动推断包名,但仍需确保环境变量已正确配置。
3. 关键概念澄清
(1)工作空间与环境变量
-
source devel/setup.bash
将工作空间的包路径注入ROS_PACKAGE_PATH
,使roslaunch
能找到包。 -
未 source 的后果
roslaunch
会报RLException
,提示包或 launch 文件不存在。
(2)ROS 文件系统层级
catkin_ws/ └─ devel/ # 编译生成的文件 └─ src/ └─ <package_name>/ ├─ CMakeLists.txt # 包定义文件 ├─ launch/ # launch文件目录 └─ ... # 其他资源
roslaunch
依赖此结构定位文件。
4. 错误排查步骤
若遇到 RLException
,按顺序检查:
-
包是否存在
bash
-
rospack find <package_name>
-
launch 文件是否存在
bash
-
ls $(rospack find <package_name>)/launch
-
环境变量是否加载
bash
-
echo $ROS_PACKAGE_PATH | grep <package_name>
总结
-
必须通过
roslaunch <package> <file>.launch
运行,ROS 不支持直接*.launch
模糊匹配。 -
所有操作需在 source 过 ROS 和工作空间环境 的终端中进行。
-
理解 ROS 包管理机制(
ROS_PACKAGE_PATH
)是解决问题的关键。