【ROS2机器人入门到实战】编写 Launch 并启动导航
  G1BiWlBPlCaW 2023年11月02日 47 0


3. 编写 Launch 并启动导航

写在前面

  1. 当前平台文章汇总地址:ROS2机器人从入门到实战
  2. 获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取
  3. 教程配套机器人开发平台:两驱版| 四驱版
  4. 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn

有了参数,接着我们来编写一个 Launch 文件来传递参数并启动导航。

在编写 launch 前,需要将slam部分建立好的地图保存拷贝一份到 src/fishbot_navigation2/maps 文件夹下。

一、编写Launch

在 fishbot_navigation2 功能包下新建 launch 目录,然后再目录下新建 navigation2.launch.py,输入如下代码:

import os
import launch
import launch_ros
from ament_index_python.packages import get_package_share_directory
from launch.launch_description_sources import PythonLaunchDescriptionSource


def generate_launch_description():
    # 获取与拼接默认路径
    fishbot_navigation2_dir = get_package_share_directory(
        'fishbot_navigation2')
    nav2_bringup_dir = get_package_share_directory('nav2_bringup')
    rviz_config_dir = os.path.join(
        nav2_bringup_dir, 'rviz', 'nav2_default_view.rviz')
    
    # 创建 Launch 配置
    use_sim_time = launch.substitutions.LaunchConfiguration(
        'use_sim_time', default='false')
    map_yaml_path = launch.substitutions.LaunchConfiguration(
        'map', default=os.path.join(fishbot_navigation2_dir, 'maps', 'fishbot_map.yaml'))
    nav2_param_path = launch.substitutions.LaunchConfiguration(
        'params_file', default=os.path.join(fishbot_navigation2_dir, 'config', 'nav2_params.yaml'))

    return launch.LaunchDescription([
        # 声明新的 Launch 参数
        launch.actions.DeclareLaunchArgument('use_sim_time', default_value=use_sim_time,
                                             description='Use simulation (Gazebo) clock if true'),
        launch.actions.DeclareLaunchArgument('map', default_value=map_yaml_path,
                                             description='Full path to map file to load'),
        launch.actions.DeclareLaunchArgument('params_file', default_value=nav2_param_path,
                                             description='Full path to param file to load'),

        launch.actions.IncludeLaunchDescription(
            PythonLaunchDescriptionSource(
                [nav2_bringup_dir, '/launch', '/bringup_launch.py']),
            # 使用 Launch 参数替换原有参数
            launch_arguments={
                'map': map_yaml_path,
                'use_sim_time': use_sim_time,
                'params_file': nav2_param_path}.items(),
        ),
        launch_ros.actions.Node(
            package='rviz2',
            executable='rviz2',
            name='rviz2',
            arguments=['-d', rviz_config_dir],
            parameters=[{'use_sim_time': use_sim_time}],
            output='screen'),
    ])

我们让这个 Launch 对外提供三个可配置的参数,是否使用仿真时间 use_sim_time,地图文件路径 map_yaml_path 和导航参数路径 nav2_param_path,默认值都已经设好了。

接着修改 CMakeLists.txt,添加 launch、config 和 maps 三个目安装到 install 目录下的指令,然后重新构建功能包完成文件拷贝。

二、启动底盘和雷达

必要步骤,不再赘述

三、启动导航

colcon build
source install/setup.bash
ros2 launch fishbot_navigation2 navigation2.launch.py

启动后可以看到 RViz 已经正确加载出我们建的地图了,但是此时启动终端中会报 TF 相关的错误,这是因为我们还没有设定机器人初始位置。在 RViz 的工具栏可以看到如下图所示的几个操作按钮。

【ROS2机器人入门到实战】编写 Launch 并启动导航_Launch

2D Pose Estimate 就是用于初始化位置的工具,而 Nav2 Goal 则是设置导航目标点的工具。选中 2D Pose Estimate,然后使用鼠标左键点击地图中机器人目前所在的大概位置,不要松开左键,拖动鼠标调整机器人朝向,如果觉得设置的不够准确,可以多次设置。

设置完成后,此时终端就不再报错了,初始化位置后的地图发生了些变化,初始化完成位置之后的地图如下图所示。

【ROS2机器人入门到实战】编写 Launch 并启动导航_机器人_02

可以看到,原有的障碍物边界好像变都变大了,这个其实就是代价地图的膨胀图层,膨胀图层是 Navigation 2 为了防止机器人和障碍物发生碰撞,在原有的地图基础上,将图中障碍物的周围按照一定的半径进行膨胀形成的。

因为全局路径规划和局部路径规划使用的地图并不同,所以在机器人周围障碍物在会在局部代价地图上进行膨胀。在 RViz 左侧显示部分,修改 Global Planner 配置,取消全局代价地图 Global Costmap 的显示,配置如下左图所示,接着就可以看到如下右图所示的局部代价地图及其膨胀层了。

【ROS2机器人入门到实战】编写 Launch 并启动导航_Launch_03


【ROS2机器人入门到实战】编写 Launch 并启动导航_ROS2_04


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  xaeiTka4h8LY   2024年05月17日   42   0   0 数据库JavaSQL
  xaeiTka4h8LY   2024年05月17日   40   0   0 数据库SQL
  xaeiTka4h8LY   2024年05月17日   33   0   0 MySQL数据库
G1BiWlBPlCaW