UR机器人双臂开发实例

前言:UR系列机器人已经运用一段时间了,随着应用过程中发现并解决的问题越来越多,脑袋已经不够记录了,因此撰写系列博文进行记录,本篇博文记录核心内容,基础内容等我有时间再详细描述。

1 已完成的内容

目前已经完成了UR系列机器人的配置,工作空间名为:ur_ws。调用了 Universal_Robots_ROS_Driver;fmauch_universal_robot;puncture_demo 三个功能包。自行编写了sh脚本文件如下:以UR3为例。
文件名:ur3_setup.sh

gnome-terminal -t "roscore" -x bash -c "source /opt/ros/kinetic/setup.bash;roscore;"
sleep 1
gnome-terminal --geometry=60x5+1500+10 -x bash -c "source ~/ur_ws/devel/setup.bash; roslaunch ur_robot_driver ur3_bringup.launch limited:=true robot_ip:=192.168.1.102; exec bash;"
sleep 5
gnome-terminal --geometry=60x5+1500+150 -x bash -c "source ~/ur_ws/devel/setup.bash;roslaunch ur3_moveit_config ur3_moveit_planning_execution.launch limited:=true; exec bash;"
sleep 3
gnome-terminal --geometry=60x5+1500+300 -x bash -c "source ~/ur_ws/devel/setup.bash;roslaunch ur3_moveit_config moveit_rviz.launch config:=true;exec bash;"
sleep 3
gnome-terminal --geometry=60x5+1500+450 -x bash -c "source ~/ur3e_ws/devel/setup.bash;rosrun puncture_demo puncture_demo;exec bash;"

说白了,就是一下起5个终端,每个终端各司其职,分别是:
(1)启动 roscore
(2)启动 ur3_bringup.launch

<?xml version="1.0"?>
<launch><arg name="debug" default="false" doc="Debug flag that will get passed on to ur_common.launch"/><arg name="robot_ip" doc="IP address by which the robot can be reached."/><arg name="reverse_port" default="50001" doc="Port that will be opened by the driver to allow direct communication between the driver and the robot controller."/><arg name="script_sender_port" default="50002" doc="The driver will offer an interface to receive the program's URScript on this port. If the robot cannot connect to this port, `External Control` will stop immediately."/><arg name="tf_prefix" default="" doc="tf_prefix used for the robot."/><arg name="controllers" default="joint_state_controller scaled_pos_joint_traj_controller speed_scaling_state_controller force_torque_sensor_controller" doc="Controllers that are activated by default."/><arg name="stopped_controllers" default="pos_joint_traj_controller joint_group_vel_controller" doc="Controllers that are initally loaded, but not started."/><arg name="controller_config_file" default="$(find ur_robot_driver)/config/ur3_controllers.yaml" doc="Config file used for defining the ROS-Control controllers."/><arg name="robot_description_file" default="$(find ur_description)/launch/ur3_upload.launch" doc="Robot description launch file."/><arg name="kinematics_config" default="$(find ur_description)/config/ur3_default.yaml" doc="Kinematics config file used for calibration correction. This will be used to verify the robot's calibration is matching the robot_description."/><arg name="limited" default="false" doc="Use the description in limited mode (Every axis rotates from -PI to PI)"/><arg name="headless_mode" default="false" doc="Automatically send URScript to robot to execute. On e-Series this does require the robot to be in 'remote-control' mode. With this, the URCap is not needed on the robot."/><include file="$(find ur_robot_driver)/launch/ur_common.launch" pass_all_args="true"><arg name="use_tool_communication" value="false"/></include>
</launch>

(3)启动 ur3_moveit_planning_execution.launch
(4)启动 moveit_rviz.launch
(5)启动demo puncture_demo
这样,我们就实现了一键启动UR的走点demo。

2 把机器人安在架子上

已完成的工作中,在rviz界面中只有孤零零的一个机器人,而我们希望构建一个双臂机器人系统,这就至少需要两个机械臂一个连接这两个机械臂的身体

