ROSナビゲーションパッケージの主な目的は、目標位置への初期位置からのロボットの移動である、任意の衝突が移動する過程で周囲の環境では発生しないであろう。
ROSナビゲーションパッケージは、ナビゲーションの実現に関連するいくつかのアルゴリズムが付属して、彼らは簡単に移動ロボットの自律走行を実現するために私たちを助けることができます。
ユーザーは、GPS、IMU、目標位置とホイールエンコーダからロボットの測定データを提供するために必要と同様に、センサ、レーザスキャナデータストリームにより得られます
そしてデータは、3次元点群データ等のKinectセンサ、パッケージのナビゲーション制御運動の出力からレーザレーダデータのような他のセンサを、ストリーム
目標位置にロボットを制御する速度指令。ナビゲーションパッケージセットは、SLAM、A *(スター)、などの標準アルゴリズムのいくつかの実装が含まれています
ダイクストラ、amclなどは、直接我々のアプリケーションで使用することができます。
ROSは、ナビゲーションパッケージセットをインストールし、次のコマンドを使用してインストールするには:
$須藤はaptインストールROS-旋律 - ナビゲーション
ROSナビゲーションハードウェア要件
ROSナビゲーションパッケージセットはパッケージの普遍的なセットとして設計され、ロボットは次のように、いくつかの基本的なハードウェア要件を満たす必要があります:
*差動駆動し、完全な制約のナビゲーションパッケージ(すなわちDOF制御総自由度ロボットのロボットに等しい)より良い性能の側面、加えて、
X:速度(線速度)、Y:速度(線速度)とシータ:速度(角速度)、移動ロボットは、フォームの速度指令により制御されるべきです。
*ビジュアル(RGB-D)を有するロボットのニーズや周辺環境のマップを構築するために使用されるレーザーセンサ。
*正方形または円形のモバイルプラットフォーム上のナビゲーションパッケージダイバーシティ動作がよりよく実行するために、それはまた、任意の形状のプラットフォーム上で動作する可能性がありますが、性能は保証されません。
以下の図は、ROSのウェブサイト(http://wiki.ros.org/navigation/Tutorials/RobotSetup)から取得したナビゲーションパッケージセットの基本的なブロック図である、我々は見ることができます
各機能ブロックの使用方法と、パッケージのナビゲーションロボットのカスタムセットを設定するには:
ナビゲーションパッケージセットのブロック図
ナビゲーション機能モジュールパッケージへの入力電流は、後述のように:
*里程计数据源(odometry source): 机器人的测距数据给出了机器人相对与起始位置的距离,主要的测试数据源于来自轮子编码器、
IMU、2D/3D相机(视觉测距)。里程计数据需要以nav_msgs/Odometry的消息形式发送到导航软件包集。里程计信息主要用于
控制机器人的位置和移动速度,里程计数据是导航软件包集必须的输入数据。
*传感器数据源:我们必须给导航软件包集提供激光扫描数据或点云数据来扫描机器人周围的环境,这些数据与里程计数据一起构建机器人的全局和局部代价地图。
这里使用的主要传感器是激光雷达或者Kinect3D传感器,数据需要封装成sensor_msgs/LaserScan或者sensor_msgs/PointCloud的形式。
*传感器坐标变换/tf:机器人需要使用ROStf来发布机器人坐标系的变换关系。
*底盘控制器:底盘控制器的主要功能是转换导航软件包集的输出数据,该消息是geometry_msgs/Twist类型的消息,它将会被转换成机器人相应的马达速度。
导航软件包集的可选节点有amcl和地图服务器,它们可以帮助机器人定位以及保存/加载机器人的地图。
使用导航软件包 在使用导航软件包集之前,我们已经讨论了MoveIt!和move_group节点,在导航软件包集中也有一个类似move_group的节点,它被称为move_base节点,
上图中我们清楚地看到move_base节点从传感器、tf和里程计中获得输入数据,这与我们在MoveIt!中看到的move_group节点很类似。
理解move_base节点move_base节点来自名为move_base的软件包,该软件包的主要功能是在其他导航节点的帮助下将机器人从当前位置移动到目标位置。
该软件包中的move_base节点将全局规划和局部规划连接在一起进行路径规划,如果机器人在移动时被某些障碍困住动不了,那么它将
开始调用rotate-recovery软件包,此时需要将全局代价地图和局部代价地图结合起来。
move_base节点基本上实现了SimpleActionServer。它以geometry_msgs/PoseStamped消息的形式发送目标位置信息,
我们可以使用SimpleActionClient节点向此节点发送目标位置信息。
move_base节点从名为move_base_simple/goal的话题订阅目标位置信息,如上图所示,该话题是导航软件包集的一个输入数据。
当此节点接收到一个目标位置后,它将连接到如global_planner、local_planner、recovery_behavior、global_costmap和local_costmap之类的组件,
以生成输出结果(geometry_msgs/Twist类型的速度指令),并将其发送给底盘控制器,从而控制机器人移动到目标位置。
下面是move_base节点连接的所有软件包列表:
*global_planner: 该软件包提供了函数库和节点,用来在地图上从机器人的当前位置到目标位置规划一条最优化路径。
该软件包实现的路径查找算法有A*、Dijkstra等,这些算法用于查找从机器人当前位置到目标位置的最短路径。
*local_planner: 该软件包的主要功能是使用全局规划路径中的部分局部路径为机器人提供导航,局部规划将获取里程计数据、传感器数据、
然后给机器人控制器发送合适的速度命令来完成全局规划路径的一部分,局部规划软件包是轨迹滑出(Trajectory Rollout)算法和动态窗口算法(Dynamic Window Algorithms,DWA)的具体表现。
*rotate-recovery: 该软件包通过执行360度旋转来帮助机器人从本地障碍中恢复。
*clear-costmap-recovery: 该软件包也是用来帮助机器人从本地障碍中恢复,但它是通过将当前导航包集使用的代价地图转换为静态地图后清除代价地图来达到摆脱障碍的目的。
*costmap-2D: 该软件包的主要用途是建立机器人周围环境地图,机器人只能通过地图来规划路径,在ROS中,我们创建2D或3D的栅格地图,用栅格单元表示周围的环境,
每个栅格都有一个概率值,表示该区域是否被占据。costmap-2D软件包可以通过订阅激光扫描或者点云的传感器来建立周围环境的栅格地图,这里的全局代价地图用于全局
路径规划,局部代价地图用于局部路径规划。
下面是与move_base节点交互的其他软件包:
*mao-server: 该软件包保存和加载costmap-2D软件包生成的地图。
*AMCL: AMCL是一种在地图上定位机器人位置的方法,这种方法使用粒子滤波器在概率论的帮助下跟踪机器人相对于地图的位置。
在ROS系统中,AMCL是通过接收sensor_msgs/LaserScan消息来建立地图的。
*gmapping : 该软件包是Fast SLAM算法的一种实现,它使用激光扫描数据和里程计数据构建一个2D占据栅格地图。
使用导航软件包集 我们认识ROS导航软件包集中每个模块的功能,接下来我们来看整个系统是如何工作,机器人需要发布一个合适的里程计数据、tf信息和激光传感器的数据,
并且需要一个底盘控制器和周围环境的地图。
如果所有的需要都满足,我们就可以开始使用导航软件包了。
在地图上定位
机器人将要执行的第一步就是在地图上进行定位,AMCL就是机器人用来在地图上定位的软件包。
发送目标和路径规划
获取了机器人的当前位置后,我们就可以向move_base节点发送一个目标位置,然后move_base节点将此目标位置发送给全局规划器。
该规划器将规划一条从当前机器人位置到目标机器人位置的路径。
这个规划是根据地图服务器提供的全局代价地图进行规划的,全局规划器将此路径发送给局部规划器,
然后局部规划器将执行全局规划的每段路径。
局部规划器从move_base节点获取里程计信息和传感器数据,并为机器人找出一个无碰撞的局部规划,局部规划器从局部代价地图
获取信息,局部代价地图用来监视机器人周围的障碍物。
碰撞恢复行为
全局代价地图和局部代价地图与激光扫描数据关联在一起,如果机器人在某一处卡主了,那么导航软件包
将触发恢复行为节点,,例如通过清除代价地图恢复或者通过原地旋转恢复。
发送速度命令
局部规划器以包含线速度和角速度的twist消息(geometry_msgs/Twist)的形式向机器人底盘控制器发送
生成的控制移动命令,机器人底盘控制器负责将twist消息转换为相应的马达速度。