机器人自主导航
一、导航框架
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. 未知地图导航