注:本篇博文全部源码下载地址为:Git Repo。
1. 下载到本地后解压到当前文件夹然后运行:catkin_make 编译。
2. 源码是在 Ubuntu14.04 + Indigo 环境下编写。
一、概述
经过前面一系列博文的介绍,已经可以利用RViz上的相关按钮控制和仿真实际的机器人Rob了,本篇解决如何通过MoveIt提供的用户接口个性化的和机器人进行交互(如发送命令让机器人到达某个位姿)的问题。如图1所示,主要介绍图中紫色椭圆圈出部分的用法,图中可以看出MoveIt为用户提供了多个接口类,本篇仅以 MoveGroupInterface 类为例进行介绍,这个类的官方接口说明请点击这里。
图1
二、功能说明及实现
本篇博文的源码程序包下载地址在开篇处,新增的包的名字为:rob_moveit_interface,程序基本流程图如图2所示,首先定义了双臂的接口名称,然后利用随机生成的位姿模拟我们的目标位姿,进行双臂的运动学求解和运动规划,最后经过MoveIt和我们定义的control包发送给实际的机器人进行执行。
图2
具体而言,需要包含的头文件为:
#include <moveit/move_group_interface/move_group.h> #include <moveit/planning_scene_interface/planning_scene_interface.h>
定义了双臂的接口名称代码段为:
// Get the arm planning group moveit::planning_interface::MoveGroup l_plan_group("left_arm"); moveit::planning_interface::MoveGroup r_plan_group("right_arm");
双臂关节运动速度系数设置如下所示,系数的调节范围为0~1, 这里我们利用随机数函数随机生成一个系数。
//set Velocity Factor (0,1] double Velocity_Factor = (double)((rand()%(100-(1)+1)) + (1))/100; l_plan_group.setMaxVelocityScalingFactor(Velocity_Factor); r_plan_group.setMaxVelocityScalingFactor(Velocity_Factor);
最后运动规划和执行的代码段为:
//excute for(int i=0;i<5;i++) { L_Joint_goal.push_back(left_movement[i]*degTorad); R_Joint_goal.push_back(right_movement[i]*degTorad); } l_plan_group.setJointValueTarget (L_Joint_goal); r_plan_group.setJointValueTarget (R_Joint_goal); l_plan_group.move(); r_plan_group.move(); L_Joint_goal.clear(); R_Joint_goal.clear();
然后我们编写一个launch文件用于启动这一节点,这个也很简单,如下所示,命名为 rob_moveit_interface.launch。
<launch> <node pkg="rob_moveit_interface" name="rob_moveit_interface" type="rob_moveit_interface" output="screen"> <!--launch-prefix="xterm−e"--> </node> </launch>
至此基本完成了接口程序包的编写,然后利用catkin_make进行编译。
三、测试
下面我们只需测试接口程序是否能满足我们的预定功能即可,首先起一个shell (Shell 1),设置环境变量后将MoveIt相关包起来,具体命令如下,这里起的是我们在博文系列三中的所有程序包。
roslaunch rob_moveit_config demo.launch
然后重新起一个shell(Sheel 2),启动我们本篇博文编写的节点,命令如下:
roslaunch rob_moveit_interface rob_moveit_interface.launch
此时,我们看Sheel 2 的log发现程序已经产生了模拟的目标位姿并发送给MoveIt进行运动规划,主要 log 如下:
[ INFO] [1527688202.991717070]: Left Planning Reference frame: /base_link [ INFO] [1527688202.991861418]: Left EndEffector Reference frame: l_grasping_frame [ INFO] [1527688202.991926842]: Right Planning Reference frame: /base_link [ INFO] [1527688202.992057268]: Right EndEffector Reference frame: r_grasping_frame left_movement:[117.000000][42.000000][24.000000][47.000000][-11.000000] right_movement:[38.000000][36.000000][-26.000000][58.000000][-72.000000] Velocity_Factor = [0.360000] [rob_moveit_interface-1] process has finished cleanly
同时 Shell 1 中出现了双臂的运动规划结果消息并发送给机器人,主要log如下,我们发现最后执行的位姿和我们生成的目标一致。
[ INFO] [1527688203.521864124]: I sent [38.00][36.00][-26.00][58.00][-72.00][0.63] [ INFO] [1527688203.521992769]: Right arm MSG [38.004787][35.999733][-25.999399][58.003475][-72.001976][0.631444] [ INFO] [1527688203.274094561]: I sent [117.00][42.00][23.99][47.00][-11.01][0.41] [ INFO] [1527688203.274198912]: Left arm MSG [116.997490][42.003925][23.994616][47.003212][-11.005501][0.413423]
最后,我们看到机器人在Rviz环境中执行了相关的动作,如图3所示。
图3
至此,我们完成了接口节点的编写和测试,经过博文一到四,我们基本走通了:用户接口输入-->MoveIt运动规划-->运动消息通过Controller发送的基本功能,这里只是很浅显的讲了MoveIt的使用和配置过程,下一篇博文来介绍机械臂运动学相关的知识,并编写一个简单的运动学求解算法嵌入接口程序。
<-- 本篇完 -->
欢迎留言、私信、邮箱、微信等任何形式的技术交流。
作者信息:
名称:Shawn
邮箱:zhanggx0102@163.com
微信二维码:↓