ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

ROS试炼——UR5机器人配置、通讯、RVIZ-moveit控制、C++调用moveit控制

2019-04-16 13:54:52  阅读:987  来源: 互联网

标签:试炼 catkin RVIZ ws plan interface moveit target


*注:配置:Ubuntu16.04+ROS kinetic


1.创建工作空间

$mkdir -p catkin_ws/src
进入到catkin_ws目录下,执行如下命令:
$catkin_make
*这个命令用于构建该工作空间,在catkin_ws路径下使用catkin_make命令
$source devel/setup.bash
*该命令是在catkin_ws目录下执行的,意思是把catkin_ws/devel目录下的setup.bash文件挂载到ROS的文件系统里去,这样当用户执行一些文件系统的命令时,就不会提示找不到


2.创建功能包

*功能包是一个存在于工作空间catkin_ws目录src目录下的一个目录,这个目录中包含一些文件或者目录,一个功能包必须以下几部分组成:
(1) 必须包括一个package.xml文件;
(2) 必须包括一个CMakeLists.txt文件。
*首先进入到目录catkin_ws/src目录下,创建一个名字为demo的功能包,它直接依赖于三个功能包:std_msgs,rospy以及roscpp,使用如下命令:
$catkin_create_pkg demo std_msgs rospy roscpp
使用rospack命令来查看功能包之间的依赖关系(使用rospack命令的前提是已经安装了该命令) 查看直接依赖关系:
$rospack depends1 demo
功能包创建好后,在工作空间catkin_ws路径下用catkin_make编译功能包,如果不出错,则功能包创建成功。
$catkin_make
该部分内容参考链接:创建工作空间及功能包

*********以上内容为创建工作空间前期准备,UR机器人的安装与编译,在此工作空间下调试


3.安装UR5相关的各种包

注:需要提前安装moveit,否则功能包编译不成功;执行如下命令

$sudo apt-get update
$sudo apt-get install ros-indigo-moveit-full

第二行代码如果执行不成功,则执行下面的代码

$sudo apt-get install ros-indigo-moveit*

(1) cd ~/catkin_ws/src (将路径定位在工作空间的src路径下)
(2) git clone -b kinetic-devel https://github.com/ros-industrial/universal_robot.git
( 下载universal_robot功能包, 备注:如果你的ROS系统版本不是kinetic,请将上面代码的kinetic换成相应的版本)
(3) cd ~/catkin_ws (定位到catkin_ws路径下)
(4) rosdep install --from-paths src --ignore-src --rosdistro indigo
(???什么意思???备注:同样的,如果你的ROS系统版本不是indigo,请将上面代码的indigo 换成相应的版本)
(5) catkin_make
( 6) source devel/setup.bash


4.ur_modern_driver驱动安装

虽然第二步中universal_robot文件夹下已经包含了ur_driver但这个驱动只支持比较早的UR5机械臂控制器的版本,换句话说,ur_modern_driver更适合(如果你的UR5本体的控制箱的软件版本是3.0以上)
具体的步骤:
(1)删除catkin_ws/src/universal_robot这个目录下的ur_driver文件夹,
(2)然后下载ur_modern_driver (可以直接下载,然后复制到universal_robot文件夹下,或者使用命令下载,如3.2步中方式)
(3)再解压,粘贴到原来的ur_driver这个文件夹的位置(把文件名更改为ur_modern_driver)。
(4)接着cd ~/catkin_ws
(5)最后catkin_make
**************************************编译过程中,出现错误,采用如下方法纠正
打开文件ur_hardware_interface.cpp;将 if (controller_it->hardware_interface) 改为 if (controller_it->type);即hardware_interface变为type;controller_it->hardware_interface.c_str()变为type.c_str(); if (stop_controller_it->hardware_interface) 改为 if (stop_controller_it->type);具体数量大概是12个。


5.UR5本体实物通信测试