我们首先来解决这个“身体”的问题,就是把机器人安在架子上。

根据开发经验,ROS开发的机器人,都会把模型存在一个名为 xxx_description 的文件夹中。
我们在 ~\ur_ws\src\fmauch_universal_robot\ur_description\urdf 路径下发现与UR3机器人模型有关的urdf文件以xacro形式编写,具体有三个,如下:

逐一查看发现,发现第一个文件即为ur3机器人本体,是封装好的,一般不用修改;第二个和第三个文件是在包含机器人本体的基础上引入了“world ”这一link,而区别在于在启动 ur3_bringup.launch 文件中如果limited:=true则调用第二个文件,反之则调用第三个。

ur3_bringup.launch文件中有一行调用了 ur3_upload.launch文件,ur3_upload.launch 文件决定调用哪个xacro文件,具体如下:

ur3_upload.launch:

<?xml version="1.0"?>
<launch><arg name="limited" default="false" doc="If true, limits joint range [-PI, PI] on all joints." /><arg name="transmission_hw_interface" default="hardware_interface/PositionJointInterface" /><arg name="kinematics_config" default="$(find ur_description)/config/ur3_default.yaml"/><param unless="$(arg limited)" name="robot_description" command="$(find xacro)/xacro --inorder '$(find ur_description)/urdf/ur3_robot.urdf.xacro'transmission_hw_interface:=$(arg transmission_hw_interface)kinematics_config:=$(arg kinematics_config)" /><param if="$(arg limited)" name="robot_description" command="$(find xacro)/xacro --inorder '$(find ur_description)/urdf/ur3_joint_limited_robot.urdf.xacro'transmission_hw_interface:=$(arg transmission_hw_interface)kinematics_config:=$(arg kinematics_config)" />
</launch>

既然第二个和第三个文件是在包含机器人本体的基础上引入了“world ”这一link,我们的工作可以从这里入手,通过加入2个link和joint的方式,并改变原有base_link的连接,来生成一个“架子“。
ur3_joint_limited_robot.urdf.xacro文件原始内容如下:

<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro"name="ur3" ><xacro:arg name="transmission_hw_interface" default="hardware_interface/PositionJointInterface"/><!-- common stuff --><xacro:include filename="$(find ur_description)/urdf/common.gazebo.xacro" /><!-- ur3 --><xacro:include filename="$(find ur_description)/urdf/ur3.urdf.xacro" /><!-- arm --><xacro:arg name="kinematics_config" default="$(find ur_description)/config/ur3_default.yaml"/><xacro:ur3_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}"transmission_hw_interface="$(arg transmission_hw_interface)"kinematics_file="${load_yaml('$(arg kinematics_config)')}"/><link name="world" /><joint name="world_joint" type="fixed"><parent link="world" /><child link = "base_link" /><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /></joint></robot>

我们尝试在ur3_joint_limited_robot.urdf.xacro与ur3_robot.urdf.xacro后半部分改写成如下代码:(link name="world"之前的内容未做任何改动。)

