UR3机械臂使用记录

本文详细介绍了UR3机械臂在Ubuntu16.04和ROS-Kinetic环境下,配合KinectV2深度相机和云台实现轨迹规划、避障等功能的配置过程。包括机械臂驱动包ur_modern_driver的使用、MoveIT文件的运行及常见问题的解决方案,以及如何实现UR3双臂的控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UR3机械臂使用记录

UR3双臂配合Kinect V2深度相机、云台实现轨迹规划、避障等功能。

使用环境

UR3机械臂两个、Kinect v2、云台、底座
系统:Ubuntu16.04 虚拟机(由于虚拟机跑Kinect存在串口bug,之后更换Ubuntu双系统)、ROS-Kinetic
ros包:UR机械臂驱动包—ur_modern_driver
ros包:UR机械臂moveit包—universal_robot

机械臂配置

universal_robot包通过以太网连接与硬件进行通信,当建立连接的时候ROS-Industrial上传由URScript编写的程序,URScript是类似python的UR机器人自己的脚本语言。这段程序负责监听ROS-Industrial的 simple_messages 包发送的消息信息,并将这些消息解释成硬件指令。
打开机械臂示教器,松开急停按钮,加载安装设置,打开机械臂,进入机械臂设置。设置界面选择网络,配置静态地址,输入IP地址、子网掩码,完成配置。

ROS包配置

由于使用的机械臂固件为3.9.1,相对应的机械臂驱动包为ur_modern_driver。使用时编译报错,修改驱动包中的ur_hardware_interface.cpp文件。检索文件中的hardware_interface,替换为type。
机械臂驱动包ur_modern_driver使用原包中的ur_description模型。按照驱动包的README.md文件说明,在ur3.urdf.xacro文件ur3_robot macro内,添加代码:

<!-- Connect tool0_controller to base using floating joint -->
    <link name="tool0_controller"/>
    <joint name="base_tool0_controller_floating_joint" type="floating">
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <parent link="${prefix}base"/>
      <child link="tool0_controller"/>
    </joint>

控制UR3机械臂

控制机械臂之前,首先ping一下机械臂网址。例如我的机械臂IP为192.168.33.33,在终端内输入命令:
ping 192.168.33.33    

打开终端,输入命令:

roslaunch ur_modern_driver ur3_bringup.launch robot_ip:=192.168.33.33  [reverse_port:=REVERSE_PORT] #替换robot_ip为自己的机械臂IP

打开新终端,运行UR3自带的机械臂demo运动程序:

rosrun ur_driver test_move.py    #时刻注意机械臂位置,随时准备按急停按钮

终止test_move.py脚本,运行MoveIT文件。打开新终端,输入命令:

roslaunch ur3_moveit_config ur5_moveit_planning_execution.launch 

打开新终端,运行带路径规划器的rviz,输入命令:

roslaunch ur3_moveit_config moveit_rviz.launch config:=true

UR包自带一份带关节约束的文件,每个关节约束在[-PI/2,PI/2],若想运行带关节约束的文件,在终端运行命令:

roslaunch ur_modern_driver ur3_bringup.launch limited:=true robot_ip:=192.168.33.33  [reverse_port:=REVERSE_PORT]
roslaunch ur3_moveit_config ur5_moveit_planning_execution.launch limited:=true
roslaunch ur3_moveit_config moveit_rviz.launch config:=true

tool0_controller报错问题

在运行moveIT文件时,时常会碰到moveIT报错问题。报错如下

[ERROR] [1515404258.018207679]: Ignoring transform for child_frame_id "tool0_controller" from authority "unknown_publisher" because of a nan value in the transform (0.000000 26815622274503241629349378993175553962225540122973894056168551426931042827562994218784229639762337459109057520690886188494020583679371347120178163255083008.000000 26815622274206272770731577112262473438093890782345820683584369763133472687942565341004009969841415624372630858128332080466218773763999513725165301565227008.000000) (-nan -nan -nan -nan)

报错原因参考:GitHub Issues
主要是因为loosing the connection to the realtime port,导致TF信息丢失,在重连之后,随机发布末端效应器位置姿态,导致moveIT无法运行。
解决办法:在重连成功之后,清空buffer,修改源文件。

