02---控制移动底座2
控制一个机器人运动可以在运动控制系统中许多不同的层中实现,ROS在不同的层中都有提供相应的方法。从对发动机的直接控制,到路径规划和SLAM,不同的层代表着不同程度的抽象。
1、发动机、轮子和编码器
大多数differential drive robots在运行ROS时都会在发动机和轮子上使用编码器。一个编码器每转一圈会触发固定数量的ticks(通常会有几百或者几千个),从而记录对应轮子转了多少圈。加上预先知道的轮子的直径和轮子之间的距离,编码器就可以把记录的数据转化成用m来表示的轮子行驶的距离,或者用rad表示的轮子转动的角度。而要计算速度时,只需简单地把上述测量得到的数据除以测量的时长。
这种收集内部运动数据的方法被称作测程法,需要记住的一个事实就是不管你使用了多少不同来源的测量数据,机器人在现实世界中的位置和速度理论上(实际上也很有可能)与测程法提供的数据有偏差的。而这种偏差的程度则取决于当前环境的条件与测量数据来源的可靠性。
2、发动机控制器和驱动程序
在最底层的运动控制,我们需要为发动机控制器提供一个驱动程序。发动机控制器得到内部组件的测量数据,如编码器的ticks每秒被触发了多少次,或者当前速度与最大速度的比率,然后控制轮子达到目标速度。ROS的核心除了包括Willow Garage PR2和TurtleBot外其他 需要下载第三方的驱动程序,可以查询http://wiki.ros.org/Robots。
3、ROS基控制器
在进入下一层进行了更多的抽象后,机器人的目标速度就可以使用与现实世界一样的计量单位来表示了,如m/s或rad/s。
另外,采用一些PID控制的形式也是非常普遍的。PID表示Proportional Integral Derivative,这样明明是由于控制算法会根据三个值---轮子当前实际速度和理论速度的差,速度对于时间的导数和积分---来纠正轮子的速度。对于本知识点而言,只需简单地知道,控制器可以使机器人更好地按照我们的要求进行移动。
驱动程序和PID控制器通常都会被整合在同一个叫基控制器(base controller)的ROS节点中。
基控制器需要在一台与发动机控制器直连的 计算机上运行,而且在启动一个机器人时,它通常是第一个被运载的节点。很多基控制器可以在Gazebo上进行模拟,包括Turtlebot,PR2和Erratic。
基控制器通常在/odom话题下发布测量数据,并在/cmd_vel话题下监听运动指令。与此同时,控制器节点通常(但不总是)发布一个从/odom框架到基框架----/base_link或者base_foot-print的转换。这里的“不总是”是因为有一些如TurtleBot的机器人是使用robot_pose_ekf包去整合轮子与陀螺仪的数据,从而得到对机器人位置和方向更精确的估算。在这种情况下,是由robot_pose_ekf节点发布从/odom到/base_footprint的转换(robot_pose_ekf包实现了一个ekf)。
当我们有了基控制器,ROS提供了基于命令行或者使用ROS节点的工具时,我们就可以发布一些具有更高抽象层次的指令。在当前的抽象层次中,我们使用什么硬件去实现基控制器并不重要。此时,编程时可以把注意力集中在机器人在现实世界中的目标速度或角速度,这样代码通过ROS的接口后可以在任意的基控制器上运行。
4、使用ROS中mov_base包的基于框架的运行
在下一层的抽象中,ROS提供了move_base包,它使我们可以为某一个机器人对应某一参照框架设定目标位置和方向。然后move_base包会尝试让机器人避开障碍物并移动到目标位置。move_base包将进行一个十分复杂的路径规划,它在为机器人选择路径时,结合了测量数据,局部和全局代价地图。还根据我们在配置文件中设定的最小和最大速度,自动地调整线速度、角速度和加速度。
5、使用ROS的gmapping包和amcl包的SLAM
在更高的抽象层次中,ROS让我们的机器人可以使用SLAM的gmapping包来绘制一张它所在环境的地图。地图的绘制最好使用激光扫描仪,但用Kinect或者Xtion的深度照相机来模拟激光扫描仪也是可以的。如果你拥有一台TurtleBot,你在它的栈中可以找到所有你在进行SLAM时所需要的工具。
当地图绘制完成时,ROS中的amcl包(自适应模特卡洛定位,adaptive Monte Carlo localization)就可以通过机器人当前的扫描和测量数据来自动定位。这使得操作者可以随意点击地图上的某一点,让机器人自己躲避障碍物找到去目的地的路径【课程http://www.udacity.com/overview/Course/cs373/CourseRev/apr2012】。这是对SLAM背后涉及的数学的一个极好的介绍。
6、语义目标
最后,在最高层次的抽象中,运动目标是用有语义的句子表达的,如“帮我去厨房那点酒过来”,这在这种情况下,语义目标要被翻译并处理成一系列动作。有些动作要求机器人移动到特定的位置,而每个目标位置会被传到定位与路径规划层来实现。当然,有很多ROS包可以帮助我们实现这个目标,包括smach包、executive_teer包、worldmodel包、semantic_framer包和knowrob包。
7、总结
总而言之,我们的运动控制层的层次如图所示
Goal->AMCL->Path->Planner->move_base->/cmd_vel+/odom->Base Controller->Motor Speeds,将其转换成如下格式
我们 ROS 的控制阶层看起来就是这个样子的: (我们从最上层开始)
- (Semantic Goal)语音控制(比如:你对机器人说一句:“去把桌子上的杯子递给我”)机器人将语音信息解析并翻译成一系列动作。
- ( SLAM )同步定位和重建地图 (机器人每移动一步都会对自身在world坐标系中进行重新坐标定位,并且将看到的新景象融合当world坐标系中)
- (当你让机器人移动到world坐标系中的一个指定的地方(即指定坐标),机器人会在当前已知的地图上分析出行驶路线(全局路径), 这就是路径规划)
- move_base (分析完路径之后,机器人在移动的过程中分析下一步如何移动,同时避开障碍物(即不断的分析局部路径),直到机器人到达目的地。)
- (move_base会将分析出来的局部路径转换成一系列的/cmd_vel控制命令和/odom信息(/odom就是当前机器人的状态))(/odom是什么?下面有讲)
- Base Controller (上面得到的/cmd_vel控制命令会控制机器人的移动平台运动,这些控制命令会通过PID算法控制电机转动。)
- Motor Speeds (电机转动后,编码器读取电机转动的速度,再反馈给上面的PID算法,使Base Controller得以理想的实现/cmd_vel命令的要求。)
在本章与后面的章节中,我们会学习如何运用不同层次的运动控制。在我们理解由_base包、gmapping包和amcl包提供的强大特性前,需要从更基础的内容讲起。