首先打开进入Ubuntu系统打开一个新的终端
(1) cd ~/catkin_ws
(2) source devel/setup.bash
(3) roslaunch ur_modern_driver ur5_bringup.launch limited:=true robot_ip:=
IP_OF_THE_ROBOT [reverse_port:=REVERSE_PORT]
(备注:如果机器人通过网线与PC端相连接,IP_OF_THE_ROBOT需要替换成UR5机械臂本体(示教器中机器人网络设置)中的静态地址这种情况下保证机器人与PC在同一个网段下,即机器人与PC的IP地址只有最后一个小数点后的数不同,PC端的IP设置为有线连接,通过设置中的网络进行IP设置。若果机器人通过路由器与PC端相连接,IP_OF_THE_ROBOT需要替换成UR5机械臂本体的DHCP)
(4) roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch limited:=true
(备注:执行(4)之前开新的终端,先执行(2)再执行(4),不然可能会报错。)
(5).roslaunch ur5_moveit_config moveit_rviz.launch config:=true
(备注,开新的终端,先执行4中的(2)再执行(5),不然可能会报错)
如果一切正常, 你就会看到RVIZ中的UR5机械臂和实物的状态是一致的,拖动UR5机械臂实物,在RVIZ里的机械臂也会跟着运动。此时,你可以在RVIZ中用鼠标拖动机械臂到达目标位置,在planing下点击plan,如果路径规划成功即可点击execute,你就会看到UR5实物也会跟着运动到目标点。界面中可以调节机械臂运行速度。
这部分内容参考链接UR机器人通讯与控制


6.C++调用moveit控制UR5机器人运动

1.首先,创建一个新的功能包,来放置我们的代码:

$catkin_create_pkg puncture_demo catkin cmake_modules interactive_markers moveit_core moveit_ros_perception moveit_ros_planning_interface pluginlib roscpp std_msgs

2.在创建的功能包下创建puncture_demo.cpp文件;代码如下:

//punture_demo.cpp
#include <moveit/move_group_interface/move_group.h>
#include <moveit/planning_scene_interface/planning_scene_interface.h>
 
#include <moveit_msgs/DisplayRobotState.h> 
#include <moveit_msgs/DisplayTrajectory.h> 
#include <moveit_msgs/AttachedCollisionObject.h> 
#include <moveit_msgs/CollisionObject.h> 

int main(int argc, char **argv)
{
  ros::init(argc, argv, "movo_moveit");
  ros::NodeHandle node_handle; 
  ros::AsyncSpinner spinner(1);
  spinner.start();
 
  moveit::planning_interface::MoveGroup group("manipulator");//ur5对应moveit中选择的规划部分
 
  // 设置发送的数据,对应于moveit中的拖拽
  geometry_msgs::Pose target_pose1;
  
  target_pose1.orientation.x= -0.1993;
  target_pose1.orientation.y = 0.3054;
  target_pose1.orientation.z = -0.2284;
  target_pose1.orientation.w = 0.902;
 
  target_pose1.position.x = -0.2004;
  target_pose1.position.y = -1.0177;
  target_pose1.position.z = 1.56930;
 
  group.setPoseTarget(target_pose1);
  group.setMaxVelocityScalingFactor(0.02);
 
 
  // 进行运动规划,计算机器人移动到目标的运动轨迹,对应moveit中的plan按钮
  moveit::planning_interface::MoveGroup::Plan my_plan;
//bool success = (ptr_group->plan(my_plan) == moveit::planning_interface::MoveItErrorCode::SUCCESS;
  bool success = group.plan(my_plan)== moveit::planning_interface::MoveItErrorCode::SUCCESS;;
 
  ROS_INFO("Visualizing plan 1 (pose goal) %s",success?"":"FAILED");   
 
  //让机械臂按照规划的轨迹开始运动,对应moveit中的execute。
  if(success)
      group.execute(my_plan);
 
///////////////////////////////////第二个位置////////////////////////////////////
geometry_msgs::Pose target_pose2;

   target_pose2.orientation.x= -0.1993;
  target_pose2.orientation.y = 0.3054;
  target_pose2.orientation.z = -0.2284;
  target_pose2.orientation.w = 0.902;
 
  target_pose2.position.x = 0.096;
  target_pose2.position.y = -0.9618;
  target_pose2.position.z = 1.934;
 
  group.setPoseTarget(target_pose2);
  group.setMaxVelocityScalingFactor(0.02);
 
  // moveit::planning_interface::MoveGroup::Plan my_plan;
 
  // 进行运动规划,计算机器人移动到目标的运动轨迹,对应moveit中的plan按钮
  moveit::planning_interface::MoveGroup::Plan my_plan_1;
//bool success = (ptr_group->plan(my_plan_1) == moveit::planning_interface::MoveItErrorCode::SUCCESS;
  bool success1 = group.plan(my_plan_1)== moveit::planning_interface::MoveItErrorCode::SUCCESS;;
 
  ROS_INFO("Visualizing plan 1 (pose goal) %s",success?"":"FAILED");   
 
  //让机械臂按照规划的轨迹开始运动,对应moveit中的execute。
  if(success1)
      group.execute(my_plan_1);
////////////////////////////////////////////////第三个位置////////////////////////////
geometry_msgs::Pose target_pose3;
  
   target_pose3.orientation.x= -0.1993;
  target_pose3.orientation.y = 0.3054;
  target_pose3.orientation.z = -0.2284;
  target_pose3.orientation.w = 0.902;
 
  target_pose3.position.x = 0.1219;
  target_pose3.position.y = -0.9801;
  target_pose3.position.z = 1.9163;
 
  group.setPoseTarget(target_pose3);
  group.setMaxVelocityScalingFactor(0.01);
 
 
  // 进行运动规划,计算机器人移动到目标的运动轨迹,对应moveit中的plan按钮
  moveit::planning_interface::MoveGroup::Plan my_plan_2;
//bool success = (ptr_group->plan(my_plan) == moveit::planning_interface::MoveItErrorCode::SUCCESS;
  bool success2 = group.plan(my_plan_2)== moveit::planning_interface::MoveItErrorCode::SUCCESS;;
 
  ROS_INFO("Visualizing plan 1 (pose goal) %s",success?"":"FAILED");   
 
  //让机械臂按照规划的轨迹开始运动,对应moveit中的execute。
  if(success2)
      group.execute(my_plan_2);
  
  ros::shutdown(); 
  return 0;
}

