Moveit!是目前针对机械臂移动操作的最先进的软件。它综合了运动规划、控制、3D感知、运控学、控制和导航的最新成果,提供了开发先进机器人应用的易用平台,为工业、商业和研发等领域的机器人新产品的设计和集成体用评估。
目前,Moveit!广泛应用了开源的软件,目前已经应用在了超过65个机器人平台上。
上图显示的是 Moveit!提供的主要节点 move_group 的高层结构,它像一个组合器:把所有单独的组件集成在一起,提供一系列的 actions 和 services 供用户使用。
C++: move_group_interface package
Python: moveit_commander package
GUI: Motion Planning plugin to Rviz
move_group 是一个 ROS 节点,它通过参数服务器获得三种信息:
URDF
SRDF
MoveIt!配置文件
move_group通过ROS topics和actions与机器人通讯,获取机器人的状态(位置,节点等),获取点云或其他传感器数据再传递给机器人的控制器。
关节状态信息
监听 /joint_states 主题确定状态信息
变换信息
通过ROS TF库来监视变换信息
控制器接口
通过ROS的action接口,FollowJointTrajectoryAction接口来使用控制器。
场景规划
move_group使用规划场景监视器来维护规划场景。
可扩展能力
可以很容易进行扩展:可以把运动学、抓取、运动控制等独立的包作为插件供 moveit!使用。
1、 The Motion Planning Plugin
Moveit!通过插件进行运动规划,使其容易和不同的运动规划库链接,方便扩展。
接口由 ROS Action 或者 Service 提供
默认的规划器是 OMPL,其接口通过 MoveIt! Setup Assistant 配置
2、The Motion Plan Request
描述需要运动规划做什么任务。
请求规划器移动机械臂到新的位置,或者移动末端执行器到新的位姿。
默认进行碰撞检测(包括自身干涉)
可以加对象到末端执行器
可以添加运动学约束:
Position constraints - 连杆的运动空间
Orientation constraints - 连杆的RPY角
Visibility constraints - 连杆的某一点在某传感器的可视化锥形区域内
Joint constraints - 关节范围
User-specified constraints - 自定义约束回调函数
3、The Motion Plan Result
move_group 节点会根据运动规划请求产生需要的轨迹。
move_group 节点会根据速度加速度的极值来产生符合速度加速度约束的轨迹
4、Pipeline
Motion planners and Plan Request Adapters
完整的运动规划管道链把 运动规划器 和 planning request adapters 集成在了一起
规划请求适配器允许预处理运动规划请求,后处理运动规划相应
预处理对以下情况有效:例如机器人的开始状态超出了其关节约束范围
后处理对一下情况是必须的:把规划路径转换为轨迹
Moveit!提供了一组默认的运动规划器适配器,每一个都执行特定的功能:
FixStartStateBounds
此适配器修复开始状态超出关节范围的状态。
FixWorkspaceBounds
此适配器指定默认的规划轨迹的工作空间
FixStartStateCollision
此适配器通过轻微扰动关节的值,对特定配置下的无碰撞配置进行采样
FixStartStatePathConstraints
当初始状态不符合特定的路径约束时使用
AddTimeParameterization
根据速度和加速度约束,把路径规划成轨迹。
OMPL (Open Motion Planning Library) 是一个开源的运动规划库,主要是执行随机规划器。MoveIt使用其库里的运动规划器作为主要/默认的一套规划器。
1、规划场景
场景规划用来表现机器人所在的世界并储存机器人的状态信息。它由planning scene monitor 来保持。planning scene monitor 主要收听的信息有:
状态信息:joint_states 主题发布
传感器信息:利用世界几何信息
世界几何信息:planning_scene 主题发布
2、World Geometry Monitor
世界几何监视器,用传感器的信息和使用者的输入信息来建立世界的几何描述。使用 occupancy map monitor 描述机器人周围的3D环境。
3D感知使用 occupancy map monitor。它使用插件来管理不同的传感器输入,包括:
点云:point cloud occupancy map updater 插件使用
深度图像:depth image occupancy map updater 插件使用
4、Octomap
Occupancy map monitor使用Octomap维持Occupancy map的环境
5、Depth Image Occupancy Map Updater
包含其自身过滤器。用来更新 depth map。
运动学采用运动学插件(The Kinematics Plugin),也可以自己编写自己的运动学个逆运动学算法。Forward kinematics(正向运动学) and finding jacobians(查找雅可比矩阵) 被整合到自己的RobotState类。默认逆运动学插件配置使用KDL numerical jacobian-based solver.由MoveIt! Setup Assistant自动配置。
# kinematics.yaml
manipulator:
kinematics_ solver: kdl_ kinematics_plugin/KDLKinematicsPlugin
kinematics_ solver_search_resolution: 0.005
kinematics_ solver_timeout: 0.005
kinematics_ solver_attempts: 3
使用插件,可以很方便地求出运动学、逆运动学、雅可比矩阵。使用的函数是:
getGlobalLinkTransform
setFromIK
getJacobian
IKFast Plugin(IKFast插件)
用来生成自己的运动学求解器插件
Collision Checking(冲突检测)
在场景规划中,检查是否冲突
Collision Objects(冲突对象)
定义检查是否冲突的组件的形状
Allowed Collision Matrix (ACM)(免检冲突矩阵)
定义不需要检测冲突的组件矩阵,节省时间和资源。
时间参数化
运动规划器只是产生路径,而不是包含时间参数的轨迹。它对路径和速度加速度等(joint_limits.yaml)来产生轨迹。
http://moveit.ros.org/
http://docs.ros.org/indigo/api/moveit_tutorials/html/
http://moveit.ros.org/robots/
http://www.ncnynl.com/archives/201610/1028.html
R. Patrick Goebel,ROS By Example(Volume 2),chapter 11:July 2014