ROS2 Galactic中无法通过启动文件调用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