注:程序控制机器人运动三个位置,分别为 target_pose1、 target_pose2、 target_pose3;三段程序相同,对应的my_plan、my_plan_1、my_plan_2;success也需要修改。
3.更改puncture_demo功能包下的CMakeLists.txt文件
将如下代码添加到下面:

add_executable(puncture_demo src/puncture_demo.cpp)
target_link_libraries(puncture_demo
  ${catkin_LIBRARIES} 
)

×××××××××××××××××××××××程序运行时出现错误××××××××××××××××××××××
参考如下进行调试:
错误及改正方法
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
编译程序
在工作空间catkin_ws下编译功能包:catkin_make
编译成功会在catkin_ws/devel/lib/puncture_demo/文件夹下出现执行文件puncture_demo文件
执行如下命令即可控制机器人运动:
$rosrun puncture_demo puncture_demo

注:机器人执行过程中,打开新终端,执行第5步的过程


7.机器人环境配置

机器人运行过程中,需要重新配置环境:机器人没有安装在地面上,需更改机器人环境配置文件
找到catkin_ws/src/universal_robot-kinetic-devel/ur_description/urdf/ur5_joint_limited_robot.urdf.xacro文件
修改代码如下:

<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro"
       name="ur5" >

  <!-- common stuff -->
  <xacro:include filename="$(find ur_description)/urdf/common.gazebo.xacro" />

  <!-- ur5 -->
  <xacro:include filename="$(find ur_description)/urdf/ur5.urdf.xacro" />

  <!-- arm -->
  <xacro:ur5_robot prefix="" joint_limited="true"
    shoulder_pan_lower_limit="${-pi}" shoulder_pan_upper_limit="${pi}"
    shoulder_lift_lower_limit="${-pi}" shoulder_lift_upper_limit="${pi}"
    elbow_joint_lower_limit="${-pi}" elbow_joint_upper_limit="${pi}"
    wrist_1_lower_limit="${-pi}" wrist_1_upper_limit="${pi}"
    wrist_2_lower_limit="${-pi}" wrist_2_upper_limit="${pi}"
    wrist_3_lower_limit="${-pi}" wrist_3_upper_limit="${pi}"
  />

  <link name="world" />

  <joint name="world_joint" type="fixed">
    <parent link="world" />
    <child link = "base_link" />
    <origin xyz="0 -0.242 1.428" rpy="${pi*0.75} 0 0" />
  </joint>

</robot>

相对于源文件,添加了

  <link name="world" />

  <joint name="world_joint" type="fixed">
    <parent link="world" />
    <child link = "base_link" />
    <origin xyz="0 -0.242 1.428" rpy="${pi*0.75} 0 0" />
  </joint>

标签:试炼,catkin,RVIZ,ws,plan,interface,moveit,target
来源: https://blog.csdn.net/weixin_39312052/article/details/88130730

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有