ROS 学习篇(八)机器人的导航功能--navigation
1. 概述
ROS的二维导航功能包,简单来说,就是根据输入的里程计等传感器的信息流和机器人的全局位置,通过导航算法,计算得出安全可靠的机器人速度控制指令。但是,如何在特定的机器人上实现导航功能包的功能,却是一件较为复杂的工程。作为导航功能包使用的必要先决条件,机器人必须运行ROS,发布tf变换树,并发布使用ROS消息类型的传感器数据。同时,为了让机器人更好的完成导航任务,开发者还要根据机器人的外形尺寸和性能,配置导航功能包的一些参数。
-
在ROS中,进行导航需要使用到的三个包是:
(1) move_base:根据参照的消息进行路径规划,使移动机器人到达指定的位置;
(2) gmapping:根据激光数据(或者深度数据模拟的激光数据)建立地图;
(3) amcl:根据已经有的地图进行定位。
源码解析:https://blog.youkuaiyun.com/qq_27753669/article/details/80011156
-
在总体框架图中可以看到,move_base提供了ROS导航的配置、运行、交互接口,它主要包括两个部分:
(1)
全局路径规划(global planner)
:根据给定的目标位置进行总体路径的规划. -
在ROS的导航中,首先会通过全局路径规划,计算出机器人到目标位置的全局路线。这一功能是navfn这个包实现的。
-
navfn通过Dijkstra或A*最优路径的算法,计算costmap上的最小花费路径,作为机器人的全局路线。
(2)
本地实时规划(local planner)
:根据附近的障碍物进行躲避路线规划。 -
本地的实时规划是利用base_local_planner包实现的。该包使用Trajectory Rollout 和Dynamic Window approaches算法计算机器人每个周期内应该行驶的速度和角度(dx,dy,dtheta velocities)。
-
base_local_planner这个包通过地图数据,通过算法搜索到达目标的多条路经,利用一些评价标准(是否会撞击障碍物,所需要的时间等等)选取最优的路径,并且计算所需要的实时速度和角度。
-
其中,Trajectory Rollout 和Dynamic Window approaches算法的
主要思路
如下:
(1) 采样机器人当前的状态(dx,dy,dtheta);
(2) 针对每个采样的速度,计算机器人以该速度行驶一段时间后的状态,得出一条行驶的路线。
(3) 利用一些评价标准为多条路线打分。
(4) 根据打分,选择最优路径。
(5) 重复上面过程。
2. 硬件要求
尽管导航功能包设计得尽可能通用,但是仍然对机器人的硬件有以下三个要求:
(1)导航功能包仅对差分等轮式机器人有效,并且假设机器人可直接使用速度指令进行控制,速度指令的格式为:x方向速度、y方向速度、速度向量角度。
(2)导航功能包要求机器人必须安装有激光雷达等二维平面测距设备。
(3)导航功能包以正方型的机器人为模型进行开发,所以对于正方形或者圆形外形的机器人支持度较好,而对于其他外形的机器人来讲,虽然仍然可以正常使用,但是表现则很有可能不佳。
3. 机器人配置
3.1、ROS
首先,请确保你的机器人安装了ROS框架。
3.2、tf变换(sensortransforms)
导航功能包要求机器人以tf树的形式发布各个相关参考系的变换关系。
base_link
和base_laser
间的tf转换 核心代码:tf::TransformBroadcaster broadcaster;
broadcaster.sendTransform(tf::StampedTransform( tf::Transform(tf::Quaternion(0,0,0,1),tf::Vector3(0.1,0.0,0.2)), ros::Time::now(),"base_link","base_laser"));
/*通过TransformBroadcaster来发送转换关系,需要附带5个参数。 1.旋转变换 2.平移变换 3、时间戳 4、parent节点名字 5、child节点名字 */
查看tf关系:
- 使用rqt_tf_tree
rosrun rqt_tf_tree rqt_tf_tree
- 使用tf_echo
rosrun tf tf_echo [parent_frame_id] [child_frame_id]
3.3、传感器信息(sensor sources)