ROS系统MoveIt玩转双臂机器人系列(四)–用户接口的使用

442
0
2020年8月12日 10时10分

注:本篇博文全部源码下载地址为:Git Repo

1. 下载到本地后解压到当前文件夹然后运行:catkin_make 编译。

2. 源码是在 Ubuntu14.04 + Indigo 环境下编写。

 

一、概述

经过前面一系列博文的介绍,已经可以利用RViz上的相关按钮控制和仿真实际的机器人Rob了,本篇解决如何通过MoveIt提供的用户接口个性化的和机器人进行交互(如发送命令让机器人到达某个位姿)的问题。如图1所示,主要介绍图中紫色椭圆圈出部分的用法,图中可以看出MoveIt为用户提供了多个接口类,本篇仅以 MoveGroupInterface 类为例进行介绍,这个类的官方接口说明请点击这里

 

ROS系统MoveIt玩转双臂机器人系列(四)–用户接口的使用插图

图1

二、功能说明及实现

本篇博文的源码程序包下载地址在开篇处,新增的包的名字为:rob_moveit_interface,程序基本流程图如图2所示,首先定义了双臂的接口名称,然后利用随机生成的位姿模拟我们的目标位姿,进行双臂的运动学求解和运动规划,最后经过MoveIt和我们定义的control包发送给实际的机器人进行执行。

ROS系统MoveIt玩转双臂机器人系列(四)–用户接口的使用插图(1)

图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所示。

 

ROS系统MoveIt玩转双臂机器人系列(四)–用户接口的使用插图(2)

图3

  至此,我们完成了接口节点的编写和测试,经过博文一到四,我们基本走通了:用户接口输入–>MoveIt运动规划–>运动消息通过Controller发送的基本功能,这里只是很浅显的讲了MoveIt的使用和配置过程,下一篇博文来介绍机械臂运动学相关的知识,并编写一个简单的运动学求解算法嵌入接口程序。

<– 本篇完 –>

 

发表评论

后才能评论