<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro"name="ur3" ><xacro:arg name="transmission_hw_interface" default="hardware_interface/PositionJointInterface"/><!-- common stuff --><xacro:include filename="$(find ur_description)/urdf/common.gazebo.xacro" /><!-- ur3 --><xacro:include filename="$(find ur_description)/urdf/ur3.urdf.xacro" /><!-- arm --><xacro:arg name="kinematics_config" default="$(find ur_description)/config/ur3_default.yaml"/><xacro:ur3_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}"transmission_hw_interface="$(arg transmission_hw_interface)"kinematics_file="${load_yaml('$(arg kinematics_config)')}"/><link name="world" /><joint name="semaphore_robot_base_joint" type="fixed"><parent link ="world" /><child link = "semaphore_robot_base_link" /><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /></joint><link name = "semaphore_robot_base_link" type="fixed"><visual><origin xyz=" 0 0 0" rpy="0 0 0" /><geometry><cylinder length="1" radius="0.05"/></geometry><material name="yellow"><color rgba="1 0.4 0 0.5"/></material></visual></link><joint name="semaphore_transverse_joint" type="fixed"><parent link ="semaphore_robot_base_link" /><child link = "semaphore_transverse_link" /><origin xyz="0.2 0.0 0.5" rpy="1.57 0.0 0.0" /></joint><link name = "semaphore_transverse_link" type="fixed"><visual><origin xyz=" 0 0 0" rpy="0 0 0" /><geometry><cylinder length="0.2" radius="0.06"/></geometry><material name="yellow"><color rgba="1 0.4 0 0.5"/></material></visual></link><joint name="left_world_joint" type="fixed"><parent link="semaphore_transverse_link" /><child link = "base_link" /><origin xyz="0 0 0.1" rpy="0 0.0 1.57" /></joint></robot>

这样,一个UR3机械臂就被固定在架子上了。



那么,另一条机械臂怎么办呢?

3 重新“造”一个UR3

在这里要先特殊注明一下:
由于我们实验室条件有限,只有一台UR3和一台UR3e,所以搭建的双臂机器人并不完全“对称”,但配置双臂的方法应该都是类似的。

也就是说,之前的工作完成了UR3与架子的组合,接下来我们要添加一个另一个机械臂(可以是UR3,但我们这里用UR3e了)。

在ur3_robot.urdf.xacro文件的基础上,我新建了ur3+ur3e_robot.urdf.xacro文件。

ur3+ur3e_robot.urdf.xacro:

<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro"name="ur3_ur3e_robot" ><!--    <xacro:property name="pi" value="3.1415926535897931"/>    --><xacro:arg name="prefix_ur3" default="ur3_"/><xacro:arg name="prefix_ur3e" default="ur3e_"/><!-- do not know  --><xacro:arg name="transmission_hw_interface_ur3" default="hardware_interface/PositionJointInterface"/><xacro:arg name="transmission_hw_interface_ur3e" default="hardware_interface/PositionJointInterface"/><!-- common stuff --><xacro:include filename="$(find ur_description)/urdf/common.gazebo.xacro" /><!-- ur3 --><xacro:include filename="$(find ur_description)/urdf/ur3.urdf.xacro" /><!-- ur3e --><xacro:include filename="$(find ur_e_description)/urdf/ur3e.urdf.xacro" /><!-- arm --><xacro:arg name="kinematics_config_ur3" default="$(find ur_description)/config/ur3_default.yaml"/><xacro:arg name="kinematics_config_ur3e" default="$(find ur_e_description)/config/ur3e_default.yaml"/><!-- arm right--><xacro:ur3_robot prefix="$(arg prefix_ur3)" joint_limited="false"transmission_hw_interface="$(arg transmission_hw_interface_ur3)"kinematics_file="${load_yaml('$(arg kinematics_config_ur3)')}"/><!-- arm left--><xacro:ur3e_robot prefix="$(arg prefix_ur3e)" joint_limited="false"transmission_hw_interface="$(arg transmission_hw_interface_ur3e)"kinematics_file="${load_yaml('$(arg kinematics_config_ur3e)')}"/><link name="world" /><joint name="semaphore_robot_base_joint" type="fixed"><parent link ="world" /><child link = "semaphore_robot_base_link" /><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /></joint><link name = "semaphore_robot_base_link" type="fixed"><visual><origin xyz=" 0 0 0" rpy="0 0 0" /><geometry><cylinder length="1" radius="0.075"/><!--    <mesh filename="package://ur_description/meshes/DH-UR-ASSY.stl"/> --></geometry><material name="yellow"><color rgba="1 0.4 0 0.5"/></material></visual></link><joint name="semaphore_transverse_joint" type="fixed"><parent link ="semaphore_robot_base_link" /><child link = "semaphore_transverse_link" /><origin xyz="0.22 0.0 0.5" rpy="1.57 0.0 0.0" /></joint><link name = "semaphore_transverse_link" type="fixed"><visual><origin xyz=" 0 0 0" rpy="0 0 0" /><geometry><cylinder length="0.2" radius="0.075"/></geometry><material name="yellow"><color rgba="1 0.4 0 0.5"/></material></visual></link><joint name="right_world_joint" type="fixed"><parent link="semaphore_transverse_link" /><child link = "$(arg prefix_ur3)base_link" /><origin xyz="0 0 0.1" rpy="0 0.0 -1.57" /></joint><joint name="left_world_joint" type="fixed"><parent link="semaphore_transverse_link" /><child link = "$(arg prefix_ur3e)base_link" /><origin xyz="0 0 -0.1" rpy="0 3.14 -1.57" /></joint></robot>

