机器人自主导航

一、导航框架

1.1 思路

首先是确定导航目标(Goal)和自身定位(amcl),然后根据静态图进行全局的路径规划。在实际运行中,我们还要考虑实时本地优化,通过本地优化器实现一些突发情况的处理,比如当前速度值(cmd_vel),再将这些实时的信息再通过控制器(Base Controller),输出电压或电流等信号给电机,让电机做出想应的动作(Motor Speeds)。

图1 导航思路

1.2 机器人设置

机器人以图2的方式将不同模块组合用以导航。图中的白色组件(move_base)是ROS本身已经实现的功能算法,灰色组件是可选择添加的,蓝色组件是必须由人为自定义提供的。

图2 基于move_base的导航框架

1.3 硬件约束

  • 差分轮式机器人,可使用Twist速度指令控制。
    • linear:XYZ方向上的线速度,单位是m/s;
    • angular: XYZ方向上的角速度,单位是rad/s。
  • 机器人必须安装激光雷达等测距设备,可以获取环境深度信息。
  • 最好使用圆形和正方形的机器人,其他外形的机器人虽然可以正常使用,但是效果不佳。

二、关键功能包

2.1 move_base

move_base功能包是ROS本身提供的必须组件,里面包含了5个主要模块,分别是global_costmap,local_costmap,global_planner,local_planner和recovery_behaviors。

  • global_costmap
    • 存储静态全局地图上障碍物的信息,用于全局规划成本计算
  • local_costmap
    • 存储动态局部地图上障碍物的信息,用于本地规划和避障
  • global_planner
    • 全局最优路径规划
    • Dijkstra或\(A^*\)算法
  • local_planner
    • 规划机器人每个周期内的线速度、角速度,使之尽量符合全局最优路径
    • 实时避障
    • Trajectory Rollout 和 Dynamic Window Approachs算法
    • 搜索躲避和行进的多条路径,综合各评价标准选取最优路径
  • recovery_behaviors
    • 恢复机制,当机器人无法进行下一步操作时,例如卡住时,默认是原地360°旋转,由传感器感知周围哪个方向可以走出去,获得一个走出策略

机器人在运用move_base功能包时,采用的是action的消息机制。action是一种问答通信机制,是基于ROS的消息机制实现的。该机制带有连续反馈,可以在任务过程中止运行,这可以用来实时反馈机器人当前的情况。

图3. action通信机制

  • action的接口
    • goal:发布任务目标
    • cancel:请求取消任务
    • status:通知客服端当前的状态
    • feedback:周期反馈任务运行的监控数据
    • result:向客户端发送任务的执行结果,只发布一次

图4. action接口

图5. move_base功能包中的话题和服务

2.2 amcl

amcl主要是在二维环境中使用蒙特卡罗定位方法,针对已有地图使用粒子滤波器跟踪一个机器人的姿态。

图6. amcl功能包中的话题和服务

三、导航仿真

3.1 迷宫导航

在已知地图中进行机器人导航,首先导入已经二维迷宫地图,接着启动仿真机器人,并设定机器人到达目的地的姿态,最后通过amcl和move_base进行自身定位和路径规划。

  • 导航目标点设定(客服端)

    • 头文件

      import roslib
      import rospy  
      import actionlib  #action消息机制库
      from actionlib_msgs.msg import *    #action的消息类型
      from geometry_msgs.msg import Pose, PoseWithCovarianceStamped, Point, Quaternion, Twist   #姿态消息类型
      from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal   #move_base消息类型
      
    • 信息发送

      #目标点设定
      target = Pose(Point(-5.543, -4.779, 0.000), Quaternion(0.000, 0.000, 0.645, 0.764))  
      goal = MoveBaseGoal()  
      goal.target_pose.pose = target  
      goal.target_pose.header.frame_id = 'map'  
      goal.target_pose.header.stamp = rospy.Time.now()  
      
      rospy.loginfo("Going to: " + str(target))  
      
      # 向服务器发送目标点 
      move_base.send_goal(goal)  
      
  • 定位

    • amcl
    <launch>
        <初始姿态设定 />
        <node pkg="amcl">
    		...
    		<param/>
    		...
        </node>
    </launch>
    
  • 路径规划

    • move_base
    <launch>
    	<node pkg="move_base" >
    		...
    		<param/>
    		...
    	</node>
    </launch>
    

图7. 迷宫导航

3.2 未知地图导航

在未探索过的地图中进行导航,只要需要随机设定导航目标点,然后在导航时使用SLAM技术,就能观察到机器人为了到达目标点所做的路径规划过程。导航方式和迷宫导航一样,只是增加了SLAM环节。

图7. 未知地图导航

posted @ 2021-02-28 23:18  iamwasabi  阅读(683)  评论(0编辑  收藏  举报