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

ROS2 Galactic中无法通过启动文件调用online_sync_launch.py的问题求助

问题:ROS2 Galactic中启动文件无法自动加载slam_toolbox的online_sync_launch.py

我有一个差分驱动机器人项目,可在Gazebo仿真中通过teleop控制移动,支持激光雷达扫描建图。在ROS2 Foxy版本下,执行命令ros2 launch navigation_bot_05 main_simulation_launch.py world:=src/worlds/maze.sdf slam:=True即可正常启动SLAM流程,打开RViz添加Map话题就能看到生成的地图。

但切换到ROS2 Galactic版本后,必须单独开启终端执行ros2 launch slam_toolbox online_sync_launch.py才能正常建图——尽管我已在启动文件中添加了调用该launch文件的代码:

slam_launch_file = os.path.join(slam_toolbox_dir, 'launch', 'online_sync_launch.py')
start_slam_toolbox_cmd = IncludeLaunchDescription(
        PythonLaunchDescriptionSource(slam_launch_file),
        launch_arguments={'use_sim_time': use_sim_time}.items())
ld.add_action(start_slam_toolbox_cmd)

这段代码没有任何效果,求解决方法以避免每次手动开启终端的麻烦。


可能的解决方案

1. 验证slam_toolbox_dir路径正确性

Galactic中slam_toolbox的安装路径可能与Foxy不同,或路径变量未正确获取。在启动文件中添加打印语句确认路径:

print(f"slam_toolbox_dir: {slam_toolbox_dir}")
print(f"slam_launch_file path: {slam_launch_file}")

启动时查看终端输出的路径是否存在对应的launch文件。若路径错误,改用get_package_share_directory获取标准路径:

from launch_ros.substitutions import FindPackageShare

slam_toolbox_dir = FindPackageShare(package='slam_toolbox').find('slam_toolbox')

2. 确认use_sim_time参数传递有效性

Galactic版本的slam_toolbox对use_sim_time参数的处理逻辑可能有变化,确保该参数被正确设置为True(仿真环境必需)。可以显式指定参数值,或检查变量定义:

use_sim_time = LaunchConfiguration('use_sim_time', default='True')

同时,尝试调整参数传递的写法,避免潜在的类型问题:

start_slam_toolbox_cmd = IncludeLaunchDescription(
    PythonLaunchDescriptionSource(slam_launch_file),
    launch_arguments={'use_sim_time': 'True'}.items()
)

3. 检查slam参数的分支执行逻辑

启动命令中带了slam:=True,需确保启动文件中仅当该参数为True时才执行SLAM启动代码。检查是否存在正确的条件判断:

slam = LaunchConfiguration('slam')
if slam == 'True':
    # 此处添加SLAM启动代码

若缺少判断或逻辑错误,会导致SLAM代码不执行。

4. 适配Galactic版本slam_toolbox的launch文件差异

Galactic的slam_toolbox可能修改了online_sync_launch.py的参数要求,比如新增了必填的slam_params_file参数。可以查看该launch文件的内容对比差异:

ros2 pkg prefix slam_toolbox
# 进入输出路径后查看launch/online_sync_launch.py

若确实需要该参数,在启动代码中补充传递:

from ament_index_python.packages import get_package_share_directory

slam_params_file = os.path.join(get_package_share_directory('your_package_name'), 'config', 'mapper_params_online_sync.yaml')
start_slam_toolbox_cmd = IncludeLaunchDescription(
    PythonLaunchDescriptionSource(slam_launch_file),
    launch_arguments={
        'use_sim_time': use_sim_time,
        'slam_params_file': slam_params_file
    }.items()
)

注意替换your_package_name为你的项目包名,确保配置文件存在且参数正确。

5. 通过日志定位启动失败原因

启动时开启debug级日志,查看是否有slam_toolbox相关的错误或警告:

ros2 launch navigation_bot_05 main_simulation_launch.py world:=src/worlds/maze.sdf  slam:=True --log-level debug

日志中通常会提示路径错误、参数缺失或其他启动失败的具体原因,根据提示针对性修复。


内容的提问来源于stack exchange,提问作者Steve Brown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:00:16