通过对比可以发现,这里引入两个机器人模型,分别是来自 ur_description/urdf 的 ur3.urdf.xacro,以及来自ur_e_description/urdf 的 ur3e.urdf.xacro,还有一些列对应的config文件。这些都是UR公司封装好的,我们直接使用就好。(如果你是两个UR3,直接调用两个ur3.urdf.xacro,而起不同的名字就好,这非常关键,因为机器人如果和模型不同步的话机器人是无法被控制的。)

同理,我们也可以新建ur3+ur3e_joint_limited_robot.urdf.xacro 文件,把约束加上,我这里就不赘述了。

对应的启动文件我也进行了新建:
ur3+ur3e_upload.launch :

<?xml version="1.0"?>
<launch><arg name="limited" default="false" doc="If true, limits joint range [-PI, PI] on all joints." /><arg name="transmission_hw_interface_ur3" default="hardware_interface/PositionJointInterface" /><arg name="transmission_hw_interface_ur3e" default="hardware_interface/PositionJointInterface" /><arg name="kinematics_config_ur3" default="$(find ur_description)/config/ur3_default.yaml"/><arg name="kinematics_config_ur3e" default="$(find ur_e_description)/config/ur3e_default.yaml"/><arg name="kinematics_config" default="$(find ur_description)/config/ur3_default.yaml"/><param unless="$(arg limited)" name="robot_description" command="$(find xacro)/xacro --inorder '$(find ur_description)/urdf/ur3+ur3e_robot.urdf.xacro'transmission_hw_interface_ur3:=$(arg transmission_hw_interface_ur3)transmission_hw_interface_ur3e:=$(arg transmission_hw_interface_ur3e)kinematics_config_ur3:=$(arg kinematics_config_ur3)kinematics_config_ur3e:=$(arg kinematics_config_ur3e)" /><param if="$(arg limited)" name="robot_description" command="$(find xacro)/xacro --inorder '$(find ur_description)/urdf/ur3+ur3e_joint_limited_robot.urdf.xacro'transmission_hw_interface_ur3:=$(arg transmission_hw_interface_ur3)transmission_hw_interface_ur3e:=$(arg transmission_hw_interface_ur3e)kinematics_config_ur3:=$(arg kinematics_config_ur3)kinematics_config_ur3e:=$(arg kinematics_config_ur3e)" /></launch>

至此,模型部分的操作完成,我们共补充了3个全新文件在相应目录,具体如下:

  • (补充)将文件ur3+ur3e_upload.launch
    放置在目录:~/ur_ws/src/fmauch_universal_robot/ur_description/launch 下
  • (补充)将文件ur3+ur3e_joint_limited_robot.urdf.xacro
    放置在目录:~/ur_ws/src/fmauch_universal_robot/ur_description/urdf 下
    (这个没来得及改,参考ur3+ur3e_robot.urdf.xacro)
  • (补充)将文件ur3+ur3e_robot.urdf.xacro
    放置在目录:~/ur_ws/src/fmauch_universal_robot/ur_description/urdf 下

