我们到了吗?根据测量来到达目的距离
机器人的基处理器节点利用测程法和PID控制来把运行要求转化成现实世界的速度。这个过程的精确度和可靠性依赖于机器人内部的感应器、校准过程的精确度和周围环境的条件。
机器人通过对外部的测量获得自己的位置和方向,是可以对机器人的内部测量进行补充的。举例来说,机器人可以利用ROS的ar_pose包、ar_kinect包或ar_track_alvar包,根据诸如基准线等固定在墙上的可视标准,得到机器人在房间中相对精确的定位。一个相似的技术利用的是环境中的可视的标识来做定位,而不是人工标志物(ccny_rgbd_tools,rgbdslam)。还有一些包(laser_scan_matcher)使用激光扫描来定位。室外机器人通常使用GPS,而室内机器人可以使用其他主动定位技术,如Evolution Robotics的NorthStar系统。
本书中将会用“测量”这个词标识内部的位置数据。然而,不管测量数据从何而来,ROS都提供了一个消息类型来存储这些信息,即nav/msgs/Odometry。该消息的缩写版本定义如下:
Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist
可以看到它由一个头Hearder、一个标识符为child_frame_id的string以及两个分别名为PoseWithCovariance 和TwistWithCovariance的子消息组成。
运行以下命令,可以查看详细定义:
PoseWithCovariance子消息记录了机器人的位置和方向。而TwistWithCovariance子消息告诉了线速度和角速度。covariance矩阵为位置pose和速度twist补充了不同的测量的不确定性。
Header和child_frame_id定义了我们用来测量距离和角度的框架。它同时为每一个消息提供了一个时间戳,让我们知道在何时何地。ROS在测量中约定俗成地用/odom作为父框架的id,而用/base_link(或/base_footprint)作为子框架的id。框架/base_link代表的是现实中的机器人,而/odom则是由测量数据中平移与旋转定义的。这些变换是相对于/odom框架来移动机器人的。
如果我们在RViz上现实模拟机器人,并设置固定到/odom框架,机器人的位置表示的是机器人“觉得”它相对于开始位置的坐标。