#ur_modern_driver/src/ur_realtime_communication.cpp   line185,添加下列代码
bzero(buf, 2048);
FD_ZERO(&readfds);
FD_SET(sockfd_, &readfds);
#ur_modern_driver/src/ur_communication.cpp   line173,添加下列代码
bzero(buf, 2048);
FD_ZERO(&readfds);
FD_SET(sec_sockfd_, &readfds);

重新编译,运行,拔掉网线,重新连接之后,moveIT不再报错。

UR3双臂控制

双臂启动文件

建立新的bringup包,新建launch文件,命名为ur3_man_bringup.launch。文件启动左右机械臂的两个ROS节点,分别赋予不同的名称。

#单个机械臂的驱动节点,因为安装状态问题,以左右臂加以区分
<node name="left_arm_ur_driver" pkg="ur_modern_driver" type="ur_driver" output="$(arg log_type)">
    <param name="prefix" type="str" value="left_arm_" />
    <param name="robot_ip_address" type="str" value="192.168.33.33" />
    <param name="base_frame" type="str" value="left_arm_base"/>
    <param name="tool_frame" type="str" value="left_arm_tool0_controller"/>
  </node>
ERROR on binding socket for reverse communication

运行新写的launch文件,终端发生binding socket错误,在源代码中搜索报错内容,定位到代码段ur_modern_driver/src/ur_driver.cpp line54。
报错大致原因是左右双臂在运行驱动时,分别申请了一个监听端口用以监听所有通信,因为没有设置reverse_port值,所以驱动运行时左右双臂均申请了同一端口50001,所以运行时发生错误。解决办法:在驱动节点运行时增加新的参数用以区分双臂的reverse_port。

#新增代码,置于某一驱动结点内部
<param name="reverse_port" type="int" value="50002"/>

更改launch文件之后,驱动运行正常。

moveIT包配置

moveIT配置 。运行setup_assistant.launch文件,按照常规方法配置moveIT文件,注意,在planing_group环节增加一个move_group组,用于同时控制左右双臂。group_name填写mvoe_group,之后增加subgroups,选择左右双臂对应的group。
生成moveit_config包之后,按照常规方式更改文件用与控制机械臂实体。

### UR3机械手眼标定实验记录与教程 对于UR3机械的手眼标定过程,通常涉及一系列精确的操作来确保视觉传感器和机器人运动之间的协调一致。在准备阶段,需确认已安装并配置好必要的ROS节点和服务。 #### 启动前的准备工作 为了使UR3能够执行手眼标定任务,在启动之前应当完成如下设置: - 更新校准包 `roslaunch ur_robot_driver ur3_bringup.launch robot_ip:=<your_robot_ip> limited:=true`[^2]。 此命令用于初始化机器人的驱动程序,并指定IP地址以便于网络通信连接至控制器。 #### 数据采集流程 当一切就绪之后,进入实际的数据收集环节。通过移动机械到不同位置捕捉图像样本,这些动作应覆盖整个工作空间内的多个视角。每次变换姿态后都应及时保存对应的关节角度以及相机拍摄的画面作为一对关联数据点。 ```bash rosrun image_view image_saver image:=/camera/color/image_raw _filename_format:=sample_%i.jpg ``` 上述脚本可以用来存储来自RGB摄像头的图片文件,其中`_filename_format`参数定义了输出文件名模式。 #### 计算外参矩阵 获取足够的配对样本之后,则可利用OpenCV库中的函数求解摄像机相对于工具中心点的姿态关系——即所谓的“外部参数”。具体实现方式依赖于所选用的具体算法模型;例如张正友棋盘格法是一种常见做法。 ```python import cv2 import numpy as np criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) objp = np.zeros((6*7,3), np.float32) objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)*20 # 假设方格边长为20mm # Arrays to store object points and image points from all the images. objpoints = [] # 3d point in real world space imgpoints = [] # 2d points in image plane. for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners(gray, (7,6),None) if ret == True: objpoints.append(objp) corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria) imgpoints.append(corners2) ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) ``` 这段Python代码片段展示了如何基于一组预先录制好的含有标准图案的照片来进行单目相机内参估计的过程[^1]。 #### 结果验证 最后一步是对所得转换矩阵的有效性加以检验。这可以通过让机械重复访问先前标记过的几个特征点,并比较预期坐标同实测坐标的差异程度来达成目的。如果误差保持在一个合理范围内,则说明本次手眼标定取得了成功。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值