现在运行ur3+ur3e_upload.launch 文件的话,应该可以加载出双臂机器人的模型(图后期补充)

然而模型只是开始,如何驱动两个机械臂还有很长的路要走。

X 最终功能包

先把最后完整的功能包放在这,已经测试完毕,教程慢慢更新。

(1)ur_ws(初代配置版本)

这个就是自己配的最基本UR驱动包。

(2)ur_ws(UR3+UR3e双臂机器人)

本ws在ur_ws基础上做了如下修改,以完成双臂机器人系统搭建:

part1:模型部分
(补充)将文件ur3+ur3e_upload.launch 放置在目录:~/ur_ws/src/fmauch_universal_robot/ur_description/launch 下
(补充)将文件ur3+ur3e_joint_limited_robot.urdf.xacro 放置在目录:~/ur_ws/src/fmauch_universal_robot/ur_description/urdf 下 (这个没来得及改,参考ur3+ur3e_robot.urdf.xacro)
(补充)将文件ur3+ur3e_robot.urdf.xacro 放置在目录:~/ur_ws/src/fmauch_universal_robot/ur_description/urdf 下

part2:驱动部分
(补充)将文件ur3+ur3e_bringup.launch 放置在目录:~/ur_ws/src/Universal_Robots_ROS_Driver/ur_robot_driver/launch 下
(改写)ur_common.launch 目录:~/ur_ws/src/Universal_Robots_ROS_Driver/ur_robot_driver/launch (修改内容:删掉了模型启用,因为在ur3+ur3e_bringup.launch启动了模型)
(改写)ur3_controllers.yaml 目录:~/ur_ws/src/Universal_Robots_ROS_Driver/ur_robot_driver/config (修改内容:加了前缀ur3_)
(改写)ur3e_controllers.yaml 目录:~/ur_ws/src/Universal_Robots_ROS_Driver/ur_robot_driver/config (修改内容:加了前缀ur3e_)

part3:控制器部分
替换了整个 ur3_moveit_config
具体修改了 ~/ur_ws/src/fmauch_universal_robot/ur3_moveit_config/config 中的六个文件:

controllers.yaml
fake_controllers.yaml
joint_limits.yaml
kinematics.yaml
ompl_planning.yaml
ur3.srdf

(修改内容:我懒得新建一个类似名为ur3+ur3e_moveit_config 的文件了,因为里边要改一堆launch文件的名字,所以就直接把 ur3_moveit_config 作为双臂机器的moveit_config 文件了)

part4:demo与启动部分
将功能包 ur3_flag_demo 放在 ~/ur_ws/src下
将启动脚本文件 ur3+ur3e_setup.sh 放在 ~/ur_ws 下

未完待续……

