1.坐标系
最常用的就是map,odom,base_link,base_laser坐标系,这也是开始接触gmapping的一些坐标系。
map:地图坐标系,顾名思义,一般设该坐标系为固定坐标系(fixed frame),一般与机器人所在的世界坐标系一致。
base_link:机器人本体坐标系,与机器人中心重合,当然有些机器人(PR 2)是base_footprint,其实是一个意思。(base_link坐标系原点一般为机器人的旋转中心,base_footprint坐标系原点为base_link原点在地面的投影,有些许区别(z值不同))
odom:里程计坐标系,这里要区分开odom topic,这是两个概念,一个是坐标系,一个是根据编码器(或者视觉等)计算的里程计。但是两者也有关系,odom topic 转化得位姿矩阵是odom-->base_link的tf关系。这时可有会有疑问,odom和map坐标系是不是重合的?(这也是我写这个博客解决的主要问题)可以很肯定的告诉你,机器人运动开始是重合的。但是,随着时间的推移是不重合的,而出现的偏差就是里程计的累积误差。那map-->odom的tf怎么得到?就是在一些校正传感器合作校正的package比如amcl会给出一个位置估计(localization),这可以得到map-->base_link的tf,所以估计位置和里程计位置的偏差也就是odom与map的坐标系偏差。所以,如果你的odom计算没有错误,那么map-->odom的tf就是0.
base_laser:激光雷达的坐标系,与激光雷达的安装点有关,其与base_link的tf为固定的。
参考:http://www.ros.org/reps/rep-0105.html
2.包
在ROS中,进行导航需要使用到的三个包是:
(1) move_base:根据参照的消息进行路径规划,使移动机器人到达指定的位置;
(2) gmapping:根据激光数据(或者深度数据模拟的激光数据)建立地图;(gmapping是一个比较完善的地图构建开源包,使用激光和里程计的数据来生成二维地图。)
(3) amcl:根据已经有的地图进行定位。
3.MoveIT
moveit是ros中一系列移动操作的功能包的组成,主要包含运动规划,碰撞检测,运动学,3D感知,操作控制等功能。
1.move_group:move_group是moveit的核心部分,可以综合机器人的各独立组件,为用户提供一系列的动作指令和服务。move_group类似于一个积分器,本身并不具备丰富的功能,主要做各功能包和插件的集成。它通过消息或服务的形式接收机器人上传的点云信息,joints的状态消息,还有机器人的tf tree,另外还需要ros的参数服务器提供机器人的运动学参数,这些参数会在使用setup assistant的过程中根据机器人的URDF模型文件,创建生成,包括SRDF文件和配置文件。
2.motion panning(运动规划):在moveit中,运动规划算法是由运动规划器(motion planner)完成,而规划器是作为插件来安装的,可以通过ROS的pluginlib接口来加载需要的规划器。运动规划算法有很多,每一个运动规划器都是moveit的一个插件,可以根据需求选用不同的规划算法,move_group默认使用的是OMPL算法。
3.Planning Scene(规划场景):可以为机器人创建一个具体的工作环境,加入一些障碍物。
4.Kinematics(运动学):运动学算法是机械臂各种算法中的核心,尤其是逆运动学算法IK(inverse kinematics)。什么是逆运动学(IK)?简单说,就是把终端位姿变成关节角度,q=IK(p)。p是终端位姿(xyz),q是关节角度。为什么要用IK?OMPL是采样算法,也就是要在关节空间采样。 这与无人车的规划有一个最明显的区别,无人车的目标就是在采样空间, e.g. 目标是(x,y), 采样空间也是(x,y). 但是对于机械臂,目标是终端空间位置(xyz), 但采样空间却是关节空间(q0,q1,…qN)。有了IK之后,我们就可以把三维空间的目标p转化为关节空间的目标q。那么这样就会让采样算法能算的更快,具体方法不赘述,这样的算法有RRT-Connect,BKPIECE等等双向采样算法。moveit使用插件的形式可以让用户灵活的选择需要使用的反向运动学算法,也可以选择自己的算法。moveit中默认的IK算法是numerical jacobian-base算法。
5.collision checking(碰撞检测):moveit使用CollisionWorld对象进行碰撞检测,采用FCL(Flexible Collision Library)功能包。碰撞检测是运动规划中最耗时的运算,往往会占用90%左右的时间,为了减少计算量,可用通过设置ACM(Allowed Collision Matrix)来进行优化,如果两个bodys之间的ACM设置为1,则意味着这两个bodys永远不会发生碰撞,不需要进行碰撞检测。
6.OMPL(open motion planning library):开源运动规划库,是一个运动规划的C++库,其中包含了很多运动规划领域的前沿算法。虽然OMPL里面提到了最优规划,但总体来说OMPL还是一个采样规划算法库。而采样规划算法中,最出名的莫过于RRT(rapidly-exploring random trees)和PRM(probabilistic roadmap)。 OMPL能做什么? 简单说,就是提供一个运动轨迹。给定一个机器人结构(假设有N个关节),给定一个目标(比如终端移到xyz),给定一个环境,那么OMPL会提供给你一个轨迹,包含M个数组,每一个数组长度是N,也就是一个完整的关节位置。沿着这个轨迹依次移动关节,就可以最终把终端移到xyz,当然,这个轨迹应当不与环境中的任何障碍发生碰撞。为什么用OMPL? 运动规划的软件库和算法有很多,而OMPL由于其模块化的设计和稳定的更新,成为最流行的规划软件库之一。很多新算法都在OMPL开发。很多其他软件(包括ROS/MoveIt)都使用OMPL做运动规划。
7.用moveit控制机器人大概分以下几步:
a.建立机器人URDF模型
b.建立机器人ros驱动
c.生成moveit配置文件
d.标定相机
e.修改moveit配置文件和launch文件
其中在进行仿真操作过程中,不需要b,d,e三个步骤。