小虎哥哥爱学习 2020-02-16
一.安装MoveIt!
我用的ROS系统的版本为melodic,因此安装MoveIt!的命令为:
$sudo apt install ros-melodic-moveit ros-melodic-moveit-plugins ros-melodic-moveit-planners
二.MoveIt!架构
理解MoveIt!的架构有助于我们的编程,并有助于将机器人与MoveIt!进行交互。
MoveIt!的架构如图所示,官方网址为http://moveit.org/documentation/concepts
MoveIt!架构图
move_group节点
我们可以认为move_group就是MoveIt!的核心,因为该节点作为机器人的各个部件的集合,并根据用户的需求提供动作和服务。
在架构图中可以清楚地看出来,move_group节点用话题和服务的形式搜集机器人的信息、例如点云、关节状态、坐标变换(tf)
MoveIt!从参数服务器收集了机器人的运动学数据,例如robot_description(URDF)、语义机器人描述格式(Semantic Robot Description Format,URDF)及配置文件,
在我们为机器人生成MoveIt!软件包的同时也生成了SRDF文件和配置文件。配置文件包含设置关节约束、感知、运动学、末端执行器等方面的参数文件。
当MoveIt!可以获取关于机器人及其配置的所有信息时,就已经配置好了,我们可以从用户界面开始控制机器人了,我们可以使用MoveIt!的C++或者PythonAPI接口
向move_group节点发指令以执行一些动作,如拾取/放置、逆向运动学(IK) 和正向运动(FK)。
move_group节点是一个集合,它没有直接运行任何类型的运动规划算法,而是将所有的功能作为插件连接起来。
在运动规划之后,生成的运动轨迹可以使用FollowJointTrajectoryAction接口与机器人的控制器进行交互。这是一个动作接口,通过该接口动作服务器在机器人上运行,
move_node节点负责初始化一个动作客户端,该动作客户端与该服务器通信并在真实机器人或Gazebo仿真器中执行这些规划的轨迹。
用MoveIt!进行运动规划假如我们知道了机器人的初始姿态,机器人的期望目标姿态,机器人的几何描述以及周围环境的几何描述,
那么路径规划就是寻找将机器人逐步从初始姿态移动到目标姿态的最佳路径,在运动过程中不能碰到障碍物,
也不能与自身的机器人连杆碰撞。
在这里,机器人的外观几何形状由URDF文件描述,我们还可以为机器人环境创建描述文件,
并用机器人上的激光或视觉传感器为其操作空间构建地图,避免在执行规划的路径时与出现的
静态或动态的障碍物发生碰撞。
在机械臂的例子中,运动规划器需要找出一个可以让机器人的所有连杆都不与环境发生碰撞的轨迹(由每个关节的关节空间组成),也要避免自碰撞(机器连杆之间的碰撞),还要避免超过关节的极限。
MoveIt!可以通过插件接口与运动规划器进行交互。我们只需要通过更改插件即可使用任意的运动规划器,
此方法具有高度可扩展性,因此我们可以使用此接口来尝试自定义的运动规划器。move_group节点通过ROS动作和服务与运动规划器插件进行交互。
move_group节点默认的规划是OMPL(http://ompl.kavrakilab.org/)
为了启动运动规划,我们需要向运动规划器发送运动规划请求,以指定我们具体的规划要求,规划需求可以是设定末端执行器的目标姿态。
我们可以为运动规划器设置附加运动学约束,下面是MoveIt!中的一些内置约束:
*位置约束 :这些约束限制连杆的位置。
*方向约束 :这些约束限制连杆的方向。
*可见性约束 :这些约束限制连杆上的点在区域中的可见性(传感器的视野)
*关节约束 :这些约束限制关节的限值。
*用户指定的约束 :利用这些约束,用户可以使用回调函数定义自己的约束。
利用这些约束,我们可以发送运动规划请求,规划器将根据请求生成适当的轨迹,
move_group节点将从运动规划器中生成适当的轨迹,该轨迹将遵循所有的约束,最终的规划路径将发送给机器人的关节轨迹控制器。
运动规划请求适配器规划请求适配器(planning Request Adapter)有助于预处理运动规划请求并对运动规划响应
进行后续处理。预处理请求的一个用途是帮助纠正关节状态的非法情况,另外在后续处理时,
它还可以将规划器生成的路径转换为以时间为参数的轨迹,下面是MoveIt!中一些默认的规划请求适配器:
*FixStarStateBounds : 如果关节状态轻微超出了关节的限制,则此适配器可以将关节限值固定在限制范围内。
*FixWorkspaceBounds : 该适配器指定了用于规划多维数据集大小的工作空间为10m*10m*10m.
*FixStarStateCollision : 如果现有的关节位姿(configuration)处于碰撞状态,该适配器将采样生成新的无碰撞位姿。
它通过一个名为jiggle_factor的因子更改位姿来进行新配置。
*FixStarStatePathConstraints : 该适配器将在机器人的初始状态不符合路径约束时使用,这里它将寻找满足路径约束的近似姿态并将此姿态当作初始姿态。
*AddTimeParameterization : 该适配器通过添加速度和加速度约束来参数化运动规划。
MoveIt!规划场景
“规划场景”是用来表示机器人周围的世界并存储机器人本身的状态。在move_group内的规划场景监视器维护着规划场景的表示,
move_group节点由另一个称作世界几何结构监测器的部分组成,该部分通过机器人的传感器和用户的输入构建世界的几何结构。
规划场景监视器从机器人读取joint_states话题,从世界几何结构监视器读取传感器信息和世界几何结构,世界场景监视器从从占用
地图监视器中读取数据,该监视器使用3D感知构建周围环境的3D表示,称为Octomap。Octomap可以由点云生成,这些点云由点云占用地图更新插件来处理,
深度图像由深度图像占用地图更新器处理。如图是MoveIt!规划场景概览图:
MoveIt!规划场景概览图
MoveIt!处理运动学
MoveIt!使用机器人插件为切换逆向运动学算法提供了极大的灵活性。用户可以将自己的IK解算器编写为MoveIt!的插件,
并在需要时替换默认的结算器插件。MoveIt!中的默认IK解算器是基于雅可比行列式的数值解算器。
与解析解算器相比,数值解算器可能需要更多的时间来处理IK,这个名为IKFast的软件包可以用来生成用于使用解析方法来求解IK的C++代码,
该方法可用于不同类型的机器人执行器,且DOF小于6的时候表现更好,此C++代码可以用一些ROS工具转换为MoveIt!插件。
正向运动学和计算雅可比矩阵已经集成了MoveIt! RobotState类中,因此我们不需要使用插件来解决FK问题。
MoveIt!碰撞检测
MoveIt!中的Collision对象用来查找规划场景内的碰撞。该场景使用Flexible Collision Library (FCL)软件包作为后端,MoveIt!支持多种不同类型对象的碰撞检测,
比如网格物理,基本形状如立方体、圆柱、圆锥、球体和Octomap。
碰撞检测是运动规划期间计算成本高昂的任务之一,为了减少计算资源的消耗,MoveIt!提供了允许碰撞的矩阵(Allowed Collision Matrix,ACM)。它包含
一个二进制数值,确定是否要检测两物体之间的碰撞。如果矩阵中的数值是1,意味着无须为相应的两个物体检测碰撞,我们可以将离得较远彼此之间不可能
发生碰撞的两个物体的该值设置为1,这样优化ACM可以减少避免碰撞规避所需的总计算量。
三.使用配置助手工具生成MoveIt!配置软件包MoveIt!配置助手是一个图形化的用户工具,用来将任何机器人安装配置到MoveIt!中。
简单的说,这个工具可以生成SRDF配置文件,启动文件和机器人URDF模型生成的脚本,
这是配置move_group节点所必需的。
SRDF文件详细描述了有关机械臂关节、末端执行器关节、虚拟关节和碰撞连杆对的详细信息,
这些都是可以用配置助手工具进行MoveIt!配置过程中的配置。
配置文件包含了运动学解算器、关节约束、控制器等方面的详细信息,这些信息也在配置过程中进行配置和保存。
使用生成的机器人配置软件包,我们可以在没有真实机器人和仿真界面的情况下在RViz中进行运动规划。
下面启动配置界面,我们就可以看到构建机械臂配置软件包的分步过程。
第一步:启动配置助手工具我们使用以下命令来启动MoveIt!配置助手工具:
$ roslaunch moveit_setup_assistant setup_assistant.launch
这将打开一个窗口并提供两个选择:Create New MoveIt! Configuration Package或者Edit Existing MoveIt! Configuration Package。
这里我们正在创建一个新配置软件包,所以我们选择第一个选项。如果我们已经有一个MoveIt!配置软件包了,那么我们就可以选择第二项。
点击Create New MoveIt! Configuration按钮,将出现一个新的窗口,如图所示:
在此步骤中,该助手会提示