UR机器人双臂开发实例相关推荐

  1. Arduino开发实例-DIY超声波传感器避障机器人

    超声波传感器避障机器人 1.应用介绍 在本应用中,我们将使用一个超声波传感器与两个直流电机和一个伺服电机相结合,Arduino作为主控板创建一个简单的避障机器人. 超声波传感器发送和接收信号以确定物体 ...

  2. UR 机器人HMI 交互界面开发记录

    UR 机器人的技术协议可以到官网主页下载,我这里整理了一份.已上传到csdn,有需要的可以下载. https://download.csdn.net/download/p942005405/12349 ...

  3. UR机器人开发(1)-上位机直接通讯控制

    第一次使用UR机器人,并且尝试与上位机直接通讯,进行运动控制.因此本文记录整个安装调试过程,避免后续踩坑.本文采用socket通讯方式,通过python编程,实现机器人乱序抓取(暂且不考虑视觉部分). ...

  4. arduino 机器视觉编程_万物皆可仿真的MATLAB/Simulink神奇在哪?解析如何将其应用于一整套机器人设计开发流程...

    MATLAB/Simulink:万物皆可仿真 MATLAB是由美国MathWorks公司出品的一款商业数学软件.它是一个多功能的科学计算平台,将算法开发.数据分析.矩阵计算等诸多强大功能集成在一个易于 ...

  5. 如何使用UR机器人模拟软件URsim

    如何使用UR机器人模拟软件URsim 机器人软件适用版本:Polyscope v1.3及以上 适用机器人:UR3.UR5.UR10 由于优傲机器人的系统是基于Linux核心开发的,模拟软体URsim也 ...

  6. UR机器人返回信息格式解析

    1 概述 UR机器人提供了多种端口,用于控制和读取机器人信息,本人整理了相关信息,见文章<UR机器人通信端口和协议>. 本人使用了30003端口来向机器人发送URScript脚本控制命令, ...

  7. ur机器人计算机模拟仿真,UR机器人科研应用案例

    UR机器人科研应用案例太脏?太沉闷?太热或太冷?这些复杂环境不适合协作机器人?德国弗莱伯格矿业技术大学的科学家目前正在着手两个令人兴奋的项目,以寻找新的方法来使协作机器人如何使他们的人类同事的生活更轻 ...

  8. 遨博协作机器人ROS开发 - 机械臂规划场景构建

    目录 一.简介 二.环境版本 三.学习目标 四.知识储备 五.任务实施 六.任务拓展 七.课堂小结 八.课后练习 一.简介 大家好,欢迎关注遨博学院带来的系列技术分享文章(协作机器人ROS开发),今天 ...

  9. BlackBerry 用户界面开发实例(二)

    作者: 杨江 3.5     最终的运 行结果 如图 你可以看 到屏幕 中间列 表显 示的三条 待审批 的记录 ,用 户打算通 过菜单 对审批 记录 进行操作 . 4 为从窗口添加显示和输 入字段 : ...

最新文章

  1. Android编程获取网络连接状态及调用网络配置界面
  2. linux正则表达式sed
  3. DAY11-MYSQL之ORM框架SQLAlchemy
  4. OpenStack创建网络和虚拟机、dhcp设备、虚拟路由器、虚拟机访问外网原理分析
  5. HTML基础标签入门
  6. static成员函数不能调用non-static成员函数
  7. Chrome浏览器取代火狐的十大理由
  8. PowerShell字体颜色修改
  9. java迭代器 异常_java-迭代器并发修改异常
  10. MYSQL5.7 日志管理
  11. js设置了location.href不跳转问题
  12. vmware workstation克隆linux后修改网卡为eth0方法
  13. 刘慈欣、Netflix联手!《三体》系列将拍摄剧集,但编剧被网友疯狂吐槽
  14. 使用phpStudyy运行tipask
  15. Astar算法基本概念及其实现
  16. JAVA发送HttpClient请求及接收请求完整代码实例
  17. 技术人最基本投资建议
  18. 【报告分享】2021年中国智能运动健身行业研究报告-艾瑞咨询(附下载)
  19. 把kali linux 装进 U盘并实现数据可存储
  20. 【通信】基于OFDMA系统的多用户资源分配求解论附文和MATLAB代码

热门文章

  1. 信息收集之基础端口扫描《诸神之眼——Nmap网络安全审计技术揭秘》总结一
  2. CTSC2016时空旅行
  3. 对项目经理而言,PMP认证是否对职业生涯的发展有帮助?
  4. php mysql 柱状图,使用EChat通过php连接mysql数据库从而实现将数据转换为柱状图
  5. CSS从入门到精通——文本与字体样式1.0
  6. 报表中的地图怎么做?
  7. 使用线性SVM实现对垃圾邮件分类
  8. 归来仍少年•青春不散场 | CEO刘其东出席同济经管学院2022级新生入学典礼及2022年毕业典礼
  9. 小白学爬虫---爬取中国房价工资比
  10. php必应收录查询api,必应 Web 搜索 API v7.0