ROS导航实现之路径规划

导航实现之路径规划

  move_base 功能包提供了基于动作(action)的路径规划实现,move_base 可以根据给定的目标点,控制机器人底盘运动至目标位置,并且在运动过程中会连续反馈机器人自身的姿态与目标点的状态信息,move_base主要由全局路径规划与本地路径规划组成。

  move_base已经被集成到了navigation包,可以通过如下命令安装:

sudo apt install ros--navigation

(1)构建适用于机器人导航的代价地图

  由于导航过程中,障碍物信息是可变的,导航时机器人需要实时获取当前的障碍物信息,且机器人在靠近障碍物边缘时,可能会由于惯性、机器人体的不规则外形,在转弯等过程中发生碰撞,SLAM构建的静态地图在导航中是不可以直接使用的,需要构建实时获取数据和障碍物膨胀后的代价地图。

代价地图:

  • 全局代价地图(全局路径规划)

  • 本地代价地图(本地路径规划)

    (2)使用move_base功能包编写路径规划相关得launch文件

      复制调用模板,将功能包修改为自己功能包得名字

           

    (3)设置配置文件

      在功能包里新建文件夹命名为param,将上文中得launch文件里涉及的配置文件名新建到这个文件夹中

      粘贴标准例程中的代码,把各种坐标系名称和机器人几何参数修改到与自己的项目匹配。

    • costmap_common_params.yaml

        该文件是move_base 在全局路径规划与本地路径规划时调用的通用参数,包括:机器人的尺寸、距离障碍物的安全距离、传感器信息等。配置参考如下:

      #机器人几何参,如果机器人是圆形,设置 robot_radius,如果是其他形状设置 footprint
      robot_radius: 0.12 #圆形
      # footprint: [[-0.12, -0.12], [-0.12, 0.12], [0.12, 0.12], [0.12, -0.12]] #其他形状
      obstacle_range: 3.0 # 用于障碍物探测,比如: 值为 3.0,意味着检测到距离小于 3 米的障碍物时,就会引入代价地图
      raytrace_range: 3.5 # 用于清除障碍物,比如:值为 3.5,意味着清除代价地图中 3.5 米以外的障碍物
      #膨胀半径,扩展在碰撞区域以外的代价区域,使得机器人规划路径避开障碍物
      inflation_radius: 0.2
      #代价比例系数,越大则代价值越小
      cost_scaling_factor: 3.0
      #地图类型
      map_type: costmap
      #导航包所需要的传感器
      observation_sources: scan
      #对传感器的坐标系和数据进行配置。这个也会用于代价地图添加和清除障碍物。例如,你可以用激光雷达传感器用于在代价地图添加障碍物,再添加kinect用于导航和清除障碍物。
      scan: {sensor_frame: laser, data_type: LaserScan, topic: scan, marking: true, clearing: true}
      Copy
      
      • global_costmap_params.yaml

          该文件用于全局代价地图参数设置:

        global_costmap:
          global_frame: map #地图坐标系
          robot_base_frame: base_footprint #机器人坐标系
          # 以此实现坐标变换
          update_frequency: 1.0 #代价地图更新频率
          publish_frequency: 1.0 #代价地图的发布频率
          transform_tolerance: 0.5 #等待坐标变换发布信息的超时时间
          static_map: true # 是否使用一个地图或者地图服务器来初始化全局代价地图,如果不使用静态地图,这个参数为false.
        Copy
        
        • local_costmap_params.yaml

            该文件用于局部代价地图参数设置:

          local_costmap:
            global_frame: odom #里程计坐标系
            robot_base_frame: base_footprint #机器人坐标系
            update_frequency: 10.0 #代价地图更新频率
            publish_frequency: 10.0 #代价地图的发布频率
            transform_tolerance: 0.5 #等待坐标变换发布信息的超时时间
            static_map: false  #不需要静态地图,可以提升导航效果
            rolling_window: true #是否使用动态窗口,默认为false,在静态的全局地图中,地图不会变化
            width: 3 # 局部地图宽度 单位是 m
            height: 3 # 局部地图高度 单位是 m
            resolution: 0.05 # 局部地图分辨率 单位是 m,一般与静态地图分辨率保持一致
          Copy
          
          • base_local_planner_params

              基本的局部规划器参数配置,这个配置文件设定了机器人的最大和最小速度限制值,也设定了加速度的阈值。

            TrajectoryPlannerROS:
            # Robot Configuration Parameters
              max_vel_x: 0.5 # X 方向最大速度
              min_vel_x: 0.1 # X 方向最小速速
              max_vel_theta:  1.0 # 
              min_vel_theta: -1.0
              min_in_place_vel_theta: 1.0
              acc_lim_x: 1.0 # X 加速限制
              acc_lim_y: 0.0 # Y 加速限制
              acc_lim_theta: 0.6 # 角速度加速限制
            # Goal Tolerance Parameters,目标公差
              xy_goal_tolerance: 0.10
              yaw_goal_tolerance: 0.05
            # Differential-drive robot configuration
            # 是否是全向移动机器人
              holonomic_robot: false
            # Forward Simulation Parameters,前进模拟参数
              sim_time: 0.8
              vx_samples: 18
              vtheta_samples: 20
              sim_granularity: 0.05
            

            (4)新建launch文件,将需要的map_server服务、amcl服务、rviz启动集成

                      

            (5)启动gazebo仿真环境,运行集成后的launch文件,即可实现导航

            (6)测试,可以看到gazebo和rviz都启动了,添加rviz组件:RobotModel、Map、Posearray、odometry

              通过菜单栏上方的2D Nav Goal设置目标点,会发现小车会自行朝目标点运动

              此外,我们还可以通过继续选择map的不同话题,得到全局和局部的代价地图(如下图所示),也可以选择添加Path,看到全局路径规划和局部路径规划的可视化结果

            路径规划