记录一下通过ROS+Moveit控制机械臂运动的过程
对于85夹爪目前查到的博客都说很难通过ROS直接驱动连接在UR工控箱内的夹爪,现有的ROS控制多是将夹爪数据线直接接到PC上通过USB串口进行通信。
然而实验室的夹爪根本没有USB线(╯‵□′)╯︵┻━┻。
目录
一、UR机器人本体设置
1.安装External Control
可以直接在GitHub的tag下下载externalcontrol-1.0.5.urcap的文件,拷贝到UR工控箱上的U盘里。之后点击示教器右上角的三条线进入设置,在URCap下点击+号添加刚才拷贝的文件,重启工控机即可。
之后进入“安装设置”->URCap->External Control可以看到已经加载的插件,会有一个HOST IP地址和Custom port,其中IP地址用于ROS,port不用管,默认即可。
2.配置网络
根据External Control 的IP地址配置UR的网络IP用于之后与PC网络连接。在设置->系统->网络下设置网络为静态地址,IP为192.168.56.2,子网掩码为255.255.255.0。
3.其余配置
将PC与UR控制箱用网线连接,在示教器中编写一个UR程序用于启动External Control,稍后ROS控制机器人时需要启动该程序。
二、虚拟机设置
我用的是VMware Workstation 16 PRO Ubuntu 18.04 ROS melodic 版本。
设置Ubuntu的网络,点击右上角网络符号,设置一个新的静态网络,在IPv4下设置IP为之前External Control提供的IP地址即192.168.56.1,设置子网掩码为255.255.255.0.
虚拟机网络设置为桥接模式,复制主机ip,如果还是ping不通,断开wifi再试,好了之后可以再连接wifi,这样主机还能上网。
设置好之后可以尝试ping一下UR的网络ip:192.168.56.2,如果一切正常终端会出现下图说明UR和虚拟机之间的网络通信已经OK了,接下来就可以通过官方的包控制机械臂了
三、ROS+Moveit实现机械臂运动
首先需要在一个ROS的工作空间中下载两个功能包:Universal_Robots_ROS_Driver和universal_robot,下载完成之后编译,在source一下就行了。第一个包是用于ROS和真实机械臂通信的,第二个包有机械臂的Moveit配置,这里用官方的就可以实现运动了。
之后按照这个顺序依次启动ROS节点和机械臂程序即可。其中第一个roslaunch中的ip地址填写自己UR机器人上设置的地址。
# 启动机器人
1.roslaunch ur_robot_driver ur10e_bringup.launch robot_ip:=192.168.56.2
2.示教器启动URCaps External control程序
# 启动moveit节点
3.roslaunch ur10e_moveit_config moveit_planning_execution.launch limited:=true
# 启动rviz
4.roslaunch ur10e_moveit_config moveit_rviz.launch config:=true
在机ur上启动程序后终端会输出,之后就可以运行Moveit和rviz了。
Robot connected to reverse interface. Ready to receive control commands.
通过rviz中的MotionPlanning模块,拖动机械臂末端的小圆球给定末端位置在Plan&Execute即可控制机械臂运动。当然我们也可以通过python程序控制moveit进而控制机械臂运动,这里我贴出一个简单的例程,具体就是实现拿到当前基于基座的位姿后z轴下降0.1m。
#! /usr/bin/env python
import sys
import rospy
import moveit_commander
import geometry_msgs
import tf
moveit_commander.roscpp_initializer.roscpp_initialize(sys.argv)
rospy.init_node('move_group_grasp', anonymous=True)
robot = moveit_commander.robot.RobotCommander()
arm_group = moveit_commander.move_group.MoveGroupCommander("manipulator")
arm_group.set_goal_joint_tolerance(0.001)
arm_group.set_max_acceleration_scaling_factor(0.5)
arm_group.set_max_velocity_scaling_factor(0.5)
arm_group.set_pose_reference_frame('base_link')
end_effector_link = arm_group.get_end_effector_link()
print(end_effector_link)
#hand_group.set_named_target("close")
#plan = hand_group.go()
print("Point 1")
pose_target = arm_group.get_current_pose().pose
print(pose_target.position.x,pose_target.position.y,pose_target.position.z)
# Block point
pose_target.position.x = pose_target.position.x
pose_target.position.y = pose_target.position.y
pose_target.position.z = pose_target.position.z-0.1
arm_group.set_pose_target(pose_target)
arm_group.go(wait=True)
rospy.sleep(5)
moveit_commander.roscpp_initializer.roscpp_shutdown()
四、杂谈
相比于仿真,控制实体机械臂反而更容易了,参考了诸多博主的博客之后也是比较轻松的实现了功能。过程中经历的坑有:1.没有接网线妄图直接控制,当然ping不通了。。。2.示教器上没有运行URCaps程序,导致程序运行了但是机械臂没动静。。。考虑后续机械臂要装在车上,打开示教器运行程序这一步是不是有点不太好实现🤔。
下一篇将实现socket进行通信,就可以摆脱这一切了~