# 一、MoveIt!系统架构
总架构图:
# 1.1运动组(move_group)
move_group
是MoveIt!的核心节点,可以综合其他独立的功能组件为用户提供ROS中的动作指令和服务
该节点本身并不具备丰富的功能,主要完成各功能包、插件的集成,它通过消息或服务的方式接受机器人发布的点云信息、关节状态消息以及机器人的TF坐标变换
另外还需要ROS参数服务器提供机器人的运动学参数,这些参数可根据机器人的URDF模型生成
move_group
和机器人之间通过Topic和Action进行通信,机器人传感器和机器人状态发布者将机器人的关节信息和坐标变换关系发送给move_group
move_group
的结构很容易通过插件形式进行拓展,已有的功能模块也是通过插件的形式集成在MoveIt!中的
# 1.2运动规划器(motion_planner)
tips:机器人的运动规划指的是在已知机器人初始姿态和目标姿态以及机器人和环境的模型参数的情况下,可以通过某种算法,在避免环境障碍物和防止自身碰撞的同时,找到一条到达目标姿态的较优路径
在MoveIt!中,运动规划算法由运动规划器来完成,规划算法有很多,每一个运动规划器都是MoveIt!中的一个插件,开发者可以根据需求选用不同的规划算法
在move_group
中默认使用的是OMPL算法
图中规划请求适配器组(planning request adapters),其功能主要是预处理运动规划请求和响应数据,使之满足规划和使用的需求
# 1.3规划场景
规划场景为机器人创建一个工作环境,包括界面中的桌面、工件等物体
该功能由move_group节点中的场景监听器(Planning Scene Monitor)实现
该插件会监听以下几方面的信息:
- 状态信息(State Information):机器人的关节话题
- 传感器信息(Sensor Information):机器人的传感器数据
- 外界环境信息(World geometry information):通过传感器建立的周围环境信息
# 1.4运动学求解器
运动学算法是机械臂各种算法中的核心,包括正向运动学(FK)和反向运动学(IK)
默认情况下使用的运动学求解器是从Orocos项目中移植过来的KDL
# 1.5碰撞检测器
MoveIt!使用CollisionWorld对象进行碰撞检测(Collision Checking),采用FCL(Flexible Collision Library)功能包实现
碰撞检测是运动规划中最耗时的运算之一,为减少计算量可以在MoveIt! Setup Assistant工具中设置免检冲突矩阵(Allowed Collision Matrix,ACM)进行优化
# 二、如何使用MoveIt!
MoveIt!实现机械臂控制的四个步骤
- 组装:在控制之前需要有机器人,可以是真实的机械臂或者仿真机械臂,但都要创建完整的URDF机器人模型
- 配置:在使用MoveIt!控制机械臂之前需要根据URDF模型并使用Setup Assistant工具完成自碰撞矩阵、规划组、终端夹具等配置,完成后生成ROS功能包
- 驱动:使用ArbotiX或ros_control功能包中的控制器插件实现对机械臂关节的驱动
- 控制:MoveIt!提供了C++、Python、RViz插件等接口,可以实现机器人关节空间和工作空间下的运动规划
# 三、创建机械臂模型--以六轴为例
# 3.1声明模型中的宏
针对机械臂模型定义的宏主要包括三方面:
- 颜色的宏:定义模型中需要使用的外观颜色,设置颜色的RGBA值
- 机器人尺寸:通过宏属性定义机器人的三维尺寸,便于修改
- 惯性矩阵宏:每一个link都需要制定惯性矩阵,可以把该模块提取出来,输入质量参数即可
# 3.2创建六轴机械臂模型
设计目标是六轴机械臂,机器人需要六个关节,终端还需要装配一个两指夹爪,使用一个关节驱动
具体代码见GitHub中ROS-moveit项目
# 3.3加入Gazebo属性
加入Gazebo属性的方法和移动机器人的相同,需要对机器人模型设置Gazebo中的link颜色、每个关节的transmission以及ros_control插件
具体代码见GitHub中ROS-moveit项目
注意:机械臂控制往往更加注意运动过程中关节的位置,一般情况下以位置控制为主
在此处transmission使用的接口是PositionJointInterface
其对应的控制器ros_control插件是libgazebo_ros_control.so
# 3.4模型展示
设计过程中需要将模型放置在RViz中进行可视化展示,从而验证设计的正确性
使用命令:$ roslaunch marm_decription view_arm.launch
启动并展示
另外通过拖动joint控制插件中的滑动条,可以看到对应机器人关节的运转,结果如下所示: